linux/arch/x86/include/asm/inst.h
<<
>>
Prefs
   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_XMM            2
  16#define REG_TYPE_INVALID        100
  17
  18        .macro R32_NUM opd r32
  19        \opd = REG_NUM_INVALID
  20        .ifc \r32,%eax
  21        \opd = 0
  22        .endif
  23        .ifc \r32,%ecx
  24        \opd = 1
  25        .endif
  26        .ifc \r32,%edx
  27        \opd = 2
  28        .endif
  29        .ifc \r32,%ebx
  30        \opd = 3
  31        .endif
  32        .ifc \r32,%esp
  33        \opd = 4
  34        .endif
  35        .ifc \r32,%ebp
  36        \opd = 5
  37        .endif
  38        .ifc \r32,%esi
  39        \opd = 6
  40        .endif
  41        .ifc \r32,%edi
  42        \opd = 7
  43        .endif
  44#ifdef CONFIG_X86_64
  45        .ifc \r32,%r8d
  46        \opd = 8
  47        .endif
  48        .ifc \r32,%r9d
  49        \opd = 9
  50        .endif
  51        .ifc \r32,%r10d
  52        \opd = 10
  53        .endif
  54        .ifc \r32,%r11d
  55        \opd = 11
  56        .endif
  57        .ifc \r32,%r12d
  58        \opd = 12
  59        .endif
  60        .ifc \r32,%r13d
  61        \opd = 13
  62        .endif
  63        .ifc \r32,%r14d
  64        \opd = 14
  65        .endif
  66        .ifc \r32,%r15d
  67        \opd = 15
  68        .endif
  69#endif
  70        .endm
  71
  72        .macro R64_NUM opd r64
  73        \opd = REG_NUM_INVALID
  74#ifdef CONFIG_X86_64
  75        .ifc \r64,%rax
  76        \opd = 0
  77        .endif
  78        .ifc \r64,%rcx
  79        \opd = 1
  80        .endif
  81        .ifc \r64,%rdx
  82        \opd = 2
  83        .endif
  84        .ifc \r64,%rbx
  85        \opd = 3
  86        .endif
  87        .ifc \r64,%rsp
  88        \opd = 4
  89        .endif
  90        .ifc \r64,%rbp
  91        \opd = 5
  92        .endif
  93        .ifc \r64,%rsi
  94        \opd = 6
  95        .endif
  96        .ifc \r64,%rdi
  97        \opd = 7
  98        .endif
  99        .ifc \r64,%r8
 100        \opd = 8
 101        .endif
 102        .ifc \r64,%r9
 103        \opd = 9
 104        .endif
 105        .ifc \r64,%r10
 106        \opd = 10
 107        .endif
 108        .ifc \r64,%r11
 109        \opd = 11
 110        .endif
 111        .ifc \r64,%r12
 112        \opd = 12
 113        .endif
 114        .ifc \r64,%r13
 115        \opd = 13
 116        .endif
 117        .ifc \r64,%r14
 118        \opd = 14
 119        .endif
 120        .ifc \r64,%r15
 121        \opd = 15
 122        .endif
 123#endif
 124        .endm
 125
 126        .macro XMM_NUM opd xmm
 127        \opd = REG_NUM_INVALID
 128        .ifc \xmm,%xmm0
 129        \opd = 0
 130        .endif
 131        .ifc \xmm,%xmm1
 132        \opd = 1
 133        .endif
 134        .ifc \xmm,%xmm2
 135        \opd = 2
 136        .endif
 137        .ifc \xmm,%xmm3
 138        \opd = 3
 139        .endif
 140        .ifc \xmm,%xmm4
 141        \opd = 4
 142        .endif
 143        .ifc \xmm,%xmm5
 144        \opd = 5
 145        .endif
 146        .ifc \xmm,%xmm6
 147        \opd = 6
 148        .endif
 149        .ifc \xmm,%xmm7
 150        \opd = 7
 151        .endif
 152        .ifc \xmm,%xmm8
 153        \opd = 8
 154        .endif
 155        .ifc \xmm,%xmm9
 156        \opd = 9
 157        .endif
 158        .ifc \xmm,%xmm10
 159        \opd = 10
 160        .endif
 161        .ifc \xmm,%xmm11
 162        \opd = 11
 163        .endif
 164        .ifc \xmm,%xmm12
 165        \opd = 12
 166        .endif
 167        .ifc \xmm,%xmm13
 168        \opd = 13
 169        .endif
 170        .ifc \xmm,%xmm14
 171        \opd = 14
 172        .endif
 173        .ifc \xmm,%xmm15
 174        \opd = 15
 175        .endif
 176        .endm
 177
 178        .macro REG_TYPE type reg
 179        R32_NUM reg_type_r32 \reg
 180        R64_NUM reg_type_r64 \reg
 181        XMM_NUM reg_type_xmm \reg
 182        .if reg_type_r64 <> REG_NUM_INVALID
 183        \type = REG_TYPE_R64
 184        .elseif reg_type_r32 <> REG_NUM_INVALID
 185        \type = REG_TYPE_R32
 186        .elseif reg_type_xmm <> REG_NUM_INVALID
 187        \type = REG_TYPE_XMM
 188        .else
 189        \type = REG_TYPE_INVALID
 190        .endif
 191        .endm
 192
 193        .macro PFX_OPD_SIZE
 194        .byte 0x66
 195        .endm
 196
 197        .macro PFX_REX opd1 opd2 W=0
 198        .if ((\opd1 | \opd2) & 8) || \W
 199        .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
 200        .endif
 201        .endm
 202
 203        .macro MODRM mod opd1 opd2
 204        .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
 205        .endm
 206
 207        .macro PSHUFB_XMM xmm1 xmm2
 208        XMM_NUM pshufb_opd1 \xmm1
 209        XMM_NUM pshufb_opd2 \xmm2
 210        PFX_OPD_SIZE
 211        PFX_REX pshufb_opd1 pshufb_opd2
 212        .byte 0x0f, 0x38, 0x00
 213        MODRM 0xc0 pshufb_opd1 pshufb_opd2
 214        .endm
 215
 216        .macro PCLMULQDQ imm8 xmm1 xmm2
 217        XMM_NUM clmul_opd1 \xmm1
 218        XMM_NUM clmul_opd2 \xmm2
 219        PFX_OPD_SIZE
 220        PFX_REX clmul_opd1 clmul_opd2
 221        .byte 0x0f, 0x3a, 0x44
 222        MODRM 0xc0 clmul_opd1 clmul_opd2
 223        .byte \imm8
 224        .endm
 225
 226        .macro PEXTRD imm8 xmm gpr
 227        R32_NUM extrd_opd1 \gpr
 228        XMM_NUM extrd_opd2 \xmm
 229        PFX_OPD_SIZE
 230        PFX_REX extrd_opd1 extrd_opd2
 231        .byte 0x0f, 0x3a, 0x16
 232        MODRM 0xc0 extrd_opd1 extrd_opd2
 233        .byte \imm8
 234        .endm
 235
 236        .macro AESKEYGENASSIST rcon xmm1 xmm2
 237        XMM_NUM aeskeygen_opd1 \xmm1
 238        XMM_NUM aeskeygen_opd2 \xmm2
 239        PFX_OPD_SIZE
 240        PFX_REX aeskeygen_opd1 aeskeygen_opd2
 241        .byte 0x0f, 0x3a, 0xdf
 242        MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
 243        .byte \rcon
 244        .endm
 245
 246        .macro AESIMC xmm1 xmm2
 247        XMM_NUM aesimc_opd1 \xmm1
 248        XMM_NUM aesimc_opd2 \xmm2
 249        PFX_OPD_SIZE
 250        PFX_REX aesimc_opd1 aesimc_opd2
 251        .byte 0x0f, 0x38, 0xdb
 252        MODRM 0xc0 aesimc_opd1 aesimc_opd2
 253        .endm
 254
 255        .macro AESENC xmm1 xmm2
 256        XMM_NUM aesenc_opd1 \xmm1
 257        XMM_NUM aesenc_opd2 \xmm2
 258        PFX_OPD_SIZE
 259        PFX_REX aesenc_opd1 aesenc_opd2
 260        .byte 0x0f, 0x38, 0xdc
 261        MODRM 0xc0 aesenc_opd1 aesenc_opd2
 262        .endm
 263
 264        .macro AESENCLAST xmm1 xmm2
 265        XMM_NUM aesenclast_opd1 \xmm1
 266        XMM_NUM aesenclast_opd2 \xmm2
 267        PFX_OPD_SIZE
 268        PFX_REX aesenclast_opd1 aesenclast_opd2
 269        .byte 0x0f, 0x38, 0xdd
 270        MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
 271        .endm
 272
 273        .macro AESDEC xmm1 xmm2
 274        XMM_NUM aesdec_opd1 \xmm1
 275        XMM_NUM aesdec_opd2 \xmm2
 276        PFX_OPD_SIZE
 277        PFX_REX aesdec_opd1 aesdec_opd2
 278        .byte 0x0f, 0x38, 0xde
 279        MODRM 0xc0 aesdec_opd1 aesdec_opd2
 280        .endm
 281
 282        .macro AESDECLAST xmm1 xmm2
 283        XMM_NUM aesdeclast_opd1 \xmm1
 284        XMM_NUM aesdeclast_opd2 \xmm2
 285        PFX_OPD_SIZE
 286        PFX_REX aesdeclast_opd1 aesdeclast_opd2
 287        .byte 0x0f, 0x38, 0xdf
 288        MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
 289        .endm
 290
 291        .macro MOVQ_R64_XMM opd1 opd2
 292        REG_TYPE movq_r64_xmm_opd1_type \opd1
 293        .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
 294        XMM_NUM movq_r64_xmm_opd1 \opd1
 295        R64_NUM movq_r64_xmm_opd2 \opd2
 296        .else
 297        R64_NUM movq_r64_xmm_opd1 \opd1
 298        XMM_NUM movq_r64_xmm_opd2 \opd2
 299        .endif
 300        PFX_OPD_SIZE
 301        PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1
 302        .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
 303        .byte 0x0f, 0x7e
 304        .else
 305        .byte 0x0f, 0x6e
 306        .endif
 307        MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2
 308        .endm
 309#endif
 310
 311#endif
 312