* src/vm/hashtable.h,
[cacao.git] / src / vm / jit / intrp / java.vmg
index c23e2689407be3d7ec70e1440a1916a6a5d29730..ca87e61c0611a9267f7d603ea6aff535b2396dc7 100644 (file)
@@ -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;