Fixes PR72.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Wed, 11 Jun 2008 21:41:10 +0000 (23:41 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Wed, 11 Jun 2008 21:41:10 +0000 (23:41 +0200)
* src/vm/jit/i386/codegen.c (codegen_emit_stub_native): Return value
expansion in native stubs (for gcc 4.3).
* src/vm/jit/x86_64/codegen.c (codegen_emit_stub_native): Likewise.

* src/vm/jit/i386/codegen.h: Added more value extension operations.
* src/vm/jit/i386/emit.c: Likewise.
* src/vm/jit/i386/emit.h: Likewise.
* src/vm/jit/x86_64/codegen.h: Likewise.
* src/vm/jit/x86_64/emit.c: Likewise.
* src/vm/jit/x86_64/emit.h: Likewise.

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

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 a93f42b5234c24d7bb0165d0663931ecb6419925..b81fd9486ecc4f6fdfbd9ef92758e260cb925f5d 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"
 
@@ -3054,6 +3055,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 add6b306a1df7f94eabd069e79f4a5db88bca874..17d4edbd748369d93070e0fa29d4b40922262ddf 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 60e5f342d83933740c4e97524b90ef24aaf7622d..68437334bc9361083f5ef19a682d75a60116d567 100644 (file)
@@ -1179,6 +1179,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 24239e431eacba210eb2337368770e55eadb2747..34bb44d055f219a0e1007c07b77387609160ddf6 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);