xref: /openbmc/linux/arch/x86/include/asm/inst.h (revision 7dd65feb)
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 	.macro XMM_NUM opd xmm
11 	.ifc \xmm,%xmm0
12 	\opd = 0
13 	.endif
14 	.ifc \xmm,%xmm1
15 	\opd = 1
16 	.endif
17 	.ifc \xmm,%xmm2
18 	\opd = 2
19 	.endif
20 	.ifc \xmm,%xmm3
21 	\opd = 3
22 	.endif
23 	.ifc \xmm,%xmm4
24 	\opd = 4
25 	.endif
26 	.ifc \xmm,%xmm5
27 	\opd = 5
28 	.endif
29 	.ifc \xmm,%xmm6
30 	\opd = 6
31 	.endif
32 	.ifc \xmm,%xmm7
33 	\opd = 7
34 	.endif
35 	.ifc \xmm,%xmm8
36 	\opd = 8
37 	.endif
38 	.ifc \xmm,%xmm9
39 	\opd = 9
40 	.endif
41 	.ifc \xmm,%xmm10
42 	\opd = 10
43 	.endif
44 	.ifc \xmm,%xmm11
45 	\opd = 11
46 	.endif
47 	.ifc \xmm,%xmm12
48 	\opd = 12
49 	.endif
50 	.ifc \xmm,%xmm13
51 	\opd = 13
52 	.endif
53 	.ifc \xmm,%xmm14
54 	\opd = 14
55 	.endif
56 	.ifc \xmm,%xmm15
57 	\opd = 15
58 	.endif
59 	.endm
60 
61 	.macro PFX_OPD_SIZE
62 	.byte 0x66
63 	.endm
64 
65 	.macro PFX_REX opd1 opd2
66 	.if (\opd1 | \opd2) & 8
67 	.byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1)
68 	.endif
69 	.endm
70 
71 	.macro MODRM mod opd1 opd2
72 	.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
73 	.endm
74 
75 	.macro PSHUFB_XMM xmm1 xmm2
76 	XMM_NUM pshufb_opd1 \xmm1
77 	XMM_NUM pshufb_opd2 \xmm2
78 	PFX_OPD_SIZE
79 	PFX_REX pshufb_opd1 pshufb_opd2
80 	.byte 0x0f, 0x38, 0x00
81 	MODRM 0xc0 pshufb_opd1 pshufb_opd2
82 	.endm
83 
84 	.macro PCLMULQDQ imm8 xmm1 xmm2
85 	XMM_NUM clmul_opd1 \xmm1
86 	XMM_NUM clmul_opd2 \xmm2
87 	PFX_OPD_SIZE
88 	PFX_REX clmul_opd1 clmul_opd2
89 	.byte 0x0f, 0x3a, 0x44
90 	MODRM 0xc0 clmul_opd1 clmul_opd2
91 	.byte \imm8
92 	.endm
93 
94 	.macro AESKEYGENASSIST rcon xmm1 xmm2
95 	XMM_NUM aeskeygen_opd1 \xmm1
96 	XMM_NUM aeskeygen_opd2 \xmm2
97 	PFX_OPD_SIZE
98 	PFX_REX aeskeygen_opd1 aeskeygen_opd2
99 	.byte 0x0f, 0x3a, 0xdf
100 	MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
101 	.byte \rcon
102 	.endm
103 
104 	.macro AESIMC xmm1 xmm2
105 	XMM_NUM aesimc_opd1 \xmm1
106 	XMM_NUM aesimc_opd2 \xmm2
107 	PFX_OPD_SIZE
108 	PFX_REX aesimc_opd1 aesimc_opd2
109 	.byte 0x0f, 0x38, 0xdb
110 	MODRM 0xc0 aesimc_opd1 aesimc_opd2
111 	.endm
112 
113 	.macro AESENC xmm1 xmm2
114 	XMM_NUM aesenc_opd1 \xmm1
115 	XMM_NUM aesenc_opd2 \xmm2
116 	PFX_OPD_SIZE
117 	PFX_REX aesenc_opd1 aesenc_opd2
118 	.byte 0x0f, 0x38, 0xdc
119 	MODRM 0xc0 aesenc_opd1 aesenc_opd2
120 	.endm
121 
122 	.macro AESENCLAST xmm1 xmm2
123 	XMM_NUM aesenclast_opd1 \xmm1
124 	XMM_NUM aesenclast_opd2 \xmm2
125 	PFX_OPD_SIZE
126 	PFX_REX aesenclast_opd1 aesenclast_opd2
127 	.byte 0x0f, 0x38, 0xdd
128 	MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
129 	.endm
130 
131 	.macro AESDEC xmm1 xmm2
132 	XMM_NUM aesdec_opd1 \xmm1
133 	XMM_NUM aesdec_opd2 \xmm2
134 	PFX_OPD_SIZE
135 	PFX_REX aesdec_opd1 aesdec_opd2
136 	.byte 0x0f, 0x38, 0xde
137 	MODRM 0xc0 aesdec_opd1 aesdec_opd2
138 	.endm
139 
140 	.macro AESDECLAST xmm1 xmm2
141 	XMM_NUM aesdeclast_opd1 \xmm1
142 	XMM_NUM aesdeclast_opd2 \xmm2
143 	PFX_OPD_SIZE
144 	PFX_REX aesdeclast_opd1 aesdeclast_opd2
145 	.byte 0x0f, 0x38, 0xdf
146 	MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
147 	.endm
148 #endif
149 
150 #endif
151