[kaffe] cray int size problem
Dalibor Topic
robilad at kaffe.org
Fri Jul 25 02:50:02 PDT 2003
Hi Eric,
Eric Denman wrote:
> i'm another person working on the GW effort to port kaffe to a Cray
> SV-1, and have a question about some JIT details.
>
> on cray, all datatypes except chars are 8 bytes. for instance, ints and
> longs are 8 bytes. however, in gtypes.h, it seems that kaffe requires
> either int or long to be 4 bytes (as evidenced by this line:)
>
> #error "sizeof(int) or sizeof(long) must be 4"
the Java Language Specification requires that some datatypes be of
specific sizes.
http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#85587
Kaffe tries to 'guess' the appropriate native C types for the respective
java types. It becomes problematic when there is no large enough C
primitive type to hold a Java primitive type, for example no 64 bit
integer to hold a Java long. The other way around it shouldn't be very
problematic, you'll just have to fulfil the constraints imposed to you
by the signed two's-complement representation of smaller types. Take a
look at:
http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#51035
Following from that is, for example, that you need to make sure that all
your 16-bit-but-embedded-in-64-bit integers with the same 16 bits
compare equal, etc. I assume that the quickest way to do that is to
'normalize' the inputs and the results of integer operations, i.e. to
set all leading bits to 0 if the integer is positive, or to set them to
1 if it's negative.
> My question is whether this is a serious requirement: if we change this
> line, will we be breaking other things?
Unless you make sure that all embedded integer operations retain the
same semantics as with smaller bit lengths, chances are you will ;)
Take the 0x00FF0001 == 0x00000001 example from above. If your embedded
integer is 16 bits, the leading FF should not matter in the comparison.
> also, on an relatively unrelated note, there are quite a few instruction
> formats on the cray that take up 48-bits. However, most existing 64-bit
> ports we're looking at only use 32-bit (LOUT). There is no macro for
> 48-bit assignment.
> this is the existing line in kaffe/kaffevm/jit3/funcs.c :
>
> #define LOUT (*(uint32*)&codeblock[(CODEPC += 4) - 4])
>
> is there any inherent problem with simply defining our own macro like this:
>
> #define LQOUT (*(uint64*)&codeblock[(CODEPC += 6) - 6])
>
> we would have to make sure our shifting details are correct, but i think
> that the extra space will simply be overwritten by the next statement
> that is translated.
I don't see a problem there, as long as you define another macro, and
add a comment why it's there ;)
cheers,
dalibor topic
More information about the kaffe
mailing list