On Wed, May 3, 2023 at 6:58 PM Richard Henderson <richard.hender...@linaro.org> wrote: > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
Acked-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > tcg/riscv/tcg-target-con-set.h | 1 + > tcg/riscv/tcg-target-con-str.h | 1 + > tcg/riscv/tcg-target.h | 12 +++++----- > tcg/riscv/tcg-target.c.inc | 41 ++++++++++++++++++++++++++++++++++ > 4 files changed, 49 insertions(+), 6 deletions(-) > > diff --git a/tcg/riscv/tcg-target-con-set.h b/tcg/riscv/tcg-target-con-set.h > index d88888d3ac..1a33ece98f 100644 > --- a/tcg/riscv/tcg-target-con-set.h > +++ b/tcg/riscv/tcg-target-con-set.h > @@ -15,6 +15,7 @@ C_O0_I2(rZ, rZ) > C_O1_I1(r, r) > C_O1_I2(r, r, ri) > C_O1_I2(r, r, rI) > +C_O1_I2(r, r, rJ) > C_O1_I2(r, rZ, rN) > C_O1_I2(r, rZ, rZ) > C_O2_I4(r, r, rZ, rZ, rM, rM) > diff --git a/tcg/riscv/tcg-target-con-str.h b/tcg/riscv/tcg-target-con-str.h > index 6f1cfb976c..d5c419dff1 100644 > --- a/tcg/riscv/tcg-target-con-str.h > +++ b/tcg/riscv/tcg-target-con-str.h > @@ -15,6 +15,7 @@ REGS('r', ALL_GENERAL_REGS) > * CONST(letter, TCG_CT_CONST_* bit set) > */ > CONST('I', TCG_CT_CONST_S12) > +CONST('J', TCG_CT_CONST_J12) > CONST('N', TCG_CT_CONST_N12) > CONST('M', TCG_CT_CONST_M12) > CONST('Z', TCG_CT_CONST_ZERO) > diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h > index 863ac8ba2f..9f58d46208 100644 > --- a/tcg/riscv/tcg-target.h > +++ b/tcg/riscv/tcg-target.h > @@ -120,9 +120,9 @@ extern bool have_zbb; > #define TCG_TARGET_HAS_bswap32_i32 0 > #define TCG_TARGET_HAS_not_i32 1 > #define TCG_TARGET_HAS_neg_i32 1 > -#define TCG_TARGET_HAS_andc_i32 0 > -#define TCG_TARGET_HAS_orc_i32 0 > -#define TCG_TARGET_HAS_eqv_i32 0 > +#define TCG_TARGET_HAS_andc_i32 have_zbb > +#define TCG_TARGET_HAS_orc_i32 have_zbb > +#define TCG_TARGET_HAS_eqv_i32 have_zbb > #define TCG_TARGET_HAS_nand_i32 0 > #define TCG_TARGET_HAS_nor_i32 0 > #define TCG_TARGET_HAS_clz_i32 0 > @@ -154,9 +154,9 @@ extern bool have_zbb; > #define TCG_TARGET_HAS_bswap64_i64 0 > #define TCG_TARGET_HAS_not_i64 1 > #define TCG_TARGET_HAS_neg_i64 1 > -#define TCG_TARGET_HAS_andc_i64 0 > -#define TCG_TARGET_HAS_orc_i64 0 > -#define TCG_TARGET_HAS_eqv_i64 0 > +#define TCG_TARGET_HAS_andc_i64 have_zbb > +#define TCG_TARGET_HAS_orc_i64 have_zbb > +#define TCG_TARGET_HAS_eqv_i64 have_zbb > #define TCG_TARGET_HAS_nand_i64 0 > #define TCG_TARGET_HAS_nor_i64 0 > #define TCG_TARGET_HAS_clz_i64 0 > diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc > index 49ff9c8b9d..c5b060023f 100644 > --- a/tcg/riscv/tcg-target.c.inc > +++ b/tcg/riscv/tcg-target.c.inc > @@ -138,6 +138,7 @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind > kind, int slot) > #define TCG_CT_CONST_S12 0x200 > #define TCG_CT_CONST_N12 0x400 > #define TCG_CT_CONST_M12 0x800 > +#define TCG_CT_CONST_J12 0x1000 > > #define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32) > > @@ -174,6 +175,13 @@ static bool tcg_target_const_match(int64_t val, TCGType > type, int ct) > if ((ct & TCG_CT_CONST_M12) && val >= -0x7ff && val <= 0x7ff) { > return 1; > } > + /* > + * Inverse of sign extended from 12 bits: ~[-0x800, 0x7ff]. > + * Used to map ANDN back to ANDI, etc. > + */ > + if ((ct & TCG_CT_CONST_J12) && ~val >= -0x800 && ~val <= 0x7ff) { > + return 1; > + } > return 0; > } > > @@ -1306,6 +1314,31 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, > } > break; > > + case INDEX_op_andc_i32: > + case INDEX_op_andc_i64: > + if (c2) { > + tcg_out_opc_imm(s, OPC_ANDI, a0, a1, ~a2); > + } else { > + tcg_out_opc_reg(s, OPC_ANDN, a0, a1, a2); > + } > + break; > + case INDEX_op_orc_i32: > + case INDEX_op_orc_i64: > + if (c2) { > + tcg_out_opc_imm(s, OPC_ORI, a0, a1, ~a2); > + } else { > + tcg_out_opc_reg(s, OPC_ORN, a0, a1, a2); > + } > + break; > + case INDEX_op_eqv_i32: > + case INDEX_op_eqv_i64: > + if (c2) { > + tcg_out_opc_imm(s, OPC_XORI, a0, a1, ~a2); > + } else { > + tcg_out_opc_reg(s, OPC_XNOR, a0, a1, a2); > + } > + break; > + > case INDEX_op_not_i32: > case INDEX_op_not_i64: > tcg_out_opc_imm(s, OPC_XORI, a0, a1, -1); > @@ -1536,6 +1569,14 @@ static TCGConstraintSetIndex > tcg_target_op_def(TCGOpcode op) > case INDEX_op_xor_i64: > return C_O1_I2(r, r, rI); > > + case INDEX_op_andc_i32: > + case INDEX_op_andc_i64: > + case INDEX_op_orc_i32: > + case INDEX_op_orc_i64: > + case INDEX_op_eqv_i32: > + case INDEX_op_eqv_i64: > + return C_O1_I2(r, r, rJ); > + > case INDEX_op_sub_i32: > case INDEX_op_sub_i64: > return C_O1_I2(r, rZ, rN); > -- > 2.34.1 > >