3 * ================================================================
4 * SourcePawn (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ================================================================
7 * This file is not open source and may not be copied without explicit
8 * written permission of AlliedModders LLC. This file may not be redistributed
9 * in whole or significant part.
10 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
15 #ifndef _INCLUDE_JIT_X86_MACROS_H
16 #define _INCLUDE_JIT_X86_MACROS_H
40 #define REG_IMM_BASE 5
45 #define IA32_16BIT_PREFIX 0x66
47 //condition codes (for example, Jcc opcodes)
69 //Opcodes with encoding information
70 #define IA32_XOR_RM_REG 0x31 // encoding is /r
71 #define IA32_XOR_REG_RM 0x33 // encoding is /r
72 #define IA32_XOR_EAX_IMM32 0x35 // encoding is /r
73 #define IA32_XOR_RM_IMM32 0x81 // encoding is /6
74 #define IA32_XOR_RM_IMM8 0x83 // encoding is /6
75 #define IA32_ADD_RM_REG 0x01 // encoding is /r
76 #define IA32_ADD_REG_RM 0x03 // encoding is /r
77 #define IA32_ADD_RM_IMM32 0x81 // encoding is /0
78 #define IA32_ADD_RM_IMM8 0x83 // encoding is /0
79 #define IA32_ADD_EAX_IMM32 0x05 // no extra encoding
80 #define IA32_SUB_RM_REG 0x29 // encoding is /r
81 #define IA32_SUB_REG_RM 0x2B // encoding is /r
82 #define IA32_SUB_RM_IMM8 0x83 // encoding is /5 <imm8>
83 #define IA32_SUB_RM_IMM32 0x81 // encoding is /5 <imm32>
84 #define IA32_SBB_REG_RM 0x1B // encoding is /r
85 #define IA32_SBB_RM_IMM8 0x83 // encoding is <imm32>
86 #define IA32_JMP_IMM32 0xE9 // encoding is imm32
87 #define IA32_JMP_IMM8 0xEB // encoding is imm8
88 #define IA32_JMP_RM 0xFF // encoding is /4
89 #define IA32_CALL_IMM32 0xE8 // relative call, <imm32>
90 #define IA32_CALL_RM 0xFF // encoding is /2
91 #define IA32_MOV_REG_IMM 0xB8 // encoding is +r <imm32>
92 #define IA32_MOV_RM8_REG 0x88 // encoding is /r
93 #define IA32_MOV_RM_REG 0x89 // encoding is /r
94 #define IA32_MOV_REG_RM 0x8B // encoding is /r
95 #define IA32_MOV_REG8_RM8 0x8A // encoding is /r
96 #define IA32_MOV_RM8_REG8 0x88 // encoding is /r
97 #define IA32_MOV_RM_IMM32 0xC7 // encoding is /0
98 #define IA32_CMP_RM_IMM32 0x81 // encoding is /7 <imm32>
99 #define IA32_CMP_RM_IMM8 0x83 // encoding is /7 <imm8>
100 #define IA32_CMP_AL_IMM32 0x3C // no extra encoding
101 #define IA32_CMP_EAX_IMM32 0x3D // no extra encoding
102 #define IA32_CMP_RM_REG 0x39 // encoding is /r
103 #define IA32_CMP_REG_RM 0x3B // encoding is /r
104 #define IA32_CMPSB 0xA6 // no extra encoding
105 #define IA32_TEST_RM_REG 0x85 // encoding is /r
106 #define IA32_JCC_IMM 0x70 // encoding is +cc <imm8>
107 #define IA32_JCC_IMM32_1 0x0F // opcode part 1
108 #define IA32_JCC_IMM32_2 0x80 // encoding is +cc <imm32>
109 #define IA32_RET 0xC3 // no extra encoding
110 #define IA32_RETN 0xC2 // encoding is <imm16>
111 #define IA32_NEG_RM 0xF7 // encoding is /3
112 #define IA32_INC_REG 0x40 // encoding is +r
113 #define IA32_INC_RM 0xFF // encoding is /0
114 #define IA32_DEC_REG 0x48 // encoding is +r
115 #define IA32_DEC_RM 0xFF // encoding is /1
116 #define IA32_OR_REG_RM 0x0B // encoding is /r
117 #define IA32_AND_REG_RM 0x23 // encoding is /r
118 #define IA32_AND_EAX_IMM32 0x25 // encoding is <imm32>
119 #define IA32_AND_RM_IMM32 0x81 // encoding is /4
120 #define IA32_NOT_RM 0xF7 // encoding is /2
121 #define IA32_DIV_RM 0xF7 // encoding is /6
122 #define IA32_MUL_RM 0xF7 // encoding is /4
123 #define IA32_IDIV_RM 0xF7 // encoding is /7
124 #define IA32_IMUL_RM 0xF7 // encoding is /5
125 #define IA32_IMUL_REG_IMM32 0x69 // encoding is /r
126 #define IA32_IMUL_REG_IMM8 0x6B // encoding is /r
127 #define IA32_IMUL_REG_RM_1 0x0F // encoding is _2
128 #define IA32_IMUL_REG_RM_2 0xAF // encoding is /r
129 #define IA32_SHR_RM_IMM8 0xC1 // encoding is /5 <ib>
130 #define IA32_SHR_RM_1 0xD1 // encoding is /5
131 #define IA32_SHL_RM_IMM8 0xC1 // encoding is /4 <ib>
132 #define IA32_SHL_RM_1 0xD1 // encoding is /4
133 #define IA32_SAR_RM_CL 0xD3 // encoding is /7
134 #define IA32_SAR_RM_1 0xD1 // encoding is /7
135 #define IA32_SHR_RM_CL 0xD3 // encoding is /5
136 #define IA32_SHL_RM_CL 0xD3 // encoding is /4
137 #define IA32_SAR_RM_IMM8 0xC1 // encoding is /7 <ib>
138 #define IA32_SETCC_RM8_1 0x0F // opcode part 1
139 #define IA32_SETCC_RM8_2 0x90 // encoding is +cc /0 (8bits)
140 #define IA32_CMOVCC_RM_1 0x0F // opcode part 1
141 #define IA32_CMOVCC_RM_2 0x40 // encoding is +cc /r
142 #define IA32_XCHG_EAX_REG 0x90 // encoding is +r
143 #define IA32_LEA_REG_MEM 0x8D // encoding is /r
144 #define IA32_POP_REG 0x58 // encoding is +r
145 #define IA32_PUSH_REG 0x50 // encoding is +r
146 #define IA32_PUSH_RM 0xFF // encoding is /6
147 #define IA32_PUSH_IMM32 0x68 // encoding is <imm32>
148 #define IA32_PUSH_IMM8 0x6A // encoding is <imm8>
149 #define IA32_REP 0xF3 // no extra encoding
150 #define IA32_MOVSD 0xA5 // no extra encoding
151 #define IA32_MOVSB 0xA4 // no extra encoding
152 #define IA32_STOSD 0xAB // no extra encoding
153 #define IA32_CLD 0xFC // no extra encoding
154 #define IA32_PUSHAD 0x60 // no extra encoding
155 #define IA32_POPAD 0x61 // no extra encoding
156 #define IA32_NOP 0x90 // no extra encoding
157 #define IA32_INT3 0xCC // no extra encoding
158 #define IA32_FSTP_MEM32 0xD9 // encoding is /3
159 #define IA32_FSTP_MEM64 0xDD // encoding is /3
160 #define IA32_FLD_MEM32 0xD9 // encoding is /0
161 #define IA32_FLD_MEM64 0xDD // encoding is /0
162 #define IA32_FILD_MEM32 0xDB // encoding is /0
163 #define IA32_FADD_MEM32 0xD8 // encoding is /0
164 #define IA32_FADD_FPREG_ST0_1 0xDC // opcode part 1
165 #define IA32_FADD_FPREG_ST0_2 0xC0 // encoding is +r
166 #define IA32_FSUB_MEM32 0xD8 // encoding is /4
167 #define IA32_FMUL_MEM32 0xD8 // encoding is /1
168 #define IA32_FDIV_MEM32 0xD8 // encoding is /6
169 #define IA32_FSTCW_MEM16_1 0x9B // opcode part 1
170 #define IA32_FSTCW_MEM16_2 0xD9 // encoding is /7
171 #define IA32_FLDCW_MEM16 0xD9 // encoding is /5
172 #define IA32_FISTP_MEM32 0xDB // encoding is /3
173 #define IA32_FUCOMIP_1 0xDF // opcode part 1
174 #define IA32_FUCOMIP_2 0xE8 // encoding is +r
175 #define IA32_FSTP_FPREG_1 0xDD // opcode part 1
176 #define IA32_FSTP_FPREG_2 0xD8 // encoding is +r
177 #define IA32_MOVZX_R32_RM8_1 0x0F // opcode part 1
178 #define IA32_MOVZX_R32_RM8_2 0xB6 // encoding is /r
179 #define IA32_MOVZX_R32_RM16_1 0x0F // opcode part 1
180 #define IA32_MOVZX_R32_RM16_2 0xB7 // encoding is /r
182 inline jit_uint8_t ia32_modrm(jit_uint8_t mode, jit_uint8_t reg, jit_uint8_t rm)
184 jit_uint8_t modrm = (mode << 6);
192 //mode is the scaling method - NOSCALE ... SCALE8
193 //index is the register that is scaled
194 //base is the base register
195 inline jit_uint8_t ia32_sib(jit_uint8_t mode, jit_uint8_t index, jit_uint8_t base)
197 jit_uint8_t sib = (mode << 6);
205 /***********************
206 * INCREMENT/DECREMENT *
207 ***********************/
209 inline void IA32_Inc_Reg(JitWriter *jit, jit_uint8_t reg)
211 jit->write_ubyte(IA32_INC_REG+reg);
214 inline void IA32_Inc_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp)
216 jit->write_ubyte(IA32_INC_RM);
217 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, reg));
218 jit->write_byte(disp);
221 inline void IA32_Inc_Rm_Disp32(JitWriter *jit, jit_uint8_t reg, jit_int32_t disp)
223 jit->write_ubyte(IA32_INC_RM);
224 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, reg));
225 jit->write_int32(disp);
228 inline void IA32_Inc_Rm_Disp_Reg(JitWriter *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
230 jit->write_ubyte(IA32_INC_RM);
231 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
232 jit->write_ubyte(ia32_sib(scale, reg, base));
235 inline void IA32_Dec_Reg(JitWriter *jit, jit_uint8_t reg)
237 jit->write_ubyte(IA32_DEC_REG+reg);
240 inline void IA32_Dec_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp)
242 jit->write_ubyte(IA32_DEC_RM);
243 jit->write_ubyte(ia32_modrm(MOD_DISP8, 1, reg));
244 jit->write_byte(disp);
247 inline void IA32_Dec_Rm_Disp32(JitWriter *jit, jit_uint8_t reg, jit_int32_t disp)
249 jit->write_ubyte(IA32_DEC_RM);
250 jit->write_ubyte(ia32_modrm(MOD_DISP32, 1, reg));
251 jit->write_int32(disp);
254 inline void IA32_Dec_Rm_Disp_Reg(JitWriter *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
256 jit->write_ubyte(IA32_DEC_RM);
257 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 1, REG_SIB));
258 jit->write_ubyte(ia32_sib(scale, reg, base));
265 inline void IA32_Xor_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t dest_mode)
267 jit->write_ubyte(IA32_XOR_RM_REG);
268 jit->write_ubyte(ia32_modrm(dest_mode, src, dest));
271 inline void IA32_Xor_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t dest_mode)
273 jit->write_ubyte(IA32_XOR_REG_RM);
274 jit->write_ubyte(ia32_modrm(dest_mode, dest, src));
277 inline void IA32_Xor_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
279 jit->write_ubyte(IA32_XOR_RM_IMM8);
280 jit->write_ubyte(ia32_modrm(mode, 6, reg));
281 jit->write_byte(value);
284 inline void IA32_Xor_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
286 jit->write_ubyte(IA32_XOR_RM_IMM32);
287 jit->write_ubyte(ia32_modrm(mode, 6, reg));
288 jit->write_int32(value);
291 inline void IA32_Xor_Eax_Imm32(JitWriter *jit, jit_int32_t value)
293 jit->write_ubyte(IA32_XOR_EAX_IMM32);
294 jit->write_int32(value);
297 inline void IA32_Neg_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
299 jit->write_ubyte(IA32_NEG_RM);
300 jit->write_ubyte(ia32_modrm(mode, 3, reg));
303 inline void IA32_Or_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
305 jit->write_ubyte(IA32_OR_REG_RM);
306 jit->write_ubyte(ia32_modrm(mode, dest, src));
309 inline void IA32_And_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
311 jit->write_ubyte(IA32_AND_REG_RM);
312 jit->write_ubyte(ia32_modrm(mode, dest, src));
315 inline void IA32_And_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
317 jit->write_ubyte(IA32_AND_RM_IMM32);
318 jit->write_ubyte(ia32_modrm(mode, 4, reg));
319 jit->write_int32(value);
322 inline void IA32_And_Eax_Imm32(JitWriter *jit, jit_int32_t value)
324 jit->write_ubyte(IA32_AND_EAX_IMM32);
325 jit->write_int32(value);
328 inline void IA32_Not_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
330 jit->write_ubyte(IA32_NOT_RM);
331 jit->write_ubyte(ia32_modrm(mode, 2, reg));
334 inline void IA32_Shr_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
336 jit->write_ubyte(IA32_SHR_RM_IMM8);
337 jit->write_ubyte(ia32_modrm(mode, 5, dest));
338 jit->write_ubyte(value);
341 inline void IA32_Shr_Rm_1(JitWriter *jit, jit_uint8_t dest, jit_uint8_t mode)
343 jit->write_ubyte(IA32_SHR_RM_1);
344 jit->write_ubyte(ia32_modrm(mode, 5, dest));
347 inline void IA32_Shl_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
349 jit->write_ubyte(IA32_SHL_RM_IMM8);
350 jit->write_ubyte(ia32_modrm(mode, 4, dest));
351 jit->write_ubyte(value);
354 inline void IA32_Shl_Rm_1(JitWriter *jit, jit_uint8_t dest, jit_uint8_t mode)
356 jit->write_ubyte(IA32_SHL_RM_1);
357 jit->write_ubyte(ia32_modrm(mode, 4, dest));
360 inline void IA32_Sar_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
362 jit->write_ubyte(IA32_SAR_RM_IMM8);
363 jit->write_ubyte(ia32_modrm(mode, 7, dest));
364 jit->write_ubyte(value);
367 inline void IA32_Sar_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
369 jit->write_ubyte(IA32_SAR_RM_CL);
370 jit->write_ubyte(ia32_modrm(mode, 7, reg));
373 inline void IA32_Sar_Rm_1(JitWriter *jit, jit_uint8_t dest, jit_uint8_t mode)
375 jit->write_ubyte(IA32_SAR_RM_1);
376 jit->write_ubyte(ia32_modrm(mode, 7, dest));
379 inline void IA32_Shr_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
381 jit->write_ubyte(IA32_SHR_RM_CL);
382 jit->write_ubyte(ia32_modrm(mode, 5, reg));
385 inline void IA32_Shl_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
387 jit->write_ubyte(IA32_SHL_RM_CL);
388 jit->write_ubyte(ia32_modrm(mode, 4, reg));
391 inline void IA32_Xchg_Eax_Reg(JitWriter *jit, jit_uint8_t reg)
393 jit->write_ubyte(IA32_XCHG_EAX_REG+reg);
396 /**********************
397 * ARITHMETIC (BASIC) *
398 **********************/
400 inline void IA32_Add_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
402 jit->write_ubyte(IA32_ADD_RM_REG);
403 jit->write_ubyte(ia32_modrm(mode, src, dest));
406 inline void IA32_Add_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
408 jit->write_ubyte(IA32_ADD_REG_RM);
409 jit->write_ubyte(ia32_modrm(mode, dest, src));
412 inline void IA32_Add_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t value, jit_uint8_t mode)
414 jit->write_ubyte(IA32_ADD_RM_IMM8);
415 jit->write_ubyte(ia32_modrm(mode, 0, reg));
416 jit->write_byte(value);
419 inline void IA32_Add_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t value, jit_uint8_t mode)
421 jit->write_ubyte(IA32_ADD_RM_IMM32);
422 jit->write_ubyte(ia32_modrm(mode, 0, reg));
423 jit->write_int32(value);
426 inline void IA32_Add_Eax_Imm32(JitWriter *jit, jit_int32_t value)
428 jit->write_ubyte(IA32_ADD_EAX_IMM32);
429 jit->write_int32(value);
432 inline void IA32_Sub_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
434 jit->write_ubyte(IA32_SUB_RM_REG);
435 jit->write_ubyte(ia32_modrm(mode, src, dest));
438 inline void IA32_Sub_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
440 jit->write_ubyte(IA32_SUB_REG_RM);
441 jit->write_ubyte(ia32_modrm(mode, dest, src));
444 inline void IA32_Sub_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp8)
446 jit->write_ubyte(IA32_SUB_REG_RM);
447 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
448 jit->write_byte(disp8);
451 inline void IA32_Sub_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp8)
453 jit->write_ubyte(IA32_SUB_RM_REG);
454 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, dest));
455 jit->write_byte(disp8);
458 inline void IA32_Sub_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t val, jit_uint8_t mode)
460 jit->write_ubyte(IA32_SUB_RM_IMM8);
461 jit->write_ubyte(ia32_modrm(mode, 5, reg));
462 jit->write_byte(val);
465 inline void IA32_Sub_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t val, jit_uint8_t mode)
467 jit->write_ubyte(IA32_SUB_RM_IMM32);
468 jit->write_ubyte(ia32_modrm(mode, 5, reg));
469 jit->write_int32(val);
472 inline void IA32_Sbb_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
474 jit->write_ubyte(IA32_SBB_REG_RM);
475 jit->write_ubyte(ia32_modrm(mode, dest, src));
478 inline void IA32_Sbb_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_int8_t value, jit_uint8_t mode)
480 jit->write_ubyte(IA32_SBB_RM_IMM8);
481 jit->write_ubyte(ia32_modrm(mode, 3, dest));
482 jit->write_byte(value);
485 inline void IA32_Div_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
487 jit->write_ubyte(IA32_DIV_RM);
488 jit->write_ubyte(ia32_modrm(mode, 6, reg));
491 inline void IA32_IDiv_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
493 jit->write_ubyte(IA32_IDIV_RM);
494 jit->write_ubyte(ia32_modrm(mode, 7, reg));
497 inline void IA32_Mul_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
499 jit->write_ubyte(IA32_MUL_RM);
500 jit->write_ubyte(ia32_modrm(mode, 4, reg));
503 inline void IA32_IMul_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
505 jit->write_ubyte(IA32_IMUL_RM);
506 jit->write_ubyte(ia32_modrm(mode, 5, reg));
509 inline void IA32_IMul_Reg_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
511 jit->write_ubyte(IA32_IMUL_REG_IMM8);
512 jit->write_ubyte(ia32_modrm(mode, 0, reg));
513 jit->write_byte(value);
516 inline void IA32_IMul_Reg_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
518 jit->write_ubyte(IA32_IMUL_REG_IMM32);
519 jit->write_ubyte(ia32_modrm(mode, 0, reg));
520 jit->write_int32(value);
523 inline void IA32_IMul_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
525 jit->write_ubyte(IA32_IMUL_REG_RM_1);
526 jit->write_ubyte(IA32_IMUL_REG_RM_2);
527 jit->write_ubyte(ia32_modrm(mode, dest, src));
530 inline void IA32_Add_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
532 jit->write_ubyte(IA32_ADD_RM_REG);
533 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, dest));
534 jit->write_byte(disp);
537 inline void IA32_Add_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
539 jit->write_ubyte(IA32_ADD_REG_RM);
540 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
541 jit->write_byte(disp);
544 inline void IA32_Add_Rm_Imm8_Disp8(JitWriter *jit,
549 jit->write_ubyte(IA32_ADD_RM_IMM8);
550 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
551 jit->write_byte(disp8);
552 jit->write_byte(val);
555 inline void IA32_Add_Rm_Imm32_Disp8(JitWriter *jit,
560 jit->write_ubyte(IA32_ADD_RM_IMM32);
561 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
562 jit->write_byte(disp8);
563 jit->write_int32(val);
566 inline jitoffs_t IA32_Add_Rm_Imm32_Later(JitWriter *jit,
570 jit->write_ubyte(IA32_ADD_RM_IMM32);
571 jit->write_ubyte(ia32_modrm(mode, 0, dest));
572 jitoffs_t ptr = jit->get_outputpos();
577 inline void IA32_Add_Rm_Imm8_Disp32(JitWriter *jit,
582 jit->write_ubyte(IA32_ADD_RM_IMM8);
583 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, dest));
584 jit->write_int32(disp32);
585 jit->write_byte(val);
588 inline void IA32_Add_RmEBP_Imm8_Disp_Reg(JitWriter *jit,
589 jit_uint8_t dest_base,
590 jit_uint8_t dest_index,
591 jit_uint8_t dest_scale,
594 jit->write_ubyte(IA32_ADD_RM_IMM8);
595 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
596 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
598 jit->write_byte(val);
601 inline void IA32_Sub_Rm_Imm8_Disp8(JitWriter *jit,
606 jit->write_ubyte(IA32_SUB_RM_IMM8);
607 jit->write_ubyte(ia32_modrm(MOD_DISP8, 5, dest));
608 jit->write_byte(disp8);
609 jit->write_byte(val);
612 inline void IA32_Sub_Rm_Imm8_Disp32(JitWriter *jit,
617 jit->write_ubyte(IA32_SUB_RM_IMM8);
618 jit->write_ubyte(ia32_modrm(MOD_DISP32, 5, dest));
619 jit->write_int32(disp32);
620 jit->write_byte(val);
623 inline void IA32_Sub_RmEBP_Imm8_Disp_Reg(JitWriter *jit,
624 jit_uint8_t dest_base,
625 jit_uint8_t dest_index,
626 jit_uint8_t dest_scale,
629 jit->write_ubyte(IA32_SUB_RM_IMM8);
630 jit->write_ubyte(ia32_modrm(MOD_DISP8, 5, REG_SIB));
631 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
633 jit->write_byte(val);
637 * Memory Instructions
640 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)
642 jit->write_ubyte(IA32_LEA_REG_MEM);
643 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
644 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
647 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)
649 jit->write_ubyte(IA32_LEA_REG_MEM);
650 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
651 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
655 inline void IA32_Lea_Reg_DispRegMultImm8(JitWriter *jit,
657 jit_uint8_t src_base,
658 jit_uint8_t src_index,
662 jit->write_ubyte(IA32_LEA_REG_MEM);
663 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
664 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
665 jit->write_byte(val);
668 inline void IA32_Lea_Reg_DispRegMultImm32(JitWriter *jit,
670 jit_uint8_t src_base,
671 jit_uint8_t src_index,
675 jit->write_ubyte(IA32_LEA_REG_MEM);
676 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, REG_SIB));
677 jit->write_ubyte(ia32_sib(scale, src_index, src_base));
678 jit->write_int32(val);
681 inline void IA32_Lea_Reg_RegMultImm32(JitWriter *jit,
683 jit_uint8_t src_index,
687 jit->write_ubyte(IA32_LEA_REG_MEM);
688 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
689 jit->write_ubyte(ia32_sib(scale, src_index, REG_IMM_BASE));
690 jit->write_int32(val);
693 inline void IA32_Lea_DispRegImm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int8_t val)
695 jit->write_ubyte(IA32_LEA_REG_MEM);
696 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src_base));
697 jit->write_byte(val);
700 inline void IA32_Lea_DispRegImm32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int32_t val)
702 jit->write_ubyte(IA32_LEA_REG_MEM);
703 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src_base));
704 jit->write_int32(val);
711 inline void IA32_Pop_Reg(JitWriter *jit, jit_uint8_t reg)
713 jit->write_ubyte(IA32_POP_REG+reg);
716 inline void IA32_Push_Reg(JitWriter *jit, jit_uint8_t reg)
718 jit->write_ubyte(IA32_PUSH_REG+reg);
721 inline void IA32_Push_Imm8(JitWriter *jit, jit_int8_t val)
723 jit->write_ubyte(IA32_PUSH_IMM8);
724 jit->write_byte(val);
727 inline void IA32_Push_Imm32(JitWriter *jit, jit_int32_t val)
729 jit->write_ubyte(IA32_PUSH_IMM32);
730 jit->write_int32(val);
733 inline void IA32_Pushad(JitWriter *jit)
735 jit->write_ubyte(IA32_PUSHAD);
738 inline void IA32_Popad(JitWriter *jit)
740 jit->write_ubyte(IA32_POPAD);
743 inline void IA32_Push_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp8)
745 jit->write_ubyte(IA32_PUSH_RM);
746 jit->write_ubyte(ia32_modrm(MOD_DISP8, 6, reg));
747 jit->write_byte(disp8);
750 inline void IA32_Push_Rm_Disp8_ESP(JitWriter *jit, jit_int8_t disp8)
752 jit->write_ubyte(IA32_PUSH_RM);
753 jit->write_ubyte(ia32_modrm(MOD_DISP8, 6, REG_SIB));
754 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
755 jit->write_byte(disp8);
759 * Moving from REGISTER/MEMORY to REGISTER
762 inline void IA32_Mov_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
764 jit->write_ubyte(IA32_MOV_REG_RM);
765 jit->write_ubyte(ia32_modrm(mode, dest, src));
768 inline void IA32_Mov_Reg8_Rm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
770 jit->write_ubyte(IA32_MOV_REG8_RM8);
771 jit->write_ubyte(ia32_modrm(mode, dest, src));
774 inline void IA32_Mov_Reg_RmESP(JitWriter *jit, jit_uint8_t dest)
776 jit->write_ubyte(IA32_MOV_REG_RM);
777 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_ESP));
778 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
781 inline void IA32_Mov_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
783 jit->write_ubyte(IA32_MOV_REG_RM);
784 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
785 jit->write_byte(disp);
788 inline void IA32_Mov_Reg8_Rm8_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
790 jit->write_ubyte(IA32_MOV_REG8_RM8);
791 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
792 jit->write_byte(disp);
795 inline void IA32_Mov_Reg_Esp_Disp8(JitWriter *jit, jit_uint8_t dest, jit_int8_t disp)
797 jit->write_ubyte(IA32_MOV_REG_RM);
798 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
799 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
800 jit->write_byte(disp);
803 inline void IA32_Mov_Reg_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
805 jit->write_ubyte(IA32_MOV_REG_RM);
806 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
807 jit->write_int32(disp);
810 inline void IA32_Mov_Reg8_Rm8_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
812 jit->write_ubyte(IA32_MOV_REG8_RM8);
813 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
814 jit->write_int32(disp);
817 inline void IA32_Mov_Reg_Rm_Disp_Reg(JitWriter *jit,
819 jit_uint8_t src_base,
820 jit_uint8_t src_index,
821 jit_uint8_t src_scale)
823 jit->write_ubyte(IA32_MOV_REG_RM);
824 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
825 jit->write_ubyte(ia32_sib(src_scale, src_index, src_base));
828 inline void IA32_Mov_Reg_Rm_Disp_Reg_Disp8(JitWriter *jit,
830 jit_uint8_t src_base,
831 jit_uint8_t src_index,
832 jit_uint8_t src_scale,
835 jit->write_ubyte(IA32_MOV_REG_RM);
836 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
837 jit->write_ubyte(ia32_sib(src_scale, src_index, src_base));
838 jit->write_byte(disp8);
841 inline void IA32_Mov_Reg_RmEBP_Disp_Reg(JitWriter *jit,
843 jit_uint8_t src_base,
844 jit_uint8_t src_index,
845 jit_uint8_t src_scale)
847 jit->write_ubyte(IA32_MOV_REG_RM);
848 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, REG_SIB));
849 jit->write_ubyte(ia32_sib(src_scale, src_index, src_base));
854 * Moving from REGISTER to REGISTER/MEMORY
857 inline void IA32_Mov_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
859 jit->write_ubyte(IA32_MOV_RM_REG);
860 jit->write_ubyte(ia32_modrm(mode, src, dest));
863 inline void IA32_Mov_Rm8_Reg8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
865 jit->write_ubyte(IA32_MOV_RM8_REG8);
866 jit->write_ubyte(ia32_modrm(mode, src, dest));
869 inline void IA32_Mov_RmESP_Reg(JitWriter *jit, jit_uint8_t src)
871 jit->write_ubyte(IA32_MOV_RM_REG);
872 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src, REG_ESP));
873 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
876 inline void IA32_Mov_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
878 jit->write_ubyte(IA32_MOV_RM_REG);
879 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, dest));
880 jit->write_byte(disp);
883 inline void IA32_Mov_Rm_Reg_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
885 jit->write_ubyte(IA32_MOV_RM_REG);
886 jit->write_ubyte(ia32_modrm(MOD_DISP32, src, dest));
887 jit->write_int32(disp);
890 inline void IA32_Mov_RmEBP_Reg_Disp_Reg(JitWriter *jit,
891 jit_uint8_t dest_base,
892 jit_uint8_t dest_index,
893 jit_uint8_t dest_scale,
896 jit->write_ubyte(IA32_MOV_RM_REG);
897 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, REG_SIB));
898 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
902 inline void IA32_Mov_Rm8EBP_Reg_Disp_Reg(JitWriter *jit,
903 jit_uint8_t dest_base,
904 jit_uint8_t dest_index,
905 jit_uint8_t dest_scale,
908 jit->write_ubyte(IA32_MOV_RM8_REG);
909 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, REG_SIB));
910 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
914 inline void IA32_Mov_Rm16EBP_Reg_Disp_Reg(JitWriter *jit,
915 jit_uint8_t dest_base,
916 jit_uint8_t dest_index,
917 jit_uint8_t dest_scale,
920 jit->write_ubyte(IA32_16BIT_PREFIX);
921 jit->write_ubyte(IA32_MOV_RM_REG);
922 jit->write_ubyte(ia32_modrm(MOD_DISP8, src, REG_SIB));
923 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
928 * Moving from IMMEDIATE to REGISTER
931 inline jitoffs_t IA32_Mov_Reg_Imm32(JitWriter *jit, jit_uint8_t dest, jit_int32_t num)
934 jit->write_ubyte(IA32_MOV_REG_IMM+dest);
935 offs = jit->get_outputpos();
936 jit->write_int32(num);
940 inline void IA32_Mov_Rm_Imm32(JitWriter *jit, jit_uint8_t dest, jit_int32_t val, jit_uint8_t mode)
942 jit->write_ubyte(IA32_MOV_RM_IMM32);
943 jit->write_ubyte(ia32_modrm(mode, 0, dest));
944 jit->write_int32(val);
947 inline void IA32_Mov_Rm_Imm32_Disp8(JitWriter *jit,
952 jit->write_ubyte(IA32_MOV_RM_IMM32);
953 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, dest));
954 jit->write_byte(disp8);
955 jit->write_int32(val);
958 inline void IA32_Mov_Rm_Imm32_Disp32(JitWriter *jit,
963 jit->write_ubyte(IA32_MOV_RM_IMM32);
964 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, dest));
965 jit->write_int32(disp32);
966 jit->write_int32(val);
969 inline void IA32_Mov_RmEBP_Imm32_Disp_Reg(JitWriter *jit,
970 jit_uint8_t dest_base,
971 jit_uint8_t dest_index,
972 jit_uint8_t dest_scale,
975 jit->write_ubyte(IA32_MOV_RM_IMM32);
976 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
977 jit->write_ubyte(ia32_sib(dest_scale, dest_index, dest_base));
979 jit->write_int32(val);
982 inline void IA32_Mov_ESP_Disp8_Imm32(JitWriter *jit, jit_int8_t disp8, jit_int32_t val)
984 jit->write_ubyte(IA32_MOV_RM_IMM32);
985 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, REG_SIB));
986 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
987 jit->write_byte(disp8);
988 jit->write_int32(val);
992 * Floating Point Instructions
995 inline void IA32_Fstcw_Mem16_ESP(JitWriter *jit)
997 jit->write_ubyte(IA32_FSTCW_MEM16_1);
998 jit->write_ubyte(IA32_FSTCW_MEM16_2);
999 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 7, REG_SIB));
1000 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1003 inline void IA32_Fldcw_Mem16_ESP(JitWriter *jit)
1005 jit->write_ubyte(IA32_FLDCW_MEM16);
1006 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 5, REG_SIB));
1007 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1010 inline void IA32_Fldcw_Mem16_Disp8_ESP(JitWriter *jit, jit_int8_t disp8)
1012 jit->write_ubyte(IA32_FLDCW_MEM16);
1013 jit->write_ubyte(ia32_modrm(MOD_DISP8, 5, REG_SIB));
1014 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1015 jit->write_byte(disp8);
1018 inline void IA32_Fistp_Mem32_ESP(JitWriter *jit)
1020 jit->write_ubyte(IA32_FISTP_MEM32);
1021 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, REG_SIB));
1022 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1025 inline void IA32_Fistp_Mem32_Disp8_Esp(JitWriter *jit, jit_int8_t disp8)
1027 jit->write_ubyte(IA32_FISTP_MEM32);
1028 jit->write_ubyte(ia32_modrm(MOD_DISP8, 3, REG_SIB));
1029 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1030 jit->write_byte(disp8);
1033 inline void IA32_Fucomip_ST0_FPUreg(JitWriter *jit, jit_uint8_t reg)
1035 jit->write_ubyte(IA32_FUCOMIP_1);
1036 jit->write_ubyte(IA32_FUCOMIP_2+reg);
1039 inline void IA32_Fadd_FPUreg_ST0(JitWriter *jit, jit_uint8_t reg)
1041 jit->write_ubyte(IA32_FADD_FPREG_ST0_1);
1042 jit->write_ubyte(IA32_FADD_FPREG_ST0_2+reg);
1045 inline void IA32_Fadd_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
1047 jit->write_ubyte(IA32_FADD_MEM32);
1048 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, src));
1049 jit->write_byte(val);
1052 inline void IA32_Fadd_Mem32_ESP(JitWriter *jit)
1054 jit->write_ubyte(IA32_FADD_MEM32);
1055 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
1056 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1059 inline void IA32_Fsub_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
1061 jit->write_ubyte(IA32_FSUB_MEM32);
1062 jit->write_ubyte(ia32_modrm(MOD_DISP8, 4, src));
1063 jit->write_byte(val);
1066 inline void IA32_Fmul_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
1068 jit->write_ubyte(IA32_FMUL_MEM32);
1069 jit->write_ubyte(ia32_modrm(MOD_DISP8, 1, src));
1070 jit->write_byte(val);
1073 inline void IA32_Fdiv_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
1075 jit->write_ubyte(IA32_FDIV_MEM32);
1076 jit->write_ubyte(ia32_modrm(MOD_DISP8, 6, src));
1077 jit->write_byte(val);
1080 inline void IA32_Fild_Mem32(JitWriter *jit, jit_uint8_t src)
1082 jit->write_ubyte(IA32_FILD_MEM32);
1083 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, src));
1086 inline void IA32_Fstp_Mem32(JitWriter *jit, jit_uint8_t dest)
1088 jit->write_ubyte(IA32_FSTP_MEM32);
1089 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, dest));
1092 inline void IA32_Fstp_Mem64(JitWriter *jit, jit_uint8_t dest)
1094 jit->write_ubyte(IA32_FSTP_MEM64);
1095 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, dest));
1098 inline void IA32_Fstp_Mem32_ESP(JitWriter *jit)
1100 jit->write_ubyte(IA32_FSTP_MEM32);
1101 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, REG_SIB));
1102 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1105 inline void IA32_Fstp_Mem64_ESP(JitWriter *jit)
1107 jit->write_ubyte(IA32_FSTP_MEM64);
1108 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 3, REG_SIB));
1109 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1112 inline void IA32_Fstp_FPUreg(JitWriter *jit, jit_uint8_t reg)
1114 jit->write_ubyte(IA32_FSTP_FPREG_1);
1115 jit->write_ubyte(IA32_FSTP_FPREG_2+reg);
1118 inline void IA32_Fld_Mem32(JitWriter *jit, jit_uint8_t src)
1120 jit->write_ubyte(IA32_FLD_MEM32);
1121 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, src));
1124 inline void IA32_Fld_Mem64(JitWriter *jit, jit_uint8_t src)
1126 jit->write_ubyte(IA32_FLD_MEM64);
1127 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, src));
1130 inline void IA32_Fld_Mem32_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
1132 jit->write_ubyte(IA32_FLD_MEM32);
1133 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, src));
1134 jit->write_byte(val);
1137 inline void IA32_Fld_Mem64_Disp8(JitWriter *jit, jit_uint8_t src, jit_int8_t val)
1139 jit->write_ubyte(IA32_FLD_MEM64);
1140 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, src));
1141 jit->write_byte(val);
1144 inline void IA32_Fld_Mem32_Disp32(JitWriter *jit, jit_uint8_t src, jit_int32_t val)
1146 jit->write_ubyte(IA32_FLD_MEM32);
1147 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, src));
1148 jit->write_int32(val);
1151 inline void IA32_Fld_Mem64_Disp32(JitWriter *jit, jit_uint8_t src, jit_int32_t val)
1153 jit->write_ubyte(IA32_FLD_MEM64);
1154 jit->write_ubyte(ia32_modrm(MOD_DISP32, 0, src));
1155 jit->write_int32(val);
1159 * Move data with zero extend
1162 inline void IA32_Movzx_Reg32_Rm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
1164 jit->write_ubyte(IA32_MOVZX_R32_RM8_1);
1165 jit->write_ubyte(IA32_MOVZX_R32_RM8_2);
1166 jit->write_ubyte(ia32_modrm(mode, dest, src));
1169 inline void IA32_Movzx_Reg32_Rm8_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
1171 jit->write_ubyte(IA32_MOVZX_R32_RM8_1);
1172 jit->write_ubyte(IA32_MOVZX_R32_RM8_2);
1173 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
1174 jit->write_byte(disp);
1177 inline void IA32_Movzx_Reg32_Rm8_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
1179 jit->write_ubyte(IA32_MOVZX_R32_RM8_1);
1180 jit->write_ubyte(IA32_MOVZX_R32_RM8_2);
1181 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
1182 jit->write_int32(disp);
1185 inline void IA32_Movzx_Reg32_Rm16(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
1187 jit->write_ubyte(IA32_MOVZX_R32_RM16_1);
1188 jit->write_ubyte(IA32_MOVZX_R32_RM16_2);
1189 jit->write_ubyte(ia32_modrm(mode, dest, src));
1192 inline void IA32_Movzx_Reg32_Rm16_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
1194 jit->write_ubyte(IA32_MOVZX_R32_RM16_1);
1195 jit->write_ubyte(IA32_MOVZX_R32_RM16_2);
1196 jit->write_ubyte(ia32_modrm(MOD_DISP8, dest, src));
1197 jit->write_byte(disp);
1200 inline void IA32_Movzx_Reg32_Rm16_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
1202 jit->write_ubyte(IA32_MOVZX_R32_RM16_1);
1203 jit->write_ubyte(IA32_MOVZX_R32_RM16_2);
1204 jit->write_ubyte(ia32_modrm(MOD_DISP32, dest, src));
1205 jit->write_int32(disp);
1212 inline jitoffs_t IA32_Jump_Cond_Imm8(JitWriter *jit, jit_uint8_t cond, jit_int8_t disp)
1215 jit->write_ubyte(IA32_JCC_IMM+cond);
1216 ptr = jit->get_outputpos();
1217 jit->write_byte(disp);
1221 inline jitoffs_t IA32_Jump_Imm32(JitWriter *jit, jit_int32_t disp)
1224 jit->write_ubyte(IA32_JMP_IMM32);
1225 ptr = jit->get_outputpos();
1226 jit->write_int32(disp);
1230 inline jitoffs_t IA32_Jump_Imm8(JitWriter *jit, jit_int8_t disp)
1233 jit->write_ubyte(IA32_JMP_IMM8);
1234 ptr = jit->get_outputpos();
1235 jit->write_byte(disp);
1239 inline jitoffs_t IA32_Jump_Cond_Imm32(JitWriter *jit, jit_uint8_t cond, jit_int32_t disp)
1242 jit->write_ubyte(IA32_JCC_IMM32_1);
1243 jit->write_ubyte(IA32_JCC_IMM32_2+cond);
1244 ptr = jit->get_outputpos();
1245 jit->write_int32(disp);
1249 inline void IA32_Jump_Reg(JitWriter *jit, jit_uint8_t reg)
1251 jit->write_ubyte(IA32_JMP_RM);
1252 jit->write_ubyte(ia32_modrm(MOD_REG, 4, reg));
1255 inline void IA32_Jump_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
1257 jit->write_ubyte(IA32_JMP_RM);
1258 jit->write_ubyte(ia32_modrm(mode, 4, reg));
1261 inline jitoffs_t IA32_Call_Imm32(JitWriter *jit, jit_int32_t disp)
1264 jit->write_ubyte(IA32_CALL_IMM32);
1265 ptr = jit->get_outputpos();
1266 jit->write_int32(disp);
1270 inline void IA32_Call_Reg(JitWriter *jit, jit_uint8_t reg)
1272 jit->write_ubyte(IA32_CALL_RM);
1273 jit->write_ubyte(ia32_modrm(MOD_REG, 2, reg));
1276 inline void IA32_Write_Jump8(JitWriter *jit, jitoffs_t jmp, jitoffs_t target)
1279 jitcode_t oldptr = jit->outptr;
1280 //get relative difference
1281 jit_int8_t diff = (target - (jmp + 1));
1282 //overwrite old value
1283 jit->outptr = jit->outbase + jmp;
1284 jit->write_byte(diff);
1286 jit->outptr = oldptr;
1289 inline void IA32_Write_Jump32(JitWriter *jit, jitoffs_t jmp, jitoffs_t target)
1292 jitcode_t oldptr = jit->outptr;
1293 //get relative difference
1294 jit_int32_t diff = (target - (jmp + 4));
1295 //overwrite old value
1296 jit->outptr = jit->outbase + jmp;
1297 jit->write_int32(diff);
1299 jit->outptr = oldptr;
1303 * Corrects a jump using an absolute offset, not a relative one.
1305 inline void IA32_Write_Jump32_Abs(JitWriter *jit, jitoffs_t jmp, void *target)
1308 jitcode_t oldptr = jit->outptr;
1309 //get relative difference
1310 long diff = ((long)target - ((long)jit->outbase + jmp + 4));
1311 //overwrite old value
1312 jit->outptr = jit->outbase + jmp;
1313 jit->write_int32(diff);
1315 jit->outptr = oldptr;
1318 /* For writing and auto-calculating an absolute target */
1319 inline void IA32_Jump_Imm32_Abs(JitWriter *jit, jitoffs_t target)
1321 /* :TODO: this should work, but does it? */
1322 jit->write_ubyte(IA32_JMP_IMM32);
1323 IA32_Write_Jump32(jit, jit->get_outputpos(), target);
1327 inline void IA32_Jump_Cond_Imm32_Abs(JitWriter *jit, jit_uint8_t cond, jitoffs_t target)
1329 /* :TODO: this should work, but does it? */
1330 jit->write_ubyte(IA32_JCC_IMM32_1);
1331 jit->write_ubyte(IA32_JCC_IMM32_2+cond);
1332 IA32_Write_Jump32(jit, jit->get_outputpos(), target);
1336 inline void IA32_Send_Jump8_Here(JitWriter *jit, jitoffs_t jmp)
1338 jitoffs_t curptr = jit->get_outputpos();
1339 IA32_Write_Jump8(jit, jmp, curptr);
1342 inline void IA32_Send_Jump32_Here(JitWriter *jit, jitoffs_t jmp)
1344 jitoffs_t curptr = jit->get_outputpos();
1345 IA32_Write_Jump32(jit, jmp, curptr);
1348 inline void IA32_Return(JitWriter *jit)
1350 jit->write_ubyte(IA32_RET);
1353 inline void IA32_Return_Popstack(JitWriter *jit, unsigned short bytes)
1355 jit->write_ubyte(IA32_RETN);
1356 jit->write_ushort(bytes);
1359 inline void IA32_Test_Rm_Reg(JitWriter *jit, jit_uint8_t reg1, jit_uint8_t reg2, jit_uint8_t mode)
1361 jit->write_ubyte(IA32_TEST_RM_REG);
1362 jit->write_ubyte(ia32_modrm(mode, reg2, reg1));
1365 inline void IA32_Cmp_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
1367 jit->write_ubyte(IA32_CMP_RM_REG);
1368 jit->write_ubyte(ia32_modrm(mode, src, dest));
1371 inline void IA32_Cmp_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
1373 jit->write_ubyte(IA32_CMP_REG_RM);
1374 jit->write_ubyte(ia32_modrm(mode, dest, src));
1377 inline void IA32_Cmp_Reg_Rm_ESP(JitWriter *jit, jit_uint8_t cmpreg)
1379 jit->write_ubyte(IA32_CMP_REG_RM);
1380 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, cmpreg, REG_SIB));
1381 jit->write_ubyte(ia32_sib(NOSCALE, REG_NOIDX, REG_ESP));
1384 inline void IA32_Cmp_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t reg1, jit_uint8_t reg2, jit_int8_t disp8)
1386 jit->write_ubyte(IA32_CMP_REG_RM);
1387 jit->write_ubyte(ia32_modrm(MOD_DISP8, reg1, reg2));
1388 jit->write_byte(disp8);
1391 inline void IA32_Cmp_Rm_Imm8(JitWriter *jit, jit_uint8_t mode, jit_uint8_t rm, jit_int8_t imm8)
1393 jit->write_ubyte(IA32_CMP_RM_IMM8);
1394 jit->write_ubyte(ia32_modrm(mode, 7, rm));
1395 jit->write_byte(imm8);
1398 inline void IA32_Cmp_Rm_Imm32(JitWriter *jit, jit_uint8_t mode, jit_uint8_t rm, jit_int32_t imm32)
1400 jit->write_ubyte(IA32_CMP_RM_IMM32);
1401 jit->write_ubyte(ia32_modrm(mode, 7, rm));
1402 jit->write_int32(imm32);
1405 inline void IA32_Cmp_Rm_Imm32_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp8, jit_int32_t imm32)
1407 jit->write_ubyte(IA32_CMP_RM_IMM32);
1408 jit->write_ubyte(ia32_modrm(MOD_DISP8, 7, reg));
1409 jit->write_byte(disp8);
1410 jit->write_int32(imm32);
1413 inline void IA32_Cmp_Rm_Disp8_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp, jit_int8_t imm8)
1415 jit->write_ubyte(IA32_CMP_RM_IMM8);
1416 jit->write_ubyte(ia32_modrm(MOD_DISP8, 7, reg));
1417 jit->write_byte(disp);
1418 jit->write_byte(imm8);
1421 inline void IA32_Cmp_Al_Imm8(JitWriter *jit, jit_int8_t value)
1423 jit->write_ubyte(IA32_CMP_AL_IMM32);
1424 jit->write_byte(value);
1427 inline void IA32_Cmp_Eax_Imm32(JitWriter *jit, jit_int32_t value)
1429 jit->write_ubyte(IA32_CMP_EAX_IMM32);
1430 jit->write_int32(value);
1433 inline void IA32_SetCC_Rm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t cond)
1435 jit->write_ubyte(IA32_SETCC_RM8_1);
1436 jit->write_ubyte(IA32_SETCC_RM8_2+cond);
1437 jit->write_ubyte(ia32_modrm(MOD_REG, 0, reg));
1440 inline void IA32_CmovCC_Rm(JitWriter *jit, jit_uint8_t src, jit_uint8_t cond)
1442 jit->write_ubyte(IA32_CMOVCC_RM_1);
1443 jit->write_ubyte(IA32_CMOVCC_RM_2+cond);
1444 jit->write_ubyte(ia32_modrm(MOD_MEM_REG, 0, src));
1447 inline void IA32_CmovCC_Rm_Disp8(JitWriter *jit, jit_uint8_t src, jit_uint8_t cond, jit_int8_t disp)
1449 jit->write_ubyte(IA32_CMOVCC_RM_1);
1450 jit->write_ubyte(IA32_CMOVCC_RM_2+cond);
1451 jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, src));
1452 jit->write_byte(disp);
1455 inline void IA32_Cmpsb(JitWriter *jit)
1457 jit->write_ubyte(IA32_CMPSB);
1460 inline void IA32_Rep(JitWriter *jit)
1462 jit->write_ubyte(IA32_REP);
1465 inline void IA32_Movsd(JitWriter *jit)
1467 jit->write_ubyte(IA32_MOVSD);
1470 inline void IA32_Movsb(JitWriter *jit)
1472 jit->write_ubyte(IA32_MOVSB);
1475 inline void IA32_Stosd(JitWriter *jit)
1477 jit->write_ubyte(IA32_STOSD);
1480 inline void IA32_Cld(JitWriter *jit)
1482 jit->write_ubyte(IA32_CLD);
1485 #endif //_INCLUDE_JIT_X86_MACROS_H