ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/compiler/codegen_x86.h
Revision: 1.14
Committed: 2004-10-31T16:02:04Z (20 years, 1 month ago) by gbeauche
Content type: text/plain
Branch: MAIN
Changes since 1.13: +9 -7 lines
Log Message:
Reorder SPL, BPL, SIL, DIL IDs so that 8-bit register allocation is simpler
Fix MOVZBL and MOVSBL encodings with those extended 8-bit registers

File Contents

# User Rev Content
1 gbeauche 1.2 /******************** -*- mode: C; tab-width: 8 -*- ********************
2 gbeauche 1.1 *
3 gbeauche 1.11 * Run-time assembler for IA-32 and AMD64
4 gbeauche 1.1 *
5     ***********************************************************************/
6    
7    
8     /***********************************************************************
9     *
10 gbeauche 1.11 * This file is derived from CCG.
11 gbeauche 1.1 *
12     * Copyright 1999, 2000, 2001, 2002, 2003 Ian Piumarta
13     *
14 gbeauche 1.11 * Adaptations and enhancements for AMD64 support, Copyright 2003
15 gbeauche 1.1 * Gwenole Beauchesne
16     *
17 cebix 1.12 * Basilisk II (C) 1997-2004 Christian Bauer
18 gbeauche 1.1 *
19     * This program is free software; you can redistribute it and/or modify
20     * it under the terms of the GNU General Public License as published by
21     * the Free Software Foundation; either version 2 of the License, or
22     * (at your option) any later version.
23     *
24     * This program is distributed in the hope that it will be useful,
25     * but WITHOUT ANY WARRANTY; without even the implied warranty of
26     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27     * GNU General Public License for more details.
28     *
29     * You should have received a copy of the GNU General Public License
30     * along with this program; if not, write to the Free Software
31     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32     *
33     ***********************************************************************/
34    
35     #ifndef X86_RTASM_H
36     #define X86_RTASM_H
37    
38     /* NOTES
39     *
40     * o Best viewed on a 1024x768 screen with fixed-6x10 font ;-)
41     *
42     * TODO
43     *
44     * o Fix FIXMEs
45     * o i387 FPU instructions
46     * o SSE instructions
47     * o Optimize for cases where register numbers are not integral constants
48     */
49    
50     /* --- Configuration ------------------------------------------------------- */
51    
52     /* Define to settle a "flat" register set, i.e. different regno for
53     each size variant. */
54     #ifndef X86_FLAT_REGISTERS
55     #define X86_FLAT_REGISTERS 1
56     #endif
57    
58     /* Define to generate x86-64 code. */
59     #ifndef X86_TARGET_64BIT
60     #define X86_TARGET_64BIT 0
61     #endif
62    
63     /* Define to optimize ALU instructions. */
64     #ifndef X86_OPTIMIZE_ALU
65     #define X86_OPTIMIZE_ALU 1
66     #endif
67    
68     /* Define to optimize rotate/shift instructions. */
69     #ifndef X86_OPTIMIZE_ROTSHI
70     #define X86_OPTIMIZE_ROTSHI 1
71     #endif
72    
73    
74     /* --- Macros -------------------------------------------------------------- */
75    
76     /* Functions used to emit code.
77     *
78     * x86_emit_byte(B)
79     * x86_emit_word(W)
80     * x86_emit_long(L)
81     */
82    
83     /* Get pointer to current code
84     *
85     * x86_get_target()
86     */
87    
88     /* Abort assembler, fatal failure.
89     *
90     * x86_emit_failure(MSG)
91     */
92    
93 gbeauche 1.6 #define x86_emit_failure0(MSG) (x86_emit_failure(MSG),0)
94    
95 gbeauche 1.1
96     /* --- Register set -------------------------------------------------------- */
97    
98 gbeauche 1.2 enum {
99 gbeauche 1.4 X86_RIP = -2,
100 gbeauche 1.1 #if X86_FLAT_REGISTERS
101 gbeauche 1.3 X86_NOREG = 0,
102     X86_Reg8L_Base = 0x10,
103     X86_Reg8H_Base = 0x20,
104     X86_Reg16_Base = 0x30,
105     X86_Reg32_Base = 0x40,
106     X86_Reg64_Base = 0x50,
107     X86_RegMMX_Base = 0x60,
108     X86_RegXMM_Base = 0x70,
109 gbeauche 1.1 #else
110 gbeauche 1.3 X86_NOREG = -1,
111     X86_Reg8L_Base = 0,
112     X86_Reg8H_Base = 16,
113     X86_Reg16_Base = 0,
114     X86_Reg32_Base = 0,
115     X86_Reg64_Base = 0,
116     X86_RegMMX_Base = 0,
117     X86_RegXMM_Base = 0,
118 gbeauche 1.1 #endif
119 gbeauche 1.2 };
120 gbeauche 1.1
121 gbeauche 1.2 enum {
122 gbeauche 1.1 X86_AL = X86_Reg8L_Base,
123     X86_CL, X86_DL, X86_BL,
124 gbeauche 1.14 X86_SPL, X86_BPL, X86_SIL, X86_DIL,
125 gbeauche 1.1 X86_R8B, X86_R9B, X86_R10B, X86_R11B,
126     X86_R12B, X86_R13B, X86_R14B, X86_R15B,
127 gbeauche 1.14 X86_AH = X86_Reg8H_Base + 4,
128     X86_CH, X86_DH, X86_BH
129 gbeauche 1.2 };
130 gbeauche 1.1
131 gbeauche 1.2 enum {
132 gbeauche 1.1 X86_AX = X86_Reg16_Base,
133     X86_CX, X86_DX, X86_BX,
134     X86_SP, X86_BP, X86_SI, X86_DI,
135     X86_R8W, X86_R9W, X86_R10W, X86_R11W,
136     X86_R12W, X86_R13W, X86_R14W, X86_R15W
137 gbeauche 1.2 };
138 gbeauche 1.1
139 gbeauche 1.2 enum {
140 gbeauche 1.1 X86_EAX = X86_Reg32_Base,
141     X86_ECX, X86_EDX, X86_EBX,
142     X86_ESP, X86_EBP, X86_ESI, X86_EDI,
143     X86_R8D, X86_R9D, X86_R10D, X86_R11D,
144     X86_R12D, X86_R13D, X86_R14D, X86_R15D
145 gbeauche 1.2 };
146 gbeauche 1.1
147 gbeauche 1.2 enum {
148 gbeauche 1.1 X86_RAX = X86_Reg64_Base,
149     X86_RCX, X86_RDX, X86_RBX,
150     X86_RSP, X86_RBP, X86_RSI, X86_RDI,
151     X86_R8, X86_R9, X86_R10, X86_R11,
152     X86_R12, X86_R13, X86_R14, X86_R15
153 gbeauche 1.2 };
154 gbeauche 1.1
155 gbeauche 1.3 enum {
156     X86_MM0 = X86_RegMMX_Base,
157     X86_MM1, X86_MM2, X86_MM3,
158     X86_MM4, X86_MM5, X86_MM6, X86_MM7,
159     };
160    
161     enum {
162     X86_XMM0 = X86_RegXMM_Base,
163     X86_XMM1, X86_XMM2, X86_XMM3,
164     X86_XMM4, X86_XMM5, X86_XMM6, X86_XMM7,
165     X86_XMM8, X86_XMM9, X86_XMM10, X86_XMM11,
166     X86_XMM12, X86_XMM13, X86_XMM14, X86_XMM15
167     };
168    
169 gbeauche 1.1 /* Register control and access
170     *
171 gbeauche 1.3 * _r0P(R) Null register?
172 gbeauche 1.4 * _rIP(R) RIP register?
173 gbeauche 1.3 * _rXP(R) Extended register?
174 gbeauche 1.1 *
175 gbeauche 1.3 * _rC(R) Class of register (only valid if X86_FLAT_REGISTERS)
176 gbeauche 1.1 * _rR(R) Full register number
177     * _rN(R) Short register number for encoding
178     *
179     * _r1(R) 8-bit register ID
180     * _r2(R) 16-bit register ID
181     * _r4(R) 32-bit register ID
182     * _r8(R) 64-bit register ID
183 gbeauche 1.3 * _rM(R) MMX register ID
184     * _rX(R) XMM register ID
185     * _rA(R) Address register ID used for EA calculation
186 gbeauche 1.1 */
187    
188 gbeauche 1.6 #define _r0P(R) ((int)(R) == (int)X86_NOREG)
189     #define _rIP(R) ((int)(R) == (int)X86_RIP)
190 gbeauche 1.1
191 gbeauche 1.3 #define _rC(R) ((R) & 0xf0)
192     #define _rR(R) ((R) & 0x0f)
193     #define _rN(R) ((R) & 0x07)
194 gbeauche 1.11 #define _rXP(R) ((R) > 0 && _rR(R) > 7)
195 gbeauche 1.1
196 gbeauche 1.3 #if !defined(_ASM_SAFETY) || ! X86_FLAT_REGISTERS
197 gbeauche 1.1 #define _r1(R) _rN(R)
198     #define _r2(R) _rN(R)
199     #define _r4(R) _rN(R)
200     #define _r8(R) _rN(R)
201 gbeauche 1.3 #define _rA(R) _rN(R)
202     #define _rM(R) _rN(R)
203     #define _rX(R) _rN(R)
204 gbeauche 1.1 #else
205 gbeauche 1.6 #define _r1(R) ( ((_rC(R) & (X86_Reg8L_Base | X86_Reg8H_Base)) != 0) ? _rN(R) : x86_emit_failure0( "8-bit register required"))
206     #define _r2(R) ( (_rC(R) == X86_Reg16_Base) ? _rN(R) : x86_emit_failure0("16-bit register required"))
207     #define _r4(R) ( (_rC(R) == X86_Reg32_Base) ? _rN(R) : x86_emit_failure0("32-bit register required"))
208     #define _r8(R) ( (_rC(R) == X86_Reg64_Base) ? _rN(R) : x86_emit_failure0("64-bit register required"))
209 gbeauche 1.3 #define _rA(R) ( X86_TARGET_64BIT ? \
210 gbeauche 1.6 ( (_rC(R) == X86_Reg64_Base) ? _rN(R) : x86_emit_failure0("not a valid 64-bit base/index expression")) : \
211     ( (_rC(R) == X86_Reg32_Base) ? _rN(R) : x86_emit_failure0("not a valid 32-bit base/index expression")) )
212     #define _rM(R) ( (_rC(R) == X86_RegMMX_Base) ? _rN(R) : x86_emit_failure0("MMX register required"))
213     #define _rX(R) ( (_rC(R) == X86_RegXMM_Base) ? _rN(R) : x86_emit_failure0("SSE register required"))
214 gbeauche 1.1 #endif
215    
216 gbeauche 1.6 #define _rSP() (X86_TARGET_64BIT ? (int)X86_RSP : (int)X86_ESP)
217 gbeauche 1.14 #define _r1e8lP(R) (int(R) >= X86_SPL && int(R) <= X86_DIL)
218 gbeauche 1.3 #define _rbpP(R) (_rR(R) == _rR(X86_RBP))
219     #define _rspP(R) (_rR(R) == _rR(X86_RSP))
220 gbeauche 1.13 #define _rbp13P(R) (_rN(R) == _rN(X86_RBP))
221 gbeauche 1.3 #define _rsp12P(R) (_rN(R) == _rN(X86_RSP))
222 gbeauche 1.1
223    
224     /* ========================================================================= */
225     /* --- UTILITY ------------------------------------------------------------- */
226     /* ========================================================================= */
227    
228 gbeauche 1.10 typedef signed char _sc;
229 gbeauche 1.1 typedef unsigned char _uc;
230 gbeauche 1.10 typedef signed short _ss;
231 gbeauche 1.1 typedef unsigned short _us;
232 gbeauche 1.10 typedef signed int _sl;
233 gbeauche 1.1 typedef unsigned int _ul;
234    
235     #define _UC(X) ((_uc )(X))
236     #define _US(X) ((_us )(X))
237     #define _SL(X) ((_sl )(X))
238     #define _UL(X) ((_ul )(X))
239    
240     # define _PUC(X) ((_uc *)(X))
241     # define _PUS(X) ((_us *)(X))
242     # define _PSL(X) ((_sl *)(X))
243     # define _PUL(X) ((_ul *)(X))
244    
245     #define _B(B) x86_emit_byte((B))
246     #define _W(W) x86_emit_word((W))
247     #define _L(L) x86_emit_long((L))
248    
249     #define _MASK(N) ((unsigned)((1<<(N)))-1)
250     #define _siP(N,I) (!((((unsigned)(I))^(((unsigned)(I))<<1))&~_MASK(N)))
251     #define _uiP(N,I) (!(((unsigned)(I))&~_MASK(N)))
252     #define _suiP(N,I) (_siP(N,I) | _uiP(N,I))
253    
254     #ifndef _ASM_SAFETY
255     #define _ck_s(W,I) (_UL(I) & _MASK(W))
256     #define _ck_u(W,I) (_UL(I) & _MASK(W))
257     #define _ck_su(W,I) (_UL(I) & _MASK(W))
258     #define _ck_d(W,I) (_UL(I) & _MASK(W))
259     #else
260 gbeauche 1.6 #define _ck_s(W,I) (_siP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0( "signed integer `"#I"' too large for "#W"-bit field"))
261     #define _ck_u(W,I) (_uiP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0("unsigned integer `"#I"' too large for "#W"-bit field"))
262     #define _ck_su(W,I) (_suiP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0( "integer `"#I"' too large for "#W"-bit field"))
263     #define _ck_d(W,I) (_siP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0( "displacement `"#I"' too large for "#W"-bit field"))
264 gbeauche 1.1 #endif
265    
266     #define _s0P(I) ((I)==0)
267     #define _s8P(I) _siP(8,I)
268     #define _s16P(I) _siP(16,I)
269     #define _u8P(I) _uiP(8,I)
270     #define _u16P(I) _uiP(16,I)
271    
272     #define _su8(I) _ck_su(8,I)
273     #define _su16(I) _ck_su(16,I)
274    
275     #define _s1(I) _ck_s( 1,I)
276     #define _s2(I) _ck_s( 2,I)
277     #define _s3(I) _ck_s( 3,I)
278     #define _s4(I) _ck_s( 4,I)
279     #define _s5(I) _ck_s( 5,I)
280     #define _s6(I) _ck_s( 6,I)
281     #define _s7(I) _ck_s( 7,I)
282     #define _s8(I) _ck_s( 8,I)
283     #define _s9(I) _ck_s( 9,I)
284     #define _s10(I) _ck_s(10,I)
285     #define _s11(I) _ck_s(11,I)
286     #define _s12(I) _ck_s(12,I)
287     #define _s13(I) _ck_s(13,I)
288     #define _s14(I) _ck_s(14,I)
289     #define _s15(I) _ck_s(15,I)
290     #define _s16(I) _ck_s(16,I)
291     #define _s17(I) _ck_s(17,I)
292     #define _s18(I) _ck_s(18,I)
293     #define _s19(I) _ck_s(19,I)
294     #define _s20(I) _ck_s(20,I)
295     #define _s21(I) _ck_s(21,I)
296     #define _s22(I) _ck_s(22,I)
297     #define _s23(I) _ck_s(23,I)
298     #define _s24(I) _ck_s(24,I)
299     #define _s25(I) _ck_s(25,I)
300     #define _s26(I) _ck_s(26,I)
301     #define _s27(I) _ck_s(27,I)
302     #define _s28(I) _ck_s(28,I)
303     #define _s29(I) _ck_s(29,I)
304     #define _s30(I) _ck_s(30,I)
305     #define _s31(I) _ck_s(31,I)
306     #define _u1(I) _ck_u( 1,I)
307     #define _u2(I) _ck_u( 2,I)
308     #define _u3(I) _ck_u( 3,I)
309     #define _u4(I) _ck_u( 4,I)
310     #define _u5(I) _ck_u( 5,I)
311     #define _u6(I) _ck_u( 6,I)
312     #define _u7(I) _ck_u( 7,I)
313     #define _u8(I) _ck_u( 8,I)
314     #define _u9(I) _ck_u( 9,I)
315     #define _u10(I) _ck_u(10,I)
316     #define _u11(I) _ck_u(11,I)
317     #define _u12(I) _ck_u(12,I)
318     #define _u13(I) _ck_u(13,I)
319     #define _u14(I) _ck_u(14,I)
320     #define _u15(I) _ck_u(15,I)
321     #define _u16(I) _ck_u(16,I)
322     #define _u17(I) _ck_u(17,I)
323     #define _u18(I) _ck_u(18,I)
324     #define _u19(I) _ck_u(19,I)
325     #define _u20(I) _ck_u(20,I)
326     #define _u21(I) _ck_u(21,I)
327     #define _u22(I) _ck_u(22,I)
328     #define _u23(I) _ck_u(23,I)
329     #define _u24(I) _ck_u(24,I)
330     #define _u25(I) _ck_u(25,I)
331     #define _u26(I) _ck_u(26,I)
332     #define _u27(I) _ck_u(27,I)
333     #define _u28(I) _ck_u(28,I)
334     #define _u29(I) _ck_u(29,I)
335     #define _u30(I) _ck_u(30,I)
336     #define _u31(I) _ck_u(31,I)
337    
338     /* ========================================================================= */
339     /* --- ASSEMBLER ----------------------------------------------------------- */
340     /* ========================================================================= */
341    
342     #define _b00 0
343     #define _b01 1
344     #define _b10 2
345     #define _b11 3
346    
347     #define _b000 0
348     #define _b001 1
349     #define _b010 2
350     #define _b011 3
351     #define _b100 4
352     #define _b101 5
353     #define _b110 6
354     #define _b111 7
355    
356     #define _OFF4(D) (_UL(D) - _UL(x86_get_target()))
357     #define _CKD8(D) _ck_d(8, ((_uc) _OFF4(D)) )
358    
359     #define _D8(D) (_B(0), ((*(_PUC(x86_get_target())-1))= _CKD8(D)))
360     #define _D32(D) (_L(0), ((*(_PUL(x86_get_target())-1))= _OFF4(D)))
361    
362     #ifndef _ASM_SAFETY
363     # define _M(M) (M)
364     # define _r(R) (R)
365     # define _m(M) (M)
366     # define _s(S) (S)
367     # define _i(I) (I)
368     # define _b(B) (B)
369     #else
370 gbeauche 1.6 # define _M(M) (((M)>3) ? x86_emit_failure0("internal error: mod = " #M) : (M))
371     # define _r(R) (((R)>7) ? x86_emit_failure0("internal error: reg = " #R) : (R))
372     # define _m(M) (((M)>7) ? x86_emit_failure0("internal error: r/m = " #M) : (M))
373     # define _s(S) (((S)>3) ? x86_emit_failure0("internal error: memory scale = " #S) : (S))
374     # define _i(I) (((I)>7) ? x86_emit_failure0("internal error: memory index = " #I) : (I))
375     # define _b(B) (((B)>7) ? x86_emit_failure0("internal error: memory base = " #B) : (B))
376 gbeauche 1.1 #endif
377    
378     #define _Mrm(Md,R,M) _B((_M(Md)<<6)|(_r(R)<<3)|_m(M))
379     #define _SIB(Sc,I, B) _B((_s(Sc)<<6)|(_i(I)<<3)|_b(B))
380    
381     #define _SCL(S) ((((S)==1) ? _b00 : \
382     (((S)==2) ? _b01 : \
383     (((S)==4) ? _b10 : \
384 gbeauche 1.6 (((S)==8) ? _b11 : x86_emit_failure0("illegal scale: " #S))))))
385 gbeauche 1.1
386    
387     /* --- Memory subformats - urgh! ------------------------------------------- */
388    
389 gbeauche 1.4 /* _r_D() is RIP addressing mode if X86_TARGET_64BIT, use _r_DSIB() instead */
390 gbeauche 1.3 #define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_L((long)(D)))
391 gbeauche 1.4 #define _r_DSIB(R, D ) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(1),_b100 ,_b101 ),_L((long)(D)))
392 gbeauche 1.3 #define _r_0B( R, B ) (_Mrm(_b00,_rN(R),_rA(B)) )
393     #define _r_0BIS(R, B,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)) )
394     #define _r_1B( R, D,B ) (_Mrm(_b01,_rN(R),_rA(B)) ,_B((long)(D)))
395     #define _r_1BIS(R, D,B,I,S) (_Mrm(_b01,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_B((long)(D)))
396     #define _r_4B( R, D,B ) (_Mrm(_b10,_rN(R),_rA(B)) ,_L((long)(D)))
397     #define _r_4IS( R, D,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_b101 ),_L((long)(D)))
398     #define _r_4BIS(R, D,B,I,S) (_Mrm(_b10,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_L((long)(D)))
399    
400 gbeauche 1.13 #define _r_DB( R, D,B ) ((_s0P(D) && (!_rbp13P(B)) ? _r_0B (R, B ) : (_s8P(D) ? _r_1B( R,D,B ) : _r_4B( R,D,B ))))
401     #define _r_DBIS(R, D,B,I,S) ((_s0P(D) && (!_rbp13P(B)) ? _r_0BIS(R, B,I,S) : (_s8P(D) ? _r_1BIS(R,D,B,I,S) : _r_4BIS(R,D,B,I,S))))
402 gbeauche 1.3
403 gbeauche 1.11 /* If we requested absolute 32-bit addressing in AMD64, we have to
404     force the displacement with a SIB byte, otherwise the effective
405     address would be RIP relative */
406     #define _r_X( R, D,B,I,S) (_r0P(I) ? (_r0P(B) ? (!X86_TARGET_64BIT ? _r_D(R,D) : \
407     _r_DSIB(R,D )) : \
408     (_rIP(B) ? _r_D (R,D ) : \
409 gbeauche 1.3 (_rsp12P(B) ? _r_DBIS(R,D,_rSP(),_rSP(),1) : \
410 gbeauche 1.4 _r_DB (R,D, B )))) : \
411 gbeauche 1.3 (_r0P(B) ? _r_4IS (R,D, I,S) : \
412     (!_rspP(I) ? _r_DBIS(R,D, B, I,S) : \
413     x86_emit_failure("illegal index register: %esp"))))
414 gbeauche 1.1
415    
416     /* --- Instruction formats ------------------------------------------------- */
417    
418     #define _m32only(X) (! X86_TARGET_64BIT ? X : x86_emit_failure("invalid instruction in 64-bit mode"))
419     #define _m64only(X) ( X86_TARGET_64BIT ? X : x86_emit_failure("invalid instruction in 32-bit mode"))
420     #define _m64(X) ( X86_TARGET_64BIT ? X : ((void)0) )
421    
422     /* _format Opcd ModR/M dN(rB,rI,Sc) imm... */
423    
424     #define _d16() ( _B(0x66 ) )
425     #define _O( OP ) ( _B( OP ) )
426     #define _Or( OP,R ) ( _B( (OP)|_r(R)) )
427     #define _OO( OP ) ( _B((OP)>>8), _B( (OP) ) )
428     #define _OOr( OP,R ) ( _B((OP)>>8), _B( (OP)|_r(R)) )
429     #define _Os( OP,B ) ( _s8P(B) ? _B(((OP)|_b10)) : _B(OP) )
430     #define _sW( W ) ( _s8P(W) ? _B(W):_W(W) )
431     #define _sL( L ) ( _s8P(L) ? _B(L):_L(L) )
432     #define _O_B( OP ,B ) ( _O ( OP ) ,_B(B) )
433     #define _O_W( OP ,W ) ( _O ( OP ) ,_W(W) )
434     #define _O_L( OP ,L ) ( _O ( OP ) ,_L(L) )
435     #define _O_D8( OP ,D ) ( _O ( OP ) ,_D8(D) )
436     #define _O_D32( OP ,D ) ( _O ( OP ) ,_D32(D) )
437     #define _OO_D32( OP ,D ) ( _OO ( OP ) ,_D32(D) )
438     #define _Os_sW( OP ,W ) ( _Os ( OP,W) ,_sW(W) )
439     #define _Os_sL( OP ,L ) ( _Os ( OP,L) ,_sL(L) )
440     #define _O_W_B( OP ,W,B) ( _O ( OP ) ,_W(W),_B(B))
441     #define _Or_B( OP,R ,B ) ( _Or ( OP,R) ,_B(B) )
442     #define _Or_W( OP,R ,W ) ( _Or ( OP,R) ,_W(W) )
443     #define _Or_L( OP,R ,L ) ( _Or ( OP,R) ,_L(L) )
444     #define _O_Mrm( OP ,MO,R,M ) ( _O ( OP ),_Mrm(MO,R,M ) )
445     #define _OO_Mrm( OP ,MO,R,M ) ( _OO ( OP ),_Mrm(MO,R,M ) )
446     #define _O_Mrm_B( OP ,MO,R,M ,B ) ( _O ( OP ),_Mrm(MO,R,M ) ,_B(B) )
447     #define _O_Mrm_W( OP ,MO,R,M ,W ) ( _O ( OP ),_Mrm(MO,R,M ) ,_W(W) )
448     #define _O_Mrm_L( OP ,MO,R,M ,L ) ( _O ( OP ),_Mrm(MO,R,M ) ,_L(L) )
449     #define _OO_Mrm_B( OP ,MO,R,M ,B ) ( _OO ( OP ),_Mrm(MO,R,M ) ,_B(B) )
450     #define _Os_Mrm_sW(OP ,MO,R,M ,W ) ( _Os ( OP,W),_Mrm(MO,R,M ),_sW(W) )
451     #define _Os_Mrm_sL(OP ,MO,R,M ,L ) ( _Os ( OP,L),_Mrm(MO,R,M ),_sL(L) )
452     #define _O_r_X( OP ,R ,MD,MB,MI,MS ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) )
453     #define _OO_r_X( OP ,R ,MD,MB,MI,MS ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS) )
454     #define _O_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_B(B) )
455     #define _O_r_X_W( OP ,R ,MD,MB,MI,MS,W ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_W(W) )
456     #define _O_r_X_L( OP ,R ,MD,MB,MI,MS,L ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_L(L) )
457     #define _OO_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS) ,_B(B) )
458     #define _Os_r_X_sW(OP ,R ,MD,MB,MI,MS,W ) ( _Os ( OP,W),_r_X( R ,MD,MB,MI,MS),_sW(W) )
459     #define _Os_r_X_sL(OP ,R ,MD,MB,MI,MS,L ) ( _Os ( OP,L),_r_X( R ,MD,MB,MI,MS),_sL(L) )
460     #define _O_X_B( OP ,MD,MB,MI,MS,B ) ( _O_r_X_B( OP ,0 ,MD,MB,MI,MS ,B) )
461     #define _O_X_W( OP ,MD,MB,MI,MS,W ) ( _O_r_X_W( OP ,0 ,MD,MB,MI,MS ,W) )
462     #define _O_X_L( OP ,MD,MB,MI,MS,L ) ( _O_r_X_L( OP ,0 ,MD,MB,MI,MS ,L) )
463    
464    
465     /* --- REX prefixes -------------------------------------------------------- */
466    
467     #define _VOID() ((void)0)
468     #define _BIT(X) (!!(X))
469     #define _d64(W,R,X,B) (_B(0x40|(W)<<3|(R)<<2|(X)<<1|(B)))
470    
471     #define __REXwrxb(L,W,R,X,B) ((W|R|X|B) || (L) ? _d64(W,R,X,B) : _VOID())
472 gbeauche 1.4 #define __REXwrx_(L,W,R,X,MR) (__REXwrxb(L,W,R,X,_BIT(_rIP(MR)?0:_rXP(MR))))
473 gbeauche 1.1 #define __REXw_x_(L,W,R,X,MR) (__REXwrx_(L,W,_BIT(_rXP(R)),X,MR))
474 gbeauche 1.13 #define __REX_reg(RR) (__REXwrxb(0,0,0,00,_BIT(_rXP(RR))))
475     #define __REX_mem(MB,MI) (__REXwrxb(0,0,0,_BIT(_rXP(MI)),MB))
476 gbeauche 1.1
477     // FIXME: can't mix new (SPL,BPL,SIL,DIL) with (AH,BH,CH,DH)
478 gbeauche 1.14 #define _REXBrr(RR,MR) _m64(__REXw_x_(_r1e8lP(RR)||_r1e8lP(MR),0,RR,0,MR))
479     #define _REXBmr(MB,MI,RD) _m64(__REXw_x_(_r1e8lP(RD)||_r1e8lP(MB),0,RD,_BIT(_rXP(MI)),MB))
480 gbeauche 1.1 #define _REXBrm(RS,MB,MI) _REXBmr(MB,MI,RS)
481    
482 gbeauche 1.14 #define _REXBLrr(RR,MR) _m64(__REXw_x_(_r1e8lP(MR),0,RR,0,MR))
483 gbeauche 1.1 #define _REXLrr(RR,MR) _m64(__REXw_x_(0,0,RR,0,MR))
484     #define _REXLmr(MB,MI,RD) _m64(__REXw_x_(0,0,RD,_BIT(_rXP(MI)),MB))
485     #define _REXLrm(RS,MB,MI) _REXLmr(MB,MI,RS)
486 gbeauche 1.13 #define _REXLr(RR) _m64(__REX_reg(RR))
487     #define _REXLm(MB,MI) _m64(__REX_mem(MB,MI))
488 gbeauche 1.1
489     #define _REXQrr(RR,MR) _m64only(__REXw_x_(0,1,RR,0,MR))
490     #define _REXQmr(MB,MI,RD) _m64only(__REXw_x_(0,1,RD,_BIT(_rXP(MI)),MB))
491     #define _REXQrm(RS,MB,MI) _REXQmr(MB,MI,RS)
492 gbeauche 1.13 #define _REXQr(RR) _m64only(__REX_reg(RR))
493     #define _REXQm(MB,MI) _m64only(__REX_mem(MB,MI))
494 gbeauche 1.1
495    
496     /* ========================================================================= */
497     /* --- Fully-qualified intrinsic instructions ------------------------------ */
498     /* ========================================================================= */
499    
500     /* OPCODE + i = immediate operand
501     * + r = register operand
502     * + m = memory operand (disp,base,index,scale)
503     * + sr/sm = a star preceding a register or memory
504 gbeauche 1.2 * + 0 = top of stack register (for FPU instructions)
505 gbeauche 1.4 *
506     * NOTE in x86-64 mode: a memory operand with only a valid
507     * displacement value will lead to the expect absolute mode. If
508     * RIP addressing is necessary, X86_RIP shall be used as the base
509     * register argument.
510 gbeauche 1.1 */
511    
512     /* --- ALU instructions ---------------------------------------------------- */
513    
514 gbeauche 1.2 enum {
515 gbeauche 1.1 X86_ADD = 0,
516     X86_OR = 1,
517     X86_ADC = 2,
518     X86_SBB = 3,
519     X86_AND = 4,
520     X86_SUB = 5,
521     X86_XOR = 6,
522     X86_CMP = 7,
523 gbeauche 1.2 };
524 gbeauche 1.1
525     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
526    
527     #define _ALUBrr(OP,RS, RD) (_REXBrr(RS, RD), _O_Mrm (((OP) << 3) ,_b11,_r1(RS),_r1(RD) ))
528     #define _ALUBmr(OP, MD, MB, MI, MS, RD) (_REXBmr(MB, MI, RD), _O_r_X (((OP) << 3) + 2,_r1(RD) ,MD,MB,MI,MS ))
529     #define _ALUBrm(OP, RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (((OP) << 3) , ,_r1(RS) ,MD,MB,MI,MS ))
530     #define _ALUBir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AL) ? \
531     (_REXBrr(0, RD), _O_B (((OP) << 3) + 4 ,_su8(IM))) : \
532     (_REXBrr(0, RD), _O_Mrm_B (0x80 ,_b11,OP ,_r1(RD) ,_su8(IM))) )
533     #define _ALUBim(OP, IM, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X_B (0x80 ,OP ,MD,MB,MI,MS ,_su8(IM)))
534    
535     #define _ALUWrr(OP, RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (((OP) << 3) + 1,_b11,_r2(RS),_r2(RD) ))
536 gbeauche 1.11 #define _ALUWmr(OP, MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _O_r_X (((OP) << 3) + 3 ,_r2(RD) ,MD,MB,MI,MS ))
537     #define _ALUWrm(OP, RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (((OP) << 3) + 1 ,_r2(RS) ,MD,MB,MI,MS ))
538 gbeauche 1.1 #define _ALUWir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AX) ? \
539     (_d16(), _REXLrr(0, RD), _O_W (((OP) << 3) + 5 ,_su16(IM))) : \
540     (_d16(), _REXLrr(0, RD), _Os_Mrm_sW (0x81 ,_b11,OP ,_r2(RD) ,_su16(IM))) )
541 gbeauche 1.11 #define _ALUWim(OP, IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _Os_r_X_sW (0x81 ,OP ,MD,MB,MI,MS ,_su16(IM)))
542 gbeauche 1.1
543     #define _ALULrr(OP, RS, RD) (_REXLrr(RS, RD), _O_Mrm (((OP) << 3) + 1,_b11,_r4(RS),_r4(RD) ))
544     #define _ALULmr(OP, MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _O_r_X (((OP) << 3) + 3 ,_r4(RD) ,MD,MB,MI,MS ))
545     #define _ALULrm(OP, RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (((OP) << 3) + 1 ,_r4(RS) ,MD,MB,MI,MS ))
546     #define _ALULir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_EAX) ? \
547     (_REXLrr(0, RD), _O_L (((OP) << 3) + 5 ,IM )) : \
548     (_REXLrr(0, RD), _Os_Mrm_sL (0x81 ,_b11,OP ,_r4(RD) ,IM )) )
549     #define _ALULim(OP, IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _Os_r_X_sL (0x81 ,OP ,MD,MB,MI,MS ,IM ))
550    
551     #define _ALUQrr(OP, RS, RD) (_REXQrr(RS, RD), _O_Mrm (((OP) << 3) + 1,_b11,_r8(RS),_r8(RD) ))
552     #define _ALUQmr(OP, MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _O_r_X (((OP) << 3) + 3 ,_r8(RD) ,MD,MB,MI,MS ))
553     #define _ALUQrm(OP, RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (((OP) << 3) + 1 ,_r8(RS) ,MD,MB,MI,MS ))
554     #define _ALUQir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_RAX) ? \
555     (_REXQrr(0, RD), _O_L (((OP) << 3) + 5 ,IM )) : \
556     (_REXQrr(0, RD), _Os_Mrm_sL (0x81 ,_b11,OP ,_r8(RD) ,IM )) )
557     #define _ALUQim(OP, IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _Os_r_X_sL (0x81 ,OP ,MD,MB,MI,MS ,IM ))
558    
559     #define ADCBrr(RS, RD) _ALUBrr(X86_ADC, RS, RD)
560     #define ADCBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_ADC, MD, MB, MI, MS, RD)
561     #define ADCBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_ADC, RS, MD, MB, MI, MS)
562     #define ADCBir(IM, RD) _ALUBir(X86_ADC, IM, RD)
563     #define ADCBim(IM, MD, MB, MI, MS) _ALUBim(X86_ADC, IM, MD, MB, MI, MS)
564    
565     #define ADCWrr(RS, RD) _ALUWrr(X86_ADC, RS, RD)
566     #define ADCWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_ADC, MD, MB, MI, MS, RD)
567     #define ADCWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_ADC, RS, MD, MB, MI, MS)
568     #define ADCWir(IM, RD) _ALUWir(X86_ADC, IM, RD)
569     #define ADCWim(IM, MD, MB, MI, MS) _ALUWim(X86_ADC, IM, MD, MB, MI, MS)
570    
571     #define ADCLrr(RS, RD) _ALULrr(X86_ADC, RS, RD)
572     #define ADCLmr(MD, MB, MI, MS, RD) _ALULmr(X86_ADC, MD, MB, MI, MS, RD)
573     #define ADCLrm(RS, MD, MB, MI, MS) _ALULrm(X86_ADC, RS, MD, MB, MI, MS)
574     #define ADCLir(IM, RD) _ALULir(X86_ADC, IM, RD)
575     #define ADCLim(IM, MD, MB, MI, MS) _ALULim(X86_ADC, IM, MD, MB, MI, MS)
576    
577     #define ADCQrr(RS, RD) _ALUQrr(X86_ADC, RS, RD)
578     #define ADCQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_ADC, MD, MB, MI, MS, RD)
579     #define ADCQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_ADC, RS, MD, MB, MI, MS)
580     #define ADCQir(IM, RD) _ALUQir(X86_ADC, IM, RD)
581     #define ADCQim(IM, MD, MB, MI, MS) _ALUQim(X86_ADC, IM, MD, MB, MI, MS)
582    
583     #define ADDBrr(RS, RD) _ALUBrr(X86_ADD, RS, RD)
584     #define ADDBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_ADD, MD, MB, MI, MS, RD)
585     #define ADDBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_ADD, RS, MD, MB, MI, MS)
586     #define ADDBir(IM, RD) _ALUBir(X86_ADD, IM, RD)
587     #define ADDBim(IM, MD, MB, MI, MS) _ALUBim(X86_ADD, IM, MD, MB, MI, MS)
588    
589     #define ADDWrr(RS, RD) _ALUWrr(X86_ADD, RS, RD)
590     #define ADDWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_ADD, MD, MB, MI, MS, RD)
591     #define ADDWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_ADD, RS, MD, MB, MI, MS)
592     #define ADDWir(IM, RD) _ALUWir(X86_ADD, IM, RD)
593     #define ADDWim(IM, MD, MB, MI, MS) _ALUWim(X86_ADD, IM, MD, MB, MI, MS)
594    
595     #define ADDLrr(RS, RD) _ALULrr(X86_ADD, RS, RD)
596     #define ADDLmr(MD, MB, MI, MS, RD) _ALULmr(X86_ADD, MD, MB, MI, MS, RD)
597     #define ADDLrm(RS, MD, MB, MI, MS) _ALULrm(X86_ADD, RS, MD, MB, MI, MS)
598     #define ADDLir(IM, RD) _ALULir(X86_ADD, IM, RD)
599     #define ADDLim(IM, MD, MB, MI, MS) _ALULim(X86_ADD, IM, MD, MB, MI, MS)
600    
601     #define ADDQrr(RS, RD) _ALUQrr(X86_ADD, RS, RD)
602     #define ADDQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_ADD, MD, MB, MI, MS, RD)
603     #define ADDQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_ADD, RS, MD, MB, MI, MS)
604     #define ADDQir(IM, RD) _ALUQir(X86_ADD, IM, RD)
605     #define ADDQim(IM, MD, MB, MI, MS) _ALUQim(X86_ADD, IM, MD, MB, MI, MS)
606    
607     #define ANDBrr(RS, RD) _ALUBrr(X86_AND, RS, RD)
608     #define ANDBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_AND, MD, MB, MI, MS, RD)
609     #define ANDBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_AND, RS, MD, MB, MI, MS)
610     #define ANDBir(IM, RD) _ALUBir(X86_AND, IM, RD)
611     #define ANDBim(IM, MD, MB, MI, MS) _ALUBim(X86_AND, IM, MD, MB, MI, MS)
612    
613     #define ANDWrr(RS, RD) _ALUWrr(X86_AND, RS, RD)
614     #define ANDWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_AND, MD, MB, MI, MS, RD)
615     #define ANDWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_AND, RS, MD, MB, MI, MS)
616     #define ANDWir(IM, RD) _ALUWir(X86_AND, IM, RD)
617     #define ANDWim(IM, MD, MB, MI, MS) _ALUWim(X86_AND, IM, MD, MB, MI, MS)
618    
619     #define ANDLrr(RS, RD) _ALULrr(X86_AND, RS, RD)
620     #define ANDLmr(MD, MB, MI, MS, RD) _ALULmr(X86_AND, MD, MB, MI, MS, RD)
621     #define ANDLrm(RS, MD, MB, MI, MS) _ALULrm(X86_AND, RS, MD, MB, MI, MS)
622     #define ANDLir(IM, RD) _ALULir(X86_AND, IM, RD)
623     #define ANDLim(IM, MD, MB, MI, MS) _ALULim(X86_AND, IM, MD, MB, MI, MS)
624    
625     #define ANDQrr(RS, RD) _ALUQrr(X86_AND, RS, RD)
626     #define ANDQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_AND, MD, MB, MI, MS, RD)
627     #define ANDQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_AND, RS, MD, MB, MI, MS)
628     #define ANDQir(IM, RD) _ALUQir(X86_AND, IM, RD)
629     #define ANDQim(IM, MD, MB, MI, MS) _ALUQim(X86_AND, IM, MD, MB, MI, MS)
630    
631     #define CMPBrr(RS, RD) _ALUBrr(X86_CMP, RS, RD)
632     #define CMPBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_CMP, MD, MB, MI, MS, RD)
633     #define CMPBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_CMP, RS, MD, MB, MI, MS)
634     #define CMPBir(IM, RD) _ALUBir(X86_CMP, IM, RD)
635     #define CMPBim(IM, MD, MB, MI, MS) _ALUBim(X86_CMP, IM, MD, MB, MI, MS)
636    
637     #define CMPWrr(RS, RD) _ALUWrr(X86_CMP, RS, RD)
638     #define CMPWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_CMP, MD, MB, MI, MS, RD)
639     #define CMPWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_CMP, RS, MD, MB, MI, MS)
640     #define CMPWir(IM, RD) _ALUWir(X86_CMP, IM, RD)
641     #define CMPWim(IM, MD, MB, MI, MS) _ALUWim(X86_CMP, IM, MD, MB, MI, MS)
642    
643     #define CMPLrr(RS, RD) _ALULrr(X86_CMP, RS, RD)
644     #define CMPLmr(MD, MB, MI, MS, RD) _ALULmr(X86_CMP, MD, MB, MI, MS, RD)
645     #define CMPLrm(RS, MD, MB, MI, MS) _ALULrm(X86_CMP, RS, MD, MB, MI, MS)
646     #define CMPLir(IM, RD) _ALULir(X86_CMP, IM, RD)
647     #define CMPLim(IM, MD, MB, MI, MS) _ALULim(X86_CMP, IM, MD, MB, MI, MS)
648    
649     #define CMPQrr(RS, RD) _ALUQrr(X86_CMP, RS, RD)
650     #define CMPQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_CMP, MD, MB, MI, MS, RD)
651     #define CMPQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_CMP, RS, MD, MB, MI, MS)
652     #define CMPQir(IM, RD) _ALUQir(X86_CMP, IM, RD)
653     #define CMPQim(IM, MD, MB, MI, MS) _ALUQim(X86_CMP, IM, MD, MB, MI, MS)
654    
655     #define ORBrr(RS, RD) _ALUBrr(X86_OR, RS, RD)
656     #define ORBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_OR, MD, MB, MI, MS, RD)
657     #define ORBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_OR, RS, MD, MB, MI, MS)
658     #define ORBir(IM, RD) _ALUBir(X86_OR, IM, RD)
659     #define ORBim(IM, MD, MB, MI, MS) _ALUBim(X86_OR, IM, MD, MB, MI, MS)
660    
661     #define ORWrr(RS, RD) _ALUWrr(X86_OR, RS, RD)
662     #define ORWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_OR, MD, MB, MI, MS, RD)
663     #define ORWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_OR, RS, MD, MB, MI, MS)
664     #define ORWir(IM, RD) _ALUWir(X86_OR, IM, RD)
665     #define ORWim(IM, MD, MB, MI, MS) _ALUWim(X86_OR, IM, MD, MB, MI, MS)
666    
667     #define ORLrr(RS, RD) _ALULrr(X86_OR, RS, RD)
668     #define ORLmr(MD, MB, MI, MS, RD) _ALULmr(X86_OR, MD, MB, MI, MS, RD)
669     #define ORLrm(RS, MD, MB, MI, MS) _ALULrm(X86_OR, RS, MD, MB, MI, MS)
670     #define ORLir(IM, RD) _ALULir(X86_OR, IM, RD)
671     #define ORLim(IM, MD, MB, MI, MS) _ALULim(X86_OR, IM, MD, MB, MI, MS)
672    
673     #define ORQrr(RS, RD) _ALUQrr(X86_OR, RS, RD)
674     #define ORQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_OR, MD, MB, MI, MS, RD)
675     #define ORQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_OR, RS, MD, MB, MI, MS)
676     #define ORQir(IM, RD) _ALUQir(X86_OR, IM, RD)
677     #define ORQim(IM, MD, MB, MI, MS) _ALUQim(X86_OR, IM, MD, MB, MI, MS)
678    
679     #define SBBBrr(RS, RD) _ALUBrr(X86_SBB, RS, RD)
680     #define SBBBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_SBB, MD, MB, MI, MS, RD)
681     #define SBBBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_SBB, RS, MD, MB, MI, MS)
682     #define SBBBir(IM, RD) _ALUBir(X86_SBB, IM, RD)
683     #define SBBBim(IM, MD, MB, MI, MS) _ALUBim(X86_SBB, IM, MD, MB, MI, MS)
684    
685     #define SBBWrr(RS, RD) _ALUWrr(X86_SBB, RS, RD)
686     #define SBBWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_SBB, MD, MB, MI, MS, RD)
687     #define SBBWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_SBB, RS, MD, MB, MI, MS)
688     #define SBBWir(IM, RD) _ALUWir(X86_SBB, IM, RD)
689     #define SBBWim(IM, MD, MB, MI, MS) _ALUWim(X86_SBB, IM, MD, MB, MI, MS)
690    
691     #define SBBLrr(RS, RD) _ALULrr(X86_SBB, RS, RD)
692     #define SBBLmr(MD, MB, MI, MS, RD) _ALULmr(X86_SBB, MD, MB, MI, MS, RD)
693     #define SBBLrm(RS, MD, MB, MI, MS) _ALULrm(X86_SBB, RS, MD, MB, MI, MS)
694     #define SBBLir(IM, RD) _ALULir(X86_SBB, IM, RD)
695     #define SBBLim(IM, MD, MB, MI, MS) _ALULim(X86_SBB, IM, MD, MB, MI, MS)
696    
697     #define SBBQrr(RS, RD) _ALUQrr(X86_SBB, RS, RD)
698     #define SBBQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_SBB, MD, MB, MI, MS, RD)
699     #define SBBQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_SBB, RS, MD, MB, MI, MS)
700     #define SBBQir(IM, RD) _ALUQir(X86_SBB, IM, RD)
701     #define SBBQim(IM, MD, MB, MI, MS) _ALUQim(X86_SBB, IM, MD, MB, MI, MS)
702    
703     #define SUBBrr(RS, RD) _ALUBrr(X86_SUB, RS, RD)
704     #define SUBBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_SUB, MD, MB, MI, MS, RD)
705     #define SUBBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_SUB, RS, MD, MB, MI, MS)
706     #define SUBBir(IM, RD) _ALUBir(X86_SUB, IM, RD)
707     #define SUBBim(IM, MD, MB, MI, MS) _ALUBim(X86_SUB, IM, MD, MB, MI, MS)
708    
709     #define SUBWrr(RS, RD) _ALUWrr(X86_SUB, RS, RD)
710     #define SUBWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_SUB, MD, MB, MI, MS, RD)
711     #define SUBWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_SUB, RS, MD, MB, MI, MS)
712     #define SUBWir(IM, RD) _ALUWir(X86_SUB, IM, RD)
713     #define SUBWim(IM, MD, MB, MI, MS) _ALUWim(X86_SUB, IM, MD, MB, MI, MS)
714    
715     #define SUBLrr(RS, RD) _ALULrr(X86_SUB, RS, RD)
716     #define SUBLmr(MD, MB, MI, MS, RD) _ALULmr(X86_SUB, MD, MB, MI, MS, RD)
717     #define SUBLrm(RS, MD, MB, MI, MS) _ALULrm(X86_SUB, RS, MD, MB, MI, MS)
718     #define SUBLir(IM, RD) _ALULir(X86_SUB, IM, RD)
719     #define SUBLim(IM, MD, MB, MI, MS) _ALULim(X86_SUB, IM, MD, MB, MI, MS)
720    
721     #define SUBQrr(RS, RD) _ALUQrr(X86_SUB, RS, RD)
722     #define SUBQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_SUB, MD, MB, MI, MS, RD)
723     #define SUBQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_SUB, RS, MD, MB, MI, MS)
724     #define SUBQir(IM, RD) _ALUQir(X86_SUB, IM, RD)
725     #define SUBQim(IM, MD, MB, MI, MS) _ALUQim(X86_SUB, IM, MD, MB, MI, MS)
726    
727     #define XORBrr(RS, RD) _ALUBrr(X86_XOR, RS, RD)
728     #define XORBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_XOR, MD, MB, MI, MS, RD)
729     #define XORBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_XOR, RS, MD, MB, MI, MS)
730     #define XORBir(IM, RD) _ALUBir(X86_XOR, IM, RD)
731     #define XORBim(IM, MD, MB, MI, MS) _ALUBim(X86_XOR, IM, MD, MB, MI, MS)
732    
733     #define XORWrr(RS, RD) _ALUWrr(X86_XOR, RS, RD)
734     #define XORWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_XOR, MD, MB, MI, MS, RD)
735     #define XORWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_XOR, RS, MD, MB, MI, MS)
736     #define XORWir(IM, RD) _ALUWir(X86_XOR, IM, RD)
737     #define XORWim(IM, MD, MB, MI, MS) _ALUWim(X86_XOR, IM, MD, MB, MI, MS)
738    
739     #define XORLrr(RS, RD) _ALULrr(X86_XOR, RS, RD)
740     #define XORLmr(MD, MB, MI, MS, RD) _ALULmr(X86_XOR, MD, MB, MI, MS, RD)
741     #define XORLrm(RS, MD, MB, MI, MS) _ALULrm(X86_XOR, RS, MD, MB, MI, MS)
742     #define XORLir(IM, RD) _ALULir(X86_XOR, IM, RD)
743     #define XORLim(IM, MD, MB, MI, MS) _ALULim(X86_XOR, IM, MD, MB, MI, MS)
744    
745     #define XORQrr(RS, RD) _ALUQrr(X86_XOR, RS, RD)
746     #define XORQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_XOR, MD, MB, MI, MS, RD)
747     #define XORQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_XOR, RS, MD, MB, MI, MS)
748     #define XORQir(IM, RD) _ALUQir(X86_XOR, IM, RD)
749     #define XORQim(IM, MD, MB, MI, MS) _ALUQim(X86_XOR, IM, MD, MB, MI, MS)
750    
751    
752     /* --- Shift/Rotate instructions ------------------------------------------- */
753    
754 gbeauche 1.2 enum {
755 gbeauche 1.1 X86_ROL = 0,
756     X86_ROR = 1,
757     X86_RCL = 2,
758     X86_RCR = 3,
759     X86_SHL = 4,
760     X86_SHR = 5,
761     X86_SAR = 7,
762 gbeauche 1.2 };
763 gbeauche 1.1
764     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
765    
766     #define _ROTSHIBir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
767     (_REXBrr(0, RD), _O_Mrm (0xd0 ,_b11,OP,_r1(RD) )) : \
768     (_REXBrr(0, RD), _O_Mrm_B (0xc0 ,_b11,OP,_r1(RD) ,_u8(IM))) )
769     #define _ROTSHIBim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
770     (_REXBrm(0, MB, MI), _O_r_X (0xd0 ,OP ,MD,MB,MI,MS )) : \
771     (_REXBrm(0, MB, MI), _O_r_X_B (0xc0 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
772     #define _ROTSHIBrr(OP,RS,RD) (((RS) == X86_CL) ? \
773     (_REXBrr(RS, RD), _O_Mrm (0xd2 ,_b11,OP,_r1(RD) )) : \
774     x86_emit_failure("source register must be CL" ) )
775     #define _ROTSHIBrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
776     (_REXBrm(RS, MB, MI), _O_r_X (0xd2 ,OP ,MD,MB,MI,MS )) : \
777     x86_emit_failure("source register must be CL" ) )
778    
779     #define _ROTSHIWir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
780     (_d16(), _REXLrr(0, RD), _O_Mrm (0xd1 ,_b11,OP,_r2(RD) )) : \
781     (_d16(), _REXLrr(0, RD), _O_Mrm_B (0xc1 ,_b11,OP,_r2(RD) ,_u8(IM))) )
782     #define _ROTSHIWim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
783     (_d16(), _REXLrm(0, MB, MI), _O_r_X (0xd1 ,OP ,MD,MB,MI,MS )) : \
784     (_d16(), _REXLrm(0, MB, MI), _O_r_X_B (0xc1 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
785     #define _ROTSHIWrr(OP,RS,RD) (((RS) == X86_CL) ? \
786     (_d16(), _REXLrr(RS, RD), _O_Mrm (0xd3 ,_b11,OP,_r2(RD) )) : \
787     x86_emit_failure("source register must be CL" ) )
788     #define _ROTSHIWrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
789     (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0xd3 ,OP ,MD,MB,MI,MS )) : \
790     x86_emit_failure("source register must be CL" ) )
791    
792     #define _ROTSHILir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
793     (_REXLrr(0, RD), _O_Mrm (0xd1 ,_b11,OP,_r4(RD) )) : \
794     (_REXLrr(0, RD), _O_Mrm_B (0xc1 ,_b11,OP,_r4(RD) ,_u8(IM))) )
795     #define _ROTSHILim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
796     (_REXLrm(0, MB, MI), _O_r_X (0xd1 ,OP ,MD,MB,MI,MS )) : \
797     (_REXLrm(0, MB, MI), _O_r_X_B (0xc1 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
798     #define _ROTSHILrr(OP,RS,RD) (((RS) == X86_CL) ? \
799     (_REXLrr(RS, RD), _O_Mrm (0xd3 ,_b11,OP,_r4(RD) )) : \
800     x86_emit_failure("source register must be CL" ) )
801     #define _ROTSHILrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
802     (_REXLrm(RS, MB, MI), _O_r_X (0xd3 ,OP ,MD,MB,MI,MS )) : \
803     x86_emit_failure("source register must be CL" ) )
804    
805     #define _ROTSHIQir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
806     (_REXQrr(0, RD), _O_Mrm (0xd1 ,_b11,OP,_r8(RD) )) : \
807     (_REXQrr(0, RD), _O_Mrm_B (0xc1 ,_b11,OP,_r8(RD) ,_u8(IM))) )
808     #define _ROTSHIQim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
809     (_REXQrm(0, MB, MI), _O_r_X (0xd1 ,OP ,MD,MB,MI,MS )) : \
810     (_REXQrm(0, MB, MI), _O_r_X_B (0xc1 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
811     #define _ROTSHIQrr(OP,RS,RD) (((RS) == X86_CL) ? \
812     (_REXQrr(RS, RD), _O_Mrm (0xd3 ,_b11,OP,_r8(RD) )) : \
813     x86_emit_failure("source register must be CL" ) )
814     #define _ROTSHIQrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
815     (_REXQrm(RS, MB, MI), _O_r_X (0xd3 ,OP ,MD,MB,MI,MS )) : \
816     x86_emit_failure("source register must be CL" ) )
817    
818     #define ROLBir(IM, RD) _ROTSHIBir(X86_ROL, IM, RD)
819     #define ROLBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_ROL, IM, MD, MB, MI, MS)
820     #define ROLBrr(RS, RD) _ROTSHIBrr(X86_ROL, RS, RD)
821     #define ROLBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_ROL, RS, MD, MB, MI, MS)
822    
823     #define ROLWir(IM, RD) _ROTSHIWir(X86_ROL, IM, RD)
824     #define ROLWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_ROL, IM, MD, MB, MI, MS)
825     #define ROLWrr(RS, RD) _ROTSHIWrr(X86_ROL, RS, RD)
826     #define ROLWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_ROL, RS, MD, MB, MI, MS)
827    
828     #define ROLLir(IM, RD) _ROTSHILir(X86_ROL, IM, RD)
829     #define ROLLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_ROL, IM, MD, MB, MI, MS)
830     #define ROLLrr(RS, RD) _ROTSHILrr(X86_ROL, RS, RD)
831     #define ROLLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_ROL, RS, MD, MB, MI, MS)
832    
833     #define ROLQir(IM, RD) _ROTSHIQir(X86_ROL, IM, RD)
834     #define ROLQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_ROL, IM, MD, MB, MI, MS)
835     #define ROLQrr(RS, RD) _ROTSHIQrr(X86_ROL, RS, RD)
836     #define ROLQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_ROL, RS, MD, MB, MI, MS)
837    
838     #define RORBir(IM, RD) _ROTSHIBir(X86_ROR, IM, RD)
839     #define RORBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_ROR, IM, MD, MB, MI, MS)
840     #define RORBrr(RS, RD) _ROTSHIBrr(X86_ROR, RS, RD)
841     #define RORBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_ROR, RS, MD, MB, MI, MS)
842    
843     #define RORWir(IM, RD) _ROTSHIWir(X86_ROR, IM, RD)
844     #define RORWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_ROR, IM, MD, MB, MI, MS)
845     #define RORWrr(RS, RD) _ROTSHIWrr(X86_ROR, RS, RD)
846     #define RORWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_ROR, RS, MD, MB, MI, MS)
847    
848     #define RORLir(IM, RD) _ROTSHILir(X86_ROR, IM, RD)
849     #define RORLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_ROR, IM, MD, MB, MI, MS)
850     #define RORLrr(RS, RD) _ROTSHILrr(X86_ROR, RS, RD)
851     #define RORLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_ROR, RS, MD, MB, MI, MS)
852    
853     #define RORQir(IM, RD) _ROTSHIQir(X86_ROR, IM, RD)
854     #define RORQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_ROR, IM, MD, MB, MI, MS)
855     #define RORQrr(RS, RD) _ROTSHIQrr(X86_ROR, RS, RD)
856     #define RORQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_ROR, RS, MD, MB, MI, MS)
857    
858     #define RCLBir(IM, RD) _ROTSHIBir(X86_RCL, IM, RD)
859     #define RCLBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_RCL, IM, MD, MB, MI, MS)
860     #define RCLBrr(RS, RD) _ROTSHIBrr(X86_RCL, RS, RD)
861     #define RCLBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_RCL, RS, MD, MB, MI, MS)
862    
863     #define RCLWir(IM, RD) _ROTSHIWir(X86_RCL, IM, RD)
864     #define RCLWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_RCL, IM, MD, MB, MI, MS)
865     #define RCLWrr(RS, RD) _ROTSHIWrr(X86_RCL, RS, RD)
866     #define RCLWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_RCL, RS, MD, MB, MI, MS)
867    
868     #define RCLLir(IM, RD) _ROTSHILir(X86_RCL, IM, RD)
869     #define RCLLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_RCL, IM, MD, MB, MI, MS)
870     #define RCLLrr(RS, RD) _ROTSHILrr(X86_RCL, RS, RD)
871     #define RCLLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_RCL, RS, MD, MB, MI, MS)
872    
873     #define RCLQir(IM, RD) _ROTSHIQir(X86_RCL, IM, RD)
874     #define RCLQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_RCL, IM, MD, MB, MI, MS)
875     #define RCLQrr(RS, RD) _ROTSHIQrr(X86_RCL, RS, RD)
876     #define RCLQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_RCL, RS, MD, MB, MI, MS)
877    
878     #define RCRBir(IM, RD) _ROTSHIBir(X86_RCR, IM, RD)
879     #define RCRBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_RCR, IM, MD, MB, MI, MS)
880     #define RCRBrr(RS, RD) _ROTSHIBrr(X86_RCR, RS, RD)
881     #define RCRBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_RCR, RS, MD, MB, MI, MS)
882    
883     #define RCRWir(IM, RD) _ROTSHIWir(X86_RCR, IM, RD)
884     #define RCRWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_RCR, IM, MD, MB, MI, MS)
885     #define RCRWrr(RS, RD) _ROTSHIWrr(X86_RCR, RS, RD)
886     #define RCRWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_RCR, RS, MD, MB, MI, MS)
887    
888     #define RCRLir(IM, RD) _ROTSHILir(X86_RCR, IM, RD)
889     #define RCRLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_RCR, IM, MD, MB, MI, MS)
890     #define RCRLrr(RS, RD) _ROTSHILrr(X86_RCR, RS, RD)
891     #define RCRLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_RCR, RS, MD, MB, MI, MS)
892    
893     #define RCRQir(IM, RD) _ROTSHIQir(X86_RCR, IM, RD)
894     #define RCRQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_RCR, IM, MD, MB, MI, MS)
895     #define RCRQrr(RS, RD) _ROTSHIQrr(X86_RCR, RS, RD)
896     #define RCRQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_RCR, RS, MD, MB, MI, MS)
897    
898     #define SHLBir(IM, RD) _ROTSHIBir(X86_SHL, IM, RD)
899     #define SHLBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_SHL, IM, MD, MB, MI, MS)
900     #define SHLBrr(RS, RD) _ROTSHIBrr(X86_SHL, RS, RD)
901     #define SHLBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_SHL, RS, MD, MB, MI, MS)
902    
903     #define SHLWir(IM, RD) _ROTSHIWir(X86_SHL, IM, RD)
904     #define SHLWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_SHL, IM, MD, MB, MI, MS)
905     #define SHLWrr(RS, RD) _ROTSHIWrr(X86_SHL, RS, RD)
906     #define SHLWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_SHL, RS, MD, MB, MI, MS)
907    
908     #define SHLLir(IM, RD) _ROTSHILir(X86_SHL, IM, RD)
909     #define SHLLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_SHL, IM, MD, MB, MI, MS)
910     #define SHLLrr(RS, RD) _ROTSHILrr(X86_SHL, RS, RD)
911     #define SHLLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_SHL, RS, MD, MB, MI, MS)
912    
913     #define SHLQir(IM, RD) _ROTSHIQir(X86_SHL, IM, RD)
914     #define SHLQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_SHL, IM, MD, MB, MI, MS)
915     #define SHLQrr(RS, RD) _ROTSHIQrr(X86_SHL, RS, RD)
916     #define SHLQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_SHL, RS, MD, MB, MI, MS)
917    
918     #define SHRBir(IM, RD) _ROTSHIBir(X86_SHR, IM, RD)
919     #define SHRBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_SHR, IM, MD, MB, MI, MS)
920     #define SHRBrr(RS, RD) _ROTSHIBrr(X86_SHR, RS, RD)
921     #define SHRBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_SHR, RS, MD, MB, MI, MS)
922    
923     #define SHRWir(IM, RD) _ROTSHIWir(X86_SHR, IM, RD)
924     #define SHRWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_SHR, IM, MD, MB, MI, MS)
925     #define SHRWrr(RS, RD) _ROTSHIWrr(X86_SHR, RS, RD)
926     #define SHRWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_SHR, RS, MD, MB, MI, MS)
927    
928     #define SHRLir(IM, RD) _ROTSHILir(X86_SHR, IM, RD)
929     #define SHRLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_SHR, IM, MD, MB, MI, MS)
930     #define SHRLrr(RS, RD) _ROTSHILrr(X86_SHR, RS, RD)
931     #define SHRLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_SHR, RS, MD, MB, MI, MS)
932    
933     #define SHRQir(IM, RD) _ROTSHIQir(X86_SHR, IM, RD)
934     #define SHRQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_SHR, IM, MD, MB, MI, MS)
935     #define SHRQrr(RS, RD) _ROTSHIQrr(X86_SHR, RS, RD)
936     #define SHRQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_SHR, RS, MD, MB, MI, MS)
937    
938     #define SALBir SHLBir
939     #define SALBim SHLBim
940     #define SALBrr SHLBrr
941     #define SALBrm SHLBrm
942    
943     #define SALWir SHLWir
944     #define SALWim SHLWim
945     #define SALWrr SHLWrr
946     #define SALWrm SHLWrm
947    
948     #define SALLir SHLLir
949     #define SALLim SHLLim
950     #define SALLrr SHLLrr
951     #define SALLrm SHLLrm
952    
953     #define SALQir SHLQir
954     #define SALQim SHLQim
955     #define SALQrr SHLQrr
956     #define SALQrm SHLQrm
957    
958     #define SARBir(IM, RD) _ROTSHIBir(X86_SAR, IM, RD)
959     #define SARBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_SAR, IM, MD, MB, MI, MS)
960     #define SARBrr(RS, RD) _ROTSHIBrr(X86_SAR, RS, RD)
961     #define SARBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_SAR, RS, MD, MB, MI, MS)
962    
963     #define SARWir(IM, RD) _ROTSHIWir(X86_SAR, IM, RD)
964     #define SARWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_SAR, IM, MD, MB, MI, MS)
965     #define SARWrr(RS, RD) _ROTSHIWrr(X86_SAR, RS, RD)
966     #define SARWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_SAR, RS, MD, MB, MI, MS)
967    
968     #define SARLir(IM, RD) _ROTSHILir(X86_SAR, IM, RD)
969     #define SARLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_SAR, IM, MD, MB, MI, MS)
970     #define SARLrr(RS, RD) _ROTSHILrr(X86_SAR, RS, RD)
971     #define SARLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_SAR, RS, MD, MB, MI, MS)
972    
973     #define SARQir(IM, RD) _ROTSHIQir(X86_SAR, IM, RD)
974     #define SARQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_SAR, IM, MD, MB, MI, MS)
975     #define SARQrr(RS, RD) _ROTSHIQrr(X86_SAR, RS, RD)
976     #define SARQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_SAR, RS, MD, MB, MI, MS)
977    
978    
979     /* --- Bit test instructions ----------------------------------------------- */
980    
981 gbeauche 1.2 enum {
982 gbeauche 1.1 X86_BT = 4,
983     X86_BTS = 5,
984     X86_BTR = 6,
985     X86_BTC = 7,
986 gbeauche 1.2 };
987 gbeauche 1.1
988     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
989    
990     #define _BTWir(OP, IM, RD) (_d16(), _REXLrr(0, RD), _OO_Mrm_B (0x0fba ,_b11,OP ,_r2(RD) ,_u8(IM)))
991     #define _BTWim(OP, IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _OO_r_X_B (0x0fba ,OP ,MD,MB,MI,MS ,_u8(IM)))
992     #define _BTWrr(OP, RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0f83|((OP)<<3),_b11,_r2(RS),_r2(RD) ))
993     #define _BTWrm(OP, RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _OO_r_X (0x0f83|((OP)<<3) ,_r2(RS) ,MD,MB,MI,MS ))
994    
995     #define _BTLir(OP, IM, RD) (_REXLrr(0, RD), _OO_Mrm_B (0x0fba ,_b11,OP ,_r4(RD) ,_u8(IM)))
996     #define _BTLim(OP, IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _OO_r_X_B (0x0fba ,OP ,MD,MB,MI,MS ,_u8(IM)))
997     #define _BTLrr(OP, RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0f83|((OP)<<3),_b11,_r4(RS),_r4(RD) ))
998     #define _BTLrm(OP, RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0f83|((OP)<<3) ,_r4(RS) ,MD,MB,MI,MS ))
999    
1000     #define _BTQir(OP, IM, RD) (_REXQrr(0, RD), _OO_Mrm_B (0x0fba ,_b11,OP ,_r8(RD) ,_u8(IM)))
1001     #define _BTQim(OP, IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _OO_r_X_B (0x0fba ,OP ,MD,MB,MI,MS ,_u8(IM)))
1002     #define _BTQrr(OP, RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0f83|((OP)<<3),_b11,_r8(RS),_r8(RD) ))
1003     #define _BTQrm(OP, RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0f83|((OP)<<3) ,_r8(RS) ,MD,MB,MI,MS ))
1004    
1005     #define BTWir(IM, RD) _BTWir(X86_BT, IM, RD)
1006     #define BTWim(IM, MD, MB, MI, MS) _BTWim(X86_BT, IM, MD, MI, MS)
1007     #define BTWrr(RS, RD) _BTWrr(X86_BT, RS, RD)
1008     #define BTWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BT, RS, MD, MB, MI, MS)
1009    
1010     #define BTLir(IM, RD) _BTLir(X86_BT, IM, RD)
1011     #define BTLim(IM, MD, MB, MI, MS) _BTLim(X86_BT, IM, MD, MB, MI, MS)
1012     #define BTLrr(RS, RD) _BTLrr(X86_BT, RS, RD)
1013     #define BTLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BT, RS, MD, MB, MI, MS)
1014    
1015     #define BTQir(IM, RD) _BTQir(X86_BT, IM, RD)
1016     #define BTQim(IM, MD, MB, MI, MS) _BTQim(X86_BT, IM, MD, MB, MI, MS)
1017     #define BTQrr(RS, RD) _BTQrr(X86_BT, RS, RD)
1018     #define BTQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BT, RS, MD, MB, MI, MS)
1019    
1020     #define BTCWir(IM, RD) _BTWir(X86_BTC, IM, RD)
1021     #define BTCWim(IM, MD, MB, MI, MS) _BTWim(X86_BTC, IM, MD, MI, MS)
1022     #define BTCWrr(RS, RD) _BTWrr(X86_BTC, RS, RD)
1023     #define BTCWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BTC, RS, MD, MB, MI, MS)
1024    
1025     #define BTCLir(IM, RD) _BTLir(X86_BTC, IM, RD)
1026     #define BTCLim(IM, MD, MB, MI, MS) _BTLim(X86_BTC, IM, MD, MB, MI, MS)
1027     #define BTCLrr(RS, RD) _BTLrr(X86_BTC, RS, RD)
1028     #define BTCLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BTC, RS, MD, MB, MI, MS)
1029    
1030     #define BTCQir(IM, RD) _BTQir(X86_BTC, IM, RD)
1031     #define BTCQim(IM, MD, MB, MI, MS) _BTQim(X86_BTC, IM, MD, MB, MI, MS)
1032     #define BTCQrr(RS, RD) _BTQrr(X86_BTC, RS, RD)
1033     #define BTCQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BTC, RS, MD, MB, MI, MS)
1034    
1035     #define BTRWir(IM, RD) _BTWir(X86_BTR, IM, RD)
1036     #define BTRWim(IM, MD, MB, MI, MS) _BTWim(X86_BTR, IM, MD, MI, MS)
1037     #define BTRWrr(RS, RD) _BTWrr(X86_BTR, RS, RD)
1038     #define BTRWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BTR, RS, MD, MB, MI, MS)
1039    
1040     #define BTRLir(IM, RD) _BTLir(X86_BTR, IM, RD)
1041     #define BTRLim(IM, MD, MB, MI, MS) _BTLim(X86_BTR, IM, MD, MB, MI, MS)
1042     #define BTRLrr(RS, RD) _BTLrr(X86_BTR, RS, RD)
1043     #define BTRLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BTR, RS, MD, MB, MI, MS)
1044    
1045     #define BTRQir(IM, RD) _BTQir(X86_BTR, IM, RD)
1046     #define BTRQim(IM, MD, MB, MI, MS) _BTQim(X86_BTR, IM, MD, MB, MI, MS)
1047     #define BTRQrr(RS, RD) _BTQrr(X86_BTR, RS, RD)
1048     #define BTRQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BTR, RS, MD, MB, MI, MS)
1049    
1050     #define BTSWir(IM, RD) _BTWir(X86_BTS, IM, RD)
1051     #define BTSWim(IM, MD, MB, MI, MS) _BTWim(X86_BTS, IM, MD, MI, MS)
1052     #define BTSWrr(RS, RD) _BTWrr(X86_BTS, RS, RD)
1053     #define BTSWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BTS, RS, MD, MB, MI, MS)
1054    
1055     #define BTSLir(IM, RD) _BTLir(X86_BTS, IM, RD)
1056     #define BTSLim(IM, MD, MB, MI, MS) _BTLim(X86_BTS, IM, MD, MB, MI, MS)
1057     #define BTSLrr(RS, RD) _BTLrr(X86_BTS, RS, RD)
1058     #define BTSLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BTS, RS, MD, MB, MI, MS)
1059    
1060     #define BTSQir(IM, RD) _BTQir(X86_BTS, IM, RD)
1061     #define BTSQim(IM, MD, MB, MI, MS) _BTQim(X86_BTS, IM, MD, MB, MI, MS)
1062     #define BTSQrr(RS, RD) _BTQrr(X86_BTS, RS, RD)
1063     #define BTSQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BTS, RS, MD, MB, MI, MS)
1064    
1065    
1066     /* --- Move instructions --------------------------------------------------- */
1067    
1068     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1069    
1070 gbeauche 1.9 #define MOVBrr(RS, RD) (_REXBrr(RS, RD), _O_Mrm (0x88 ,_b11,_r1(RS),_r1(RD) ))
1071 gbeauche 1.1 #define MOVBmr(MD, MB, MI, MS, RD) (_REXBmr(MB, MI, RD), _O_r_X (0x8a ,_r1(RD) ,MD,MB,MI,MS ))
1072     #define MOVBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (0x88 ,_r1(RS) ,MD,MB,MI,MS ))
1073     #define MOVBir(IM, R) (_REXBrr(0, R), _Or_B (0xb0,_r1(R) ,_su8(IM)))
1074     #define MOVBim(IM, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_X_B (0xc6 ,MD,MB,MI,MS ,_su8(IM)))
1075    
1076     #define MOVWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (0x89 ,_b11,_r2(RS),_r2(RD) ))
1077 gbeauche 1.11 #define MOVWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _O_r_X (0x8b ,_r2(RD) ,MD,MB,MI,MS ))
1078     #define MOVWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0x89 ,_r2(RS) ,MD,MB,MI,MS ))
1079 gbeauche 1.1 #define MOVWir(IM, R) (_d16(), _REXLrr(0, R), _Or_W (0xb8,_r2(R) ,_su16(IM)))
1080 gbeauche 1.11 #define MOVWim(IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_X_W (0xc7 ,MD,MB,MI,MS ,_su16(IM)))
1081 gbeauche 1.1
1082     #define MOVLrr(RS, RD) (_REXLrr(RS, RD), _O_Mrm (0x89 ,_b11,_r4(RS),_r4(RD) ))
1083     #define MOVLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _O_r_X (0x8b ,_r4(RD) ,MD,MB,MI,MS ))
1084     #define MOVLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (0x89 ,_r4(RS) ,MD,MB,MI,MS ))
1085     #define MOVLir(IM, R) (_REXLrr(0, R), _Or_L (0xb8,_r4(R) ,IM ))
1086     #define MOVLim(IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_X_L (0xc7 ,MD,MB,MI,MS ,IM ))
1087    
1088     #define MOVQrr(RS, RD) (_REXQrr(RS, RD), _O_Mrm (0x89 ,_b11,_r8(RS),_r8(RD) ))
1089     #define MOVQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _O_r_X (0x8b ,_r8(RD) ,MD,MB,MI,MS ))
1090     #define MOVQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (0x89 ,_r8(RS) ,MD,MB,MI,MS ))
1091     #define MOVQir(IM, R) (_REXQrr(0, R), _Or_L (0xb8,_r8(R) ,IM ))
1092     #define MOVQim(IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_X_L (0xc7 ,MD,MB,MI,MS ,IM ))
1093    
1094    
1095     /* --- Unary and Multiply/Divide instructions ------------------------------ */
1096    
1097 gbeauche 1.2 enum {
1098 gbeauche 1.1 X86_NOT = 2,
1099     X86_NEG = 3,
1100     X86_MUL = 4,
1101     X86_IMUL = 5,
1102     X86_DIV = 6,
1103     X86_IDIV = 7,
1104 gbeauche 1.2 };
1105 gbeauche 1.1
1106     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1107    
1108     #define _UNARYBr(OP, RS) (_REXBrr(0, RS), _O_Mrm (0xf6 ,_b11,OP ,_r1(RS) ))
1109     #define _UNARYBm(OP, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X (0xf6 ,OP ,MD,MB,MI,MS ))
1110     #define _UNARYWr(OP, RS) (_d16(), _REXLrr(0, RS), _O_Mrm (0xf7 ,_b11,OP ,_r2(RS) ))
1111     #define _UNARYWm(OP, MD, MB, MI, MS) (_d16(), _REXLmr(MB, MI, 0), _O_r_X (0xf7 ,OP ,MD,MB,MI,MS ))
1112     #define _UNARYLr(OP, RS) (_REXLrr(0, RS), _O_Mrm (0xf7 ,_b11,OP ,_r4(RS) ))
1113     #define _UNARYLm(OP, MD, MB, MI, MS) (_REXLmr(MB, MI, 0), _O_r_X (0xf7 ,OP ,MD,MB,MI,MS ))
1114     #define _UNARYQr(OP, RS) (_REXQrr(0, RS), _O_Mrm (0xf7 ,_b11,OP ,_r8(RS) ))
1115     #define _UNARYQm(OP, MD, MB, MI, MS) (_REXQmr(MB, MI, 0), _O_r_X (0xf7 ,OP ,MD,MB,MI,MS ))
1116    
1117     #define NOTBr(RS) _UNARYBr(X86_NOT, RS)
1118     #define NOTBm(MD, MB, MI, MS) _UNARYBm(X86_NOT, MD, MB, MI, MS)
1119     #define NOTWr(RS) _UNARYWr(X86_NOT, RS)
1120     #define NOTWm(MD, MB, MI, MS) _UNARYWm(X86_NOT, MD, MB, MI, MS)
1121     #define NOTLr(RS) _UNARYLr(X86_NOT, RS)
1122     #define NOTLm(MD, MB, MI, MS) _UNARYLm(X86_NOT, MD, MB, MI, MS)
1123     #define NOTQr(RS) _UNARYQr(X86_NOT, RS)
1124     #define NOTQm(MD, MB, MI, MS) _UNARYQm(X86_NOT, MD, MB, MI, MS)
1125    
1126     #define NEGBr(RS) _UNARYBr(X86_NEG, RS)
1127     #define NEGBm(MD, MB, MI, MS) _UNARYBm(X86_NEG, MD, MB, MI, MS)
1128     #define NEGWr(RS) _UNARYWr(X86_NEG, RS)
1129     #define NEGWm(MD, MB, MI, MS) _UNARYWm(X86_NEG, MD, MB, MI, MS)
1130     #define NEGLr(RS) _UNARYLr(X86_NEG, RS)
1131     #define NEGLm(MD, MB, MI, MS) _UNARYLm(X86_NEG, MD, MB, MI, MS)
1132     #define NEGQr(RS) _UNARYQr(X86_NEG, RS)
1133     #define NEGQm(MD, MB, MI, MS) _UNARYQm(X86_NEG, MD, MB, MI, MS)
1134    
1135     #define MULBr(RS) _UNARYBr(X86_MUL, RS)
1136     #define MULBm(MD, MB, MI, MS) _UNARYBm(X86_MUL, MD, MB, MI, MS)
1137     #define MULWr(RS) _UNARYWr(X86_MUL, RS)
1138     #define MULWm(MD, MB, MI, MS) _UNARYWm(X86_MUL, MD, MB, MI, MS)
1139     #define MULLr(RS) _UNARYLr(X86_MUL, RS)
1140     #define MULLm(MD, MB, MI, MS) _UNARYLm(X86_MUL, MD, MB, MI, MS)
1141     #define MULQr(RS) _UNARYQr(X86_MUL, RS)
1142     #define MULQm(MD, MB, MI, MS) _UNARYQm(X86_MUL, MD, MB, MI, MS)
1143    
1144     #define IMULBr(RS) _UNARYBr(X86_IMUL, RS)
1145     #define IMULBm(MD, MB, MI, MS) _UNARYBm(X86_IMUL, MD, MB, MI, MS)
1146     #define IMULWr(RS) _UNARYWr(X86_IMUL, RS)
1147     #define IMULWm(MD, MB, MI, MS) _UNARYWm(X86_IMUL, MD, MB, MI, MS)
1148     #define IMULLr(RS) _UNARYLr(X86_IMUL, RS)
1149     #define IMULLm(MD, MB, MI, MS) _UNARYLm(X86_IMUL, MD, MB, MI, MS)
1150     #define IMULQr(RS) _UNARYQr(X86_IMUL, RS)
1151     #define IMULQm(MD, MB, MI, MS) _UNARYQm(X86_IMUL, MD, MB, MI, MS)
1152    
1153     #define DIVBr(RS) _UNARYBr(X86_DIV, RS)
1154     #define DIVBm(MD, MB, MI, MS) _UNARYBm(X86_DIV, MD, MB, MI, MS)
1155     #define DIVWr(RS) _UNARYWr(X86_DIV, RS)
1156     #define DIVWm(MD, MB, MI, MS) _UNARYWm(X86_DIV, MD, MB, MI, MS)
1157     #define DIVLr(RS) _UNARYLr(X86_DIV, RS)
1158     #define DIVLm(MD, MB, MI, MS) _UNARYLm(X86_DIV, MD, MB, MI, MS)
1159     #define DIVQr(RS) _UNARYQr(X86_DIV, RS)
1160     #define DIVQm(MD, MB, MI, MS) _UNARYQm(X86_DIV, MD, MB, MI, MS)
1161    
1162     #define IDIVBr(RS) _UNARYBr(X86_IDIV, RS)
1163     #define IDIVBm(MD, MB, MI, MS) _UNARYBm(X86_IDIV, MD, MB, MI, MS)
1164     #define IDIVWr(RS) _UNARYWr(X86_IDIV, RS)
1165     #define IDIVWm(MD, MB, MI, MS) _UNARYWm(X86_IDIV, MD, MB, MI, MS)
1166     #define IDIVLr(RS) _UNARYLr(X86_IDIV, RS)
1167     #define IDIVLm(MD, MB, MI, MS) _UNARYLm(X86_IDIV, MD, MB, MI, MS)
1168     #define IDIVQr(RS) _UNARYQr(X86_IDIV, RS)
1169     #define IDIVQm(MD, MB, MI, MS) _UNARYQm(X86_IDIV, MD, MB, MI, MS)
1170    
1171     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1172    
1173     #define IMULWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0faf ,_b11,_r2(RS),_r2(RD) ))
1174     #define IMULWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0faf ,_r2(RD) ,MD,MB,MI,MS ))
1175    
1176     #define IMULWirr(IM,RS,RD) (_d16(), _REXLrr(RS, RD), _Os_Mrm_sW (0x69 ,_b11,_r2(RS),_r2(RD) ,_su16(IM) ))
1177     #define IMULWimr(IM,MD,MB,MI,MS,RD) (_d16(), _REXLmr(MB, MI, RD), _Os_r_X_sW (0x69 ,_r2(RD) ,MD,MB,MI,MS ,_su16(IM) ))
1178    
1179     #define IMULLir(IM, RD) (_REXLrr(0, RD), _Os_Mrm_sL (0x69 ,_b11,_r4(RD),_r4(RD) ,IM ))
1180     #define IMULLrr(RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0faf ,_b11,_r4(RD),_r4(RS) ))
1181     #define IMULLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0faf ,_r4(RD) ,MD,MB,MI,MS ))
1182    
1183     #define IMULQir(IM, RD) (_REXQrr(0, RD), _Os_Mrm_sL (0x69 ,_b11,_r8(RD),_r8(RD) ,IM ))
1184     #define IMULQrr(RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0faf ,_b11,_r8(RD),_r8(RS) ))
1185     #define IMULQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0faf ,_r8(RD) ,MD,MB,MI,MS ))
1186    
1187     #define IMULLirr(IM,RS,RD) (_REXLrr(RS, RD), _Os_Mrm_sL (0x69 ,_b11,_r4(RS),_r4(RD) ,IM ))
1188     #define IMULLimr(IM,MD,MB,MI,MS,RD) (_REXLmr(MB, MI, RD), _Os_r_X_sL (0x69 ,_r4(RD) ,MD,MB,MI,MS ,IM ))
1189    
1190     #define IMULQirr(IM,RS,RD) (_REXQrr(RS, RD), _Os_Mrm_sL (0x69 ,_b11,_r8(RS),_r8(RD) ,IM ))
1191     #define IMULQimr(IM,MD,MB,MI,MS,RD) (_REXQmr(MB, MI, RD), _Os_r_X_sL (0x69 ,_r8(RD) ,MD,MB,MI,MS ,IM ))
1192    
1193    
1194     /* --- Control Flow related instructions ----------------------------------- */
1195    
1196 gbeauche 1.5 enum {
1197     X86_CC_O = 0x0,
1198     X86_CC_NO = 0x1,
1199     X86_CC_NAE = 0x2,
1200     X86_CC_B = 0x2,
1201     X86_CC_C = 0x2,
1202     X86_CC_AE = 0x3,
1203     X86_CC_NB = 0x3,
1204     X86_CC_NC = 0x3,
1205     X86_CC_E = 0x4,
1206     X86_CC_Z = 0x4,
1207     X86_CC_NE = 0x5,
1208     X86_CC_NZ = 0x5,
1209     X86_CC_BE = 0x6,
1210     X86_CC_NA = 0x6,
1211     X86_CC_A = 0x7,
1212     X86_CC_NBE = 0x7,
1213     X86_CC_S = 0x8,
1214     X86_CC_NS = 0x9,
1215     X86_CC_P = 0xa,
1216     X86_CC_PE = 0xa,
1217     X86_CC_NP = 0xb,
1218     X86_CC_PO = 0xb,
1219     X86_CC_L = 0xc,
1220     X86_CC_NGE = 0xc,
1221     X86_CC_GE = 0xd,
1222     X86_CC_NL = 0xd,
1223     X86_CC_LE = 0xe,
1224     X86_CC_NG = 0xe,
1225     X86_CC_G = 0xf,
1226     X86_CC_NLE = 0xf,
1227     };
1228    
1229 gbeauche 1.1 /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1230    
1231     // FIXME: no prefix is availble to encode a 32-bit operand size in 64-bit mode
1232     #define CALLm(M) _O_D32 (0xe8 ,(int)(M) )
1233 gbeauche 1.13 #define _CALLLsr(R) (_REXLrr(0, R), _O_Mrm (0xff ,_b11,_b010,_r4(R) ))
1234     #define _CALLQsr(R) (_REXQrr(0, R), _O_Mrm (0xff ,_b11,_b010,_r8(R) ))
1235     #define CALLsr(R) ( X86_TARGET_64BIT ? _CALLQsr(R) : _CALLLsr(R))
1236 gbeauche 1.1 #define CALLsm(D,B,I,S) (_REXLrm(0, B, I), _O_r_X (0xff ,_b010 ,(int)(D),B,I,S ))
1237    
1238     // FIXME: no prefix is availble to encode a 32-bit operand size in 64-bit mode
1239 gbeauche 1.13 #define JMPSm(M) _O_D8 (0xeb ,(int)(M) )
1240     #define JMPm(M) _O_D32 (0xe9 ,(int)(M) )
1241     #define _JMPLsr(R) (_REXLrr(0, R), _O_Mrm (0xff ,_b11,_b100,_r4(R) ))
1242     #define _JMPQsr(R) (_REXQrr(0, R), _O_Mrm (0xff ,_b11,_b100,_r8(R) ))
1243     #define JMPsr(R) ( X86_TARGET_64BIT ? _JMPQsr(R) : _JMPLsr(R))
1244 gbeauche 1.1 #define JMPsm(D,B,I,S) (_REXLrm(0, B, I), _O_r_X (0xff ,_b100 ,(int)(D),B,I,S ))
1245    
1246     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1247 gbeauche 1.10 #define JCCSii(CC, D) _O_B (0x70|(CC) ,(_sc)(int)(D) )
1248 gbeauche 1.1 #define JCCSim(CC, D) _O_D8 (0x70|(CC) ,(int)(D) )
1249     #define JOSm(D) JCCSim(0x0, D)
1250     #define JNOSm(D) JCCSim(0x1, D)
1251     #define JBSm(D) JCCSim(0x2, D)
1252     #define JNAESm(D) JCCSim(0x2, D)
1253     #define JNBSm(D) JCCSim(0x3, D)
1254     #define JAESm(D) JCCSim(0x3, D)
1255     #define JESm(D) JCCSim(0x4, D)
1256     #define JZSm(D) JCCSim(0x4, D)
1257     #define JNESm(D) JCCSim(0x5, D)
1258     #define JNZSm(D) JCCSim(0x5, D)
1259     #define JBESm(D) JCCSim(0x6, D)
1260     #define JNASm(D) JCCSim(0x6, D)
1261     #define JNBESm(D) JCCSim(0x7, D)
1262     #define JASm(D) JCCSim(0x7, D)
1263     #define JSSm(D) JCCSim(0x8, D)
1264     #define JNSSm(D) JCCSim(0x9, D)
1265     #define JPSm(D) JCCSim(0xa, D)
1266     #define JPESm(D) JCCSim(0xa, D)
1267     #define JNPSm(D) JCCSim(0xb, D)
1268     #define JPOSm(D) JCCSim(0xb, D)
1269     #define JLSm(D) JCCSim(0xc, D)
1270     #define JNGESm(D) JCCSim(0xc, D)
1271     #define JNLSm(D) JCCSim(0xd, D)
1272     #define JGESm(D) JCCSim(0xd, D)
1273     #define JLESm(D) JCCSim(0xe, D)
1274     #define JNGSm(D) JCCSim(0xe, D)
1275     #define JNLESm(D) JCCSim(0xf, D)
1276     #define JGSm(D) JCCSim(0xf, D)
1277    
1278     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1279 gbeauche 1.10 #define JCCii(CC, D) _OO_L (0x0f80|(CC) ,(int)(D) )
1280 gbeauche 1.1 #define JCCim(CC, D) _OO_D32 (0x0f80|(CC) ,(int)(D) )
1281     #define JOm(D) JCCim(0x0, D)
1282     #define JNOm(D) JCCim(0x1, D)
1283     #define JBm(D) JCCim(0x2, D)
1284     #define JNAEm(D) JCCim(0x2, D)
1285     #define JNBm(D) JCCim(0x3, D)
1286     #define JAEm(D) JCCim(0x3, D)
1287     #define JEm(D) JCCim(0x4, D)
1288     #define JZm(D) JCCim(0x4, D)
1289     #define JNEm(D) JCCim(0x5, D)
1290     #define JNZm(D) JCCim(0x5, D)
1291     #define JBEm(D) JCCim(0x6, D)
1292     #define JNAm(D) JCCim(0x6, D)
1293     #define JNBEm(D) JCCim(0x7, D)
1294     #define JAm(D) JCCim(0x7, D)
1295     #define JSm(D) JCCim(0x8, D)
1296     #define JNSm(D) JCCim(0x9, D)
1297     #define JPm(D) JCCim(0xa, D)
1298     #define JPEm(D) JCCim(0xa, D)
1299     #define JNPm(D) JCCim(0xb, D)
1300     #define JPOm(D) JCCim(0xb, D)
1301     #define JLm(D) JCCim(0xc, D)
1302     #define JNGEm(D) JCCim(0xc, D)
1303     #define JNLm(D) JCCim(0xd, D)
1304     #define JGEm(D) JCCim(0xd, D)
1305     #define JLEm(D) JCCim(0xe, D)
1306     #define JNGm(D) JCCim(0xe, D)
1307     #define JNLEm(D) JCCim(0xf, D)
1308     #define JGm(D) JCCim(0xf, D)
1309    
1310     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1311     #define SETCCir(CC, RD) (_REXBrr(0, RD), _OO_Mrm (0x0f90|(CC) ,_b11,_b000,_r1(RD) ))
1312     #define SETOr(RD) SETCCir(0x0,RD)
1313     #define SETNOr(RD) SETCCir(0x1,RD)
1314     #define SETBr(RD) SETCCir(0x2,RD)
1315     #define SETNAEr(RD) SETCCir(0x2,RD)
1316     #define SETNBr(RD) SETCCir(0x3,RD)
1317     #define SETAEr(RD) SETCCir(0x3,RD)
1318     #define SETEr(RD) SETCCir(0x4,RD)
1319     #define SETZr(RD) SETCCir(0x4,RD)
1320     #define SETNEr(RD) SETCCir(0x5,RD)
1321     #define SETNZr(RD) SETCCir(0x5,RD)
1322     #define SETBEr(RD) SETCCir(0x6,RD)
1323     #define SETNAr(RD) SETCCir(0x6,RD)
1324     #define SETNBEr(RD) SETCCir(0x7,RD)
1325     #define SETAr(RD) SETCCir(0x7,RD)
1326     #define SETSr(RD) SETCCir(0x8,RD)
1327     #define SETNSr(RD) SETCCir(0x9,RD)
1328     #define SETPr(RD) SETCCir(0xa,RD)
1329     #define SETPEr(RD) SETCCir(0xa,RD)
1330     #define SETNPr(RD) SETCCir(0xb,RD)
1331     #define SETPOr(RD) SETCCir(0xb,RD)
1332     #define SETLr(RD) SETCCir(0xc,RD)
1333     #define SETNGEr(RD) SETCCir(0xc,RD)
1334     #define SETNLr(RD) SETCCir(0xd,RD)
1335     #define SETGEr(RD) SETCCir(0xd,RD)
1336     #define SETLEr(RD) SETCCir(0xe,RD)
1337     #define SETNGr(RD) SETCCir(0xe,RD)
1338     #define SETNLEr(RD) SETCCir(0xf,RD)
1339     #define SETGr(RD) SETCCir(0xf,RD)
1340    
1341     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1342     #define SETCCim(CC,MD,MB,MI,MS) (_REXBrm(0, MB, MI), _OO_r_X (0x0f90|(CC) ,_b000 ,MD,MB,MI,MS ))
1343     #define SETOm(D, B, I, S) SETCCim(0x0, D, B, I, S)
1344     #define SETNOm(D, B, I, S) SETCCim(0x1, D, B, I, S)
1345     #define SETBm(D, B, I, S) SETCCim(0x2, D, B, I, S)
1346     #define SETNAEm(D, B, I, S) SETCCim(0x2, D, B, I, S)
1347     #define SETNBm(D, B, I, S) SETCCim(0x3, D, B, I, S)
1348     #define SETAEm(D, B, I, S) SETCCim(0x3, D, B, I, S)
1349     #define SETEm(D, B, I, S) SETCCim(0x4, D, B, I, S)
1350     #define SETZm(D, B, I, S) SETCCim(0x4, D, B, I, S)
1351     #define SETNEm(D, B, I, S) SETCCim(0x5, D, B, I, S)
1352     #define SETNZm(D, B, I, S) SETCCim(0x5, D, B, I, S)
1353     #define SETBEm(D, B, I, S) SETCCim(0x6, D, B, I, S)
1354     #define SETNAm(D, B, I, S) SETCCim(0x6, D, B, I, S)
1355     #define SETNBEm(D, B, I, S) SETCCim(0x7, D, B, I, S)
1356     #define SETAm(D, B, I, S) SETCCim(0x7, D, B, I, S)
1357     #define SETSm(D, B, I, S) SETCCim(0x8, D, B, I, S)
1358     #define SETNSm(D, B, I, S) SETCCim(0x9, D, B, I, S)
1359     #define SETPm(D, B, I, S) SETCCim(0xa, D, B, I, S)
1360     #define SETPEm(D, B, I, S) SETCCim(0xa, D, B, I, S)
1361     #define SETNPm(D, B, I, S) SETCCim(0xb, D, B, I, S)
1362     #define SETPOm(D, B, I, S) SETCCim(0xb, D, B, I, S)
1363     #define SETLm(D, B, I, S) SETCCim(0xc, D, B, I, S)
1364     #define SETNGEm(D, B, I, S) SETCCim(0xc, D, B, I, S)
1365     #define SETNLm(D, B, I, S) SETCCim(0xd, D, B, I, S)
1366     #define SETGEm(D, B, I, S) SETCCim(0xd, D, B, I, S)
1367     #define SETLEm(D, B, I, S) SETCCim(0xe, D, B, I, S)
1368     #define SETNGm(D, B, I, S) SETCCim(0xe, D, B, I, S)
1369     #define SETNLEm(D, B, I, S) SETCCim(0xf, D, B, I, S)
1370     #define SETGm(D, B, I, S) SETCCim(0xf, D, B, I, S)
1371    
1372 gbeauche 1.5 /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1373     #define CMOVWrr(CC,RS,RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0f40|(CC) ,_b11,_r2(RD),_r2(RS) ))
1374     #define CMOVWmr(CC,MD,MB,MI,MS,RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0f40|(CC) ,_r2(RD) ,MD,MB,MI,MS ))
1375     #define CMOVLrr(CC,RS,RD) (_REXLrr(RD, RS), _OO_Mrm (0x0f40|(CC) ,_b11,_r4(RD),_r4(RS) ))
1376     #define CMOVLmr(CC,MD,MB,MI,MS,RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0f40|(CC) ,_r4(RD) ,MD,MB,MI,MS ))
1377     #define CMOVQrr(CC,RS,RD) (_REXQrr(RD, RS), _OO_Mrm (0x0f40|(CC) ,_b11,_r8(RD),_r8(RS) ))
1378     #define CMOVQmr(CC,MD,MB,MI,MS,RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0f40|(CC) ,_r8(RD) ,MD,MB,MI,MS ))
1379    
1380 gbeauche 1.1
1381     /* --- Push/Pop instructions ----------------------------------------------- */
1382    
1383     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1384    
1385     #define POPWr(RD) _m32only((_d16(), _Or (0x58,_r2(RD) )))
1386     #define POPWm(MD, MB, MI, MS) _m32only((_d16(), _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS )))
1387    
1388     #define POPLr(RD) _m32only( _Or (0x58,_r4(RD) ))
1389     #define POPLm(MD, MB, MI, MS) _m32only( _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS ))
1390    
1391 gbeauche 1.13 #define POPQr(RD) _m64only((_REXQr(RD), _Or (0x58,_r8(RD) )))
1392     #define POPQm(MD, MB, MI, MS) _m64only((_REXQm(MB, MI), _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS )))
1393 gbeauche 1.1
1394     #define PUSHWr(RS) _m32only((_d16(), _Or (0x50,_r2(RS) )))
1395     #define PUSHWm(MD, MB, MI, MS) _m32only((_d16(), _O_r_X (0xff, ,_b110 ,MD,MB,MI,MS )))
1396     #define PUSHWi(IM) _m32only((_d16(), _Os_sW (0x68 ,IM )))
1397    
1398     #define PUSHLr(RS) _m32only( _Or (0x50,_r4(RS) ))
1399     #define PUSHLm(MD, MB, MI, MS) _m32only( _O_r_X (0xff ,_b110 ,MD,MB,MI,MS ))
1400     #define PUSHLi(IM) _m32only( _Os_sL (0x68 ,IM ))
1401    
1402 gbeauche 1.13 #define PUSHQr(RS) _m64only((_REXQr(RS), _Or (0x50,_r8(RS) )))
1403     #define PUSHQm(MD, MB, MI, MS) _m64only((_REXQm(MB, MI), _O_r_X (0xff ,_b110 ,MD,MB,MI,MS )))
1404 gbeauche 1.1 #define PUSHQi(IM) _m64only( _Os_sL (0x68 ,IM ))
1405    
1406     #define POPA() (_d16(), _O (0x61 ))
1407     #define POPAD() _O (0x61 )
1408    
1409     #define PUSHA() (_d16(), _O (0x60 ))
1410     #define PUSHAD() _O (0x60 )
1411    
1412 gbeauche 1.11 #define POPF() _O (0x9d )
1413 gbeauche 1.1 #define PUSHF() _O (0x9c )
1414    
1415    
1416     /* --- Test instructions --------------------------------------------------- */
1417    
1418     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1419    
1420     #define TESTBrr(RS, RD) (_REXBrr(RS, RD), _O_Mrm (0x84 ,_b11,_r1(RS),_r1(RD) ))
1421     #define TESTBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (0x84 ,_r1(RS) ,MD,MB,MI,MS ))
1422 gbeauche 1.10 #define TESTBir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AL) ? \
1423     (_REXBrr(0, RD), _O_B (0xa8 ,_u8(IM))) : \
1424     (_REXBrr(0, RD), _O_Mrm_B (0xf6 ,_b11,_b000 ,_r1(RD) ,_u8(IM))) )
1425 gbeauche 1.1 #define TESTBim(IM, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X_B (0xf6 ,_b000 ,MD,MB,MI,MS ,_u8(IM)))
1426    
1427     #define TESTWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (0x85 ,_b11,_r2(RS),_r2(RD) ))
1428 gbeauche 1.11 #define TESTWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0x85 ,_r2(RS) ,MD,MB,MI,MS ))
1429 gbeauche 1.10 #define TESTWir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AX) ? \
1430     (_d16(), _REXLrr(0, RD), _O_W (0xa9 ,_u16(IM))) : \
1431     (_d16(), _REXLrr(0, RD), _O_Mrm_W (0xf7 ,_b11,_b000 ,_r2(RD) ,_u16(IM))) )
1432 gbeauche 1.11 #define TESTWim(IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_r_X_W (0xf7 ,_b000 ,MD,MB,MI,MS ,_u16(IM)))
1433 gbeauche 1.1
1434     #define TESTLrr(RS, RD) (_REXLrr(RS, RD), _O_Mrm (0x85 ,_b11,_r4(RS),_r4(RD) ))
1435     #define TESTLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (0x85 ,_r4(RS) ,MD,MB,MI,MS ))
1436 gbeauche 1.10 #define TESTLir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_EAX) ? \
1437     (_REXLrr(0, RD), _O_L (0xa9 ,IM )) : \
1438     (_REXLrr(0, RD), _O_Mrm_L (0xf7 ,_b11,_b000 ,_r4(RD) ,IM )) )
1439 gbeauche 1.1 #define TESTLim(IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_r_X_L (0xf7 ,_b000 ,MD,MB,MI,MS ,IM ))
1440    
1441     #define TESTQrr(RS, RD) (_REXQrr(RS, RD), _O_Mrm (0x85 ,_b11,_r8(RS),_r8(RD) ))
1442     #define TESTQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (0x85 ,_r8(RS) ,MD,MB,MI,MS ))
1443 gbeauche 1.10 #define TESTQir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_RAX) ? \
1444     (_REXQrr(0, RD), _O_L (0xa9 ,IM )) : \
1445     (_REXQrr(0, RD), _O_Mrm_L (0xf7 ,_b11,_b000 ,_r8(RD) ,IM )) )
1446 gbeauche 1.1 #define TESTQim(IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_r_X_L (0xf7 ,_b000 ,MD,MB,MI,MS ,IM ))
1447    
1448    
1449     /* --- Exchange instructions ----------------------------------------------- */
1450    
1451     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1452    
1453     #define CMPXCHGBrr(RS, RD) (_REXBrr(RS, RD), _OO_Mrm (0x0fb0 ,_b11,_r1(RS),_r1(RD) ))
1454     #define CMPXCHGBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _OO_r_X (0x0fb0 ,_r1(RS) ,MD,MB,MI,MS ))
1455    
1456     #define CMPXCHGWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0fb1 ,_b11,_r2(RS),_r2(RD) ))
1457     #define CMPXCHGWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _OO_r_X (0x0fb1 ,_r2(RS) ,MD,MB,MI,MS ))
1458    
1459     #define CMPXCHGLrr(RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0fb1 ,_b11,_r4(RS),_r4(RD) ))
1460     #define CMPXCHGLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0fb1 ,_r4(RS) ,MD,MB,MI,MS ))
1461    
1462     #define CMPXCHGQrr(RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0fb1 ,_b11,_r8(RS),_r8(RD) ))
1463     #define CMPXCHGQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0fb1 ,_r8(RS) ,MD,MB,MI,MS ))
1464    
1465     #define XADDBrr(RS, RD) (_REXBrr(RS, RD), _OO_Mrm (0x0fc0 ,_b11,_r1(RS),_r1(RD) ))
1466     #define XADDBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _OO_r_X (0x0fc0 ,_r1(RS) ,MD,MB,MI,MS ))
1467    
1468     #define XADDWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0fc1 ,_b11,_r2(RS),_r2(RD) ))
1469     #define XADDWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _OO_r_X (0x0fc1 ,_r2(RS) ,MD,MB,MI,MS ))
1470    
1471     #define XADDLrr(RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0fc1 ,_b11,_r4(RS),_r4(RD) ))
1472     #define XADDLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0fc1 ,_r4(RS) ,MD,MB,MI,MS ))
1473    
1474     #define XADDQrr(RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0fc1 ,_b11,_r8(RS),_r8(RD) ))
1475     #define XADDQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0fc1 ,_r8(RS) ,MD,MB,MI,MS ))
1476    
1477     #define XCHGBrr(RS, RD) (_REXBrr(RS, RD), _O_Mrm (0x86 ,_b11,_r1(RS),_r1(RD) ))
1478     #define XCHGBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (0x86 ,_r1(RS) ,MD,MB,MI,MS ))
1479    
1480     #define XCHGWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (0x87 ,_b11,_r2(RS),_r2(RD) ))
1481     #define XCHGWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0x87 ,_r2(RS) ,MD,MB,MI,MS ))
1482    
1483     #define XCHGLrr(RS, RD) (_REXLrr(RS, RD), _O_Mrm (0x87 ,_b11,_r4(RS),_r4(RD) ))
1484     #define XCHGLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (0x87 ,_r4(RS) ,MD,MB,MI,MS ))
1485    
1486     #define XCHGQrr(RS, RD) (_REXQrr(RS, RD), _O_Mrm (0x87 ,_b11,_r8(RS),_r8(RD) ))
1487     #define XCHGQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (0x87 ,_r8(RS) ,MD,MB,MI,MS ))
1488    
1489    
1490     /* --- Increment/Decrement instructions ------------------------------------ */
1491    
1492     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1493    
1494     #define DECBm(MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X (0xfe ,_b001 ,MD,MB,MI,MS ))
1495     #define DECBr(RD) (_REXBrr(0, RD), _O_Mrm (0xfe ,_b11,_b001 ,_r1(RD) ))
1496    
1497     #define DECWm(MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ))
1498     #define DECWr(RD) (! X86_TARGET_64BIT ? (_d16(), _Or (0x48,_r2(RD) )) : \
1499     (_d16(), _REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r2(RD) )))
1500    
1501     #define DECLm(MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ))
1502     #define DECLr(RD) (! X86_TARGET_64BIT ? _Or (0x48,_r4(RD) ) : \
1503     (_REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r4(RD) )))
1504    
1505     #define DECQm(MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ))
1506     #define DECQr(RD) (_REXQrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r8(RD) ))
1507    
1508     #define INCBm(MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X (0xfe ,_b000 ,MD,MB,MI,MS ))
1509     #define INCBr(RD) (_REXBrr(0, RD), _O_Mrm (0xfe ,_b11,_b000 ,_r1(RD) ))
1510    
1511     #define INCWm(MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ))
1512     #define INCWr(RD) (! X86_TARGET_64BIT ? (_d16(), _Or (0x40,_r2(RD) )) : \
1513     (_d16(), _REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b000 ,_r2(RD) )) )
1514    
1515     #define INCLm(MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ))
1516     #define INCLr(RD) (! X86_TARGET_64BIT ? _Or (0x40,_r4(RD) ) : \
1517     (_REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b000 ,_r4(RD) )))
1518    
1519     #define INCQm(MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ))
1520     #define INCQr(RD) (_REXQrr(0, RD), _O_Mrm (0xff ,_b11,_b000 ,_r8(RD) ))
1521    
1522    
1523 gbeauche 1.5 /* --- Misc instructions --------------------------------------------------- */
1524    
1525     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1526    
1527     #define BSFWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0fbc ,_b11,_r2(RD),_r2(RS) ))
1528     #define BSFWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fbc ,_r2(RD) ,MD,MB,MI,MS ))
1529     #define BSRWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0fbd ,_b11,_r2(RD),_r2(RS) ))
1530     #define BSRWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fbd ,_r2(RD) ,MD,MB,MI,MS ))
1531    
1532     #define BSFLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fbc ,_b11,_r4(RD),_r4(RS) ))
1533     #define BSFLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbc ,_r4(RD) ,MD,MB,MI,MS ))
1534     #define BSRLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fbd ,_b11,_r4(RD),_r4(RS) ))
1535     #define BSRLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbd ,_r4(RD) ,MD,MB,MI,MS ))
1536    
1537     #define BSFQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbc ,_b11,_r8(RD),_r8(RS) ))
1538     #define BSFQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbc ,_r8(RD) ,MD,MB,MI,MS ))
1539     #define BSRQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbd ,_b11,_r8(RD),_r8(RS) ))
1540     #define BSRQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbd ,_r8(RD) ,MD,MB,MI,MS ))
1541 gbeauche 1.1
1542     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1543    
1544 gbeauche 1.7 #define MOVSBWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0fbe ,_b11,_r2(RD),_r1(RS) ))
1545     #define MOVSBWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fbe ,_r2(RD) ,MD,MB,MI,MS ))
1546     #define MOVZBWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0fb6 ,_b11,_r2(RD),_r1(RS) ))
1547     #define MOVZBWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fb6 ,_r2(RD) ,MD,MB,MI,MS ))
1548    
1549 gbeauche 1.14 #define MOVSBLrr(RS, RD) (_REXBLrr(RD, RS), _OO_Mrm (0x0fbe ,_b11,_r4(RD),_r1(RS) ))
1550 gbeauche 1.7 #define MOVSBLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbe ,_r4(RD) ,MD,MB,MI,MS ))
1551 gbeauche 1.14 #define MOVZBLrr(RS, RD) (_REXBLrr(RD, RS), _OO_Mrm (0x0fb6 ,_b11,_r4(RD),_r1(RS) ))
1552 gbeauche 1.7 #define MOVZBLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fb6 ,_r4(RD) ,MD,MB,MI,MS ))
1553    
1554     #define MOVSBQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbe ,_b11,_r8(RD),_r1(RS) ))
1555     #define MOVSBQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbe ,_r8(RD) ,MD,MB,MI,MS ))
1556     #define MOVZBQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fb6 ,_b11,_r8(RD),_r1(RS) ))
1557     #define MOVZBQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fb6 ,_r8(RD) ,MD,MB,MI,MS ))
1558    
1559     #define MOVSWLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fbf ,_b11,_r4(RD),_r2(RS) ))
1560     #define MOVSWLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbf ,_r4(RD) ,MD,MB,MI,MS ))
1561     #define MOVZWLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fb7 ,_b11,_r4(RD),_r2(RS) ))
1562     #define MOVZWLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fb7 ,_r4(RD) ,MD,MB,MI,MS ))
1563    
1564     #define MOVSWQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbf ,_b11,_r8(RD),_r2(RS) ))
1565     #define MOVSWQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbf ,_r8(RD) ,MD,MB,MI,MS ))
1566     #define MOVZWQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fb7 ,_b11,_r8(RD),_r2(RS) ))
1567     #define MOVZWQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fb7 ,_r8(RD) ,MD,MB,MI,MS ))
1568    
1569     #define MOVSLQrr(RS, RD) _m64only((_REXQrr(RD, RS), _O_Mrm (0x63 ,_b11,_r8(RD),_r4(RS) )))
1570     #define MOVSLQmr(MD, MB, MI, MS, RD) _m64only((_REXQmr(MB, MI, RD), _O_r_X (0x63 ,_r8(RD) ,MD,MB,MI,MS )))
1571    
1572     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1573    
1574 gbeauche 1.1 #define LEALmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _O_r_X (0x8d ,_r4(RD) ,MD,MB,MI,MS ))
1575    
1576     #define BSWAPLr(R) (_REXLrr(0, R), _OOr (0x0fc8,_r4(R) ))
1577     #define BSWAPQr(R) (_REXQrr(0, R), _OOr (0x0fc8,_r8(R) ))
1578    
1579     #define CLC() _O (0xf8 )
1580     #define STC() _O (0xf9 )
1581    
1582     #define CMC() _O (0xf5 )
1583     #define CLD() _O (0xfc )
1584     #define STD() _O (0xfd )
1585    
1586     #define CBTW() (_d16(), _O (0x98 ))
1587     #define CWTL() _O (0x98 )
1588     #define CLTQ() _m64only(_REXQrr(0, 0), _O (0x98 ))
1589    
1590     #define CBW CBTW
1591     #define CWDE CWTL
1592     #define CDQE CLTQ
1593    
1594     #define CWTD() (_d16(), _O (0x99 ))
1595     #define CLTD() _O (0x99 )
1596     #define CQTO() _m64only(_REXQrr(0, 0), _O (0x99 ))
1597    
1598     #define CWD CWTD
1599     #define CDQ CLTD
1600     #define CQO CQTO
1601    
1602     #define LAHF() _m32only( _O (0x9f ))
1603     #define SAHF() _m32only( _O (0x9e ))
1604    
1605 gbeauche 1.2 /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1606    
1607 gbeauche 1.6 #define CPUID() _OO (0x0fa2 )
1608 gbeauche 1.1 #define RDTSC() _OO (0xff31 )
1609    
1610     #define ENTERii(W, B) _O_W_B (0xc8 ,_su16(W),_su8(B))
1611    
1612     #define LEAVE() _O (0xc9 )
1613     #define RET() _O (0xc3 )
1614     #define RETi(IM) _O_W (0xc2 ,_su16(IM))
1615    
1616     #define NOP() _O (0x90 )
1617 gbeauche 1.3
1618    
1619     /* --- Media 128-bit instructions ------------------------------------------ */
1620    
1621     enum {
1622     X86_SSE_CVTIS = 0x2a,
1623     X86_SSE_CVTSI = 0x2d,
1624     X86_SSE_UCOMI = 0x2e,
1625     X86_SSE_COMI = 0x2f,
1626     X86_SSE_SQRT = 0x51,
1627     X86_SSE_RSQRT = 0x52,
1628     X86_SSE_RCP = 0x53,
1629     X86_SSE_AND = 0x54,
1630     X86_SSE_ANDN = 0x55,
1631     X86_SSE_OR = 0x56,
1632     X86_SSE_XOR = 0x57,
1633     X86_SSE_ADD = 0x58,
1634     X86_SSE_MUL = 0x59,
1635     X86_SSE_CVTSD = 0x5a,
1636     X86_SSE_CVTDT = 0x5b,
1637     X86_SSE_SUB = 0x5c,
1638     X86_SSE_MIN = 0x5d,
1639     X86_SSE_DIV = 0x5e,
1640     X86_SSE_MAX = 0x5f,
1641     };
1642    
1643     /* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
1644    
1645     #define __SSELrr(OP,RS,RSA,RD,RDA) (_REXLrr(RD, RS), _OO_Mrm (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ))
1646     #define __SSELmr(OP,MD,MB,MI,MS,RD,RDA) (_REXLmr(MB, MI, RD), _OO_r_X (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
1647     #define __SSELrm(OP,RS,RSA,MD,MB,MI,MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0f00|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
1648    
1649     #define __SSEQrr(OP,RS,RSA,RD,RDA) (_REXQrr(RD, RS), _OO_Mrm (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ))
1650     #define __SSEQmr(OP,MD,MB,MI,MS,RD,RDA) (_REXQmr(MB, MI, RD), _OO_r_X (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
1651     #define __SSEQrm(OP,RS,RSA,MD,MB,MI,MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0f00|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
1652    
1653     #define _SSELrr(PX,OP,RS,RSA,RD,RDA) (_B(PX), __SSELrr(OP, RS, RSA, RD, RDA))
1654     #define _SSELmr(PX,OP,MD,MB,MI,MS,RD,RDA) (_B(PX), __SSELmr(OP, MD, MB, MI, MS, RD, RDA))
1655     #define _SSELrm(PX,OP,RS,RSA,MD,MB,MI,MS) (_B(PX), __SSELrm(OP, RS, RSA, MD, MB, MI, MS))
1656    
1657     #define _SSEQrr(PX,OP,RS,RSA,RD,RDA) (_B(PX), __SSEQrr(OP, RS, RSA, RD, RDA))
1658     #define _SSEQmr(PX,OP,MD,MB,MI,MS,RD,RDA) (_B(PX), __SSEQmr(OP, MD, MB, MI, MS, RD, RDA))
1659     #define _SSEQrm(PX,OP,RS,RSA,MD,MB,MI,MS) (_B(PX), __SSEQrm(OP, RS, RSA, MD, MB, MI, MS))
1660    
1661     #define _SSEPSrr(OP,RS,RD) __SSELrr( OP, RS,_rX, RD,_rX)
1662     #define _SSEPSmr(OP,MD,MB,MI,MS,RD) __SSELmr( OP, MD, MB, MI, MS, RD,_rX)
1663     #define _SSEPSrm(OP,RS,MD,MB,MI,MS) __SSELrm( OP, RS,_rX, MD, MB, MI, MS)
1664    
1665     #define _SSEPDrr(OP,RS,RD) _SSELrr(0x66, OP, RS,_rX, RD,_rX)
1666     #define _SSEPDmr(OP,MD,MB,MI,MS,RD) _SSELmr(0x66, OP, MD, MB, MI, MS, RD,_rX)
1667     #define _SSEPDrm(OP,RS,MD,MB,MI,MS) _SSELrm(0x66, OP, RS,_rX, MD, MB, MI, MS)
1668    
1669     #define _SSESSrr(OP,RS,RD) _SSELrr(0xf3, OP, RS,_rX, RD,_rX)
1670     #define _SSESSmr(OP,MD,MB,MI,MS,RD) _SSELmr(0xf3, OP, MD, MB, MI, MS, RD,_rX)
1671     #define _SSESSrm(OP,RS,MD,MB,MI,MS) _SSELrm(0xf3, OP, RS,_rX, MD, MB, MI, MS)
1672    
1673     #define _SSESDrr(OP,RS,RD) _SSELrr(0xf2, OP, RS,_rX, RD,_rX)
1674     #define _SSESDmr(OP,MD,MB,MI,MS,RD) _SSELmr(0xf2, OP, MD, MB, MI, MS, RD,_rX)
1675     #define _SSESDrm(OP,RS,MD,MB,MI,MS) _SSELrm(0xf2, OP, RS,_rX, MD, MB, MI, MS)
1676    
1677     #define ADDPSrr(RS, RD) _SSEPSrr(X86_SSE_ADD, RS, RD)
1678     #define ADDPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
1679     #define ADDPDrr(RS, RD) _SSEPDrr(X86_SSE_ADD, RS, RD)
1680     #define ADDPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
1681    
1682     #define ADDSSrr(RS, RD) _SSESSrr(X86_SSE_ADD, RS, RD)
1683     #define ADDSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
1684     #define ADDSDrr(RS, RD) _SSESDrr(X86_SSE_ADD, RS, RD)
1685     #define ADDSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
1686    
1687     #define ANDNPSrr(RS, RD) _SSEPSrr(X86_SSE_ANDN, RS, RD)
1688     #define ANDNPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_ANDN, MD, MB, MI, MS, RD)
1689     #define ANDNPDrr(RS, RD) _SSEPDrr(X86_SSE_ANDN, RS, RD)
1690     #define ANDNPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_ANDN, MD, MB, MI, MS, RD)
1691    
1692     #define ANDPSrr(RS, RD) _SSEPSrr(X86_SSE_AND, RS, RD)
1693     #define ANDPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_AND, MD, MB, MI, MS, RD)
1694     #define ANDPDrr(RS, RD) _SSEPDrr(X86_SSE_AND, RS, RD)
1695     #define ANDPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_AND, MD, MB, MI, MS, RD)
1696    
1697     #define DIVPSrr(RS, RD) _SSEPSrr(X86_SSE_DIV, RS, RD)
1698     #define DIVPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
1699     #define DIVPDrr(RS, RD) _SSEPDrr(X86_SSE_DIV, RS, RD)
1700     #define DIVPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
1701    
1702     #define DIVSSrr(RS, RD) _SSESSrr(X86_SSE_DIV, RS, RD)
1703     #define DIVSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
1704     #define DIVSDrr(RS, RD) _SSESDrr(X86_SSE_DIV, RS, RD)
1705     #define DIVSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
1706    
1707     #define MAXPSrr(RS, RD) _SSEPSrr(X86_SSE_MAX, RS, RD)
1708     #define MAXPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
1709     #define MAXPDrr(RS, RD) _SSEPDrr(X86_SSE_MAX, RS, RD)
1710     #define MAXPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
1711    
1712     #define MAXSSrr(RS, RD) _SSESSrr(X86_SSE_MAX, RS, RD)
1713     #define MAXSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
1714     #define MAXSDrr(RS, RD) _SSESDrr(X86_SSE_MAX, RS, RD)
1715     #define MAXSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
1716    
1717     #define MINPSrr(RS, RD) _SSEPSrr(X86_SSE_MIN, RS, RD)
1718     #define MINPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
1719     #define MINPDrr(RS, RD) _SSEPDrr(X86_SSE_MIN, RS, RD)
1720     #define MINPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
1721    
1722     #define MINSSrr(RS, RD) _SSESSrr(X86_SSE_MIN, RS, RD)
1723     #define MINSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
1724     #define MINSDrr(RS, RD) _SSESDrr(X86_SSE_MIN, RS, RD)
1725     #define MINSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
1726    
1727     #define MULPSrr(RS, RD) _SSEPSrr(X86_SSE_MUL, RS, RD)
1728     #define MULPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
1729     #define MULPDrr(RS, RD) _SSEPDrr(X86_SSE_MUL, RS, RD)
1730     #define MULPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
1731    
1732     #define MULSSrr(RS, RD) _SSESSrr(X86_SSE_MUL, RS, RD)
1733     #define MULSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
1734     #define MULSDrr(RS, RD) _SSESDrr(X86_SSE_MUL, RS, RD)
1735     #define MULSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
1736    
1737     #define ORPSrr(RS, RD) _SSEPSrr(X86_SSE_OR, RS, RD)
1738     #define ORPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_OR, MD, MB, MI, MS, RD)
1739     #define ORPDrr(RS, RD) _SSEPDrr(X86_SSE_OR, RS, RD)
1740     #define ORPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_OR, MD, MB, MI, MS, RD)
1741    
1742     #define RCPPSrr(RS, RD) _SSEPSrr(X86_SSE_RCP, RS, RD)
1743     #define RCPPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_RCP, MD, MB, MI, MS, RD)
1744     #define RCPSSrr(RS, RD) _SSESSrr(X86_SSE_RCP, RS, RD)
1745     #define RCPSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_RCP, MD, MB, MI, MS, RD)
1746    
1747     #define RSQRTPSrr(RS, RD) _SSEPSrr(X86_SSE_RSQRT, RS, RD)
1748     #define RSQRTPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_RSQRT, MD, MB, MI, MS, RD)
1749     #define RSQRTSSrr(RS, RD) _SSESSrr(X86_SSE_RSQRT, RS, RD)
1750     #define RSQRTSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_RSQRT, MD, MB, MI, MS, RD)
1751    
1752     #define SQRTPSrr(RS, RD) _SSEPSrr(X86_SSE_SQRT, RS, RD)
1753     #define SQRTPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
1754     #define SQRTPDrr(RS, RD) _SSEPDrr(X86_SSE_SQRT, RS, RD)
1755     #define SQRTPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
1756    
1757     #define SQRTSSrr(RS, RD) _SSESSrr(X86_SSE_SQRT, RS, RD)
1758     #define SQRTSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
1759     #define SQRTSDrr(RS, RD) _SSESDrr(X86_SSE_SQRT, RS, RD)
1760     #define SQRTSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
1761    
1762     #define SUBPSrr(RS, RD) _SSEPSrr(X86_SSE_SUB, RS, RD)
1763     #define SUBPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
1764     #define SUBPDrr(RS, RD) _SSEPDrr(X86_SSE_SUB, RS, RD)
1765     #define SUBPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
1766    
1767     #define SUBSSrr(RS, RD) _SSESSrr(X86_SSE_SUB, RS, RD)
1768     #define SUBSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
1769     #define SUBSDrr(RS, RD) _SSESDrr(X86_SSE_SUB, RS, RD)
1770     #define SUBSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
1771    
1772     #define XORPSrr(RS, RD) _SSEPSrr(X86_SSE_XOR, RS, RD)
1773     #define XORPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_XOR, MD, MB, MI, MS, RD)
1774     #define XORPDrr(RS, RD) _SSEPDrr(X86_SSE_XOR, RS, RD)
1775     #define XORPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_XOR, MD, MB, MI, MS, RD)
1776    
1777     #define COMISSrr(RS, RD) _SSESSrr(X86_SSE_COMI, RS, RD)
1778     #define COMISSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_COMI, MD, MB, MI, MS, RD)
1779     #define COMISDrr(RS, RD) _SSESDrr(X86_SSE_COMI, RS, RD)
1780     #define COMISDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_COMI, MD, MB, MI, MS, RD)
1781    
1782     #define UCOMISSrr(RS, RD) _SSESSrr(X86_SSE_UCOMI, RS, RD)
1783     #define UCOMISSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_UCOMI, MD, MB, MI, MS, RD)
1784     #define UCOMISDrr(RS, RD) _SSESDrr(X86_SSE_UCOMI, RS, RD)
1785     #define UCOMISDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_UCOMI, MD, MB, MI, MS, RD)
1786    
1787     #define MOVAPSrr(RS, RD) _SSEPSrr(0x28, RS, RD)
1788     #define MOVAPSmr(MD, MB, MI, MS, RD) _SSEPSmr(0x28, MD, MB, MI, MS, RD)
1789     #define MOVAPSrm(RS, MD, MB, MI, MS) _SSEPSrm(0x29, RS, MD, MB, MI, MS)
1790    
1791     #define MOVAPDrr(RS, RD) _SSEPDrr(0x28, RS, RD)
1792     #define MOVAPDmr(MD, MB, MI, MS, RD) _SSEPDmr(0x28, MD, MB, MI, MS, RD)
1793     #define MOVAPDrm(RS, MD, MB, MI, MS) _SSEPDrm(0x29, RS, MD, MB, MI, MS)
1794    
1795     #define CVTPS2PIrr(RS, RD) __SSELrr( X86_SSE_CVTSI, RS,_rX, RD,_rM)
1796     #define CVTPS2PImr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTSI, MD, MB, MI, MS, RD,_rM)
1797     #define CVTPD2PIrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTSI, RS,_rX, RD,_rM)
1798     #define CVTPD2PImr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTSI, MD, MB, MI, MS, RD,_rM)
1799    
1800     #define CVTPI2PSrr(RS, RD) __SSELrr( X86_SSE_CVTIS, RS,_rM, RD,_rX)
1801     #define CVTPI2PSmr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTIS, MD, MB, MI, MS, RD,_rX)
1802     #define CVTPI2PDrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTIS, RS,_rM, RD,_rX)
1803     #define CVTPI2PDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTIS, MD, MB, MI, MS, RD,_rX)
1804    
1805     #define CVTPS2PDrr(RS, RD) __SSELrr( X86_SSE_CVTSD, RS,_rX, RD,_rX)
1806     #define CVTPS2PDmr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTSD, MD, MB, MI, MS, RD,_rX)
1807     #define CVTPD2PSrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTSD, RS,_rX, RD,_rX)
1808     #define CVTPD2PSmr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTSD, MD, MB, MI, MS, RD,_rX)
1809    
1810     #define CVTSS2SDrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTSD, RS,_rX, RD,_rX)
1811     #define CVTSS2SDmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTSD, MD, MB, MI, MS, RD,_rX)
1812     #define CVTSD2SSrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTSD, RS,_rX, RD,_rX)
1813     #define CVTSD2SSmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTSD, MD, MB, MI, MS, RD,_rX)
1814    
1815     #define CVTSS2SILrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTSI, RS,_rX, RD,_r4)
1816     #define CVTSS2SILmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTSI, MD, MB, MI, MS, RD,_r4)
1817     #define CVTSD2SILrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTSI, RS,_rX, RD,_r4)
1818     #define CVTSD2SILmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTSI, MD, MB, MI, MS, RD,_r4)
1819    
1820     #define CVTSI2SSLrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTIS, RS,_r4, RD,_rX)
1821     #define CVTSI2SSLmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTIS, MD, MB, MI, MS, RD,_rX)
1822     #define CVTSI2SDLrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTIS, RS,_r4, RD,_rX)
1823     #define CVTSI2SDLmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTIS, MD, MB, MI, MS, RD,_rX)
1824    
1825     #define CVTSS2SIQrr(RS, RD) _SSEQrr(0xf3, X86_SSE_CVTSI, RS,_rX, RD,_r8)
1826     #define CVTSS2SIQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf3, X86_SSE_CVTSI, MD, MB, MI, MS, RD,_r8)
1827     #define CVTSD2SIQrr(RS, RD) _SSEQrr(0xf2, X86_SSE_CVTSI, RS,_rX, RD,_r8)
1828     #define CVTSD2SIQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf2, X86_SSE_CVTSI, MD, MB, MI, MS, RD,_r8)
1829    
1830     #define CVTSI2SSQrr(RS, RD) _SSEQrr(0xf3, X86_SSE_CVTIS, RS,_r8, RD,_rX)
1831     #define CVTSI2SSQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf3, X86_SSE_CVTIS, MD, MB, MI, MS, RD,_rX)
1832     #define CVTSI2SDQrr(RS, RD) _SSEQrr(0xf2, X86_SSE_CVTIS, RS,_r8, RD,_rX)
1833     #define CVTSI2SDQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf2, X86_SSE_CVTIS, MD, MB, MI, MS, RD,_rX)
1834    
1835     #define MOVDLXrr(RS, RD) _SSELrr(0x66, 0x6e, RS,_r4, RD,_rX)
1836     #define MOVDLXmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x6e, MD, MB, MI, MS, RD,_rX)
1837     #define MOVDQXrr(RS, RD) _SSEQrr(0x66, 0x6e, RS,_r8, RD,_rX)
1838     #define MOVDQXmr(MD, MB, MI, MS, RD) _SSEQmr(0x66, 0x6e, MD, MB, MI, MS, RD,_rX)
1839    
1840     #define MOVDXLrr(RS, RD) _SSELrr(0x66, 0x7e, RS,_rX, RD,_r4)
1841     #define MOVDXLrm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x7e, RS,_rX, MD, MB, MI, MS)
1842     #define MOVDXQrr(RS, RD) _SSEQrr(0x66, 0x7e, RS,_rX, RD,_r8)
1843     #define MOVDXQrm(RS, MD, MB, MI, MS) _SSEQrm(0x66, 0x7e, RS,_rX, MD, MB, MI, MS)
1844    
1845     #define MOVDLMrr(RS, RD) __SSELrr( 0x6e, RS,_r4, RD,_rM)
1846     #define MOVDLMmr(MD, MB, MI, MS, RD) __SSELmr( 0x6e, MD, MB, MI, MS, RD,_rM)
1847     #define MOVDQMrr(RS, RD) __SSEQrr( 0x6e, RS,_r8, RD,_rM)
1848     #define MOVDQMmr(MD, MB, MI, MS, RD) __SSEQmr( 0x6e, MD, MB, MI, MS, RD,_rM)
1849    
1850     #define MOVDMLrr(RS, RD) __SSELrr( 0x7e, RS,_rM, RD,_r4)
1851     #define MOVDMLrm(RS, MD, MB, MI, MS) __SSELrm( 0x7e, RS,_rM, MD, MB, MI, MS)
1852     #define MOVDMQrr(RS, RD) __SSEQrr( 0x7e, RS,_rM, RD,_r8)
1853     #define MOVDMQrm(RS, MD, MB, MI, MS) __SSEQrm( 0x7e, RS,_rM, MD, MB, MI, MS)
1854    
1855     #define MOVDQ2Qrr(RS, RD) _SSELrr(0xf2, 0xd6, RS,_rX, RD,_rM)
1856     #define MOVHLPSrr(RS, RD) __SSELrr( 0x12, RS,_rX, RD,_rX)
1857     #define MOVLHPSrr(RS, RD) __SSELrr( 0x16, RS,_rX, RD,_rX)
1858    
1859     #define MOVDQArr(RS, RD) _SSELrr(0x66, 0x6f, RS,_rX, RD,_rX)
1860     #define MOVDQAmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x6f, MD, MB, MI, MS, RD,_rX)
1861     #define MOVDQArm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x7f, RS,_rX, MD, MB, MI, MS)
1862    
1863     #define MOVDQUrr(RS, RD) _SSELrr(0xf3, 0x6f, RS,_rX, RD,_rX)
1864     #define MOVDQUmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, 0x6f, MD, MB, MI, MS, RD,_rX)
1865     #define MOVDQUrm(RS, MD, MB, MI, MS) _SSELrm(0xf3, 0x7f, RS,_rX, MD, MB, MI, MS)
1866    
1867     #define MOVHPDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x16, MD, MB, MI, MS, RD,_rX)
1868     #define MOVHPDrm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x17, RS,_rX, MD, MB, MI, MS)
1869     #define MOVHPSmr(MD, MB, MI, MS, RD) __SSELmr( 0x16, MD, MB, MI, MS, RD,_rX)
1870     #define MOVHPSrm(RS, MD, MB, MI, MS) __SSELrm( 0x17, RS,_rX, MD, MB, MI, MS)
1871    
1872     #define MOVLPDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x12, MD, MB, MI, MS, RD,_rX)
1873     #define MOVLPDrm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x13, RS,_rX, MD, MB, MI, MS)
1874     #define MOVLPSmr(MD, MB, MI, MS, RD) __SSELmr( 0x12, MD, MB, MI, MS, RD,_rX)
1875     #define MOVLPSrm(RS, MD, MB, MI, MS) __SSELrm( 0x13, RS,_rX, MD, MB, MI, MS)
1876 gbeauche 1.2
1877    
1878     /* --- FLoating-Point instructions ----------------------------------------- */
1879    
1880     #define _ESCmi(D,B,I,S,OP) (_REXLrm(0,B,I), _O_r_X(0xd8|(OP & 7), (OP >> 3), D,B,I,S))
1881    
1882     #define FLDr(R) _OOr(0xd9c0,_rN(R))
1883     #define FLDLm(D,B,I,S) _ESCmi(D,B,I,S,005)
1884     #define FLDSm(D,B,I,S) _ESCmi(D,B,I,S,001)
1885     #define FLDTm(D,B,I,S) _ESCmi(D,B,I,S,053)
1886    
1887     #define FSTr(R) _OOr(0xddd0,_rN(R))
1888     #define FSTSm(D,B,I,S) _ESCmi(D,B,I,S,021)
1889     #define FSTLm(D,B,I,S) _ESCmi(D,B,I,S,025)
1890    
1891     #define FSTPr(R) _OOr(0xddd8,_rN(R))
1892     #define FSTPSm(D,B,I,S) _ESCmi(D,B,I,S,031)
1893     #define FSTPLm(D,B,I,S) _ESCmi(D,B,I,S,035)
1894     #define FSTPTm(D,B,I,S) _ESCmi(D,B,I,S,073)
1895    
1896     #define FADDr0(R) _OOr(0xd8c0,_rN(R))
1897     #define FADD0r(R) _OOr(0xdcc0,_rN(R))
1898     #define FADDP0r(R) _OOr(0xdec0,_rN(R))
1899     #define FADDSm(D,B,I,S) _ESCmi(D,B,I,S,000)
1900     #define FADDLm(D,B,I,S) _ESCmi(D,B,I,S,004)
1901    
1902     #define FSUBSm(D,B,I,S) _ESCmi(D,B,I,S,040)
1903     #define FSUBLm(D,B,I,S) _ESCmi(D,B,I,S,044)
1904     #define FSUBr0(R) _OOr(0xd8e0,_rN(R))
1905     #define FSUB0r(R) _OOr(0xdce8,_rN(R))
1906     #define FSUBP0r(R) _OOr(0xdee8,_rN(R))
1907    
1908     #define FSUBRr0(R) _OOr(0xd8e8,_rN(R))
1909     #define FSUBR0r(R) _OOr(0xdce0,_rN(R))
1910     #define FSUBRP0r(R) _OOr(0xdee0,_rN(R))
1911     #define FSUBRSm(D,B,I,S) _ESCmi(D,B,I,S,050)
1912     #define FSUBRLm(D,B,I,S) _ESCmi(D,B,I,S,054)
1913    
1914     #define FMULr0(R) _OOr(0xd8c8,_rN(R))
1915     #define FMUL0r(R) _OOr(0xdcc8,_rN(R))
1916     #define FMULP0r(R) _OOr(0xdec8,_rN(R))
1917     #define FMULSm(D,B,I,S) _ESCmi(D,B,I,S,010)
1918     #define FMULLm(D,B,I,S) _ESCmi(D,B,I,S,014)
1919    
1920     #define FDIVr0(R) _OOr(0xd8f0,_rN(R))
1921     #define FDIV0r(R) _OOr(0xdcf8,_rN(R))
1922     #define FDIVP0r(R) _OOr(0xdef8,_rN(R))
1923     #define FDIVSm(D,B,I,S) _ESCmi(D,B,I,S,060)
1924     #define FDIVLm(D,B,I,S) _ESCmi(D,B,I,S,064)
1925    
1926     #define FDIVRr0(R) _OOr(0xd8f8,_rN(R))
1927     #define FDIVR0r(R) _OOr(0xdcf0,_rN(R))
1928     #define FDIVRP0r(R) _OOr(0xdef0,_rN(R))
1929     #define FDIVRSm(D,B,I,S) _ESCmi(D,B,I,S,070)
1930     #define FDIVRLm(D,B,I,S) _ESCmi(D,B,I,S,074)
1931    
1932     #define FCMOVBr0(R) _OOr(0xdac0,_rN(R))
1933     #define FCMOVBEr0(R) _OOr(0xdad0,_rN(R))
1934     #define FCMOVEr0(R) _OOr(0xdac8,_rN(R))
1935     #define FCMOVNBr0(R) _OOr(0xdbc0,_rN(R))
1936     #define FCMOVNBEr0(R) _OOr(0xdbd0,_rN(R))
1937     #define FCMOVNEr0(R) _OOr(0xdbc8,_rN(R))
1938     #define FCMOVNUr0(R) _OOr(0xdbd8,_rN(R))
1939     #define FCMOVUr0(R) _OOr(0xdad8,_rN(R))
1940     #define FCOMIr0(R) _OOr(0xdbf0,_rN(R))
1941     #define FCOMIPr0(R) _OOr(0xdff0,_rN(R))
1942    
1943     #define FCOMr(R) _OOr(0xd8d0,_rN(R))
1944     #define FCOMSm(D,B,I,S) _ESCmi(D,B,I,S,020)
1945     #define FCOMLm(D,B,I,S) _ESCmi(D,B,I,S,024)
1946    
1947     #define FCOMPr(R) _OOr(0xd8d8,_rN(R))
1948     #define FCOMPSm(D,B,I,S) _ESCmi(D,B,I,S,030)
1949     #define FCOMPLm(D,B,I,S) _ESCmi(D,B,I,S,034)
1950    
1951     #define FUCOMIr0(R) _OOr(0xdbe8,_rN(R))
1952     #define FUCOMIPr0(R) _OOr(0xdfe8,_rN(R))
1953     #define FUCOMPr(R) _OOr(0xdde8,_rN(R))
1954     #define FUCOMr(R) _OOr(0xdde0,_rN(R))
1955    
1956     #define FIADDLm(D,B,I,S) _ESCmi(D,B,I,S,002)
1957     #define FICOMLm(D,B,I,S) _ESCmi(D,B,I,S,022)
1958     #define FICOMPLm(D,B,I,S) _ESCmi(D,B,I,S,032)
1959     #define FIDIVLm(D,B,I,S) _ESCmi(D,B,I,S,062)
1960     #define FIDIVRLm(D,B,I,S) _ESCmi(D,B,I,S,072)
1961     #define FILDLm(D,B,I,S) _ESCmi(D,B,I,S,003)
1962     #define FILDQm(D,B,I,S) _ESCmi(D,B,I,S,057)
1963     #define FIMULLm(D,B,I,S) _ESCmi(D,B,I,S,012)
1964     #define FISTLm(D,B,I,S) _ESCmi(D,B,I,S,023)
1965     #define FISTPLm(D,B,I,S) _ESCmi(D,B,I,S,033)
1966     #define FISTPQm(D,B,I,S) _ESCmi(D,B,I,S,077)
1967     #define FISUBLm(D,B,I,S) _ESCmi(D,B,I,S,042)
1968     #define FISUBRLm(D,B,I,S) _ESCmi(D,B,I,S,052)
1969    
1970     #define FREEr(R) _OOr(0xddc0,_rN(R))
1971     #define FXCHr(R) _OOr(0xd9c8,_rN(R))
1972 gbeauche 1.1
1973     #endif /* X86_RTASM_H */