|
|
|
@ -462,6 +462,14 @@ static bool tcg_target_const_match(int64_t val, int ct, |
|
|
|
#define OPC_VPSRLVD (0x45 | P_EXT38 | P_DATA16) |
|
|
|
#define OPC_VPSRLVQ (0x45 | P_EXT38 | P_DATA16 | P_VEXW) |
|
|
|
#define OPC_VPTERNLOGQ (0x25 | P_EXT3A | P_DATA16 | P_VEXW | P_EVEX) |
|
|
|
#define OPC_VPTESTMB (0x26 | P_EXT38 | P_DATA16 | P_EVEX) |
|
|
|
#define OPC_VPTESTMW (0x26 | P_EXT38 | P_DATA16 | P_VEXW | P_EVEX) |
|
|
|
#define OPC_VPTESTMD (0x27 | P_EXT38 | P_DATA16 | P_EVEX) |
|
|
|
#define OPC_VPTESTMQ (0x27 | P_EXT38 | P_DATA16 | P_VEXW | P_EVEX) |
|
|
|
#define OPC_VPTESTNMB (0x26 | P_EXT38 | P_SIMDF3 | P_EVEX) |
|
|
|
#define OPC_VPTESTNMW (0x26 | P_EXT38 | P_SIMDF3 | P_VEXW | P_EVEX) |
|
|
|
#define OPC_VPTESTNMD (0x27 | P_EXT38 | P_SIMDF3 | P_EVEX) |
|
|
|
#define OPC_VPTESTNMQ (0x27 | P_EXT38 | P_SIMDF3 | P_VEXW | P_EVEX) |
|
|
|
#define OPC_VZEROUPPER (0x77 | P_EXT) |
|
|
|
#define OPC_XCHG_ax_r32 (0x90) |
|
|
|
#define OPC_XCHG_EvGv (0x87) |
|
|
|
@ -3145,6 +3153,13 @@ static void tcg_out_cmp_vec_k1(TCGContext *s, TCGType type, unsigned vece, |
|
|
|
{ OPC_VPCMPB, OPC_VPCMPW, OPC_VPCMPD, OPC_VPCMPQ }, |
|
|
|
{ OPC_VPCMPUB, OPC_VPCMPUW, OPC_VPCMPUD, OPC_VPCMPUQ } |
|
|
|
}; |
|
|
|
static const int testm_insn[4] = { |
|
|
|
OPC_VPTESTMB, OPC_VPTESTMW, OPC_VPTESTMD, OPC_VPTESTMQ |
|
|
|
}; |
|
|
|
static const int testnm_insn[4] = { |
|
|
|
OPC_VPTESTNMB, OPC_VPTESTNMW, OPC_VPTESTNMD, OPC_VPTESTNMQ |
|
|
|
}; |
|
|
|
|
|
|
|
static const int cond_ext[16] = { |
|
|
|
[TCG_COND_EQ] = 0, |
|
|
|
[TCG_COND_NE] = 4, |
|
|
|
@ -3160,9 +3175,19 @@ static void tcg_out_cmp_vec_k1(TCGContext *s, TCGType type, unsigned vece, |
|
|
|
[TCG_COND_ALWAYS] = 7, |
|
|
|
}; |
|
|
|
|
|
|
|
tcg_out_vex_modrm_type(s, cmpm_insn[is_unsigned_cond(cond)][vece], |
|
|
|
/* k1 */ 1, v1, v2, type); |
|
|
|
tcg_out8(s, cond_ext[cond]); |
|
|
|
switch (cond) { |
|
|
|
case TCG_COND_TSTNE: |
|
|
|
tcg_out_vex_modrm_type(s, testm_insn[vece], /* k1 */ 1, v1, v2, type); |
|
|
|
break; |
|
|
|
case TCG_COND_TSTEQ: |
|
|
|
tcg_out_vex_modrm_type(s, testnm_insn[vece], /* k1 */ 1, v1, v2, type); |
|
|
|
break; |
|
|
|
default: |
|
|
|
tcg_out_vex_modrm_type(s, cmpm_insn[is_unsigned_cond(cond)][vece], |
|
|
|
/* k1 */ 1, v1, v2, type); |
|
|
|
tcg_out8(s, cond_ext[cond]); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void tcg_out_k1_to_vec(TCGContext *s, TCGType type, |
|
|
|
|