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