Merged PR72 fix.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 15 Sep 2008 06:59:32 +0000 (08:59 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 15 Sep 2008 06:59:32 +0000 (08:59 +0200)
--HG--
branch : subtype

12 files changed:
src/mm/boehm-gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/arm.h
src/native/jni.c
src/vm/jit/arm/emit.c
src/vm/jit/i386/codegen.c
src/vm/jit/i386/codegen.h
src/vm/jit/i386/emit.c
src/vm/jit/i386/emit.h
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/codegen.h
src/vm/jit/x86_64/emit.c
src/vm/jit/x86_64/emit.h
tests/havoc.class [deleted file]

index c502d4d4405367eb9ec917bb485924a2b97cb34f..d5bb1129d9e8eca5d0e08784375f3a4b31830e4a 100644 (file)
@@ -247,4 +247,5 @@ AO_test_and_set_full(volatile AO_TS_t *addr) {
 
 #define AO_HAVE_test_and_set_full
 
-#endif // __ARM_ARCH_x
+#endif /* __ARM_ARCH_x */
+
index 2a7e3d71a6042639be557dbe6b0737aa5178398f..392126e17f902b09a60473c47487cf156d47c358 100644 (file)
@@ -3933,9 +3933,9 @@ jint _Jv_JNI_DetachCurrentThread(JavaVM *vm)
 
 *******************************************************************************/
 
-jint _Jv_JNI_GetEnv(JavaVM *vm, void **env, jint version)
+jint jni_GetEnv(JavaVM *vm, void **env, jint version)
 {
-       TRACEJNICALLS(("_Jv_JNI_GetEnv(vm=%p, env=%p, %d=version)", vm, env, version));
+       TRACEJNICALLS(("jni_GetEnv(vm=%p, env=%p, version=%d)", vm, env, version));
 
        if (vm_created == false) {
                *env = NULL;
@@ -4012,7 +4012,7 @@ const struct JNIInvokeInterface_ _Jv_JNIInvokeInterface = {
        _Jv_JNI_DestroyJavaVM,
        _Jv_JNI_AttachCurrentThread,
        _Jv_JNI_DetachCurrentThread,
-       _Jv_JNI_GetEnv,
+       jni_GetEnv,
        _Jv_JNI_AttachCurrentThreadAsDaemon
 };
 
index 4caac6dd7a2e01321fd6428b92dd50be3eba98a5..293731cfc473c70f509f46f2cbaf1f5fe3e475f9 100644 (file)
@@ -634,6 +634,19 @@ void emit_verbosecall_enter(jitdata *jd)
                if (!md->params[i].inmemory) {
                        s = md->params[i].regoff;
 
+#if defined(ENABLE_SOFTFLOAT)
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_FLT:
+                       case TYPE_ADR:
+                               M_IST(s, REG_SP, i * 8);
+                               break;
+                       case TYPE_LNG:
+                       case TYPE_DBL:
+                               M_LST(s, REG_SP, i * 8);
+                               break;
+                       }
+#else
                        switch (md->paramtypes[i].type) {
                        case TYPE_ADR:
                        case TYPE_INT:
@@ -649,6 +662,7 @@ void emit_verbosecall_enter(jitdata *jd)
                                M_DST(s, REG_SP, i * 8);
                                break;
                        }
+#endif
                }
        }
 
@@ -664,6 +678,19 @@ void emit_verbosecall_enter(jitdata *jd)
                if (!md->params[i].inmemory) {
                        s = md->params[i].regoff;
 
+#if defined(ENABLE_SOFTFLOAT)
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_FLT:
+                       case TYPE_ADR:
+                               M_ILD(s, REG_SP, i * 8);
+                               break;
+                       case TYPE_LNG:
+                       case TYPE_DBL:
+                               M_LLD(s, REG_SP, i * 8);
+                               break;
+                       }
+#else
                        switch (md->paramtypes[i].type) {
                        case TYPE_ADR:
                        case TYPE_INT:
@@ -679,6 +706,7 @@ void emit_verbosecall_enter(jitdata *jd)
                                M_DLD(s, REG_SP, i * 8);
                                break;
                        }
+#endif
                }
        }
 
index 3480eac59317076d0b88dda375c4fb2ce3d560f4..5123b4b230140158ad270b3b14e9ebf5b36493d2 100644 (file)
@@ -46,6 +46,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
+#include "vm/primitive.h"
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
 
