xref: /openbmc/linux/arch/x86/include/asm/inst.h (revision 63dc02bd)
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
128 	\type = REG_TYPE_INVALID
129 	.endif
130 	.endm
131 
132 	.macro PFX_OPD_SIZE
133 	.byte 0x66
134 	.endm
135 
136 	.macro PFX_REX opd1 opd2 W=0
137 	.if ((\opd1 | \opd2) & 8) || \W
138 	.byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
139 	.endif
140 	.endm
141 
142 	.macro MODRM mod opd1 opd2
143 	.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
144 	.endm
145 
146 	.macro PSHUFB_XMM xmm1 xmm2
147 	XMM_NUM pshufb_opd1 \xmm1
148 	XMM_NUM pshufb_opd2 \xmm2
149 	PFX_OPD_SIZE
150 	PFX_REX pshufb_opd1 pshufb_opd2
151 	.byte 0x0f, 0x38, 0x00
152 	MODRM 0xc0 pshufb_opd1 pshufb_opd2
153 	.endm
154 
155 	.macro PCLMULQDQ imm8 xmm1 xmm2
156 	XMM_NUM clmul_opd1 \xmm1
157 	XMM_NUM clmul_opd2 \xmm2
158 	PFX_OPD_SIZE
159 	PFX_REX clmul_opd1 clmul_opd2
160 	.byte 0x0f, 0x3a, 0x44
161 	MODRM 0xc0 clmul_opd1 clmul_opd2
162 	.byte \imm8
163 	.endm
164 
165 	.macro AESKEYGENASSIST rcon xmm1 xmm2
166 	XMM_NUM aeskeygen_opd1 \xmm1
167 	XMM_NUM aeskeygen_opd2 \xmm2
168 	PFX_OPD_SIZE
169 	PFX_REX aeskeygen_opd1 aeskeygen_opd2
170 	.byte 0x0f, 0x3a, 0xdf
171 	MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
172 	.byte \rcon
173 	.endm
174 
175 	.macro AESIMC xmm1 xmm2
176 	XMM_NUM aesimc_opd1 \xmm1
177 	XMM_NUM aesimc_opd2 \xmm2
178 	PFX_OPD_SIZE
179 	PFX_REX aesimc_opd1 aesimc_opd2
180 	.byte 0x0f, 0x38, 0xdb
181 	MODRM 0xc0 aesimc_opd1 aesimc_opd2
182 	.endm
183 
184 	.macro AESENC xmm1 xmm2
185 	XMM_NUM aesenc_opd1 \xmm1
186 	XMM_NUM aesenc_opd2 \xmm2
187 	PFX_OPD_SIZE
188 	PFX_REX aesenc_opd1 aesenc_opd2
189 	.byte 0x0f, 0x38, 0xdc
190 	MODRM 0xc0 aesenc_opd1 aesenc_opd2
191 	.endm
192 
193 	.macro AESENCLAST xmm1 xmm2
194 	XMM_NUM aesenclast_opd1 \xmm1
195 	XMM_NUM aesenclast_opd2 \xmm2
196 	PFX_OPD_SIZE
197 	PFX_REX aesenclast_opd1 aesenclast_opd2
198 	.byte 0x0f, 0x38, 0xdd
199 	MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
200 	.endm
201 
202 	.macro AESDEC xmm1 xmm2
203 	XMM_NUM aesdec_opd1 \xmm1
204 	XMM_NUM aesdec_opd2 \xmm2
205 	PFX_OPD_SIZE
206 	PFX_REX aesdec_opd1 aesdec_opd2
207 	.byte 0x0f, 0x38, 0xde
208 	MODRM 0xc0 aesdec_opd1 aesdec_opd2
209 	.endm
210 
211 	.macro AESDECLAST xmm1 xmm2
212 	XMM_NUM aesdeclast_opd1 \xmm1
213 	XMM_NUM aesdeclast_opd2 \xmm2
214 	PFX_OPD_SIZE
215 	PFX_REX aesdeclast_opd1 aesdeclast_opd2
216 	.byte 0x0f, 0x38, 0xdf
217 	MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
218 	.endm
219 
220 	.macro MOVQ_R64_XMM opd1 opd2
221 	REG_TYPE movq_r64_xmm_opd1_type \opd1
222 	.if movq_r64_xmm_opd1_type == REG_TYPE_XMM
223 	XMM_NUM movq_r64_xmm_opd1 \opd1
224 	R64_NUM movq_r64_xmm_opd2 \opd2
225 	.else
226 	R64_NUM movq_r64_xmm_opd1 \opd1
227 	XMM_NUM movq_r64_xmm_opd2 \opd2
228 	.endif
229 	PFX_OPD_SIZE
230 	PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1
231 	.if movq_r64_xmm_opd1_type == REG_TYPE_XMM
232 	.byte 0x0f, 0x7e
233 	.else
234 	.byte 0x0f, 0x6e
235 	.endif
236 	MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2
237 	.endm
238 #endif
239 
240 #endif
241