| .. | .. | 
|---|
| 12 | 12 |   | 
|---|
| 13 | 13 |  #define REG_TYPE_R32		0 | 
|---|
| 14 | 14 |  #define REG_TYPE_R64		1 | 
|---|
| 15 |  | -#define REG_TYPE_XMM		2  | 
|---|
| 16 | 15 |  #define REG_TYPE_INVALID	100 | 
|---|
| 17 | 16 |   | 
|---|
| 18 | 17 |  	.macro R32_NUM opd r32 | 
|---|
| .. | .. | 
|---|
| 123 | 122 |  #endif | 
|---|
| 124 | 123 |  	.endm | 
|---|
| 125 | 124 |   | 
|---|
| 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 | 125 |  	.macro REG_TYPE type reg | 
|---|
| 179 | 126 |  	R32_NUM reg_type_r32 \reg | 
|---|
| 180 | 127 |  	R64_NUM reg_type_r64 \reg | 
|---|
| 181 |  | -	XMM_NUM reg_type_xmm \reg  | 
|---|
| 182 | 128 |  	.if reg_type_r64 <> REG_NUM_INVALID | 
|---|
| 183 | 129 |  	\type = REG_TYPE_R64 | 
|---|
| 184 | 130 |  	.elseif reg_type_r32 <> REG_NUM_INVALID | 
|---|
| 185 | 131 |  	\type = REG_TYPE_R32 | 
|---|
| 186 |  | -	.elseif reg_type_xmm <> REG_NUM_INVALID  | 
|---|
| 187 |  | -	\type = REG_TYPE_XMM  | 
|---|
| 188 | 132 |  	.else | 
|---|
| 189 | 133 |  	\type = REG_TYPE_INVALID | 
|---|
| 190 | 134 |  	.endif | 
|---|
| 191 |  | -	.endm  | 
|---|
| 192 |  | -  | 
|---|
| 193 |  | -	.macro PFX_OPD_SIZE  | 
|---|
| 194 |  | -	.byte 0x66  | 
|---|
| 195 | 135 |  	.endm | 
|---|
| 196 | 136 |   | 
|---|
| 197 | 137 |  	.macro PFX_REX opd1 opd2 W=0 | 
|---|
| .. | .. | 
|---|
| 204 | 144 |  	.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) | 
|---|
| 205 | 145 |  	.endm | 
|---|
| 206 | 146 |   | 
|---|
| 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  | 
|---|
 | 147 | +.macro RDPID opd  | 
|---|
 | 148 | +	REG_TYPE rdpid_opd_type \opd  | 
|---|
 | 149 | +	.if rdpid_opd_type == REG_TYPE_R64  | 
|---|
 | 150 | +	R64_NUM rdpid_opd \opd  | 
|---|
| 296 | 151 |  	.else | 
|---|
| 297 |  | -	R64_NUM movq_r64_xmm_opd1 \opd1  | 
|---|
| 298 |  | -	XMM_NUM movq_r64_xmm_opd2 \opd2  | 
|---|
 | 152 | +	R32_NUM rdpid_opd \opd  | 
|---|
| 299 | 153 |  	.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  | 
|---|
 | 154 | +	.byte 0xf3  | 
|---|
 | 155 | +	.if rdpid_opd > 7  | 
|---|
 | 156 | +	PFX_REX rdpid_opd 0  | 
|---|
| 306 | 157 |  	.endif | 
|---|
| 307 |  | -	MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2  | 
|---|
| 308 |  | -	.endm  | 
|---|
 | 158 | +	.byte 0x0f, 0xc7  | 
|---|
 | 159 | +	MODRM 0xc0 rdpid_opd 0x7  | 
|---|
 | 160 | +.endm  | 
|---|
| 309 | 161 |  #endif | 
|---|
| 310 | 162 |   | 
|---|
| 311 | 163 |  #endif | 
|---|