00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef GCC_JAVAOP_H
00027 #define GCC_JAVAOP_H
00028
00029 typedef unsigned char uint8;
00030 #ifndef int16
00031 #define int16 short
00032 #endif
00033 typedef unsigned int16 uint16;
00034
00035 #ifndef int32
00036 #define int32 long
00037 #endif
00038 typedef unsigned int32 uint32;
00039
00040
00041 #ifndef int64
00042 #define int64 long long
00043 #endif
00044
00045 #ifndef uint64
00046 #define uint64 unsigned int64
00047 #endif
00048
00049 typedef uint16 jchar;
00050 #ifdef __STDC__
00051 typedef signed char jbyte;
00052 #else
00053 typedef char jbyte;
00054 #endif
00055 typedef int16 jshort;
00056 typedef int32 jint;
00057 typedef int64 jlong;
00058 typedef void* jref;
00059
00060
00061 #ifndef jfloat
00062 #define jfloat float
00063 #endif
00064
00065
00066 #ifndef jdouble
00067 #define jdouble double
00068 #endif
00069
00070 union Word {
00071 jint i;
00072 jfloat f;
00073 void *p;
00074 };
00075
00076
00077
00078
00079
00080
00081 #ifndef jword
00082 #define jword uint32
00083 #endif
00084
00085 #ifndef IMMEDIATE_u1
00086 #define IMMEDIATE_u1 (PC++, CHECK_PC_IN_RANGE(PC), BCODE[PC-1])
00087 #endif
00088 #ifndef IMMEDIATE_s1
00089 #define IMMEDIATE_s1 (PC++, CHECK_PC_IN_RANGE(PC), (signed char)BCODE[PC-1])
00090 #endif
00091 #ifndef IMMEDIATE_s2
00092 #define IMMEDIATE_s2 (PC+=2, CHECK_PC_IN_RANGE(PC), \
00093 (signed char) BCODE[PC-2] * 256 + BCODE[PC-1])
00094 #endif
00095 #ifndef IMMEDIATE_u2
00096 #define IMMEDIATE_u2 (PC+=2, CHECK_PC_IN_RANGE(PC),\
00097 (BCODE[PC-2] * 256 + BCODE[PC-1]))
00098 #endif
00099 #ifndef IMMEDIATE_s4
00100 #define IMMEDIATE_s4 (PC+=4, CHECK_PC_IN_RANGE(PC), \
00101 (WORD_TO_INT((BCODE[PC-4] << 24) | (BCODE[PC-3] << 16) \
00102 | (BCODE[PC-2] << 8) | (BCODE[PC-1]))))
00103 #endif
00104
00105 static inline jfloat
00106 WORD_TO_FLOAT(jword w)
00107 { union Word wu;
00108 wu.i = w;
00109 return wu.f;
00110 }
00111
00112
00113
00114
00115
00116 static inline jint
00117 WORD_TO_INT(jword w)
00118 {
00119 jint n = w & 0xffffffff;
00120 n ^= (jint)1 << 31;
00121 n -= (jint)1 << 31;
00122 return n;
00123 }
00124
00125 static inline jlong
00126 WORDS_TO_LONG(jword hi, jword lo)
00127 {
00128 return ((jlong) hi << 32) | ((jlong)lo & (((jlong)1 << 32) -1));
00129 }
00130
00131 union DWord {
00132 jdouble d;
00133 jlong l;
00134 jword w[2];
00135 };
00136
00137 static inline jdouble
00138 WORDS_TO_DOUBLE(jword hi, jword lo)
00139 { union DWord wu;
00140 #if (1 == HOST_FLOAT_WORDS_BIG_ENDIAN)
00141 wu.l = WORDS_TO_LONG(lo, hi);
00142 #else
00143 wu.l = WORDS_TO_LONG(hi, lo);
00144 #endif
00145 return wu.d;
00146 }
00147
00148
00149
00150
00151 #define UT8_CHAR_LENGTH(PREFIX_CHAR) \
00152 ((unsigned char)(PREFIX_CHAR) < 128 ? 1 \
00153 : ((PREFIX_CHAR) & 0x40) == 0 ? -1 \
00154 : ((PREFIX_CHAR) & 0x20) == 0 ? 2 \
00155 : ((PREFIX_CHAR) & 0x10) == 0 ? 3 \
00156 : ((PREFIX_CHAR) & 0x08) == 0 ? 4 : 5)
00157
00158 #endif