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