aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/javaop.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/java/javaop.h')
-rw-r--r--gcc/java/javaop.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/java/javaop.h b/gcc/java/javaop.h
index c603be1..d8418f7 100644
--- a/gcc/java/javaop.h
+++ b/gcc/java/javaop.h
@@ -98,7 +98,7 @@ union Word {
#endif
#ifndef IMMEDIATE_s4
#define IMMEDIATE_s4 (PC+=4, CHECK_PC_IN_RANGE(PC), \
- ((jint)((BCODE[PC-4] << 24) | (BCODE[PC-3] << 16) \
+ (WORD_TO_INT((BCODE[PC-4] << 24) | (BCODE[PC-3] << 16) \
| (BCODE[PC-2] << 8) | (BCODE[PC-1]))))
#endif
@@ -109,6 +109,16 @@ WORD_TO_FLOAT(jword w)
return wu.f;
}
+/* Sign extend w. */
+static inline jint
+WORD_TO_INT(jword w)
+{
+ jint n = w;
+ n ^= (jint)1 << 31;
+ n -= (jint)1 << 31;
+ return n;
+}
+
static inline jlong
WORDS_TO_LONG(jword hi, jword lo)
{