1.1 --- a/public/jit/x86/x86_macros.h Fri May 04 21:21:55 2007 +0000
1.2 +++ b/public/jit/x86/x86_macros.h Fri May 04 21:39:05 2007 +0000
1.3 @@ -92,6 +92,8 @@
1.4 #define IA32_MOV_RM8_REG 0x88 // encoding is /r
1.5 #define IA32_MOV_RM_REG 0x89 // encoding is /r
1.6 #define IA32_MOV_REG_MEM 0x8B // encoding is /r
1.7 +#define IA32_MOV_REG8_RM8 0x8A // encoding is /r
1.8 +#define IA32_MOV_RM8_REG8 0x88 // encoding is /r
1.9 #define IA32_MOV_RM_IMM32 0xC7 // encoding is /0
1.10 #define IA32_CMP_RM_IMM32 0x81 // encoding is /7 <imm32>
1.11 #define IA32_CMP_RM_IMM8 0x83 // encoding is /7 <imm8>
1.12 @@ -149,6 +151,10 @@
1.13 #define IA32_POPAD 0x61 // no extra encoding
1.14 #define IA32_NOP 0x90 // no extra encoding
1.15 #define IA32_INT3 0xCC // no extra encoding
1.16 +#define IA32_FSTP_MEM32 0xD9 // encoding is /3
1.17 +#define IA32_FSTP_MEM64 0xDD // encoding is /3
1.18 +#define IA32_FLD_MEM32 0xD9 // encoding is /0
1.19 +#define IA32_FLD_MEM64 0xDD // encoding is /0
1.20
1.21 inline jit_uint8_t ia32_modrm(jit_uint8_t mode, jit_uint8_t reg, jit_uint8_t rm)
1.22 {
1.23 @@ -629,6 +635,19 @@
1.24 jit->write_byte(val);
1.25 }
1.26
1.27 +inline void IA32_Lea_Reg_DispRegMultImm32(JitWriter *jit,
1.28 + jit_uint8_t dest,
1.29 + jit_uint8_t src_base,
1.30 + jit_uint8_t src_index,
1.31 + jit_uint8_t scale,
1.32 + jit_int32_t val)
1.33 +{
1.34 + jit->write_ubyte(IA32_LEA_REG_MEM);
1.35 + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, REG_SIB));
1.36 + jit->write_ubyte(ia32_sib(scale, src_index, src_base));
1.37 + jit->write_int32(val);
1.38 +}
1.39 +
1.40 inline void IA32_Lea_Reg_RegMultImm32(JitWriter *jit,
1.41 jit_uint8_t dest,
1.42 jit_uint8_t src_index,
1.43 @@ -716,6 +735,12 @@
1.44 jit->write_ubyte(ia32_modrm(mode, dest, src));
1.45 }
1.46
1.47 +inline void IA32_Mov_Reg8_Rm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
1.48 +{
1.49 + jit->write_ubyte(IA32_MOV_REG8_RM8);
1.50 + jit->write_ubyte(ia32_modrm(mode, dest, src));
1.51 +}
1.52 +
1.53 inline void IA32_Mov_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
1.54 {
1.55 jit->write_ubyte(IA32_MOV_REG_MEM);
1.56 @@ -723,6 +748,13 @@
1.57 jit->write_byte(disp);
1.58 }
1.59
1.60 +inline void IA32_Mov_Reg8_Rm8_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
1.61 +{
1.62 + jit->write_ubyte(IA32_MOV_REG8_RM8);
1.63 + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
1.64 + jit->write_byte(disp);
1.65 +}
1.66 +
1.67 inline void IA32_Mov_Reg_Esp_Disp8(JitWriter *jit, jit_uint8_t dest, jit_int8_t disp)
1.68 {
1.69 jit->write_ubyte(IA32_MOV_REG_MEM);
1.70 @@ -738,6 +770,13 @@
1.71 jit->write_int32(disp);
1.72 }
1.73
1.74 +inline void IA32_Mov_Reg8_Rm8_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
1.75 +{
1.76 + jit->write_ubyte(IA32_MOV_REG8_RM8);
1.77 + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
1.78 + jit->write_int32(disp);
1.79 +}
1.80 +
1.81 inline void IA32_Mov_Reg_Rm_Disp_Reg(JitWriter *jit,
1.82 jit_uint8_t dest,
1.83 jit_uint8_t src_base,
1.84 @@ -784,6 +823,12 @@
1.85 jit->write_ubyte(ia32_modrm(mode, src, dest));
1.86 }
1.87
1.88 +inline void IA32_Mov_Rm8_Reg8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
1.89 +{
1.90 + jit->write_ubyte(IA32_MOV_RM8_REG8);
1.91 + jit->write_ubyte(ia32_modrm(mode, src, dest));
1.92 +}
1.93 +
1.94 inline void IA32_Mov_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
1.95 {
1.96 jit->write_ubyte(IA32_MOV_RM_REG);
1.97 @@ -891,6 +936,52 @@
1.98 }
1.99
1.100 /**
1.101 +* Floating Point Instructions
1.102 +*/
1.103 +
1.104 +inline void IA32_Fstp_Mem32(JitWriter *jit, jit_uint8_t dest_base, jit_uint8_t dest_index, jit_uint8_t dest_scale)
1.105 +{
1.106 + jit->write_ubyte(IA32_FSTP_MEM32);
1.107 + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, REG_SIB));
1.108 + jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
1.109 +}
1.110 +
1.111 +inline void IA32_Fstp_Mem64(JitWriter *jit, jit_uint8_t dest_base, jit_uint8_t dest_index, jit_uint8_t dest_scale)
1.112 +{
1.113 + jit->write_ubyte(IA32_FSTP_MEM64);
1.114 + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, REG_SIB));
1.115 + jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
1.116 +}
1.117 +
1.118 +inline void IA32_Fld_Mem32_Disp8(JitWriter *jit, jit_uint8_t dest, jit_int8_t val)
1.119 +{
1.120 + jit->write_ubyte(IA32_FLD_MEM32);
1.121 + jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
1.122 + jit->write_byte(val);
1.123 +}
1.124 +
1.125 +inline void IA32_Fld_Mem64_Disp8(JitWriter *jit, jit_uint8_t dest, jit_int8_t val)
1.126 +{
1.127 + jit->write_ubyte(IA32_FLD_MEM64);
1.128 + jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
1.129 + jit->write_byte(val);
1.130 +}
1.131 +
1.132 +inline void IA32_Fld_Mem32_Disp32(JitWriter *jit, jit_uint8_t dest, jit_int32_t val)
1.133 +{
1.134 + jit->write_ubyte(IA32_FLD_MEM32);
1.135 + jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, dest));
1.136 + jit->write_int32(val);
1.137 +}
1.138 +
1.139 +inline void IA32_Fld_Mem64_Disp32(JitWriter *jit, jit_uint8_t dest, jit_int32_t val)
1.140 +{
1.141 + jit->write_ubyte(IA32_FLD_MEM64);
1.142 + jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, dest));
1.143 + jit->write_int32(val);
1.144 +}
1.145 +
1.146 +/**
1.147 * Branching/Jumping
1.148 */
1.149