Making sure mono_marshal_free is used instead of g_free in mono_string_builder_to_utf8
[mono.git] / mono / arch / amd64 / amd64-codegen.h
1 /*
2  * amd64-codegen.h: Macros for generating amd64 code
3  *
4  * Authors:
5  *   Paolo Molaro (lupus@ximian.com)
6  *   Intel Corporation (ORP Project)
7  *   Sergey Chaban (serge@wildwestsoftware.com)
8  *   Dietmar Maurer (dietmar@ximian.com)
9  *   Patrik Torstensson
10  *   Zalman Stern
11  * 
12  * Copyright (C)  2000 Intel Corporation.  All rights reserved.
13  * Copyright (C)  2001, 2002 Ximian, Inc.
14  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
15  */
16
17 #ifndef AMD64_H
18 #define AMD64_H
19
20 // Conventions in this file:
21
22 // body: implementation. other macros call this one
23 // disp: displacement
24 // inst: instruction
25 // is_half: short if true, byte if false (then why is it named is_half...?)
26 // imm: immediate
27 // mem: read from (immediate-supplied address?)
28 // membase: read from address in a base register plus a displacement
29 // memindex: SIP addressing: (address in base register) + (displacement in index register)<<(shift)
30 // reg: register, encode modR/M bits 00
31 // regp: register, encode modR/M bits 11
32 // size: Expected 1,2,4 or 8
33 // widen: extends from 1 or 2 bytes
34
35 #include <glib.h>
36
37 typedef enum {
38         AMD64_RAX = 0,
39         AMD64_RCX = 1,
40         AMD64_RDX = 2,
41         AMD64_RBX = 3,
42         AMD64_RSP = 4,
43         AMD64_RBP = 5,
44         AMD64_RSI = 6,
45         AMD64_RDI = 7,
46         AMD64_R8 = 8,
47         AMD64_R9 = 9,
48         AMD64_R10 = 10,
49         AMD64_R11 = 11,
50         AMD64_R12 = 12,
51         AMD64_R13 = 13,
52         AMD64_R14 = 14,
53         AMD64_R15 = 15,
54         AMD64_RIP = 16,
55         AMD64_NREG
56 } AMD64_Reg_No;
57
58 typedef enum {
59         AMD64_XMM0 = 0,
60         AMD64_XMM1 = 1,
61         AMD64_XMM2 = 2,
62         AMD64_XMM3 = 3,
63         AMD64_XMM4 = 4,
64         AMD64_XMM5 = 5,
65         AMD64_XMM6 = 6,
66         AMD64_XMM7 = 7,
67         AMD64_XMM8 = 8,
68         AMD64_XMM9 = 9,
69         AMD64_XMM10 = 10,
70         AMD64_XMM11 = 11,
71         AMD64_XMM12 = 12,
72         AMD64_XMM13 = 13,
73         AMD64_XMM14 = 14,
74         AMD64_XMM15 = 15,
75         AMD64_XMM_NREG = 16,
76 } AMD64_XMM_Reg_No;
77
78 typedef enum
79 {
80   AMD64_REX_B = 1, /* The register in r/m field, base register in SIB byte, or reg in opcode is 8-15 rather than 0-7 */
81   AMD64_REX_X = 2, /* The index register in SIB byte is 8-15 rather than 0-7 */
82   AMD64_REX_R = 4, /* The reg field of ModRM byte is 8-15 rather than 0-7 */
83   AMD64_REX_W = 8  /* Opeartion is 64-bits instead of 32 (default) or 16 (with 0x66 prefix) */
84 } AMD64_REX_Bits;
85
86 #if defined(__default_codegen__)
87
88 #define amd64_codegen_pre(inst)
89 #define amd64_codegen_post(inst)
90
91 #elif defined(__native_client_codegen__)
92
93 #define amd64_codegen_pre(inst) guint8* _codegen_start = (inst); amd64_nacl_instruction_pre();
94 #define amd64_codegen_post(inst) (amd64_nacl_instruction_post(&_codegen_start, &(inst)), _codegen_start);
95
96 /* Because of rex prefixes, etc, call sequences are not constant size.  */
97 /* These pre- and post-sequence hooks remedy this by aligning the call  */
98 /* sequence after we emit it, since we will know the exact size then.   */
99 #define amd64_call_sequence_pre(inst) guint8* _code_start = (inst);
100 #define amd64_call_sequence_post(inst) \
101   (mono_nacl_align_call(&_code_start, &(inst)), _code_start);
102
103 /* Native client can load/store using one of the following registers     */
104 /* as a base: rip, r15, rbp, rsp.  Any other base register needs to have */
105 /* its upper 32 bits cleared and reference memory using r15 as the base. */
106 #define amd64_is_valid_nacl_base(reg) \
107   ((reg) == AMD64_RIP || (reg) == AMD64_R15 || \
108    (reg) == AMD64_RBP || (reg) == AMD64_RSP)
109
110 #endif /*__native_client_codegen__*/
111
112 #ifdef TARGET_WIN32
113 #define AMD64_ARG_REG1 AMD64_RCX
114 #define AMD64_ARG_REG2 AMD64_RDX
115 #define AMD64_ARG_REG3 AMD64_R8
116 #define AMD64_ARG_REG4 AMD64_R9
117 #else
118 #define AMD64_ARG_REG1 AMD64_RDI
119 #define AMD64_ARG_REG2 AMD64_RSI
120 #define AMD64_ARG_REG3 AMD64_RDX
121 #define AMD64_ARG_REG4 AMD64_RCX
122 #endif
123
124 #ifdef TARGET_WIN32
125 #define AMD64_CALLEE_REGS ((1<<AMD64_RAX) | (1<<AMD64_RCX) | (1<<AMD64_RDX) | (1<<AMD64_R8) | (1<<AMD64_R9) | (1<<AMD64_R10))
126 #define AMD64_IS_CALLEE_REG(reg)  (AMD64_CALLEE_REGS & (1 << (reg)))
127
128 #define AMD64_ARGUMENT_REGS ((1<<AMD64_RDX) | (1<<AMD64_RCX) | (1<<AMD64_R8) | (1<<AMD64_R9))
129 #define AMD64_IS_ARGUMENT_REG(reg) (AMD64_ARGUMENT_REGS & (1 << (reg)))
130
131 #define AMD64_CALLEE_SAVED_REGS ((1<<AMD64_RDI) | (1<<AMD64_RSI) | (1<<AMD64_RBX) | (1<<AMD64_R12) | (1<<AMD64_R13) | (1<<AMD64_R14) | (1<<AMD64_R15) | (1<<AMD64_RBP))
132 #define AMD64_IS_CALLEE_SAVED_REG(reg) (AMD64_CALLEE_SAVED_REGS & (1 << (reg)))
133 #elif defined(__native_client_codegen__)
134 /* AMD64 Native Client code may not write R15 */
135 #define AMD64_CALLEE_REGS ((1<<AMD64_RAX) | (1<<AMD64_RCX) | (1<<AMD64_RDX) | (1<<AMD64_RSI) | (1<<AMD64_RDI) | (1<<AMD64_R8) | (1<<AMD64_R9) | (1<<AMD64_R10))
136 #define AMD64_IS_CALLEE_REG(reg)  (AMD64_CALLEE_REGS & (1 << (reg)))
137
138 #define AMD64_ARGUMENT_REGS ((1<<AMD64_RDI) | (1<<AMD64_RSI) | (1<<AMD64_RDX) | (1<<AMD64_RCX) | (1<<AMD64_R8) | (1<<AMD64_R9))
139 #define AMD64_IS_ARGUMENT_REG(reg) (AMD64_ARGUMENT_REGS & (1 << (reg)))
140
141 #define AMD64_CALLEE_SAVED_REGS ((1<<AMD64_RBX) | (1<<AMD64_R12) | (1<<AMD64_R13) | (1<<AMD64_R14) | (1<<AMD64_RBP))
142 #define AMD64_IS_CALLEE_SAVED_REG(reg) (AMD64_CALLEE_SAVED_REGS & (1 << (reg)))
143 #else
144 #define AMD64_CALLEE_REGS ((1<<AMD64_RAX) | (1<<AMD64_RCX) | (1<<AMD64_RDX) | (1<<AMD64_RSI) | (1<<AMD64_RDI) | (1<<AMD64_R8) | (1<<AMD64_R9) | (1<<AMD64_R10))
145 #define AMD64_IS_CALLEE_REG(reg)  (AMD64_CALLEE_REGS & (1 << (reg)))
146
147 #define AMD64_ARGUMENT_REGS ((1<<AMD64_RDI) | (1<<AMD64_RSI) | (1<<AMD64_RDX) | (1<<AMD64_RCX) | (1<<AMD64_R8) | (1<<AMD64_R9))
148 #define AMD64_IS_ARGUMENT_REG(reg) (AMD64_ARGUMENT_REGS & (1 << (reg)))
149
150 #define AMD64_CALLEE_SAVED_REGS ((1<<AMD64_RBX) | (1<<AMD64_R12) | (1<<AMD64_R13) | (1<<AMD64_R14) | (1<<AMD64_R15) | (1<<AMD64_RBP))
151 #define AMD64_IS_CALLEE_SAVED_REG(reg) (AMD64_CALLEE_SAVED_REGS & (1 << (reg)))
152 #endif
153
154 #define AMD64_REX(bits) ((unsigned char)(0x40 | (bits)))
155 #if defined(__default_codegen__)
156 #define amd64_emit_rex(inst, width, reg_modrm, reg_index, reg_rm_base_opcode) do \
157         { \
158                 unsigned char _amd64_rex_bits = \
159                         (((width) > 4) ? AMD64_REX_W : 0) | \
160                         (((reg_modrm) > 7) ? AMD64_REX_R : 0) | \
161                         (((reg_index) > 7) ? AMD64_REX_X : 0) | \
162                         (((reg_rm_base_opcode) > 7) ? AMD64_REX_B : 0); \
163                 if ((_amd64_rex_bits != 0) || (((width) == 1))) *(inst)++ = AMD64_REX(_amd64_rex_bits); \
164         } while (0)
165 #elif defined(__native_client_codegen__)
166 #define amd64_emit_rex(inst, width, reg_modrm, reg_index, reg_rm_base_opcode) do \
167         { \
168                 unsigned char _amd64_rex_bits = \
169                         (((width) > 4) ? AMD64_REX_W : 0) | \
170                         (((reg_modrm) > 7) ? AMD64_REX_R : 0) | \
171                         (((reg_index) > 7) ? AMD64_REX_X : 0) | \
172                         (((reg_rm_base_opcode) > 7) ? AMD64_REX_B : 0); \
173                 amd64_nacl_tag_rex((inst)); \
174                 if ((_amd64_rex_bits != 0) || (((width) == 1))) *(inst)++ = AMD64_REX(_amd64_rex_bits); \
175         } while (0)
176 #endif
177
178 typedef union {
179         guint64 val;
180         unsigned char b [8];
181 } amd64_imm_buf;
182
183 #include "../x86/x86-codegen.h"
184
185 /* In 64 bit mode, all registers have a low byte subregister */
186 #undef X86_IS_BYTE_REG
187 #define X86_IS_BYTE_REG(reg) 1
188
189 #define amd64_modrm_mod(modrm) ((modrm) >> 6)
190 #define amd64_modrm_reg(modrm) (((modrm) >> 3) & 0x7)
191 #define amd64_modrm_rm(modrm) ((modrm) & 0x7)
192
193 #define amd64_rex_r(rex) ((((rex) >> 2) & 0x1) << 3)
194 #define amd64_rex_x(rex) ((((rex) >> 1) & 0x1) << 3)
195 #define amd64_rex_b(rex) ((((rex) >> 0) & 0x1) << 3)
196
197 #define amd64_sib_scale(sib) ((sib) >> 6)
198 #define amd64_sib_index(sib) (((sib) >> 3) & 0x7)
199 #define amd64_sib_base(sib) ((sib) & 0x7)
200
201 #define amd64_is_imm32(val) ((gint64)val >= -((gint64)1<<31) && (gint64)val <= (((gint64)1<<31)-1))
202
203 #define x86_imm_emit64(inst,imm)     \
204         do {    \
205                         amd64_imm_buf imb;      \
206                         imb.val = (guint64) (imm);      \
207                         *(inst)++ = imb.b [0];  \
208                         *(inst)++ = imb.b [1];  \
209                         *(inst)++ = imb.b [2];  \
210                         *(inst)++ = imb.b [3];  \
211                         *(inst)++ = imb.b [4];  \
212                         *(inst)++ = imb.b [5];  \
213                         *(inst)++ = imb.b [6];  \
214                         *(inst)++ = imb.b [7];  \
215         } while (0)
216
217 #define amd64_membase_emit(inst,reg,basereg,disp) do { \
218         if ((basereg) == AMD64_RIP) { \
219         x86_address_byte ((inst), 0, (reg)&0x7, 5); \
220         x86_imm_emit32 ((inst), (disp)); \
221     } \
222         else \
223                 x86_membase_emit ((inst),(reg)&0x7, (basereg)&0x7, (disp)); \
224 } while (0)
225
226 #define amd64_alu_reg_imm_size_body(inst,opc,reg,imm,size) \
227         do {    \
228                 if (x86_is_imm8((imm))) {       \
229                         amd64_emit_rex(inst, size, 0, 0, (reg)); \
230                         *(inst)++ = (unsigned char)0x83;        \
231                         x86_reg_emit ((inst), (opc), (reg));    \
232                         x86_imm_emit8 ((inst), (imm));  \
233                 } else if ((reg) == AMD64_RAX) {        \
234                         amd64_emit_rex(inst, size, 0, 0, 0); \
235                         *(inst)++ = (((unsigned char)(opc)) << 3) + 5;  \
236                         x86_imm_emit32 ((inst), (imm)); \
237                 } else {        \
238                         amd64_emit_rex(inst, size, 0, 0, (reg)); \
239                         *(inst)++ = (unsigned char)0x81;        \
240                         x86_reg_emit ((inst), (opc), (reg));    \
241                         x86_imm_emit32 ((inst), (imm)); \
242                 }       \
243         } while (0)
244
245 #define amd64_alu_reg_reg_size_body(inst,opc,dreg,reg,size)     \
246         do {    \
247                 amd64_emit_rex(inst, size, (dreg), 0, (reg)); \
248                 *(inst)++ = (((unsigned char)(opc)) << 3) + 3;  \
249                 x86_reg_emit ((inst), (dreg), (reg));   \
250         } while (0)
251
252 #define amd64_test_reg_imm_size_body(inst,reg,imm,size) \
253         do { \
254                 amd64_codegen_pre(inst); \
255                 amd64_emit_rex ((inst),(size),0,0,(reg)); \
256                 if ((reg) == AMD64_RAX) { \
257                         *(inst)++ = (unsigned char)0xa9; \
258                 } \
259                 else { \
260                         *(inst)++ = (unsigned char)0xf7;        \
261                         x86_reg_emit((inst), 0, (reg)); \
262                 } \
263                 x86_imm_emit32((inst), (imm));  \
264                 amd64_codegen_post(inst); \
265         } while (0)
266
267 #if defined(__default_codegen__)
268
269 #define amd64_alu_reg_imm_size(inst,opc,reg,imm,size) \
270         amd64_alu_reg_imm_size_body((inst), (opc), (reg), (imm), (size))
271
272 #define amd64_alu_reg_reg_size(inst,opc,dreg,reg,size) \
273                 amd64_alu_reg_reg_size_body((inst), (opc), (dreg), (reg), (size))
274
275 #define amd64_test_reg_imm_size(inst, reg, imm, size) \
276                 amd64_test_reg_imm_size_body(inst, reg, imm, size)
277
278 #elif defined(__native_client_codegen__)
279 /* NaCl modules may not directly update RSP or RBP other than direct copies */
280 /* between them. Instead the lower 4 bytes are updated and then added to R15 */
281 #define amd64_is_nacl_stack_reg(reg) (((reg) == AMD64_RSP) || ((reg) == AMD64_RBP))
282
283 #define amd64_alu_reg_imm_size(inst,opc,reg,imm,size)   \
284         do{ \
285                 amd64_codegen_pre(inst);                \
286                 if (amd64_is_nacl_stack_reg(reg)) { \
287                         if (((opc) != X86_ADD) && ((opc) != X86_SUB)) \
288                                 g_assert_not_reached(); \
289                         amd64_alu_reg_imm_size_body((inst), (opc), (reg), (imm), 4); \
290                         /* Use LEA instead of ADD to preserve flags */ \
291                         amd64_lea_memindex_size((inst), (reg), (reg), 0, AMD64_R15, 0, 8); \
292                 } else { \
293                         amd64_alu_reg_imm_size_body((inst), (opc), (reg), (imm), (size)); \
294                 } \
295                 amd64_codegen_post(inst);               \
296         } while(0)
297
298 #define amd64_alu_reg_reg_size(inst,opc,dreg,reg,size) \
299         do { \
300                 amd64_codegen_pre(inst);                \
301                 if (amd64_is_nacl_stack_reg((dreg)) && ((reg) != AMD64_R15)) { \
302                         if (((opc) != X86_ADD && (opc) != X86_SUB)) \
303                                 g_assert_not_reached(); \
304                         amd64_alu_reg_reg_size_body((inst), (opc), (dreg), (reg), 4); \
305                         /* Use LEA instead of ADD to preserve flags */ \
306                         amd64_lea_memindex_size((inst), (dreg), (dreg), 0, AMD64_R15, 0, 8); \
307                 } else { \
308                         amd64_alu_reg_reg_size_body((inst), (opc), (dreg), (reg), (size)); \
309                 } \
310                 amd64_codegen_post(inst);               \
311         } while (0)
312
313 #endif /*__native_client_codegen__*/
314
315 #define amd64_alu_reg_imm(inst,opc,reg,imm) amd64_alu_reg_imm_size((inst),(opc),(reg),(imm),8)
316
317 #define amd64_alu_reg_reg(inst,opc,dreg,reg) amd64_alu_reg_reg_size ((inst),(opc),(dreg),(reg),8)
318
319 #define amd64_test_reg_imm(inst,reg,imm) amd64_test_reg_imm_size(inst,reg,imm,8)
320
321 #define amd64_alu_reg_membase_size(inst,opc,reg,basereg,disp,size) \
322         do { \
323                 amd64_codegen_pre(inst);                                                  \
324                 amd64_emit_rex ((inst),(size),(reg),0,(basereg)); \
325                 *(inst)++ = (((unsigned char)(opc)) << 3) + 3;  \
326                 amd64_membase_emit (inst, reg, basereg, disp); \
327                 amd64_codegen_post(inst);                                          \
328 } while (0)
329
330 #define amd64_mov_regp_reg(inst,regp,reg,size)  \
331         do {    \
332                 amd64_codegen_pre(inst); \
333                 if ((size) == 2) \
334                         x86_prefix((inst), X86_OPERAND_PREFIX); \
335                 amd64_emit_rex(inst, (size), (reg), 0, (regp)); \
336                 switch ((size)) {       \
337                 case 1: *(inst)++ = (unsigned char)0x88; break; \
338                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x89; break; \
339                 default: assert (0);    \
340                 }       \
341                 x86_regp_emit ((inst), (reg), (regp));  \
342                 amd64_codegen_post(inst); \
343         } while (0)
344
345 #define amd64_mov_membase_reg(inst,basereg,disp,reg,size)       \
346         do {    \
347                 amd64_codegen_pre(inst); \
348                 if ((size) == 2) \
349                         x86_prefix((inst), X86_OPERAND_PREFIX); \
350                 amd64_emit_rex(inst, (size), (reg), 0, (basereg)); \
351                 switch ((size)) {       \
352                 case 1: *(inst)++ = (unsigned char)0x88; break; \
353                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x89; break; \
354                 default: assert (0);    \
355                 }       \
356                 x86_membase_emit ((inst), ((reg)&0x7), ((basereg)&0x7), (disp));        \
357                 amd64_codegen_post(inst); \
358         } while (0)
359
360 #define amd64_mov_mem_reg(inst,mem,reg,size)    \
361         do {    \
362                 amd64_codegen_pre(inst); \
363                 if ((size) == 2) \
364                         x86_prefix((inst), X86_OPERAND_PREFIX); \
365                 amd64_emit_rex(inst, (size), (reg), 0, 0); \
366                 switch ((size)) {       \
367                 case 1: *(inst)++ = (unsigned char)0x88; break; \
368                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x89; break; \
369                 default: assert (0);    \
370                 }       \
371                 x86_address_byte ((inst), 0, (reg), 4); \
372                 x86_address_byte ((inst), 0, 4, 5); \
373                 x86_imm_emit32 ((inst), (mem)); \
374                 amd64_codegen_post(inst); \
375         } while (0)
376
377 #define amd64_mov_reg_reg(inst,dreg,reg,size)   \
378         do {    \
379                 amd64_codegen_pre(inst); \
380                 if ((size) == 2) \
381                         x86_prefix((inst), X86_OPERAND_PREFIX); \
382                 amd64_emit_rex(inst, (size), (dreg), 0, (reg)); \
383                 switch ((size)) {       \
384                 case 1: *(inst)++ = (unsigned char)0x8a; break; \
385                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
386                 default: assert (0);    \
387                 }       \
388                 x86_reg_emit ((inst), (dreg), (reg));   \
389                 amd64_codegen_post(inst); \
390         } while (0)
391
392 #define amd64_mov_reg_mem_body(inst,reg,mem,size)       \
393         do {    \
394                 amd64_codegen_pre(inst); \
395                 if ((size) == 2) \
396                         x86_prefix((inst), X86_OPERAND_PREFIX); \
397                 amd64_emit_rex(inst, (size), (reg), 0, 0); \
398                 switch ((size)) {       \
399                 case 1: *(inst)++ = (unsigned char)0x8a; break; \
400                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
401                 default: assert (0);    \
402                 }       \
403                 x86_address_byte ((inst), 0, (reg), 4); \
404                 x86_address_byte ((inst), 0, 4, 5); \
405                 x86_imm_emit32 ((inst), (mem)); \
406                 amd64_codegen_post(inst); \
407         } while (0)
408
409 #if defined(__default_codegen__)
410 #define amd64_mov_reg_mem(inst,reg,mem,size)    \
411         do {    \
412                 amd64_mov_reg_mem_body((inst),(reg),(mem),(size)); \
413         } while (0)
414 #elif defined(__native_client_codegen__)
415 /* We have to re-base memory reads because memory isn't zero based. */
416 #define amd64_mov_reg_mem(inst,reg,mem,size)    \
417         do {    \
418                 amd64_mov_reg_membase((inst),(reg),AMD64_R15,(mem),(size)); \
419         } while (0)
420 #endif /* __native_client_codegen__ */
421
422 #define amd64_mov_reg_membase_body(inst,reg,basereg,disp,size)  \
423         do {    \
424                 if ((size) == 2) \
425                         x86_prefix((inst), X86_OPERAND_PREFIX); \
426                 amd64_emit_rex(inst, (size), (reg), 0, (basereg)); \
427                 switch ((size)) {       \
428                 case 1: *(inst)++ = (unsigned char)0x8a; break; \
429                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
430                 default: assert (0);    \
431                 }       \
432                 amd64_membase_emit ((inst), (reg), (basereg), (disp));  \
433         } while (0)
434
435 #define amd64_mov_reg_memindex_size_body(inst,reg,basereg,disp,indexreg,shift,size) \
436         do { \
437                 amd64_emit_rex ((inst),(size),(reg),(indexreg),(basereg)); \
438                 x86_mov_reg_memindex((inst),((reg)&0x7),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),(size) == 8 ? 4 : (size)); \
439         } while (0)
440
441 #if defined(__default_codegen__)
442
443 #define amd64_mov_reg_memindex_size(inst,reg,basereg,disp,indexreg,shift,size) \
444         amd64_mov_reg_memindex_size_body((inst),(reg),(basereg),(disp),(indexreg),(shift),(size))
445 #define amd64_mov_reg_membase(inst,reg,basereg,disp,size)       \
446         do {    \
447                 amd64_mov_reg_membase_body((inst), (reg), (basereg), (disp), (size)); \
448         } while (0)
449
450 #elif defined(__native_client_codegen__)
451
452 #define amd64_mov_reg_memindex_size(inst,reg,basereg,disp,indexreg,shift,size) \
453         do { \
454                 amd64_codegen_pre(inst); \
455                 if (amd64_is_nacl_stack_reg((reg))) { \
456                         /* Clear upper 32 bits with mov of size 4 */ \
457                         amd64_mov_reg_memindex_size_body((inst), (reg), (basereg), (disp), (indexreg), (shift), 4); \
458                         /* Add %r15 using LEA to preserve flags */ \
459                         amd64_lea_memindex_size((inst), (reg), (reg), 0, AMD64_R15, 0, 8); \
460                 } else { \
461                         amd64_mov_reg_memindex_size_body((inst), (reg), (basereg), (disp), (indexreg), (shift), (size)); \
462                 } \
463                 amd64_codegen_post(inst); \
464         } while(0)
465
466 #define amd64_mov_reg_membase(inst,reg,basereg,disp,size)       \
467         do {    \
468                 amd64_codegen_pre(inst); \
469                 if (amd64_is_nacl_stack_reg((reg))) { \
470                         /* Clear upper 32 bits with mov of size 4 */ \
471                         amd64_mov_reg_membase_body((inst), (reg), (basereg), (disp), 4); \
472                         /* Add %r15 */ \
473                         amd64_lea_memindex_size((inst), (reg), (reg), 0, AMD64_R15, 0, 8); \
474                 } else { \
475                         amd64_mov_reg_membase_body((inst), (reg), (basereg), (disp), (size)); \
476                 } \
477                 amd64_codegen_post(inst); \
478         } while (0)
479
480 #endif /*__native_client_codegen__*/
481
482 #define amd64_movzx_reg_membase(inst,reg,basereg,disp,size)     \
483         do {    \
484                 amd64_codegen_pre(inst); \
485                 amd64_emit_rex(inst, (size), (reg), 0, (basereg)); \
486                 switch ((size)) {       \
487                 case 1: *(inst)++ = (unsigned char)0x0f; *(inst)++ = (unsigned char)0xb6; break;        \
488                 case 2: *(inst)++ = (unsigned char)0x0f; *(inst)++ = (unsigned char)0xb7; break;        \
489                 case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
490                 default: assert (0);    \
491                 }       \
492                 x86_membase_emit ((inst), ((reg)&0x7), ((basereg)&0x7), (disp));        \
493                 amd64_codegen_post(inst); \
494         } while (0)
495
496 #define amd64_movsxd_reg_mem(inst,reg,mem) \
497     do {     \
498         amd64_codegen_pre(inst); \
499         amd64_emit_rex(inst,8,(reg),0,0); \
500         *(inst)++ = (unsigned char)0x63; \
501         x86_mem_emit ((inst), ((reg)&0x7), (mem)); \
502         amd64_codegen_post(inst); \
503     } while (0)
504
505 #define amd64_movsxd_reg_membase(inst,reg,basereg,disp) \
506     do {     \
507         amd64_codegen_pre(inst); \
508         amd64_emit_rex(inst,8,(reg),0,(basereg)); \
509         *(inst)++ = (unsigned char)0x63; \
510         x86_membase_emit ((inst), ((reg)&0x7), ((basereg)&0x7), (disp)); \
511         amd64_codegen_post(inst); \
512     } while (0)
513
514 #define amd64_movsxd_reg_reg(inst,dreg,reg) \
515     do {     \
516         amd64_codegen_pre(inst); \
517         amd64_emit_rex(inst,8,(dreg),0,(reg)); \
518         *(inst)++ = (unsigned char)0x63; \
519         x86_reg_emit ((inst), (dreg), (reg));   \
520         amd64_codegen_post(inst); \
521     } while (0)
522
523 /* Pretty much the only instruction that supports a 64-bit immediate. Optimize for common case of
524  * 32-bit immediate. Pepper with casts to avoid warnings.
525  */
526 #define amd64_mov_reg_imm_size(inst,reg,imm,size)       \
527         do {    \
528                 amd64_codegen_pre(inst); \
529                 amd64_emit_rex(inst, (size), 0, 0, (reg)); \
530                 *(inst)++ = (unsigned char)0xb8 + ((reg) & 0x7);        \
531                 if ((size) == 8) \
532                         x86_imm_emit64 ((inst), (guint64)(imm));        \
533                 else \
534                         x86_imm_emit32 ((inst), (int)(guint64)(imm));   \
535                 amd64_codegen_post(inst); \
536         } while (0)
537
538 #define amd64_mov_reg_imm(inst,reg,imm) \
539         do {    \
540                 int _amd64_width_temp = ((guint64)(imm) == (guint64)(int)(guint64)(imm)); \
541                 amd64_codegen_pre(inst); \
542                 amd64_mov_reg_imm_size ((inst), (reg), (imm), (_amd64_width_temp ? 4 : 8)); \
543                 amd64_codegen_post(inst); \
544         } while (0)
545
546 #define amd64_set_reg_template(inst,reg) amd64_mov_reg_imm_size ((inst),(reg), 0, 8)
547
548 #define amd64_set_template(inst,reg) amd64_set_reg_template((inst),(reg))
549
550 #define amd64_mov_membase_imm(inst,basereg,disp,imm,size)       \
551         do {    \
552                 amd64_codegen_pre(inst); \
553                 if ((size) == 2) \
554                         x86_prefix((inst), X86_OPERAND_PREFIX); \
555                 amd64_emit_rex(inst, (size) == 1 ? 0 : (size), 0, 0, (basereg)); \
556                 if ((size) == 1) {      \
557                         *(inst)++ = (unsigned char)0xc6;        \
558                         x86_membase_emit ((inst), 0, (basereg) & 0x7, (disp));  \
559                         x86_imm_emit8 ((inst), (imm));  \
560                 } else if ((size) == 2) {       \
561                         *(inst)++ = (unsigned char)0xc7;        \
562                         x86_membase_emit ((inst), 0, (basereg) & 0x7, (disp));  \
563                         x86_imm_emit16 ((inst), (imm)); \
564                 } else {        \
565                         *(inst)++ = (unsigned char)0xc7;        \
566                         x86_membase_emit ((inst), 0, (basereg) & 0x7, (disp));  \
567                         x86_imm_emit32 ((inst), (imm)); \
568                 }       \
569                 amd64_codegen_post(inst); \
570         } while (0)
571
572
573 #define amd64_lea_membase_body(inst,reg,basereg,disp)   \
574         do {    \
575                 amd64_emit_rex(inst, 8, (reg), 0, (basereg)); \
576                 *(inst)++ = (unsigned char)0x8d;        \
577                 amd64_membase_emit ((inst), (reg), (basereg), (disp));  \
578         } while (0)
579
580 #if defined(__default_codegen__)
581 #define amd64_lea_membase(inst,reg,basereg,disp) \
582         amd64_lea_membase_body((inst), (reg), (basereg), (disp))
583 #elif defined(__native_client_codegen__)
584 /* NaCl modules may not write directly into RSP/RBP. Instead, use a */
585 /*  32-bit LEA and add R15 to the effective address */
586 #define amd64_lea_membase(inst,reg,basereg,disp) \
587         do { \
588                 amd64_codegen_pre(inst); \
589                 if (amd64_is_nacl_stack_reg(reg)) { \
590                         /* 32-bit LEA */ \
591                         amd64_emit_rex((inst), 4, (reg), 0, (basereg)); \
592                         *(inst)++ = (unsigned char)0x8d; \
593                         amd64_membase_emit((inst), (reg), (basereg), (disp)); \
594                         /* Use a 64-bit LEA instead of an ADD to preserve flags */ \
595                         amd64_lea_memindex_size((inst), (reg), (reg), 0, AMD64_R15, 0, 8); \
596                 } else { \
597                         amd64_lea_membase_body((inst), (reg), (basereg), (disp)); \
598                 } \
599                 amd64_codegen_post(inst); \
600         } while (0)
601 #endif /*__native_client_codegen__*/
602
603 /* Instruction are implicitly 64-bits so don't generate REX for just the size. */
604 #define amd64_push_reg(inst,reg)        \
605         do {    \
606                 amd64_codegen_pre(inst); \
607                 amd64_emit_rex(inst, 0, 0, 0, (reg)); \
608                 *(inst)++ = (unsigned char)0x50 + ((reg) & 0x7);        \
609                 amd64_codegen_post(inst); \
610         } while (0)
611
612 /* Instruction is implicitly 64-bits so don't generate REX for just the size. */
613 #define amd64_push_membase(inst,basereg,disp)   \
614         do {    \
615                 amd64_codegen_pre(inst); \
616                 amd64_emit_rex(inst, 0, 0, 0, (basereg)); \
617                 *(inst)++ = (unsigned char)0xff;        \
618                 x86_membase_emit ((inst), 6, (basereg) & 0x7, (disp));  \
619                 amd64_codegen_post(inst); \
620         } while (0)
621
622 #define amd64_pop_reg_body(inst,reg)    \
623         do {    \
624                 amd64_codegen_pre(inst);  \
625                 amd64_emit_rex(inst, 0, 0, 0, (reg)); \
626                 *(inst)++ = (unsigned char)0x58 + ((reg) & 0x7);        \
627                 amd64_codegen_post(inst);  \
628         } while (0)
629
630 #if defined(__default_codegen__)
631
632 #define amd64_call_reg(inst,reg)        \
633         do {    \
634                 amd64_emit_rex(inst, 0, 0, 0, (reg)); \
635                 *(inst)++ = (unsigned char)0xff;        \
636                 x86_reg_emit ((inst), 2, ((reg) & 0x7));        \
637         } while (0)
638
639
640 #define amd64_ret(inst) do { *(inst)++ = (unsigned char)0xc3; } while (0)
641 #define amd64_leave(inst) do { *(inst)++ = (unsigned char)0xc9; } while (0)
642
643 #define amd64_pop_reg(inst,reg) amd64_pop_reg_body((inst), (reg))
644
645 #elif defined(__native_client_codegen__)
646
647 /* Size is ignored for Native Client jumps, we restrict jumping to 32-bits */
648 #define amd64_jump_reg_size(inst,reg,size)                                \
649   do {                                                                    \
650     amd64_codegen_pre((inst));                                            \
651     amd64_alu_reg_imm_size((inst), X86_AND, (reg), (nacl_align_byte), 4); \
652     amd64_alu_reg_reg_size((inst), X86_ADD, (reg), AMD64_R15, 8);         \
653     amd64_emit_rex ((inst),0,0,0,(reg));                                  \
654     x86_jump_reg((inst),((reg)&0x7));                                     \
655     amd64_codegen_post((inst));                                           \
656   } while (0)
657
658 /* Size is ignored for Native Client jumps, we restrict jumping to 32-bits */
659 #define amd64_jump_mem_size(inst,mem,size)                                \
660   do {                                                                    \
661     amd64_codegen_pre((inst));                                            \
662     amd64_mov_reg_mem((inst), (mem), AMD64_R11, 4);                       \
663     amd64_jump_reg_size((inst), AMD64_R11, 4);                            \
664     amd64_codegen_post((inst));                                           \
665   } while (0)
666
667 #define amd64_call_reg_internal(inst,reg)                                 \
668   do {                                                                    \
669     amd64_codegen_pre((inst));                                            \
670     amd64_alu_reg_imm_size((inst), X86_AND, (reg), (nacl_align_byte), 4); \
671     amd64_alu_reg_reg_size((inst), X86_ADD, (reg), AMD64_R15, 8);         \
672     amd64_emit_rex((inst), 0, 0, 0, (reg));                               \
673     x86_call_reg((inst), ((reg) & 0x7));                                  \
674     amd64_codegen_post((inst));                                           \
675   } while (0)
676
677 #define amd64_call_reg(inst,reg)                                          \
678   do {                                                                    \
679     amd64_codegen_pre((inst));                                            \
680     amd64_call_sequence_pre(inst);                                        \
681     amd64_call_reg_internal((inst), (reg));                               \
682     amd64_call_sequence_post(inst);                                       \
683     amd64_codegen_post((inst));                                           \
684   } while (0)
685
686
687 #define amd64_ret(inst)                                                   \
688   do {                                                                    \
689     amd64_codegen_pre(inst);                                              \
690     amd64_pop_reg_body((inst), AMD64_R11);                                \
691     amd64_jump_reg_size((inst), AMD64_R11, 8);                            \
692     amd64_codegen_post(inst);                                             \
693   } while (0)
694
695 #define amd64_leave(inst)                                                 \
696   do {                                                                    \
697     amd64_codegen_pre(inst);                                              \
698     amd64_mov_reg_reg((inst), AMD64_RSP, AMD64_RBP, 8);                   \
699     amd64_pop_reg_body((inst), AMD64_R11);                                \
700     amd64_mov_reg_reg_size((inst), AMD64_RBP, AMD64_R11, 4);              \
701     amd64_alu_reg_reg_size((inst), X86_ADD, AMD64_RBP, AMD64_R15, 8);     \
702     amd64_codegen_post(inst);                                             \
703   } while (0)
704
705 #define amd64_pop_reg(inst,reg) \
706         do { \
707                 amd64_codegen_pre(inst); \
708                 if (amd64_is_nacl_stack_reg((reg))) { \
709                         amd64_pop_reg_body((inst), AMD64_R11); \
710                         amd64_mov_reg_reg_size((inst), (reg), AMD64_R11, 4); \
711                         amd64_alu_reg_reg_size((inst), X86_ADD, (reg), AMD64_R15, 8); \
712                 } else { \
713                         amd64_pop_reg_body((inst), (reg)); \
714                 } \
715                 amd64_codegen_post(inst); \
716         } while (0)
717
718 #endif /*__native_client_codegen__*/
719
720 #define amd64_movsd_reg_regp(inst,reg,regp)     \
721         do {    \
722                 amd64_codegen_pre(inst); \
723                 x86_prefix((inst), 0xf2); \
724                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
725                 *(inst)++ = (unsigned char)0x0f;        \
726                 *(inst)++ = (unsigned char)0x10;        \
727                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
728                 amd64_codegen_post(inst); \
729         } while (0)
730
731 #define amd64_movsd_regp_reg(inst,regp,reg)     \
732         do {    \
733                 amd64_codegen_pre(inst); \
734                 x86_prefix((inst), 0xf2); \
735                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
736                 *(inst)++ = (unsigned char)0x0f;        \
737                 *(inst)++ = (unsigned char)0x11;        \
738                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
739                 amd64_codegen_post(inst); \
740         } while (0)
741
742 #define amd64_movss_reg_regp(inst,reg,regp)     \
743         do {    \
744                 amd64_codegen_pre(inst); \
745                 x86_prefix((inst), 0xf3); \
746                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
747                 *(inst)++ = (unsigned char)0x0f;        \
748                 *(inst)++ = (unsigned char)0x10;        \
749                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
750                 amd64_codegen_post(inst); \
751         } while (0)
752
753 #define amd64_movss_regp_reg(inst,regp,reg)     \
754         do {    \
755                 amd64_codegen_pre(inst); \
756                 x86_prefix((inst), 0xf3); \
757                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
758                 *(inst)++ = (unsigned char)0x0f;        \
759                 *(inst)++ = (unsigned char)0x11;        \
760                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
761                 amd64_codegen_post(inst); \
762         } while (0)
763
764 #define amd64_movsd_reg_membase(inst,reg,basereg,disp)  \
765         do {    \
766                 amd64_codegen_pre(inst); \
767                 x86_prefix((inst), 0xf2); \
768                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
769                 *(inst)++ = (unsigned char)0x0f;        \
770                 *(inst)++ = (unsigned char)0x10;        \
771                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
772                 amd64_codegen_post(inst); \
773         } while (0)
774
775 #define amd64_movss_reg_membase(inst,reg,basereg,disp)  \
776         do {    \
777                 amd64_codegen_pre(inst); \
778                 x86_prefix((inst), 0xf3); \
779                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
780                 *(inst)++ = (unsigned char)0x0f;        \
781                 *(inst)++ = (unsigned char)0x10;        \
782                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
783                 amd64_codegen_post(inst); \
784         } while (0)
785
786 #define amd64_movsd_membase_reg(inst,basereg,disp,reg)  \
787         do {    \
788                 amd64_codegen_pre(inst); \
789                 x86_prefix((inst), 0xf2); \
790                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
791                 *(inst)++ = (unsigned char)0x0f;        \
792                 *(inst)++ = (unsigned char)0x11;        \
793                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
794                 amd64_codegen_post(inst); \
795         } while (0)
796
797 #define amd64_movss_membase_reg(inst,basereg,disp,reg)  \
798         do {    \
799                 amd64_codegen_pre(inst); \
800                 x86_prefix((inst), 0xf3); \
801                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
802                 *(inst)++ = (unsigned char)0x0f;        \
803                 *(inst)++ = (unsigned char)0x11;        \
804                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
805                 amd64_codegen_post(inst); \
806         } while (0)
807
808 /* The original inc_reg opcode is used as the REX prefix */
809 #define amd64_inc_reg_size(inst,reg,size) \
810         do { \
811                 amd64_codegen_pre(inst); \
812                 amd64_emit_rex ((inst),(size),0,0,(reg)); \
813                 *(inst)++ = (unsigned char)0xff; \
814                 x86_reg_emit ((inst),0,(reg) & 0x7); \
815                 amd64_codegen_post(inst); \
816         } while (0)
817
818 #define amd64_dec_reg_size(inst,reg,size) \
819         do { \
820                 amd64_codegen_pre(inst); \
821                 amd64_emit_rex ((inst),(size),0,0,(reg)); \
822                 *(inst)++ = (unsigned char)0xff; \
823                 x86_reg_emit ((inst),1,(reg) & 0x7); \
824                 amd64_codegen_post(inst); \
825         } while (0)
826
827 #define amd64_fld_membase_size(inst,basereg,disp,is_double,size) do { \
828         amd64_codegen_pre(inst); \
829         amd64_emit_rex ((inst),0,0,0,(basereg)); \
830         *(inst)++ = (is_double) ? (unsigned char)0xdd : (unsigned char)0xd9;    \
831         amd64_membase_emit ((inst), 0, (basereg), (disp));      \
832         amd64_codegen_post(inst); \
833 } while (0)
834
835 #if defined (__default_codegen__)
836
837 /* From the AMD64 Software Optimization Manual */
838 #define amd64_padding_size(inst,size) \
839     do { \
840             switch ((size)) {                                                             \
841         case 1: *(inst)++ = 0x90; break;                                                  \
842         case 2: *(inst)++ = 0x66; *(inst)++ = 0x90; break;                        \
843         case 3: *(inst)++ = 0x66; *(inst)++ = 0x66; *(inst)++ = 0x90; break; \
844                 default: amd64_emit_rex ((inst),8,0,0,0); x86_padding ((inst), (size) - 1); \
845                 }; \
846                 } while (0)
847
848 #define amd64_call_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); *(inst)++ = (unsigned char)0xff; amd64_membase_emit ((inst),2, (basereg),(disp)); } while (0)
849 #define amd64_jump_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); *(inst)++ = (unsigned char)0xff; amd64_membase_emit ((inst), 4, (basereg), (disp)); } while (0)
850     
851 #define amd64_jump_code_size(inst,target,size) do { \
852         if (amd64_is_imm32 ((gint64)(target) - (gint64)(inst))) {               \
853                 x86_jump_code((inst),(target));                                                                 \
854         } else {                                                                                                                        \
855             amd64_jump_membase ((inst), AMD64_RIP, 0);                                                  \
856                 *(guint64*)(inst) = (guint64)(target);                                                  \
857                 (inst) += 8; \
858         } \
859 } while (0)
860
861 #elif defined(__native_client_codegen__)
862
863 /* The 3-7 byte NOP sequences in amd64_padding_size below are all illegal in */
864 /* 64-bit Native Client because they load into rSP/rBP or use duplicate */
865 /* prefixes. Instead we use the NOPs recommended in Section 3.5.1.8 of the */
866 /* Intel64 and IA-32 Architectures Optimization Reference Manual and */
867 /* Section 4.13 of AMD Software Optimization Guide for Family 10h Processors. */
868
869 #define amd64_padding_size(inst,size) \
870         do { \
871                 unsigned char *code_start = (inst); \
872                 switch ((size)) { \
873                         /* xchg %eax,%eax, recognized by hardware as a NOP */ \
874                         case 1: *(inst)++ = 0x90; break; \
875                         /* xchg %ax,%ax */ \
876                         case 2: *(inst)++ = 0x66; *(inst)++ = 0x90; \
877                                 break; \
878                         /* nop (%rax) */ \
879                         case 3: *(inst)++ = 0x0f; *(inst)++ = 0x1f; \
880                                 *(inst)++ = 0x00; \
881                                 break; \
882                         /* nop 0x0(%rax) */ \
883                         case 4: *(inst)++ = 0x0f; *(inst)++ = 0x1f; \
884                                 x86_address_byte ((inst), 1, 0, AMD64_RAX);     \
885                                 x86_imm_emit8 ((inst), 0);      \
886                                 break; \
887                         /* nop 0x0(%rax,%rax) */ \
888                         case 5: *(inst)++ = 0x0f; *(inst)++ = 0x1f; \
889                                 x86_address_byte ((inst), 1, 0, 4);     \
890                                 x86_address_byte ((inst), 0, AMD64_RAX, AMD64_RAX);     \
891                                 x86_imm_emit8 ((inst), 0);      \
892                                 break; \
893                         /* nopw 0x0(%rax,%rax) */ \
894                         case 6: *(inst)++ = 0x66; *(inst)++ = 0x0f; \
895                                 *(inst)++ = 0x1f; \
896                                 x86_address_byte ((inst), 1, 0, 4);     \
897                                 x86_address_byte ((inst), 0, AMD64_RAX, AMD64_RAX);     \
898                                 x86_imm_emit8 ((inst), 0);      \
899                                 break; \
900                         /* nop 0x0(%rax) (32-bit displacement) */ \
901                         case 7: *(inst)++ = 0x0f; *(inst)++ = 0x1f; \
902                                 x86_address_byte ((inst), 2, 0, AMD64_RAX);     \
903                                 x86_imm_emit32((inst), 0); \
904                                 break; \
905                         /* nop 0x0(%rax,%rax) (32-bit displacement) */ \
906                         case 8: *(inst)++ = 0x0f; *(inst)++ = 0x1f; \
907                                 x86_address_byte ((inst), 2, 0, 4);     \
908                                 x86_address_byte ((inst), 0, AMD64_RAX, AMD64_RAX);     \
909                                 x86_imm_emit32 ((inst), 0);     \
910                                 break; \
911                         default: \
912                                 g_assert_not_reached(); \
913                 } \
914                 g_assert(code_start + (size) == (unsigned char *)(inst)); \
915         } while (0)
916
917
918 /* Size is ignored for Native Client calls, we restrict jumping to 32-bits */
919 #define amd64_call_membase_size(inst,basereg,disp,size)                   \
920   do {                                                                    \
921     amd64_codegen_pre((inst));                                            \
922     amd64_call_sequence_pre(inst);                                        \
923     amd64_mov_reg_membase((inst), AMD64_R11, (basereg), (disp), 4);       \
924     amd64_call_reg_internal((inst), AMD64_R11);                           \
925     amd64_call_sequence_post(inst);                                       \
926     amd64_codegen_post((inst));                                           \
927   } while (0)
928
929 /* Size is ignored for Native Client jumps, we restrict jumping to 32-bits */
930 #define amd64_jump_membase_size(inst,basereg,disp,size)                   \
931   do {                                                                    \
932     amd64_mov_reg_membase((inst), AMD64_R11, (basereg), (disp), 4);       \
933     amd64_jump_reg_size((inst), AMD64_R11, 4);                            \
934   } while (0)
935     
936 /* On Native Client we can't jump more than INT_MAX in either direction */
937 #define amd64_jump_code_size(inst,target,size)                            \
938   do {                                                                    \
939     /* x86_jump_code used twice in case of */                             \
940     /* relocation by amd64_codegen_post    */                             \
941     guint8* jump_start;                                                   \
942     amd64_codegen_pre(inst);                                              \
943     assert(amd64_is_imm32 ((gint64)(target) - (gint64)(inst)));           \
944     x86_jump_code((inst),(target));                                       \
945     inst = amd64_codegen_post(inst);                                      \
946     jump_start = (inst);                                                  \
947     x86_jump_code((inst),(target));                                       \
948     mono_amd64_patch(jump_start, (target));                               \
949 } while (0)
950
951 #endif /*__native_client_codegen__*/
952
953 /*
954  * SSE
955  */
956
957 //TODO Reorganize SSE opcode defines.
958
959 /* Two opcode SSE defines */
960
961 #define emit_sse_reg_reg_op2_size(inst,dreg,reg,op1,op2,size) do { \
962     amd64_codegen_pre(inst); \
963     amd64_emit_rex ((inst), size, (dreg), 0, (reg)); \
964     *(inst)++ = (unsigned char)(op1); \
965     *(inst)++ = (unsigned char)(op2); \
966     x86_reg_emit ((inst), (dreg), (reg)); \
967     amd64_codegen_post(inst); \
968 } while (0)
969
970 #define emit_sse_reg_reg_op2(inst,dreg,reg,op1,op2) emit_sse_reg_reg_op2_size ((inst), (dreg), (reg), (op1), (op2), 0)
971
972 #define emit_sse_reg_reg_op2_imm(inst,dreg,reg,op1,op2,imm) do { \
973    amd64_codegen_pre(inst); \
974    emit_sse_reg_reg_op2 ((inst), (dreg), (reg), (op1), (op2)); \
975    x86_imm_emit8 ((inst), (imm)); \
976    amd64_codegen_post(inst); \
977 } while (0)
978
979 #define emit_sse_membase_reg_op2(inst,basereg,disp,reg,op1,op2) do { \
980     amd64_codegen_pre(inst); \
981     amd64_emit_rex ((inst), 0, (reg), 0, (basereg)); \
982     *(inst)++ = (unsigned char)(op1); \
983     *(inst)++ = (unsigned char)(op2); \
984     amd64_membase_emit ((inst), (reg), (basereg), (disp)); \
985     amd64_codegen_post(inst); \
986 } while (0)
987
988 #define emit_sse_reg_membase_op2(inst,dreg,basereg,disp,op1,op2) do { \
989     amd64_codegen_pre(inst); \
990     amd64_emit_rex ((inst), 0, (dreg), 0, (basereg) == AMD64_RIP ? 0 : (basereg)); \
991     *(inst)++ = (unsigned char)(op1); \
992     *(inst)++ = (unsigned char)(op2); \
993     amd64_membase_emit ((inst), (dreg), (basereg), (disp)); \
994     amd64_codegen_post(inst); \
995 } while (0)
996
997 /* Three opcode SSE defines */
998
999 #define emit_opcode3(inst,op1,op2,op3) do { \
1000    *(inst)++ = (unsigned char)(op1); \
1001    *(inst)++ = (unsigned char)(op2); \
1002    *(inst)++ = (unsigned char)(op3); \
1003 } while (0)
1004
1005 #define emit_sse_reg_reg_size(inst,dreg,reg,op1,op2,op3,size) do { \
1006     amd64_codegen_pre(inst); \
1007     *(inst)++ = (unsigned char)(op1); \
1008         amd64_emit_rex ((inst), size, (dreg), 0, (reg)); \
1009     *(inst)++ = (unsigned char)(op2); \
1010     *(inst)++ = (unsigned char)(op3); \
1011     x86_reg_emit ((inst), (dreg), (reg)); \
1012     amd64_codegen_post(inst); \
1013 } while (0)
1014
1015 #define emit_sse_reg_reg(inst,dreg,reg,op1,op2,op3) emit_sse_reg_reg_size ((inst), (dreg), (reg), (op1), (op2), (op3), 0)
1016
1017 #define emit_sse_reg_reg_imm(inst,dreg,reg,op1,op2,op3,imm) do { \
1018    amd64_codegen_pre(inst); \
1019    emit_sse_reg_reg ((inst), (dreg), (reg), (op1), (op2), (op3)); \
1020    x86_imm_emit8 ((inst), (imm)); \
1021    amd64_codegen_post(inst); \
1022 } while (0)
1023
1024 #define emit_sse_membase_reg(inst,basereg,disp,reg,op1,op2,op3) do { \
1025     amd64_codegen_pre(inst); \
1026     x86_prefix((inst), (unsigned char)(op1)); \
1027     amd64_emit_rex ((inst), 0, (reg), 0, (basereg)); \
1028     *(inst)++ = (unsigned char)(op2); \
1029     *(inst)++ = (unsigned char)(op3); \
1030     amd64_membase_emit ((inst), (reg), (basereg), (disp)); \
1031     amd64_codegen_post(inst); \
1032 } while (0)
1033
1034 #define emit_sse_reg_membase(inst,dreg,basereg,disp,op1,op2,op3) do { \
1035     amd64_codegen_pre(inst); \
1036     x86_prefix((inst), (unsigned char)(op1)); \
1037     amd64_emit_rex ((inst), 0, (dreg), 0, (basereg) == AMD64_RIP ? 0 : (basereg)); \
1038     *(inst)++ = (unsigned char)(op2); \
1039     *(inst)++ = (unsigned char)(op3); \
1040     amd64_membase_emit ((inst), (dreg), (basereg), (disp)); \
1041     amd64_codegen_post(inst); \
1042 } while (0)
1043
1044 /* Four opcode SSE defines */
1045
1046 #define emit_sse_reg_reg_op4_size(inst,dreg,reg,op1,op2,op3,op4,size) do { \
1047     amd64_codegen_pre(inst); \
1048     x86_prefix((inst), (unsigned char)(op1)); \
1049     amd64_emit_rex ((inst), size, (dreg), 0, (reg)); \
1050     *(inst)++ = (unsigned char)(op2); \
1051     *(inst)++ = (unsigned char)(op3); \
1052     *(inst)++ = (unsigned char)(op4); \
1053     x86_reg_emit ((inst), (dreg), (reg)); \
1054     amd64_codegen_post(inst); \
1055 } while (0)
1056
1057 #define emit_sse_reg_reg_op4(inst,dreg,reg,op1,op2,op3,op4) emit_sse_reg_reg_op4_size ((inst), (dreg), (reg), (op1), (op2), (op3), (op4), 0)
1058
1059 /* specific SSE opcode defines */
1060  
1061 #define amd64_sse_xorpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg), 0x66, 0x0f, 0x57)
1062
1063 #define amd64_sse_xorpd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst),(dreg),(basereg), (disp), 0x66, 0x0f, 0x57)
1064
1065 #define amd64_sse_andpd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst),(dreg),(basereg), (disp), 0x66, 0x0f, 0x54)
1066
1067 #define amd64_sse_movsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x10)
1068 #define amd64_sse_movss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x10)
1069
1070 #define amd64_sse_movsd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0xf2, 0x0f, 0x10)
1071
1072 #define amd64_sse_movsd_membase_reg(inst,basereg,disp,reg) emit_sse_membase_reg ((inst), (basereg), (disp), (reg), 0xf2, 0x0f, 0x11)
1073
1074 #define amd64_sse_movss_membase_reg(inst,basereg,disp,reg) emit_sse_membase_reg ((inst), (basereg), (disp), (reg), 0xf3, 0x0f, 0x11)
1075
1076 #define amd64_sse_movss_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0xf3, 0x0f, 0x10)
1077
1078 #define amd64_sse_comisd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x66,0x0f,0x2f)
1079 #define amd64_sse_comiss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x67,0x0f,0x2f)
1080
1081 #define amd64_sse_comisd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0x66, 0x0f, 0x2f)
1082
1083 #define amd64_sse_ucomisd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x66,0x0f,0x2e)
1084
1085 #define amd64_sse_cvtsd2si_reg_reg(inst,dreg,reg) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2d, 8)
1086 #define amd64_sse_cvtss2si_reg_reg(inst,dreg,reg) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf3, 0x0f, 0x2d, 8)
1087
1088 #define amd64_sse_cvttsd2si_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2c, (size))
1089 #define amd64_sse_cvtss2si_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf3, 0x0f, 0x2c, (size))
1090
1091 #define amd64_sse_cvttsd2si_reg_reg(inst,dreg,reg) amd64_sse_cvttsd2si_reg_reg_size ((inst), (dreg), (reg), 8)
1092
1093 #define amd64_sse_cvtsi2sd_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2a, (size))
1094
1095 #define amd64_sse_cvtsi2sd_reg_reg(inst,dreg,reg) amd64_sse_cvtsi2sd_reg_reg_size ((inst), (dreg), (reg), 8)
1096
1097 #define amd64_sse_cvtsi2ss_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf3, 0x0f, 0x2a, (size))
1098
1099 #define amd64_sse_cvtsi2ss_reg_reg(inst,dreg,reg) amd64_sse_cvtsi2ss_reg_reg_size ((inst), (dreg), (reg), 8)
1100
1101 #define amd64_sse_cvtsd2ss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5a)
1102
1103 #define amd64_sse_cvtss2sd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5a)
1104
1105 #define amd64_sse_addsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x58)
1106 #define amd64_sse_addss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x58)
1107
1108 #define amd64_sse_subsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5c)
1109 #define amd64_sse_subss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5c)
1110
1111 #define amd64_sse_mulsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x59)
1112 #define amd64_sse_mulss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x59)
1113
1114 #define amd64_sse_divsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5e)
1115 #define amd64_sse_divss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5e)
1116
1117 #define amd64_sse_sqrtsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x51)
1118
1119
1120 #define amd64_sse_pinsrw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm ((inst), (dreg), (reg), 0x66, 0x0f, 0xc4, (imm))
1121
1122 #define amd64_sse_pextrw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm ((inst), (dreg), (reg), 0x66, 0x0f, 0xc5, (imm))
1123
1124
1125 #define amd64_sse_cvttsd2si_reg_xreg_size(inst,reg,xreg,size) emit_sse_reg_reg_size ((inst), (reg), (xreg), 0xf2, 0x0f, 0x2c, (size))
1126
1127
1128 #define amd64_sse_addps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x58)
1129
1130 #define amd64_sse_divps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5e)
1131
1132 #define amd64_sse_mulps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x59)
1133
1134 #define amd64_sse_subps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5c)
1135
1136 #define amd64_sse_maxps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5f)
1137
1138 #define amd64_sse_minps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5d)
1139
1140 #define amd64_sse_cmpps_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_op2_imm((inst), (dreg), (reg), 0x0f, 0xc2, (imm))
1141
1142 #define amd64_sse_andps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x54)
1143
1144 #define amd64_sse_andnps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x55)
1145
1146 #define amd64_sse_orps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x56)
1147
1148 #define amd64_sse_xorps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x57)
1149
1150 #define amd64_sse_sqrtps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x51)
1151
1152 #define amd64_sse_rsqrtps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x52)
1153
1154 #define amd64_sse_rcpps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x53)
1155
1156 #define amd64_sse_addsubps_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0xd0)
1157
1158 #define amd64_sse_haddps_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x7c)
1159
1160 #define amd64_sse_hsubps_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x7d)
1161
1162 #define amd64_sse_movshdup_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf3, 0x0f, 0x16)
1163
1164 #define amd64_sse_movsldup_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf3, 0x0f, 0x12)
1165
1166
1167 #define amd64_sse_pshufhw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0xf3, 0x0f, 0x70, (imm))
1168
1169 #define amd64_sse_pshuflw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0xf2, 0x0f, 0x70, (imm))
1170
1171 #define amd64_sse_pshufd_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0x66, 0x0f, 0x70, (imm))
1172
1173 #define amd64_sse_shufps_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_op2_imm((inst), (dreg), (reg), 0x0f, 0xC6, (imm))
1174
1175 #define amd64_sse_shufpd_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0x66, 0x0f, 0xC6, (imm))
1176
1177
1178 #define amd64_sse_addpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x58)
1179
1180 #define amd64_sse_divpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5e)
1181
1182 #define amd64_sse_mulpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x59)
1183
1184 #define amd64_sse_subpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5c)
1185
1186 #define amd64_sse_maxpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5f)
1187
1188 #define amd64_sse_minpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5d)
1189
1190 #define amd64_sse_cmppd_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0x66, 0x0f, 0xc2, (imm))
1191
1192 #define amd64_sse_andpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x54)
1193
1194 #define amd64_sse_andnpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x55)
1195
1196 #define amd64_sse_orpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x56)
1197
1198 #define amd64_sse_sqrtpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x51)
1199
1200 #define amd64_sse_rsqrtpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x52)
1201
1202 #define amd64_sse_rcppd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x53)
1203
1204 #define amd64_sse_addsubpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd0)
1205
1206 #define amd64_sse_haddpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x7c)
1207
1208 #define amd64_sse_hsubpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x7d)
1209
1210 #define amd64_sse_movddup_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x12)
1211
1212
1213 #define amd64_sse_pmovmskb_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd7)
1214
1215
1216 #define amd64_sse_pand_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xdb)
1217
1218 #define amd64_sse_por_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xeb)
1219
1220 #define amd64_sse_pxor_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xef)
1221
1222
1223 #define amd64_sse_paddb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfc)
1224
1225 #define amd64_sse_paddw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfd)
1226
1227 #define amd64_sse_paddd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfe)
1228
1229 #define amd64_sse_paddq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd4)
1230
1231
1232 #define amd64_sse_psubb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf8)
1233
1234 #define amd64_sse_psubw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf9)
1235
1236 #define amd64_sse_psubd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfa)
1237
1238 #define amd64_sse_psubq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfb)
1239
1240
1241 #define amd64_sse_pmaxub_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xde)
1242
1243 #define amd64_sse_pmaxuw_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3e)
1244
1245 #define amd64_sse_pmaxud_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3f)
1246
1247
1248 #define amd64_sse_pmaxsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3c)
1249
1250 #define amd64_sse_pmaxsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xee)
1251
1252 #define amd64_sse_pmaxsd_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3d)
1253
1254
1255 #define amd64_sse_pavgb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe0)
1256
1257 #define amd64_sse_pavgw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe3)
1258
1259
1260 #define amd64_sse_pminub_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xda)
1261
1262 #define amd64_sse_pminuw_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3a)
1263
1264 #define amd64_sse_pminud_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3b)
1265
1266
1267 #define amd64_sse_pminsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x38)
1268
1269 #define amd64_sse_pminsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xea)
1270
1271 #define amd64_sse_pminsd_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x39)
1272
1273
1274 #define amd64_sse_pcmpeqb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x74)
1275
1276 #define amd64_sse_pcmpeqw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x75)
1277
1278 #define amd64_sse_pcmpeqd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x76)
1279
1280 #define amd64_sse_pcmpeqq_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x29)
1281
1282
1283 #define amd64_sse_pcmpgtb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x64)
1284
1285 #define amd64_sse_pcmpgtw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x65)
1286
1287 #define amd64_sse_pcmpgtd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x66)
1288
1289 #define amd64_sse_pcmpgtq_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x37)
1290
1291
1292 #define amd64_sse_psadbw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf6)
1293
1294
1295 #define amd64_sse_punpcklbw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x60)
1296
1297 #define amd64_sse_punpcklwd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x61)
1298
1299 #define amd64_sse_punpckldq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x62)
1300
1301 #define amd64_sse_punpcklqdq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6c)
1302
1303 #define amd64_sse_unpcklpd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x14)
1304
1305 #define amd64_sse_unpcklps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x14)
1306
1307
1308 #define amd64_sse_punpckhbw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x68)
1309
1310 #define amd64_sse_punpckhwd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x69)
1311
1312 #define amd64_sse_punpckhdq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6a)
1313
1314 #define amd64_sse_punpckhqdq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6d)
1315
1316 #define amd64_sse_unpckhpd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x15)
1317
1318 #define amd64_sse_unpckhps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x15)
1319
1320
1321 #define amd64_sse_packsswb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x63)
1322
1323 #define amd64_sse_packssdw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6b)
1324
1325 #define amd64_sse_packuswb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x67)
1326
1327 #define amd64_sse_packusdw_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x2b)
1328
1329
1330 #define amd64_sse_paddusb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xdc)
1331
1332 #define amd64_sse_psubusb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd8)
1333
1334 #define amd64_sse_paddusw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xdd)
1335
1336 #define amd64_sse_psubusw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd8)
1337
1338
1339 #define amd64_sse_paddsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xec)
1340
1341 #define amd64_sse_psubsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe8)
1342
1343 #define amd64_sse_paddsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xed)
1344
1345 #define amd64_sse_psubsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe9)
1346
1347
1348 #define amd64_sse_pmullw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd5)
1349
1350 #define amd64_sse_pmulld_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x40)
1351
1352 #define amd64_sse_pmuludq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf4)
1353
1354 #define amd64_sse_pmulhuw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe4)
1355
1356 #define amd64_sse_pmulhw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe5)
1357
1358
1359 #define amd64_sse_psrlw_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHR, (reg), 0x66, 0x0f, 0x71, (imm))
1360
1361 #define amd64_sse_psrlw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd1)
1362
1363
1364 #define amd64_sse_psraw_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SAR, (reg), 0x66, 0x0f, 0x71, (imm))
1365
1366 #define amd64_sse_psraw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe1)
1367
1368
1369 #define amd64_sse_psllw_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHL, (reg), 0x66, 0x0f, 0x71, (imm))
1370
1371 #define amd64_sse_psllw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf1)
1372
1373
1374 #define amd64_sse_psrld_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHR, (reg), 0x66, 0x0f, 0x72, (imm))
1375
1376 #define amd64_sse_psrld_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd2)
1377
1378
1379 #define amd64_sse_psrad_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SAR, (reg), 0x66, 0x0f, 0x72, (imm))
1380
1381 #define amd64_sse_psrad_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe2)
1382
1383
1384 #define amd64_sse_pslld_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHL, (reg), 0x66, 0x0f, 0x72, (imm))
1385
1386 #define amd64_sse_pslld_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf2)
1387
1388
1389 #define amd64_sse_psrlq_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHR, (reg), 0x66, 0x0f, 0x73, (imm))
1390
1391 #define amd64_sse_psrlq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd3)
1392
1393
1394 #define amd64_sse_psraq_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SAR, (reg), 0x66, 0x0f, 0x73, (imm))
1395
1396 #define amd64_sse_psraq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe3)
1397
1398
1399 #define amd64_sse_psllq_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHL, (reg), 0x66, 0x0f, 0x73, (imm))
1400
1401 #define amd64_sse_psllq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf3)
1402
1403
1404 #define amd64_sse_cvtdq2pd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xF3, 0x0F, 0xE6)
1405
1406 #define amd64_sse_cvtdq2ps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0F, 0x5B)
1407
1408 #define amd64_sse_cvtpd2dq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xF2, 0x0F, 0xE6)
1409
1410 #define amd64_sse_cvtpd2ps_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0F, 0x5A)
1411
1412 #define amd64_sse_cvtps2dq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0F, 0x5B)
1413
1414 #define amd64_sse_cvtps2pd_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0F, 0x5A)
1415
1416 #define amd64_sse_cvttpd2dq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0F, 0xE6)
1417
1418 #define amd64_sse_cvttps2dq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xF3, 0x0F, 0x5B)
1419
1420
1421 #define amd64_movd_xreg_reg_size(inst,dreg,sreg,size) emit_sse_reg_reg_size((inst), (dreg), (sreg), 0x66, 0x0f, 0x6e, (size))
1422
1423 #define amd64_movd_reg_xreg_size(inst,dreg,sreg,size) emit_sse_reg_reg_size((inst), (sreg), (dreg), 0x66, 0x0f, 0x7e, (size))
1424
1425 #define amd64_movd_xreg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase((inst), (dreg), (basereg), (disp), 0x66, 0x0f, 0x6e)
1426
1427
1428 #define amd64_movlhps_reg_reg(inst,dreg,sreg) emit_sse_reg_reg_op2((inst), (dreg), (sreg), 0x0f, 0x16)
1429
1430 #define amd64_movhlps_reg_reg(inst,dreg,sreg) emit_sse_reg_reg_op2((inst), (dreg), (sreg), 0x0f, 0x12)
1431
1432
1433 #define amd64_sse_movups_membase_reg(inst, basereg, disp, reg) emit_sse_membase_reg_op2((inst), (basereg), (disp), (reg), 0x0f, 0x11)
1434
1435 #define amd64_sse_movups_reg_membase(inst, dreg, basereg, disp) emit_sse_reg_membase_op2((inst), (dreg), (basereg), (disp), 0x0f, 0x10)
1436
1437 #define amd64_sse_movaps_membase_reg(inst, basereg, disp, reg) emit_sse_membase_reg_op2((inst), (basereg), (disp), (reg), 0x0f, 0x29)
1438
1439 #define amd64_sse_movaps_reg_membase(inst, dreg, basereg, disp) emit_sse_reg_membase_op2((inst), (dreg), (basereg), (disp), 0x0f, 0x28)
1440
1441 #define amd64_sse_movaps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x28)
1442
1443 #define amd64_sse_movntps_reg_membase(inst, dreg, basereg, disp) emit_sse_reg_membase_op2((inst), (dreg), (basereg), (disp), 0x0f, 0x2b)
1444
1445 #define amd64_sse_prefetch_reg_membase(inst, arg, basereg, disp) emit_sse_reg_membase_op2((inst), (arg), (basereg), (disp), 0x0f, 0x18)
1446
1447 /* Generated from x86-codegen.h */
1448
1449 #define amd64_breakpoint_size(inst,size) do { x86_breakpoint(inst); } while (0)
1450 #define amd64_cld_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_cld(inst); amd64_codegen_post(inst); } while (0)
1451 #define amd64_stosb_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_stosb(inst); amd64_codegen_post(inst); } while (0)
1452 #define amd64_stosl_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_stosl(inst); amd64_codegen_post(inst); } while (0)
1453 #define amd64_stosd_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_stosd(inst); amd64_codegen_post(inst); } while (0)
1454 #define amd64_movsb_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_movsb(inst); amd64_codegen_post(inst); } while (0)
1455 #define amd64_movsl_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_movsl(inst); amd64_codegen_post(inst); } while (0)
1456 #define amd64_movsd_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_movsd(inst); amd64_codegen_post(inst); } while (0)
1457 #define amd64_prefix_size(inst,p,size) do { x86_prefix((inst), p); } while (0)
1458 #define amd64_rdtsc_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_rdtsc(inst); amd64_codegen_post(inst); } while (0)
1459 #define amd64_cmpxchg_reg_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_cmpxchg_reg_reg((inst),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1460 #define amd64_cmpxchg_mem_reg_size(inst,mem,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_cmpxchg_mem_reg((inst),(mem),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1461 #define amd64_cmpxchg_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_cmpxchg_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1462 #define amd64_xchg_reg_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_xchg_reg_reg((inst),((dreg)&0x7),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1463 #define amd64_xchg_mem_reg_size(inst,mem,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_xchg_mem_reg((inst),(mem),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1464 #define amd64_xchg_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_xchg_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1465 #define amd64_inc_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_inc_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1466 #define amd64_inc_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_inc_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1467 //#define amd64_inc_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_inc_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1468 #define amd64_dec_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_dec_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1469 #define amd64_dec_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_dec_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1470 //#define amd64_dec_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_dec_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1471 #define amd64_not_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_not_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1472 #define amd64_not_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_not_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1473 #define amd64_not_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_not_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1474 #define amd64_neg_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_neg_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1475 #define amd64_neg_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_neg_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1476 #define amd64_neg_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_neg_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1477 #define amd64_nop_size(inst,size) do { amd64_codegen_pre(inst); x86_nop(inst); amd64_codegen_post(inst); } while (0)
1478 //#define amd64_alu_reg_imm_size(inst,opc,reg,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_alu_reg_imm((inst),(opc),((reg)&0x7),(imm)); amd64_codegen_post(inst); } while (0)
1479 #define amd64_alu_mem_imm_size(inst,opc,mem,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_alu_mem_imm((inst),(opc),(mem),(imm)); amd64_codegen_post(inst); } while (0)
1480 #define amd64_alu_membase_imm_size(inst,opc,basereg,disp,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_alu_membase_imm((inst),(opc),((basereg)&0x7),(disp),(imm)); amd64_codegen_post(inst); } while (0)
1481 #define amd64_alu_membase8_imm_size(inst,opc,basereg,disp,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_alu_membase8_imm((inst),(opc),((basereg)&0x7),(disp),(imm)); amd64_codegen_post(inst); } while (0)  
1482 #define amd64_alu_mem_reg_size(inst,opc,mem,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_alu_mem_reg((inst),(opc),(mem),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1483 #define amd64_alu_membase_reg_size(inst,opc,basereg,disp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_alu_membase_reg((inst),(opc),((basereg)&0x7),(disp),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1484 //#define amd64_alu_reg_reg_size(inst,opc,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_alu_reg_reg((inst),(opc),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1485 #define amd64_alu_reg8_reg8_size(inst,opc,dreg,reg,is_dreg_h,is_reg_h,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_alu_reg8_reg8((inst),(opc),((dreg)&0x7),((reg)&0x7),(is_dreg_h),(is_reg_h)); amd64_codegen_post(inst); } while (0)
1486 #define amd64_alu_reg_mem_size(inst,opc,reg,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_alu_reg_mem((inst),(opc),((reg)&0x7),(mem)); amd64_codegen_post(inst); } while (0)
1487 //#define amd64_alu_reg_membase_size(inst,opc,reg,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_alu_reg_membase((inst),(opc),((reg)&0x7),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1488 //#define amd64_test_reg_imm_size(inst,reg,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_test_reg_imm((inst),((reg)&0x7),(imm)); amd64_codegen_post(inst); } while (0)
1489 #define amd64_test_mem_imm_size(inst,mem,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_test_mem_imm((inst),(mem),(imm)); amd64_codegen_post(inst); } while (0)
1490 #define amd64_test_membase_imm_size(inst,basereg,disp,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_test_membase_imm((inst),((basereg)&0x7),(disp),(imm)); amd64_codegen_post(inst); } while (0)
1491 #define amd64_test_reg_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_test_reg_reg((inst),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1492 #define amd64_test_mem_reg_size(inst,mem,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_test_mem_reg((inst),(mem),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1493 #define amd64_test_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_test_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1494 #define amd64_shift_reg_imm_size(inst,opc,reg,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_reg_imm((inst),(opc),((reg)&0x7),(imm)); amd64_codegen_post(inst); } while (0)
1495 #define amd64_shift_mem_imm_size(inst,opc,mem,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_mem_imm((inst),(opc),(mem),(imm)); amd64_codegen_post(inst); } while (0)
1496 #define amd64_shift_membase_imm_size(inst,opc,basereg,disp,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_shift_membase_imm((inst),(opc),((basereg)&0x7),(disp),(imm)); amd64_codegen_post(inst); } while (0)
1497 #define amd64_shift_reg_size(inst,opc,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_reg((inst),(opc),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1498 #define amd64_shift_mem_size(inst,opc,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_mem((inst),(opc),(mem)); amd64_codegen_post(inst); } while (0)
1499 #define amd64_shift_membase_size(inst,opc,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_shift_membase((inst),(opc),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1500 #define amd64_shrd_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shrd_reg((inst),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1501 #define amd64_shrd_reg_imm_size(inst,dreg,reg,shamt,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shrd_reg_imm((inst),((dreg)&0x7),((reg)&0x7),(shamt)); amd64_codegen_post(inst); } while (0)
1502 #define amd64_shld_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shld_reg((inst),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1503 #define amd64_shld_reg_imm_size(inst,dreg,reg,shamt,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shld_reg_imm((inst),((dreg)&0x7),((reg)&0x7),(shamt)); amd64_codegen_post(inst); } while (0)
1504 #define amd64_mul_reg_size(inst,reg,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mul_reg((inst),((reg)&0x7),(is_signed)); amd64_codegen_post(inst); } while (0)
1505 #define amd64_mul_mem_size(inst,mem,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_mul_mem((inst),(mem),(is_signed)); amd64_codegen_post(inst); } while (0)
1506 #define amd64_mul_membase_size(inst,basereg,disp,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_mul_membase((inst),((basereg)&0x7),(disp),(is_signed)); amd64_codegen_post(inst); } while (0)
1507 #define amd64_imul_reg_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_imul_reg_reg((inst),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1508 #define amd64_imul_reg_mem_size(inst,reg,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_imul_reg_mem((inst),((reg)&0x7),(mem)); amd64_codegen_post(inst); } while (0)
1509 #define amd64_imul_reg_membase_size(inst,reg,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_imul_reg_membase((inst),((reg)&0x7),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1510 #define amd64_imul_reg_reg_imm_size(inst,dreg,reg,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_imul_reg_reg_imm((inst),((dreg)&0x7),((reg)&0x7),(imm)); amd64_codegen_post(inst); } while (0)
1511 #define amd64_imul_reg_mem_imm_size(inst,reg,mem,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_imul_reg_mem_imm((inst),((reg)&0x7),(mem),(imm)); amd64_codegen_post(inst); } while (0)
1512 #define amd64_imul_reg_membase_imm_size(inst,reg,basereg,disp,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_imul_reg_membase_imm((inst),((reg)&0x7),((basereg)&0x7),(disp),(imm)); amd64_codegen_post(inst); } while (0)
1513 #define amd64_div_reg_size(inst,reg,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_div_reg((inst),((reg)&0x7),(is_signed)); amd64_codegen_post(inst); } while (0)
1514 #define amd64_div_mem_size(inst,mem,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_div_mem((inst),(mem),(is_signed)); amd64_codegen_post(inst); } while (0)
1515 #define amd64_div_membase_size(inst,basereg,disp,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_div_membase((inst),((basereg)&0x7),(disp),(is_signed)); amd64_codegen_post(inst); } while (0)
1516 #define amd64_mov_mem_reg_size(inst,mem,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mov_mem_reg((inst),(mem),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1517 //#define amd64_mov_regp_reg_size(inst,regp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(regp),0,(reg)); x86_mov_regp_reg((inst),(regp),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1518 //#define amd64_mov_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_mov_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1519 #define amd64_mov_memindex_reg_size(inst,basereg,disp,indexreg,shift,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),(indexreg),(basereg)); x86_mov_memindex_reg((inst),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1520 #define amd64_mov_reg_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_mov_reg_reg((inst),((dreg)&0x7),((reg)&0x7),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1521 //#define amd64_mov_reg_mem_size(inst,reg,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mov_reg_mem((inst),((reg)&0x7),(mem),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1522 //#define amd64_mov_reg_membase_size(inst,reg,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_mov_reg_membase((inst),((reg)&0x7),((basereg)&0x7),(disp),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1523 //#define amd64_mov_reg_memindex_size(inst,reg,basereg,disp,indexreg,shift,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),(indexreg),(basereg)); x86_mov_reg_memindex((inst),((reg)&0x7),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1524 #define amd64_clear_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_clear_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1525 //#define amd64_mov_reg_imm_size(inst,reg,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mov_reg_imm((inst),((reg)&0x7),(imm)); amd64_codegen_post(inst); } while (0)
1526 #define amd64_mov_mem_imm_size(inst,mem,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_mov_mem_imm((inst),(mem),(imm),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1527 //#define amd64_mov_membase_imm_size(inst,basereg,disp,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_mov_membase_imm((inst),((basereg)&0x7),(disp),(imm),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1528 #define amd64_mov_memindex_imm_size(inst,basereg,disp,indexreg,shift,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,(indexreg),(basereg)); x86_mov_memindex_imm((inst),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),(imm),(size) == 8 ? 4 : (size)); amd64_codegen_post(inst); } while (0)
1529 #define amd64_lea_mem_size(inst,reg,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_lea_mem((inst),((reg)&0x7),(mem)); amd64_codegen_post(inst); } while (0)
1530 //#define amd64_lea_membase_size(inst,reg,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_lea_membase((inst),((reg)&0x7),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1531 #define amd64_lea_memindex_size(inst,reg,basereg,disp,indexreg,shift,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),(indexreg),(basereg)); x86_lea_memindex((inst),((reg)&0x7),((basereg)&0x7),(disp),((indexreg)&0x7),(shift)); amd64_codegen_post(inst); } while (0)
1532 #define amd64_widen_reg_size(inst,dreg,reg,is_signed,is_half,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_widen_reg((inst),((dreg)&0x7),((reg)&0x7),(is_signed),(is_half)); amd64_codegen_post(inst); } while (0)
1533 #define amd64_widen_mem_size(inst,dreg,mem,is_signed,is_half,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,0); x86_widen_mem((inst),((dreg)&0x7),(mem),(is_signed),(is_half)); amd64_codegen_post(inst); } while (0)
1534 #define amd64_widen_membase_size(inst,dreg,basereg,disp,is_signed,is_half,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(basereg)); x86_widen_membase((inst),((dreg)&0x7),((basereg)&0x7),(disp),(is_signed),(is_half)); amd64_codegen_post(inst); } while (0)
1535 #define amd64_widen_memindex_size(inst,dreg,basereg,disp,indexreg,shift,is_signed,is_half,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),(indexreg),(basereg)); x86_widen_memindex((inst),((dreg)&0x7),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),(is_signed),(is_half)); amd64_codegen_post(inst); } while (0)
1536 #define amd64_cdq_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_cdq(inst); amd64_codegen_post(inst); } while (0)
1537 #define amd64_wait_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_wait(inst); amd64_codegen_post(inst); } while (0)
1538 #define amd64_fp_op_mem_size(inst,opc,mem,is_double,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fp_op_mem((inst),(opc),(mem),(is_double)); amd64_codegen_post(inst); } while (0)
1539 #define amd64_fp_op_membase_size(inst,opc,basereg,disp,is_double,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fp_op_membase((inst),(opc),((basereg)&0x7),(disp),(is_double)); amd64_codegen_post(inst); } while (0)
1540 #define amd64_fp_op_size(inst,opc,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fp_op((inst),(opc),(index)); amd64_codegen_post(inst); } while (0)
1541 #define amd64_fp_op_reg_size(inst,opc,index,pop_stack,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fp_op_reg((inst),(opc),(index),(pop_stack)); amd64_codegen_post(inst); } while (0)
1542 #define amd64_fp_int_op_membase_size(inst,opc,basereg,disp,is_int,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fp_int_op_membase((inst),(opc),((basereg)&0x7),(disp),(is_int)); amd64_codegen_post(inst); } while (0)
1543 #define amd64_fstp_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fstp((inst),(index)); amd64_codegen_post(inst); } while (0)
1544 #define amd64_fcompp_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fcompp(inst); amd64_codegen_post(inst); } while (0)
1545 #define amd64_fucompp_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fucompp(inst); amd64_codegen_post(inst); } while (0)
1546 #define amd64_fnstsw_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fnstsw(inst); amd64_codegen_post(inst); } while (0)
1547 #define amd64_fnstcw_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fnstcw((inst),(mem)); amd64_codegen_post(inst); } while (0)
1548 #define amd64_fnstcw_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_fnstcw_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1549 #define amd64_fldcw_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fldcw((inst),(mem)); amd64_codegen_post(inst); } while (0)
1550 #define amd64_fldcw_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fldcw_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1551 #define amd64_fchs_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fchs(inst); amd64_codegen_post(inst); } while (0)
1552 #define amd64_frem_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_frem(inst); amd64_codegen_post(inst); } while (0)
1553 #define amd64_fxch_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fxch((inst),(index)); amd64_codegen_post(inst); } while (0)
1554 #define amd64_fcomi_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fcomi((inst),(index)); amd64_codegen_post(inst); } while (0)
1555 #define amd64_fcomip_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fcomip((inst),(index)); amd64_codegen_post(inst); } while (0)
1556 #define amd64_fucomi_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fucomi((inst),(index)); amd64_codegen_post(inst); } while (0)
1557 #define amd64_fucomip_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fucomip((inst),(index)); amd64_codegen_post(inst); } while (0)
1558 #define amd64_fld_size(inst,mem,is_double,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fld((inst),(mem),(is_double)); amd64_codegen_post(inst); } while (0)
1559 //#define amd64_fld_membase_size(inst,basereg,disp,is_double,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fld_membase((inst),((basereg)&0x7),(disp),(is_double)); amd64_codegen_post(inst); } while (0)
1560 #define amd64_fld80_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fld80_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1561 #define amd64_fld80_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_fld80_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1562 #define amd64_fild_size(inst,mem,is_long,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fild((inst),(mem),(is_long)); amd64_codegen_post(inst); } while (0)
1563 #define amd64_fild_membase_size(inst,basereg,disp,is_long,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fild_membase((inst),((basereg)&0x7),(disp),(is_long)); amd64_codegen_post(inst); } while (0)
1564 #define amd64_fld_reg_size(inst,index,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fld_reg((inst),(index)); amd64_codegen_post(inst); } while (0)
1565 #define amd64_fldz_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fldz(inst); amd64_codegen_post(inst); } while (0)
1566 #define amd64_fld1_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fld1(inst); amd64_codegen_post(inst); } while (0)
1567 #define amd64_fldpi_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fldpi(inst); amd64_codegen_post(inst); } while (0)
1568 #define amd64_fst_size(inst,mem,is_double,pop_stack,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fst((inst),(mem),(is_double),(pop_stack)); amd64_codegen_post(inst); } while (0)
1569 #define amd64_fst_membase_size(inst,basereg,disp,is_double,pop_stack,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fst_membase((inst),((basereg)&0x7),(disp),(is_double),(pop_stack)); amd64_codegen_post(inst); } while (0)
1570 #define amd64_fst80_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fst80_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1571 #define amd64_fst80_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fst80_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1572 #define amd64_fist_pop_size(inst,mem,is_long,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_fist_pop((inst),(mem),(is_long)); amd64_codegen_post(inst); } while (0)
1573 #define amd64_fist_pop_membase_size(inst,basereg,disp,is_long,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fist_pop_membase((inst),((basereg)&0x7),(disp),(is_long)); amd64_codegen_post(inst); } while (0)
1574 #define amd64_fstsw_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_fstsw(inst); amd64_codegen_post(inst); } while (0)
1575 #define amd64_fist_membase_size(inst,basereg,disp,is_int,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fist_membase((inst),((basereg)&0x7),(disp),(is_int)); amd64_codegen_post(inst); } while (0)
1576 //#define amd64_push_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_push_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1577 #define amd64_push_regp_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_push_regp((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1578 #define amd64_push_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_push_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1579 //#define amd64_push_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_push_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1580 #define amd64_push_memindex_size(inst,basereg,disp,indexreg,shift,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,(indexreg),(basereg)); x86_push_memindex((inst),((basereg)&0x7),(disp),((indexreg)&0x7),(shift)); amd64_codegen_post(inst); } while (0)
1581 #define amd64_push_imm_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_push_imm((inst),(imm)); amd64_codegen_post(inst); } while (0)
1582 //#define amd64_pop_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_pop_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1583 #define amd64_pop_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_pop_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1584 #define amd64_pop_membase_size(inst,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_pop_membase((inst),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1585 #define amd64_pushad_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_pushad(inst); amd64_codegen_post(inst); } while (0)
1586 #define amd64_pushfd_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_pushfd(inst); amd64_codegen_post(inst); } while (0)
1587 #define amd64_popad_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_popad(inst); amd64_codegen_post(inst); } while (0)
1588 #define amd64_popfd_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_popfd(inst); amd64_codegen_post(inst); } while (0)
1589 #define amd64_loop_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_loop((inst),(imm)); amd64_codegen_post(inst); } while (0)
1590 #define amd64_loope_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_loope((inst),(imm)); amd64_codegen_post(inst); } while (0)
1591 #define amd64_loopne_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_loopne((inst),(imm)); amd64_codegen_post(inst); } while (0)
1592 #define amd64_jump32_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_jump32((inst),(imm)); amd64_codegen_post(inst); } while (0)
1593 #define amd64_jump8_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_jump8((inst),(imm)); amd64_codegen_post(inst); } while (0)
1594 #if !defined( __native_client_codegen__ )
1595 /* Defined above for Native Client, so they can be used in other macros */
1596 #define amd64_jump_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),0,0,0,(reg)); x86_jump_reg((inst),((reg)&0x7)); } while (0)
1597 #define amd64_jump_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_jump_mem((inst),(mem)); } while (0)
1598 #endif
1599 #define amd64_jump_disp_size(inst,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,0); x86_jump_disp((inst),(disp)); amd64_codegen_post(inst); } while (0)
1600 #define amd64_branch8_size(inst,cond,imm,is_signed,size) do { x86_branch8((inst),(cond),(imm),(is_signed)); } while (0)
1601 #define amd64_branch32_size(inst,cond,imm,is_signed,size) do { x86_branch32((inst),(cond),(imm),(is_signed)); } while (0)
1602 #define amd64_branch_size_body(inst,cond,target,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_branch((inst),(cond),(target),(is_signed)); amd64_codegen_post(inst); } while (0)
1603 #if defined(__default_codegen__)
1604 #define amd64_branch_size(inst,cond,target,is_signed,size) do { amd64_branch_size_body((inst),(cond),(target),(is_signed),(size)); } while (0)
1605 #elif defined(__native_client_codegen__)
1606 #define amd64_branch_size(inst,cond,target,is_signed,size) \
1607         do { \
1608                 /* amd64_branch_size_body used twice in     */ \
1609                 /* case of relocation by amd64_codegen_post */ \
1610                 guint8* branch_start; \
1611                 amd64_codegen_pre(inst); \
1612                 amd64_branch_size_body((inst),(cond),(target),(is_signed),(size)); \
1613                 inst = amd64_codegen_post(inst); \
1614                 branch_start = inst; \
1615                 amd64_branch_size_body((inst),(cond),(target),(is_signed),(size)); \
1616                 mono_amd64_patch(branch_start, (target)); \
1617         } while (0)
1618 #endif
1619
1620 #define amd64_branch_disp_size(inst,cond,disp,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_branch_disp((inst),(cond),(disp),(is_signed)); amd64_codegen_post(inst); } while (0)
1621 #define amd64_set_reg_size(inst,cond,reg,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex((inst),1,0,0,(reg)); x86_set_reg((inst),(cond),((reg)&0x7),(is_signed)); amd64_codegen_post(inst); } while (0)
1622 #define amd64_set_mem_size(inst,cond,mem,is_signed,size) do { amd64_codegen_pre(inst); x86_set_mem((inst),(cond),(mem),(is_signed)); amd64_codegen_post(inst); } while (0)
1623 #define amd64_set_membase_size(inst,cond,basereg,disp,is_signed,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),0,0,0,(basereg)); x86_set_membase((inst),(cond),((basereg)&0x7),(disp),(is_signed)); amd64_codegen_post(inst); } while (0)
1624 //#define amd64_call_reg_size(inst,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_call_reg((inst),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1625 #define amd64_call_mem_size(inst,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_call_mem((inst),(mem)); amd64_codegen_post(inst); } while (0)
1626
1627 #if defined(__default_codegen__)
1628
1629 #define amd64_call_imm_size(inst,disp,size) do { x86_call_imm((inst),(disp)); } while (0)
1630 #define amd64_call_code_size(inst,target,size) do { x86_call_code((inst),(target)); } while (0)
1631
1632 #elif defined(__native_client_codegen__)
1633 /* Size is ignored for Native Client calls, we restrict jumping to 32-bits */
1634 #define amd64_call_imm_size(inst,disp,size)             \
1635   do {                                                  \
1636     amd64_codegen_pre((inst));                          \
1637     amd64_call_sequence_pre((inst));                    \
1638     x86_call_imm((inst),(disp));                        \
1639     amd64_call_sequence_post((inst));                   \
1640     amd64_codegen_post((inst));                         \
1641   } while (0)
1642
1643 /* x86_call_code is called twice below, first so we can get the size of the */
1644 /* call sequence, and again so the exact offset from "inst" is used, since  */
1645 /* the sequence could have moved from amd64_call_sequence_post.             */
1646 /* Size is ignored for Native Client jumps, we restrict jumping to 32-bits  */
1647 #define amd64_call_code_size(inst,target,size)          \
1648   do {                                                  \
1649     amd64_codegen_pre((inst));                          \
1650     guint8* adjusted_start;                             \
1651     guint8* call_start;                                 \
1652     amd64_call_sequence_pre((inst));                    \
1653     x86_call_code((inst),(target));                     \
1654     adjusted_start = amd64_call_sequence_post((inst));  \
1655     call_start = adjusted_start;                        \
1656     x86_call_code(adjusted_start, (target));            \
1657     amd64_codegen_post((inst));                         \
1658     mono_amd64_patch(call_start, (target));             \
1659   } while (0)
1660
1661 #endif /*__native_client_codegen__*/
1662
1663 //#define amd64_ret_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_ret(inst); amd64_codegen_post(inst); } while (0)
1664 #define amd64_ret_imm_size(inst,imm,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_ret_imm((inst),(imm)); amd64_codegen_post(inst); } while (0)
1665 #define amd64_cmov_reg_size(inst,cond,is_signed,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_cmov_reg((inst),(cond),(is_signed),((dreg)&0x7),((reg)&0x7)); amd64_codegen_post(inst); } while (0)
1666 #define amd64_cmov_mem_size(inst,cond,is_signed,reg,mem,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_cmov_mem((inst),(cond),(is_signed),((reg)&0x7),(mem)); amd64_codegen_post(inst); } while (0)
1667 #define amd64_cmov_membase_size(inst,cond,is_signed,reg,basereg,disp,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_cmov_membase((inst),(cond),(is_signed),((reg)&0x7),((basereg)&0x7),(disp)); amd64_codegen_post(inst); } while (0)
1668 #define amd64_enter_size(inst,framesize) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_enter((inst),(framesize)); amd64_codegen_post(inst); } while (0)
1669 //#define amd64_leave_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_leave(inst); amd64_codegen_post(inst); } while (0)
1670 #define amd64_sahf_size(inst,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_sahf(inst); amd64_codegen_post(inst); } while (0)
1671 #define amd64_fsin_size(inst,size) do { amd64_codegen_pre(inst); x86_fsin(inst); amd64_codegen_post(inst); } while (0)
1672 #define amd64_fcos_size(inst,size) do { amd64_codegen_pre(inst); x86_fcos(inst); amd64_codegen_post(inst); } while (0)
1673 #define amd64_fabs_size(inst,size) do { amd64_codegen_pre(inst); x86_fabs(inst); amd64_codegen_post(inst); } while (0)
1674 #define amd64_ftst_size(inst,size) do { amd64_codegen_pre(inst); x86_ftst(inst); amd64_codegen_post(inst); } while (0)
1675 #define amd64_fxam_size(inst,size) do { amd64_codegen_pre(inst); x86_fxam(inst); amd64_codegen_post(inst); } while (0)
1676 #define amd64_fpatan_size(inst,size) do { amd64_codegen_pre(inst); x86_fpatan(inst); amd64_codegen_post(inst); } while (0)
1677 #define amd64_fprem_size(inst,size) do { amd64_codegen_pre(inst); x86_fprem(inst); amd64_codegen_post(inst); } while (0)
1678 #define amd64_fprem1_size(inst,size) do { amd64_codegen_pre(inst); x86_fprem1(inst); amd64_codegen_post(inst); } while (0)
1679 #define amd64_frndint_size(inst,size) do { amd64_codegen_pre(inst); x86_frndint(inst); amd64_codegen_post(inst); } while (0)
1680 #define amd64_fsqrt_size(inst,size) do { amd64_codegen_pre(inst); x86_fsqrt(inst); amd64_codegen_post(inst); } while (0)
1681 #define amd64_fptan_size(inst,size) do { amd64_codegen_pre(inst); x86_fptan(inst); amd64_codegen_post(inst); } while (0)
1682 //#define amd64_padding_size(inst,size) do { amd64_codegen_pre(inst); x86_padding((inst),(size)); amd64_codegen_post(inst); } while (0)
1683 #define amd64_prolog_size(inst,frame_size,reg_mask,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_prolog((inst),(frame_size),(reg_mask)); amd64_codegen_post(inst); } while (0)
1684 #define amd64_epilog_size(inst,reg_mask,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,0); x86_epilog((inst),(reg_mask)); amd64_codegen_post(inst); } while (0)
1685 #define amd64_xadd_reg_reg_size(inst,dreg,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_xadd_reg_reg ((inst), (dreg), (reg), (size)); amd64_codegen_post(inst); } while (0)
1686 #define amd64_xadd_mem_reg_size(inst,mem,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),0,0,(reg)); x86_xadd_mem_reg((inst),(mem),((reg)&0x7), (size)); amd64_codegen_post(inst); } while (0)
1687 #define amd64_xadd_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_codegen_pre(inst); amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_xadd_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7),(size)); amd64_codegen_post(inst); } while (0)
1688
1689
1690
1691
1692 #define amd64_breakpoint(inst) amd64_breakpoint_size(inst,8)
1693 #define amd64_cld(inst) amd64_cld_size(inst,8)
1694 #define amd64_stosb(inst) amd64_stosb_size(inst,8)
1695 #define amd64_stosl(inst) amd64_stosl_size(inst,8)
1696 #define amd64_stosd(inst) amd64_stosd_size(inst,8)
1697 #define amd64_movsb(inst) amd64_movsb_size(inst,8)
1698 #define amd64_movsl(inst) amd64_movsl_size(inst,8)
1699 #define amd64_movsd(inst) amd64_movsd_size(inst,8)
1700 #define amd64_prefix(inst,p) amd64_prefix_size(inst,p,8)
1701 #define amd64_rdtsc(inst) amd64_rdtsc_size(inst,8)
1702 #define amd64_cmpxchg_reg_reg(inst,dreg,reg) amd64_cmpxchg_reg_reg_size(inst,dreg,reg,8)
1703 #define amd64_cmpxchg_mem_reg(inst,mem,reg) amd64_cmpxchg_mem_reg_size(inst,mem,reg,8)
1704 #define amd64_cmpxchg_membase_reg(inst,basereg,disp,reg) amd64_cmpxchg_membase_reg_size(inst,basereg,disp,reg,8)
1705 #define amd64_xchg_reg_reg(inst,dreg,reg,size) amd64_xchg_reg_reg_size(inst,dreg,reg,size)
1706 #define amd64_xchg_mem_reg(inst,mem,reg,size) amd64_xchg_mem_reg_size(inst,mem,reg,size)
1707 #define amd64_xchg_membase_reg(inst,basereg,disp,reg,size) amd64_xchg_membase_reg_size(inst,basereg,disp,reg,size)
1708 #define amd64_xadd_reg_reg(inst,dreg,reg,size) amd64_xadd_reg_reg_size(inst,dreg,reg,size)
1709 #define amd64_xadd_mem_reg(inst,mem,reg,size) amd64_xadd_mem_reg_size(inst,mem,reg,size)
1710 #define amd64_xadd_membase_reg(inst,basereg,disp,reg,size) amd64_xadd_membase_reg_size(inst,basereg,disp,reg,size)
1711 #define amd64_inc_mem(inst,mem) amd64_inc_mem_size(inst,mem,8)
1712 #define amd64_inc_membase(inst,basereg,disp) amd64_inc_membase_size(inst,basereg,disp,8)
1713 #define amd64_inc_reg(inst,reg) amd64_inc_reg_size(inst,reg,8)
1714 #define amd64_dec_mem(inst,mem) amd64_dec_mem_size(inst,mem,8)
1715 #define amd64_dec_membase(inst,basereg,disp) amd64_dec_membase_size(inst,basereg,disp,8)
1716 #define amd64_dec_reg(inst,reg) amd64_dec_reg_size(inst,reg,8)
1717 #define amd64_not_mem(inst,mem) amd64_not_mem_size(inst,mem,8)
1718 #define amd64_not_membase(inst,basereg,disp) amd64_not_membase_size(inst,basereg,disp,8)
1719 #define amd64_not_reg(inst,reg) amd64_not_reg_size(inst,reg,8)
1720 #define amd64_neg_mem(inst,mem) amd64_neg_mem_size(inst,mem,8)
1721 #define amd64_neg_membase(inst,basereg,disp) amd64_neg_membase_size(inst,basereg,disp,8)
1722 #define amd64_neg_reg(inst,reg) amd64_neg_reg_size(inst,reg,8)
1723 #define amd64_nop(inst) amd64_nop_size(inst,8)
1724 //#define amd64_alu_reg_imm(inst,opc,reg,imm) amd64_alu_reg_imm_size(inst,opc,reg,imm,8)
1725 #define amd64_alu_mem_imm(inst,opc,mem,imm) amd64_alu_mem_imm_size(inst,opc,mem,imm,8)
1726 #define amd64_alu_membase_imm(inst,opc,basereg,disp,imm) amd64_alu_membase_imm_size(inst,opc,basereg,disp,imm,8)
1727 #define amd64_alu_mem_reg(inst,opc,mem,reg) amd64_alu_mem_reg_size(inst,opc,mem,reg,8)
1728 #define amd64_alu_membase_reg(inst,opc,basereg,disp,reg) amd64_alu_membase_reg_size(inst,opc,basereg,disp,reg,8)
1729 //#define amd64_alu_reg_reg(inst,opc,dreg,reg) amd64_alu_reg_reg_size(inst,opc,dreg,reg,8)
1730 #define amd64_alu_reg8_reg8(inst,opc,dreg,reg,is_dreg_h,is_reg_h) amd64_alu_reg8_reg8_size(inst,opc,dreg,reg,is_dreg_h,is_reg_h,8)
1731 #define amd64_alu_reg_mem(inst,opc,reg,mem) amd64_alu_reg_mem_size(inst,opc,reg,mem,8)
1732 #define amd64_alu_reg_membase(inst,opc,reg,basereg,disp) amd64_alu_reg_membase_size(inst,opc,reg,basereg,disp,8)
1733 //#define amd64_test_reg_imm(inst,reg,imm) amd64_test_reg_imm_size(inst,reg,imm,8)
1734 #define amd64_test_mem_imm(inst,mem,imm) amd64_test_mem_imm_size(inst,mem,imm,8)
1735 #define amd64_test_membase_imm(inst,basereg,disp,imm) amd64_test_membase_imm_size(inst,basereg,disp,imm,8)
1736 #define amd64_test_reg_reg(inst,dreg,reg) amd64_test_reg_reg_size(inst,dreg,reg,8)
1737 #define amd64_test_mem_reg(inst,mem,reg) amd64_test_mem_reg_size(inst,mem,reg,8)
1738 #define amd64_test_membase_reg(inst,basereg,disp,reg) amd64_test_membase_reg_size(inst,basereg,disp,reg,8)
1739 #define amd64_shift_reg_imm(inst,opc,reg,imm) amd64_shift_reg_imm_size(inst,opc,reg,imm,8)
1740 #define amd64_shift_mem_imm(inst,opc,mem,imm) amd64_shift_mem_imm_size(inst,opc,mem,imm,8)
1741 #define amd64_shift_membase_imm(inst,opc,basereg,disp,imm) amd64_shift_membase_imm_size(inst,opc,basereg,disp,imm,8)
1742 #define amd64_shift_reg(inst,opc,reg) amd64_shift_reg_size(inst,opc,reg,8)
1743 #define amd64_shift_mem(inst,opc,mem) amd64_shift_mem_size(inst,opc,mem,8)
1744 #define amd64_shift_membase(inst,opc,basereg,disp) amd64_shift_membase_size(inst,opc,basereg,disp,8)
1745 #define amd64_shrd_reg(inst,dreg,reg) amd64_shrd_reg_size(inst,dreg,reg,8)
1746 #define amd64_shrd_reg_imm(inst,dreg,reg,shamt) amd64_shrd_reg_imm_size(inst,dreg,reg,shamt,8)
1747 #define amd64_shld_reg(inst,dreg,reg) amd64_shld_reg_size(inst,dreg,reg,8)
1748 #define amd64_shld_reg_imm(inst,dreg,reg,shamt) amd64_shld_reg_imm_size(inst,dreg,reg,shamt,8)
1749 #define amd64_mul_reg(inst,reg,is_signed) amd64_mul_reg_size(inst,reg,is_signed,8)
1750 #define amd64_mul_mem(inst,mem,is_signed) amd64_mul_mem_size(inst,mem,is_signed,8)
1751 #define amd64_mul_membase(inst,basereg,disp,is_signed) amd64_mul_membase_size(inst,basereg,disp,is_signed,8)
1752 #define amd64_imul_reg_reg(inst,dreg,reg) amd64_imul_reg_reg_size(inst,dreg,reg,8)
1753 #define amd64_imul_reg_mem(inst,reg,mem) amd64_imul_reg_mem_size(inst,reg,mem,8)
1754 #define amd64_imul_reg_membase(inst,reg,basereg,disp) amd64_imul_reg_membase_size(inst,reg,basereg,disp,8)
1755 #define amd64_imul_reg_reg_imm(inst,dreg,reg,imm) amd64_imul_reg_reg_imm_size(inst,dreg,reg,imm,8)
1756 #define amd64_imul_reg_mem_imm(inst,reg,mem,imm) amd64_imul_reg_mem_imm_size(inst,reg,mem,imm,8)
1757 #define amd64_imul_reg_membase_imm(inst,reg,basereg,disp,imm) amd64_imul_reg_membase_imm_size(inst,reg,basereg,disp,imm,8)
1758 #define amd64_div_reg(inst,reg,is_signed) amd64_div_reg_size(inst,reg,is_signed,8)
1759 #define amd64_div_mem(inst,mem,is_signed) amd64_div_mem_size(inst,mem,is_signed,8)
1760 #define amd64_div_membase(inst,basereg,disp,is_signed) amd64_div_membase_size(inst,basereg,disp,is_signed,8)
1761 //#define amd64_mov_mem_reg(inst,mem,reg,size) amd64_mov_mem_reg_size(inst,mem,reg,size)
1762 //#define amd64_mov_regp_reg(inst,regp,reg,size) amd64_mov_regp_reg_size(inst,regp,reg,size)
1763 //#define amd64_mov_membase_reg(inst,basereg,disp,reg,size) amd64_mov_membase_reg_size(inst,basereg,disp,reg,size)
1764 #define amd64_mov_memindex_reg(inst,basereg,disp,indexreg,shift,reg,size) amd64_mov_memindex_reg_size(inst,basereg,disp,indexreg,shift,reg,size)
1765 //#define amd64_mov_reg_reg(inst,dreg,reg,size) amd64_mov_reg_reg_size(inst,dreg,reg,size)
1766 //#define amd64_mov_reg_mem(inst,reg,mem,size) amd64_mov_reg_mem_size(inst,reg,mem,size)
1767 //#define amd64_mov_reg_membase(inst,reg,basereg,disp,size) amd64_mov_reg_membase_size(inst,reg,basereg,disp,size)
1768 #define amd64_mov_reg_memindex(inst,reg,basereg,disp,indexreg,shift,size) amd64_mov_reg_memindex_size(inst,reg,basereg,disp,indexreg,shift,size)
1769 #define amd64_clear_reg(inst,reg) amd64_clear_reg_size(inst,reg,8)
1770 //#define amd64_mov_reg_imm(inst,reg,imm) amd64_mov_reg_imm_size(inst,reg,imm,8)
1771 #define amd64_mov_mem_imm(inst,mem,imm,size) amd64_mov_mem_imm_size(inst,mem,imm,size)
1772 //#define amd64_mov_membase_imm(inst,basereg,disp,imm,size) amd64_mov_membase_imm_size(inst,basereg,disp,imm,size)
1773 #define amd64_mov_memindex_imm(inst,basereg,disp,indexreg,shift,imm,size) amd64_mov_memindex_imm_size(inst,basereg,disp,indexreg,shift,imm,size)
1774 #define amd64_lea_mem(inst,reg,mem) amd64_lea_mem_size(inst,reg,mem,8)
1775 //#define amd64_lea_membase(inst,reg,basereg,disp) amd64_lea_membase_size(inst,reg,basereg,disp,8)
1776 #define amd64_lea_memindex(inst,reg,basereg,disp,indexreg,shift) amd64_lea_memindex_size(inst,reg,basereg,disp,indexreg,shift,8)
1777 #define amd64_widen_reg(inst,dreg,reg,is_signed,is_half) amd64_widen_reg_size(inst,dreg,reg,is_signed,is_half,8)
1778 #define amd64_widen_mem(inst,dreg,mem,is_signed,is_half) amd64_widen_mem_size(inst,dreg,mem,is_signed,is_half,8)
1779 #define amd64_widen_membase(inst,dreg,basereg,disp,is_signed,is_half) amd64_widen_membase_size(inst,dreg,basereg,disp,is_signed,is_half,8)
1780 #define amd64_widen_memindex(inst,dreg,basereg,disp,indexreg,shift,is_signed,is_half) amd64_widen_memindex_size(inst,dreg,basereg,disp,indexreg,shift,is_signed,is_half,8)
1781 #define amd64_cdq(inst) amd64_cdq_size(inst,8)
1782 #define amd64_wait(inst) amd64_wait_size(inst,8)
1783 #define amd64_fp_op_mem(inst,opc,mem,is_double) amd64_fp_op_mem_size(inst,opc,mem,is_double,8)
1784 #define amd64_fp_op_membase(inst,opc,basereg,disp,is_double) amd64_fp_op_membase_size(inst,opc,basereg,disp,is_double,8)
1785 #define amd64_fp_op(inst,opc,index) amd64_fp_op_size(inst,opc,index,8)
1786 #define amd64_fp_op_reg(inst,opc,index,pop_stack) amd64_fp_op_reg_size(inst,opc,index,pop_stack,8)
1787 #define amd64_fp_int_op_membase(inst,opc,basereg,disp,is_int) amd64_fp_int_op_membase_size(inst,opc,basereg,disp,is_int,8)
1788 #define amd64_fstp(inst,index) amd64_fstp_size(inst,index,8)
1789 #define amd64_fcompp(inst) amd64_fcompp_size(inst,8)
1790 #define amd64_fucompp(inst) amd64_fucompp_size(inst,8)
1791 #define amd64_fnstsw(inst) amd64_fnstsw_size(inst,8)
1792 #define amd64_fnstcw(inst,mem) amd64_fnstcw_size(inst,mem,8)
1793 #define amd64_fnstcw_membase(inst,basereg,disp) amd64_fnstcw_membase_size(inst,basereg,disp,8)
1794 #define amd64_fldcw(inst,mem) amd64_fldcw_size(inst,mem,8)
1795 #define amd64_fldcw_membase(inst,basereg,disp) amd64_fldcw_membase_size(inst,basereg,disp,8)
1796 #define amd64_fchs(inst) amd64_fchs_size(inst,8)
1797 #define amd64_frem(inst) amd64_frem_size(inst,8)
1798 #define amd64_fxch(inst,index) amd64_fxch_size(inst,index,8)
1799 #define amd64_fcomi(inst,index) amd64_fcomi_size(inst,index,8)
1800 #define amd64_fcomip(inst,index) amd64_fcomip_size(inst,index,8)
1801 #define amd64_fucomi(inst,index) amd64_fucomi_size(inst,index,8)
1802 #define amd64_fucomip(inst,index) amd64_fucomip_size(inst,index,8)
1803 #define amd64_fld(inst,mem,is_double) amd64_fld_size(inst,mem,is_double,8)
1804 #define amd64_fld_membase(inst,basereg,disp,is_double)  amd64_fld_membase_size(inst,basereg,disp,is_double,8) 
1805 #define amd64_fld80_mem(inst,mem) amd64_fld80_mem_size(inst,mem,8)
1806 #define amd64_fld80_membase(inst,basereg,disp) amd64_fld80_membase_size(inst,basereg,disp,8)
1807 #define amd64_fild(inst,mem,is_long) amd64_fild_size(inst,mem,is_long,8)
1808 #define amd64_fild_membase(inst,basereg,disp,is_long) amd64_fild_membase_size(inst,basereg,disp,is_long,8)
1809 #define amd64_fld_reg(inst,index) amd64_fld_reg_size(inst,index,8)
1810 #define amd64_fldz(inst) amd64_fldz_size(inst,8)
1811 #define amd64_fld1(inst) amd64_fld1_size(inst,8)
1812 #define amd64_fldpi(inst) amd64_fldpi_size(inst,8)
1813 #define amd64_fst(inst,mem,is_double,pop_stack) amd64_fst_size(inst,mem,is_double,pop_stack,8)
1814 #define amd64_fst_membase(inst,basereg,disp,is_double,pop_stack) amd64_fst_membase_size(inst,basereg,disp,is_double,pop_stack,8)
1815 #define amd64_fst80_mem(inst,mem) amd64_fst80_mem_size(inst,mem,8)
1816 #define amd64_fst80_membase(inst,basereg,disp) amd64_fst80_membase_size(inst,basereg,disp,8)
1817 #define amd64_fist_pop(inst,mem,is_long) amd64_fist_pop_size(inst,mem,is_long,8)
1818 #define amd64_fist_pop_membase(inst,basereg,disp,is_long) amd64_fist_pop_membase_size(inst,basereg,disp,is_long,8)
1819 #define amd64_fstsw(inst) amd64_fstsw_size(inst,8)
1820 #define amd64_fist_membase(inst,basereg,disp,is_int) amd64_fist_membase_size(inst,basereg,disp,is_int,8)
1821 //#define amd64_push_reg(inst,reg) amd64_push_reg_size(inst,reg,8)
1822 #define amd64_push_regp(inst,reg) amd64_push_regp_size(inst,reg,8)
1823 #define amd64_push_mem(inst,mem) amd64_push_mem_size(inst,mem,8)
1824 //#define amd64_push_membase(inst,basereg,disp) amd64_push_membase_size(inst,basereg,disp,8)
1825 #define amd64_push_memindex(inst,basereg,disp,indexreg,shift) amd64_push_memindex_size(inst,basereg,disp,indexreg,shift,8)
1826 #define amd64_push_imm(inst,imm) amd64_push_imm_size(inst,imm,8)
1827 //#define amd64_pop_reg(inst,reg) amd64_pop_reg_size(inst,reg,8)
1828 #define amd64_pop_mem(inst,mem) amd64_pop_mem_size(inst,mem,8)
1829 #define amd64_pop_membase(inst,basereg,disp) amd64_pop_membase_size(inst,basereg,disp,8)
1830 #define amd64_pushad(inst) amd64_pushad_size(inst,8)
1831 #define amd64_pushfd(inst) amd64_pushfd_size(inst,8)
1832 #define amd64_popad(inst) amd64_popad_size(inst,8)
1833 #define amd64_popfd(inst) amd64_popfd_size(inst,8)
1834 #define amd64_loop(inst,imm) amd64_loop_size(inst,imm,8)
1835 #define amd64_loope(inst,imm) amd64_loope_size(inst,imm,8)
1836 #define amd64_loopne(inst,imm) amd64_loopne_size(inst,imm,8)
1837 #define amd64_jump32(inst,imm) amd64_jump32_size(inst,imm,8)
1838 #define amd64_jump8(inst,imm) amd64_jump8_size(inst,imm,8)
1839 #define amd64_jump_reg(inst,reg) amd64_jump_reg_size(inst,reg,8)
1840 #define amd64_jump_mem(inst,mem) amd64_jump_mem_size(inst,mem,8)
1841 #define amd64_jump_membase(inst,basereg,disp) amd64_jump_membase_size(inst,basereg,disp,8)
1842 #define amd64_jump_code(inst,target) amd64_jump_code_size(inst,target,8)
1843 #define amd64_jump_disp(inst,disp) amd64_jump_disp_size(inst,disp,8)
1844 #define amd64_branch8(inst,cond,imm,is_signed) amd64_branch8_size(inst,cond,imm,is_signed,8)
1845 #define amd64_branch32(inst,cond,imm,is_signed) amd64_branch32_size(inst,cond,imm,is_signed,8)
1846 #define amd64_branch(inst,cond,target,is_signed) amd64_branch_size(inst,cond,target,is_signed,8)
1847 #define amd64_branch_disp(inst,cond,disp,is_signed) amd64_branch_disp_size(inst,cond,disp,is_signed,8)
1848 #define amd64_set_reg(inst,cond,reg,is_signed) amd64_set_reg_size(inst,cond,reg,is_signed,8)
1849 #define amd64_set_mem(inst,cond,mem,is_signed) amd64_set_mem_size(inst,cond,mem,is_signed,8)
1850 #define amd64_set_membase(inst,cond,basereg,disp,is_signed) amd64_set_membase_size(inst,cond,basereg,disp,is_signed,8)
1851 #define amd64_call_imm(inst,disp) amd64_call_imm_size(inst,disp,8)
1852 //#define amd64_call_reg(inst,reg) amd64_call_reg_size(inst,reg,8)
1853 #define amd64_call_mem(inst,mem) amd64_call_mem_size(inst,mem,8)
1854 #define amd64_call_membase(inst,basereg,disp) amd64_call_membase_size(inst,basereg,disp,8)
1855 #define amd64_call_code(inst,target) amd64_call_code_size(inst,target,8)
1856 //#define amd64_ret(inst) amd64_ret_size(inst,8)
1857 #define amd64_ret_imm(inst,imm) amd64_ret_imm_size(inst,imm,8)
1858 #define amd64_cmov_reg(inst,cond,is_signed,dreg,reg) amd64_cmov_reg_size(inst,cond,is_signed,dreg,reg,8)
1859 #define amd64_cmov_mem(inst,cond,is_signed,reg,mem) amd64_cmov_mem_size(inst,cond,is_signed,reg,mem,8)
1860 #define amd64_cmov_membase(inst,cond,is_signed,reg,basereg,disp) amd64_cmov_membase_size(inst,cond,is_signed,reg,basereg,disp,8)
1861 #define amd64_enter(inst,framesize) amd64_enter_size(inst,framesize)
1862 //#define amd64_leave(inst) amd64_leave_size(inst,8)
1863 #define amd64_sahf(inst) amd64_sahf_size(inst,8)
1864 #define amd64_fsin(inst) amd64_fsin_size(inst,8)
1865 #define amd64_fcos(inst) amd64_fcos_size(inst,8)
1866 #define amd64_fabs(inst) amd64_fabs_size(inst,8)
1867 #define amd64_ftst(inst) amd64_ftst_size(inst,8)
1868 #define amd64_fxam(inst) amd64_fxam_size(inst,8)
1869 #define amd64_fpatan(inst) amd64_fpatan_size(inst,8)
1870 #define amd64_fprem(inst) amd64_fprem_size(inst,8)
1871 #define amd64_fprem1(inst) amd64_fprem1_size(inst,8)
1872 #define amd64_frndint(inst) amd64_frndint_size(inst,8)
1873 #define amd64_fsqrt(inst) amd64_fsqrt_size(inst,8)
1874 #define amd64_fptan(inst) amd64_fptan_size(inst,8)
1875 #define amd64_padding(inst,size) amd64_padding_size(inst,size)
1876 #define amd64_prolog(inst,frame,reg_mask) amd64_prolog_size(inst,frame,reg_mask,8)
1877 #define amd64_epilog(inst,reg_mask) amd64_epilog_size(inst,reg_mask,8)
1878
1879 #endif // AMD64_H