@@ -3637,6 +3638,20 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        switch (md->returntype.type) {
        case TYPE_INT:
        case TYPE_ADR:
+               switch (md->returntype.decltype) {
+               case PRIMITIVETYPE_BOOLEAN:
+                       M_BZEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_BYTE:
+                       M_BSEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_CHAR:
+                       M_CZEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_SHORT:
+                       M_SSEXT(REG_RESULT, REG_RESULT);
+                       break;
+               }
                M_IST(REG_RESULT, REG_SP, 1 * 8);
                break;
        case TYPE_LNG:
index 9d3b3051797189d5559538f323f381455f33da3c..eb7ab8047fe76c0ef7479e827d5ee16aedff7b25 100644 (file)
 
 #define M_CMP_IMM32(a,b)        emit_alu_imm32_reg(cd, ALU_CMP, (a), (b))
 
-#define M_BSEXT(a,b)            /* XXX does not work, because of nibbles */
+#define M_BSEXT(a,b)            emit_movsbl_reg_reg(cd, (a), (b))
 #define M_SSEXT(a,b)            emit_movswl_reg_reg(cd, (a), (b))
 
+#define M_BZEXT(a,b)            emit_movzbl_reg_reg(cd, (a), (b))
 #define M_CZEXT(a,b)            emit_movzwl_reg_reg(cd, (a), (b))
 
 #define M_CLTD                  M_BYTE1(0x99)
index ae20ab6ebf72bd2f3a121e3236eca8c7e2981969..74e7f493f4868c06c0bf437314c13f48d0dfca88 100644 (file)
@@ -913,6 +913,15 @@ void emit_movb_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp)
 }
 
 
+void emit_movsbl_reg_reg(codegendata *cd, s4 a, s4 b)
+{
+       assert(a < 4);                     /* Can only operate on al, bl, cl, dl. */
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0xbe;
+       emit_reg((b),(a));
+}
+
+
 void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
 {
        COUNT(count_mov_mem_reg);
@@ -939,6 +948,15 @@ void emit_movswl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg,
 }
 
 
+void emit_movzbl_reg_reg(codegendata *cd, s4 a, s4 b)
+{
+       assert(a < 4);                     /* Can only operate on al, bl, cl, dl. */
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0xb6;
+       emit_reg((b),(a));
+}
+
+
 void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b)
 {
        *(cd->mcodeptr++) = 0x0f;
index 4a5fd13da4ec5f8a2718e55954e13201de819133..8082aab78459e68b3e109c827dcd1dcd27f21887 100644 (file)
@@ -169,9 +169,11 @@ void emit_mov_imm_mem(codegendata *cd, s4 imm, s4 mem);
 void emit_mov_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
 void emit_mov_imm_membase32(codegendata *cd, s4 imm, s4 basereg, s4 disp);
 void emit_movb_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
+void emit_movsbl_reg_reg(codegendata *cd, s4 a, s4 b);
 void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
 void emit_movswl_reg_reg(codegendata *cd, s4 a, s4 b);
 void emit_movswl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
+void emit_movzbl_reg_reg(codegendata *cd, s4 a, s4 b);
 void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b);
 void emit_movzwl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
 void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
index f92469541722cafd884f72048e03905588f9755f..5ef87728158078f3e54854a7c9fbfb8702c79ba3 100644 (file)
@@ -50,6 +50,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
+#include "vm/primitive.h"
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
 
@@ -3146,6 +3147,20 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        case TYPE_INT:
        case TYPE_LNG:
        case TYPE_ADR:
+               switch (md->returntype.decltype) {
+               case PRIMITIVETYPE_BOOLEAN:
+                       M_BZEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_BYTE:
+                       M_BSEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_CHAR:
+                       M_CZEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_SHORT:
+                       M_SSEXT(REG_RESULT, REG_RESULT);
+                       break;
+               }
                M_LST(REG_RESULT, REG_SP, 0 * 8);
                break;
        case TYPE_FLT:
index 2566bd60ea3e9d301f5d5e8cd094f5071fab7e19..8262812b0420187411b3e08da0558cae58094cb0 100644 (file)
 #define M_SSEXT(a,b)            emit_movswq_reg_reg(cd, (a), (b))
 #define M_ISEXT(a,b)            emit_movslq_reg_reg(cd, (a), (b))
 
+#define M_BZEXT(a,b)            emit_movzbq_reg_reg(cd, (a), (b))
 #define M_CZEXT(a,b)            emit_movzwq_reg_reg(cd, (a), (b))
 
 #define M_ISLL_IMM(a,b)         emit_shiftl_imm_reg(cd, SHIFT_SHL, (a), (b))
index 935d28c2c2caa2080cce9e34e2489fab89bd399c..b63551e54a85747db5d5bcc581154732169dbcf6 100644 (file)
@@ -1185,6 +1185,16 @@ void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
 }
 
 
+void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
+{
+       emit_rex(1,(dreg),0,(reg));
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0xb6;
+       /* XXX: why do reg and dreg have to be exchanged */
+       emit_reg((dreg),(reg));
+}
+
+
 void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
 {
        emit_rex(1,(dreg),0,(reg));
index 239bf5d1d039ec47c5ffd23a52e65a801cd76dcf..f75ac208efda1871979526a904028222430c9c1c 100644 (file)
@@ -219,6 +219,7 @@ void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
 void emit_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
 void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
 void emit_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
+void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
 void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
 void emit_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
 void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);
diff --git a/tests/havoc.class b/tests/havoc.class
deleted file mode 100644 (file)
index 2de69f3..0000000
Binary files a/tests/havoc.class and /dev/null differ