diff -r 5e61d64d83a9 src/vm/jit/x86_64/codegen.c --- a/src/vm/jit/x86_64/codegen.c Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/x86_64/codegen.c Wed Jun 11 23:33:37 2008 +0200 @@ -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 @@ 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: diff -r 5e61d64d83a9 src/vm/jit/x86_64/codegen.h --- a/src/vm/jit/x86_64/codegen.h Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/x86_64/codegen.h Wed Jun 11 23:33:37 2008 +0200 @@ -256,6 +256,7 @@ #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)) diff -r 5e61d64d83a9 src/vm/jit/x86_64/emit.c --- a/src/vm/jit/x86_64/emit.c Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/x86_64/emit.c Wed Jun 11 23:33:37 2008 +0200 @@ -1179,6 +1179,16 @@ } +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)); diff -r 5e61d64d83a9 src/vm/jit/x86_64/emit.h --- a/src/vm/jit/x86_64/emit.h Mon Jun 09 17:34:41 2008 +0200 +++ b/src/vm/jit/x86_64/emit.h Wed Jun 11 23:33:37 2008 +0200 @@ -219,6 +219,7 @@ 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);