/* * Generate .byte code for some instructions not supported by old * binutils. */ #ifndef X86_ASM_INST_H #define X86_ASM_INST_H #ifdef __ASSEMBLY__ .macro XMM_NUM opd xmm .ifc \xmm,%xmm0 \opd = 0 .endif .ifc \xmm,%xmm1 \opd = 1 .endif .ifc \xmm,%xmm2 \opd = 2 .endif .ifc \xmm,%xmm3 \opd = 3 .endif .ifc \xmm,%xmm4 \opd = 4 .endif .ifc \xmm,%xmm5 \opd = 5 .endif .ifc \xmm,%xmm6 \opd = 6 .endif .ifc \xmm,%xmm7 \opd = 7 .endif .ifc \xmm,%xmm8 \opd = 8 .endif .ifc \xmm,%xmm9 \opd = 9 .endif .ifc \xmm,%xmm10 \opd = 10 .endif .ifc \xmm,%xmm11 \opd = 11 .endif .ifc \xmm,%xmm12 \opd = 12 .endif .ifc \xmm,%xmm13 \opd = 13 .endif .ifc \xmm,%xmm14 \opd = 14 .endif .ifc \xmm,%xmm15 \opd = 15 .endif .endm .macro PFX_OPD_SIZE .byte 0x66 .endm .macro PFX_REX opd1 opd2 .if (\opd1 | \opd2) & 8 .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) .endif .endm .macro MODRM mod opd1 opd2 .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) .endm .macro PSHUFB_XMM xmm1 xmm2 XMM_NUM pshufb_opd1 \xmm1 XMM_NUM pshufb_opd2 \xmm2 PFX_OPD_SIZE PFX_REX pshufb_opd1 pshufb_opd2 .byte 0x0f, 0x38, 0x00 MODRM 0xc0 pshufb_opd1 pshufb_opd2 .endm .macro PCLMULQDQ imm8 xmm1 xmm2 XMM_NUM clmul_opd1 \xmm1 XMM_NUM clmul_opd2 \xmm2 PFX_OPD_SIZE PFX_REX clmul_opd1 clmul_opd2 .byte 0x0f, 0x3a, 0x44 MODRM 0xc0 clmul_opd1 clmul_opd2 .byte \imm8 .endm .macro AESKEYGENASSIST rcon xmm1 xmm2 XMM_NUM aeskeygen_opd1 \xmm1 XMM_NUM aeskeygen_opd2 \xmm2 PFX_OPD_SIZE PFX_REX aeskeygen_opd1 aeskeygen_opd2 .byte 0x0f, 0x3a, 0xdf MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2 .byte \rcon .endm .macro AESIMC xmm1 xmm2 XMM_NUM aesimc_opd1 \xmm1 XMM_NUM aesimc_opd2 \xmm2 PFX_OPD_SIZE PFX_REX aesimc_opd1 aesimc_opd2 .byte 0x0f, 0x38, 0xdb MODRM 0xc0 aesimc_opd1 aesimc_opd2 .endm .macro AESENC xmm1 xmm2 XMM_NUM aesenc_opd1 \xmm1 XMM_NUM aesenc_opd2 \xmm2 PFX_OPD_SIZE PFX_REX aesenc_opd1 aesenc_opd2 .byte 0x0f, 0x38, 0xdc MODRM 0xc0 aesenc_opd1 aesenc_opd2 .endm .macro AESENCLAST xmm1 xmm2 XMM_NUM aesenclast_opd1 \xmm1 XMM_NUM aesenclast_opd2 \xmm2 PFX_OPD_SIZE PFX_REX aesenclast_opd1 aesenclast_opd2 .byte 0x0f, 0x38, 0xdd MODRM 0xc0 aesenclast_opd1 aesenclast_opd2 .endm .macro AESDEC xmm1 xmm2 XMM_NUM aesdec_opd1 \xmm1 XMM_NUM aesdec_opd2 \xmm2 PFX_OPD_SIZE PFX_REX aesdec_opd1 aesdec_opd2 .byte 0x0f, 0x38, 0xde MODRM 0xc0 aesdec_opd1 aesdec_opd2 .endm .macro AESDECLAST xmm1 xmm2 XMM_NUM aesdeclast_opd1 \xmm1 XMM_NUM aesdeclast_opd2 \xmm2 PFX_OPD_SIZE PFX_REX aesdeclast_opd1 aesdeclast_opd2 .byte 0x0f, 0x38, 0xdf MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 .endm #endif #endif