[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 05/31] tcg/i386: Split out tcg_out_vex_modrm_type
From: |
Richard Henderson |
Subject: |
[PULL 05/31] tcg/i386: Split out tcg_out_vex_modrm_type |
Date: |
Sun, 22 Sep 2024 14:00:46 +0200 |
Helper function to handle setting of VEXL based
on the type of the operation.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/i386/tcg-target.c.inc | 38 +++++++++++++++-----------------------
1 file changed, 15 insertions(+), 23 deletions(-)
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
index 9a54ef7f8d..af71a397b1 100644
--- a/tcg/i386/tcg-target.c.inc
+++ b/tcg/i386/tcg-target.c.inc
@@ -711,6 +711,15 @@ static void tcg_out_vex_modrm(TCGContext *s, int opc, int
r, int v, int rm)
tcg_out8(s, 0xc0 | (LOWREGMASK(r) << 3) | LOWREGMASK(rm));
}
+static void tcg_out_vex_modrm_type(TCGContext *s, int opc,
+ int r, int v, int rm, TCGType type)
+{
+ if (type == TCG_TYPE_V256) {
+ opc |= P_VEXL;
+ }
+ tcg_out_vex_modrm(s, opc, r, v, rm);
+}
+
/* Output an opcode with a full "rm + (index<<shift) + offset" address mode.
We handle either RM and INDEX missing with a negative value. In 64-bit
mode for absolute addresses, ~RM is the size of the immediate operand
@@ -904,8 +913,7 @@ static bool tcg_out_dup_vec(TCGContext *s, TCGType type,
unsigned vece,
TCGReg r, TCGReg a)
{
if (have_avx2) {
- int vex_l = (type == TCG_TYPE_V256 ? P_VEXL : 0);
- tcg_out_vex_modrm(s, avx2_dup_insn[vece] + vex_l, r, 0, a);
+ tcg_out_vex_modrm_type(s, avx2_dup_insn[vece], r, 0, a, type);
} else {
switch (vece) {
case MO_8:
@@ -3231,10 +3239,7 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
goto gen_simd;
gen_simd:
tcg_debug_assert(insn != OPC_UD2);
- if (type == TCG_TYPE_V256) {
- insn |= P_VEXL;
- }
- tcg_out_vex_modrm(s, insn, a0, a1, a2);
+ tcg_out_vex_modrm_type(s, insn, a0, a1, a2, type);
break;
case INDEX_op_cmp_vec:
@@ -3250,10 +3255,7 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_andc_vec:
insn = OPC_PANDN;
- if (type == TCG_TYPE_V256) {
- insn |= P_VEXL;
- }
- tcg_out_vex_modrm(s, insn, a0, a2, a1);
+ tcg_out_vex_modrm_type(s, insn, a0, a2, a1, type);
break;
case INDEX_op_shli_vec:
@@ -3281,10 +3283,7 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
goto gen_shift;
gen_shift:
tcg_debug_assert(vece != MO_8);
- if (type == TCG_TYPE_V256) {
- insn |= P_VEXL;
- }
- tcg_out_vex_modrm(s, insn, sub, a0, a1);
+ tcg_out_vex_modrm_type(s, insn, sub, a0, a1, type);
tcg_out8(s, a2);
break;
@@ -3361,19 +3360,12 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
gen_simd_imm8:
tcg_debug_assert(insn != OPC_UD2);
- if (type == TCG_TYPE_V256) {
- insn |= P_VEXL;
- }
- tcg_out_vex_modrm(s, insn, a0, a1, a2);
+ tcg_out_vex_modrm_type(s, insn, a0, a1, a2, type);
tcg_out8(s, sub);
break;
case INDEX_op_x86_vpblendvb_vec:
- insn = OPC_VPBLENDVB;
- if (type == TCG_TYPE_V256) {
- insn |= P_VEXL;
- }
- tcg_out_vex_modrm(s, insn, a0, a1, a2);
+ tcg_out_vex_modrm_type(s, OPC_VPBLENDVB, a0, a1, a2, type);
tcg_out8(s, args[3] << 4);
break;
--
2.43.0
- [PULL 18/31] tcg/ppc: Implement cmpsel_vec, (continued)
- [PULL 18/31] tcg/ppc: Implement cmpsel_vec, Richard Henderson, 2024/09/22
- [PULL 01/31] tcg: Return TCGOp from tcg_gen_op[1-6], Richard Henderson, 2024/09/22
- [PULL 08/31] tcg/ppc: Do not expand cmp_vec early, Richard Henderson, 2024/09/22
- [PULL 13/31] tcg/i386: Optimize cmpsel with constant 0 operand 3., Richard Henderson, 2024/09/22
- [PULL 11/31] tcg/optimize: Optimize cmp_vec and cmpsel_vec, Richard Henderson, 2024/09/22
- [PULL 06/31] tcg/i386: Do not expand cmp_vec early, Richard Henderson, 2024/09/22
- [PULL 15/31] tcg/i386: Add predicate parameters to tcg_out_evex_opc, Richard Henderson, 2024/09/22
- [PULL 17/31] tcg/i386: Implement vector TST{EQ,NE} for avx512, Richard Henderson, 2024/09/22
- [PULL 21/31] tcg/s390x: Optimize cmpsel with constant 0/-1 arguments, Richard Henderson, 2024/09/22
- [PULL 02/31] tcg: Propagate new TCGOp to add_as_label_use, Richard Henderson, 2024/09/22
- [PULL 05/31] tcg/i386: Split out tcg_out_vex_modrm_type,
Richard Henderson <=
- [PULL 07/31] tcg/i386: Do not expand cmpsel_vec early, Richard Henderson, 2024/09/22
- [PULL 10/31] tcg/optimize: Fold movcond with true and false values identical, Richard Henderson, 2024/09/22
- [PULL 12/31] tcg/optimize: Optimize bitsel_vec, Richard Henderson, 2024/09/22
- [PULL 16/31] tcg/i386: Implement cmpsel_vec with avx512 insns, Richard Henderson, 2024/09/22
- [PULL 09/31] tcg/s390x: Do not expand cmp_vec early, Richard Henderson, 2024/09/22
- [PULL 24/31] linux-user, mips: update syscall-args-o32.c.inc to Linux v6.10, Richard Henderson, 2024/09/22
- [PULL 20/31] tcg/s390x: Implement cmpsel_vec, Richard Henderson, 2024/09/22
- [PULL 23/31] linux-user: update syscall_nr.h to Linux v6.10, Richard Henderson, 2024/09/22
- [PULL 26/31] linux-user,aarch64: move to syscalltbl file, Richard Henderson, 2024/09/22
- [PULL 04/31] tcg: Export vec_gen_6, Richard Henderson, 2024/09/22