diff options
Diffstat (limited to 'gcc/java')
-rw-r--r-- | gcc/java/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/java/javaop.h | 9 | ||||
-rw-r--r-- | gcc/java/jcf-parse.c | 4 |
3 files changed, 15 insertions, 5 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index fa146cd..3e5d963 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -7,6 +7,13 @@ * lang.c (lang_decode_option): Use ARRAY_SIZE. * parse.y (BINOP_LOOKUP): Likewise. +2000-08-22 Andrew Haley <aph@cygnus.com> + + * javaop.h (WORD_TO_INT): Mask lower 32 bits of a jword before + sign extending. Fixes gcj/321. + * jcf-parse.c (get_constant): Mask lower 32 bits of a jint before + combining to make a jlong. Fixes gcj/321. + 2000-08-21 Nix <nix@esperi.demon.co.uk> * lang-specs.h: Do not process -o or run the assembler if diff --git a/gcc/java/javaop.h b/gcc/java/javaop.h index d8418f7..6ce33ff 100644 --- a/gcc/java/javaop.h +++ b/gcc/java/javaop.h @@ -109,13 +109,16 @@ WORD_TO_FLOAT(jword w) return wu.f; } -/* Sign extend w. */ +/* Sign extend w. If the host on which this cross-compiler runs uses + a 64-bit type for jword the appropriate sign extension is + performed; if it's a 32-bit type the arithmetic does nothing but is + harmless. */ static inline jint WORD_TO_INT(jword w) { - jint n = w; + jint n = w & 0xffffffff; /* Mask lower 32 bits. */ n ^= (jint)1 << 31; - n -= (jint)1 << 31; + n -= (jint)1 << 31; /* Sign extend lower 32 bits to upper. */ return n; } diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index 1962f80..4b00c43 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -270,8 +270,8 @@ get_constant (jcf, index) jint num = JPOOL_INT (jcf, index); HOST_WIDE_INT lo, hi; lshift_double (num, 0, 32, 64, &lo, &hi, 0); - num = JPOOL_INT (jcf, index+1); - add_double (lo, hi, (uint32)num, 0, &lo, &hi); + num = JPOOL_INT (jcf, index+1) & 0xffffffff; + add_double (lo, hi, num, 0, &lo, &hi); value = build_int_2 (lo, hi); TREE_TYPE (value) = long_type_node; force_fit_type (value, 0); |