linux/arch/x86/include/asm/inst.h
<<
>>
Prefs
   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