From 8ecd06e1e6ea013b3dbcd1d76e6fe2fc7ed2a25d Mon Sep 17 00:00:00 2001 From: cacao Date: Fri, 6 Nov 1998 00:11:40 +0000 Subject: [PATCH] documentation added --- Makefile | 26 +- alpha/calling.doc | 161 ++--- alpha/gen.c | 29 +- alpha/ngen.c | 1617 ++++++++++++++++++++++++++++----------------- alpha/ngen.h | 36 +- ncomp/ncompdef.h | 60 +- ncomp/nstack.c | 28 +- 7 files changed, 1161 insertions(+), 796 deletions(-) diff --git a/Makefile b/Makefile index 9d3bae851..631fc0e5c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -############################################################################### +################################################################################ # Makefile for the JavaVM - compiler CACAO # ################################################################################ # @@ -22,8 +22,6 @@ # ################################################################################ -MAKE = make - VERSION_MAJOR = 0 VERSION_MINOR = 30 VERSION_POSTFIX = @@ -47,10 +45,18 @@ endif #CC = cc #CFLAGS = -g -mieee -Wall $(THREAD_CFLAGS) #CFLAGS = -mieee -O3 -Wall $(THREAD_CFLAGS) +#LFLAGS = -lm -CC = gcc -#CFLAGS = -g -ieee $(THREAD_CFLAGS) +CC = cc +#CFLAGS = -g3 -ieee $(THREAD_CFLAGS) CFLAGS = -O3 -ieee $(THREAD_CFLAGS) +LFLAGS = -lm + +# IRIX 6.5 MIPSPro 7.2.1 +#CC = cc +#CFLAGS = -g $(THREAD_CFLAGS) -DMAP_ANONYMOUS=0 -woff 1048,1110,1164,1515 +#CFLAGS = -O2 -OPT:Olimit=0 $(THREAD_CFLAGS) -DMAP_ANONYMOUS=0 +#LFLAGS = -lm -lelfutil OBJ = main.o tables.o loader.o compiler.o newcomp.o builtin.o asmpart.o \ toolbox/toolbox.a native.o $(THREAD_OBJ) mm/mm.o @@ -58,9 +64,9 @@ OBJH = headers.o tables.o loader.o builtin.o toolbox/toolbox.a $(THREAD_OBJ) \ mm/mm.o cacao: $(OBJ) - $(CC) $(CFLAGS) -o cacao $(OBJ) -lm + $(CC) $(CFLAGS) -o cacao $(OBJ) $(LFLAGS) cacaoh: $(OBJH) - $(CC) $(CFLAGS) -o cacaoh $(OBJH) -lm + $(CC) $(CFLAGS) -o cacaoh $(OBJH) $(LFLAGS) main.o: main.c global.h tables.h compiler.h ncomp/ncomp.h loader.h \ asmpart.h builtin.h native.h @@ -153,6 +159,12 @@ config-sparc: ln -s ../sysdep threads/sysdep $(MAKE) clean +config-mips: + rm -f sysdep + ln -s mips sysdep + rm -f threads/sysdep + ln -s ../sysdep threads/sysdep + $(MAKE) clean ##################### generation of NATIVE - header files ###################### diff --git a/alpha/calling.doc b/alpha/calling.doc index ab27b901d..287217a66 100644 --- a/alpha/calling.doc +++ b/alpha/calling.doc @@ -1,23 +1,21 @@ -/***************************** calling.doc ************************************* +/* calling.doc ***************************************************************** Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst See file COPYRIGHT for information on usage and disclaimer of warranties - Das ist eine kurze Dokumentation "uber die internen Aufrufskonventionen - der Java-Methoden in der DEC-ALHPA-Version. + A short description of Alpha calling conventions and register usage. - Author: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at + Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at + Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at - Last Change: 1997/02/05 + Last Change: 1998/11/05 *******************************************************************************/ -FILE: calling.doc -Das ist eine kurze Dokumentation "uber die internen Aufrufskonventionen -der Java-Methoden in der DEC-ALHPA-Version. +Short documentation of the Java calling conventions for the Alpha. -------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- Die Aufrufskonventionen halten sich weitgehende an die Konventionen @@ -33,84 +31,65 @@ R28 ..... enth"alt bei einem Methodenaufruf auf jeden Fall den Zeiger dann hat dieses Register keinen definierten Wert (Alle von der JavaVM verwendeten Funktionen, z. B. 'builtin_new', etc. werden so aufgerufen) - -R1 ...... enth"alt nach Methodenbeendigung entweder NULL oder einen Zeiger - auf ein Objekt vom Typ java.lang.Throwable (oder einem davon - abgeleiteten Typ). - Wenn das der Fall ist, dann wurde in der Methode eine Exception - geworfen, die nicht abgefangen werden konnte, und jetzt beim - Aufrufer weiter bearbeitet werden muss. - - Die restlichen Register folgen den normalen Konventionen, aber ich gebe hier noch einmal eine kurze "Ubersicht: -INTEGER-REGISTER: +integer registers: + +R0 ........ method result value for types INT, LONG and ADDRESS + +R1-R8 ..... temporary registers (destroyed by called method) -R0 ........ R"uckgabewert von den Methoden f"ur die Typen: - INT,LONG,ADDRESS - -R1 ........ Adresse der geworfenen Exception (oder NULL) +R9-R15 .... saved registers (left unchanged by called method) -R2-R8 ..... tempor"are Register (werden im Unterprogram zerst"ort) +R16-R21 ... argument registers 0 - 5 (contain the first six method arguments + of type INT, LONG and ADDRESS. Argument registers are destroyed + by called method) -R9-R15 .... gesicherte Register (werden im Unterprogramm nicht ver"andert) +R22-R24 ... temporary registers (destroyed by called method) -R16-R21 ... Argumentregister 1 - 6 (hier werden die ersten sechs Methoden- - Argumente eingetragen, sofern sie von den Typen INT,LONG,ADDRESS - sind. Diese Argumentregister werden im Unterprogramm zerst"ort - -R22-R24 ... tempor"are Register - (werden im Unterprogramm zerst"ort) - -R25 ....... tempor"ares Register f"ur kurzfristige Zwischenergebnisse - (wird im Unterprogramm zerst"ort) +R25 ....... code generator temporary register (destroyed by called method) -R26 (ra) .. R"ucksprungadresse (bleibt im Unterprogramm erhalten) +R26 (ra) .. return address (left unchanged by called method) -R27 (pv) .. Prozedurzeiger. Dieses Register muss auf jeden Fall einen Zeiger - auf die aufgerufene Prozedur enthalten (damit die Zugriffe - auf das Datensegment funktionieren k"onnen). - (der Wert bleibt im Unterprogramm erhalten) +R27 (pv) .. procedure vector, points to the first instruction of the called + method. This vector is used for addressing the entries in the + data segment. The ov of the caller is recomputed from the ra. + Therefore it is necessary that a return is always done using ra. -R28 ....... Zeiger auf die 'methodinfo' - Struktur. Muss auf jeden Fall bei - allen Methodenaufrufen richtig gesetzt sein (wegen eines eventuellen - Compiler-Aufrufs) - (wird im Unterprogramm zerst"ort) - -R29 ....... tempor"ares Register f"ur kurzfristige Zwischenergebnisse - (wird im Unterprogramm zerst"ort) +R28 ....... pointer to 'methodinfo' structure. This register has to be set + correctly, because it is needed in the case the jit is invoked. + Also used as code generator temporary register. It isdestroyed + by called method) -R30 (sp) .. Zeiger auf die Untergrenze des Stack (der Stack w"achst von - oben nach unten) - -R31 ....... enth"alt immer NULL +R29 ....... code generator temporary register (destroyed by called method) +R30 (sp) .. stack pointer. The stack grows from high to low. + +R31 ....... always contains zero -FLIESSKOMMA-REGISTER: +floating point registers: +F0 ........ method result value for types FLOAT and DOUBLE -F0 ........ enth"alt die R"uckgabewert der Methoden vom Typ: - FLOAT, DOUBLE -F1 ........ enth"alt den Imagin"aranteil von einem komplexen Funktionswert - (wird von mir nicht benutzt) +F1 ........ temporary register (destroyed by called method) -F2-F9 ..... gesicherte Register (werden im Unterprogramm nicht ver"andert) +F2-F9 ..... saved registers (left unchanged by called method) + +F10-F15 ... temporary registers (destroyed by called method) -F10-F15 ... tempor"are Register (werden im Unterprogramm zerst"ort) +F16-F21 ... argument registers 0 - 5 (contain the first six method arguments + of type FLOAT and DOUBLE. Argument registers are destroyed + by called method) +F22-F27 ... temporary registers (destroyed by called method) -F16-F21 ... Argumentregister f"ur die ersten 6 Parameter, sofern diese - vom den Typen FLOAT oder DOUBLE sind - -F22-F24 ... tempor"are Register (werden im Unterprogramm zerst"ort) +F28-F30 ... code generator temporary register (destroyed by called method) -F25-F31 ... tempor"are Register f"ur kurzfristige Zwischenergebnisse - (werden im Unterprogramm zerst"ort) +F31 ....... always contains zero -F31 ....... enth"alt immer 0.0 @@ -149,34 +128,26 @@ im Stackframe ist unabh"angig vom Typ auf jedem Fall 64 bit lang, die Gr"ossenangaben der Bereiche sind in solchen Einheiten von 64 Bit angegeben): - --------------------------------------------- - | Parameter n (vom Aufrufer) | - --------------------------------------------- - | Parameter n-1 | - --------------------------------------------- - | ... | - --------------------------------------------- - SP vorher -> | Parameter 7 | - ============================================= --- - | gesichertes RA | savedregs_num - --------------------------------------------- - | andere gesicherte Register | - ============================================= --- - | Platz f"ur lokale Werte, die nicht mehr | localvars_num - | in Register passen | - ============================================= --- - | .... | arguments_num - --------------------------------------------- - | Parameter 8 | - --------------------------------------------- - SP ---> | Parameter 7 (f"ur aufgerufenen Methoden) | - ============================================= --- - - -Damit die Anf"ange der einzelnen Bereiche (im Codegenerator) leichter -ausgedr"uckt werden k"onnen, sind ein paar Hilfsvariablen vorgesehen, die -die Adressierung der einzelnen Bereiche vereinfachen: - localvars_base = arguments_num - savedregs_base = localvars_base + localvars_num - parentargs_base = savedregs_base + savedregs_num - + --------------------------------------------- + | parameter n (passed from caller) | + --------------------------------------------- + | parameter n-1 | + --------------------------------------------- + | ... | + --------------------------------------------- + | parameter 7 | +old SP ---> ============================================= --- parentargs_base + | saved RA | + --------------------------------------------- savedregs_num + | others saved registers | + ============================================= --- maxmemuse + 1 + | optional monitor_exit argument | + ============================================= --- maxmemuse + | area for spilled registers | + ============================================= + | .... | + --------------------------------------------- + | parameter 8 | + --------------------------------------------- + | parameter 7 (passed to called method) | +new SP ---> ============================================= diff --git a/alpha/gen.c b/alpha/gen.c index b82af31da..996225d8d 100644 --- a/alpha/gen.c +++ b/alpha/gen.c @@ -1754,6 +1754,8 @@ This makes sense only for the stub-generation-routines below. *(p++) = ( (((s4)(op))<<26)|((a)<<21)|((b)<<16)|((disp)&0xffff) ) +#if 0 + /************************ function createcompilerstub ************************** creates a stub routine which calls the compiler @@ -1794,6 +1796,20 @@ void removecompilerstub (u1 *stub) } +/************************ function: removenativestub *************************** + + removes a previously created native-stub from memory + +*******************************************************************************/ + +void removenativestub (u1 *stub) +{ + CFREE (stub, NATIVESTUBSIZE * 8); +} + +#endif /* 0 */ + + /********************* Funktion: createnativestub ****************************** creates a stub routine which calls a native method @@ -1832,16 +1848,3 @@ u1 *createnativestub (functionptr f, methodinfo *m) return (u1*) s; } - - -/************************ function: removenativestub *************************** - - removes a previously created native-stub from memory - -*******************************************************************************/ - -void removenativestub (u1 *stub) -{ - CFREE (stub, NATIVESTUBSIZE * 8); -} - diff --git a/alpha/ngen.c b/alpha/ngen.c index 3e3b430e2..363835652 100644 --- a/alpha/ngen.c +++ b/alpha/ngen.c @@ -23,23 +23,22 @@ Datatypes and Register Allocations: ----------------------------------- On 64-bit-machines (like the Alpha) all operands are stored in the -registers in a 64-bit form, even when the correspondig JavaVM -operands only need 32 bits. -This is done by a canonical representation: +registers in a 64-bit form, even when the correspondig JavaVM operands +only need 32 bits. This is done by a canonical representation: -32-bit integers are allways stored as sign-extended 64-bit values -(this approach is directly supported by the Alpha architecture and -is very easy to implement). +32-bit integers are allways stored as sign-extended 64-bit values (this +approach is directly supported by the Alpha architecture and is very easy +to implement). -32-bit-floats are stored in a 64-bit doubleprecision register by -simply expanding the exponent and mantissa with zeroes. -(also supported by the architecture) +32-bit-floats are stored in a 64-bit doubleprecision register by simply +expanding the exponent and mantissa with zeroes. (also supported by the +architecture) Stackframes: -The calling conventions and the layout of the stack is -explained in detail in the documention file: calling.doc +The calling conventions and the layout of the stack is explained in detail +in the documention file: calling.doc *******************************************************************************/ @@ -60,7 +59,7 @@ explained in detail in the documention file: calling.doc #ifdef SOFTNULLPTRCHECK #define gen_nullptr_check(objreg) \ if (checknull) {\ - M_BEQZ((objreg), 0);\ + M_BEQZ((objreg), REG);\ mcode_addxnullrefs(mcodeptr);\ } #else @@ -78,7 +77,7 @@ explained in detail in the documention file: calling.doc if a and b are the same int-register, no code will be generated. */ -#define M_INTMOVE(a,b) if(a!=b){M_OR(a,a,b,0);} +#define M_INTMOVE(a,b) if(a!=b){M_MOV(a,b);} /* M_FLTMOVE: @@ -119,13 +118,12 @@ explained in detail in the documention file: calling.doc /* reg_of_var: - This function determines a register, to which the result of an - operation should go, when it is ultimatively intended to store the result - in pseudoregister v. - If v is assigned to an actual register, this register will be - returned. - Otherwise (when v is spilled) this function returns tempregnum. - If not already done, regoff and flags are set in the stack location. + This function determines a register, to which the result of an operation + should go, when it is ultimatively intended to store the result in + pseudoregister v. + If v is assigned to an actual register, this register will be returned. + Otherwise (when v is spilled) this function returns tempregnum. + If not already done, regoff and flags are set in the stack location. */ static int reg_of_var(stackptr v, int tempregnum) @@ -196,27 +194,43 @@ static int reg_of_var(stackptr v, int tempregnum) } +/* NullPointerException handlers and exception handling initialisation */ + +/* asm_signal_exception passes exception pointer and the signal context + structure (contains the saved registers) to the assembler handler which + restores registers and walks through the Java exception tables. +*/ + void asm_signal_exception(void *xptr, void *sigctx); + +/* NullPointerException signal handler for hardware null pointer check */ + void catch_NullPointerException(int sig, int code, void *sigctx) { sigset_t nsig; /* Reset signal handler - necessary for SysV, does no harm for BSD */ - signal(sig, (void*) catch_NullPointerException); + signal(sig, (void*) catch_NullPointerException); /* reinstall handler */ sigemptyset(&nsig); sigaddset(&nsig, sig); - sigprocmask(SIG_UNBLOCK, &nsig, NULL); + sigprocmask(SIG_UNBLOCK, &nsig, NULL); /* unblock signal */ asm_signal_exception(proto_java_lang_NullPointerException, sigctx); } + #ifdef __osf__ void init_exceptions(void) { -#else +#else /* Linux */ + +/* Linux on Digital Alpha needs an initialisation of the ieee floating point + control for IEEE compliant arithmetic (option -mieee of GCC). Under + Digital Unix this is done automatically. +*/ #include @@ -225,19 +239,23 @@ extern void ieee_set_fp_control(unsigned long fp_control); void init_exceptions(void) { -/* initialise floating point control */ +/* initialize floating point control */ + ieee_set_fp_control(ieee_get_fp_control() & ~IEEE_TRAP_ENABLE_INV & ~IEEE_TRAP_ENABLE_DZE -/* & ~IEEE_TRAP_ENABLE_UNF */ +/* & ~IEEE_TRAP_ENABLE_UNF we dont want underflow */ & ~IEEE_TRAP_ENABLE_OVF); #endif - /* Catch signal we need to convert to exceptions */ + /* install signal handlers we need to convert to exceptions */ + if (!checknull) { + #if defined(SIGSEGV) signal(SIGSEGV, (void*) catch_NullPointerException); #endif + #if defined(SIGBUS) signal(SIGBUS, (void*) catch_NullPointerException); #endif @@ -288,9 +306,11 @@ static void gen_mcode() parentargs_base = maxmemuse + savedregs_num; -#ifdef USE_THREADS +#ifdef USE_THREADS /* space to save argument of monitor_enter */ + if (checksync && (method->flags & ACC_SYNCHRONIZED)) parentargs_base++; + #endif /* create method header */ @@ -299,17 +319,28 @@ static void gen_mcode() (void) dseg_adds4(parentargs_base * 8); /* FrameSize */ #ifdef USE_THREADS + + /* IsSync contains the offset relative to the stack pointer for the + argument of monitor_exit used in the exception handler. Since the + offset could be zero and give a wrong meaning of the flag it is + offset by one. + */ + if (checksync && (method->flags & ACC_SYNCHRONIZED)) (void) dseg_adds4((maxmemuse + 1) * 8); /* IsSync */ else + #endif - (void) dseg_adds4(0); /* IsSync */ + + (void) dseg_adds4(0); /* IsSync */ (void) dseg_adds4(isleafmethod); /* IsLeaf */ (void) dseg_adds4(savintregcnt - maxsavintreguse); /* IntSave */ (void) dseg_adds4(savfltregcnt - maxsavfltreguse); /* FltSave */ (void) dseg_adds4(exceptiontablelength); /* ExTableSize */ + /* create exception table */ + for (len = 0; len < exceptiontablelength; len++) { dseg_addtarget(BlockPtrOfPC(extable[len].startpc)); dseg_addtarget(BlockPtrOfPC(extable[len].endpc)); @@ -317,11 +348,11 @@ static void gen_mcode() (void) dseg_addaddress(extable[len].catchtype); } - /* initialise mcode variables */ + /* initialize mcode variables */ mcodeptr = (s4*) mcodebase; mcodeend = (s4*) (mcodebase + mcodesize); - MCODECHECK(128); + MCODECHECK(128 + mparamcount); /* create stack frame (if necessary) */ @@ -332,7 +363,7 @@ static void gen_mcode() p = parentargs_base; if (!isleafmethod) - {p--; M_LST (REG_RA, REG_SP, 8*p);} + {p--; M_AST (REG_RA, REG_SP, 8*p);} for (r = savintregcnt - 1; r >= maxsavintreguse; r--) {p--; M_LST (savintregs[r], REG_SP, 8 * p);} for (r = savfltregcnt - 1; r >= maxsavfltreguse; r--) @@ -344,18 +375,22 @@ static void gen_mcode() if (checksync && (method->flags & ACC_SYNCHRONIZED)) { if (method->flags & ACC_STATIC) { p = dseg_addaddress (class); - M_LLD(REG_ITMP1, REG_PV, p); - M_LST(REG_ITMP1, REG_SP, 8 * maxmemuse); + M_ALD(REG_ITMP1, REG_PV, p); + M_AST(REG_ITMP1, REG_SP, 8 * maxmemuse); } else { - M_LST (argintregs[0], REG_SP, 8 * maxmemuse); + M_AST (argintregs[0], REG_SP, 8 * maxmemuse); } } #endif + /* copy argument registers to stack and call trace function with pointer + to arguments on stack. ToDo: save floating point registers !!!!!!!!! + */ + if (runverbose && isleafmethod) { M_LDA (REG_SP, REG_SP, -(8*8)); - M_LST(REG_RA, REG_SP, 1*8); + M_AST(REG_RA, REG_SP, 1*8); M_LST(argintregs[0], REG_SP, 2*8); M_LST(argintregs[1], REG_SP, 3*8); M_LST(argintregs[2], REG_SP, 4*8); @@ -363,13 +398,13 @@ static void gen_mcode() M_LST(argintregs[4], REG_SP, 6*8); M_LST(argintregs[5], REG_SP, 7*8); p = dseg_addaddress (method); - M_LLD(REG_ITMP1, REG_PV, p); - M_LST(REG_ITMP1, REG_SP, 0); + M_ALD(REG_ITMP1, REG_PV, p); + M_AST(REG_ITMP1, REG_SP, REG); p = dseg_addaddress ((void*) (builtin_trace_args)); - M_LLD(REG_PV, REG_PV, p); + M_ALD(REG_PV, REG_PV, p); M_JSR(REG_RA, REG_PV); M_LDA(REG_PV, REG_RA, -(int)((u1*) mcodeptr - mcodebase)); - M_LLD(REG_RA, REG_SP, 1*8); + M_ALD(REG_RA, REG_SP, 1*8); M_LLD(argintregs[0], REG_SP, 2*8); M_LLD(argintregs[1], REG_SP, 3*8); M_LLD(argintregs[2], REG_SP, 4*8); @@ -426,23 +461,27 @@ static void gen_mcode() } } /* end for */ + /* call trace function */ + if (runverbose && !isleafmethod) { M_LDA (REG_SP, REG_SP, -8); p = dseg_addaddress (method); - M_LLD(REG_ITMP1, REG_PV, p); - M_LST(REG_ITMP1, REG_SP, 0); + M_ALD(REG_ITMP1, REG_PV, p); + M_AST(REG_ITMP1, REG_SP, REG); p = dseg_addaddress ((void*) (builtin_trace_args)); - M_LLD(REG_PV, REG_PV, p); + M_ALD(REG_PV, REG_PV, p); M_JSR(REG_RA, REG_PV); M_LDA(REG_PV, REG_RA, -(int)((u1*) mcodeptr - mcodebase)); M_LDA(REG_SP, REG_SP, 8); } + /* call monitorenter function */ + #ifdef USE_THREADS if (checksync && (method->flags & ACC_SYNCHRONIZED)) { p = dseg_addaddress ((void*) (builtin_monitorenter)); - M_LLD(REG_PV, REG_PV, p); - M_LLD(argintregs[0], REG_SP, 8 * maxmemuse); + M_ALD(REG_PV, REG_PV, p); + M_ALD(argintregs[0], REG_SP, 8 * maxmemuse); M_JSR(REG_RA, REG_PV); M_LDA(REG_PV, REG_RA, -(int)((u1*) mcodeptr - mcodebase)); } @@ -451,6 +490,8 @@ static void gen_mcode() /* end of header generation */ + /* walk through all basic blocks */ + for (bbs = block_count, bptr = block; --bbs >= 0; bptr++) { bptr -> mpc = (int)((u1*) mcodeptr - mcodebase); @@ -465,6 +506,9 @@ static void gen_mcode() brefs->branchpos, bptr->mpc); } } + + /* copy interface registers to their destination */ + src = bptr->instack; len = bptr->indepth; MCODECHECK(64+len); @@ -503,69 +547,76 @@ static void gen_mcode() } src = src->prev; } + + /* walk through all instructions */ + src = bptr->instack; len = bptr->icount; for (iptr = bptr->iinstr; len > 0; src = iptr->dst, len--, iptr++) { - MCODECHECK(64); + MCODECHECK(64); /* an instruction usually needs < 64 words */ switch (iptr->opc) { - case ICMD_NOP: + case ICMD_NOP: /* ... ==> ... */ break; - case ICMD_NULLCHECKPOP: + case ICMD_NULLCHECKPOP: /* ..., objectref ==> ... */ + var_to_reg_int(s1, src, REG_ITMP1); gen_nullptr_check(s1); break; /* constant operations ************************************************/ - case ICMD_ICONST: +#define ICONST(r,c) if(((c)>=-32768)&&((c)<= 32767)){M_LDA(r,REG_ZERO,c);} \ + else{a=dseg_adds4(c);M_ILD(r,REG_PV,a);} + +#define LCONST(r,c) if(((c)>=-32768)&&((c)<= 32767)){M_LDA(r,REG_ZERO,c);} \ + else{a=dseg_adds8(c);M_LLD(r,REG_PV,a);} + + case ICMD_ICONST: /* ... ==> ..., constant */ + /* op1 = 0, val.i = constant */ + d = reg_of_var(iptr->dst, REG_ITMP1); - if ( (iptr->val.i >= -32768) && (iptr->val.i <= 32767) ) { - M_LDA(d, REG_ZERO, iptr->val.i); - } - else { - a = dseg_adds4 (iptr->val.i); - M_ILD(d, REG_PV, a); - } + ICONST(d, iptr->val.i); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LCONST: + case ICMD_LCONST: /* ... ==> ..., constant */ + /* op1 = 0, val.l = constant */ + d = reg_of_var(iptr->dst, REG_ITMP1); - if ((iptr->val.l >= -32768) && (iptr->val.l <= 32767) ) { - M_LDA(d, REG_ZERO, iptr->val.l); - } - else { - a = dseg_adds8 (iptr->val.l); - M_LLD(d, REG_PV, a); - } + LCONST(d, iptr->val.l); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_FCONST: + case ICMD_FCONST: /* ... ==> ..., constant */ + /* op1 = 0, val.f = constant */ + d = reg_of_var (iptr->dst, REG_FTMP1); a = dseg_addfloat (iptr->val.f); M_FLD(d, REG_PV, a); store_reg_to_var_flt (iptr->dst, d); break; - case ICMD_DCONST: + case ICMD_DCONST: /* ... ==> ..., constant */ + /* op1 = 0, val.d = constant */ + d = reg_of_var (iptr->dst, REG_FTMP1); a = dseg_adddouble (iptr->val.d); M_DLD(d, REG_PV, a); store_reg_to_var_flt (iptr->dst, d); break; + case ICMD_ACONST: /* ... ==> ..., constant */ + /* op1 = 0, val.a = constant */ - case ICMD_ACONST: d = reg_of_var(iptr->dst, REG_ITMP1); if (iptr->val.a) { a = dseg_addaddress (iptr->val.a); - M_LLD(d, REG_PV, a); + M_ALD(d, REG_PV, a); } else { M_INTMOVE(REG_ZERO, d); @@ -573,11 +624,13 @@ static void gen_mcode() store_reg_to_var_int(iptr->dst, d); break; + /* load/store operations **********************************************/ - case ICMD_ILOAD: - case ICMD_LLOAD: + case ICMD_ILOAD: /* ... ==> ..., content of local variable */ + case ICMD_LLOAD: /* op1 = local variable */ case ICMD_ALOAD: + d = reg_of_var(iptr->dst, REG_ITMP1); if ((iptr->dst->varkind == LOCALVAR) && (iptr->dst->varnum == iptr->op1)) @@ -590,8 +643,9 @@ static void gen_mcode() store_reg_to_var_int(iptr->dst, d); break; - case ICMD_FLOAD: - case ICMD_DLOAD: + case ICMD_FLOAD: /* ... ==> ..., content of local variable */ + case ICMD_DLOAD: /* op1 = local variable */ + d = reg_of_var(iptr->dst, REG_FTMP1); if ((iptr->dst->varkind == LOCALVAR) && (iptr->dst->varnum == iptr->op1)) @@ -605,9 +659,10 @@ static void gen_mcode() break; - case ICMD_ISTORE: - case ICMD_LSTORE: + case ICMD_ISTORE: /* ..., value ==> ... */ + case ICMD_LSTORE: /* op1 = local variable */ case ICMD_ASTORE: + if ((src->varkind == LOCALVAR) && (src->varnum == iptr->op1)) break; @@ -622,8 +677,9 @@ static void gen_mcode() } break; - case ICMD_FSTORE: - case ICMD_DSTORE: + case ICMD_FSTORE: /* ..., value ==> ... */ + case ICMD_DSTORE: /* op1 = local variable */ + if ((src->varkind == LOCALVAR) && (src->varnum == iptr->op1)) break; @@ -641,8 +697,10 @@ static void gen_mcode() /* pop/dup/swap operations ********************************************/ - case ICMD_POP: - case ICMD_POP2: + /* attention: double and longs are only one entry in CACAO ICMDs */ + + case ICMD_POP: /* ..., value ==> ... */ + case ICMD_POP2: /* ..., value, value ==> ... */ break; #define M_COPY(from,to) \ @@ -661,27 +719,34 @@ static void gen_mcode() }\ } - case ICMD_DUP: + case ICMD_DUP: /* ..., a ==> ..., a, a */ M_COPY(src, iptr->dst); break; - case ICMD_DUP_X1: + case ICMD_DUP_X1: /* ..., a, b ==> ..., b, a, b */ + M_COPY(src, iptr->dst->prev->prev); - case ICMD_DUP2: + + case ICMD_DUP2: /* ..., a, b ==> ..., a, b, a, b */ + M_COPY(src, iptr->dst); M_COPY(src->prev, iptr->dst->prev); break; - case ICMD_DUP2_X1: + case ICMD_DUP2_X1: /* ..., a, b, c ==> ..., b, c, a, b, c */ + M_COPY(src->prev, iptr->dst->prev->prev->prev); - case ICMD_DUP_X2: + + case ICMD_DUP_X2: /* ..., a, b, c ==> ..., c, a, b, c */ + M_COPY(src, iptr->dst); M_COPY(src->prev, iptr->dst->prev); M_COPY(src->prev->prev, iptr->dst->prev->prev); M_COPY(src, iptr->dst->prev->prev->prev); break; - case ICMD_DUP2_X2: + case ICMD_DUP2_X2: /* ..., a, b, c, d ==> ..., c, d, a, b, c, d */ + M_COPY(src, iptr->dst); M_COPY(src->prev, iptr->dst->prev); M_COPY(src->prev->prev, iptr->dst->prev->prev); @@ -690,7 +755,8 @@ static void gen_mcode() M_COPY(src->prev, iptr->dst->prev->prev->prev->prev->prev); break; - case ICMD_SWAP: + case ICMD_SWAP: /* ..., a, b ==> ..., b, a */ + M_COPY(src, iptr->dst->prev); M_COPY(src->prev, iptr->dst); break; @@ -698,226 +764,260 @@ static void gen_mcode() /* integer operations *************************************************/ - case ICMD_INEG: + case ICMD_INEG: /* ..., value ==> ..., - value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_ISUB(REG_ZERO, s1, d, 0); + M_ISUB(REG_ZERO, s1, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LNEG: + case ICMD_LNEG: /* ..., value ==> ..., - value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_LSUB(REG_ZERO, s1, d, 0); + M_LSUB(REG_ZERO, s1, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_I2L: + case ICMD_I2L: /* ..., value ==> ..., value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); M_INTMOVE(s1, d); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_L2I: + case ICMD_L2I: /* ..., value ==> ..., value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_IADD(s1, REG_ZERO, d , 0); + M_IADD(s1, REG_ZERO, d , REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_INT2BYTE: + case ICMD_INT2BYTE: /* ..., value ==> ..., value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if (has_ext_instr_set) { M_BSEXT(s1, d); } else { - M_SLL(s1,56, d, 1); - M_SRA( d,56, d, 1); + M_SLL(s1, 56, d, CONST); + M_SRA( d, 56, d, CONST); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_INT2CHAR: + case ICMD_INT2CHAR: /* ..., value ==> ..., value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_ZAPNOT(s1, 0x03, d, 1); + M_CZEXT(s1, d); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_INT2SHORT: + case ICMD_INT2SHORT: /* ..., value ==> ..., value */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if (has_ext_instr_set) { M_SSEXT(s1, d); } else { - M_SLL( s1, 48, d, 1); - M_SRA( d, 48, d, 1); + M_SLL(s1, 48, d, CONST); + M_SRA( d, 48, d, CONST); } store_reg_to_var_int(iptr->dst, d); break; -#define ICONST(r,c) if(((c)>=-32768)&&((c)<= 32767)){M_LDA(r,REG_ZERO,c);} \ - else{a=dseg_adds4(c);M_ILD(r,REG_PV,a);} - -#define LCONST(r,c) if(((c)>=-32768)&&((c)<= 32767)){M_LDA(r,REG_ZERO,c);} \ - else{a=dseg_adds8(c);M_LLD(r,REG_PV,a);} + case ICMD_IADD: /* ..., val1, val2 ==> ..., val1 + val2 */ - case ICMD_IADD: var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); M_IADD(s1, s2, d, 0); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IADDCONST: + + case ICMD_IADDCONST: /* ..., value ==> ..., value + constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_IADD(s1, iptr->val.i, d, 1); + M_IADD(s1, iptr->val.i, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_IADD(s1, REG_ITMP2, d, 0); + M_IADD(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LADD: + + case ICMD_LADD: /* ..., val1, val2 ==> ..., val1 + val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); M_LADD(s1, s2, d, 0); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LADDCONST: + + case ICMD_LADDCONST: /* ..., value ==> ..., value + constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_LADD(s1, iptr->val.l, d, 1); + M_LADD(s1, iptr->val.l, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_LADD(s1, REG_ITMP2, d, 0); + M_LADD(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_ISUB: + case ICMD_ISUB: /* ..., val1, val2 ==> ..., val1 - val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_ISUB(s1, s2, d, 0); + M_ISUB(s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_ISUBCONST: + + case ICMD_ISUBCONST: /* ..., value ==> ..., value + constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_ISUB(s1, iptr->val.i, d, 1); + M_ISUB(s1, iptr->val.i, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_ISUB(s1, REG_ITMP2, d, 0); + M_ISUB(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LSUB: + + case ICMD_LSUB: /* ..., val1, val2 ==> ..., val1 - val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_LSUB(s1, s2, d, 0); + M_LSUB(s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LSUBCONST: + + case ICMD_LSUBCONST: /* ..., value ==> ..., value - constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_LSUB(s1, iptr->val.l, d, 1); + M_LSUB(s1, iptr->val.l, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_LSUB(s1, REG_ITMP2, d, 0); + M_LSUB(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IMUL: + case ICMD_IMUL: /* ..., val1, val2 ==> ..., val1 * val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_IMUL(s1, s2, d, 0); + M_IMUL(s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IMULCONST: + + case ICMD_IMULCONST: /* ..., value ==> ..., value * constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_IMUL(s1, iptr->val.i, d, 1); + M_IMUL(s1, iptr->val.i, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_IMUL(s1, REG_ITMP2, d, 0); + M_IMUL(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LMUL: + + case ICMD_LMUL: /* ..., val1, val2 ==> ..., val1 * val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_LMUL (s1, s2, d, 0); + M_LMUL (s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LMULCONST: + + case ICMD_LMULCONST: /* ..., value ==> ..., value * constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_LMUL(s1, iptr->val.l, d, 1); + M_LMUL(s1, iptr->val.l, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_LMUL(s1, REG_ITMP2, d, 0); + M_LMUL(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IDIVPOW2: - case ICMD_LDIVPOW2: + + case ICMD_IDIVPOW2: /* ..., value ==> ..., value << constant */ + case ICMD_LDIVPOW2: /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if (iptr->val.i <= 15) { M_LDA(REG_ITMP2, s1, (1 << iptr->val.i) -1); - M_CMOVGE(s1, s1, REG_ITMP2, 0); + M_CMOVGE(s1, s1, REG_ITMP2, REG); } else { - M_SRA(s1, 63, REG_ITMP2, 1); - M_SRL(REG_ITMP2, 64 - iptr->val.i, REG_ITMP2, 1); - M_LADD(s1, REG_ITMP2, REG_ITMP2, 0); + M_SRA(s1, 63, REG_ITMP2, CONST); + M_SRL(REG_ITMP2, 64 - iptr->val.i, REG_ITMP2, CONST); + M_LADD(s1, REG_ITMP2, REG_ITMP2, REG); } - M_SRA(REG_ITMP2, iptr->val.i, d, 1); + M_SRA(REG_ITMP2, iptr->val.i, d, CONST); store_reg_to_var_int(iptr->dst, d); break; - - case ICMD_ISHL: + case ICMD_ISHL: /* ..., val1, val2 ==> ..., val1 << val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_AND(s2, 0x1f, REG_ITMP3, 1); - M_SLL(s1, REG_ITMP3, d, 0); - M_IADD(d, REG_ZERO, d, 0); + M_AND(s2, 0x1f, REG_ITMP3, CONST); + M_SLL(s1, REG_ITMP3, d, REG); + M_IADD(d, REG_ZERO, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_ISHLCONST: + + case ICMD_ISHLCONST: /* ..., value ==> ..., value << constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_SLL(s1, iptr->val.i & 0x1f, d, 1); - M_IADD(d, REG_ZERO, d, 0); + M_SLL(s1, iptr->val.i & 0x1f, d, CONST); + M_IADD(d, REG_ZERO, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_ISHR: + case ICMD_ISHR: /* ..., val1, val2 ==> ..., val1 >> val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); @@ -925,351 +1025,425 @@ static void gen_mcode() M_SRA(s1, REG_ITMP3, d, 0); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_ISHRCONST: + + case ICMD_ISHRCONST: /* ..., value ==> ..., value >> constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_SRA(s1, iptr->val.i & 0x1f, d, 1); + M_SRA(s1, iptr->val.i & 0x1f, d, CONST); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IUSHR: + case ICMD_IUSHR: /* ..., val1, val2 ==> ..., val1 >>> val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_AND (s2, 0x1f, REG_ITMP2, 1); - M_ZAPNOT(s1, 0x0f, d, 1); - M_SRL ( d, REG_ITMP2, d, 0); - M_IADD ( d, REG_ZERO, d, 0); + M_AND (s2, 0x1f, REG_ITMP2, 1); + M_IZEXT(s1, d); + M_SRL ( d, REG_ITMP2, d, REG); + M_IADD ( d, REG_ZERO, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IUSHRCONST: + + case ICMD_IUSHRCONST: /* ..., value ==> ..., value >>> constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_ZAPNOT(s1, 0x0f, d, 1); - M_SRL(d, iptr->val.i & 0x1f, d, 1); - M_IADD(d, REG_ZERO, d, 0); + M_IZEXT(s1, d); + M_SRL(d, iptr->val.i & 0x1f, d, CONST); + M_IADD(d, REG_ZERO, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LSHL: + case ICMD_LSHL: /* ..., val1, val2 ==> ..., val1 << val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_SLL(s1, s2, d, 0); + M_SLL(s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LSHLCONST: + + case ICMD_LSHLCONST: /* ..., value ==> ..., value << constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_SLL(s1, iptr->val.l & 0x3f, d, 1); + M_SLL(s1, iptr->val.l & 0x3f, d, CONST); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LSHR: + case ICMD_LSHR: /* ..., val1, val2 ==> ..., val1 >> val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); M_SRA(s1, s2, d, 0); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LSHRCONST: + + case ICMD_LSHRCONST: /* ..., value ==> ..., value >> constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_SRA(s1, iptr->val.l & 0x3f, d, 1); + M_SRA(s1, iptr->val.l & 0x3f, d, CONST); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LUSHR: + case ICMD_LUSHR: /* ..., val1, val2 ==> ..., val1 >>> val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); M_SRL(s1, s2, d, 0); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LUSHRCONST: + + case ICMD_LUSHRCONST: /* ..., value ==> ..., value >>> constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_SRL(s1, iptr->val.l & 0x3f, d, 1); + M_SRL(s1, iptr->val.l & 0x3f, d, CONST); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IAND: + case ICMD_IAND: /* ..., val1, val2 ==> ..., val1 & val2 */ case ICMD_LAND: + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_AND(s1, s2, d, 0); + M_AND(s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IANDCONST: + + case ICMD_IANDCONST: /* ..., value ==> ..., value & constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_AND(s1, iptr->val.i, d, 1); + M_AND(s1, iptr->val.i, d, CONST); } else if (iptr->val.i == 0xffff) { - M_ZAPNOT(s1, 0x03, d, 1); + M_CZEXT(s1, d); } else if (iptr->val.i == 0xffffff) { - M_ZAPNOT(s1, 0x07, d, 1); + M_ZAPNOT(s1, 0x07, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_AND(s1, REG_ITMP2, d, 0); + M_AND(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IREMPOW2: + + case ICMD_IREMPOW2: /* ..., value ==> ..., value % constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); + if (s1 == d) { + M_MOV(s1, REG_ITMP1); + s1 = REG_ITMP1; + } if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_AND(s1, iptr->val.i, d, 1); + M_AND(s1, iptr->val.i, d, CONST); M_BGEZ(s1, 3); - M_ISUB(REG_ZERO, s1, d, 0); - M_AND(d, iptr->val.i, d, 1); + M_ISUB(REG_ZERO, s1, d, REG); + M_AND(d, iptr->val.i, d, CONST); } else if (iptr->val.i == 0xffff) { - M_ZAPNOT(s1, 0x03, d, 1); + M_CZEXT(s1, d); M_BGEZ(s1, 3); - M_ISUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x03, d, 1); + M_ISUB(REG_ZERO, s1, d, REG); + M_CZEXT(d, d); } else if (iptr->val.i == 0xffffff) { - M_ZAPNOT(s1, 0x07, d, 1); + M_ZAPNOT(s1, 0x07, d, CONST); M_BGEZ(s1, 3); - M_ISUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x07, d, 1); + M_ISUB(REG_ZERO, s1, d, REG); + M_ZAPNOT(d, 0x07, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_AND(s1, REG_ITMP2, d, 0); + M_AND(s1, REG_ITMP2, d, REG); M_BGEZ(s1, 3); - M_ISUB(REG_ZERO, s1, d, 0); - M_AND(d, REG_ITMP2, d, 0); + M_ISUB(REG_ZERO, s1, d, REG); + M_AND(d, REG_ITMP2, d, REG); } - M_ISUB(REG_ZERO, d, d, 0); + M_ISUB(REG_ZERO, d, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IREM0X10001: + + case ICMD_IREM0X10001: /* ..., value ==> ..., value % 0x100001 */ -/* i % 0x100001 - b = i & 0xffff; - a = i >> 16; +/* b = value & 0xffff; + a = value >> 16; a = ((b - a) & 0xffff) + (b < a); */ var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_ZAPNOT(s1, 0x03, REG_ITMP2, 1); - M_SRA(s1, 16, d, 1); - M_CMPLT(REG_ITMP2, d, REG_ITMP1, 0); - M_ISUB(REG_ITMP2, d, d, 0); - M_ZAPNOT(d, 0x03, d, 1); - M_IADD(d, REG_ITMP1, d, 0); - M_BGEZ(s1, 11); - M_ISUB(REG_ZERO, s1, REG_ITMP1, 0); - M_ZAPNOT(REG_ITMP1, 0x03, REG_ITMP2, 1); - M_SRA(REG_ITMP1, 16, d, 1); - M_CMPLT(REG_ITMP2, d, REG_ITMP1, 0); - M_ISUB(REG_ITMP2, d, d, 0); - M_ZAPNOT(d, 0x03, d, 1); - M_IADD(d, REG_ITMP1, d, 0); - M_ISUB(REG_ZERO, d, d, 0); - M_SLL(s1, 33, REG_ITMP2, 1); - M_CMPEQ(REG_ITMP2, REG_ZERO, REG_ITMP2, 0); - M_ISUB(d, REG_ITMP2, d, 0); - store_reg_to_var_int(iptr->dst, d); - break; - case ICMD_LANDCONST: + if (s1 == d) { + M_MOV(s1, REG_ITMP3); + s1 = REG_ITMP3; + } + M_BLTZ(s1, 7); + M_CZEXT(s1, REG_ITMP2); + M_SRA(s1, 16, d, CONST); + M_CMPLT(REG_ITMP2, d, REG_ITMP1, REG); + M_ISUB(REG_ITMP2, d, d, REG); + M_CZEXT(d, d); + M_IADD(d, REG_ITMP1, d, REG); + M_BR(11 + (s1 == REG_ITMP1)); + M_ISUB(REG_ZERO, s1, REG_ITMP1, REG); + M_CZEXT(REG_ITMP1, REG_ITMP2); + M_SRA(REG_ITMP1, 16, d, CONST); + M_CMPLT(REG_ITMP2, d, REG_ITMP1, REG); + M_ISUB(REG_ITMP2, d, d, REG); + M_CZEXT(d, d); + M_IADD(d, REG_ITMP1, d, REG); + M_ISUB(REG_ZERO, d, d, REG); + if (s1 == REG_ITMP1) { + var_to_reg_int(s1, src, REG_ITMP1); + } + M_SLL(s1, 33, REG_ITMP2, CONST); + M_CMPEQ(REG_ITMP2, REG_ZERO, REG_ITMP2, REG); + M_ISUB(d, REG_ITMP2, d, REG); + store_reg_to_var_int(iptr->dst, d); + break; + + case ICMD_LANDCONST: /* ..., value ==> ..., value & constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_AND(s1, iptr->val.l, d, 1); + M_AND(s1, iptr->val.l, d, CONST); } else if (iptr->val.l == 0xffffL) { - M_ZAPNOT(s1, 0x03, d, 1); + M_CZEXT(s1, d); } else if (iptr->val.l == 0xffffffL) { - M_ZAPNOT(s1, 0x07, d, 1); + M_ZAPNOT(s1, 0x07, d, CONST); } else if (iptr->val.l == 0xffffffffL) { - M_ZAPNOT(s1, 0x0f, d, 1); + M_IZEXT(s1, d); } else if (iptr->val.l == 0xffffffffffL) { - M_ZAPNOT(s1, 0x1f, d, 1); + M_ZAPNOT(s1, 0x1f, d, CONST); } else if (iptr->val.l == 0xffffffffffffL) { - M_ZAPNOT(s1, 0x3f, d, 1); + M_ZAPNOT(s1, 0x3f, d, CONST); } else if (iptr->val.l == 0xffffffffffffffL) { - M_ZAPNOT(s1, 0x7f, d, 1); + M_ZAPNOT(s1, 0x7f, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_AND(s1, REG_ITMP2, d, 0); + M_AND(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LREMPOW2: + + case ICMD_LREMPOW2: /* ..., value ==> ..., value % constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); + if (s1 == d) { + M_MOV(s1, REG_ITMP1); + s1 = REG_ITMP1; + } if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_AND(s1, iptr->val.l, d, 1); + M_AND(s1, iptr->val.l, d, CONST); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_AND(d, iptr->val.l, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_AND(d, iptr->val.l, d, CONST); } else if (iptr->val.l == 0xffffL) { - M_ZAPNOT(s1, 0x03, d, 1); + M_CZEXT(s1, d); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x03, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_CZEXT(d, d); } else if (iptr->val.l == 0xffffffL) { - M_ZAPNOT(s1, 0x07, d, 1); + M_ZAPNOT(s1, 0x07, d, CONST); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x07, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_ZAPNOT(d, 0x07, d, CONST); } else if (iptr->val.l == 0xffffffffL) { - M_ZAPNOT(s1, 0x0f, d, 1); + M_IZEXT(s1, d); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x0f, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_IZEXT(d, d); } else if (iptr->val.l == 0xffffffffffL) { - M_ZAPNOT(s1, 0x1f, d, 1); + M_ZAPNOT(s1, 0x1f, d, CONST); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x1f, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_ZAPNOT(d, 0x1f, d, CONST); } else if (iptr->val.l == 0xffffffffffffL) { - M_ZAPNOT(s1, 0x3f, d, 1); + M_ZAPNOT(s1, 0x3f, d, CONST); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x3f, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_ZAPNOT(d, 0x3f, d, CONST); } else if (iptr->val.l == 0xffffffffffffffL) { - M_ZAPNOT(s1, 0x7f, d, 1); + M_ZAPNOT(s1, 0x7f, d, CONST); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_ZAPNOT(d, 0x7f, d, 1); + M_LSUB(REG_ZERO, s1, d, REG); + M_ZAPNOT(d, 0x7f, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_AND(s1, REG_ITMP2, d, 0); + M_AND(s1, REG_ITMP2, d, REG); M_BGEZ(s1, 3); - M_LSUB(REG_ZERO, s1, d, 0); - M_AND(d, REG_ITMP2, d, 0); + M_LSUB(REG_ZERO, s1, d, REG); + M_AND(d, REG_ITMP2, d, REG); } - M_LSUB(REG_ZERO, d, d, 0); + M_LSUB(REG_ZERO, d, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LREM0X10001: + + case ICMD_LREM0X10001:/* ..., value ==> ..., value % 0x10001 */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); - M_ZAPNOT(s1, 0x03, REG_ITMP2, 1); - M_SRA(s1, 16, d, 1); - M_CMPLT(REG_ITMP2, d, REG_ITMP1, 0); - M_LSUB(REG_ITMP2, d, d, 0); - M_ZAPNOT(d, 0x03, d, 1); - M_LADD(d, REG_ITMP1, d, 0); + if (s1 == d) { + M_MOV(s1, REG_ITMP3); + s1 = REG_ITMP3; + } + M_CZEXT(s1, REG_ITMP2); + M_SRA(s1, 16, d, CONST); + M_CMPLT(REG_ITMP2, d, REG_ITMP1, REG); + M_LSUB(REG_ITMP2, d, d, REG); + M_CZEXT(d, d); + M_LADD(d, REG_ITMP1, d, REG); M_LDA(REG_ITMP2, REG_ZERO, -1); - M_SRL(REG_ITMP2, 33, REG_ITMP2, 1); - M_CMPULT(s1, REG_ITMP2, REG_ITMP2, 0); + M_SRL(REG_ITMP2, 33, REG_ITMP2, CONST); + if (s1 == REG_ITMP1) { + var_to_reg_int(s1, src, REG_ITMP1); + } + M_CMPULT(s1, REG_ITMP2, REG_ITMP2, REG); M_BNEZ(REG_ITMP2, 11); M_LDA(d, REG_ZERO, -257); - M_ZAPNOT(d, 0xcd, d, 1); - M_LSUB(REG_ZERO, s1, REG_ITMP2, 0); - M_CMOVGE(s1, s1, REG_ITMP2, 0); - M_UMULH(REG_ITMP2, d, REG_ITMP2, 0); - M_SRL(REG_ITMP2, 16, REG_ITMP2, 1); - M_LSUB(REG_ZERO, REG_ITMP2, d, 0); - M_CMOVGE(s1, REG_ITMP2, d, 0); - M_SLL(d, 16, REG_ITMP2, 1); - M_LADD(d, REG_ITMP2, d, 0); - M_LSUB(s1, d, d, 0); + M_ZAPNOT(d, 0xcd, d, CONST); + M_LSUB(REG_ZERO, s1, REG_ITMP2, REG); + M_CMOVGE(s1, s1, REG_ITMP2, REG); + M_UMULH(REG_ITMP2, d, REG_ITMP2, REG); + M_SRL(REG_ITMP2, 16, REG_ITMP2, CONST); + M_LSUB(REG_ZERO, REG_ITMP2, d, REG); + M_CMOVGE(s1, REG_ITMP2, d, REG); + M_SLL(d, 16, REG_ITMP2, CONST); + M_LADD(d, REG_ITMP2, d, REG); + M_LSUB(s1, d, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IOR: + case ICMD_IOR: /* ..., val1, val2 ==> ..., val1 | val2 */ case ICMD_LOR: + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_OR( s1,s2, d, 0); + M_OR( s1,s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IORCONST: + + case ICMD_IORCONST: /* ..., value ==> ..., value | constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_OR(s1, iptr->val.i, d, 1); + M_OR(s1, iptr->val.i, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_OR(s1, REG_ITMP2, d, 0); + M_OR(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LORCONST: + + case ICMD_LORCONST: /* ..., value ==> ..., value | constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_OR(s1, iptr->val.l, d, 1); + M_OR(s1, iptr->val.l, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_OR(s1, REG_ITMP2, d, 0); + M_OR(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IXOR: + case ICMD_IXOR: /* ..., val1, val2 ==> ..., val1 ^ val2 */ case ICMD_LXOR: + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_XOR(s1, s2, d, 0); + M_XOR(s1, s2, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IXORCONST: + + case ICMD_IXORCONST: /* ..., value ==> ..., value ^ constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_XOR(s1, iptr->val.i, d, 1); + M_XOR(s1, iptr->val.i, d, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_XOR(s1, REG_ITMP2, d, 0); + M_XOR(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LXORCONST: + + case ICMD_LXORCONST: /* ..., value ==> ..., value ^ constant */ + /* val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); if ((iptr->val.l >= 0) && (iptr->val.l <= 255)) { - M_XOR(s1, iptr->val.l, d, 1); + M_XOR(s1, iptr->val.l, d, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_XOR(s1, REG_ITMP2, d, 0); + M_XOR(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LCMP: + case ICMD_LCMP: /* ..., val1, val2 ==> ..., val1 cmp val2 */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); - M_CMPLT(s1, s2, REG_ITMP3, 0); - M_CMPLT(s2, s1, REG_ITMP1, 0); - M_LSUB (REG_ITMP1, REG_ITMP3, d, 0); + M_CMPLT(s1, s2, REG_ITMP3, REG); + M_CMPLT(s2, s1, REG_ITMP1, REG); + M_LSUB (REG_ITMP1, REG_ITMP3, d, REG); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IINC: + case ICMD_IINC: /* ..., value ==> ..., value + constant */ + /* op1 = variable, val.i = constant */ + var = &(locals[iptr->op1][TYPE_INT]); if (var->flags & INMEMORY) { s1 = REG_ITMP1; @@ -1278,14 +1452,14 @@ static void gen_mcode() else s1 = var->regoff; if ((iptr->val.i >= 0) && (iptr->val.i <= 255)) { - M_IADD(s1, iptr->val.i, s1, 1); + M_IADD(s1, iptr->val.i, s1, CONST); } else if ((iptr->val.i > -256) && (iptr->val.i < 0)) { - M_ISUB(s1, (-iptr->val.i), s1, 1); + M_ISUB(s1, (-iptr->val.i), s1, CONST); } else { M_LDA (s1, s1, iptr->val.i); - M_IADD(s1, REG_ZERO, s1, 0); + M_IADD(s1, REG_ZERO, s1, REG); } if (var->flags & INMEMORY) M_LST(s1, REG_SP, 8 * var->regoff); @@ -1294,20 +1468,24 @@ static void gen_mcode() /* floating operations ************************************************/ - case ICMD_FNEG: + case ICMD_FNEG: /* ..., value ==> ..., - value */ + var_to_reg_flt(s1, src, REG_FTMP1); d = reg_of_var(iptr->dst, REG_FTMP3); M_FMOVN(s1, d); store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DNEG: + + case ICMD_DNEG: /* ..., value ==> ..., - value */ + var_to_reg_flt(s1, src, REG_FTMP1); d = reg_of_var(iptr->dst, REG_FTMP3); M_FMOVN(s1, d); store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_FADD: + case ICMD_FADD: /* ..., val1, val2 ==> ..., val1 + val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1320,7 +1498,9 @@ static void gen_mcode() } store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DADD: + + case ICMD_DADD: /* ..., val1, val2 ==> ..., val1 + val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1334,7 +1514,8 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_FSUB: + case ICMD_FSUB: /* ..., val1, val2 ==> ..., val1 - val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1347,7 +1528,9 @@ static void gen_mcode() } store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DSUB: + + case ICMD_DSUB: /* ..., val1, val2 ==> ..., val1 - val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1361,7 +1544,8 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_FMUL: + case ICMD_FMUL: /* ..., val1, val2 ==> ..., val1 * val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1374,7 +1558,9 @@ static void gen_mcode() } store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DMUL: + + case ICMD_DMUL: /* ..., val1, val2 ==> ..., val1 *** val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1388,7 +1574,8 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_FDIV: + case ICMD_FDIV: /* ..., val1, val2 ==> ..., val1 / val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1401,7 +1588,9 @@ static void gen_mcode() } store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DDIV: + + case ICMD_DDIV: /* ..., val1, val2 ==> ..., val1 / val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1415,7 +1604,8 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_FREM: + case ICMD_FREM: /* ..., val1, val2 ==> ..., val1 % val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1439,7 +1629,9 @@ static void gen_mcode() } store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DREM: + + case ICMD_DREM: /* ..., val1, val2 ==> ..., val1 % val2 */ + var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1464,7 +1656,7 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_I2F: + case ICMD_I2F: /* ..., value ==> ..., (float) value */ case ICMD_L2F: var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1475,7 +1667,7 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_I2D: + case ICMD_I2D: /* ..., value ==> ..., (double) value */ case ICMD_L2D: var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_FTMP3); @@ -1486,7 +1678,7 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_F2I: + case ICMD_F2I: /* ..., value ==> ..., (int) value */ case ICMD_D2I: var_to_reg_flt(s1, src, REG_FTMP1); d = reg_of_var(iptr->dst, REG_ITMP3); @@ -1506,7 +1698,7 @@ static void gen_mcode() store_reg_to_var_int(iptr->dst, d); break; - case ICMD_F2L: + case ICMD_F2L: /* ..., value ==> ..., (long) value */ case ICMD_D2L: var_to_reg_flt(s1, src, REG_FTMP1); d = reg_of_var(iptr->dst, REG_ITMP3); @@ -1523,14 +1715,16 @@ static void gen_mcode() store_reg_to_var_int(iptr->dst, d); break; - case ICMD_F2D: + case ICMD_F2D: /* ..., value ==> ..., (double) value */ + var_to_reg_flt(s1, src, REG_FTMP1); d = reg_of_var(iptr->dst, REG_FTMP3); M_FLTMOVE(s1, d); store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_D2F: + case ICMD_D2F: /* ..., value ==> ..., (double) value */ + var_to_reg_flt(s1, src, REG_FTMP1); d = reg_of_var(iptr->dst, REG_FTMP3); if (checkfloats) { @@ -1543,58 +1737,58 @@ static void gen_mcode() store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_FCMPL: + case ICMD_FCMPL: /* ..., val1, val2 ==> ..., val1 fcmpl val2 */ case ICMD_DCMPL: var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_ITMP3); if (checkfloats) { - M_LSUB (REG_ZERO, 1, d, 1); + M_LSUB (REG_ZERO, 1, d, CONST); M_FCMPEQS(s1, s2, REG_FTMP3); M_TRAPB; - M_FBEQZ (REG_FTMP3, 1); /* jump over next instructions */ - M_OR (REG_ZERO, REG_ZERO, d, 0); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instructions */ + M_CLR (d); M_FCMPLTS(s2, s1, REG_FTMP3); M_TRAPB; - M_FBEQZ (REG_FTMP3, 1); /* jump over next instruction */ - M_LADD (REG_ZERO, 1, d, 1); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instruction */ + M_LADD (REG_ZERO, 1, d, CONST); } else { - M_LSUB (REG_ZERO, 1, d, 1); + M_LSUB (REG_ZERO, 1, d, CONST); M_FCMPEQ(s1, s2, REG_FTMP3); - M_FBEQZ (REG_FTMP3, 1); /* jump over next instructions */ - M_OR (REG_ZERO, REG_ZERO, d, 0); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instructions */ + M_CLR (d); M_FCMPLT(s2, s1, REG_FTMP3); - M_FBEQZ (REG_FTMP3, 1); /* jump over next instruction */ - M_LADD (REG_ZERO, 1, d, 1); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instruction */ + M_LADD (REG_ZERO, 1, d, CONST); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_FCMPG: + case ICMD_FCMPG: /* ..., val1, val2 ==> ..., val1 fcmpg val2 */ case ICMD_DCMPG: var_to_reg_flt(s1, src->prev, REG_FTMP1); var_to_reg_flt(s2, src, REG_FTMP2); d = reg_of_var(iptr->dst, REG_ITMP3); if (checkfloats) { - M_LADD (REG_ZERO, 1, d, 1); + M_LADD (REG_ZERO, 1, d, CONST); M_FCMPEQS(s1, s2, REG_FTMP3); M_TRAPB; - M_FBEQZ (REG_FTMP3, 1); /* jump over next instruction */ - M_OR (REG_ZERO, REG_ZERO, d, 0); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instruction */ + M_CLR (d); M_FCMPLTS(s1, s2, REG_FTMP3); M_TRAPB; - M_FBEQZ (REG_FTMP3, 1); /* jump over next instruction */ - M_LSUB (REG_ZERO, 1, d, 1); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instruction */ + M_LSUB (REG_ZERO, 1, d, CONST); } else { - M_LADD (REG_ZERO, 1, d, 1); + M_LADD (REG_ZERO, 1, d, CONST); M_FCMPEQ(s1, s2, REG_FTMP3); - M_FBEQZ (REG_FTMP3, 1); /* jump over next instruction */ - M_OR (REG_ZERO, REG_ZERO, d, 0); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instruction */ + M_CLR (d); M_FCMPLT(s1, s2, REG_FTMP3); - M_FBEQZ (REG_FTMP3, 1); /* jump over next instruction */ - M_LSUB (REG_ZERO, 1, d, 1); + M_FBEQZ (REG_FTMP3, CONST); /* jump over next instruction */ + M_LSUB (REG_ZERO, 1, d, CONST); } store_reg_to_var_int(iptr->dst, d); break; @@ -1604,13 +1798,14 @@ static void gen_mcode() #define gen_bound_check \ if (checkbounds) {\ - M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));\ - M_CMPULT(s2, REG_ITMP3, REG_ITMP3, 0);\ - M_BEQZ(REG_ITMP3, 0);\ - mcode_addxboundrefs(mcodeptr);\ - } + M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));\ + M_CMPULT(s2, REG_ITMP3, REG_ITMP3, REG);\ + M_BEQZ(REG_ITMP3, REG);\ + mcode_addxboundrefs(mcodeptr);\ + } + + case ICMD_ARRAYLENGTH: /* ..., arrayref ==> ..., length */ - case ICMD_ARRAYLENGTH: var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); @@ -1618,278 +1813,320 @@ static void gen_mcode() store_reg_to_var_int(iptr->dst, d); break; - case ICMD_AALOAD: + case ICMD_AALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); gen_bound_check; - M_S8ADDQ(s2, s1, REG_ITMP1, 0); - M_LLD( d, REG_ITMP1, OFFSET(java_objectarray, data[0])); + M_SAADDQ(s2, s1, REG_ITMP1, REG); + M_ALD( d, REG_ITMP1, OFFSET(java_objectarray, data[0])); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_LALOAD: + + case ICMD_LALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); gen_bound_check; - M_S8ADDQ(s2, s1, REG_ITMP1, 0); + M_S8ADDQ(s2, s1, REG_ITMP1, REG); M_LLD(d, REG_ITMP1, OFFSET(java_longarray, data[0])); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IALOAD: + + case ICMD_IALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); gen_bound_check; - M_S4ADDQ(s2, s1, REG_ITMP1, 0); + M_S4ADDQ(s2, s1, REG_ITMP1, REG); M_ILD(d, REG_ITMP1, OFFSET(java_intarray, data[0])); store_reg_to_var_int(iptr->dst, d); break; - case ICMD_FALOAD: + + case ICMD_FALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_FTMP3); gen_nullptr_check(s1); gen_bound_check; - M_S4ADDQ(s2, s1, REG_ITMP1, 0); + M_S4ADDQ(s2, s1, REG_ITMP1, REG); M_FLD(d, REG_ITMP1, OFFSET(java_floatarray, data[0])); store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_DALOAD: + + case ICMD_DALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_FTMP3); gen_nullptr_check(s1); gen_bound_check; - M_S8ADDQ(s2, s1, REG_ITMP1, 0); + M_S8ADDQ(s2, s1, REG_ITMP1, REG); M_DLD(d, REG_ITMP1, OFFSET(java_doublearray, data[0])); store_reg_to_var_flt(iptr->dst, d); break; - case ICMD_CALOAD: + + case ICMD_CALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); gen_bound_check; if (has_ext_instr_set) { - M_LADD(s2, s1, REG_ITMP1, 0); - M_LADD(s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD(s2, s1, REG_ITMP1, REG); + M_LADD(s2, REG_ITMP1, REG_ITMP1, REG); M_SLDU(d, REG_ITMP1, OFFSET(java_chararray, data[0])); } else { M_LADD (s2, s1, REG_ITMP1, 0); - M_LADD (s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD (s2, REG_ITMP1, REG_ITMP1, REG); M_LLD_U(REG_ITMP2, REG_ITMP1, OFFSET(java_chararray, data[0])); M_LDA (REG_ITMP1, REG_ITMP1, OFFSET(java_chararray, data[0])); - M_EXTWL(REG_ITMP2, REG_ITMP1, d, 0); + M_EXTWL(REG_ITMP2, REG_ITMP1, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_SALOAD: + + case ICMD_SALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); gen_bound_check; if (has_ext_instr_set) { - M_LADD(s2, s1, REG_ITMP1, 0); - M_LADD(s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD(s2, s1, REG_ITMP1, REG); + M_LADD(s2, REG_ITMP1, REG_ITMP1, REG); M_SLDU( d, REG_ITMP1, OFFSET (java_shortarray, data[0])); M_SSEXT(d, d); } else { M_LADD(s2, s1, REG_ITMP1, 0); - M_LADD(s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD(s2, REG_ITMP1, REG_ITMP1, REG); M_LLD_U(REG_ITMP2, REG_ITMP1, OFFSET(java_shortarray, data[0])); M_LDA(REG_ITMP1, REG_ITMP1, OFFSET(java_shortarray, data[0])+2); - M_EXTQH(REG_ITMP2, REG_ITMP1, d, 0); - M_SRA(d, 48, d, 1); + M_EXTQH(REG_ITMP2, REG_ITMP1, d, REG); + M_SRA(d, 48, d, CONST); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_BALOAD: + + case ICMD_BALOAD: /* ..., arrayref, index ==> ..., value */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); gen_bound_check; if (has_ext_instr_set) { - M_LADD (s2, s1, REG_ITMP1, 0); + M_LADD (s2, s1, REG_ITMP1, REG); M_BLDU (d, REG_ITMP1, OFFSET (java_shortarray, data[0])); M_BSEXT (d, d); } else { - M_LADD(s2, s1, REG_ITMP1, 0); + M_LADD(s2, s1, REG_ITMP1, REG); M_LLD_U(REG_ITMP2, REG_ITMP1, OFFSET(java_bytearray, data[0])); M_LDA(REG_ITMP1, REG_ITMP1, OFFSET(java_bytearray, data[0])+1); - M_EXTQH(REG_ITMP2, REG_ITMP1, d, 0); - M_SRA(d, 56, d, 1); + M_EXTQH(REG_ITMP2, REG_ITMP1, d, REG); + M_SRA(d, 56, d, CONST); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_AASTORE: + + case ICMD_AASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_int(s3, src, REG_ITMP3); - M_S8ADDQ(s2, s1, REG_ITMP1, 0); - M_LST (s3, REG_ITMP1, OFFSET(java_objectarray, data[0])); + M_SAADDQ(s2, s1, REG_ITMP1, REG); + M_AST (s3, REG_ITMP1, OFFSET(java_objectarray, data[0])); break; - case ICMD_LASTORE: + + case ICMD_LASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_int(s3, src, REG_ITMP3); - M_S8ADDQ(s2, s1, REG_ITMP1, 0); + M_S8ADDQ(s2, s1, REG_ITMP1, REG); M_LST (s3, REG_ITMP1, OFFSET(java_longarray, data[0])); break; - case ICMD_IASTORE: + + case ICMD_IASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_int(s3, src, REG_ITMP3); - M_S4ADDQ(s2, s1, REG_ITMP1, 0); + M_S4ADDQ(s2, s1, REG_ITMP1, REG); M_IST (s3, REG_ITMP1, OFFSET(java_intarray, data[0])); break; - case ICMD_FASTORE: + + case ICMD_FASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_flt(s3, src, REG_FTMP3); - M_S4ADDQ(s2, s1, REG_ITMP1, 0); + M_S4ADDQ(s2, s1, REG_ITMP1, REG); M_FST (s3, REG_ITMP1, OFFSET(java_floatarray, data[0])); break; - case ICMD_DASTORE: + + case ICMD_DASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_flt(s3, src, REG_FTMP3); - M_S8ADDQ(s2, s1, REG_ITMP1, 0); + M_S8ADDQ(s2, s1, REG_ITMP1, REG); M_DST (s3, REG_ITMP1, OFFSET(java_doublearray, data[0])); break; - case ICMD_CASTORE: + + case ICMD_CASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_int(s3, src, REG_ITMP3); if (has_ext_instr_set) { - M_LADD(s2, s1, REG_ITMP1, 0); - M_LADD(s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD(s2, s1, REG_ITMP1, REG); + M_LADD(s2, REG_ITMP1, REG_ITMP1, REG); M_SST (s3, REG_ITMP1, OFFSET(java_chararray, data[0])); } else { - M_LADD (s2, s1, REG_ITMP1, 0); - M_LADD (s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD (s2, s1, REG_ITMP1, REG); + M_LADD (s2, REG_ITMP1, REG_ITMP1, REG); M_LLD_U(REG_ITMP2, REG_ITMP1, OFFSET(java_chararray, data[0])); M_LDA (REG_ITMP1, REG_ITMP1, OFFSET(java_chararray, data[0])); - M_INSWL(s3, REG_ITMP1, REG_ITMP3, 0); - M_MSKWL(REG_ITMP2, REG_ITMP1, REG_ITMP2, 0); - M_OR (REG_ITMP2, REG_ITMP3, REG_ITMP2, 0); - M_LST_U(REG_ITMP2, REG_ITMP1, 0); + M_INSWL(s3, REG_ITMP1, REG_ITMP3, REG); + M_MSKWL(REG_ITMP2, REG_ITMP1, REG_ITMP2, REG); + M_OR (REG_ITMP2, REG_ITMP3, REG_ITMP2, REG); + M_LST_U(REG_ITMP2, REG_ITMP1, REG); } break; - case ICMD_SASTORE: + + case ICMD_SASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_int(s3, src, REG_ITMP3); if (has_ext_instr_set) { - M_LADD(s2, s1, REG_ITMP1, 0); - M_LADD(s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD(s2, s1, REG_ITMP1, REG); + M_LADD(s2, REG_ITMP1, REG_ITMP1, REG); M_SST (s3, REG_ITMP1, OFFSET(java_shortarray, data[0])); } else { - M_LADD (s2, s1, REG_ITMP1, 0); - M_LADD (s2, REG_ITMP1, REG_ITMP1, 0); + M_LADD (s2, s1, REG_ITMP1, REG); + M_LADD (s2, REG_ITMP1, REG_ITMP1, REG); M_LLD_U(REG_ITMP2, REG_ITMP1, OFFSET(java_shortarray, data[0])); M_LDA (REG_ITMP1, REG_ITMP1, OFFSET(java_shortarray, data[0])); - M_INSWL(s3, REG_ITMP1, REG_ITMP3, 0); - M_MSKWL(REG_ITMP2, REG_ITMP1, REG_ITMP2, 0); - M_OR (REG_ITMP2, REG_ITMP3, REG_ITMP2, 0); - M_LST_U(REG_ITMP2, REG_ITMP1, 0); + M_INSWL(s3, REG_ITMP1, REG_ITMP3, REG); + M_MSKWL(REG_ITMP2, REG_ITMP1, REG_ITMP2, REG); + M_OR (REG_ITMP2, REG_ITMP3, REG_ITMP2, REG); + M_LST_U(REG_ITMP2, REG_ITMP1, REG); } break; - case ICMD_BASTORE: + + case ICMD_BASTORE: /* ..., arrayref, index, value ==> ... */ + var_to_reg_int(s1, src->prev->prev, REG_ITMP1); var_to_reg_int(s2, src->prev, REG_ITMP2); gen_nullptr_check(s1); gen_bound_check; var_to_reg_int(s3, src, REG_ITMP3); if (has_ext_instr_set) { - M_LADD(s2, s1, REG_ITMP1, 0); + M_LADD(s2, s1, REG_ITMP1, REG); M_BST (s3, REG_ITMP1, OFFSET(java_bytearray, data[0])); } else { M_LADD (s2, s1, REG_ITMP1, 0); M_LLD_U(REG_ITMP2, REG_ITMP1, OFFSET(java_bytearray, data[0])); M_LDA (REG_ITMP1, REG_ITMP1, OFFSET(java_bytearray, data[0])); - M_INSBL(s3, REG_ITMP1, REG_ITMP3, 0); - M_MSKBL(REG_ITMP2, REG_ITMP1, REG_ITMP2, 0); - M_OR (REG_ITMP2, REG_ITMP3, REG_ITMP2, 0); - M_LST_U(REG_ITMP2, REG_ITMP1, 0); + M_INSBL(s3, REG_ITMP1, REG_ITMP3, REG); + M_MSKBL(REG_ITMP2, REG_ITMP1, REG_ITMP2, REG); + M_OR (REG_ITMP2, REG_ITMP3, REG_ITMP2, REG); + M_LST_U(REG_ITMP2, REG_ITMP1, REG); } break; - case ICMD_PUTSTATIC: + case ICMD_PUTSTATIC: /* ..., value ==> ... */ + /* op1 = type, val.a = field address */ + a = dseg_addaddress (&(((fieldinfo *)(iptr->val.a))->value)); - M_LLD(REG_ITMP1, REG_PV, a); + M_ALD(REG_ITMP1, REG_PV, a); switch (iptr->op1) { case TYPE_INT: var_to_reg_int(s2, src, REG_ITMP2); - M_IST(s2, REG_ITMP1, 0); + M_IST(s2, REG_ITMP1, REG); break; case TYPE_LNG: + var_to_reg_int(s2, src, REG_ITMP2); + M_LST(s2, REG_ITMP1, REG); + break; case TYPE_ADR: var_to_reg_int(s2, src, REG_ITMP2); - M_LST(s2, REG_ITMP1, 0); + M_AST(s2, REG_ITMP1, REG); break; case TYPE_FLT: var_to_reg_flt(s2, src, REG_FTMP2); - M_FST(s2, REG_ITMP1, 0); + M_FST(s2, REG_ITMP1, REG); break; case TYPE_DBL: var_to_reg_flt(s2, src, REG_FTMP2); - M_DST(s2, REG_ITMP1, 0); + M_DST(s2, REG_ITMP1, REG); break; default: panic ("internal error"); } break; - case ICMD_GETSTATIC: + case ICMD_GETSTATIC: /* ... ==> ..., value */ + /* op1 = type, val.a = field address */ + a = dseg_addaddress (&(((fieldinfo *)(iptr->val.a))->value)); - M_LLD(REG_ITMP1, REG_PV, a); + M_ALD(REG_ITMP1, REG_PV, a); switch (iptr->op1) { case TYPE_INT: d = reg_of_var(iptr->dst, REG_ITMP3); - M_ILD(d, REG_ITMP1, 0); + M_ILD(d, REG_ITMP1, REG); store_reg_to_var_int(iptr->dst, d); break; case TYPE_LNG: + d = reg_of_var(iptr->dst, REG_ITMP3); + M_LLD(d, REG_ITMP1, REG); + store_reg_to_var_int(iptr->dst, d); + break; case TYPE_ADR: d = reg_of_var(iptr->dst, REG_ITMP3); - M_LLD(d, REG_ITMP1, 0); + M_ALD(d, REG_ITMP1, REG); store_reg_to_var_int(iptr->dst, d); break; case TYPE_FLT: d = reg_of_var(iptr->dst, REG_FTMP1); - M_FLD(d, REG_ITMP1, 0); + M_FLD(d, REG_ITMP1, REG); store_reg_to_var_flt(iptr->dst, d); break; case TYPE_DBL: d = reg_of_var(iptr->dst, REG_FTMP1); - M_DLD(d, REG_ITMP1, 0); + M_DLD(d, REG_ITMP1, REG); store_reg_to_var_flt(iptr->dst, d); break; default: panic ("internal error"); @@ -1897,7 +2134,9 @@ static void gen_mcode() break; - case ICMD_PUTFIELD: + case ICMD_PUTFIELD: /* ..., value ==> ... */ + /* op1 = type, val.i = field offset */ + a = ((fieldinfo *)(iptr->val.a))->offset; switch (iptr->op1) { case TYPE_INT: @@ -1907,12 +2146,17 @@ static void gen_mcode() M_IST(s2, s1, a); break; case TYPE_LNG: - case TYPE_ADR: var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); gen_nullptr_check(s1); M_LST(s2, s1, a); break; + case TYPE_ADR: + var_to_reg_int(s1, src->prev, REG_ITMP1); + var_to_reg_int(s2, src, REG_ITMP2); + gen_nullptr_check(s1); + M_AST(s2, s1, a); + break; case TYPE_FLT: var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_flt(s2, src, REG_FTMP2); @@ -1929,7 +2173,9 @@ static void gen_mcode() } break; - case ICMD_GETFIELD: + case ICMD_GETFIELD: /* ... ==> ..., value */ + /* op1 = type, val.i = field offset */ + a = ((fieldinfo *)(iptr->val.a))->offset; switch (iptr->op1) { case TYPE_INT: @@ -1940,13 +2186,19 @@ static void gen_mcode() store_reg_to_var_int(iptr->dst, d); break; case TYPE_LNG: - case TYPE_ADR: var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); gen_nullptr_check(s1); M_LLD(d, s1, a); store_reg_to_var_int(iptr->dst, d); break; + case TYPE_ADR: + var_to_reg_int(s1, src, REG_ITMP1); + d = reg_of_var(iptr->dst, REG_ITMP3); + gen_nullptr_check(s1); + M_ALD(d, s1, a); + store_reg_to_var_int(iptr->dst, d); + break; case TYPE_FLT: var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_FTMP1); @@ -1970,30 +2222,36 @@ static void gen_mcode() #define ALIGNCODENOP {if((int)((long)mcodeptr&7)){M_NOP;}} - case ICMD_ATHROW: + case ICMD_ATHROW: /* ..., objectref ==> ... (, objectref) */ + var_to_reg_int(s1, src, REG_ITMP1); M_INTMOVE(s1, REG_ITMP1_XPTR); a = dseg_addaddress(asm_handle_exception); - M_LLD(REG_ITMP2, REG_PV, a); + M_ALD(REG_ITMP2, REG_PV, a); M_JMP(REG_ITMP2_XPC, REG_ITMP2); ALIGNCODENOP; break; - case ICMD_GOTO: + case ICMD_GOTO: /* ... ==> ... */ + /* op1 = target JavaVM pc */ M_BR(0); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); ALIGNCODENOP; break; - case ICMD_JSR: - M_BSR(REG_ITMP1, 0); + case ICMD_JSR: /* ... ==> ... */ + /* op1 = target JavaVM pc */ + + M_BSR(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_RET: + case ICMD_RET: /* ... ==> ... */ + /* op1 = local variable */ + var = &(locals[iptr->op1][TYPE_ADR]); if (var->flags & INMEMORY) { - M_LLD(REG_ITMP1, REG_SP, 8 * var->regoff); + M_ALD(REG_ITMP1, REG_SP, 8 * var->regoff); M_RET(REG_ZERO, REG_ITMP1); } else @@ -2001,277 +2259,332 @@ static void gen_mcode() ALIGNCODENOP; break; - case ICMD_IFNULL: + case ICMD_IFNULL: /* ..., value ==> ... */ + /* op1 = target JavaVM pc */ + var_to_reg_int(s1, src, REG_ITMP1); - M_BEQZ(s1, 0); + M_BEQZ(s1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFNONNULL: + + case ICMD_IFNONNULL: /* ..., value ==> ... */ + /* op1 = target JavaVM pc */ + var_to_reg_int(s1, src, REG_ITMP1); - M_BNEZ(s1, 0); + M_BNEZ(s1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFEQ: + case ICMD_IFEQ: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.i == 0) { - M_BEQZ(s1, 0); + M_BEQZ(s1, REG); } else { if ((iptr->val.i > 0) && (iptr->val.i <= 255)) { - M_CMPEQ(s1, iptr->val.i, REG_ITMP1, 1); + M_CMPEQ(s1, iptr->val.i, REG_ITMP1, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFLT: + + case ICMD_IFLT: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.i == 0) { - M_BLTZ(s1, 0); + M_BLTZ(s1, REG); } else { if ((iptr->val.i > 0) && (iptr->val.i <= 255)) { - M_CMPLT(s1, iptr->val.i, REG_ITMP1, 1); + M_CMPLT(s1, iptr->val.i, REG_ITMP1, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_CMPLT(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLT(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFLE: + + case ICMD_IFLE: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.i == 0) { - M_BLEZ(s1, 0); + M_BLEZ(s1, REG); } else { if ((iptr->val.i > 0) && (iptr->val.i <= 255)) { - M_CMPLE(s1, iptr->val.i, REG_ITMP1, 1); + M_CMPLE(s1, iptr->val.i, REG_ITMP1, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_CMPLE(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLE(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFNE: + + case ICMD_IFNE: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.i == 0) { - M_BNEZ(s1, 0); + M_BNEZ(s1, REG); } else { if ((iptr->val.i > 0) && (iptr->val.i <= 255)) { - M_CMPEQ(s1, iptr->val.i, REG_ITMP1, 1); + M_CMPEQ(s1, iptr->val.i, REG_ITMP1, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFGT: + + case ICMD_IFGT: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.i == 0) { - M_BGTZ(s1, 0); + M_BGTZ(s1, REG); } else { if ((iptr->val.i > 0) && (iptr->val.i <= 255)) { - M_CMPLE(s1, iptr->val.i, REG_ITMP1, 1); + M_CMPLE(s1, iptr->val.i, REG_ITMP1, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_CMPLE(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLE(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IFGE: + + case ICMD_IFGE: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.i == 0) { - M_BGEZ(s1, 0); + M_BGEZ(s1, REG); } else { if ((iptr->val.i > 0) && (iptr->val.i <= 255)) { - M_CMPLT(s1, iptr->val.i, REG_ITMP1, 1); + M_CMPLT(s1, iptr->val.i, REG_ITMP1, CONST); } else { ICONST(REG_ITMP2, iptr->val.i); - M_CMPLT(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLT(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_LEQ: + case ICMD_IF_LEQ: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.l == 0) { - M_BEQZ(s1, 0); + M_BEQZ(s1, REG); } else { if ((iptr->val.l > 0) && (iptr->val.l <= 255)) { - M_CMPEQ(s1, iptr->val.l, REG_ITMP1, 1); + M_CMPEQ(s1, iptr->val.l, REG_ITMP1, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_LLT: + + case ICMD_IF_LLT: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.l == 0) { - M_BLTZ(s1, 0); + M_BLTZ(s1, REG); } else { if ((iptr->val.l > 0) && (iptr->val.l <= 255)) { - M_CMPLT(s1, iptr->val.l, REG_ITMP1, 1); + M_CMPLT(s1, iptr->val.l, REG_ITMP1, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_CMPLT(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLT(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_LLE: + + case ICMD_IF_LLE: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.l == 0) { - M_BLEZ(s1, 0); + M_BLEZ(s1, REG); } else { if ((iptr->val.l > 0) && (iptr->val.l <= 255)) { - M_CMPLE(s1, iptr->val.l, REG_ITMP1, 1); + M_CMPLE(s1, iptr->val.l, REG_ITMP1, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_CMPLE(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLE(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_LNE: + + case ICMD_IF_LNE: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.l == 0) { - M_BNEZ(s1, 0); + M_BNEZ(s1, REG); } else { if ((iptr->val.l > 0) && (iptr->val.l <= 255)) { - M_CMPEQ(s1, iptr->val.l, REG_ITMP1, 1); + M_CMPEQ(s1, iptr->val.l, REG_ITMP1, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPEQ(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_LGT: + + case ICMD_IF_LGT: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.l == 0) { - M_BGTZ(s1, 0); + M_BGTZ(s1, REG); } else { if ((iptr->val.l > 0) && (iptr->val.l <= 255)) { - M_CMPLE(s1, iptr->val.l, REG_ITMP1, 1); + M_CMPLE(s1, iptr->val.l, REG_ITMP1, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_CMPLE(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLE(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_LGE: + + case ICMD_IF_LGE: /* ..., value ==> ... */ + /* op1 = target JavaVM pc, val.l = constant */ + var_to_reg_int(s1, src, REG_ITMP1); if (iptr->val.l == 0) { - M_BGEZ(s1, 0); + M_BGEZ(s1, REG); } else { if ((iptr->val.l > 0) && (iptr->val.l <= 255)) { - M_CMPLT(s1, iptr->val.l, REG_ITMP1, 1); + M_CMPLT(s1, iptr->val.l, REG_ITMP1, CONST); } else { LCONST(REG_ITMP2, iptr->val.l); - M_CMPLT(s1, REG_ITMP2, REG_ITMP1, 0); + M_CMPLT(s1, REG_ITMP2, REG_ITMP1, REG); } - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); } mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_ICMPEQ: - case ICMD_IF_LCMPEQ: + case ICMD_IF_ICMPEQ: /* ..., value, value ==> ... */ + case ICMD_IF_LCMPEQ: /* op1 = target JavaVM pc */ case ICMD_IF_ACMPEQ: + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); - M_CMPEQ(s1, s2, REG_ITMP1, 0); - M_BNEZ(REG_ITMP1, 0); + M_CMPEQ(s1, s2, REG_ITMP1, REG); + M_BNEZ(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_ICMPNE: - case ICMD_IF_LCMPNE: + + case ICMD_IF_ICMPNE: /* ..., value, value ==> ... */ + case ICMD_IF_LCMPNE: /* op1 = target JavaVM pc */ case ICMD_IF_ACMPNE: + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); - M_CMPEQ(s1, s2, REG_ITMP1, 0); - M_BEQZ(REG_ITMP1, 0); + M_CMPEQ(s1, s2, REG_ITMP1, REG); + M_BEQZ(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_ICMPLT: - case ICMD_IF_LCMPLT: + + case ICMD_IF_ICMPLT: /* ..., value, value ==> ... */ + case ICMD_IF_LCMPLT: /* op1 = target JavaVM pc */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); - M_CMPLT(s1, s2, REG_ITMP1, 0); - M_BNEZ(REG_ITMP1, 0); + M_CMPLT(s1, s2, REG_ITMP1, REG); + M_BNEZ(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_ICMPGT: - case ICMD_IF_LCMPGT: + + case ICMD_IF_ICMPGT: /* ..., value, value ==> ... */ + case ICMD_IF_LCMPGT: /* op1 = target JavaVM pc */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); - M_CMPLE(s1, s2, REG_ITMP1, 0); - M_BEQZ(REG_ITMP1, 0); + M_CMPLE(s1, s2, REG_ITMP1, REG); + M_BEQZ(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_ICMPLE: - case ICMD_IF_LCMPLE: + + case ICMD_IF_ICMPLE: /* ..., value, value ==> ... */ + case ICMD_IF_LCMPLE: /* op1 = target JavaVM pc */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); - M_CMPLE(s1, s2, REG_ITMP1, 0); - M_BNEZ(REG_ITMP1, 0); + M_CMPLE(s1, s2, REG_ITMP1, REG); + M_BNEZ(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_IF_ICMPGE: - case ICMD_IF_LCMPGE: + + case ICMD_IF_ICMPGE: /* ..., value, value ==> ... */ + case ICMD_IF_LCMPGE: /* op1 = target JavaVM pc */ + var_to_reg_int(s1, src->prev, REG_ITMP1); var_to_reg_int(s2, src, REG_ITMP2); M_CMPLT(s1, s2, REG_ITMP1, 0); - M_BEQZ(REG_ITMP1, 0); + M_BEQZ(REG_ITMP1, REG); mcode_addreference(BlockPtrOfPC(iptr->op1), mcodeptr); break; - case ICMD_ELSE_ICONST: + /* (value xx 0) ? IFxx_ICONST : ELSE_ICONST */ + + case ICMD_ELSE_ICONST: /* handled by IFxx_ICONST */ break; - case ICMD_IFEQ_ICONST: + + case ICMD_IFEQ_ICONST: /* ..., value ==> ..., constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); a = iptr->val.i; @@ -2283,26 +2596,29 @@ static void gen_mcode() } if ((a == 0) && (iptr[1].val.i == 1)) { M_CMPEQ(s1, REG_ZERO, d, 0); - M_XOR(d, 1, d, 1); + M_XOR(d, 1, d, CONST); store_reg_to_var_int(iptr->dst, d); break; } if (s1 == d) { - M_OR(s1, s1 , REG_ITMP1, 0); + M_MOV(s1, REG_ITMP1); s1 = REG_ITMP1; } ICONST(d, iptr[1].val.i); } if ((a >= 0) && (a <= 255)) { - M_CMOVEQ(s1, a, d, 1); + M_CMOVEQ(s1, a, d, CONST); } else { ICONST(REG_ITMP2, a); - M_CMOVEQ(s1, REG_ITMP2, d, 0); + M_CMOVEQ(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IFNE_ICONST: + + case ICMD_IFNE_ICONST: /* ..., value ==> ..., constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); a = iptr->val.i; @@ -2314,26 +2630,29 @@ static void gen_mcode() } if ((a == 1) && (iptr[1].val.i == 0)) { M_CMPEQ(s1, REG_ZERO, d, 0); - M_XOR(d, 1, d, 1); + M_XOR(d, 1, d, CONST); store_reg_to_var_int(iptr->dst, d); break; } if (s1 == d) { - M_OR(s1, s1 , REG_ITMP1, 0); + M_MOV(s1, REG_ITMP1); s1 = REG_ITMP1; } ICONST(d, iptr[1].val.i); } if ((a >= 0) && (a <= 255)) { - M_CMOVNE(s1, a, d, 1); + M_CMOVNE(s1, a, d, CONST); } else { ICONST(REG_ITMP2, a); - M_CMOVNE(s1, REG_ITMP2, d, 0); + M_CMOVNE(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IFLT_ICONST: + + case ICMD_IFLT_ICONST: /* ..., value ==> ..., constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); a = iptr->val.i; @@ -2349,21 +2668,24 @@ static void gen_mcode() break; } if (s1 == d) { - M_OR(s1, s1 , REG_ITMP1, 0); + M_MOV(s1, REG_ITMP1); s1 = REG_ITMP1; } ICONST(d, iptr[1].val.i); } if ((a >= 0) && (a <= 255)) { - M_CMOVLT(s1, a, d, 1); + M_CMOVLT(s1, a, d, CONST); } else { ICONST(REG_ITMP2, a); - M_CMOVLT(s1, REG_ITMP2, d, 0); + M_CMOVLT(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IFGE_ICONST: + + case ICMD_IFGE_ICONST: /* ..., value ==> ..., constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); a = iptr->val.i; @@ -2379,21 +2701,24 @@ static void gen_mcode() break; } if (s1 == d) { - M_OR(s1, s1 , REG_ITMP1, 0); + M_MOV(s1, REG_ITMP1); s1 = REG_ITMP1; } ICONST(d, iptr[1].val.i); } if ((a >= 0) && (a <= 255)) { - M_CMOVGE(s1, a, d, 1); + M_CMOVGE(s1, a, d, CONST); } else { ICONST(REG_ITMP2, a); - M_CMOVGE(s1, REG_ITMP2, d, 0); + M_CMOVGE(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IFGT_ICONST: + + case ICMD_IFGT_ICONST: /* ..., value ==> ..., constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); a = iptr->val.i; @@ -2409,21 +2734,24 @@ static void gen_mcode() break; } if (s1 == d) { - M_OR(s1, s1 , REG_ITMP1, 0); + M_MOV(s1, REG_ITMP1); s1 = REG_ITMP1; } ICONST(d, iptr[1].val.i); } if ((a >= 0) && (a <= 255)) { - M_CMOVGT(s1, a, d, 1); + M_CMOVGT(s1, a, d, CONST); } else { ICONST(REG_ITMP2, a); - M_CMOVGT(s1, REG_ITMP2, d, 0); + M_CMOVGT(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IFLE_ICONST: + + case ICMD_IFLE_ICONST: /* ..., value ==> ..., constant */ + /* val.i = constant */ + var_to_reg_int(s1, src, REG_ITMP1); d = reg_of_var(iptr->dst, REG_ITMP3); a = iptr->val.i; @@ -2439,31 +2767,31 @@ static void gen_mcode() break; } if (s1 == d) { - M_OR(s1, s1 , REG_ITMP1, 0); + M_MOV(s1, REG_ITMP1); s1 = REG_ITMP1; } ICONST(d, iptr[1].val.i); } if ((a >= 0) && (a <= 255)) { - M_CMOVLE(s1, a, d, 1); + M_CMOVLE(s1, a, d, CONST); } else { ICONST(REG_ITMP2, a); - M_CMOVLE(s1, REG_ITMP2, d, 0); + M_CMOVLE(s1, REG_ITMP2, d, REG); } store_reg_to_var_int(iptr->dst, d); break; - case ICMD_IRETURN: + case ICMD_IRETURN: /* ..., retvalue ==> ... */ case ICMD_LRETURN: case ICMD_ARETURN: #ifdef USE_THREADS if (checksync && (method->flags & ACC_SYNCHRONIZED)) { a = dseg_addaddress ((void*) (builtin_monitorexit)); - M_LLD(REG_PV, REG_PV, a); - M_LLD(argintregs[0], REG_SP, 8 * maxmemuse); + M_ALD(REG_PV, REG_PV, a); + M_ALD(argintregs[0], REG_SP, 8 * maxmemuse); M_JSR(REG_RA, REG_PV); M_LDA(REG_PV, REG_RA, -(int)((u1*) mcodeptr - mcodebase)); } @@ -2472,14 +2800,14 @@ static void gen_mcode() M_INTMOVE(s1, REG_RESULT); goto nowperformreturn; - case ICMD_FRETURN: + case ICMD_FRETURN: /* ..., retvalue ==> ... */ case ICMD_DRETURN: #ifdef USE_THREADS if (checksync && (method->flags & ACC_SYNCHRONIZED)) { a = dseg_addaddress ((void*) (builtin_monitorexit)); - M_LLD(REG_PV, REG_PV, a); - M_LLD(argintregs[0], REG_SP, 8 * maxmemuse); + M_ALD(REG_PV, REG_PV, a); + M_ALD(argintregs[0], REG_SP, 8 * maxmemuse); M_JSR(REG_RA, REG_PV); M_LDA(REG_PV, REG_RA, -(int)((u1*) mcodeptr - mcodebase)); } @@ -2488,13 +2816,13 @@ static void gen_mcode() M_FLTMOVE(s1, REG_FRESULT); goto nowperformreturn; - case ICMD_RETURN: + case ICMD_RETURN: /* ... ==> ... */ #ifdef USE_THREADS if (checksync && (method->flags & ACC_SYNCHRONIZED)) { a = dseg_addaddress ((void*) (builtin_monitorexit)); - M_LLD(REG_PV, REG_PV, a); - M_LLD(argintregs[0], REG_SP, 8 * maxmemuse); + M_ALD(REG_PV, REG_PV, a); + M_ALD(argintregs[0], REG_SP, 8 * maxmemuse); M_JSR(REG_RA, REG_PV); M_LDA(REG_PV, REG_RA, -(int)((u1*) mcodeptr - mcodebase)); } @@ -2505,26 +2833,37 @@ nowperformreturn: int r, p; p = parentargs_base; + + /* restore return address */ + if (!isleafmethod) {p--; M_LLD (REG_RA, REG_SP, 8 * p);} + + /* restore saved registers */ + for (r = savintregcnt - 1; r >= maxsavintreguse; r--) {p--; M_LLD(savintregs[r], REG_SP, 8 * p);} for (r = savfltregcnt - 1; r >= maxsavfltreguse; r--) {p--; M_DLD(savfltregs[r], REG_SP, 8 * p);} + /* deallocate stack */ + if (parentargs_base) {M_LDA(REG_SP, REG_SP, parentargs_base*8);} + + /* call trace function */ + if (runverbose) { M_LDA (REG_SP, REG_SP, -24); - M_LST(REG_RA, REG_SP, 0); + M_AST(REG_RA, REG_SP, REG); M_LST(REG_RESULT, REG_SP, 8); M_DST(REG_FRESULT, REG_SP,16); a = dseg_addaddress (method); - M_LLD(argintregs[0], REG_PV, a); - M_OR(REG_RESULT, REG_RESULT, argintregs[1], 0); + M_ALD(argintregs[0], REG_PV, a); + M_MOV(REG_RESULT, argintregs[1]); M_FLTMOVE(REG_FRESULT, argfltregs[2]); a = dseg_addaddress ((void*) (builtin_displaymethodstop)); - M_LLD(REG_PV, REG_PV, a); + M_ALD(REG_PV, REG_PV, a); M_JSR (REG_RA, REG_PV); s1 = (int)((u1*) mcodeptr - mcodebase); if (s1<=32768) M_LDA (REG_PV, REG_RA, -s1); @@ -2536,16 +2875,17 @@ nowperformreturn: } M_DLD(REG_FRESULT, REG_SP,16); M_LLD(REG_RESULT, REG_SP, 8); - M_LLD(REG_RA, REG_SP, 0); + M_ALD(REG_RA, REG_SP, REG); M_LDA (REG_SP, REG_SP, 24); } + M_RET(REG_ZERO, REG_RA); ALIGNCODENOP; } break; - case ICMD_TABLESWITCH: + case ICMD_TABLESWITCH: /* ..., index ==> ... */ { s4 i, l, *s4ptr; @@ -2560,13 +2900,15 @@ nowperformreturn: M_LDA(REG_ITMP1, s1, -l); i = i - l + 1; + /* range check */ + if (i <= 256) - M_CMPULE(REG_ITMP1, i - 1, REG_ITMP2, 1); + M_CMPULE(REG_ITMP1, i - 1, REG_ITMP2, CONST); else { M_LDA(REG_ITMP2, REG_ZERO, i - 1); - M_CMPULE(REG_ITMP1, REG_ITMP2, REG_ITMP2, 0); + M_CMPULE(REG_ITMP1, REG_ITMP2, REG_ITMP2, REG); } - M_BEQZ(REG_ITMP2, 0); + M_BEQZ(REG_ITMP2, REG); mcode_addreference(BlockPtrOfPC(s4ptr[0]), mcodeptr); /* build jump table top down and use address of lowest entry */ @@ -2579,14 +2921,14 @@ nowperformreturn: /* length of dataseg after last dseg_addtarget is used by load */ - M_S8ADDQ(REG_ITMP1, REG_PV, REG_ITMP2, 0); - M_LLD(REG_ITMP2, REG_ITMP2, -dseglen); + M_SAADDQ(REG_ITMP1, REG_PV, REG_ITMP2, REG); + M_ALD(REG_ITMP2, REG_ITMP2, -dseglen); M_JMP(REG_ZERO, REG_ITMP2); ALIGNCODENOP; break; - case ICMD_LOOKUPSWITCH: + case ICMD_LOOKUPSWITCH: /* ..., key ==> ... */ { s4 i, l, val, *s4ptr; @@ -2600,7 +2942,7 @@ nowperformreturn: s4ptr += 2; val = s4ptr[0]; if ((val >= 0) && (val <= 255)) { - M_CMPEQ(s1, val, REG_ITMP2, 1); + M_CMPEQ(s1, val, REG_ITMP2, CONST); } else { if ((val >= -32768) && (val <= 32767)) { @@ -2610,9 +2952,9 @@ nowperformreturn: a = dseg_adds4 (val); M_ILD(REG_ITMP2, REG_PV, a); } - M_CMPEQ(s1, REG_ITMP2, REG_ITMP2, 0); + M_CMPEQ(s1, REG_ITMP2, REG_ITMP2, REG); } - M_BNEZ(REG_ITMP2, 0); + M_BNEZ(REG_ITMP2, REG); mcode_addreference(BlockPtrOfPC(s4ptr[1]), mcodeptr); } @@ -2623,22 +2965,33 @@ nowperformreturn: } - case ICMD_BUILTIN3: + case ICMD_BUILTIN3: /* ..., arg1, arg2, arg3 ==> ... */ + /* op1 = return type, val.a = function pointer*/ s3 = 3; goto gen_method; - case ICMD_BUILTIN2: + case ICMD_BUILTIN2: /* ..., arg1, arg2 ==> ... */ + /* op1 = return type, val.a = function pointer*/ s3 = 2; goto gen_method; - case ICMD_BUILTIN1: + case ICMD_BUILTIN1: /* ..., arg1 ==> ... */ + /* op1 = return type, val.a = function pointer*/ s3 = 1; goto gen_method; - case ICMD_INVOKESTATIC: - case ICMD_INVOKESPECIAL: - case ICMD_INVOKEVIRTUAL: - case ICMD_INVOKEINTERFACE: + case ICMD_INVOKESTATIC: /* ..., [arg1, [arg2 ...]] ==> ... */ + /* op1 = arg count, val.a = method pointer */ + + case ICMD_INVOKESPECIAL:/* ..., objectref, [arg1, [arg2 ...]] ==> ... */ + /* op1 = arg count, val.a = method pointer */ + + case ICMD_INVOKEVIRTUAL:/* ..., objectref, [arg1, [arg2 ...]] ==> ... */ + /* op1 = arg count, val.a = method pointer */ + + case ICMD_INVOKEINTERFACE:/*.., objectref, [arg1, [arg2 ...]] ==> ... */ + /* op1 = arg count, val.a = method pointer */ + s3 = iptr->op1; gen_method: { @@ -2647,6 +3000,8 @@ gen_method: { MCODECHECK((s3 << 1) + 64); + /* copy arguments to registers or stack location */ + for (; --s3 >= 0; src = src->prev) { if (src->varkind == ARGVAR) continue; @@ -2680,7 +3035,7 @@ gen_method: { case ICMD_BUILTIN1: a = dseg_addaddress ((void*) (m)); - M_LLD(REG_PV, REG_PV, a); /* Pointer to built-in-function */ + M_ALD(REG_PV, REG_PV, a); /* Pointer to built-in-function */ d = iptr->op1; goto makeactualcall; @@ -2688,7 +3043,7 @@ gen_method: { case ICMD_INVOKESPECIAL: a = dseg_addaddress (m->stubroutine); - M_LLD(REG_PV, REG_PV, a ); /* Method-Pointer in r27 */ + M_ALD(REG_PV, REG_PV, a ); /* method pointer in r27 */ d = m->returntype; goto makeactualcall; @@ -2696,9 +3051,9 @@ gen_method: { case ICMD_INVOKEVIRTUAL: gen_nullptr_check(argintregs[0]); - M_LLD(REG_METHODPTR, argintregs[0], + M_ALD(REG_METHODPTR, argintregs[0], OFFSET(java_objectheader, vftbl)); - M_LLD(REG_PV, REG_METHODPTR, OFFSET(vftbl, table[0]) + + M_ALD(REG_PV, REG_METHODPTR, OFFSET(vftbl, table[0]) + sizeof(methodptr) * m->vftblindex); d = m->returntype; @@ -2708,12 +3063,12 @@ gen_method: { ci = m->class; gen_nullptr_check(argintregs[0]); - M_LLD(REG_METHODPTR, argintregs[0], + M_ALD(REG_METHODPTR, argintregs[0], OFFSET(java_objectheader, vftbl)); - M_LLD(REG_METHODPTR, REG_METHODPTR, + M_ALD(REG_METHODPTR, REG_METHODPTR, OFFSET(vftbl, interfacetable[0]) - sizeof(methodptr*) * ci->index); - M_LLD(REG_PV, REG_METHODPTR, + M_ALD(REG_PV, REG_METHODPTR, sizeof(methodptr) * (m - ci->methods)); d = m->returntype; @@ -2728,6 +3083,9 @@ gen_method: { makeactualcall: M_JSR (REG_RA, REG_PV); + + /* recompute pv */ + s1 = (int)((u1*) mcodeptr - mcodebase); if (s1<=32768) M_LDA (REG_PV, REG_RA, -s1); else { @@ -2737,6 +3095,8 @@ makeactualcall: M_LDAH (REG_PV, REG_PV, mh ); } + /* d contains return type */ + if (d != TYPE_VOID) { if (IS_INT_LNG_TYPE(iptr->dst->type)) { s1 = reg_of_var(iptr->dst, REG_RESULT); @@ -2791,7 +3151,7 @@ makeactualcall: M_ALD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, interfacetable[0]) - super->index * sizeof(methodptr*)); - M_CMPULT(REG_ZERO, REG_ITMP1, d, 0); /* REG_ITMP1 != 0 */ + M_CMPULT(REG_ZERO, REG_ITMP1, d, REG); /* REG_ITMP1 != 0 */ } else { /* class */ s2 = super->vftbl->diffval; @@ -2800,10 +3160,10 @@ makeactualcall: M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, baseval)); M_LDA(REG_ITMP1, REG_ITMP1, - super->vftbl->baseval); if (s2 <= 255) - M_CMPULE(REG_ITMP1, s2, d, 1); + M_CMPULE(REG_ITMP1, s2, d, CONST); else { M_LDA(REG_ITMP2, REG_ZERO, s2); - M_CMPULE(REG_ITMP1, REG_ITMP2, d, 0); + M_CMPULE(REG_ITMP1, REG_ITMP2, d, REG); } } } @@ -2842,12 +3202,12 @@ makeactualcall: M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl)); M_ILD(REG_ITMP2, REG_ITMP1, OFFSET(vftbl, interfacetablelength)); M_LDA(REG_ITMP2, REG_ITMP2, - super->index); - M_BLEZ(REG_ITMP2, 0); + M_BLEZ(REG_ITMP2, REG); mcode_addxcastrefs(mcodeptr); M_ALD(REG_ITMP2, REG_ITMP1, OFFSET(vftbl, interfacetable[0]) - super->index * sizeof(methodptr*)); - M_BEQZ(REG_ITMP2, 0); + M_BEQZ(REG_ITMP2, REG); mcode_addxcastrefs(mcodeptr); } else { /* class */ @@ -2857,16 +3217,16 @@ makeactualcall: M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, baseval)); M_LDA(REG_ITMP1, REG_ITMP1, - super->vftbl->baseval); if (s2 == 0) { - M_BNEZ(REG_ITMP1, 0); + M_BNEZ(REG_ITMP1, REG); } else if (s2 <= 255) { - M_CMPULE(REG_ITMP1, s2, REG_ITMP2, 1); - M_BEQZ(REG_ITMP2, 0); + M_CMPULE(REG_ITMP1, s2, REG_ITMP2, CONST); + M_BEQZ(REG_ITMP2, REG); } else { M_LDA(REG_ITMP2, REG_ZERO, s2); - M_CMPULE(REG_ITMP1, REG_ITMP2, REG_ITMP2, 0); - M_BEQZ(REG_ITMP2, 0); + M_CMPULE(REG_ITMP1, REG_ITMP2, REG_ITMP2, REG); + M_BEQZ(REG_ITMP2, REG); } mcode_addxcastrefs(mcodeptr); } @@ -2878,13 +3238,15 @@ makeactualcall: store_reg_to_var_int(iptr->dst, d); break; - case ICMD_CHECKASIZE: + case ICMD_CHECKASIZE: /* ..., size ==> ..., size */ + var_to_reg_int(s1, src, REG_ITMP1); - M_BLTZ(s1, 0); + M_BLTZ(s1, REG); mcode_addxcheckarefs(mcodeptr); break; - case ICMD_MULTIANEWARRAY: + case ICMD_MULTIANEWARRAY:/* ..., cnt1, [cnt2, ...] ==> ..., arrayref */ + /* op1 = dimension, val.a = array descriptor */ /* check for negative sizes and copy sizes to stack if necessary */ @@ -2892,7 +3254,7 @@ makeactualcall: for (s1 = iptr->op1; --s1 >= 0; src = src->prev) { var_to_reg_int(s2, src, REG_ITMP1); - M_BLTZ(s2, 0); + M_BLTZ(s2, REG); mcode_addxcheckarefs(mcodeptr); /* copy sizes to stack (argument numbers >= INT_ARG_CNT) */ @@ -2909,14 +3271,14 @@ makeactualcall: /* a1 = arraydescriptor */ a = dseg_addaddress(iptr->val.a); - M_LLD(argintregs[1], REG_PV, a); + M_ALD(argintregs[1], REG_PV, a); /* a2 = pointer to dimensions = stack pointer */ M_INTMOVE(REG_SP, argintregs[2]); a = dseg_addaddress((void*) (builtin_nmultianewarray)); - M_LLD(REG_PV, REG_PV, a); + M_ALD(REG_PV, REG_PV, a); M_JSR(REG_RA, REG_PV); s1 = (int)((u1*) mcodeptr - mcodebase); if (s1 <= 32768) @@ -2937,6 +3299,9 @@ makeactualcall: error(); } /* switch */ } /* for instruction */ + + /* copy values to interface registers */ + src = bptr->outstack; len = bptr->outdepth; MCODECHECK(64+len); @@ -2971,6 +3336,8 @@ makeactualcall: bptr -> mpc = (int)((u1*) mcodeptr - mcodebase); { + /* generate bound check stubs */ + s4 *xcodeptr = NULL; for (; xboundrefs != NULL; xboundrefs = xboundrefs->next) { @@ -2994,15 +3361,17 @@ makeactualcall: xcodeptr = mcodeptr; a = dseg_addaddress(proto_java_lang_ArrayIndexOutOfBoundsException); - M_LLD(REG_ITMP1_XPTR, REG_PV, a); + M_ALD(REG_ITMP1_XPTR, REG_PV, a); a = dseg_addaddress(asm_handle_exception); - M_LLD(REG_ITMP3, REG_PV, a); + M_ALD(REG_ITMP3, REG_PV, a); M_JMP(REG_ZERO, REG_ITMP3); } } + /* generate negative array size check stubs */ + xcodeptr = NULL; for (; xcheckarefs != NULL; xcheckarefs = xcheckarefs->next) { @@ -3026,15 +3395,17 @@ makeactualcall: xcodeptr = mcodeptr; a = dseg_addaddress(proto_java_lang_NegativeArraySizeException); - M_LLD(REG_ITMP1_XPTR, REG_PV, a); + M_ALD(REG_ITMP1_XPTR, REG_PV, a); a = dseg_addaddress(asm_handle_exception); - M_LLD(REG_ITMP3, REG_PV, a); + M_ALD(REG_ITMP3, REG_PV, a); M_JMP(REG_ZERO, REG_ITMP3); } } + /* generate cast check stubs */ + xcodeptr = NULL; for (; xcastrefs != NULL; xcastrefs = xcastrefs->next) { @@ -3058,10 +3429,10 @@ makeactualcall: xcodeptr = mcodeptr; a = dseg_addaddress(proto_java_lang_ClassCastException); - M_LLD(REG_ITMP1_XPTR, REG_PV, a); + M_ALD(REG_ITMP1_XPTR, REG_PV, a); a = dseg_addaddress(asm_handle_exception); - M_LLD(REG_ITMP3, REG_PV, a); + M_ALD(REG_ITMP3, REG_PV, a); M_JMP(REG_ZERO, REG_ITMP3); } @@ -3070,6 +3441,8 @@ makeactualcall: #ifdef SOFTNULLPTRCHECK + /* generate null pointer check stubs */ + xcodeptr = NULL; for (; xnullrefs != NULL; xnullrefs = xnullrefs->next) { @@ -3093,10 +3466,10 @@ makeactualcall: xcodeptr = mcodeptr; a = dseg_addaddress(proto_java_lang_NullPointerException); - M_LLD(REG_ITMP1_XPTR, REG_PV, a); + M_ALD(REG_ITMP1_XPTR, REG_PV, a); a = dseg_addaddress(asm_handle_exception); - M_LLD(REG_ITMP3, REG_PV, a); + M_ALD(REG_ITMP3, REG_PV, a); M_JMP(REG_ZERO, REG_ITMP3); } @@ -3138,8 +3511,6 @@ This makes sense only for the stub-generation-routines below. *(p++) = ( (((s4)(op))<<26)|((a)<<21)|((b)<<16)|((disp)&0xffff) ) -#if 0 - /* function createcompilerstub ************************************************* creates a stub routine which calls the compiler @@ -3154,7 +3525,7 @@ u1 *createcompilerstub (methodinfo *m) s4 *p = (s4*) s; /* code generation pointer */ /* code for the stub */ - M_LLD (REG_PV, REG_PV, 16); /* load pointer to the compiler */ + M_ALD (REG_PV, REG_PV, 16); /* load pointer to the compiler */ M_JMP (0, REG_PV); /* jump to the compiler, return address in reg 0 is used as method pointer */ s[1] = (u8) m; /* literals to be adressed */ @@ -3180,20 +3551,6 @@ void removecompilerstub (u1 *stub) } -/* function: removenativestub ************************************************** - - removes a previously created native-stub from memory - -*******************************************************************************/ - -void removenativestub (u1 *stub) -{ - CFREE (stub, NATIVESTUBSIZE * 8); -} - -#endif /* 0 */ - - /* function: ncreatenativestub ************************************************* creates a stub routine which calls a native method @@ -3208,26 +3565,26 @@ u1 *ncreatenativestub (functionptr f, methodinfo *m) s4 *p = (s4*) s; /* code generation pointer */ M_LDA (REG_SP, REG_SP, -8); /* build up stackframe */ - M_LST (REG_RA, REG_SP, 0); /* store return address */ + M_AST (REG_RA, REG_SP, REG); /* store return address */ - M_LLD (REG_PV, REG_PV, 8*8); /* load adress of native method */ + M_ALD (REG_PV, REG_PV, 8*8); /* load adress of native method */ M_JSR (REG_RA, REG_PV); /* call native method */ M_LDA (REG_PV, REG_RA, -4*4); /* recompute pv from ra */ - M_LLD (REG_ITMP3, REG_PV, 9*8); /* get address of exceptionptr */ + M_ALD (REG_ITMP3, REG_PV, 9*8); /* get address of exceptionptr */ - M_LLD (REG_RA, REG_SP, 0); /* load return address */ - M_LLD (REG_ITMP1, REG_ITMP3, 0); /* load exception into reg. itmp1 */ + M_ALD (REG_RA, REG_SP, REG); /* load return address */ + M_ALD (REG_ITMP1, REG_ITMP3, REG); /* load exception into reg. itmp1 */ M_LDA (REG_SP, REG_SP, 8); /* remove stackframe */ - M_BNEZ (REG_ITMP1, 1); /* if no exception then return */ + M_BNEZ (REG_ITMP1, CONST); /* if no exception then return */ M_RET (REG_ZERO, REG_RA); /* return to caller */ - M_LST (REG_ZERO, REG_ITMP3, 0); /* store NULL into exceptionptr */ + M_AST (REG_ZERO, REG_ITMP3, REG); /* store NULL into exceptionptr */ M_LDA (REG_ITMP2, REG_RA, -4); /* move fault address into reg. itmp2 */ - M_LLD (REG_ITMP3, REG_PV,10*8); /* load asm exception handler address */ + M_ALD (REG_ITMP3, REG_PV,10*8); /* load asm exception handler address */ M_JMP (REG_ZERO, REG_ITMP3); /* jump to asm exception handler */ @@ -3243,6 +3600,18 @@ u1 *ncreatenativestub (functionptr f, methodinfo *m) } +/* function: removenativestub ************************************************** + + removes a previously created native-stub from memory + +*******************************************************************************/ + +void removenativestub (u1 *stub) +{ + CFREE (stub, NATIVESTUBSIZE * 8); +} + + /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where diff --git a/alpha/ngen.h b/alpha/ngen.h index 49da0b7b4..8578813d0 100644 --- a/alpha/ngen.h +++ b/alpha/ngen.h @@ -10,23 +10,24 @@ Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at - Last Change: 1998/08/10 + Last Change: 1998/11/04 *******************************************************************************/ +/* see also file calling.doc for explanation of calling conventions */ + /* preallocated registers *****************************************************/ /* integer registers */ #define REG_RESULT 0 /* to deliver method results */ -#define REG_EXCEPTION 1 /* to throw an exception across method bounds */ #define REG_RA 26 /* return address */ #define REG_PV 27 /* procedure vector, must be provided by caller */ #define REG_METHODPTR 28 /* pointer to the place from where the procedure */ /* vector has been fetched */ #define REG_ITMP1 25 /* temporary register */ -#define REG_ITMP2 28 /* temporary register */ +#define REG_ITMP2 28 /* temporary register and method pointer */ #define REG_ITMP3 29 /* temporary register */ #define REG_ITMP1_XPTR 25 /* exception pointer = temporary register 1 */ @@ -46,12 +47,12 @@ /* register descripton - array ************************************************/ -/* #define REG_RES 0 reserved register for OS or code generator */ -/* #define REG_RET 1 return value register */ -/* #define REG_EXC 2 exception value register */ -/* #define REG_SAV 3 (callee) saved register */ -/* #define REG_TMP 4 scratch temporary register (caller saved) */ -/* #define REG_ARG 5 argument register (caller saved) */ +/* #define REG_RES 0 reserved register for OS or code generator */ +/* #define REG_RET 1 return value register */ +/* #define REG_EXC 2 exception value register (only old jit) */ +/* #define REG_SAV 3 (callee) saved register */ +/* #define REG_TMP 4 scratch temporary register (caller saved) */ +/* #define REG_ARG 5 argument register (caller saved) */ /* #define REG_END -1 last entry in tables */ @@ -100,6 +101,9 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/ /* macros to create code ******************************************************/ +#define REG 0 +#define CONST 1 + /* 3-address-operations: M_OP3 op ..... opcode fu ..... function-number @@ -107,8 +111,8 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/ b ..... register number or constant integer source 2 c ..... register number destination const .. switch to use b as constant integer - (0 means: use b as register number) - (1 means: use b as constant 8-bit-integer) + (REG means: use b as register number) + (CONST means: use b as constant 8-bit-integer) */ #define M_OP3(op,fu,a,b,c,const) \ *(mcodeptr++) = ( (((s4)(op))<<26)|((a)<<21)|((b)<<(16-3*(const)))| \ @@ -259,12 +263,18 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/ #define M_S8ADDQ(a,b,c,const) M_OP3 (0x10,0x32, a,b,c,const) /* c = a*8 + b */ #define M_S8SUBL(a,b,c,const) M_OP3 (0x10,0x1b, a,b,c,const) /* c = a*8 - b */ #define M_S8SUBQ(a,b,c,const) M_OP3 (0x10,0x3b, a,b,c,const) /* c = a*8 - b */ +#define M_SAADDQ(a,b,c,const) M_S8ADDQ(a,b,c,const) /* c = a*8 + b */ #define M_LLD_U(a,b,disp) M_MEM (0x0b,a,b,disp) /* unalign ld */ #define M_LST_U(a,b,disp) M_MEM (0x0f,a,b,disp) /* unalign st */ #define M_ZAP(a,b,c,const) M_OP3 (0x12,0x30, a,b,c,const) #define M_ZAPNOT(a,b,c,const) M_OP3 (0x12,0x31, a,b,c,const) + +#define M_BZEXT(a,b) M_ZAPNOT(a, 0x01, b, CONST) /* 8 zeroext */ +#define M_CZEXT(a,b) M_ZAPNOT(a, 0x03, b, CONST) /* 16 zeroext */ +#define M_IZEXT(a,b) M_ZAPNOT(a, 0x0f, b, CONST) /* 32 zeroext */ + #define M_EXTBL(a,b,c,const) M_OP3 (0x12,0x06, a,b,c,const) #define M_EXTWL(a,b,c,const) M_OP3 (0x12,0x16, a,b,c,const) #define M_EXTLL(a,b,c,const) M_OP3 (0x12,0x26, a,b,c,const) @@ -287,7 +297,7 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/ #define M_MSKLH(a,b,c,const) M_OP3 (0x12,0x62, a,b,c,const) #define M_MSKQH(a,b,c,const) M_OP3 (0x12,0x72, a,b,c,const) -#define M_UMULH(a,b,c,const) M_OP3 (0x13,0x30, a,b,c,const) /* 64 umulh */ +#define M_UMULH(a,b,c,const) M_OP3 (0x13,0x30, a,b,c,const) /* 64 umulh */ /* macros for unused commands (see an Alpha-manual for description) ***********/ @@ -330,4 +340,4 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/ #define gen_resolvebranch(ip,so,to) ((s4*)(ip))[-1]|=((s4)(to)-(so))>>2&0x1fffff -#define SOFTNULLPTRCHECK +#define SOFTNULLPTRCHECK /* soft null pointer check supportet as option */ diff --git a/ncomp/ncompdef.h b/ncomp/ncompdef.h index 4ed67c19c..2a4fb5021 100644 --- a/ncomp/ncompdef.h +++ b/ncomp/ncompdef.h @@ -148,22 +148,22 @@ static int jcommandsize[256] = { #define ICMD_NOP 0 1, #define JAVA_ACONST_NULL 1 -#define ICMD_ACONST 1 /* op1 = 0, val.a = constant */ +#define ICMD_ACONST 1 /* val.a = constant */ 1, #define JAVA_ICONST_M1 2 #define ICMD_NULLCHECKPOP 2 1, #define JAVA_ICONST_0 3 -#define ICMD_ICONST 3 /* op1 = 0, val.i = constant */ +#define ICMD_ICONST 3 /* val.i = constant */ 1, #define JAVA_ICONST_1 4 #define ICMD_IREM0X10001 4 1, #define JAVA_ICONST_2 5 -#define ICMD_IDIVPOW2 5 +#define ICMD_IDIVPOW2 5 /* val.i = constant */ 1, #define JAVA_ICONST_3 6 -#define ICMD_LDIVPOW2 6 +#define ICMD_LDIVPOW2 6 /* val.l = constant */ 1, #define JAVA_ICONST_4 7 1, @@ -171,13 +171,13 @@ static int jcommandsize[256] = { #define ICMD_LREM0X10001 8 1, #define JAVA_LCONST_0 9 -#define ICMD_LCONST 9 /* op1 = 0, val.l = constant */ +#define ICMD_LCONST 9 /* val.l = constant */ 1, #define JAVA_LCONST_1 10 -#define ICMD_LCMPCONST 10 /* op1 = 0, val.l = constant */ +#define ICMD_LCMPCONST 10 /* val.l = constant */ 1, #define JAVA_FCONST_0 11 -#define ICMD_FCONST 11 /* op1 = 0, val.f = constant */ +#define ICMD_FCONST 11 /* val.f = constant */ 1, #define JAVA_FCONST_1 12 1, @@ -185,7 +185,7 @@ static int jcommandsize[256] = { #define ICMD_ELSE_ICONST 13 1, #define JAVA_DCONST_0 14 -#define ICMD_DCONST 14 /* op1 = 0, val.a = constant */ +#define ICMD_DCONST 14 /* val.d = constant */ 1, #define JAVA_DCONST_1 15 #define ICMD_IFEQ_ICONST 15 @@ -223,64 +223,64 @@ static int jcommandsize[256] = { #define ICMD_ALOAD 25 /* op1 = local variable */ 2, #define JAVA_ILOAD_0 26 -#define ICMD_IADDCONST 26 +#define ICMD_IADDCONST 26 /* val.i = constant */ 1, #define JAVA_ILOAD_1 27 -#define ICMD_ISUBCONST 27 +#define ICMD_ISUBCONST 27 /* val.i = constant */ 1, #define JAVA_ILOAD_2 28 -#define ICMD_IMULCONST 28 +#define ICMD_IMULCONST 28 /* val.i = constant */ 1, #define JAVA_ILOAD_3 29 -#define ICMD_IANDCONST 29 +#define ICMD_IANDCONST 29 /* val.i = constant */ 1, #define JAVA_LLOAD_0 30 -#define ICMD_IORCONST 30 +#define ICMD_IORCONST 30 /* val.i = constant */ 1, #define JAVA_LLOAD_1 31 -#define ICMD_IXORCONST 31 +#define ICMD_IXORCONST 31 /* val.i = constant */ 1, #define JAVA_LLOAD_2 32 -#define ICMD_ISHLCONST 32 +#define ICMD_ISHLCONST 32 /* val.i = constant */ 1, #define JAVA_LLOAD_3 33 -#define ICMD_ISHRCONST 33 +#define ICMD_ISHRCONST 33 /* val.i = constant */ 1, #define JAVA_FLOAD_0 34 -#define ICMD_IUSHRCONST 34 +#define ICMD_IUSHRCONST 34 /* val.i = constant */ 1, #define JAVA_FLOAD_1 35 -#define ICMD_IREMPOW2 35 +#define ICMD_IREMPOW2 35 /* val.i = constant */ 1, #define JAVA_FLOAD_2 36 -#define ICMD_LADDCONST 36 +#define ICMD_LADDCONST 36 /* val.l = constant */ 1, #define JAVA_FLOAD_3 37 -#define ICMD_LSUBCONST 37 +#define ICMD_LSUBCONST 37 /* val.l = constant */ 1, #define JAVA_DLOAD_0 38 -#define ICMD_LMULCONST 38 +#define ICMD_LMULCONST 38 /* val.l = constant */ 1, #define JAVA_DLOAD_1 39 -#define ICMD_LANDCONST 39 +#define ICMD_LANDCONST 39 /* val.l = constant */ 1, #define JAVA_DLOAD_2 40 -#define ICMD_LORCONST 40 +#define ICMD_LORCONST 40 /* val.l = constant */ 1, #define JAVA_DLOAD_3 41 -#define ICMD_LXORCONST 41 +#define ICMD_LXORCONST 41 /* val.l = constant */ 1, #define JAVA_ALOAD_0 42 -#define ICMD_LSHLCONST 42 +#define ICMD_LSHLCONST 42 /* val.l = constant */ 1, #define JAVA_ALOAD_1 43 -#define ICMD_LSHRCONST 43 +#define ICMD_LSHRCONST 43 /* val.l = constant */ 1, #define JAVA_ALOAD_2 44 -#define ICMD_LUSHRCONST 44 +#define ICMD_LUSHRCONST 44 /* val.l = constant */ 1, #define JAVA_ALOAD_3 45 -#define ICMD_LREMPOW2 45 +#define ICMD_LREMPOW2 45 /* val.l = constant */ 1, #define JAVA_IALOAD 46 #define ICMD_IALOAD 46 @@ -673,10 +673,10 @@ static int jcommandsize[256] = { #define ICMD_RETURN 177 1, #define JAVA_GETSTATIC 178 -#define ICMD_GETSTATIC 178 /* op1 = type, val.a = field adress */ +#define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */ 3, #define JAVA_PUTSTATIC 179 -#define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field adress */ +#define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */ 3, #define JAVA_GETFIELD 180 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */ diff --git a/ncomp/nstack.c b/ncomp/nstack.c index f38690508..6abf81e16 100644 --- a/ncomp/nstack.c +++ b/ncomp/nstack.c @@ -42,7 +42,7 @@ #define COPY(s,d) {(d)->flags=0;(d)->type=(s)->type;\ (d)->varkind=(s)->varkind;(d)->varnum=(s)->varnum;} -#define CONST(s) {NEWSTACKn(s,stackdepth);SETDST;stackdepth++;} +#define PUSHCONST(s){NEWSTACKn(s,stackdepth);SETDST;stackdepth++;} #define LOAD(s,v,n) {NEWSTACK(s,v,n);SETDST;stackdepth++;} #define STORE(s) {POP(s);SETDST;stackdepth--;} #define OP1_0(s) {POP(s);SETDST;stackdepth--;} @@ -401,7 +401,7 @@ icmd_iconst_tail: else if (iptr[0].val.i == 0x80000000) iptr[0].val.i = 31; else { - CONST(TYPE_INT); + PUSHCONST(TYPE_INT); break; } iptr[0].opc = ICMD_IDIVPOW2; @@ -446,7 +446,7 @@ icmd_iconst_tail: iptr[0].val.i -= 1; goto icmd_iconst_tail; } - CONST(TYPE_INT); + PUSHCONST(TYPE_INT); break; case ICMD_IAND: iptr[0].opc = ICMD_IANDCONST; @@ -494,11 +494,11 @@ icmd_if_icmp_tail: iptr[0].opc = ICMD_IFGE; goto icmd_if_icmp_tail; default: - CONST(TYPE_INT); + PUSHCONST(TYPE_INT); } } else - CONST(TYPE_INT); + PUSHCONST(TYPE_INT); break; case ICMD_LCONST: COUNT(count_pcmd_load); @@ -581,7 +581,7 @@ icmd_lconst_tail: else if (iptr[0].val.l == 0x80000000) iptr[0].val.l = 31; else { - CONST(TYPE_LNG); + PUSHCONST(TYPE_LNG); break; } iptr[0].opc = ICMD_LDIVPOW2; @@ -626,7 +626,7 @@ icmd_lconst_tail: iptr[0].val.l -= 1; goto icmd_lconst_tail; } - CONST(TYPE_LNG); + PUSHCONST(TYPE_LNG); break; case ICMD_LAND: iptr[0].opc = ICMD_LANDCONST; @@ -679,30 +679,30 @@ icmd_lconst_lcmp_tail: iptr[0].opc = ICMD_IF_LGE; goto icmd_lconst_lcmp_tail; default: - CONST(TYPE_LNG); + PUSHCONST(TYPE_LNG); } /* switch (iptr[2].opc) */ } /* if (iptr[2].val.i == 0) */ else - CONST(TYPE_LNG); + PUSHCONST(TYPE_LNG); break; default: - CONST(TYPE_LNG); + PUSHCONST(TYPE_LNG); } } else - CONST(TYPE_LNG); + PUSHCONST(TYPE_LNG); break; case ICMD_FCONST: COUNT(count_pcmd_load); - CONST(TYPE_FLT); + PUSHCONST(TYPE_FLT); break; case ICMD_DCONST: COUNT(count_pcmd_load); - CONST(TYPE_DBL); + PUSHCONST(TYPE_DBL); break; case ICMD_ACONST: COUNT(count_pcmd_load); - CONST(TYPE_ADR); + PUSHCONST(TYPE_ADR); break; /* pop 0 push 1 load */ -- 2.25.1