2009-06-12 Bill Holmes <billholmes54@gmail.com>
[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  */
15
16 #ifndef AMD64_H
17 #define AMD64_H
18
19 #include <glib.h>
20
21 typedef enum {
22         AMD64_RAX = 0,
23         AMD64_RCX = 1,
24         AMD64_RDX = 2,
25         AMD64_RBX = 3,
26         AMD64_RSP = 4,
27         AMD64_RBP = 5,
28         AMD64_RSI = 6,
29         AMD64_RDI = 7,
30         AMD64_R8 = 8,
31         AMD64_R9 = 9,
32         AMD64_R10 = 10,
33         AMD64_R11 = 11,
34         AMD64_R12 = 12,
35         AMD64_R13 = 13,
36         AMD64_R14 = 14,
37         AMD64_R15 = 15,
38         AMD64_RIP = 16,
39         AMD64_NREG
40 } AMD64_Reg_No;
41
42 typedef enum {
43         AMD64_XMM0 = 0,
44         AMD64_XMM1 = 1,
45         AMD64_XMM2 = 2,
46         AMD64_XMM3 = 3,
47         AMD64_XMM4 = 4,
48         AMD64_XMM5 = 5,
49         AMD64_XMM6 = 6,
50         AMD64_XMM7 = 7,
51         AMD64_XMM8 = 8,
52         AMD64_XMM9 = 9,
53         AMD64_XMM10 = 10,
54         AMD64_XMM11 = 11,
55         AMD64_XMM12 = 12,
56         AMD64_XMM13 = 13,
57         AMD64_XMM14 = 14,
58         AMD64_XMM15 = 15,
59         AMD64_XMM_NREG = 16,
60 } AMD64_XMM_Reg_No;
61
62 typedef enum
63 {
64   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 */
65   AMD64_REX_X = 2, /* The index register in SIB byte is 8-15 rather than 0-7 */
66   AMD64_REX_R = 4, /* The reg field of ModRM byte is 8-15 rather than 0-7 */
67   AMD64_REX_W = 8  /* Opeartion is 64-bits instead of 32 (default) or 16 (with 0x66 prefix) */
68 } AMD64_REX_Bits;
69
70 #ifdef PLATFORM_WIN32
71 #define AMD64_ARG_REG1 AMD64_RCX
72 #define AMD64_ARG_REG2 AMD64_RDX
73 #define AMD64_ARG_REG3 AMD64_R8
74 #define AMD64_ARG_REG4 AMD64_R9
75 #else
76 #define AMD64_ARG_REG1 AMD64_RDI
77 #define AMD64_ARG_REG2 AMD64_RSI
78 #define AMD64_ARG_REG3 AMD64_RDX
79 #define AMD64_ARG_REG4 AMD64_RCX
80 #endif
81
82 #ifdef PLATFORM_WIN32
83 #define AMD64_CALLEE_REGS ((1<<AMD64_RAX) | (1<<AMD64_RCX) | (1<<AMD64_RDX) | (1<<AMD64_R8) | (1<<AMD64_R9) | (1<<AMD64_R10))
84 #define AMD64_IS_CALLEE_REG(reg)  (AMD64_CALLEE_REGS & (1 << (reg)))
85
86 #define AMD64_ARGUMENT_REGS ((1<<AMD64_RDX) | (1<<AMD64_RCX) | (1<<AMD64_R8) | (1<<AMD64_R9))
87 #define AMD64_IS_ARGUMENT_REG(reg) (AMD64_ARGUMENT_REGS & (1 << (reg)))
88
89 #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))
90 #define AMD64_IS_CALLEE_SAVED_REG(reg) (AMD64_CALLEE_SAVED_REGS & (1 << (reg)))
91 #else
92 #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))
93 #define AMD64_IS_CALLEE_REG(reg)  (AMD64_CALLEE_REGS & (1 << (reg)))
94
95 #define AMD64_ARGUMENT_REGS ((1<<AMD64_RDI) | (1<<AMD64_RSI) | (1<<AMD64_RDX) | (1<<AMD64_RCX) | (1<<AMD64_R8) | (1<<AMD64_R9))
96 #define AMD64_IS_ARGUMENT_REG(reg) (AMD64_ARGUMENT_REGS & (1 << (reg)))
97
98 #define AMD64_CALLEE_SAVED_REGS ((1<<AMD64_RBX) | (1<<AMD64_R12) | (1<<AMD64_R13) | (1<<AMD64_R14) | (1<<AMD64_R15) | (1<<AMD64_RBP))
99 #define AMD64_IS_CALLEE_SAVED_REG(reg) (AMD64_CALLEE_SAVED_REGS & (1 << (reg)))
100 #endif
101
102 #define AMD64_REX(bits) ((unsigned char)(0x40 | (bits)))
103 #define amd64_emit_rex(inst, width, reg_modrm, reg_index, reg_rm_base_opcode) do \
104         { \
105                 unsigned char _amd64_rex_bits = \
106                         (((width) > 4) ? AMD64_REX_W : 0) | \
107                         (((reg_modrm) > 7) ? AMD64_REX_R : 0) | \
108                         (((reg_index) > 7) ? AMD64_REX_X : 0) | \
109                         (((reg_rm_base_opcode) > 7) ? AMD64_REX_B : 0); \
110                 if ((_amd64_rex_bits != 0) || (((width) == 1))) *(inst)++ = AMD64_REX(_amd64_rex_bits); \
111         } while (0)
112
113 typedef union {
114         gsize val;
115         unsigned char b [8];
116 } amd64_imm_buf;
117
118 #include "../x86/x86-codegen.h"
119
120 /* In 64 bit mode, all registers have a low byte subregister */
121 #undef X86_IS_BYTE_REG
122 #define X86_IS_BYTE_REG(reg) 1
123
124 #define amd64_modrm_mod(modrm) ((modrm) >> 6)
125 #define amd64_modrm_reg(modrm) (((modrm) >> 3) & 0x7)
126 #define amd64_modrm_rm(modrm) ((modrm) & 0x7)
127
128 #define amd64_rex_r(rex) ((((rex) >> 2) & 0x1) << 3)
129 #define amd64_rex_x(rex) ((((rex) >> 1) & 0x1) << 3)
130 #define amd64_rex_b(rex) ((((rex) >> 0) & 0x1) << 3)
131
132 #define amd64_sib_scale(sib) ((sib) >> 6)
133 #define amd64_sib_index(sib) (((sib) >> 3) & 0x7)
134 #define amd64_sib_base(sib) ((sib) & 0x7)
135
136 #define amd64_is_imm32(val) ((gint64)val >= -((gint64)1<<31) && (gint64)val <= (((gint64)1<<31)-1))
137
138 #define x86_imm_emit64(inst,imm)     \
139         do {    \
140                         amd64_imm_buf imb;      \
141                         imb.val = (gsize) (imm);        \
142                         *(inst)++ = imb.b [0];  \
143                         *(inst)++ = imb.b [1];  \
144                         *(inst)++ = imb.b [2];  \
145                         *(inst)++ = imb.b [3];  \
146                         *(inst)++ = imb.b [4];  \
147                         *(inst)++ = imb.b [5];  \
148                         *(inst)++ = imb.b [6];  \
149                         *(inst)++ = imb.b [7];  \
150         } while (0)
151
152 #define amd64_membase_emit(inst,reg,basereg,disp) do { \
153         if ((basereg) == AMD64_RIP) { \
154         x86_address_byte ((inst), 0, (reg)&0x7, 5); \
155         x86_imm_emit32 ((inst), (disp)); \
156     } \
157         else \
158                 x86_membase_emit ((inst),(reg)&0x7, (basereg)&0x7, (disp)); \
159 } while (0)
160
161 #define amd64_alu_reg_imm_size(inst,opc,reg,imm,size)   \
162         do {    \
163                 if (x86_is_imm8((imm))) {       \
164                         amd64_emit_rex(inst, size, 0, 0, (reg)); \
165                         *(inst)++ = (unsigned char)0x83;        \
166                         x86_reg_emit ((inst), (opc), (reg));    \
167                         x86_imm_emit8 ((inst), (imm));  \
168                 } else if ((reg) == X86_EAX) {  \
169                         amd64_emit_rex(inst, size, 0, 0, 0); \
170                         *(inst)++ = (((unsigned char)(opc)) << 3) + 5;  \
171                         x86_imm_emit32 ((inst), (imm)); \
172                 } else {        \
173                         amd64_emit_rex(inst, size, 0, 0, (reg)); \
174                         *(inst)++ = (unsigned char)0x81;        \
175                         x86_reg_emit ((inst), (opc), (reg));    \
176                         x86_imm_emit32 ((inst), (imm)); \
177                 }       \
178         } while (0)
179
180 #define amd64_alu_reg_imm(inst,opc,reg,imm) amd64_alu_reg_imm_size((inst),(opc),(reg),(imm),8)
181
182 #define amd64_alu_reg_reg_size(inst,opc,dreg,reg,size)  \
183         do {    \
184                 amd64_emit_rex(inst, size, (dreg), 0, (reg)); \
185                 *(inst)++ = (((unsigned char)(opc)) << 3) + 3;  \
186                 x86_reg_emit ((inst), (dreg), (reg));   \
187         } while (0)
188
189 #define amd64_alu_reg_reg(inst,opc,dreg,reg) amd64_alu_reg_reg_size ((inst),(opc),(dreg),(reg),8)
190
191 #define amd64_mov_regp_reg(inst,regp,reg,size)  \
192         do {    \
193                 if ((size) == 2) \
194                         *(inst)++ = (unsigned char)0x66; \
195                 amd64_emit_rex(inst, (size), (reg), 0, (regp)); \
196                 switch ((size)) {       \
197                 case 1: *(inst)++ = (unsigned char)0x88; break; \
198                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x89; break; \
199                 default: assert (0);    \
200                 }       \
201                 x86_regp_emit ((inst), (reg), (regp));  \
202         } while (0)
203
204 #define amd64_mov_membase_reg(inst,basereg,disp,reg,size)       \
205         do {    \
206                 if ((size) == 2) \
207                         *(inst)++ = (unsigned char)0x66; \
208                 amd64_emit_rex(inst, (size), (reg), 0, (basereg)); \
209                 switch ((size)) {       \
210                 case 1: *(inst)++ = (unsigned char)0x88; break; \
211                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x89; break; \
212                 default: assert (0);    \
213                 }       \
214                 x86_membase_emit ((inst), ((reg)&0x7), ((basereg)&0x7), (disp));        \
215         } while (0)
216
217 #define amd64_mov_mem_reg(inst,mem,reg,size)    \
218         do {    \
219                 if ((size) == 2) \
220                         *(inst)++ = (unsigned char)0x66; \
221                 amd64_emit_rex(inst, (size), (reg), 0, 0); \
222                 switch ((size)) {       \
223                 case 1: *(inst)++ = (unsigned char)0x88; break; \
224                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x89; break; \
225                 default: assert (0);    \
226                 }       \
227         x86_address_byte ((inst), 0, (reg), 4); \
228         x86_address_byte ((inst), 0, 4, 5); \
229         x86_imm_emit32 ((inst), (mem)); \
230         } while (0)
231
232 #define amd64_mov_reg_reg(inst,dreg,reg,size)   \
233         do {    \
234                 if ((size) == 2) \
235                         *(inst)++ = (unsigned char)0x66; \
236                 amd64_emit_rex(inst, (size), (dreg), 0, (reg)); \
237                 switch ((size)) {       \
238                 case 1: *(inst)++ = (unsigned char)0x8a; break; \
239                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
240                 default: assert (0);    \
241                 }       \
242                 x86_reg_emit ((inst), (dreg), (reg));   \
243         } while (0)
244
245 #define amd64_mov_reg_mem(inst,reg,mem,size)    \
246         do {    \
247                 if ((size) == 2) \
248                         *(inst)++ = (unsigned char)0x66; \
249                 amd64_emit_rex(inst, (size), (reg), 0, 0); \
250                 switch ((size)) {       \
251                 case 1: *(inst)++ = (unsigned char)0x8a; break; \
252                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
253                 default: assert (0);    \
254                 }       \
255         x86_address_byte ((inst), 0, (reg), 4); \
256         x86_address_byte ((inst), 0, 4, 5); \
257         x86_imm_emit32 ((inst), (mem)); \
258         } while (0)
259
260 #define amd64_mov_reg_membase(inst,reg,basereg,disp,size)       \
261         do {    \
262                 if ((size) == 2) \
263                         *(inst)++ = (unsigned char)0x66; \
264                 amd64_emit_rex(inst, (size), (reg), 0, (basereg)); \
265                 switch ((size)) {       \
266                 case 1: *(inst)++ = (unsigned char)0x8a; break; \
267                 case 2: case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
268                 default: assert (0);    \
269                 }       \
270                 amd64_membase_emit ((inst), (reg), (basereg), (disp));  \
271         } while (0)
272
273 #define amd64_movzx_reg_membase(inst,reg,basereg,disp,size)     \
274         do {    \
275                 amd64_emit_rex(inst, (size), (reg), 0, (basereg)); \
276                 switch ((size)) {       \
277                 case 1: *(inst)++ = (unsigned char)0x0f; *(inst)++ = (unsigned char)0xb6; break;        \
278                 case 2: *(inst)++ = (unsigned char)0x0f; *(inst)++ = (unsigned char)0xb7; break;        \
279                 case 4: case 8: *(inst)++ = (unsigned char)0x8b; break; \
280                 default: assert (0);    \
281                 }       \
282                 x86_membase_emit ((inst), ((reg)&0x7), ((basereg)&0x7), (disp));        \
283         } while (0)
284
285 #define amd64_movsxd_reg_mem(inst,reg,mem) \
286     do {     \
287        amd64_emit_rex(inst,8,(reg),0,0); \
288        *(inst)++ = (unsigned char)0x63; \
289        x86_mem_emit ((inst), ((reg)&0x7), (mem)); \
290     } while (0)
291
292 #define amd64_movsxd_reg_membase(inst,reg,basereg,disp) \
293     do {     \
294        amd64_emit_rex(inst,8,(reg),0,(basereg)); \
295        *(inst)++ = (unsigned char)0x63; \
296        x86_membase_emit ((inst), ((reg)&0x7), ((basereg)&0x7), (disp)); \
297     } while (0)
298
299 #define amd64_movsxd_reg_reg(inst,dreg,reg) \
300     do {     \
301        amd64_emit_rex(inst,8,(dreg),0,(reg)); \
302        *(inst)++ = (unsigned char)0x63; \
303            x86_reg_emit ((inst), (dreg), (reg));        \
304     } while (0)
305
306 /* Pretty much the only instruction that supports a 64-bit immediate. Optimize for common case of
307  * 32-bit immediate. Pepper with casts to avoid warnings.
308  */
309 #define amd64_mov_reg_imm_size(inst,reg,imm,size)       \
310         do {    \
311                 amd64_emit_rex(inst, (size), 0, 0, (reg)); \
312                 *(inst)++ = (unsigned char)0xb8 + ((reg) & 0x7);        \
313                 if ((size) == 8) \
314                         x86_imm_emit64 ((inst), (gsize)(imm));  \
315                 else \
316                         x86_imm_emit32 ((inst), (int)(gsize)(imm));     \
317         } while (0)
318
319 #define amd64_mov_reg_imm(inst,reg,imm) \
320         do {    \
321                 int _amd64_width_temp = ((gsize)(imm) == (gsize)(int)(gsize)(imm)); \
322         amd64_mov_reg_imm_size ((inst), (reg), (imm), (_amd64_width_temp ? 4 : 8)); \
323         } while (0)
324
325 #define amd64_set_reg_template(inst,reg) amd64_mov_reg_imm_size ((inst),(reg), 0, 8)
326
327 #define amd64_set_template(inst,reg) amd64_set_reg_template((inst),(reg))
328
329 #define amd64_mov_membase_imm(inst,basereg,disp,imm,size)       \
330         do {    \
331                 if ((size) == 2) \
332                         *(inst)++ = (unsigned char)0x66; \
333                 amd64_emit_rex(inst, (size) == 1 ? 0 : (size), 0, 0, (basereg)); \
334                 if ((size) == 1) {      \
335                         *(inst)++ = (unsigned char)0xc6;        \
336                         x86_membase_emit ((inst), 0, (basereg) & 0x7, (disp));  \
337                         x86_imm_emit8 ((inst), (imm));  \
338                 } else if ((size) == 2) {       \
339                         *(inst)++ = (unsigned char)0xc7;        \
340                         x86_membase_emit ((inst), 0, (basereg) & 0x7, (disp));  \
341                         x86_imm_emit16 ((inst), (imm)); \
342                 } else {        \
343                         *(inst)++ = (unsigned char)0xc7;        \
344                         x86_membase_emit ((inst), 0, (basereg) & 0x7, (disp));  \
345                         x86_imm_emit32 ((inst), (imm)); \
346                 }       \
347         } while (0)
348
349 #define amd64_lea_membase(inst,reg,basereg,disp)        \
350         do {    \
351                 amd64_emit_rex(inst, 8, (reg), 0, (basereg)); \
352                 *(inst)++ = (unsigned char)0x8d;        \
353                 amd64_membase_emit ((inst), (reg), (basereg), (disp));  \
354         } while (0)
355
356 /* Instruction are implicitly 64-bits so don't generate REX for just the size. */
357 #define amd64_push_reg(inst,reg)        \
358         do {    \
359                 amd64_emit_rex(inst, 0, 0, 0, (reg)); \
360                 *(inst)++ = (unsigned char)0x50 + ((reg) & 0x7);        \
361         } while (0)
362
363 /* Instruction is implicitly 64-bits so don't generate REX for just the size. */
364 #define amd64_push_membase(inst,basereg,disp)   \
365         do {    \
366                 amd64_emit_rex(inst, 0, 0, 0, (basereg)); \
367                 *(inst)++ = (unsigned char)0xff;        \
368                 x86_membase_emit ((inst), 6, (basereg) & 0x7, (disp));  \
369         } while (0)
370
371 #define amd64_pop_reg(inst,reg) \
372         do {    \
373                 amd64_emit_rex(inst, 0, 0, 0, (reg)); \
374                 *(inst)++ = (unsigned char)0x58 + ((reg) & 0x7);        \
375         } while (0)
376
377 #define amd64_call_reg(inst,reg)        \
378         do {    \
379                 amd64_emit_rex(inst, 0, 0, 0, (reg)); \
380                 *(inst)++ = (unsigned char)0xff;        \
381                 x86_reg_emit ((inst), 2, ((reg) & 0x7));        \
382         } while (0)
383
384 #define amd64_ret(inst) do { *(inst)++ = (unsigned char)0xc3; } while (0)
385 #define amd64_leave(inst) do { *(inst)++ = (unsigned char)0xc9; } while (0)
386 #define amd64_movsd_reg_regp(inst,reg,regp)     \
387         do {    \
388                 *(inst)++ = (unsigned char)0xf2;        \
389                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
390                 *(inst)++ = (unsigned char)0x0f;        \
391                 *(inst)++ = (unsigned char)0x10;        \
392                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
393         } while (0)
394
395 #define amd64_movsd_regp_reg(inst,regp,reg)     \
396         do {    \
397                 *(inst)++ = (unsigned char)0xf2;        \
398                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
399                 *(inst)++ = (unsigned char)0x0f;        \
400                 *(inst)++ = (unsigned char)0x11;        \
401                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
402         } while (0)
403
404 #define amd64_movss_reg_regp(inst,reg,regp)     \
405         do {    \
406                 *(inst)++ = (unsigned char)0xf3;        \
407                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
408                 *(inst)++ = (unsigned char)0x0f;        \
409                 *(inst)++ = (unsigned char)0x10;        \
410                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
411         } while (0)
412
413 #define amd64_movss_regp_reg(inst,regp,reg)     \
414         do {    \
415                 *(inst)++ = (unsigned char)0xf3;        \
416                 amd64_emit_rex(inst, 0, (reg), 0, (regp)); \
417                 *(inst)++ = (unsigned char)0x0f;        \
418                 *(inst)++ = (unsigned char)0x11;        \
419                 x86_regp_emit ((inst), (reg) & 0x7, (regp) & 0x7);      \
420         } while (0)
421
422 #define amd64_movsd_reg_membase(inst,reg,basereg,disp)  \
423         do {    \
424                 *(inst)++ = (unsigned char)0xf2;        \
425                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
426                 *(inst)++ = (unsigned char)0x0f;        \
427                 *(inst)++ = (unsigned char)0x10;        \
428                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
429         } while (0)
430
431 #define amd64_movss_reg_membase(inst,reg,basereg,disp)  \
432         do {    \
433                 *(inst)++ = (unsigned char)0xf3;        \
434                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
435                 *(inst)++ = (unsigned char)0x0f;        \
436                 *(inst)++ = (unsigned char)0x10;        \
437                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
438         } while (0)
439
440 #define amd64_movsd_membase_reg(inst,basereg,disp,reg)  \
441         do {    \
442                 *(inst)++ = (unsigned char)0xf2;        \
443                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
444                 *(inst)++ = (unsigned char)0x0f;        \
445                 *(inst)++ = (unsigned char)0x11;        \
446                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
447         } while (0)
448
449 #define amd64_movss_membase_reg(inst,basereg,disp,reg)  \
450         do {    \
451                 *(inst)++ = (unsigned char)0xf3;        \
452                 amd64_emit_rex(inst, 0, (reg), 0, (basereg)); \
453                 *(inst)++ = (unsigned char)0x0f;        \
454                 *(inst)++ = (unsigned char)0x11;        \
455                 x86_membase_emit ((inst), (reg) & 0x7, (basereg) & 0x7, (disp));        \
456         } while (0)
457
458 /* The original inc_reg opcode is used as the REX prefix */
459 #define amd64_inc_reg_size(inst,reg,size) \
460     do { \
461             amd64_emit_rex ((inst),(size),0,0,(reg)); \
462         *(inst)++ = (unsigned char)0xff; \
463         x86_reg_emit ((inst),0,(reg) & 0x7); \
464     } while (0)
465
466 #define amd64_dec_reg_size(inst,reg,size) \
467     do { \
468             amd64_emit_rex ((inst),(size),0,0,(reg)); \
469         *(inst)++ = (unsigned char)0xff; \
470         x86_reg_emit ((inst),1,(reg) & 0x7); \
471     } while (0)
472
473 /* From the AMD64 Software Optimization Manual */
474 #define amd64_padding_size(inst,size) \
475     do { \
476             switch ((size)) {                                                             \
477         case 1: *(inst)++ = 0x90; break;                                                  \
478         case 2: *(inst)++ = 0x66; *(inst)++ = 0x90; break;                        \
479         case 3: *(inst)++ = 0x66; *(inst)++ = 0x66; *(inst)++ = 0x90; break; \
480                 default: amd64_emit_rex ((inst),8,0,0,0); x86_padding ((inst), (size) - 1); \
481                 }; \
482                 } while (0)
483
484 #define amd64_fld_membase_size(inst,basereg,disp,is_double,size) do { \
485         amd64_emit_rex ((inst),0,0,0,(basereg)); \
486     *(inst)++ = (is_double) ? (unsigned char)0xdd : (unsigned char)0xd9;        \
487         amd64_membase_emit ((inst), 0, (basereg), (disp));      \
488 } while (0)
489
490 #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)
491 #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)
492     
493 #define amd64_jump_code_size(inst,target,size) do { \
494         if (amd64_is_imm32 ((gint64)(target) - (gint64)(inst))) {               \
495                 x86_jump_code((inst),(target));                                                                 \
496         } else {                                                                                                                        \
497             amd64_jump_membase ((inst), AMD64_RIP, 0);                                                  \
498                 *(guint64*)(inst) = (guint64)(target);                                                  \
499                 (inst) += 8; \
500         } \
501 } while (0)
502
503 /*
504  * SSE
505  */
506
507 /* Two opcode SSE defines */
508
509 #define emit_sse_reg_reg_op2_size(inst,dreg,reg,op1,op2,size) do { \
510     amd64_emit_rex ((inst), size, (dreg), 0, (reg)); \
511     *(inst)++ = (unsigned char)(op1); \
512     *(inst)++ = (unsigned char)(op2); \
513     x86_reg_emit ((inst), (dreg), (reg)); \
514 } while (0)
515
516 #define emit_sse_reg_reg_op2(inst,dreg,reg,op1,op2) emit_sse_reg_reg_op2_size ((inst), (dreg), (reg), (op1), (op2), 0)
517
518 #define emit_sse_membase_reg_op2(inst,basereg,disp,reg,op1,op2) do { \
519     amd64_emit_rex ((inst), 0, (reg), 0, (basereg)); \
520     *(inst)++ = (unsigned char)(op1); \
521     *(inst)++ = (unsigned char)(op2); \
522     amd64_membase_emit ((inst), (reg), (basereg), (disp)); \
523 } while (0)
524
525 #define emit_sse_reg_membase_op2(inst,dreg,basereg,disp,op1,op2) do { \
526     amd64_emit_rex ((inst), 0, (dreg), 0, (basereg) == AMD64_RIP ? 0 : (basereg)); \
527     *(inst)++ = (unsigned char)(op1); \
528     *(inst)++ = (unsigned char)(op2); \
529     amd64_membase_emit ((inst), (dreg), (basereg), (disp)); \
530 } while (0)
531
532 /* Three opcode SSE defines */
533
534 #define emit_opcode3(inst,op1,op2,op3) do { \
535    *(inst)++ = (unsigned char)(op1); \
536    *(inst)++ = (unsigned char)(op2); \
537    *(inst)++ = (unsigned char)(op3); \
538 } while (0)
539
540 #define emit_sse_reg_reg_size(inst,dreg,reg,op1,op2,op3,size) do { \
541     *(inst)++ = (unsigned char)(op1); \
542         amd64_emit_rex ((inst), size, (dreg), 0, (reg)); \
543     *(inst)++ = (unsigned char)(op2); \
544     *(inst)++ = (unsigned char)(op3); \
545     x86_reg_emit ((inst), (dreg), (reg)); \
546 } while (0)
547
548 #define emit_sse_reg_reg(inst,dreg,reg,op1,op2,op3) emit_sse_reg_reg_size ((inst), (dreg), (reg), (op1), (op2), (op3), 0)
549
550 #define emit_sse_membase_reg(inst,basereg,disp,reg,op1,op2,op3) do { \
551     *(inst)++ = (unsigned char)(op1); \
552     amd64_emit_rex ((inst), 0, (reg), 0, (basereg)); \
553     *(inst)++ = (unsigned char)(op2); \
554     *(inst)++ = (unsigned char)(op3); \
555     amd64_membase_emit ((inst), (reg), (basereg), (disp)); \
556 } while (0)
557
558 #define emit_sse_reg_membase(inst,dreg,basereg,disp,op1,op2,op3) do { \
559     *(inst)++ = (unsigned char)(op1); \
560     amd64_emit_rex ((inst), 0, (dreg), 0, (basereg) == AMD64_RIP ? 0 : (basereg)); \
561     *(inst)++ = (unsigned char)(op2); \
562     *(inst)++ = (unsigned char)(op3); \
563     amd64_membase_emit ((inst), (dreg), (basereg), (disp)); \
564 } while (0)
565
566 /* specific SSE opcode defines */
567  
568 #define amd64_sse_xorpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg), 0x66, 0x0f, 0x57)
569
570 #define amd64_sse_xorpd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst),(dreg),(basereg), (disp), 0x66, 0x0f, 0x57)
571
572 #define amd64_sse_andpd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst),(dreg),(basereg), (disp), 0x66, 0x0f, 0x54)
573
574 #define amd64_sse_movsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x10)
575
576 #define amd64_sse_movsd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0xf2, 0x0f, 0x10)
577
578 #define amd64_sse_movsd_membase_reg(inst,basereg,disp,reg) emit_sse_membase_reg ((inst), (basereg), (disp), (reg), 0xf2, 0x0f, 0x11)
579
580 #define amd64_sse_movss_membase_reg(inst,basereg,disp,reg) emit_sse_membase_reg ((inst), (basereg), (disp), (reg), 0xf3, 0x0f, 0x11)
581
582 #define amd64_sse_movss_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0xf3, 0x0f, 0x10)
583
584 #define amd64_sse_comisd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x66,0x0f,0x2f)
585
586 #define amd64_sse_comisd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0x66, 0x0f, 0x2f)
587
588 #define amd64_sse_ucomisd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x66,0x0f,0x2e)
589
590 #define amd64_sse_cvtsd2si_reg_reg(inst,dreg,reg) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2d, 8)
591
592 #define amd64_sse_cvttsd2si_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2c, (size))
593
594 #define amd64_sse_cvttsd2si_reg_reg(inst,dreg,reg) amd64_sse_cvttsd2si_reg_reg_size ((inst), (dreg), (reg), 8)
595
596 #define amd64_sse_cvtsi2sd_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2a, (size))
597
598 #define amd64_sse_cvtsi2sd_reg_reg(inst,dreg,reg) amd64_sse_cvtsi2sd_reg_reg_size ((inst), (dreg), (reg), 8)
599
600 #define amd64_sse_cvtsd2ss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5a)
601
602 #define amd64_sse_cvtss2sd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5a)
603
604 #define amd64_sse_addsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x58)
605
606 #define amd64_sse_subsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5c)
607
608 #define amd64_sse_mulsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x59)
609
610 #define amd64_sse_divsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5e)
611
612 /* Generated from x86-codegen.h */
613
614 #define amd64_breakpoint_size(inst,size) do { x86_breakpoint(inst); } while (0)
615 #define amd64_cld_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_cld(inst); } while (0)
616 #define amd64_stosb_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_stosb(inst); } while (0)
617 #define amd64_stosl_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_stosl(inst); } while (0)
618 #define amd64_stosd_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_stosd(inst); } while (0)
619 #define amd64_movsb_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_movsb(inst); } while (0)
620 #define amd64_movsl_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_movsl(inst); } while (0)
621 #define amd64_movsd_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_movsd(inst); } while (0)
622 #define amd64_prefix_size(inst,p,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_prefix((inst), p); } while (0)
623 #define amd64_rdtsc_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_rdtsc(inst); } while (0)
624 #define amd64_cmpxchg_reg_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_cmpxchg_reg_reg((inst),((dreg)&0x7),((reg)&0x7)); } while (0)
625 #define amd64_cmpxchg_mem_reg_size(inst,mem,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_cmpxchg_mem_reg((inst),(mem),((reg)&0x7)); } while (0)
626 #define amd64_cmpxchg_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_cmpxchg_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7)); } while (0)
627 #define amd64_xchg_reg_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_xchg_reg_reg((inst),((dreg)&0x7),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
628 #define amd64_xchg_mem_reg_size(inst,mem,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_xchg_mem_reg((inst),(mem),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
629 #define amd64_xchg_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_xchg_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
630 #define amd64_inc_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_inc_mem((inst),(mem)); } while (0)
631 #define amd64_inc_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_inc_membase((inst),((basereg)&0x7),(disp)); } while (0)
632 //#define amd64_inc_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_inc_reg((inst),((reg)&0x7)); } while (0)
633 #define amd64_dec_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_dec_mem((inst),(mem)); } while (0)
634 #define amd64_dec_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_dec_membase((inst),((basereg)&0x7),(disp)); } while (0)
635 //#define amd64_dec_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_dec_reg((inst),((reg)&0x7)); } while (0)
636 #define amd64_not_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_not_mem((inst),(mem)); } while (0)
637 #define amd64_not_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_not_membase((inst),((basereg)&0x7),(disp)); } while (0)
638 #define amd64_not_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_not_reg((inst),((reg)&0x7)); } while (0)
639 #define amd64_neg_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_neg_mem((inst),(mem)); } while (0)
640 #define amd64_neg_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_neg_membase((inst),((basereg)&0x7),(disp)); } while (0)
641 #define amd64_neg_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_neg_reg((inst),((reg)&0x7)); } while (0)
642 #define amd64_nop_size(inst,size) do { x86_nop(inst); } while (0)
643 //#define amd64_alu_reg_imm_size(inst,opc,reg,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_alu_reg_imm((inst),(opc),((reg)&0x7),(imm)); } while (0)
644 #define amd64_alu_mem_imm_size(inst,opc,mem,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_alu_mem_imm((inst),(opc),(mem),(imm)); } while (0)
645 #define amd64_alu_membase_imm_size(inst,opc,basereg,disp,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_alu_membase_imm((inst),(opc),((basereg)&0x7),(disp),(imm)); } while (0)
646 #define amd64_alu_membase8_imm_size(inst,opc,basereg,disp,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_alu_membase8_imm((inst),(opc),((basereg)&0x7),(disp),(imm)); } while (0)     
647 #define amd64_alu_mem_reg_size(inst,opc,mem,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_alu_mem_reg((inst),(opc),(mem),((reg)&0x7)); } while (0)
648 #define amd64_alu_membase_reg_size(inst,opc,basereg,disp,reg,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_alu_membase_reg((inst),(opc),((basereg)&0x7),(disp),((reg)&0x7)); } while (0)
649 //#define amd64_alu_reg_reg_size(inst,opc,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_alu_reg_reg((inst),(opc),((dreg)&0x7),((reg)&0x7)); } while (0)
650 #define amd64_alu_reg8_reg8_size(inst,opc,dreg,reg,is_dreg_h,is_reg_h,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_alu_reg8_reg8((inst),(opc),((dreg)&0x7),((reg)&0x7),(is_dreg_h),(is_reg_h)); } while (0)
651 #define amd64_alu_reg_mem_size(inst,opc,reg,mem,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_alu_reg_mem((inst),(opc),((reg)&0x7),(mem)); } while (0)
652 #define amd64_alu_reg_membase_size(inst,opc,reg,basereg,disp,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_alu_reg_membase((inst),(opc),((reg)&0x7),((basereg)&0x7),(disp)); } while (0)
653 #define amd64_test_reg_imm_size(inst,reg,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_test_reg_imm((inst),((reg)&0x7),(imm)); } while (0)
654 #define amd64_test_mem_imm_size(inst,mem,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_test_mem_imm((inst),(mem),(imm)); } while (0)
655 #define amd64_test_membase_imm_size(inst,basereg,disp,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_test_membase_imm((inst),((basereg)&0x7),(disp),(imm)); } while (0)
656 #define amd64_test_reg_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_test_reg_reg((inst),((dreg)&0x7),((reg)&0x7)); } while (0)
657 #define amd64_test_mem_reg_size(inst,mem,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_test_mem_reg((inst),(mem),((reg)&0x7)); } while (0)
658 #define amd64_test_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_test_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7)); } while (0)
659 #define amd64_shift_reg_imm_size(inst,opc,reg,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_reg_imm((inst),(opc),((reg)&0x7),(imm)); } while (0)
660 #define amd64_shift_mem_imm_size(inst,opc,mem,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_mem_imm((inst),(opc),(mem),(imm)); } while (0)
661 #define amd64_shift_membase_imm_size(inst,opc,basereg,disp,imm,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_shift_membase_imm((inst),(opc),((basereg)&0x7),(disp),(imm)); } while (0)
662 #define amd64_shift_reg_size(inst,opc,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_reg((inst),(opc),((reg)&0x7)); } while (0)
663 #define amd64_shift_mem_size(inst,opc,mem,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_shift_mem((inst),(opc),(mem)); } while (0)
664 #define amd64_shift_membase_size(inst,opc,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_shift_membase((inst),(opc),((basereg)&0x7),(disp)); } while (0)
665 #define amd64_shrd_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shrd_reg((inst),((dreg)&0x7),((reg)&0x7)); } while (0)
666 #define amd64_shrd_reg_imm_size(inst,dreg,reg,shamt,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shrd_reg_imm((inst),((dreg)&0x7),((reg)&0x7),(shamt)); } while (0)
667 #define amd64_shld_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shld_reg((inst),((dreg)&0x7),((reg)&0x7)); } while (0)
668 #define amd64_shld_reg_imm_size(inst,dreg,reg,shamt,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_shld_reg_imm((inst),((dreg)&0x7),((reg)&0x7),(shamt)); } while (0)
669 #define amd64_mul_reg_size(inst,reg,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mul_reg((inst),((reg)&0x7),(is_signed)); } while (0)
670 #define amd64_mul_mem_size(inst,mem,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_mul_mem((inst),(mem),(is_signed)); } while (0)
671 #define amd64_mul_membase_size(inst,basereg,disp,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_mul_membase((inst),((basereg)&0x7),(disp),(is_signed)); } while (0)
672 #define amd64_imul_reg_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_imul_reg_reg((inst),((dreg)&0x7),((reg)&0x7)); } while (0)
673 #define amd64_imul_reg_mem_size(inst,reg,mem,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_imul_reg_mem((inst),((reg)&0x7),(mem)); } while (0)
674 #define amd64_imul_reg_membase_size(inst,reg,basereg,disp,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_imul_reg_membase((inst),((reg)&0x7),((basereg)&0x7),(disp)); } while (0)
675 #define amd64_imul_reg_reg_imm_size(inst,dreg,reg,imm,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_imul_reg_reg_imm((inst),((dreg)&0x7),((reg)&0x7),(imm)); } while (0)
676 #define amd64_imul_reg_mem_imm_size(inst,reg,mem,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_imul_reg_mem_imm((inst),((reg)&0x7),(mem),(imm)); } while (0)
677 #define amd64_imul_reg_membase_imm_size(inst,reg,basereg,disp,imm,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_imul_reg_membase_imm((inst),((reg)&0x7),((basereg)&0x7),(disp),(imm)); } while (0)
678 #define amd64_div_reg_size(inst,reg,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_div_reg((inst),((reg)&0x7),(is_signed)); } while (0)
679 #define amd64_div_mem_size(inst,mem,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_div_mem((inst),(mem),(is_signed)); } while (0)
680 #define amd64_div_membase_size(inst,basereg,disp,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_div_membase((inst),((basereg)&0x7),(disp),(is_signed)); } while (0)
681 #define amd64_mov_mem_reg_size(inst,mem,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mov_mem_reg((inst),(mem),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
682 //#define amd64_mov_regp_reg_size(inst,regp,reg,size) do { amd64_emit_rex ((inst),(size),(regp),0,(reg)); x86_mov_regp_reg((inst),(regp),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
683 //#define amd64_mov_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_mov_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
684 #define amd64_mov_memindex_reg_size(inst,basereg,disp,indexreg,shift,reg,size) do { 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)); } while (0)
685 #define amd64_mov_reg_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_mov_reg_reg((inst),((dreg)&0x7),((reg)&0x7),(size) == 8 ? 4 : (size)); } while (0)
686 //#define amd64_mov_reg_mem_size(inst,reg,mem,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mov_reg_mem((inst),((reg)&0x7),(mem),(size) == 8 ? 4 : (size)); } while (0)
687 //#define amd64_mov_reg_membase_size(inst,reg,basereg,disp,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_mov_reg_membase((inst),((reg)&0x7),((basereg)&0x7),(disp),(size) == 8 ? 4 : (size)); } while (0)
688 #define amd64_mov_reg_memindex_size(inst,reg,basereg,disp,indexreg,shift,size) do { 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)); } while (0)
689 #define amd64_clear_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_clear_reg((inst),((reg)&0x7)); } while (0)
690 //#define amd64_mov_reg_imm_size(inst,reg,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_mov_reg_imm((inst),((reg)&0x7),(imm)); } while (0)
691 #define amd64_mov_mem_imm_size(inst,mem,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_mov_mem_imm((inst),(mem),(imm),(size) == 8 ? 4 : (size)); } while (0)
692 //#define amd64_mov_membase_imm_size(inst,basereg,disp,imm,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_mov_membase_imm((inst),((basereg)&0x7),(disp),(imm),(size) == 8 ? 4 : (size)); } while (0)
693 #define amd64_mov_memindex_imm_size(inst,basereg,disp,indexreg,shift,imm,size) do { amd64_emit_rex ((inst),(size),0,(indexreg),(basereg)); x86_mov_memindex_imm((inst),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),(imm),(size) == 8 ? 4 : (size)); } while (0)
694 #define amd64_lea_mem_size(inst,reg,mem,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_lea_mem((inst),((reg)&0x7),(mem)); } while (0)
695 //#define amd64_lea_membase_size(inst,reg,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_lea_membase((inst),((reg)&0x7),((basereg)&0x7),(disp)); } while (0)
696 #define amd64_lea_memindex_size(inst,reg,basereg,disp,indexreg,shift,size) do { amd64_emit_rex ((inst),(size),(reg),(indexreg),(basereg)); x86_lea_memindex((inst),((reg)&0x7),((basereg)&0x7),(disp),((indexreg)&0x7),(shift)); } while (0)
697 #define amd64_widen_reg_size(inst,dreg,reg,is_signed,is_half,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_widen_reg((inst),((dreg)&0x7),((reg)&0x7),(is_signed),(is_half)); } while (0)
698 #define amd64_widen_mem_size(inst,dreg,mem,is_signed,is_half,size) do { amd64_emit_rex ((inst),(size),(dreg),0,0); x86_widen_mem((inst),((dreg)&0x7),(mem),(is_signed),(is_half)); } while (0)
699 #define amd64_widen_membase_size(inst,dreg,basereg,disp,is_signed,is_half,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(basereg)); x86_widen_membase((inst),((dreg)&0x7),((basereg)&0x7),(disp),(is_signed),(is_half)); } while (0)
700 #define amd64_widen_memindex_size(inst,dreg,basereg,disp,indexreg,shift,is_signed,is_half,size) do { amd64_emit_rex ((inst),(size),(dreg),(indexreg),(basereg)); x86_widen_memindex((inst),((dreg)&0x7),((basereg)&0x7),(disp),((indexreg)&0x7),(shift),(is_signed),(is_half)); } while (0)
701 #define amd64_cdq_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_cdq(inst); } while (0)
702 #define amd64_wait_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_wait(inst); } while (0)
703 #define amd64_fp_op_mem_size(inst,opc,mem,is_double,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fp_op_mem((inst),(opc),(mem),(is_double)); } while (0)
704 #define amd64_fp_op_membase_size(inst,opc,basereg,disp,is_double,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fp_op_membase((inst),(opc),((basereg)&0x7),(disp),(is_double)); } while (0)
705 #define amd64_fp_op_size(inst,opc,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fp_op((inst),(opc),(index)); } while (0)
706 #define amd64_fp_op_reg_size(inst,opc,index,pop_stack,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fp_op_reg((inst),(opc),(index),(pop_stack)); } while (0)
707 #define amd64_fp_int_op_membase_size(inst,opc,basereg,disp,is_int,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fp_int_op_membase((inst),(opc),((basereg)&0x7),(disp),(is_int)); } while (0)
708 #define amd64_fstp_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fstp((inst),(index)); } while (0)
709 #define amd64_fcompp_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fcompp(inst); } while (0)
710 #define amd64_fucompp_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fucompp(inst); } while (0)
711 #define amd64_fnstsw_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fnstsw(inst); } while (0)
712 #define amd64_fnstcw_size(inst,mem,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fnstcw((inst),(mem)); } while (0)
713 #define amd64_fnstcw_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_fnstcw_membase((inst),((basereg)&0x7),(disp)); } while (0)
714 #define amd64_fldcw_size(inst,mem,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fldcw((inst),(mem)); } while (0)
715 #define amd64_fldcw_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fldcw_membase((inst),((basereg)&0x7),(disp)); } while (0)
716 #define amd64_fchs_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fchs(inst); } while (0)
717 #define amd64_frem_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_frem(inst); } while (0)
718 #define amd64_fxch_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fxch((inst),(index)); } while (0)
719 #define amd64_fcomi_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fcomi((inst),(index)); } while (0)
720 #define amd64_fcomip_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fcomip((inst),(index)); } while (0)
721 #define amd64_fucomi_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fucomi((inst),(index)); } while (0)
722 #define amd64_fucomip_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fucomip((inst),(index)); } while (0)
723 #define amd64_fld_size(inst,mem,is_double,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fld((inst),(mem),(is_double)); } while (0)
724 //#define amd64_fld_membase_size(inst,basereg,disp,is_double,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fld_membase((inst),((basereg)&0x7),(disp),(is_double)); } while (0)
725 #define amd64_fld80_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fld80_mem((inst),(mem)); } while (0)
726 #define amd64_fld80_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_fld80_membase((inst),((basereg)&0x7),(disp)); } while (0)
727 #define amd64_fild_size(inst,mem,is_long,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fild((inst),(mem),(is_long)); } while (0)
728 #define amd64_fild_membase_size(inst,basereg,disp,is_long,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fild_membase((inst),((basereg)&0x7),(disp),(is_long)); } while (0)
729 #define amd64_fld_reg_size(inst,index,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fld_reg((inst),(index)); } while (0)
730 #define amd64_fldz_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fldz(inst); } while (0)
731 #define amd64_fld1_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fld1(inst); } while (0)
732 #define amd64_fldpi_size(inst,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fldpi(inst); } while (0)
733 #define amd64_fst_size(inst,mem,is_double,pop_stack,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fst((inst),(mem),(is_double),(pop_stack)); } while (0)
734 #define amd64_fst_membase_size(inst,basereg,disp,is_double,pop_stack,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fst_membase((inst),((basereg)&0x7),(disp),(is_double),(pop_stack)); } while (0)
735 #define amd64_fst80_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fst80_mem((inst),(mem)); } while (0)
736 #define amd64_fst80_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fst80_membase((inst),((basereg)&0x7),(disp)); } while (0)
737 #define amd64_fist_pop_size(inst,mem,is_long,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_fist_pop((inst),(mem),(is_long)); } while (0)
738 #define amd64_fist_pop_membase_size(inst,basereg,disp,is_long,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fist_pop_membase((inst),((basereg)&0x7),(disp),(is_long)); } while (0)
739 #define amd64_fstsw_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_fstsw(inst); } while (0)
740 #define amd64_fist_membase_size(inst,basereg,disp,is_int,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_fist_membase((inst),((basereg)&0x7),(disp),(is_int)); } while (0)
741 //#define amd64_push_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_push_reg((inst),((reg)&0x7)); } while (0)
742 #define amd64_push_regp_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_push_regp((inst),((reg)&0x7)); } while (0)
743 #define amd64_push_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_push_mem((inst),(mem)); } while (0)
744 //#define amd64_push_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_push_membase((inst),((basereg)&0x7),(disp)); } while (0)
745 #define amd64_push_memindex_size(inst,basereg,disp,indexreg,shift,size) do { amd64_emit_rex ((inst),(size),0,(indexreg),(basereg)); x86_push_memindex((inst),((basereg)&0x7),(disp),((indexreg)&0x7),(shift)); } while (0)
746 #define amd64_push_imm_size(inst,imm,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_push_imm((inst),(imm)); } while (0)
747 //#define amd64_pop_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_pop_reg((inst),((reg)&0x7)); } while (0)
748 #define amd64_pop_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_pop_mem((inst),(mem)); } while (0)
749 #define amd64_pop_membase_size(inst,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_pop_membase((inst),((basereg)&0x7),(disp)); } while (0)
750 #define amd64_pushad_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_pushad(inst); } while (0)
751 #define amd64_pushfd_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_pushfd(inst); } while (0)
752 #define amd64_popad_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_popad(inst); } while (0)
753 #define amd64_popfd_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_popfd(inst); } while (0)
754 #define amd64_loop_size(inst,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_loop((inst),(imm)); } while (0)
755 #define amd64_loope_size(inst,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_loope((inst),(imm)); } while (0)
756 #define amd64_loopne_size(inst,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_loopne((inst),(imm)); } while (0)
757 #define amd64_jump32_size(inst,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_jump32((inst),(imm)); } while (0)
758 #define amd64_jump8_size(inst,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_jump8((inst),(imm)); } while (0)
759 #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)
760 #define amd64_jump_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_jump_mem((inst),(mem)); } while (0)
761 #define amd64_jump_disp_size(inst,disp,size) do { amd64_emit_rex ((inst),0,0,0,0); x86_jump_disp((inst),(disp)); } while (0)
762 #define amd64_branch8_size(inst,cond,imm,is_signed,size) do { x86_branch8((inst),(cond),(imm),(is_signed)); } while (0)
763 #define amd64_branch32_size(inst,cond,imm,is_signed,size) do { x86_branch32((inst),(cond),(imm),(is_signed)); } while (0)
764 #define amd64_branch_size(inst,cond,target,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_branch((inst),(cond),(target),(is_signed)); } while (0)
765 #define amd64_branch_disp_size(inst,cond,disp,is_signed,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_branch_disp((inst),(cond),(disp),(is_signed)); } while (0)
766 #define amd64_set_reg_size(inst,cond,reg,is_signed,size) do { amd64_emit_rex((inst),1,0,0,(reg)); x86_set_reg((inst),(cond),((reg)&0x7),(is_signed)); } while (0)
767 #define amd64_set_mem_size(inst,cond,mem,is_signed,size) do { x86_set_mem((inst),(cond),(mem),(is_signed)); } while (0)
768 #define amd64_set_membase_size(inst,cond,basereg,disp,is_signed,size) do { amd64_emit_rex ((inst),0,0,0,(basereg)); x86_set_membase((inst),(cond),((basereg)&0x7),(disp),(is_signed)); } while (0)
769 #define amd64_call_imm_size(inst,disp,size) do { x86_call_imm((inst),(disp)); } while (0)
770 //#define amd64_call_reg_size(inst,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_call_reg((inst),((reg)&0x7)); } while (0)
771 #define amd64_call_mem_size(inst,mem,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_call_mem((inst),(mem)); } while (0)
772 #define amd64_call_code_size(inst,target,size) do { x86_call_code((inst),(target)); } while (0)
773 //#define amd64_ret_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_ret(inst); } while (0)
774 #define amd64_ret_imm_size(inst,imm,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_ret_imm((inst),(imm)); } while (0)
775 #define amd64_cmov_reg_size(inst,cond,is_signed,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_cmov_reg((inst),(cond),(is_signed),((dreg)&0x7),((reg)&0x7)); } while (0)
776 #define amd64_cmov_mem_size(inst,cond,is_signed,reg,mem,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_cmov_mem((inst),(cond),(is_signed),((reg)&0x7),(mem)); } while (0)
777 #define amd64_cmov_membase_size(inst,cond,is_signed,reg,basereg,disp,size) do { amd64_emit_rex ((inst),(size),0,0,(basereg)); x86_cmov_membase((inst),(cond),(is_signed),((reg)&0x7),((basereg)&0x7),(disp)); } while (0)
778 #define amd64_enter_size(inst,framesize) do { amd64_emit_rex ((inst),(size),0,0,0); x86_enter((inst),(framesize)); } while (0)
779 //#define amd64_leave_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_leave(inst); } while (0)
780 #define amd64_sahf_size(inst,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_sahf(inst); } while (0)
781 #define amd64_fsin_size(inst,size) do { x86_fsin(inst); } while (0)
782 #define amd64_fcos_size(inst,size) do { x86_fcos(inst); } while (0)
783 #define amd64_fabs_size(inst,size) do { x86_fabs(inst); } while (0)
784 #define amd64_ftst_size(inst,size) do { x86_ftst(inst); } while (0)
785 #define amd64_fxam_size(inst,size) do { x86_fxam(inst); } while (0)
786 #define amd64_fpatan_size(inst,size) do { x86_fpatan(inst); } while (0)
787 #define amd64_fprem_size(inst,size) do { x86_fprem(inst); } while (0)
788 #define amd64_fprem1_size(inst,size) do { x86_fprem1(inst); } while (0)
789 #define amd64_frndint_size(inst,size) do { x86_frndint(inst); } while (0)
790 #define amd64_fsqrt_size(inst,size) do { x86_fsqrt(inst); } while (0)
791 #define amd64_fptan_size(inst,size) do { x86_fptan(inst); } while (0)
792 //#define amd64_padding_size(inst,size) do { x86_padding((inst),(size)); } while (0)
793 #define amd64_prolog_size(inst,frame_size,reg_mask,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_prolog((inst),(frame_size),(reg_mask)); } while (0)
794 #define amd64_epilog_size(inst,reg_mask,size) do { amd64_emit_rex ((inst),(size),0,0,0); x86_epilog((inst),(reg_mask)); } while (0)
795 #define amd64_xadd_reg_reg_size(inst,dreg,reg,size) do { amd64_emit_rex ((inst),(size),(dreg),0,(reg)); x86_xadd_reg_reg ((inst), (dreg), (reg), (size)); } while (0)
796 #define amd64_xadd_mem_reg_size(inst,mem,reg,size) do { amd64_emit_rex ((inst),(size),0,0,(reg)); x86_xadd_mem_reg((inst),(mem),((reg)&0x7), (size)); } while (0)
797 #define amd64_xadd_membase_reg_size(inst,basereg,disp,reg,size) do { amd64_emit_rex ((inst),(size),(reg),0,(basereg)); x86_xadd_membase_reg((inst),((basereg)&0x7),(disp),((reg)&0x7),(size)); } while (0)
798
799
800
801
802 #define amd64_breakpoint(inst) amd64_breakpoint_size(inst,8)
803 #define amd64_cld(inst) amd64_cld_size(inst,8)
804 #define amd64_stosb(inst) amd64_stosb_size(inst,8)
805 #define amd64_stosl(inst) amd64_stosl_size(inst,8)
806 #define amd64_stosd(inst) amd64_stosd_size(inst,8)
807 #define amd64_movsb(inst) amd64_movsb_size(inst,8)
808 #define amd64_movsl(inst) amd64_movsl_size(inst,8)
809 #define amd64_movsd(inst) amd64_movsd_size(inst,8)
810 #define amd64_prefix(inst,p) amd64_prefix_size(inst,p,8)
811 #define amd64_rdtsc(inst) amd64_rdtsc_size(inst,8)
812 #define amd64_cmpxchg_reg_reg(inst,dreg,reg) amd64_cmpxchg_reg_reg_size(inst,dreg,reg,8)
813 #define amd64_cmpxchg_mem_reg(inst,mem,reg) amd64_cmpxchg_mem_reg_size(inst,mem,reg,8)
814 #define amd64_cmpxchg_membase_reg(inst,basereg,disp,reg) amd64_cmpxchg_membase_reg_size(inst,basereg,disp,reg,8)
815 #define amd64_xchg_reg_reg(inst,dreg,reg,size) amd64_xchg_reg_reg_size(inst,dreg,reg,size)
816 #define amd64_xchg_mem_reg(inst,mem,reg,size) amd64_xchg_mem_reg_size(inst,mem,reg,size)
817 #define amd64_xchg_membase_reg(inst,basereg,disp,reg,size) amd64_xchg_membase_reg_size(inst,basereg,disp,reg,size)
818 #define amd64_xadd_reg_reg(inst,dreg,reg,size) amd64_xadd_reg_reg_size(inst,dreg,reg,size)
819 #define amd64_xadd_mem_reg(inst,mem,reg,size) amd64_xadd_mem_reg_size(inst,mem,reg,size)
820 #define amd64_xadd_membase_reg(inst,basereg,disp,reg,size) amd64_xadd_membase_reg_size(inst,basereg,disp,reg,size)
821 #define amd64_inc_mem(inst,mem) amd64_inc_mem_size(inst,mem,8)
822 #define amd64_inc_membase(inst,basereg,disp) amd64_inc_membase_size(inst,basereg,disp,8)
823 #define amd64_inc_reg(inst,reg) amd64_inc_reg_size(inst,reg,8)
824 #define amd64_dec_mem(inst,mem) amd64_dec_mem_size(inst,mem,8)
825 #define amd64_dec_membase(inst,basereg,disp) amd64_dec_membase_size(inst,basereg,disp,8)
826 #define amd64_dec_reg(inst,reg) amd64_dec_reg_size(inst,reg,8)
827 #define amd64_not_mem(inst,mem) amd64_not_mem_size(inst,mem,8)
828 #define amd64_not_membase(inst,basereg,disp) amd64_not_membase_size(inst,basereg,disp,8)
829 #define amd64_not_reg(inst,reg) amd64_not_reg_size(inst,reg,8)
830 #define amd64_neg_mem(inst,mem) amd64_neg_mem_size(inst,mem,8)
831 #define amd64_neg_membase(inst,basereg,disp) amd64_neg_membase_size(inst,basereg,disp,8)
832 #define amd64_neg_reg(inst,reg) amd64_neg_reg_size(inst,reg,8)
833 #define amd64_nop(inst) amd64_nop_size(inst,8)
834 //#define amd64_alu_reg_imm(inst,opc,reg,imm) amd64_alu_reg_imm_size(inst,opc,reg,imm,8)
835 #define amd64_alu_mem_imm(inst,opc,mem,imm) amd64_alu_mem_imm_size(inst,opc,mem,imm,8)
836 #define amd64_alu_membase_imm(inst,opc,basereg,disp,imm) amd64_alu_membase_imm_size(inst,opc,basereg,disp,imm,8)
837 #define amd64_alu_mem_reg(inst,opc,mem,reg) amd64_alu_mem_reg_size(inst,opc,mem,reg,8)
838 #define amd64_alu_membase_reg(inst,opc,basereg,disp,reg) amd64_alu_membase_reg_size(inst,opc,basereg,disp,reg,8)
839 //#define amd64_alu_reg_reg(inst,opc,dreg,reg) amd64_alu_reg_reg_size(inst,opc,dreg,reg,8)
840 #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)
841 #define amd64_alu_reg_mem(inst,opc,reg,mem) amd64_alu_reg_mem_size(inst,opc,reg,mem,8)
842 #define amd64_alu_reg_membase(inst,opc,reg,basereg,disp) amd64_alu_reg_membase_size(inst,opc,reg,basereg,disp,8)
843 #define amd64_test_reg_imm(inst,reg,imm) amd64_test_reg_imm_size(inst,reg,imm,8)
844 #define amd64_test_mem_imm(inst,mem,imm) amd64_test_mem_imm_size(inst,mem,imm,8)
845 #define amd64_test_membase_imm(inst,basereg,disp,imm) amd64_test_membase_imm_size(inst,basereg,disp,imm,8)
846 #define amd64_test_reg_reg(inst,dreg,reg) amd64_test_reg_reg_size(inst,dreg,reg,8)
847 #define amd64_test_mem_reg(inst,mem,reg) amd64_test_mem_reg_size(inst,mem,reg,8)
848 #define amd64_test_membase_reg(inst,basereg,disp,reg) amd64_test_membase_reg_size(inst,basereg,disp,reg,8)
849 #define amd64_shift_reg_imm(inst,opc,reg,imm) amd64_shift_reg_imm_size(inst,opc,reg,imm,8)
850 #define amd64_shift_mem_imm(inst,opc,mem,imm) amd64_shift_mem_imm_size(inst,opc,mem,imm,8)
851 #define amd64_shift_membase_imm(inst,opc,basereg,disp,imm) amd64_shift_membase_imm_size(inst,opc,basereg,disp,imm,8)
852 #define amd64_shift_reg(inst,opc,reg) amd64_shift_reg_size(inst,opc,reg,8)
853 #define amd64_shift_mem(inst,opc,mem) amd64_shift_mem_size(inst,opc,mem,8)
854 #define amd64_shift_membase(inst,opc,basereg,disp) amd64_shift_membase_size(inst,opc,basereg,disp,8)
855 #define amd64_shrd_reg(inst,dreg,reg) amd64_shrd_reg_size(inst,dreg,reg,8)
856 #define amd64_shrd_reg_imm(inst,dreg,reg,shamt) amd64_shrd_reg_imm_size(inst,dreg,reg,shamt,8)
857 #define amd64_shld_reg(inst,dreg,reg) amd64_shld_reg_size(inst,dreg,reg,8)
858 #define amd64_shld_reg_imm(inst,dreg,reg,shamt) amd64_shld_reg_imm_size(inst,dreg,reg,shamt,8)
859 #define amd64_mul_reg(inst,reg,is_signed) amd64_mul_reg_size(inst,reg,is_signed,8)
860 #define amd64_mul_mem(inst,mem,is_signed) amd64_mul_mem_size(inst,mem,is_signed,8)
861 #define amd64_mul_membase(inst,basereg,disp,is_signed) amd64_mul_membase_size(inst,basereg,disp,is_signed,8)
862 #define amd64_imul_reg_reg(inst,dreg,reg) amd64_imul_reg_reg_size(inst,dreg,reg,8)
863 #define amd64_imul_reg_mem(inst,reg,mem) amd64_imul_reg_mem_size(inst,reg,mem,8)
864 #define amd64_imul_reg_membase(inst,reg,basereg,disp) amd64_imul_reg_membase_size(inst,reg,basereg,disp,8)
865 #define amd64_imul_reg_reg_imm(inst,dreg,reg,imm) amd64_imul_reg_reg_imm_size(inst,dreg,reg,imm,8)
866 #define amd64_imul_reg_mem_imm(inst,reg,mem,imm) amd64_imul_reg_mem_imm_size(inst,reg,mem,imm,8)
867 #define amd64_imul_reg_membase_imm(inst,reg,basereg,disp,imm) amd64_imul_reg_membase_imm_size(inst,reg,basereg,disp,imm,8)
868 #define amd64_div_reg(inst,reg,is_signed) amd64_div_reg_size(inst,reg,is_signed,8)
869 #define amd64_div_mem(inst,mem,is_signed) amd64_div_mem_size(inst,mem,is_signed,8)
870 #define amd64_div_membase(inst,basereg,disp,is_signed) amd64_div_membase_size(inst,basereg,disp,is_signed,8)
871 //#define amd64_mov_mem_reg(inst,mem,reg,size) amd64_mov_mem_reg_size(inst,mem,reg,size)
872 //#define amd64_mov_regp_reg(inst,regp,reg,size) amd64_mov_regp_reg_size(inst,regp,reg,size)
873 //#define amd64_mov_membase_reg(inst,basereg,disp,reg,size) amd64_mov_membase_reg_size(inst,basereg,disp,reg,size)
874 #define amd64_mov_memindex_reg(inst,basereg,disp,indexreg,shift,reg,size) amd64_mov_memindex_reg_size(inst,basereg,disp,indexreg,shift,reg,size)
875 //#define amd64_mov_reg_reg(inst,dreg,reg,size) amd64_mov_reg_reg_size(inst,dreg,reg,size)
876 //#define amd64_mov_reg_mem(inst,reg,mem,size) amd64_mov_reg_mem_size(inst,reg,mem,size)
877 //#define amd64_mov_reg_membase(inst,reg,basereg,disp,size) amd64_mov_reg_membase_size(inst,reg,basereg,disp,size)
878 #define amd64_mov_reg_memindex(inst,reg,basereg,disp,indexreg,shift,size) amd64_mov_reg_memindex_size(inst,reg,basereg,disp,indexreg,shift,size)
879 #define amd64_clear_reg(inst,reg) amd64_clear_reg_size(inst,reg,8)
880 //#define amd64_mov_reg_imm(inst,reg,imm) amd64_mov_reg_imm_size(inst,reg,imm,8)
881 #define amd64_mov_mem_imm(inst,mem,imm,size) amd64_mov_mem_imm_size(inst,mem,imm,size)
882 //#define amd64_mov_membase_imm(inst,basereg,disp,imm,size) amd64_mov_membase_imm_size(inst,basereg,disp,imm,size)
883 #define amd64_mov_memindex_imm(inst,basereg,disp,indexreg,shift,imm,size) amd64_mov_memindex_imm_size(inst,basereg,disp,indexreg,shift,imm,size)
884 #define amd64_lea_mem(inst,reg,mem) amd64_lea_mem_size(inst,reg,mem,8)
885 //#define amd64_lea_membase(inst,reg,basereg,disp) amd64_lea_membase_size(inst,reg,basereg,disp,8)
886 #define amd64_lea_memindex(inst,reg,basereg,disp,indexreg,shift) amd64_lea_memindex_size(inst,reg,basereg,disp,indexreg,shift,8)
887 #define amd64_widen_reg(inst,dreg,reg,is_signed,is_half) amd64_widen_reg_size(inst,dreg,reg,is_signed,is_half,8)
888 #define amd64_widen_mem(inst,dreg,mem,is_signed,is_half) amd64_widen_mem_size(inst,dreg,mem,is_signed,is_half,8)
889 #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)
890 #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)
891 #define amd64_cdq(inst) amd64_cdq_size(inst,8)
892 #define amd64_wait(inst) amd64_wait_size(inst,8)
893 #define amd64_fp_op_mem(inst,opc,mem,is_double) amd64_fp_op_mem_size(inst,opc,mem,is_double,8)
894 #define amd64_fp_op_membase(inst,opc,basereg,disp,is_double) amd64_fp_op_membase_size(inst,opc,basereg,disp,is_double,8)
895 #define amd64_fp_op(inst,opc,index) amd64_fp_op_size(inst,opc,index,8)
896 #define amd64_fp_op_reg(inst,opc,index,pop_stack) amd64_fp_op_reg_size(inst,opc,index,pop_stack,8)
897 #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)
898 #define amd64_fstp(inst,index) amd64_fstp_size(inst,index,8)
899 #define amd64_fcompp(inst) amd64_fcompp_size(inst,8)
900 #define amd64_fucompp(inst) amd64_fucompp_size(inst,8)
901 #define amd64_fnstsw(inst) amd64_fnstsw_size(inst,8)
902 #define amd64_fnstcw(inst,mem) amd64_fnstcw_size(inst,mem,8)
903 #define amd64_fnstcw_membase(inst,basereg,disp) amd64_fnstcw_membase_size(inst,basereg,disp,8)
904 #define amd64_fldcw(inst,mem) amd64_fldcw_size(inst,mem,8)
905 #define amd64_fldcw_membase(inst,basereg,disp) amd64_fldcw_membase_size(inst,basereg,disp,8)
906 #define amd64_fchs(inst) amd64_fchs_size(inst,8)
907 #define amd64_frem(inst) amd64_frem_size(inst,8)
908 #define amd64_fxch(inst,index) amd64_fxch_size(inst,index,8)
909 #define amd64_fcomi(inst,index) amd64_fcomi_size(inst,index,8)
910 #define amd64_fcomip(inst,index) amd64_fcomip_size(inst,index,8)
911 #define amd64_fucomi(inst,index) amd64_fucomi_size(inst,index,8)
912 #define amd64_fucomip(inst,index) amd64_fucomip_size(inst,index,8)
913 #define amd64_fld(inst,mem,is_double) amd64_fld_size(inst,mem,is_double,8)
914 #define amd64_fld_membase(inst,basereg,disp,is_double)  amd64_fld_membase_size(inst,basereg,disp,is_double,8) 
915 #define amd64_fld80_mem(inst,mem) amd64_fld80_mem_size(inst,mem,8)
916 #define amd64_fld80_membase(inst,basereg,disp) amd64_fld80_membase_size(inst,basereg,disp,8)
917 #define amd64_fild(inst,mem,is_long) amd64_fild_size(inst,mem,is_long,8)
918 #define amd64_fild_membase(inst,basereg,disp,is_long) amd64_fild_membase_size(inst,basereg,disp,is_long,8)
919 #define amd64_fld_reg(inst,index) amd64_fld_reg_size(inst,index,8)
920 #define amd64_fldz(inst) amd64_fldz_size(inst,8)
921 #define amd64_fld1(inst) amd64_fld1_size(inst,8)
922 #define amd64_fldpi(inst) amd64_fldpi_size(inst,8)
923 #define amd64_fst(inst,mem,is_double,pop_stack) amd64_fst_size(inst,mem,is_double,pop_stack,8)
924 #define amd64_fst_membase(inst,basereg,disp,is_double,pop_stack) amd64_fst_membase_size(inst,basereg,disp,is_double,pop_stack,8)
925 #define amd64_fst80_mem(inst,mem) amd64_fst80_mem_size(inst,mem,8)
926 #define amd64_fst80_membase(inst,basereg,disp) amd64_fst80_membase_size(inst,basereg,disp,8)
927 #define amd64_fist_pop(inst,mem,is_long) amd64_fist_pop_size(inst,mem,is_long,8)
928 #define amd64_fist_pop_membase(inst,basereg,disp,is_long) amd64_fist_pop_membase_size(inst,basereg,disp,is_long,8)
929 #define amd64_fstsw(inst) amd64_fstsw_size(inst,8)
930 #define amd64_fist_membase(inst,basereg,disp,is_int) amd64_fist_membase_size(inst,basereg,disp,is_int,8)
931 //#define amd64_push_reg(inst,reg) amd64_push_reg_size(inst,reg,8)
932 #define amd64_push_regp(inst,reg) amd64_push_regp_size(inst,reg,8)
933 #define amd64_push_mem(inst,mem) amd64_push_mem_size(inst,mem,8)
934 //#define amd64_push_membase(inst,basereg,disp) amd64_push_membase_size(inst,basereg,disp,8)
935 #define amd64_push_memindex(inst,basereg,disp,indexreg,shift) amd64_push_memindex_size(inst,basereg,disp,indexreg,shift,8)
936 #define amd64_push_imm(inst,imm) amd64_push_imm_size(inst,imm,8)
937 //#define amd64_pop_reg(inst,reg) amd64_pop_reg_size(inst,reg,8)
938 #define amd64_pop_mem(inst,mem) amd64_pop_mem_size(inst,mem,8)
939 #define amd64_pop_membase(inst,basereg,disp) amd64_pop_membase_size(inst,basereg,disp,8)
940 #define amd64_pushad(inst) amd64_pushad_size(inst,8)
941 #define amd64_pushfd(inst) amd64_pushfd_size(inst,8)
942 #define amd64_popad(inst) amd64_popad_size(inst,8)
943 #define amd64_popfd(inst) amd64_popfd_size(inst,8)
944 #define amd64_loop(inst,imm) amd64_loop_size(inst,imm,8)
945 #define amd64_loope(inst,imm) amd64_loope_size(inst,imm,8)
946 #define amd64_loopne(inst,imm) amd64_loopne_size(inst,imm,8)
947 #define amd64_jump32(inst,imm) amd64_jump32_size(inst,imm,8)
948 #define amd64_jump8(inst,imm) amd64_jump8_size(inst,imm,8)
949 #define amd64_jump_reg(inst,reg) amd64_jump_reg_size(inst,reg,8)
950 #define amd64_jump_mem(inst,mem) amd64_jump_mem_size(inst,mem,8)
951 #define amd64_jump_membase(inst,basereg,disp) amd64_jump_membase_size(inst,basereg,disp,8)
952 #define amd64_jump_code(inst,target) amd64_jump_code_size(inst,target,8)
953 #define amd64_jump_disp(inst,disp) amd64_jump_disp_size(inst,disp,8)
954 #define amd64_branch8(inst,cond,imm,is_signed) amd64_branch8_size(inst,cond,imm,is_signed,8)
955 #define amd64_branch32(inst,cond,imm,is_signed) amd64_branch32_size(inst,cond,imm,is_signed,8)
956 #define amd64_branch(inst,cond,target,is_signed) amd64_branch_size(inst,cond,target,is_signed,8)
957 #define amd64_branch_disp(inst,cond,disp,is_signed) amd64_branch_disp_size(inst,cond,disp,is_signed,8)
958 #define amd64_set_reg(inst,cond,reg,is_signed) amd64_set_reg_size(inst,cond,reg,is_signed,8)
959 #define amd64_set_mem(inst,cond,mem,is_signed) amd64_set_mem_size(inst,cond,mem,is_signed,8)
960 #define amd64_set_membase(inst,cond,basereg,disp,is_signed) amd64_set_membase_size(inst,cond,basereg,disp,is_signed,8)
961 #define amd64_call_imm(inst,disp) amd64_call_imm_size(inst,disp,8)
962 //#define amd64_call_reg(inst,reg) amd64_call_reg_size(inst,reg,8)
963 #define amd64_call_mem(inst,mem) amd64_call_mem_size(inst,mem,8)
964 #define amd64_call_membase(inst,basereg,disp) amd64_call_membase_size(inst,basereg,disp,8)
965 #define amd64_call_code(inst,target) amd64_call_code_size(inst,target,8)
966 //#define amd64_ret(inst) amd64_ret_size(inst,8)
967 #define amd64_ret_imm(inst,imm) amd64_ret_imm_size(inst,imm,8)
968 #define amd64_cmov_reg(inst,cond,is_signed,dreg,reg) amd64_cmov_reg_size(inst,cond,is_signed,dreg,reg,8)
969 #define amd64_cmov_mem(inst,cond,is_signed,reg,mem) amd64_cmov_mem_size(inst,cond,is_signed,reg,mem,8)
970 #define amd64_cmov_membase(inst,cond,is_signed,reg,basereg,disp) amd64_cmov_membase_size(inst,cond,is_signed,reg,basereg,disp,8)
971 #define amd64_enter(inst,framesize) amd64_enter_size(inst,framesize)
972 //#define amd64_leave(inst) amd64_leave_size(inst,8)
973 #define amd64_sahf(inst) amd64_sahf_size(inst,8)
974 #define amd64_fsin(inst) amd64_fsin_size(inst,8)
975 #define amd64_fcos(inst) amd64_fcos_size(inst,8)
976 #define amd64_fabs(inst) amd64_fabs_size(inst,8)
977 #define amd64_ftst(inst) amd64_ftst_size(inst,8)
978 #define amd64_fxam(inst) amd64_fxam_size(inst,8)
979 #define amd64_fpatan(inst) amd64_fpatan_size(inst,8)
980 #define amd64_fprem(inst) amd64_fprem_size(inst,8)
981 #define amd64_fprem1(inst) amd64_fprem1_size(inst,8)
982 #define amd64_frndint(inst) amd64_frndint_size(inst,8)
983 #define amd64_fsqrt(inst) amd64_fsqrt_size(inst,8)
984 #define amd64_fptan(inst) amd64_fptan_size(inst,8)
985 #define amd64_padding(inst,size) amd64_padding_size(inst,size)
986 #define amd64_prolog(inst,frame,reg_mask) amd64_prolog_size(inst,frame,reg_mask,8)
987 #define amd64_epilog(inst,reg_mask) amd64_epilog_size(inst,reg_mask,8)
988
989 #endif // AMD64_H