public/jit/x86/x86_macros.h

00001 /**
00002  * vim: set ts=4 :
00003  * =============================================================================
00004  * SourcePawn JIT SDK
00005  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
00006  * =============================================================================
00007  *
00008  * This program is free software; you can redistribute it and/or modify it under
00009  * the terms of the GNU General Public License, version 3.0, as published by the
00010  * Free Software Foundation.
00011  * 
00012  * This program is distributed in the hope that it will be useful, but WITHOUT
00013  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00014  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
00015  * details.
00016  *
00017  * You should have received a copy of the GNU General Public License along with
00018  * this program.  If not, see <http://www.gnu.org/licenses/>.
00019  *
00020  * As a special exception, AlliedModders LLC gives you permission to link the
00021  * code of this program (as well as its derivative works) to "Half-Life 2," the
00022  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
00023  * by the Valve Corporation.  You must obey the GNU General Public License in
00024  * all respects for all other code used.  Additionally, AlliedModders LLC grants
00025  * this exception to all derivative works.  AlliedModders LLC defines further
00026  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
00027  * or <http://www.sourcemod.net/license.php>.
00028  *
00029  * Version: $Id$
00030  */
00031 
00032 #ifndef _INCLUDE_JIT_X86_MACROS_H
00033 #define _INCLUDE_JIT_X86_MACROS_H
00034 
00035 #include <limits.h>
00036 
00037 //MOD R/M
00038 #define MOD_MEM_REG 0
00039 #define MOD_DISP8   1
00040 #define MOD_DISP32  2
00041 #define MOD_REG               3
00042 
00043 //SIB
00044 #define NOSCALE               0
00045 #define   SCALE2              1
00046 #define   SCALE4              2
00047 #define SCALE8                3
00048 
00049 //Register codes
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 //condition codes (for example, Jcc opcodes)
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 //Opcodes with encoding information
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 //mode is the scaling method - NOSCALE ... SCALE8
00212 //index is the register that is scaled
00213 //base is the base register
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  * INCREMENT/DECREMENT *
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  * BINARY LOGIC *
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  * ARITHMETIC (BASIC) *
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 * Memory Instructions
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 * Stack Instructions
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  * Moving from REGISTER/MEMORY to REGISTER
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  * Moving from REGISTER to REGISTER/MEMORY
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  * Moving from IMMEDIATE to REGISTER
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 * Floating Point Instructions
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