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 .macro XMM_NUM opd xmm 11 .ifc \xmm,%xmm0 12 \opd = 0 13 .endif 14 .ifc \xmm,%xmm1 15 \opd = 1 16 .endif 17 .ifc \xmm,%xmm2 18 \opd = 2 19 .endif 20 .ifc \xmm,%xmm3 21 \opd = 3 22 .endif 23 .ifc \xmm,%xmm4 24 \opd = 4 25 .endif 26 .ifc \xmm,%xmm5 27 \opd = 5 28 .endif 29 .ifc \xmm,%xmm6 30 \opd = 6 31 .endif 32 .ifc \xmm,%xmm7 33 \opd = 7 34 .endif 35 .ifc \xmm,%xmm8 36 \opd = 8 37 .endif 38 .ifc \xmm,%xmm9 39 \opd = 9 40 .endif 41 .ifc \xmm,%xmm10 42 \opd = 10 43 .endif 44 .ifc \xmm,%xmm11 45 \opd = 11 46 .endif 47 .ifc \xmm,%xmm12 48 \opd = 12 49 .endif 50 .ifc \xmm,%xmm13 51 \opd = 13 52 .endif 53 .ifc \xmm,%xmm14 54 \opd = 14 55 .endif 56 .ifc \xmm,%xmm15 57 \opd = 15 58 .endif 59 .endm 60 61 .macro PFX_OPD_SIZE 62 .byte 0x66 63 .endm 64 65 .macro PFX_REX opd1 opd2 66 .if (\opd1 | \opd2) & 8 67 .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) 68 .endif 69 .endm 70 71 .macro MODRM mod opd1 opd2 72 .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) 73 .endm 74 75 .macro PSHUFB_XMM xmm1 xmm2 76 XMM_NUM pshufb_opd1 \xmm1 77 XMM_NUM pshufb_opd2 \xmm2 78 PFX_OPD_SIZE 79 PFX_REX pshufb_opd1 pshufb_opd2 80 .byte 0x0f, 0x38, 0x00 81 MODRM 0xc0 pshufb_opd1 pshufb_opd2 82 .endm 83 84 .macro PCLMULQDQ imm8 xmm1 xmm2 85 XMM_NUM clmul_opd1 \xmm1 86 XMM_NUM clmul_opd2 \xmm2 87 PFX_OPD_SIZE 88 PFX_REX clmul_opd1 clmul_opd2 89 .byte 0x0f, 0x3a, 0x44 90 MODRM 0xc0 clmul_opd1 clmul_opd2 91 .byte \imm8 92 .endm 93 94 .macro AESKEYGENASSIST rcon xmm1 xmm2 95 XMM_NUM aeskeygen_opd1 \xmm1 96 XMM_NUM aeskeygen_opd2 \xmm2 97 PFX_OPD_SIZE 98 PFX_REX aeskeygen_opd1 aeskeygen_opd2 99 .byte 0x0f, 0x3a, 0xdf 100 MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2 101 .byte \rcon 102 .endm 103 104 .macro AESIMC xmm1 xmm2 105 XMM_NUM aesimc_opd1 \xmm1 106 XMM_NUM aesimc_opd2 \xmm2 107 PFX_OPD_SIZE 108 PFX_REX aesimc_opd1 aesimc_opd2 109 .byte 0x0f, 0x38, 0xdb 110 MODRM 0xc0 aesimc_opd1 aesimc_opd2 111 .endm 112 113 .macro AESENC xmm1 xmm2 114 XMM_NUM aesenc_opd1 \xmm1 115 XMM_NUM aesenc_opd2 \xmm2 116 PFX_OPD_SIZE 117 PFX_REX aesenc_opd1 aesenc_opd2 118 .byte 0x0f, 0x38, 0xdc 119 MODRM 0xc0 aesenc_opd1 aesenc_opd2 120 .endm 121 122 .macro AESENCLAST xmm1 xmm2 123 XMM_NUM aesenclast_opd1 \xmm1 124 XMM_NUM aesenclast_opd2 \xmm2 125 PFX_OPD_SIZE 126 PFX_REX aesenclast_opd1 aesenclast_opd2 127 .byte 0x0f, 0x38, 0xdd 128 MODRM 0xc0 aesenclast_opd1 aesenclast_opd2 129 .endm 130 131 .macro AESDEC xmm1 xmm2 132 XMM_NUM aesdec_opd1 \xmm1 133 XMM_NUM aesdec_opd2 \xmm2 134 PFX_OPD_SIZE 135 PFX_REX aesdec_opd1 aesdec_opd2 136 .byte 0x0f, 0x38, 0xde 137 MODRM 0xc0 aesdec_opd1 aesdec_opd2 138 .endm 139 140 .macro AESDECLAST xmm1 xmm2 141 XMM_NUM aesdeclast_opd1 \xmm1 142 XMM_NUM aesdeclast_opd2 \xmm2 143 PFX_OPD_SIZE 144 PFX_REX aesdeclast_opd1 aesdeclast_opd2 145 .byte 0x0f, 0x38, 0xdf 146 MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 147 .endm 148 #endif 149 150 #endif 151