diff -r 5e61d64d83a9 src/vm/jit/i386/codegen.c --- a/src/vm/jit/i386/codegen.c Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/i386/codegen.c Thu Jun 12 00:21:47 2008 +0200 @@ -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 *j 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: diff -r 5e61d64d83a9 src/vm/jit/i386/codegen.h --- a/src/vm/jit/i386/codegen.h Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/i386/codegen.h Thu Jun 12 00:21:47 2008 +0200 @@ -296,9 +296,10 @@ #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) diff -r 5e61d64d83a9 src/vm/jit/i386/emit.c --- a/src/vm/jit/i386/emit.c Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/i386/emit.c Thu Jun 12 00:21:47 2008 +0200 @@ -913,6 +913,15 @@ void emit_movb_imm_membase(codegendata * } +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); @@ -936,6 +945,15 @@ void emit_movswl_memindex_reg(codegendat *(cd->mcodeptr++) = 0x0f; *(cd->mcodeptr++) = 0xbf; emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale)); +} + + +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)); } diff -r 5e61d64d83a9 src/vm/jit/i386/emit.h --- a/src/vm/jit/i386/emit.h Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/i386/emit.h Thu Jun 12 00:21:47 2008 +0200 @@ -169,9 +169,11 @@ void emit_mov_imm_membase(codegendata *c 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);