static classinfo *class; /* class the compiled method belongs to */
static methodinfo *method; /* pointer to method info of compiled method */
static unicode *descriptor; /* type descriptor of compiled method */
-static u2 mparamcount; /* number of parameters (incl. this) */
+static int mparamcount; /* number of parameters (incl. this) */
static u1 *mparamtypes; /* types of all parameters (TYPE_INT, ...) */
-static u2 mreturntype; /* return type of method */
+static int mreturntype; /* return type of method */
static int maxstack; /* maximal JavaVM stack size */
static int maxlocals; /* maximal number of local JavaVM variables */
#define JAVA_BREAKPOINT 202
1,
-#define ICMD_OPT_IALOAD 203
- 1,
-#define ICMD_OPT_LALOAD 204
- 1,
-#define ICMD_OPT_FALOAD 205
- 1,
-#define ICMD_OPT_DALOAD 206
- 1,
-#define ICMD_OPT_AALOAD 207
- 1,
-#define ICMD_OPT_BALOAD 208
- 1,
-#define ICMD_OPT_CALOAD 209
- 1,
-#define ICMD_OPT_SALOAD 210
- 1,
-
-#define ICMD_OPT_IASTORE 211
- 1,
-#define ICMD_OPT_LASTORE 212
- 1,
-#define ICMD_OPT_FASTORE 213
- 1,
-#define ICMD_OPT_DASTORE 214
- 1,
-#define ICMD_OPT_AASTORE 215
- 1,
-#define ICMD_OPT_BASTORE 216
- 1,
-#define ICMD_OPT_CASTORE 217
- 1,
-#define ICMD_OPT_SASTORE 218
- 1,
- 1,1, /* unused */
+ 1,1,1,1,1,1,1,1, /* unused */
+ 1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
"UNDEF201 ", /* JSR_W 201 */
"UNDEF202 ", /* BREAKPOINT 202 */
- "OPT_IALOAD ", /* 203 */
- "OPT_LALOAD ", /* 204 */
- "OPT_FALOAD ", /* 205 */
- "OPT_DALOAD ", /* 206 */
- "OPT_AALOAD ", /* 207 */
- "OPT_BALOAD ", /* 208 */
- "OPT_CALOAD ", /* 209 */
- "OPT_SALOAD ", /* 210 */
- "OPT_IASTORE ", /* 211 */
- "OPT_LASTORE ", /* 212 */
- "OPT_FASTORE ", /* 213 */
- "OPT_DASTORE ", /* 214 */
- "OPT_AASTORE ", /* 215 */
- "OPT_BASTORE ", /* 216 */
- "OPT_CASTORE ", /* 217 */
- "OPT_SASTORE ", /* 218 */
-
- "UNDEF219","UNDEF220",
+ "UNDEF203","UNDEF204","UNDEF205",
+ "UNDEF206","UNDEF207","UNDEF208","UNDEF209","UNDEF210",
+ "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
+ "UNDEF216","UNDEF217","UNDEF218","UNDEF219","UNDEF220",
"UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
"UNDEF226","UNDEF227","UNDEF228","UNDEF229","UNDEF230",
"UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
"UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
"UNDEF246","UNDEF247","UNDEF248","UNDEF249","UNDEF250",
"UNDEF251","UNDEF252",
+
"BUILTIN3 ", /* 253 */
"BUILTIN2 ", /* 254 */
"BUILTIN1 " /* 255 */
*((void**) (epoint + jr->tablepos)) = epoint + jr->target->mpc;
jr = jr->next;
}
-
-#ifdef CACHE_FLUSH_BLOCK
- synchronize_caches(method->mcode, (mcodelen>>2));
-#endif
-
}
static void local_regalloc ()
{
- int s, t;
- int intalloc, fltalloc;
+ int s, t;
+ int intalloc, fltalloc;
varinfo *v;
if (isleafmethod) {
+ int arg, doublewordarg;
+ arg = 0;
+ doublewordarg = 0;
for (s = 0; s < maxlocals; s++) {
intalloc = -1; fltalloc = -1;
for (t = TYPE_INT; t <= TYPE_ADR; t++) {
v->flags = locals[s][fltalloc].flags;
v->regoff = locals[s][fltalloc].regoff;
}
- else if (s < fltreg_argnum) {
+ else if (!doublewordarg && (arg < mparamcount)
+ && (arg < fltreg_argnum)) {
v->flags = 0;
- v->regoff = argfltregs[s];
+ v->regoff = argfltregs[arg];
}
else if (maxtmpfltreguse > 0) {
maxtmpfltreguse--;
v->flags = locals[s][intalloc].flags;
v->regoff = locals[s][intalloc].regoff;
}
- else if (s < intreg_argnum) {
+ else if (!doublewordarg && (arg < mparamcount)
+ && (arg < intreg_argnum)) {
v->flags = 0;
- v->regoff = argintregs[s];
+ v->regoff = argintregs[arg];
}
else if (maxtmpintreguse > 0) {
maxtmpintreguse--;
}
}
}
+ if (arg < mparamcount) {
+ if (doublewordarg) {
+ doublewordarg = 0;
+ arg++;
+ }
+ else if (IS_2_WORD_TYPE(mparamtypes[arg]))
+ doublewordarg = 1;
+ else
+ arg++;
+ }
}
return;
}
case ICMD_CALOAD:
case ICMD_SALOAD:
- case ICMD_OPT_IALOAD:
- case ICMD_OPT_LALOAD:
- case ICMD_OPT_FALOAD:
- case ICMD_OPT_DALOAD:
- case ICMD_OPT_AALOAD:
-
- case ICMD_OPT_BALOAD:
- case ICMD_OPT_CALOAD:
- case ICMD_OPT_SALOAD:
reg_free_temp(src);
reg_free_temp(src->prev);
reg_new_temp(dst);
case ICMD_CASTORE:
case ICMD_SASTORE:
- case ICMD_OPT_IASTORE:
- case ICMD_OPT_LASTORE:
- case ICMD_OPT_FASTORE:
- case ICMD_OPT_DASTORE:
- case ICMD_OPT_AASTORE:
-
- case ICMD_OPT_BASTORE:
- case ICMD_OPT_CASTORE:
- case ICMD_OPT_SASTORE:
reg_free_temp(src);
reg_free_temp(src->prev);
reg_free_temp(src->prev->prev);
goto icmd_lconst_tail;
case ICMD_LDIV:
if (iptr[0].val.l == 0x00000002)
- iptr[0].val.l = 1;
+ iptr[0].val.i = 1;
else if (iptr[0].val.l == 0x00000004)
- iptr[0].val.l = 2;
+ iptr[0].val.i = 2;
else if (iptr[0].val.l == 0x00000008)
- iptr[0].val.l = 3;
+ iptr[0].val.i = 3;
else if (iptr[0].val.l == 0x00000010)
- iptr[0].val.l = 4;
+ iptr[0].val.i = 4;
else if (iptr[0].val.l == 0x00000020)
- iptr[0].val.l = 5;
+ iptr[0].val.i = 5;
else if (iptr[0].val.l == 0x00000040)
- iptr[0].val.l = 6;
+ iptr[0].val.i = 6;
else if (iptr[0].val.l == 0x00000080)
- iptr[0].val.l = 7;
+ iptr[0].val.i = 7;
else if (iptr[0].val.l == 0x00000100)
- iptr[0].val.l = 8;
+ iptr[0].val.i = 8;
else if (iptr[0].val.l == 0x00000200)
- iptr[0].val.l = 9;
+ iptr[0].val.i = 9;
else if (iptr[0].val.l == 0x00000400)
- iptr[0].val.l = 10;
+ iptr[0].val.i = 10;
else if (iptr[0].val.l == 0x00000800)
- iptr[0].val.l = 11;
+ iptr[0].val.i = 11;
else if (iptr[0].val.l == 0x00001000)
- iptr[0].val.l = 12;
+ iptr[0].val.i = 12;
else if (iptr[0].val.l == 0x00002000)
- iptr[0].val.l = 13;
+ iptr[0].val.i = 13;
else if (iptr[0].val.l == 0x00004000)
- iptr[0].val.l = 14;
+ iptr[0].val.i = 14;
else if (iptr[0].val.l == 0x00008000)
- iptr[0].val.l = 15;
+ iptr[0].val.i = 15;
else if (iptr[0].val.l == 0x00010000)
- iptr[0].val.l = 16;
+ iptr[0].val.i = 16;
else if (iptr[0].val.l == 0x00020000)
- iptr[0].val.l = 17;
+ iptr[0].val.i = 17;
else if (iptr[0].val.l == 0x00040000)
- iptr[0].val.l = 18;
+ iptr[0].val.i = 18;
else if (iptr[0].val.l == 0x00080000)
- iptr[0].val.l = 19;
+ iptr[0].val.i = 19;
else if (iptr[0].val.l == 0x00100000)
- iptr[0].val.l = 20;
+ iptr[0].val.i = 20;
else if (iptr[0].val.l == 0x00200000)
- iptr[0].val.l = 21;
+ iptr[0].val.i = 21;
else if (iptr[0].val.l == 0x00400000)
- iptr[0].val.l = 22;
+ iptr[0].val.i = 22;
else if (iptr[0].val.l == 0x00800000)
- iptr[0].val.l = 23;
+ iptr[0].val.i = 23;
else if (iptr[0].val.l == 0x01000000)
- iptr[0].val.l = 24;
+ iptr[0].val.i = 24;
else if (iptr[0].val.l == 0x02000000)
- iptr[0].val.l = 25;
+ iptr[0].val.i = 25;
else if (iptr[0].val.l == 0x04000000)
- iptr[0].val.l = 26;
+ iptr[0].val.i = 26;
else if (iptr[0].val.l == 0x08000000)
- iptr[0].val.l = 27;
+ iptr[0].val.i = 27;
else if (iptr[0].val.l == 0x10000000)
- iptr[0].val.l = 28;
+ iptr[0].val.i = 28;
else if (iptr[0].val.l == 0x20000000)
- iptr[0].val.l = 29;
+ iptr[0].val.i = 29;
else if (iptr[0].val.l == 0x40000000)
- iptr[0].val.l = 30;
+ iptr[0].val.i = 30;
else if (iptr[0].val.l == 0x80000000)
- iptr[0].val.l = 31;
+ iptr[0].val.i = 31;
else {
PUSHCONST(TYPE_LNG);
break;
case ICMD_AALOAD:
COUNT(count_check_null);
COUNT(count_check_bound);
- case ICMD_OPT_IALOAD:
- case ICMD_OPT_LALOAD:
- case ICMD_OPT_FALOAD:
- case ICMD_OPT_DALOAD:
- case ICMD_OPT_AALOAD:
COUNT(count_pcmd_mem);
OP2IAT_1(opcode-ICMD_IALOAD);
break;
case ICMD_SALOAD:
COUNT(count_check_null);
COUNT(count_check_bound);
- case ICMD_OPT_BALOAD:
- case ICMD_OPT_CALOAD:
- case ICMD_OPT_SALOAD:
COUNT(count_pcmd_mem);
OP2IAT_1(TYPE_INT);
break;
case ICMD_AASTORE:
COUNT(count_check_null);
COUNT(count_check_bound);
- case ICMD_OPT_IASTORE:
- case ICMD_OPT_LASTORE:
- case ICMD_OPT_FASTORE:
- case ICMD_OPT_DASTORE:
- case ICMD_OPT_AASTORE:
COUNT(count_pcmd_mem);
OP3TIA_0(opcode-ICMD_IASTORE);
break;
COUNT(count_check_null);
COUNT(count_check_bound);
COUNT(count_pcmd_mem);
- case ICMD_OPT_BASTORE:
- case ICMD_OPT_CASTORE:
- case ICMD_OPT_SASTORE:
OP3TIA_0(TYPE_INT);
break;
goto icmd_lconst_tail;
case ICMD_LDIV:
if (iptr[0].val.l == 0x00000002)
- iptr[0].val.l = 1;
+ iptr[0].val.i = 1;
else if (iptr[0].val.l == 0x00000004)
- iptr[0].val.l = 2;
+ iptr[0].val.i = 2;
else if (iptr[0].val.l == 0x00000008)
- iptr[0].val.l = 3;
+ iptr[0].val.i = 3;
else if (iptr[0].val.l == 0x00000010)
- iptr[0].val.l = 4;
+ iptr[0].val.i = 4;
else if (iptr[0].val.l == 0x00000020)
- iptr[0].val.l = 5;
+ iptr[0].val.i = 5;
else if (iptr[0].val.l == 0x00000040)
- iptr[0].val.l = 6;
+ iptr[0].val.i = 6;
else if (iptr[0].val.l == 0x00000080)
- iptr[0].val.l = 7;
+ iptr[0].val.i = 7;
else if (iptr[0].val.l == 0x00000100)
- iptr[0].val.l = 8;
+ iptr[0].val.i = 8;
else if (iptr[0].val.l == 0x00000200)
- iptr[0].val.l = 9;
+ iptr[0].val.i = 9;
else if (iptr[0].val.l == 0x00000400)
- iptr[0].val.l = 10;
+ iptr[0].val.i = 10;
else if (iptr[0].val.l == 0x00000800)
- iptr[0].val.l = 11;
+ iptr[0].val.i = 11;
else if (iptr[0].val.l == 0x00001000)
- iptr[0].val.l = 12;
+ iptr[0].val.i = 12;
else if (iptr[0].val.l == 0x00002000)
- iptr[0].val.l = 13;
+ iptr[0].val.i = 13;
else if (iptr[0].val.l == 0x00004000)
- iptr[0].val.l = 14;
+ iptr[0].val.i = 14;
else if (iptr[0].val.l == 0x00008000)
- iptr[0].val.l = 15;
+ iptr[0].val.i = 15;
else if (iptr[0].val.l == 0x00010000)
- iptr[0].val.l = 16;
+ iptr[0].val.i = 16;
else if (iptr[0].val.l == 0x00020000)
- iptr[0].val.l = 17;
+ iptr[0].val.i = 17;
else if (iptr[0].val.l == 0x00040000)
- iptr[0].val.l = 18;
+ iptr[0].val.i = 18;
else if (iptr[0].val.l == 0x00080000)
- iptr[0].val.l = 19;
+ iptr[0].val.i = 19;
else if (iptr[0].val.l == 0x00100000)
- iptr[0].val.l = 20;
+ iptr[0].val.i = 20;
else if (iptr[0].val.l == 0x00200000)
- iptr[0].val.l = 21;
+ iptr[0].val.i = 21;
else if (iptr[0].val.l == 0x00400000)
- iptr[0].val.l = 22;
+ iptr[0].val.i = 22;
else if (iptr[0].val.l == 0x00800000)
- iptr[0].val.l = 23;
+ iptr[0].val.i = 23;
else if (iptr[0].val.l == 0x01000000)
- iptr[0].val.l = 24;
+ iptr[0].val.i = 24;
else if (iptr[0].val.l == 0x02000000)
- iptr[0].val.l = 25;
+ iptr[0].val.i = 25;
else if (iptr[0].val.l == 0x04000000)
- iptr[0].val.l = 26;
+ iptr[0].val.i = 26;
else if (iptr[0].val.l == 0x08000000)
- iptr[0].val.l = 27;
+ iptr[0].val.i = 27;
else if (iptr[0].val.l == 0x10000000)
- iptr[0].val.l = 28;
+ iptr[0].val.i = 28;
else if (iptr[0].val.l == 0x20000000)
- iptr[0].val.l = 29;
+ iptr[0].val.i = 29;
else if (iptr[0].val.l == 0x40000000)
- iptr[0].val.l = 30;
+ iptr[0].val.i = 30;
else if (iptr[0].val.l == 0x80000000)
- iptr[0].val.l = 31;
+ iptr[0].val.i = 31;
else {
PUSHCONST(TYPE_LNG);
break;
case ICMD_AALOAD:
COUNT(count_check_null);
COUNT(count_check_bound);
- case ICMD_OPT_IALOAD:
- case ICMD_OPT_LALOAD:
- case ICMD_OPT_FALOAD:
- case ICMD_OPT_DALOAD:
- case ICMD_OPT_AALOAD:
COUNT(count_pcmd_mem);
OP2IAT_1(opcode-ICMD_IALOAD);
break;
case ICMD_SALOAD:
COUNT(count_check_null);
COUNT(count_check_bound);
- case ICMD_OPT_BALOAD:
- case ICMD_OPT_CALOAD:
- case ICMD_OPT_SALOAD:
COUNT(count_pcmd_mem);
OP2IAT_1(TYPE_INT);
break;
case ICMD_AASTORE:
COUNT(count_check_null);
COUNT(count_check_bound);
- case ICMD_OPT_IASTORE:
- case ICMD_OPT_LASTORE:
- case ICMD_OPT_FASTORE:
- case ICMD_OPT_DASTORE:
- case ICMD_OPT_AASTORE:
COUNT(count_pcmd_mem);
OP3TIA_0(opcode-ICMD_IASTORE);
break;
COUNT(count_check_null);
COUNT(count_check_bound);
COUNT(count_pcmd_mem);
- case ICMD_OPT_BASTORE:
- case ICMD_OPT_CASTORE:
- case ICMD_OPT_SASTORE:
OP3TIA_0(TYPE_INT);
break;