10 #define REG_NUM_INVALID 100
12 #define REG_TYPE_R64 0
13 #define REG_TYPE_XMM 1
14 #define REG_TYPE_INVALID 100
16 .macro R64_NUM opd r64
17 \opd = REG_NUM_INVALID
68 .macro XMM_NUM opd xmm
69 \opd = REG_NUM_INVALID
121 R64_NUM reg_type_r64 \reg
122 XMM_NUM reg_type_xmm \reg
123 .if reg_type_r64 <> REG_NUM_INVALID
125 .elseif reg_type_xmm <> REG_NUM_INVALID
127 .else
\type = REG_TYPE_INVALID
135 .macro PFX_REX opd1 opd2
W=0
136 .if ((\opd1 | \opd2) & 8) || \W
137 .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3)
141 .macro MODRM
mod opd1 opd2
142 .
byte \
mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
145 .macro PSHUFB_XMM xmm1 xmm2
146 XMM_NUM pshufb_opd1 \xmm1
147 XMM_NUM pshufb_opd2 \xmm2
149 PFX_REX pshufb_opd1 pshufb_opd2
150 .byte 0x0f, 0x38, 0x00
151 MODRM 0xc0 pshufb_opd1 pshufb_opd2
154 .macro PCLMULQDQ imm8 xmm1 xmm2
155 XMM_NUM clmul_opd1 \xmm1
156 XMM_NUM clmul_opd2 \xmm2
158 PFX_REX clmul_opd1 clmul_opd2
159 .byte 0x0f, 0x3a, 0x44
160 MODRM 0xc0 clmul_opd1 clmul_opd2
164 .macro AESKEYGENASSIST rcon xmm1 xmm2
165 XMM_NUM aeskeygen_opd1 \xmm1
166 XMM_NUM aeskeygen_opd2 \xmm2
168 PFX_REX aeskeygen_opd1 aeskeygen_opd2
169 .byte 0x0f, 0x3a, 0xdf
170 MODRM 0xc0 aeskeygen_opd1 aeskeygen_opd2
174 .macro AESIMC xmm1 xmm2
175 XMM_NUM aesimc_opd1 \xmm1
176 XMM_NUM aesimc_opd2 \xmm2
178 PFX_REX aesimc_opd1 aesimc_opd2
179 .byte 0x0f, 0x38, 0xdb
180 MODRM 0xc0 aesimc_opd1 aesimc_opd2
183 .macro AESENC xmm1 xmm2
184 XMM_NUM aesenc_opd1 \xmm1
185 XMM_NUM aesenc_opd2 \xmm2
187 PFX_REX aesenc_opd1 aesenc_opd2
188 .byte 0x0f, 0x38, 0xdc
189 MODRM 0xc0 aesenc_opd1 aesenc_opd2
192 .macro AESENCLAST xmm1 xmm2
193 XMM_NUM aesenclast_opd1 \xmm1
194 XMM_NUM aesenclast_opd2 \xmm2
196 PFX_REX aesenclast_opd1 aesenclast_opd2
197 .byte 0x0f, 0x38, 0xdd
198 MODRM 0xc0 aesenclast_opd1 aesenclast_opd2
201 .macro AESDEC xmm1 xmm2
202 XMM_NUM aesdec_opd1 \xmm1
203 XMM_NUM aesdec_opd2 \xmm2
205 PFX_REX aesdec_opd1 aesdec_opd2
206 .byte 0x0f, 0x38, 0xde
207 MODRM 0xc0 aesdec_opd1 aesdec_opd2
210 .macro AESDECLAST xmm1 xmm2
211 XMM_NUM aesdeclast_opd1 \xmm1
212 XMM_NUM aesdeclast_opd2 \xmm2
214 PFX_REX aesdeclast_opd1 aesdeclast_opd2
215 .byte 0x0f, 0x38, 0xdf
216 MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2
219 .macro MOVQ_R64_XMM opd1 opd2
220 REG_TYPE movq_r64_xmm_opd1_type \opd1
221 .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
222 XMM_NUM movq_r64_xmm_opd1 \opd1
223 R64_NUM movq_r64_xmm_opd2 \opd2
225 R64_NUM movq_r64_xmm_opd1 \opd1
226 XMM_NUM movq_r64_xmm_opd2 \opd2
229 PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1
230 .if movq_r64_xmm_opd1_type == REG_TYPE_XMM
235 MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2