1 /* 2 * Generate .byte code for some instructions not supported by old 3 * binutils. 4 */ 5 #ifndef X86_ASM_INST_H 6 #define X86_ASM_INST_H 7 8 #ifdef __ASSEMBLY__ 9 10 #define REG_NUM_INVALID 100 11 12 #define REG_TYPE_R32 0 13 #define REG_TYPE_R64 1 14 #define REG_TYPE_XMM 2 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 XMM_NUM opd xmm 126 \opd = REG_NUM_INVALID 127 .ifc \xmm,%xmm0 128 \opd = 0 129 .endif 130 .ifc \xmm,%xmm1 131 \opd = 1 132 .endif 133 .ifc \xmm,%xmm2 134 \opd = 2 135 .endif 136 .ifc \xmm,%xmm3 137 \opd = 3 138 .endif 139 .ifc \xmm,%xmm4 140 \opd = 4 141 .endif 142 .ifc \xmm,%xmm5 143 \opd = 5 144 .endif 145 .ifc \xmm,%xmm6 146 \opd = 6 147 .endif 148 .ifc \xmm,%xmm7 149 \opd = 7 150 .endif 151 .ifc \xmm,%xmm8 152 \opd = 8 153 .endif 154 .ifc \xmm,%xmm9 155 \opd = 9 156 .endif 157 .ifc \xmm,%xmm10 158 \opd = 10 159 .endif 160 .ifc \xmm,%xmm11 161 \opd = 11 162 .endif 163 .ifc \xmm,%xmm12 164 \opd = 12 165 .endif 166 .ifc \xmm,%xmm13 167 \opd = 13 168 .endif 169 .ifc \xmm,%xmm14 170 \opd = 14 171 .endif 172 .ifc \xmm,%xmm15 173 \opd = 15 174 .endif 175 .endm 176 177 .macro REG_TYPE type reg 178 R32_NUM reg_type_r32 \reg 179 R64_NUM reg_type_r64 \reg 180 XMM_NUM reg_type_xmm \reg 181 .if reg_type_r64 <> REG_NUM_INVALID 182 \type = REG_TYPE_R64 183 .elseif reg_type_r32 <> REG_NUM_INVALID 184 \type = REG_TYPE_R32 185 .elseif reg_type_xmm <> REG_NUM_INVALID 186 \type = REG_TYPE_XMM 187 .else 188 \type = REG_TYPE_INVALID 189 .endif 190 .endm 191 192 .macro PFX_OPD_SIZE 193 .byte 0x66 194 .endm 195 196 .macro PFX_REX opd1 opd2 W=0 197 .if ((\opd1 | \opd2) & 8) || \W 198 .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3) 199 .endif 200 .endm 201 202 .macro MODRM mod opd1 opd2 203 .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) 204 .endm 205 206 .macro PSHUFB_XMM xmm1 xmm2 207 XMM_NUM pshufb_opd1 \xmm1 208 XMM_NUM pshufb_opd2 \xmm2 209 PFX_OPD_SIZE 210 PFX_REX pshufb_opd1 pshufb_opd2 211 .byte 0x0f, 0x38, 0x00 212 MODRM 0xc0 pshufb_opd1 pshufb_opd2 213 .endm 214 215 .macro PCLMULQDQ imm8 xmm1 xmm2 216 XMM_NUM clmul_opd1 \xmm1 217 XMM_NUM clmul_opd2 \xmm2 218 PFX_OPD_SIZE 219 PFX_REX clmul_opd1 clmul_opd2 220 .byte 0x0f, 0x3a, 0x44 221 MODRM 0xc0 clmul_opd1 clmul_opd2 222 .byte \imm8 223 .endm 224 225 .macro PEXTRD imm8 xmm gpr 226 R32_NUM extrd_opd1 \gpr 227 XMM_NUM extrd_opd2 \xmm 228 PFX_OPD_SIZE 229 PFX_REX extrd_opd1 extrd_opd2 230 .byte 0x0f, 0x3a, 0x16 231 MODRM 0xc0 extrd_opd1 extrd_opd2 232 .byte \imm8 233 .endm 234 235 .macro AESKEYGENASSIST rcon xmm1 xmm2 236 XMM_NUM aeskeygen_opd1 \xmm1 237 XMM_NUM aeskeygen_opd2 \xmm2 238 PFX_OPD_SIZE 239 PFX_REX aeskeygen_opd1 aeskeygen_opd2 240 .byte 0x0f, 0x3a, 0xdf 241 MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2 242 .byte \rcon 243 .endm 244 245 .macro AESIMC xmm1 xmm2 246 XMM_NUM aesimc_opd1 \xmm1 247 XMM_NUM aesimc_opd2 \xmm2 248 PFX_OPD_SIZE 249 PFX_REX aesimc_opd1 aesimc_opd2 250 .byte 0x0f, 0x38, 0xdb 251 MODRM 0xc0 aesimc_opd1 aesimc_opd2 252 .endm 253 254 .macro AESENC xmm1 xmm2 255 XMM_NUM aesenc_opd1 \xmm1 256 XMM_NUM aesenc_opd2 \xmm2 257 PFX_OPD_SIZE 258 PFX_REX aesenc_opd1 aesenc_opd2 259 .byte 0x0f, 0x38, 0xdc 260 MODRM 0xc0 aesenc_opd1 aesenc_opd2 261 .endm 262 263 .macro AESENCLAST xmm1 xmm2 264 XMM_NUM aesenclast_opd1 \xmm1 265 XMM_NUM aesenclast_opd2 \xmm2 266 PFX_OPD_SIZE 267 PFX_REX aesenclast_opd1 aesenclast_opd2 268 .byte 0x0f, 0x38, 0xdd 269 MODRM 0xc0 aesenclast_opd1 aesenclast_opd2 270 .endm 271 272 .macro AESDEC xmm1 xmm2 273 XMM_NUM aesdec_opd1 \xmm1 274 XMM_NUM aesdec_opd2 \xmm2 275 PFX_OPD_SIZE 276 PFX_REX aesdec_opd1 aesdec_opd2 277 .byte 0x0f, 0x38, 0xde 278 MODRM 0xc0 aesdec_opd1 aesdec_opd2 279 .endm 280 281 .macro AESDECLAST xmm1 xmm2 282 XMM_NUM aesdeclast_opd1 \xmm1 283 XMM_NUM aesdeclast_opd2 \xmm2 284 PFX_OPD_SIZE 285 PFX_REX aesdeclast_opd1 aesdeclast_opd2 286 .byte 0x0f, 0x38, 0xdf 287 MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 288 .endm 289 290 .macro MOVQ_R64_XMM opd1 opd2 291 REG_TYPE movq_r64_xmm_opd1_type \opd1 292 .if movq_r64_xmm_opd1_type == REG_TYPE_XMM 293 XMM_NUM movq_r64_xmm_opd1 \opd1 294 R64_NUM movq_r64_xmm_opd2 \opd2 295 .else 296 R64_NUM movq_r64_xmm_opd1 \opd1 297 XMM_NUM movq_r64_xmm_opd2 \opd2 298 .endif 299 PFX_OPD_SIZE 300 PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1 301 .if movq_r64_xmm_opd1_type == REG_TYPE_XMM 302 .byte 0x0f, 0x7e 303 .else 304 .byte 0x0f, 0x6e 305 .endif 306 MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2 307 .endm 308 #endif 309 310 #endif 311