X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fx86_64%2Fcodegen.h;h=8262812b0420187411b3e08da0558cae58094cb0;hb=9d612db38eb5c652e2d9a96ad4fbe779af786653;hp=ea29b9851debc3795e86e05c9b330579187ef8f3;hpb=0af4b820de8f4731c77e9cf5b82f7566c5d38a77;p=cacao.git diff --git a/src/vm/jit/x86_64/codegen.h b/src/vm/jit/x86_64/codegen.h index ea29b9851..8262812b0 100644 --- a/src/vm/jit/x86_64/codegen.h +++ b/src/vm/jit/x86_64/codegen.h @@ -22,8 +22,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: codegen.h 7691 2007-04-12 12:45:10Z twisti $ - */ @@ -124,25 +122,36 @@ /* patcher defines ************************************************************/ -#define PATCHER_CALL_SIZE 5 /* size in bytes of a patcher call */ +#define PATCHER_CALL_SIZE 2 /* size in bytes of a patcher call */ #define PATCHER_NOPS \ do { \ M_NOP; \ M_NOP; \ - M_NOP; \ - M_NOP; \ - M_NOP; \ } while (0) /* stub defines ***************************************************************/ -#define COMPILERSTUB_CODESIZE 7 + 7 + 3 +#define COMPILERSTUB_CODESIZE 8 /* macros to create code ******************************************************/ +#define M_BYTE1(a) \ + do { \ + *(cd->mcodeptr) = (a); \ + cd->mcodeptr++; \ + } while (0) + + +#define M_BYTE2(a, b) \ + do { \ + M_BYTE1(a); \ + M_BYTE1(b); \ + } while (0) + + #define M_MOV(a,b) emit_mov_reg_reg(cd, (a), (b)) #define M_MOV_IMM(a,b) emit_mov_imm_reg(cd, (u8) (a), (b)) @@ -186,9 +195,17 @@ #define M_LMUL_IMM(a,b,c) emit_imul_imm_reg_reg(cd, (b), (a), (c)) #define M_IINC(a) emit_incl_reg(cd, (a)) +#define M_LINC(a) emit_incq_reg(cd, (a)) #define M_IDEC(a) emit_decl_reg(cd, (a)) -#define M_ALD(a,b,disp) M_LLD(a,b,disp) +#define M_ALD(a,b,disp) \ + do { \ + if (b == RIP) \ + M_LLD(a, b, disp + -((cd->mcodeptr + 7) - cd->mcodebase)); \ + else \ + M_LLD(a, b, disp); \ + } while (0) + #define M_ALD32(a,b,disp) M_LLD32(a,b,disp) #define M_ALD_MEM(a,disp) emit_mov_mem_reg(cd, (disp), (a)) @@ -240,6 +257,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)) @@ -276,6 +294,7 @@ #define M_BUGE(disp) emit_jcc(cd, CC_AE, (disp)) #define M_BUGT(disp) emit_jcc(cd, CC_A, (disp)) +#define M_SETE(a) emit_setcc_reg(cd, CC_E, (a)) #define M_SETNE(a) emit_setcc_reg(cd, CC_NE, (a)) #define M_SETULE(a) emit_setcc_reg(cd, CC_BE, (a)) @@ -296,11 +315,13 @@ #define M_JMP(a) emit_jmp_reg(cd, (a)) #define M_JMP_IMM(a) emit_jmp_imm(cd, (a)) +#define M_JMP_IMM2(a) emit_jmp_imm2(cd, (a)) #define M_CALL(a) emit_call_reg(cd, (a)) #define M_CALL_IMM(a) emit_call_imm(cd, (a)) -#define M_RET emit_ret(cd) +#define M_RET M_BYTE1(0xc3) -#define M_NOP emit_nop(cd) +#define M_NOP M_BYTE1(0x90) +#define M_UD2 M_BYTE2(0x0f, 0x0b) #define M_CLR(a) M_LXOR(a,a) @@ -344,6 +365,7 @@ #define M_RDTSC emit_rdtsc(cd) #define M_IINC_MEMBASE(a,b) emit_incl_membase(cd, (a), (b)) +#define M_LINC_MEMBASE(a,b) emit_incq_membase(cd, (a), (b)) #define M_IADD_MEMBASE(a,b,c) emit_alul_reg_membase(cd, ALU_ADD, (a), (b), (c)) #define M_IADC_MEMBASE(a,b,c) emit_alul_reg_membase(cd, ALU_ADC, (a), (b), (c))