Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
inst.h
Go to the documentation of this file.
1 /*
2  * Generate .byte code for some instructions not supported by old
3  * binutils.
4  */
5 #ifndef X86_ASM_INST_H
6 #define X86_ASM_INST_H
7 
8 #ifdef __ASSEMBLY__
9 
10 #define REG_NUM_INVALID 100
11 
12 #define REG_TYPE_R64 0
13 #define REG_TYPE_XMM 1
14 #define REG_TYPE_INVALID 100
15 
16  .macro R64_NUM opd r64
17  \opd = REG_NUM_INVALID
18  .ifc \r64,%rax
19  \opd = 0
20  .endif
21  .ifc \r64,%rcx
22  \opd = 1
23  .endif
24  .ifc \r64,%rdx
25  \opd = 2
26  .endif
27  .ifc \r64,%rbx
28  \opd = 3
29  .endif
30  .ifc \r64,%rsp
31  \opd = 4
32  .endif
33  .ifc \r64,%rbp
34  \opd = 5
35  .endif
36  .ifc \r64,%rsi
37  \opd = 6
38  .endif
39  .ifc \r64,%rdi
40  \opd = 7
41  .endif
42  .ifc \r64,%r8
43  \opd = 8
44  .endif
45  .ifc \r64,%r9
46  \opd = 9
47  .endif
48  .ifc \r64,%r10
49  \opd = 10
50  .endif
51  .ifc \r64,%r11
52  \opd = 11
53  .endif
54  .ifc \r64,%r12
55  \opd = 12
56  .endif
57  .ifc \r64,%r13
58  \opd = 13
59  .endif
60  .ifc \r64,%r14
61  \opd = 14
62  .endif
63  .ifc \r64,%r15
64  \opd = 15
65  .endif
66  .endm
67 
68  .macro XMM_NUM opd xmm
69  \opd = REG_NUM_INVALID
70  .ifc \xmm,%xmm0
71  \opd = 0
72  .endif
73  .ifc \xmm,%xmm1
74  \opd = 1
75  .endif
76  .ifc \xmm,%xmm2
77  \opd = 2
78  .endif
79  .ifc \xmm,%xmm3
80  \opd = 3
81  .endif
82  .ifc \xmm,%xmm4
83  \opd = 4
84  .endif
85  .ifc \xmm,%xmm5
86  \opd = 5
87  .endif
88  .ifc \xmm,%xmm6
89  \opd = 6
90  .endif
91  .ifc \xmm,%xmm7
92  \opd = 7
93  .endif
94  .ifc \xmm,%xmm8
95  \opd = 8
96  .endif
97  .ifc \xmm,%xmm9
98  \opd = 9
99  .endif
100  .ifc \xmm,%xmm10
101  \opd = 10
102  .endif
103  .ifc \xmm,%xmm11
104  \opd = 11
105  .endif
106  .ifc \xmm,%xmm12
107  \opd = 12
108  .endif
109  .ifc \xmm,%xmm13
110  \opd = 13
111  .endif
112  .ifc \xmm,%xmm14
113  \opd = 14
114  .endif
115  .ifc \xmm,%xmm15
116  \opd = 15
117  .endif
118  .endm
119 
120  .macro REG_TYPE type reg
121  R64_NUM reg_type_r64 \reg
122  XMM_NUM reg_type_xmm \reg
123  .if reg_type_r64 <> REG_NUM_INVALID
124  \type = REG_TYPE_R64
125  .elseif reg_type_xmm <> REG_NUM_INVALID
126  \type = REG_TYPE_XMM
127  .else \type = REG_TYPE_INVALID
128  .endif
129  .endm
130 
131  .macro PFX_OPD_SIZE
132  .byte 0x66
133  .endm
134 
135  .macro PFX_REX opd1 opd2 W=0
136  .if ((\opd1 | \opd2) & 8) || \W
137  .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
138  .endif
139  .endm
140 
141  .macro MODRM mod opd1 opd2
142  .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
143  .endm
144 
145  .macro PSHUFB_XMM xmm1 xmm2
146  XMM_NUM pshufb_opd1 \xmm1
147  XMM_NUM pshufb_opd2 \xmm2
148  PFX_OPD_SIZE
149  PFX_REX pshufb_opd1 pshufb_opd2
150  .byte 0x0f, 0x38, 0x00
151  MODRM 0xc0 pshufb_opd1 pshufb_opd2
152  .endm
153 
154  .macro PCLMULQDQ imm8 xmm1 xmm2
155  XMM_NUM clmul_opd1 \xmm1
156  XMM_NUM clmul_opd2 \xmm2
157  PFX_OPD_SIZE
158  PFX_REX clmul_opd1 clmul_opd2
159  .byte 0x0f, 0x3a, 0x44
160  MODRM 0xc0 clmul_opd1 clmul_opd2
161  .byte \imm8
162  .endm
163 
164  .macro AESKEYGENASSIST rcon xmm1 xmm2
165  XMM_NUM aeskeygen_opd1 \xmm1
166  XMM_NUM aeskeygen_opd2 \xmm2
167  PFX_OPD_SIZE
168  PFX_REX aeskeygen_opd1 aeskeygen_opd2
169  .byte 0x0f, 0x3a, 0xdf
170  MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
171  .byte \rcon
172  .endm
173 
174  .macro AESIMC xmm1 xmm2
175  XMM_NUM aesimc_opd1 \xmm1
176  XMM_NUM aesimc_opd2 \xmm2
177  PFX_OPD_SIZE
178  PFX_REX aesimc_opd1 aesimc_opd2
179  .byte 0x0f, 0x38, 0xdb
180  MODRM 0xc0 aesimc_opd1 aesimc_opd2
181  .endm
182 
183  .macro AESENC xmm1 xmm2
184  XMM_NUM aesenc_opd1 \xmm1
185  XMM_NUM aesenc_opd2 \xmm2
186  PFX_OPD_SIZE
187  PFX_REX aesenc_opd1 aesenc_opd2
188  .byte 0x0f, 0x38, 0xdc
189  MODRM 0xc0 aesenc_opd1 aesenc_opd2
190  .endm
191 
192  .macro AESENCLAST xmm1 xmm2
193  XMM_NUM aesenclast_opd1 \xmm1
194  XMM_NUM aesenclast_opd2 \xmm2
195  PFX_OPD_SIZE
196  PFX_REX aesenclast_opd1 aesenclast_opd2
197  .byte 0x0f, 0x38, 0xdd
198  MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
199  .endm
200 
201  .macro AESDEC xmm1 xmm2
202  XMM_NUM aesdec_opd1 \xmm1
203  XMM_NUM aesdec_opd2 \xmm2
204  PFX_OPD_SIZE
205  PFX_REX aesdec_opd1 aesdec_opd2
206  .byte 0x0f, 0x38, 0xde
207  MODRM 0xc0 aesdec_opd1 aesdec_opd2
208  .endm
209 
210  .macro AESDECLAST xmm1 xmm2
211  XMM_NUM aesdeclast_opd1 \xmm1
212  XMM_NUM aesdeclast_opd2 \xmm2
213  PFX_OPD_SIZE
214  PFX_REX aesdeclast_opd1 aesdeclast_opd2
215  .byte 0x0f, 0x38, 0xdf
216  MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
217  .endm
218 
219  .macro MOVQ_R64_XMM opd1 opd2
220  REG_TYPE movq_r64_xmm_opd1_type \opd1
221  .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
222  XMM_NUM movq_r64_xmm_opd1 \opd1
223  R64_NUM movq_r64_xmm_opd2 \opd2
224  .else
225  R64_NUM movq_r64_xmm_opd1 \opd1
226  XMM_NUM movq_r64_xmm_opd2 \opd2
227  .endif
228  PFX_OPD_SIZE
229  PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1
230  .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
231  .byte 0x0f, 0x7e
232  .else
233  .byte 0x0f, 0x6e
234  .endif
235  MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2
236  .endm
237 #endif
238 
239 #endif
240