18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Generate .byte code for some instructions not supported by old
48c2ecf20Sopenharmony_ci * binutils.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci#ifndef X86_ASM_INST_H
78c2ecf20Sopenharmony_ci#define X86_ASM_INST_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef __ASSEMBLY__
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define REG_NUM_INVALID		100
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define REG_TYPE_R32		0
148c2ecf20Sopenharmony_ci#define REG_TYPE_R64		1
158c2ecf20Sopenharmony_ci#define REG_TYPE_INVALID	100
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci	.macro R32_NUM opd r32
188c2ecf20Sopenharmony_ci	\opd = REG_NUM_INVALID
198c2ecf20Sopenharmony_ci	.ifc \r32,%eax
208c2ecf20Sopenharmony_ci	\opd = 0
218c2ecf20Sopenharmony_ci	.endif
228c2ecf20Sopenharmony_ci	.ifc \r32,%ecx
238c2ecf20Sopenharmony_ci	\opd = 1
248c2ecf20Sopenharmony_ci	.endif
258c2ecf20Sopenharmony_ci	.ifc \r32,%edx
268c2ecf20Sopenharmony_ci	\opd = 2
278c2ecf20Sopenharmony_ci	.endif
288c2ecf20Sopenharmony_ci	.ifc \r32,%ebx
298c2ecf20Sopenharmony_ci	\opd = 3
308c2ecf20Sopenharmony_ci	.endif
318c2ecf20Sopenharmony_ci	.ifc \r32,%esp
328c2ecf20Sopenharmony_ci	\opd = 4
338c2ecf20Sopenharmony_ci	.endif
348c2ecf20Sopenharmony_ci	.ifc \r32,%ebp
358c2ecf20Sopenharmony_ci	\opd = 5
368c2ecf20Sopenharmony_ci	.endif
378c2ecf20Sopenharmony_ci	.ifc \r32,%esi
388c2ecf20Sopenharmony_ci	\opd = 6
398c2ecf20Sopenharmony_ci	.endif
408c2ecf20Sopenharmony_ci	.ifc \r32,%edi
418c2ecf20Sopenharmony_ci	\opd = 7
428c2ecf20Sopenharmony_ci	.endif
438c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_64
448c2ecf20Sopenharmony_ci	.ifc \r32,%r8d
458c2ecf20Sopenharmony_ci	\opd = 8
468c2ecf20Sopenharmony_ci	.endif
478c2ecf20Sopenharmony_ci	.ifc \r32,%r9d
488c2ecf20Sopenharmony_ci	\opd = 9
498c2ecf20Sopenharmony_ci	.endif
508c2ecf20Sopenharmony_ci	.ifc \r32,%r10d
518c2ecf20Sopenharmony_ci	\opd = 10
528c2ecf20Sopenharmony_ci	.endif
538c2ecf20Sopenharmony_ci	.ifc \r32,%r11d
548c2ecf20Sopenharmony_ci	\opd = 11
558c2ecf20Sopenharmony_ci	.endif
568c2ecf20Sopenharmony_ci	.ifc \r32,%r12d
578c2ecf20Sopenharmony_ci	\opd = 12
588c2ecf20Sopenharmony_ci	.endif
598c2ecf20Sopenharmony_ci	.ifc \r32,%r13d
608c2ecf20Sopenharmony_ci	\opd = 13
618c2ecf20Sopenharmony_ci	.endif
628c2ecf20Sopenharmony_ci	.ifc \r32,%r14d
638c2ecf20Sopenharmony_ci	\opd = 14
648c2ecf20Sopenharmony_ci	.endif
658c2ecf20Sopenharmony_ci	.ifc \r32,%r15d
668c2ecf20Sopenharmony_ci	\opd = 15
678c2ecf20Sopenharmony_ci	.endif
688c2ecf20Sopenharmony_ci#endif
698c2ecf20Sopenharmony_ci	.endm
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	.macro R64_NUM opd r64
728c2ecf20Sopenharmony_ci	\opd = REG_NUM_INVALID
738c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_64
748c2ecf20Sopenharmony_ci	.ifc \r64,%rax
758c2ecf20Sopenharmony_ci	\opd = 0
768c2ecf20Sopenharmony_ci	.endif
778c2ecf20Sopenharmony_ci	.ifc \r64,%rcx
788c2ecf20Sopenharmony_ci	\opd = 1
798c2ecf20Sopenharmony_ci	.endif
808c2ecf20Sopenharmony_ci	.ifc \r64,%rdx
818c2ecf20Sopenharmony_ci	\opd = 2
828c2ecf20Sopenharmony_ci	.endif
838c2ecf20Sopenharmony_ci	.ifc \r64,%rbx
848c2ecf20Sopenharmony_ci	\opd = 3
858c2ecf20Sopenharmony_ci	.endif
868c2ecf20Sopenharmony_ci	.ifc \r64,%rsp
878c2ecf20Sopenharmony_ci	\opd = 4
888c2ecf20Sopenharmony_ci	.endif
898c2ecf20Sopenharmony_ci	.ifc \r64,%rbp
908c2ecf20Sopenharmony_ci	\opd = 5
918c2ecf20Sopenharmony_ci	.endif
928c2ecf20Sopenharmony_ci	.ifc \r64,%rsi
938c2ecf20Sopenharmony_ci	\opd = 6
948c2ecf20Sopenharmony_ci	.endif
958c2ecf20Sopenharmony_ci	.ifc \r64,%rdi
968c2ecf20Sopenharmony_ci	\opd = 7
978c2ecf20Sopenharmony_ci	.endif
988c2ecf20Sopenharmony_ci	.ifc \r64,%r8
998c2ecf20Sopenharmony_ci	\opd = 8
1008c2ecf20Sopenharmony_ci	.endif
1018c2ecf20Sopenharmony_ci	.ifc \r64,%r9
1028c2ecf20Sopenharmony_ci	\opd = 9
1038c2ecf20Sopenharmony_ci	.endif
1048c2ecf20Sopenharmony_ci	.ifc \r64,%r10
1058c2ecf20Sopenharmony_ci	\opd = 10
1068c2ecf20Sopenharmony_ci	.endif
1078c2ecf20Sopenharmony_ci	.ifc \r64,%r11
1088c2ecf20Sopenharmony_ci	\opd = 11
1098c2ecf20Sopenharmony_ci	.endif
1108c2ecf20Sopenharmony_ci	.ifc \r64,%r12
1118c2ecf20Sopenharmony_ci	\opd = 12
1128c2ecf20Sopenharmony_ci	.endif
1138c2ecf20Sopenharmony_ci	.ifc \r64,%r13
1148c2ecf20Sopenharmony_ci	\opd = 13
1158c2ecf20Sopenharmony_ci	.endif
1168c2ecf20Sopenharmony_ci	.ifc \r64,%r14
1178c2ecf20Sopenharmony_ci	\opd = 14
1188c2ecf20Sopenharmony_ci	.endif
1198c2ecf20Sopenharmony_ci	.ifc \r64,%r15
1208c2ecf20Sopenharmony_ci	\opd = 15
1218c2ecf20Sopenharmony_ci	.endif
1228c2ecf20Sopenharmony_ci#endif
1238c2ecf20Sopenharmony_ci	.endm
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	.macro REG_TYPE type reg
1268c2ecf20Sopenharmony_ci	R32_NUM reg_type_r32 \reg
1278c2ecf20Sopenharmony_ci	R64_NUM reg_type_r64 \reg
1288c2ecf20Sopenharmony_ci	.if reg_type_r64 <> REG_NUM_INVALID
1298c2ecf20Sopenharmony_ci	\type = REG_TYPE_R64
1308c2ecf20Sopenharmony_ci	.elseif reg_type_r32 <> REG_NUM_INVALID
1318c2ecf20Sopenharmony_ci	\type = REG_TYPE_R32
1328c2ecf20Sopenharmony_ci	.else
1338c2ecf20Sopenharmony_ci	\type = REG_TYPE_INVALID
1348c2ecf20Sopenharmony_ci	.endif
1358c2ecf20Sopenharmony_ci	.endm
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	.macro PFX_REX opd1 opd2 W=0
1388c2ecf20Sopenharmony_ci	.if ((\opd1 | \opd2) & 8) || \W
1398c2ecf20Sopenharmony_ci	.byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
1408c2ecf20Sopenharmony_ci	.endif
1418c2ecf20Sopenharmony_ci	.endm
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	.macro MODRM mod opd1 opd2
1448c2ecf20Sopenharmony_ci	.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
1458c2ecf20Sopenharmony_ci	.endm
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci.macro RDPID opd
1488c2ecf20Sopenharmony_ci	REG_TYPE rdpid_opd_type \opd
1498c2ecf20Sopenharmony_ci	.if rdpid_opd_type == REG_TYPE_R64
1508c2ecf20Sopenharmony_ci	R64_NUM rdpid_opd \opd
1518c2ecf20Sopenharmony_ci	.else
1528c2ecf20Sopenharmony_ci	R32_NUM rdpid_opd \opd
1538c2ecf20Sopenharmony_ci	.endif
1548c2ecf20Sopenharmony_ci	.byte 0xf3
1558c2ecf20Sopenharmony_ci	.if rdpid_opd > 7
1568c2ecf20Sopenharmony_ci	PFX_REX rdpid_opd 0
1578c2ecf20Sopenharmony_ci	.endif
1588c2ecf20Sopenharmony_ci	.byte 0x0f, 0xc7
1598c2ecf20Sopenharmony_ci	MODRM 0xc0 rdpid_opd 0x7
1608c2ecf20Sopenharmony_ci.endm
1618c2ecf20Sopenharmony_ci#endif
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci#endif
164