X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fintrp%2Fjava.vmg;h=ca87e61c0611a9267f7d603ea6aff535b2396dc7;hb=530ee4cb3c1223db18505eac94353792893a7328;hp=c23e2689407be3d7ec70e1440a1916a6a5d29730;hpb=284a31e10402caf1deed810142ac1ef95efe7b68;p=cacao.git diff --git a/src/vm/jit/intrp/java.vmg b/src/vm/jit/intrp/java.vmg index c23e26894..ca87e61c0 100644 --- a/src/vm/jit/intrp/java.vmg +++ b/src/vm/jit/intrp/java.vmg @@ -192,6 +192,14 @@ IALOAD ( aArray iIndex -- vResult ) 0x2e vResult = access_array_int(aArray, iIndex); } +FALOAD ( aArray iIndex -- fResult ) 0x2e +{ + CHECK_NULL_PTR(aArray); + CHECK_OUT_OF_BOUNDS(aArray, iIndex); + ; + fResult = access_array_float(aArray, iIndex); +} + LALOAD ( aArray iIndex -- lResult ) 0x2f { CHECK_NULL_PTR(aArray); @@ -255,6 +263,14 @@ IASTORE ( aArray iIndex iValue -- ) 0x4f access_array_int(aArray, iIndex) = iValue; } +FASTORE ( aArray iIndex fValue -- ) 0x4f +{ + CHECK_NULL_PTR(aArray); + CHECK_OUT_OF_BOUNDS(aArray, iIndex); + ; + access_array_float(aArray, iIndex) = fValue; +} + LASTORE ( aArray iIndex lValue -- ) 0x50 { CHECK_NULL_PTR(aArray); @@ -835,21 +851,22 @@ IRETURN ( #vOffsetFP ... vValue -- vResult ) 0xac { Inst *new_ip; Cell *currentsp = sp; - new_ip = (Inst *)access_local_cell(vOffsetFP - SIZEOF_VOID_P); - sp = fp+1; - fp = (Cell *)access_local_cell(vOffsetFP); - CLEARSTACK(currentsp-6, sp-1); + new_ip = (Inst *) access_local_cell(vOffsetFP - SIZEOF_VOID_P); + sp = fp + 1; + fp = (Cell *) access_local_cell(vOffsetFP); + CLEARSTACK(currentsp - 6, sp - 1); vResult = vValue; SET_IP(new_ip); } LRETURN ( #vOffsetFP ... lValue -- lResult ) 0xad { - Inst *new_ip = (Inst *)access_local_cell(vOffsetFP - SIZEOF_VOID_P); + Inst *new_ip; Cell *currentsp = sp; + new_ip = (Inst *) access_local_cell(vOffsetFP - SIZEOF_VOID_P); sp = fp + 1; - fp = (Cell *)access_local_cell(vOffsetFP); - CLEARSTACK(currentsp-7, sp-2); + fp = (Cell *) access_local_cell(vOffsetFP); + CLEARSTACK(currentsp - 7, sp - 2); lResult = lValue; SET_IP(new_ip); } @@ -858,75 +875,97 @@ RETURN ( #vOffsetFP ... -- ) 0xb1 { Inst *new_ip; Cell *currentsp = sp; - new_ip = (Inst *)access_local_cell(vOffsetFP - SIZEOF_VOID_P); - sp = fp+1; - fp = (Cell *)access_local_cell(vOffsetFP); - CLEARSTACK(currentsp-5, sp-1); + new_ip = (Inst *) access_local_cell(vOffsetFP - SIZEOF_VOID_P); + sp = fp + 1; + fp = (Cell *) access_local_cell(vOffsetFP); + CLEARSTACK(currentsp - 5, sp - 1); SET_IP(new_ip); } -GETSTATIC_CELL ( #addr #auf -- vResult ) opt +GETSTATIC_CELL ( #addr #afi -- vResult ) opt { vResult = *(Cell *)addr; } -GETSTATIC_INT ( #addr #auf -- iResult ) opt +GETSTATIC_INT ( #addr #afi -- iResult ) opt { iResult = *(s4 *)addr; } -GETSTATIC_LONG ( #addr #auf -- lResult ) opt +GETSTATIC_FLOAT ( #addr #afi -- fResult ) opt +{ + fResult = *(float *)addr; +} + +GETSTATIC_LONG ( #addr #afi -- lResult ) opt { lResult = *((s8 *) addr); } -PUTSTATIC_CELL ( #addr #auf vValue -- ) opt +PUTSTATIC_CELL ( #addr #afi vValue -- ) opt { *((Cell *) addr) = vValue; } -PUTSTATIC_INT ( #addr #auf iValue -- ) opt +PUTSTATIC_INT ( #addr #afi iValue -- ) opt { *((s4 *) addr) = iValue; } -PUTSTATIC_LONG ( #addr #auf lValue -- ) opt +PUTSTATIC_FLOAT ( #addr #afi fValue -- ) opt +{ + *((float *) addr) = fValue; +} + +PUTSTATIC_LONG ( #addr #afi lValue -- ) opt { *((s8 *) addr) = lValue; } -GETFIELD_CELL ( #vOffset #auf aRef -- vResult ) opt +GETFIELD_CELL ( #vOffset #afi aRef -- vResult ) opt { CHECK_NULL_PTR(aRef); vResult = *((Cell *) (((u1 *)aRef) + vOffset)); } -GETFIELD_INT ( #vOffset #auf aRef -- iResult ) opt +GETFIELD_INT ( #vOffset #afi aRef -- iResult ) opt { CHECK_NULL_PTR(aRef); iResult = *((s4 *) (((u1 *)aRef) + vOffset)); } -GETFIELD_LONG ( #vOffset #auf aRef -- lResult ) opt +GETFIELD_FLOAT ( #vOffset #afi aRef -- fResult ) opt +{ + CHECK_NULL_PTR(aRef); + fResult = *((float *) (((u1 *) aRef) + vOffset)); +} + +GETFIELD_LONG ( #vOffset #afi aRef -- lResult ) opt { CHECK_NULL_PTR(aRef); lResult = *((s8 *) (((u1 *)aRef) + vOffset)); } -PUTFIELD_CELL ( #vOffset #auf aRef vValue -- ) opt +PUTFIELD_CELL ( #vOffset #afi aRef vValue -- ) opt { CHECK_NULL_PTR(aRef); *((Cell *) (((u1 *)aRef) + vOffset)) = vValue; } -PUTFIELD_INT ( #vOffset #auf aRef iValue -- ) opt +PUTFIELD_INT ( #vOffset #afi aRef iValue -- ) opt { CHECK_NULL_PTR(aRef); *((s4 *) (((u1 *)aRef) + vOffset)) = iValue; } -PUTFIELD_LONG ( #vOffset #auf aRef lValue -- ) opt +PUTFIELD_FLOAT ( #vOffset #afi aRef fValue -- ) opt +{ + CHECK_NULL_PTR(aRef); + *((float *) (((u1 *)aRef) + vOffset)) = fValue; +} + +PUTFIELD_LONG ( #vOffset #afi aRef lValue -- ) opt { CHECK_NULL_PTR(aRef); *((s8 *) (((u1 *)aRef) + vOffset)) = lValue; @@ -936,7 +975,7 @@ PUTFIELD_LONG ( #vOffset #auf aRef lValue -- ) opt \ methods are always called indirectly through the codeptr in the stub \ (see createcompilerstub and TRANSLATE). -INVOKEVIRTUAL ( #vOffset #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xd8 +INVOKEVIRTUAL ( #vOffset #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xd8 { java_objectheader *aRef = (java_objectheader *)(sp[iNargs - 1]); char *v; @@ -953,7 +992,7 @@ INVOKEVIRTUAL ( #vOffset #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xd8 SET_IP(target); } -INVOKESTATIC ( #aaTarget #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xb8 +INVOKESTATIC ( #aaTarget #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xb8 /* an indirect pointer to target is passed to avoid references to uncompiled code */ { Inst *target = *aaTarget; @@ -964,7 +1003,7 @@ INVOKESTATIC ( #aaTarget #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xb8 SET_IP(target); } -INVOKESPECIAL ( #aaTarget #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xb7 +INVOKESPECIAL ( #aaTarget #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xb7 /* an indirect pointer to target is passed to avoid references to uncompiled code */ { java_objectheader *aRef = (java_objectheader *)(sp[iNargs - 1]); @@ -977,7 +1016,7 @@ INVOKESPECIAL ( #aaTarget #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xb7 SET_IP(target); } -INVOKEINTERFACE ( #iInterfaceOffset #vOffset #iNargs #aum ... -- ... acelloldfp ainstoldip ) 0xd8 +INVOKEINTERFACE ( #iInterfaceOffset #vOffset #iNargs #am ... -- ... acelloldfp ainstoldip ) 0xd8 { java_objectheader *aRef; char *v, *t; @@ -1204,7 +1243,7 @@ ARRAYINSTANCEOF ( aRef aClass -- iResult ) MONITORENTER ( aRef -- ) { -#if defined(USE_THREADS) +#if defined(ENABLE_THREADS) /* CHECK_NULL_PTR(aRef); is now done explicitly */ builtin_monitorenter(aRef); #endif @@ -1212,7 +1251,7 @@ MONITORENTER ( aRef -- ) MONITOREXIT ( aRef -- ) { -#if defined(USE_THREADS) +#if defined(ENABLE_THREADS) /* CHECK_NULL_PTR(aRef); cannot happen */ builtin_monitorexit(aRef); #endif @@ -1225,13 +1264,19 @@ CHECKNULL ( aRef -- aRef ) MULTIANEWARRAY ( #aClass #iSize #acr ... -- aRef ) { - long dims[iSize]; + long *dims; int i; + + dims = MNEW(long, iSize); + for (i = 0; i < iSize; i++) { dims[i] = sp[iSize - i - 1]; } global_sp = sp; aRef = (java_objectheader *) builtin_multianewarray(iSize, aClass, dims); + + MFREE(dims, long, iSize); + if (aRef == NULL) { global_sp = sp; *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (u1 *) IP, (u1 *) IP); @@ -1256,7 +1301,7 @@ IFNONNULL ( #ainstTarget aRef -- ) 0xc7 } } -\ patchers for stuff that is unknown at compile time (unloaded classes) +\ patchers for resolving fields PATCHER_GETSTATIC_INT ( #aRef #auf ... -- ) stackframeinfo sfi; @@ -1273,6 +1318,21 @@ IP[-3] = INST_ADDR(GETSTATIC_INT); SET_IP(IP-3); patchersuper_rewrite(IP); +PATCHER_GETSTATIC_FLOAT ( #aRef #auf ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP); +result = intrp_patcher_get_putstatic((u1 *)(IP-3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(GETSTATIC_FLOAT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + PATCHER_GETSTATIC_LONG ( #aRef #auf ... -- ) stackframeinfo sfi; bool result; @@ -1303,6 +1363,70 @@ IP[-3] = INST_ADDR(GETSTATIC_CELL); SET_IP(IP-3); patchersuper_rewrite(IP); +\ patchers for statically initializing classes + +PATCHER_GETSTATIC_CLINIT_INT ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(GETSTATIC_INT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +PATCHER_GETSTATIC_CLINIT_FLOAT ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *)(IP-3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(GETSTATIC_FLOAT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +PATCHER_GETSTATIC_CLINIT_LONG ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(GETSTATIC_LONG); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +PATCHER_GETSTATIC_CLINIT_CELL ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(GETSTATIC_CELL); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +\ patchers for resolving fields + PATCHER_PUTSTATIC_INT ( #aRef #auf ... -- ) stackframeinfo sfi; bool result; @@ -1318,6 +1442,21 @@ IP[-3] = INST_ADDR(PUTSTATIC_INT); SET_IP(IP-3); patchersuper_rewrite(IP); +PATCHER_PUTSTATIC_FLOAT ( #aRef #auf ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP); +result = intrp_patcher_get_putstatic((u1 *)(IP-3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(PUTSTATIC_FLOAT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + PATCHER_PUTSTATIC_LONG ( #aRef #auf ... -- ) stackframeinfo sfi; bool result; @@ -1348,6 +1487,70 @@ IP[-3] = INST_ADDR(PUTSTATIC_CELL); SET_IP(IP-3); patchersuper_rewrite(IP); +\ patchers for statically initializing classes + +PATCHER_PUTSTATIC_CLINIT_INT ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(PUTSTATIC_INT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +PATCHER_PUTSTATIC_CLINIT_FLOAT ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *)(IP-3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(PUTSTATIC_FLOAT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +PATCHER_PUTSTATIC_CLINIT_LONG ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(PUTSTATIC_LONG); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +PATCHER_PUTSTATIC_CLINIT_CELL ( #aRef #afi ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, (u1 *) fp, (u1 *) IP); +result = intrp_patcher_get_putstatic_clinit((u1 *) (IP - 3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(PUTSTATIC_CELL); +SET_IP(IP-3); +patchersuper_rewrite(IP); + +\ patchers for resolving fields + PATCHER_GETFIELD_INT ( #vOffset #auf ... -- ) stackframeinfo sfi; bool result; @@ -1363,6 +1566,21 @@ IP[-3] = INST_ADDR(GETFIELD_INT); SET_IP(IP-3); patchersuper_rewrite(IP); +PATCHER_GETFIELD_FLOAT ( #vOffset #auf ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP); +result = intrp_patcher_get_putfield((u1 *)(IP-3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(GETFIELD_FLOAT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + PATCHER_GETFIELD_LONG ( #vOffset #auf ... -- ) stackframeinfo sfi; bool result; @@ -1408,6 +1626,21 @@ IP[-3] = INST_ADDR(PUTFIELD_INT); SET_IP(IP-3); patchersuper_rewrite(IP); +PATCHER_PUTFIELD_FLOAT ( #vOffset #auf ... -- ) +stackframeinfo sfi; +bool result; +global_sp = sp; +stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP); +result = intrp_patcher_get_putfield((u1 *)(IP-3)); +stacktrace_remove_stackframeinfo(&sfi); +CLEAR_global_sp; +if (!result) + THROW0; +STORE_ORDER_BARRIER(); +IP[-3] = INST_ADDR(PUTFIELD_FLOAT); +SET_IP(IP-3); +patchersuper_rewrite(IP); + PATCHER_PUTFIELD_LONG ( #vOffset #auf ... -- ) stackframeinfo sfi; bool result; @@ -1438,6 +1671,8 @@ IP[-3] = INST_ADDR(PUTFIELD_CELL); SET_IP(IP-3); patchersuper_rewrite(IP); +\ other patchers for lazy resolving + PATCHER_MULTIANEWARRAY ( #aClass #iSize #acr ... -- ) stackframeinfo sfi; bool result; @@ -1585,17 +1820,17 @@ fp = acelloldfp; SET_IP(ainstoldip); { Cell v = sp[0]; -u1 *fp = codegen_findmethod((u1 *) (IP - 1)); -methodinfo *m = ((methodinfo **) fp)[-1]; float f; vm_Cell2f(v,f); -builtin_displaymethodstop(m, (s8) v, f, f); +#if !defined(NDEBUG) +builtin_displaymethodstop(am, (s8) v, f, f); +#endif } if (*exceptionptr) THROW0; PATCHER_NATIVECALL ( #am #af #addrcif ... -- ) -#if !defined(ENABLE_STATICVM) +#if !defined(WITH_STATIC_CLASSPATH) stackframeinfo sfi; bool result; global_sp = sp; @@ -1606,16 +1841,15 @@ CLEAR_global_sp; if (!result) THROW0; STORE_ORDER_BARRIER(); -IP[-4] = runverbose ? INST_ADDR(TRACENATIVECALL) : INST_ADDR(NATIVECALL); +IP[-4] = opt_verbosecall ? INST_ADDR(TRACENATIVECALL) : INST_ADDR(NATIVECALL); SET_IP(IP - 4); patchersuper_rewrite(IP); #else assert(false); #endif -TRACECALL ( -- ) -u1 *f = codegen_findmethod((u1 *) (IP - 1)); -methodinfo *m = ((methodinfo **) f)[-1]; +TRACECALL ( #am -- ) +#if !defined(NDEBUG) builtin_trace_args( access_local_cell(0 * -SIZEOF_VOID_P), access_local_cell(1 * -SIZEOF_VOID_P), @@ -1629,21 +1863,22 @@ builtin_trace_args( access_local_cell(6 * -SIZEOF_VOID_P), access_local_cell(7 * -SIZEOF_VOID_P), #endif - m); + am); +#endif /* !defined(NDEBUG) */ -TRACERETURN ( v -- v ) -u1 *fp = codegen_findmethod((u1 *) (IP - 1)); -methodinfo *m = ((methodinfo **) fp)[-1]; +TRACERETURN ( #am v -- v ) float f; vm_Cell2f(v,f); -builtin_displaymethodstop(m, (s8) v, f, f); +#if !defined(NDEBUG) +builtin_displaymethodstop(am, (s8) v, f, f); +#endif -TRACELRETURN ( l -- l ) -u1 *fp = codegen_findmethod((u1 *) (IP - 1)); -methodinfo *m = ((methodinfo **) fp)[-1]; +TRACELRETURN ( #am l -- l ) Double_Store ds; ds.l = l; -builtin_displaymethodstop(m, l, ds.d, ds.d); +#if !defined(NDEBUG) +builtin_displaymethodstop(am, l, ds.d, ds.d); +#endif END ( ... -- ) global_sp = sp;