xref: /openbmc/linux/arch/x86/include/asm/inst.h (revision 8539d3f0)
1ef19f826SUros Bizjak /* SPDX-License-Identifier: GPL-2.0 */
2ef19f826SUros Bizjak /*
3ef19f826SUros Bizjak  * Generate .byte code for some instructions not supported by old
4ef19f826SUros Bizjak  * binutils.
5ef19f826SUros Bizjak  */
6ef19f826SUros Bizjak #ifndef X86_ASM_INST_H
7ef19f826SUros Bizjak #define X86_ASM_INST_H
8ef19f826SUros Bizjak 
9ef19f826SUros Bizjak #ifdef __ASSEMBLY__
10ef19f826SUros Bizjak 
11ef19f826SUros Bizjak #define REG_NUM_INVALID		100
12ef19f826SUros Bizjak 
13ef19f826SUros Bizjak #define REG_TYPE_R32		0
14ef19f826SUros Bizjak #define REG_TYPE_R64		1
15ef19f826SUros Bizjak #define REG_TYPE_INVALID	100
16ef19f826SUros Bizjak 
17ef19f826SUros Bizjak 	.macro R32_NUM opd r32
18ef19f826SUros Bizjak 	\opd = REG_NUM_INVALID
19ef19f826SUros Bizjak 	.ifc \r32,%eax
20ef19f826SUros Bizjak 	\opd = 0
21ef19f826SUros Bizjak 	.endif
22ef19f826SUros Bizjak 	.ifc \r32,%ecx
23ef19f826SUros Bizjak 	\opd = 1
24ef19f826SUros Bizjak 	.endif
25ef19f826SUros Bizjak 	.ifc \r32,%edx
26ef19f826SUros Bizjak 	\opd = 2
27ef19f826SUros Bizjak 	.endif
28ef19f826SUros Bizjak 	.ifc \r32,%ebx
29ef19f826SUros Bizjak 	\opd = 3
30ef19f826SUros Bizjak 	.endif
31ef19f826SUros Bizjak 	.ifc \r32,%esp
32ef19f826SUros Bizjak 	\opd = 4
33ef19f826SUros Bizjak 	.endif
34ef19f826SUros Bizjak 	.ifc \r32,%ebp
35ef19f826SUros Bizjak 	\opd = 5
36ef19f826SUros Bizjak 	.endif
37ef19f826SUros Bizjak 	.ifc \r32,%esi
38ef19f826SUros Bizjak 	\opd = 6
39ef19f826SUros Bizjak 	.endif
40ef19f826SUros Bizjak 	.ifc \r32,%edi
41ef19f826SUros Bizjak 	\opd = 7
42ef19f826SUros Bizjak 	.endif
43ef19f826SUros Bizjak #ifdef CONFIG_X86_64
44ef19f826SUros Bizjak 	.ifc \r32,%r8d
45ef19f826SUros Bizjak 	\opd = 8
46ef19f826SUros Bizjak 	.endif
47ef19f826SUros Bizjak 	.ifc \r32,%r9d
48ef19f826SUros Bizjak 	\opd = 9
49ef19f826SUros Bizjak 	.endif
50ef19f826SUros Bizjak 	.ifc \r32,%r10d
51ef19f826SUros Bizjak 	\opd = 10
52ef19f826SUros Bizjak 	.endif
53ef19f826SUros Bizjak 	.ifc \r32,%r11d
54ef19f826SUros Bizjak 	\opd = 11
55ef19f826SUros Bizjak 	.endif
56ef19f826SUros Bizjak 	.ifc \r32,%r12d
57ef19f826SUros Bizjak 	\opd = 12
58ef19f826SUros Bizjak 	.endif
59ef19f826SUros Bizjak 	.ifc \r32,%r13d
60ef19f826SUros Bizjak 	\opd = 13
61ef19f826SUros Bizjak 	.endif
62ef19f826SUros Bizjak 	.ifc \r32,%r14d
63ef19f826SUros Bizjak 	\opd = 14
64ef19f826SUros Bizjak 	.endif
65ef19f826SUros Bizjak 	.ifc \r32,%r15d
66ef19f826SUros Bizjak 	\opd = 15
67ef19f826SUros Bizjak 	.endif
68ef19f826SUros Bizjak #endif
69ef19f826SUros Bizjak 	.endm
70ef19f826SUros Bizjak 
71ef19f826SUros Bizjak 	.macro R64_NUM opd r64
72ef19f826SUros Bizjak 	\opd = REG_NUM_INVALID
73ef19f826SUros Bizjak #ifdef CONFIG_X86_64
74ef19f826SUros Bizjak 	.ifc \r64,%rax
75ef19f826SUros Bizjak 	\opd = 0
76ef19f826SUros Bizjak 	.endif
77ef19f826SUros Bizjak 	.ifc \r64,%rcx
78ef19f826SUros Bizjak 	\opd = 1
79ef19f826SUros Bizjak 	.endif
80ef19f826SUros Bizjak 	.ifc \r64,%rdx
81ef19f826SUros Bizjak 	\opd = 2
82ef19f826SUros Bizjak 	.endif
83ef19f826SUros Bizjak 	.ifc \r64,%rbx
84ef19f826SUros Bizjak 	\opd = 3
85ef19f826SUros Bizjak 	.endif
86ef19f826SUros Bizjak 	.ifc \r64,%rsp
87ef19f826SUros Bizjak 	\opd = 4
88ef19f826SUros Bizjak 	.endif
89ef19f826SUros Bizjak 	.ifc \r64,%rbp
90ef19f826SUros Bizjak 	\opd = 5
91ef19f826SUros Bizjak 	.endif
92ef19f826SUros Bizjak 	.ifc \r64,%rsi
93ef19f826SUros Bizjak 	\opd = 6
94ef19f826SUros Bizjak 	.endif
95ef19f826SUros Bizjak 	.ifc \r64,%rdi
96ef19f826SUros Bizjak 	\opd = 7
97ef19f826SUros Bizjak 	.endif
98ef19f826SUros Bizjak 	.ifc \r64,%r8
99ef19f826SUros Bizjak 	\opd = 8
100ef19f826SUros Bizjak 	.endif
101ef19f826SUros Bizjak 	.ifc \r64,%r9
102ef19f826SUros Bizjak 	\opd = 9
103ef19f826SUros Bizjak 	.endif
104ef19f826SUros Bizjak 	.ifc \r64,%r10
105ef19f826SUros Bizjak 	\opd = 10
106ef19f826SUros Bizjak 	.endif
107ef19f826SUros Bizjak 	.ifc \r64,%r11
108ef19f826SUros Bizjak 	\opd = 11
109ef19f826SUros Bizjak 	.endif
110ef19f826SUros Bizjak 	.ifc \r64,%r12
111ef19f826SUros Bizjak 	\opd = 12
112ef19f826SUros Bizjak 	.endif
113ef19f826SUros Bizjak 	.ifc \r64,%r13
114ef19f826SUros Bizjak 	\opd = 13
115ef19f826SUros Bizjak 	.endif
116ef19f826SUros Bizjak 	.ifc \r64,%r14
117ef19f826SUros Bizjak 	\opd = 14
118ef19f826SUros Bizjak 	.endif
119ef19f826SUros Bizjak 	.ifc \r64,%r15
120ef19f826SUros Bizjak 	\opd = 15
121ef19f826SUros Bizjak 	.endif
122ef19f826SUros Bizjak #endif
123ef19f826SUros Bizjak 	.endm
124ef19f826SUros Bizjak 
125ef19f826SUros Bizjak 	.macro REG_TYPE type reg
126ef19f826SUros Bizjak 	R32_NUM reg_type_r32 \reg
127ef19f826SUros Bizjak 	R64_NUM reg_type_r64 \reg
128ef19f826SUros Bizjak 	.if reg_type_r64 <> REG_NUM_INVALID
129ef19f826SUros Bizjak 	\type = REG_TYPE_R64
130ef19f826SUros Bizjak 	.elseif reg_type_r32 <> REG_NUM_INVALID
131ef19f826SUros Bizjak 	\type = REG_TYPE_R32
132ef19f826SUros Bizjak 	.else
133ef19f826SUros Bizjak 	\type = REG_TYPE_INVALID
134ef19f826SUros Bizjak 	.endif
135ef19f826SUros Bizjak 	.endm
136ef19f826SUros Bizjak 
137ef19f826SUros Bizjak 	.macro PFX_REX opd1 opd2 W=0
138ef19f826SUros Bizjak 	.if ((\opd1 | \opd2) & 8) || \W
139ef19f826SUros Bizjak 	.byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
140ef19f826SUros Bizjak 	.endif
141ef19f826SUros Bizjak 	.endm
142ef19f826SUros Bizjak 
143ef19f826SUros Bizjak 	.macro MODRM mod opd1 opd2
144ef19f826SUros Bizjak 	.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
145ef19f826SUros Bizjak 	.endm
146ef19f826SUros Bizjak #endif
147ef19f826SUros Bizjak 
148ef19f826SUros Bizjak #endif
149