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