00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _INCLUDE_JIT_X86_MACROS_H
00033 #define _INCLUDE_JIT_X86_MACROS_H
00034
00035 #include <limits.h>
00036
00037
00038 #define MOD_MEM_REG 0
00039 #define MOD_DISP8 1
00040 #define MOD_DISP32 2
00041 #define MOD_REG 3
00042
00043
00044 #define NOSCALE 0
00045 #define SCALE2 1
00046 #define SCALE4 2
00047 #define SCALE8 3
00048
00049
00050 #define REG_EAX 0
00051 #define REG_ECX 1
00052 #define REG_EDX 2
00053 #define REG_EBX 3
00054 #define REG_ESP 4
00055 #define REG_SIB 4
00056 #define REG_NOIDX 4
00057 #define REG_IMM_BASE 5
00058 #define REG_EBP 5
00059 #define REG_ESI 6
00060 #define REG_EDI 7
00061
00062 #define IA32_16BIT_PREFIX 0x66
00063
00064
00065 #define CC_B 0x2
00066 #define CC_NAE CC_B
00067 #define CC_NB 0x3
00068 #define CC_AE CC_NB
00069 #define CC_E 0x4
00070 #define CC_Z CC_E
00071 #define CC_NE 0x5
00072 #define CC_NZ CC_NE
00073 #define CC_NA 0x6
00074 #define CC_BE CC_NA
00075 #define CC_A 0x7
00076 #define CC_NBE CC_A
00077 #define CC_L 0xC
00078 #define CC_NGE CC_L
00079 #define CC_NL 0xD
00080 #define CC_GE CC_NL
00081 #define CC_NG 0xE
00082 #define CC_LE CC_NG
00083 #define CC_G 0xF
00084 #define CC_NLE CC_G
00085
00086
00087 #define IA32_XOR_RM_REG 0x31 // encoding is /r
00088 #define IA32_XOR_REG_RM 0x33 // encoding is /r
00089 #define IA32_XOR_EAX_IMM32 0x35 // encoding is /r
00090 #define IA32_XOR_RM_IMM32 0x81 // encoding is /6
00091 #define IA32_XOR_RM_IMM8 0x83 // encoding is /6
00092 #define IA32_ADD_RM_REG 0x01 // encoding is /r
00093 #define IA32_ADD_REG_RM 0x03 // encoding is /r
00094 #define IA32_ADD_RM_IMM32 0x81 // encoding is /0
00095 #define IA32_ADD_RM_IMM8 0x83 // encoding is /0
00096 #define IA32_ADD_EAX_IMM32 0x05 // no extra encoding
00097 #define IA32_SUB_RM_REG 0x29 // encoding is /r
00098 #define IA32_SUB_REG_RM 0x2B // encoding is /r
00099 #define IA32_SUB_RM_IMM8 0x83 // encoding is /5 <imm8>
00100 #define IA32_SUB_RM_IMM32 0x81 // encoding is /5 <imm32>
00101 #define IA32_SBB_REG_RM 0x1B // encoding is /r
00102 #define IA32_SBB_RM_IMM8 0x83 // encoding is <imm32>
00103 #define IA32_JMP_IMM32 0xE9 // encoding is imm32
00104 #define IA32_JMP_IMM8 0xEB // encoding is imm8
00105 #define IA32_JMP_RM 0xFF // encoding is /4
00106 #define IA32_CALL_IMM32 0xE8 // relative call, <imm32>
00107 #define IA32_CALL_RM 0xFF // encoding is /2
00108 #define IA32_MOV_REG_IMM 0xB8 // encoding is +r <imm32>
00109 #define IA32_MOV_RM8_REG 0x88 // encoding is /r
00110 #define IA32_MOV_RM_REG 0x89 // encoding is /r
00111 #define IA32_MOV_REG_RM 0x8B // encoding is /r
00112 #define IA32_MOV_REG8_RM8 0x8A // encoding is /r
00113 #define IA32_MOV_RM8_REG8 0x88 // encoding is /r
00114 #define IA32_MOV_RM_IMM32 0xC7 // encoding is /0
00115 #define IA32_MOV_EAX_MEM 0xA1 // encoding is <imm32>
00116 #define IA32_CMP_RM_IMM32 0x81 // encoding is /7 <imm32>
00117 #define IA32_CMP_RM_IMM8 0x83 // encoding is /7 <imm8>
00118 #define IA32_CMP_AL_IMM32 0x3C // no extra encoding
00119 #define IA32_CMP_EAX_IMM32 0x3D // no extra encoding
00120 #define IA32_CMP_RM_REG 0x39 // encoding is /r
00121 #define IA32_CMP_REG_RM 0x3B // encoding is /r
00122 #define IA32_CMPSB 0xA6 // no extra encoding
00123 #define IA32_TEST_RM_REG 0x85 // encoding is /r
00124 #define IA32_JCC_IMM 0x70 // encoding is +cc <imm8>
00125 #define IA32_JCC_IMM32_1 0x0F // opcode part 1
00126 #define IA32_JCC_IMM32_2 0x80 // encoding is +cc <imm32>
00127 #define IA32_RET 0xC3 // no extra encoding
00128 #define IA32_RETN 0xC2 // encoding is <imm16>
00129 #define IA32_NEG_RM 0xF7 // encoding is /3
00130 #define IA32_INC_REG 0x40 // encoding is +r
00131 #define IA32_INC_RM 0xFF // encoding is /0
00132 #define IA32_DEC_REG 0x48 // encoding is +r
00133 #define IA32_DEC_RM 0xFF // encoding is /1
00134 #define IA32_OR_REG_RM 0x0B // encoding is /r
00135 #define IA32_AND_REG_RM 0x23 // encoding is /r
00136 #define IA32_AND_EAX_IMM32 0x25 // encoding is <imm32>
00137 #define IA32_AND_RM_IMM32 0x81 // encoding is /4
00138 #define IA32_AND_RM_IMM8 0x83 // encoding is /4
00139 #define IA32_NOT_RM 0xF7 // encoding is /2
00140 #define IA32_DIV_RM 0xF7 // encoding is /6
00141 #define IA32_MUL_RM 0xF7 // encoding is /4
00142 #define IA32_IDIV_RM 0xF7 // encoding is /7
00143 #define IA32_IMUL_RM 0xF7 // encoding is /5
00144 #define IA32_IMUL_REG_IMM32 0x69 // encoding is /r
00145 #define IA32_IMUL_REG_IMM8 0x6B // encoding is /r
00146 #define IA32_IMUL_REG_RM_1 0x0F // encoding is _2
00147 #define IA32_IMUL_REG_RM_2 0xAF // encoding is /r
00148 #define IA32_SHR_RM_IMM8 0xC1 // encoding is /5 <ib>
00149 #define IA32_SHR_RM_1 0xD1 // encoding is /5
00150 #define IA32_SHL_RM_IMM8 0xC1 // encoding is /4 <ib>
00151 #define IA32_SHL_RM_1 0xD1 // encoding is /4
00152 #define IA32_SAR_RM_CL 0xD3 // encoding is /7
00153 #define IA32_SAR_RM_1 0xD1 // encoding is /7
00154 #define IA32_SHR_RM_CL 0xD3 // encoding is /5
00155 #define IA32_SHL_RM_CL 0xD3 // encoding is /4
00156 #define IA32_SAR_RM_IMM8 0xC1 // encoding is /7 <ib>
00157 #define IA32_SETCC_RM8_1 0x0F // opcode part 1
00158 #define IA32_SETCC_RM8_2 0x90 // encoding is +cc /0 (8bits)
00159 #define IA32_CMOVCC_RM_1 0x0F // opcode part 1
00160 #define IA32_CMOVCC_RM_2 0x40 // encoding is +cc /r
00161 #define IA32_XCHG_EAX_REG 0x90 // encoding is +r
00162 #define IA32_LEA_REG_MEM 0x8D // encoding is /r
00163 #define IA32_POP_REG 0x58 // encoding is +r
00164 #define IA32_PUSH_REG 0x50 // encoding is +r
00165 #define IA32_PUSH_RM 0xFF // encoding is /6
00166 #define IA32_PUSH_IMM32 0x68 // encoding is <imm32>
00167 #define IA32_PUSH_IMM8 0x6A // encoding is <imm8>
00168 #define IA32_REP 0xF3 // no extra encoding
00169 #define IA32_MOVSD 0xA5 // no extra encoding
00170 #define IA32_MOVSB 0xA4 // no extra encoding
00171 #define IA32_STOSD 0xAB // no extra encoding
00172 #define IA32_CLD 0xFC // no extra encoding
00173 #define IA32_PUSHAD 0x60 // no extra encoding
00174 #define IA32_POPAD 0x61 // no extra encoding
00175 #define IA32_NOP 0x90 // no extra encoding
00176 #define IA32_INT3 0xCC // no extra encoding
00177 #define IA32_FSTP_MEM32 0xD9 // encoding is /3
00178 #define IA32_FSTP_MEM64 0xDD // encoding is /3
00179 #define IA32_FLD_MEM32 0xD9 // encoding is /0
00180 #define IA32_FLD_MEM64 0xDD // encoding is /0
00181 #define IA32_FILD_MEM32 0xDB // encoding is /0
00182 #define IA32_FADD_MEM32 0xD8 // encoding is /0
00183 #define IA32_FADD_FPREG_ST0_1 0xDC // opcode part 1
00184 #define IA32_FADD_FPREG_ST0_2 0xC0 // encoding is +r
00185 #define IA32_FSUB_MEM32 0xD8 // encoding is /4
00186 #define IA32_FMUL_MEM32 0xD8 // encoding is /1
00187 #define IA32_FDIV_MEM32 0xD8 // encoding is /6
00188 #define IA32_FSTCW_MEM16_1 0x9B // opcode part 1
00189 #define IA32_FSTCW_MEM16_2 0xD9 // encoding is /7
00190 #define IA32_FLDCW_MEM16 0xD9 // encoding is /5
00191 #define IA32_FISTP_MEM32 0xDB // encoding is /3
00192 #define IA32_FUCOMIP_1 0xDF // opcode part 1
00193 #define IA32_FUCOMIP_2 0xE8 // encoding is +r
00194 #define IA32_FSTP_FPREG_1 0xDD // opcode part 1
00195 #define IA32_FSTP_FPREG_2 0xD8 // encoding is +r
00196 #define IA32_MOVZX_R32_RM8_1 0x0F // opcode part 1
00197 #define IA32_MOVZX_R32_RM8_2 0xB6 // encoding is /r
00198 #define IA32_MOVZX_R32_RM16_1 0x0F // opcode part 1
00199 #define IA32_MOVZX_R32_RM16_2 0xB7 // encoding is /r
00200
00201 inline jit_uint8_t ia32_modrm(jit_uint8_t mode, jit_uint8_t reg, jit_uint8_t rm)
00202 {
00203 jit_uint8_t modrm = (mode << 6);
00204
00205 modrm |= (reg << 3);
00206 modrm |= (rm);
00207
00208 return modrm;
00209 }
00210
00211
00212
00213
00214 inline jit_uint8_t ia32_sib(jit_uint8_t mode, jit_uint8_t index, jit_uint8_t base)
00215 {
00216 jit_uint8_t sib = (mode << 6);
00217
00218 sib |= (index << 3);
00219 sib |= (base);
00220
00221 return sib;
00222 }
00223
00224
00225
00226
00227
00228 inline void IA32_Inc_Reg(JitWriter *jit, jit_uint8_t reg)
00229 {
00230 jit->write_ubyte(IA32_INC_REG+reg);
00231 }
00232
00233 inline void IA32_Inc_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp)
00234 {
00235 jit->write_ubyte(IA32_INC_RM);
00236 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, reg));
00237 jit->write_byte(disp);
00238 }
00239
00240 inline void IA32_Inc_Rm_Disp32(JitWriter *jit, jit_uint8_t reg, jit_int32_t disp)
00241 {
00242 jit->write_ubyte(IA32_INC_RM);
00243 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, reg));
00244 jit->write_int32(disp);
00245 }
00246
00247 inline void IA32_Inc_Rm_Disp_Reg(JitWriter *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
00248 {
00249 jit->write_ubyte(IA32_INC_RM);
00250 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
00251 jit->write_ubyte(ia32_sib(scale, reg, base));
00252 }
00253
00254 inline void IA32_Dec_Reg(JitWriter *jit, jit_uint8_t reg)
00255 {
00256 jit->write_ubyte(IA32_DEC_REG+reg);
00257 }
00258
00259 inline void IA32_Dec_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp)
00260 {
00261 jit->write_ubyte(IA32_DEC_RM);
00262 jit->write_ubyte(ia32_modrm(MOD_DISP8, 1, reg));
00263 jit->write_byte(disp);
00264 }
00265
00266 inline void IA32_Dec_Rm_Disp32(JitWriter *jit, jit_uint8_t reg, jit_int32_t disp)
00267 {
00268 jit->write_ubyte(IA32_DEC_RM);
00269 jit->write_ubyte(ia32_modrm(MOD_DISP32, 1, reg));
00270 jit->write_int32(disp);
00271 }
00272
00273 inline void IA32_Dec_Rm_Disp_Reg(JitWriter *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
00274 {
00275 jit->write_ubyte(IA32_DEC_RM);
00276 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 1, REG_SIB));
00277 jit->write_ubyte(ia32_sib(scale, reg, base));
00278 }
00279
00280
00281
00282
00283
00284 inline void IA32_Xor_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t dest_mode)
00285 {
00286 jit->write_ubyte(IA32_XOR_RM_REG);
00287 jit->write_ubyte(ia32_modrm(dest_mode, src, dest));
00288 }
00289
00290 inline void IA32_Xor_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t dest_mode)
00291 {
00292 jit->write_ubyte(IA32_XOR_REG_RM);
00293 jit->write_ubyte(ia32_modrm(dest_mode, dest, src));
00294 }
00295
00296 inline void IA32_Xor_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
00297 {
00298 jit->write_ubyte(IA32_XOR_RM_IMM8);
00299 jit->write_ubyte(ia32_modrm(mode, 6, reg));
00300 jit->write_byte(value);
00301 }
00302
00303 inline void IA32_Xor_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
00304 {
00305 jit->write_ubyte(IA32_XOR_RM_IMM32);
00306 jit->write_ubyte(ia32_modrm(mode, 6, reg));
00307 jit->write_int32(value);
00308 }
00309
00310 inline void IA32_Xor_Eax_Imm32(JitWriter *jit, jit_int32_t value)
00311 {
00312 jit->write_ubyte(IA32_XOR_EAX_IMM32);
00313 jit->write_int32(value);
00314 }
00315
00316 inline void IA32_Neg_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00317 {
00318 jit->write_ubyte(IA32_NEG_RM);
00319 jit->write_ubyte(ia32_modrm(mode, 3, reg));
00320 }
00321
00322 inline void IA32_Or_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00323 {
00324 jit->write_ubyte(IA32_OR_REG_RM);
00325 jit->write_ubyte(ia32_modrm(mode, dest, src));
00326 }
00327
00328 inline void IA32_And_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00329 {
00330 jit->write_ubyte(IA32_AND_REG_RM);
00331 jit->write_ubyte(ia32_modrm(mode, dest, src));
00332 }
00333
00334 inline void IA32_And_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
00335 {
00336 jit->write_ubyte(IA32_AND_RM_IMM32);
00337 jit->write_ubyte(ia32_modrm(mode, 4, reg));
00338 jit->write_int32(value);
00339 }
00340
00341 inline void IA32_And_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
00342 {
00343 jit->write_ubyte(IA32_AND_RM_IMM8);
00344 jit->write_ubyte(ia32_modrm(mode, 4, reg));
00345 jit->write_byte(value);
00346 }
00347
00348 inline void IA32_And_Eax_Imm32(JitWriter *jit, jit_int32_t value)
00349 {
00350 jit->write_ubyte(IA32_AND_EAX_IMM32);
00351 jit->write_int32(value);
00352 }
00353
00354 inline void IA32_Not_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00355 {
00356 jit->write_ubyte(IA32_NOT_RM);
00357 jit->write_ubyte(ia32_modrm(mode, 2, reg));
00358 }
00359
00360 inline void IA32_Shr_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
00361 {
00362 jit->write_ubyte(IA32_SHR_RM_IMM8);
00363 jit->write_ubyte(ia32_modrm(mode, 5, dest));
00364 jit->write_ubyte(value);
00365 }
00366
00367 inline void IA32_Shr_Rm_1(JitWriter *jit, jit_uint8_t dest, jit_uint8_t mode)
00368 {
00369 jit->write_ubyte(IA32_SHR_RM_1);
00370 jit->write_ubyte(ia32_modrm(mode, 5, dest));
00371 }
00372
00373 inline void IA32_Shl_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
00374 {
00375 jit->write_ubyte(IA32_SHL_RM_IMM8);
00376 jit->write_ubyte(ia32_modrm(mode, 4, dest));
00377 jit->write_ubyte(value);
00378 }
00379
00380 inline void IA32_Shl_Rm_1(JitWriter *jit, jit_uint8_t dest, jit_uint8_t mode)
00381 {
00382 jit->write_ubyte(IA32_SHL_RM_1);
00383 jit->write_ubyte(ia32_modrm(mode, 4, dest));
00384 }
00385
00386 inline void IA32_Sar_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
00387 {
00388 jit->write_ubyte(IA32_SAR_RM_IMM8);
00389 jit->write_ubyte(ia32_modrm(mode, 7, dest));
00390 jit->write_ubyte(value);
00391 }
00392
00393 inline void IA32_Sar_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00394 {
00395 jit->write_ubyte(IA32_SAR_RM_CL);
00396 jit->write_ubyte(ia32_modrm(mode, 7, reg));
00397 }
00398
00399 inline void IA32_Sar_Rm_1(JitWriter *jit, jit_uint8_t dest, jit_uint8_t mode)
00400 {
00401 jit->write_ubyte(IA32_SAR_RM_1);
00402 jit->write_ubyte(ia32_modrm(mode, 7, dest));
00403 }
00404
00405 inline void IA32_Shr_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00406 {
00407 jit->write_ubyte(IA32_SHR_RM_CL);
00408 jit->write_ubyte(ia32_modrm(mode, 5, reg));
00409 }
00410
00411 inline void IA32_Shl_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00412 {
00413 jit->write_ubyte(IA32_SHL_RM_CL);
00414 jit->write_ubyte(ia32_modrm(mode, 4, reg));
00415 }
00416
00417 inline void IA32_Xchg_Eax_Reg(JitWriter *jit, jit_uint8_t reg)
00418 {
00419 jit->write_ubyte(IA32_XCHG_EAX_REG+reg);
00420 }
00421
00422
00423
00424
00425
00426 inline void IA32_Add_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00427 {
00428 jit->write_ubyte(IA32_ADD_RM_REG);
00429 jit->write_ubyte(ia32_modrm(mode, src, dest));
00430 }
00431
00432 inline void IA32_Add_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00433 {
00434 jit->write_ubyte(IA32_ADD_REG_RM);
00435 jit->write_ubyte(ia32_modrm(mode, dest, src));
00436 }
00437
00438 inline void IA32_Add_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t value, jit_uint8_t mode)
00439 {
00440 jit->write_ubyte(IA32_ADD_RM_IMM8);
00441 jit->write_ubyte(ia32_modrm(mode, 0, reg));
00442 jit->write_byte(value);
00443 }
00444
00445 inline void IA32_Add_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t value, jit_uint8_t mode)
00446 {
00447 jit->write_ubyte(IA32_ADD_RM_IMM32);
00448 jit->write_ubyte(ia32_modrm(mode, 0, reg));
00449 jit->write_int32(value);
00450 }
00451
00452 inline void IA32_Add_Eax_Imm32(JitWriter *jit, jit_int32_t value)
00453 {
00454 jit->write_ubyte(IA32_ADD_EAX_IMM32);
00455 jit->write_int32(value);
00456 }
00457
00458 inline void IA32_Sub_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00459 {
00460 jit->write_ubyte(IA32_SUB_RM_REG);
00461 jit->write_ubyte(ia32_modrm(mode, src, dest));
00462 }
00463
00464 inline void IA32_Sub_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00465 {
00466 jit->write_ubyte(IA32_SUB_REG_RM);
00467 jit->write_ubyte(ia32_modrm(mode, dest, src));
00468 }
00469
00470 inline void IA32_Sub_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp8)
00471 {
00472 jit->write_ubyte(IA32_SUB_REG_RM);
00473 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
00474 jit->write_byte(disp8);
00475 }
00476
00477 inline void IA32_Sub_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp8)
00478 {
00479 jit->write_ubyte(IA32_SUB_RM_REG);
00480 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, dest));
00481 jit->write_byte(disp8);
00482 }
00483
00484 inline void IA32_Sub_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t val, jit_uint8_t mode)
00485 {
00486 jit->write_ubyte(IA32_SUB_RM_IMM8);
00487 jit->write_ubyte(ia32_modrm(mode, 5, reg));
00488 jit->write_byte(val);
00489 }
00490
00491 inline void IA32_Sub_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t val, jit_uint8_t mode)
00492 {
00493 jit->write_ubyte(IA32_SUB_RM_IMM32);
00494 jit->write_ubyte(ia32_modrm(mode, 5, reg));
00495 jit->write_int32(val);
00496 }
00497
00498 inline void IA32_Sbb_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00499 {
00500 jit->write_ubyte(IA32_SBB_REG_RM);
00501 jit->write_ubyte(ia32_modrm(mode, dest, src));
00502 }
00503
00504 inline void IA32_Sbb_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_int8_t value, jit_uint8_t mode)
00505 {
00506 jit->write_ubyte(IA32_SBB_RM_IMM8);
00507 jit->write_ubyte(ia32_modrm(mode, 3, dest));
00508 jit->write_byte(value);
00509 }
00510
00511 inline void IA32_Div_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00512 {
00513 jit->write_ubyte(IA32_DIV_RM);
00514 jit->write_ubyte(ia32_modrm(mode, 6, reg));
00515 }
00516
00517 inline void IA32_IDiv_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00518 {
00519 jit->write_ubyte(IA32_IDIV_RM);
00520 jit->write_ubyte(ia32_modrm(mode, 7, reg));
00521 }
00522
00523 inline void IA32_Mul_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00524 {
00525 jit->write_ubyte(IA32_MUL_RM);
00526 jit->write_ubyte(ia32_modrm(mode, 4, reg));
00527 }
00528
00529 inline void IA32_IMul_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
00530 {
00531 jit->write_ubyte(IA32_IMUL_RM);
00532 jit->write_ubyte(ia32_modrm(mode, 5, reg));
00533 }
00534
00535 inline void IA32_IMul_Reg_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
00536 {
00537 jit->write_ubyte(IA32_IMUL_REG_IMM8);
00538 jit->write_ubyte(ia32_modrm(mode, 0, reg));
00539 jit->write_byte(value);
00540 }
00541
00542 inline void IA32_IMul_Reg_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
00543 {
00544 jit->write_ubyte(IA32_IMUL_REG_IMM32);
00545 jit->write_ubyte(ia32_modrm(mode, 0, reg));
00546 jit->write_int32(value);
00547 }
00548
00549 inline void IA32_IMul_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00550 {
00551 jit->write_ubyte(IA32_IMUL_REG_RM_1);
00552 jit->write_ubyte(IA32_IMUL_REG_RM_2);
00553 jit->write_ubyte(ia32_modrm(mode, dest, src));
00554 }
00555
00556 inline void IA32_Add_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
00557 {
00558 jit->write_ubyte(IA32_ADD_RM_REG);
00559 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, dest));
00560 jit->write_byte(disp);
00561 }
00562
00563 inline void IA32_Add_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
00564 {
00565 jit->write_ubyte(IA32_ADD_REG_RM);
00566 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
00567 jit->write_byte(disp);
00568 }
00569
00570 inline void IA32_Add_Rm_Imm8_Disp8(JitWriter *jit,
00571 jit_uint8_t dest,
00572 jit_int8_t val,
00573 jit_int8_t disp8)
00574 {
00575 jit->write_ubyte(IA32_ADD_RM_IMM8);
00576 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
00577 jit->write_byte(disp8);
00578 jit->write_byte(val);
00579 }
00580
00581 inline void IA32_Add_Rm_Imm32_Disp8(JitWriter *jit,
00582 jit_uint8_t dest,
00583 jit_int32_t val,
00584 jit_int8_t disp8)
00585 {
00586 jit->write_ubyte(IA32_ADD_RM_IMM32);
00587 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
00588 jit->write_byte(disp8);
00589 jit->write_int32(val);
00590 }
00591
00592 inline jitoffs_t IA32_Add_Rm_Imm32_Later(JitWriter *jit,
00593 jit_uint8_t dest,
00594 jit_uint8_t mode)
00595 {
00596 jit->write_ubyte(IA32_ADD_RM_IMM32);
00597 jit->write_ubyte(ia32_modrm(mode, 0, dest));
00598 jitoffs_t ptr = jit->get_outputpos();
00599 jit->write_int32(0);
00600 return ptr;
00601 }
00602
00603 inline void IA32_Add_Rm_Imm8_Disp32(JitWriter *jit,
00604 jit_uint8_t dest,
00605 jit_int8_t val,
00606 jit_int32_t disp32)
00607 {
00608 jit->write_ubyte(IA32_ADD_RM_IMM8);
00609 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, dest));
00610 jit->write_int32(disp32);
00611 jit->write_byte(val);
00612 }
00613
00614 inline void IA32_Add_RmEBP_Imm8_Disp_Reg(JitWriter *jit,
00615 jit_uint8_t dest_base,
00616 jit_uint8_t dest_index,
00617 jit_uint8_t dest_scale,
00618 jit_int8_t val)
00619 {
00620 jit->write_ubyte(IA32_ADD_RM_IMM8);
00621 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
00622 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
00623 jit->write_byte(0);
00624 jit->write_byte(val);
00625 }
00626
00627 inline void IA32_Sub_Rm_Imm8_Disp8(JitWriter *jit,
00628 jit_uint8_t dest,
00629 jit_int8_t val,
00630 jit_int8_t disp8)
00631 {
00632 jit->write_ubyte(IA32_SUB_RM_IMM8);
00633 jit->write_ubyte(ia32_modrm(MOD_DISP8, 5, dest));
00634 jit->write_byte(disp8);
00635 jit->write_byte(val);
00636 }
00637
00638 inline void IA32_Sub_Rm_Imm8_Disp32(JitWriter *jit,
00639 jit_uint8_t dest,
00640 jit_int8_t val,
00641 jit_int32_t disp32)
00642 {
00643 jit->write_ubyte(IA32_SUB_RM_IMM8);
00644 jit->write_ubyte(ia32_modrm(MOD_DISP32, 5, dest));
00645 jit->write_int32(disp32);
00646 jit->write_byte(val);
00647 }
00648
00649 inline void IA32_Sub_RmEBP_Imm8_Disp_Reg(JitWriter *jit,
00650 jit_uint8_t dest_base,
00651 jit_uint8_t dest_index,
00652 jit_uint8_t dest_scale,
00653 jit_int8_t val)
00654 {
00655 jit->write_ubyte(IA32_SUB_RM_IMM8);
00656 jit->write_ubyte(ia32_modrm(MOD_DISP8, 5, REG_SIB));
00657 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
00658 jit->write_byte(0);
00659 jit->write_byte(val);
00660 }
00661
00662
00663
00664
00665
00666 inline void IA32_Lea_Reg_DispRegMult(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_uint8_t src_index, jit_uint8_t scale)
00667 {
00668 jit->write_ubyte(IA32_LEA_REG_MEM);
00669 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
00670 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
00671 }
00672
00673 inline void IA32_Lea_Reg_DispEBPRegMult(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_uint8_t src_index, jit_uint8_t scale)
00674 {
00675 jit->write_ubyte(IA32_LEA_REG_MEM);
00676 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
00677 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
00678 jit->write_byte(0);
00679 }
00680
00681 inline void IA32_Lea_Reg_DispRegMultImm8(JitWriter *jit,
00682 jit_uint8_t dest,
00683 jit_uint8_t src_base,
00684 jit_uint8_t src_index,
00685 jit_uint8_t scale,
00686 jit_int8_t val)
00687 {
00688 jit->write_ubyte(IA32_LEA_REG_MEM);
00689 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
00690 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
00691 jit->write_byte(val);
00692 }
00693
00694 inline void IA32_Lea_Reg_DispRegMultImm32(JitWriter *jit,
00695 jit_uint8_t dest,
00696 jit_uint8_t src_base,
00697 jit_uint8_t src_index,
00698 jit_uint8_t scale,
00699 jit_int32_t val)
00700 {
00701 jit->write_ubyte(IA32_LEA_REG_MEM);
00702 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, REG_SIB));
00703 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
00704 jit->write_int32(val);
00705 }
00706
00707 inline void IA32_Lea_Reg_RegMultImm32(JitWriter *jit,
00708 jit_uint8_t dest,
00709 jit_uint8_t src_index,
00710 jit_uint8_t scale,
00711 jit_int32_t val)
00712 {
00713 jit->write_ubyte(IA32_LEA_REG_MEM);
00714 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
00715 jit->write_ubyte(ia32_sib(scale, src_index, REG_IMM_BASE));
00716 jit->write_int32(val);
00717 }
00718
00719 inline void IA32_Lea_DispRegImm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int8_t val)
00720 {
00721 jit->write_ubyte(IA32_LEA_REG_MEM);
00722 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src_base));
00723 jit->write_byte(val);
00724 }
00725
00726 inline void IA32_Lea_DispRegImm32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int32_t val)
00727 {
00728 jit->write_ubyte(IA32_LEA_REG_MEM);
00729 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src_base));
00730 jit->write_int32(val);
00731 }
00732
00733
00734
00735
00736
00737 inline void IA32_Pop_Reg(JitWriter *jit, jit_uint8_t reg)
00738 {
00739 jit->write_ubyte(IA32_POP_REG+reg);
00740 }
00741
00742 inline void IA32_Push_Reg(JitWriter *jit, jit_uint8_t reg)
00743 {
00744 jit->write_ubyte(IA32_PUSH_REG+reg);
00745 }
00746
00747 inline void IA32_Push_Imm8(JitWriter *jit, jit_int8_t val)
00748 {
00749 jit->write_ubyte(IA32_PUSH_IMM8);
00750 jit->write_byte(val);
00751 }
00752
00753 inline void IA32_Push_Imm32(JitWriter *jit, jit_int32_t val)
00754 {
00755 jit->write_ubyte(IA32_PUSH_IMM32);
00756 jit->write_int32(val);
00757 }
00758
00759 inline void IA32_Pushad(JitWriter *jit)
00760 {
00761 jit->write_ubyte(IA32_PUSHAD);
00762 }
00763
00764 inline void IA32_Popad(JitWriter *jit)
00765 {
00766 jit->write_ubyte(IA32_POPAD);
00767 }
00768
00769 inline void IA32_Push_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp8)
00770 {
00771 jit->write_ubyte(IA32_PUSH_RM);
00772 jit->write_ubyte(ia32_modrm(MOD_DISP8, 6, reg));
00773 jit->write_byte(disp8);
00774 }
00775
00776 inline void IA32_Push_Rm_Disp8_ESP(JitWriter *jit, jit_int8_t disp8)
00777 {
00778 jit->write_ubyte(IA32_PUSH_RM);
00779 jit->write_ubyte(ia32_modrm(MOD_DISP8, 6, REG_SIB));
00780 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
00781 jit->write_byte(disp8);
00782 }
00783
00784
00785
00786
00787
00788 inline void IA32_Mov_Eax_Mem(JitWriter *jit, jit_uint32_t mem)
00789 {
00790 jit->write_ubyte(IA32_MOV_EAX_MEM);
00791 jit->write_uint32(mem);
00792 }
00793
00794 inline void IA32_Mov_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00795 {
00796 jit->write_ubyte(IA32_MOV_REG_RM);
00797 jit->write_ubyte(ia32_modrm(mode, dest, src));
00798 }
00799
00800 inline void IA32_Mov_Reg8_Rm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00801 {
00802 jit->write_ubyte(IA32_MOV_REG8_RM8);
00803 jit->write_ubyte(ia32_modrm(mode, dest, src));
00804 }
00805
00806 inline void IA32_Mov_Reg_RmESP(JitWriter *jit, jit_uint8_t dest)
00807 {
00808 jit->write_ubyte(IA32_MOV_REG_RM);
00809 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_ESP));
00810 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
00811 }
00812
00813 inline void IA32_Mov_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
00814 {
00815 jit->write_ubyte(IA32_MOV_REG_RM);
00816 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
00817 jit->write_byte(disp);
00818 }
00819
00820 inline void IA32_Mov_Reg8_Rm8_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
00821 {
00822 jit->write_ubyte(IA32_MOV_REG8_RM8);
00823 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
00824 jit->write_byte(disp);
00825 }
00826
00827 inline void IA32_Mov_Reg_Esp_Disp8(JitWriter *jit, jit_uint8_t dest, jit_int8_t disp)
00828 {
00829 jit->write_ubyte(IA32_MOV_REG_RM);
00830 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
00831 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
00832 jit->write_byte(disp);
00833 }
00834
00835 inline void IA32_Mov_Reg_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
00836 {
00837 jit->write_ubyte(IA32_MOV_REG_RM);
00838 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
00839 jit->write_int32(disp);
00840 }
00841
00842 inline void IA32_Mov_Reg8_Rm8_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
00843 {
00844 jit->write_ubyte(IA32_MOV_REG8_RM8);
00845 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
00846 jit->write_int32(disp);
00847 }
00848
00849 inline void IA32_Mov_Reg_Rm_Disp_Reg(JitWriter *jit,
00850 jit_uint8_t dest,
00851 jit_uint8_t src_base,
00852 jit_uint8_t src_index,
00853 jit_uint8_t src_scale)
00854 {
00855 jit->write_ubyte(IA32_MOV_REG_RM);
00856 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
00857 jit->write_ubyte(ia32_sib(src_scale, src_index, src_base));
00858 }
00859
00860 inline void IA32_Mov_Reg_Rm_Disp_Reg_Disp8(JitWriter *jit,
00861 jit_uint8_t dest,
00862 jit_uint8_t src_base,
00863 jit_uint8_t src_index,
00864 jit_uint8_t src_scale,
00865 jit_int8_t disp8)
00866 {
00867 jit->write_ubyte(IA32_MOV_REG_RM);
00868 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
00869 jit->write_ubyte(ia32_sib(src_scale, src_index, src_base));
00870 jit->write_byte(disp8);
00871 }
00872
00873 inline void IA32_Mov_Reg_RmEBP_Disp_Reg(JitWriter *jit,
00874 jit_uint8_t dest,
00875 jit_uint8_t src_base,
00876 jit_uint8_t src_index,
00877 jit_uint8_t src_scale)
00878 {
00879 jit->write_ubyte(IA32_MOV_REG_RM);
00880 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
00881 jit->write_ubyte(ia32_sib(src_scale, src_index, src_base));
00882 jit->write_byte(0);
00883 }
00884
00885
00886
00887
00888
00889 inline void IA32_Mov_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00890 {
00891 jit->write_ubyte(IA32_MOV_RM_REG);
00892 jit->write_ubyte(ia32_modrm(mode, src, dest));
00893 }
00894
00895 inline void IA32_Mov_Rm8_Reg8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
00896 {
00897 jit->write_ubyte(IA32_MOV_RM8_REG8);
00898 jit->write_ubyte(ia32_modrm(mode, src, dest));
00899 }
00900
00901 inline void IA32_Mov_RmESP_Reg(JitWriter *jit, jit_uint8_t src)
00902 {
00903 jit->write_ubyte(IA32_MOV_RM_REG);
00904 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src, REG_ESP));
00905 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
00906 }
00907
00908 inline void IA32_Mov_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
00909 {
00910 jit->write_ubyte(IA32_MOV_RM_REG);
00911 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, dest));
00912 jit->write_byte(disp);
00913 }
00914
00915 inline void IA32_Mov_Rm_Reg_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
00916 {
00917 jit->write_ubyte(IA32_MOV_RM_REG);
00918 jit->write_ubyte(ia32_modrm(MOD_DISP32, src, dest));
00919 jit->write_int32(disp);
00920 }
00921
00922 inline void IA32_Mov_RmEBP_Reg_Disp_Reg(JitWriter *jit,
00923 jit_uint8_t dest_base,
00924 jit_uint8_t dest_index,
00925 jit_uint8_t dest_scale,
00926 jit_uint8_t src)
00927 {
00928 jit->write_ubyte(IA32_MOV_RM_REG);
00929 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, REG_SIB));
00930 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
00931 jit->write_byte(0);
00932 }
00933
00934 inline void IA32_Mov_Rm8EBP_Reg_Disp_Reg(JitWriter *jit,
00935 jit_uint8_t dest_base,
00936 jit_uint8_t dest_index,
00937 jit_uint8_t dest_scale,
00938 jit_uint8_t src)
00939 {
00940 jit->write_ubyte(IA32_MOV_RM8_REG);
00941 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, REG_SIB));
00942 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
00943 jit->write_byte(0);
00944 }
00945
00946 inline void IA32_Mov_Rm16EBP_Reg_Disp_Reg(JitWriter *jit,
00947 jit_uint8_t dest_base,
00948 jit_uint8_t dest_index,
00949 jit_uint8_t dest_scale,
00950 jit_uint8_t src)
00951 {
00952 jit->write_ubyte(IA32_16BIT_PREFIX);
00953 jit->write_ubyte(IA32_MOV_RM_REG);
00954 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, REG_SIB));
00955 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
00956 jit->write_byte(0);
00957 }
00958
00959
00960
00961
00962
00963 inline jitoffs_t IA32_Mov_Reg_Imm32(JitWriter *jit, jit_uint8_t dest, jit_int32_t num)
00964 {
00965 jitoffs_t offs;
00966 jit->write_ubyte(IA32_MOV_REG_IMM+dest);
00967 offs = jit->get_outputpos();
00968 jit->write_int32(num);
00969 return offs;
00970 }
00971
00972 inline void IA32_Mov_Rm_Imm32(JitWriter *jit, jit_uint8_t dest, jit_int32_t val, jit_uint8_t mode)
00973 {
00974 jit->write_ubyte(IA32_MOV_RM_IMM32);
00975 jit->write_ubyte(ia32_modrm(mode, 0, dest));
00976 jit->write_int32(val);
00977 }
00978
00979 inline void IA32_Mov_Rm_Imm32_Disp8(JitWriter *jit,
00980 jit_uint8_t dest,
00981 jit_int32_t val,
00982 jit_int8_t disp8)
00983 {
00984 jit->write_ubyte(IA32_MOV_RM_IMM32);
00985 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
00986 jit->write_byte(disp8);
00987 jit->write_int32(val);
00988 }
00989
00990 inline void IA32_Mov_Rm_Imm32_Disp32(JitWriter *jit,
00991 jit_uint8_t dest,
00992 jit_int32_t val,
00993 jit_int32_t disp32)
00994 {
00995 jit->write_ubyte(IA32_MOV_RM_IMM32);
00996 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, dest));
00997 jit->write_int32(disp32);
00998 jit->write_int32(val);
00999 }
01000
01001 inline void IA32_Mov_Rm_Imm32_SIB(JitWriter *jit,
01002 jit_uint8_t dest,
01003 jit_int32_t val,
01004 jit_int32_t disp,
01005 jit_uint8_t index,
01006 jit_uint8_t scale)
01007 {
01008 jit->write_ubyte(IA32_MOV_RM_IMM32);
01009
01010 if (disp >= SCHAR_MIN && disp <= SCHAR_MAX)
01011 {
01012 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
01013 }
01014 else
01015 {
01016 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, REG_SIB));
01017 }
01018
01019 jit->write_ubyte(ia32_sib(scale, index, dest));
01020
01021 if (disp >= SCHAR_MIN && disp <= SCHAR_MAX)
01022 {
01023 jit->write_byte((jit_int8_t)disp);
01024 }
01025 else
01026 {
01027 jit->write_int32(disp);
01028 }
01029
01030 jit->write_int32(val);
01031 }
01032
01033 inline void IA32_Mov_RmEBP_Imm32_Disp_Reg(JitWriter *jit,
01034 jit_uint8_t dest_base,
01035 jit_uint8_t dest_index,
01036 jit_uint8_t dest_scale,
01037 jit_int32_t val)
01038 {
01039 jit->write_ubyte(IA32_MOV_RM_IMM32);
01040 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
01041 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
01042 jit->write_byte(0);
01043 jit->write_int32(val);
01044 }
01045
01046 inline void IA32_Mov_ESP_Disp8_Imm32(JitWriter *jit, jit_int8_t disp8, jit_int32_t val)
01047 {
01048 jit->write_ubyte(IA32_MOV_RM_IMM32);
01049 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
01050 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01051 jit->write_byte(disp8);
01052 jit->write_int32(val);
01053 }
01054
01055
01056
01057
01058
01059 inline void IA32_Fstcw_Mem16_ESP(JitWriter *jit)
01060 {
01061 jit->write_ubyte(IA32_FSTCW_MEM16_1);
01062 jit->write_ubyte(IA32_FSTCW_MEM16_2);
01063 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 7, REG_SIB));
01064 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01065 }
01066
01067 inline void IA32_Fldcw_Mem16_ESP(JitWriter *jit)
01068 {
01069 jit->write_ubyte(IA32_FLDCW_MEM16);
01070 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 5, REG_SIB));
01071 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01072 }
01073
01074 inline void IA32_Fldcw_Mem16_Disp8_ESP(JitWriter *jit, jit_int8_t disp8)
01075 {
01076 jit->write_ubyte(IA32_FLDCW_MEM16);
01077 jit->write_ubyte(ia32_modrm(MOD_DISP8, 5, REG_SIB));
01078 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01079 jit->write_byte(disp8);
01080 }
01081
01082 inline void IA32_Fistp_Mem32_ESP(JitWriter *jit)
01083 {
01084 jit->write_ubyte(IA32_FISTP_MEM32);
01085 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, REG_SIB));
01086 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01087 }
01088
01089 inline void IA32_Fistp_Mem32_Disp8_Esp(JitWriter *jit, jit_int8_t disp8)
01090 {
01091 jit->write_ubyte(IA32_FISTP_MEM32);
01092 jit->write_ubyte(ia32_modrm(MOD_DISP8, 3, REG_SIB));
01093 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01094 jit->write_byte(disp8);
01095 }
01096
01097 inline void IA32_Fucomip_ST0_FPUreg(JitWriter *jit, jit_uint8_t reg)
01098 {
01099 jit->write_ubyte(IA32_FUCOMIP_1);
01100 jit->write_ubyte(IA32_FUCOMIP_2+reg);
01101 }
01102
01103 inline void IA32_Fadd_FPUreg_ST0(JitWriter *jit, jit_uint8_t reg)
01104 {
01105 jit->write_ubyte(IA32_FADD_FPREG_ST0_1);
01106 jit->write_ubyte(IA32_FADD_FPREG_ST0_2+reg);
01107 }
01108
01109 inline void IA32_Fadd_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
01110 {
01111 jit->write_ubyte(IA32_FADD_MEM32);
01112 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, src));
01113 jit->write_byte(val);
01114 }
01115
01116 inline void IA32_Fadd_Mem32_ESP(JitWriter *jit)
01117 {
01118 jit->write_ubyte(IA32_FADD_MEM32);
01119 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
01120 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
01121 }
01122
01123 inline void IA32_Fsub_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
01124 {
01125 jit->write_ubyte(IA32_FSUB_MEM32);
01126 jit->write_ubyte(ia32_modrm(MOD_DISP8, 4, src));
01127 jit->write_byte(va