Message ID | 20230503085657.1814850-4-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg/riscv: Support for Zba, Zbb, Zicond extensions | expand |
On 5/3/23 05:56, Richard Henderson wrote: > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > 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);
On Wed, May 3, 2023 at 6:58 PM Richard Henderson <richard.henderson@linaro.org> wrote: > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: Alistair Francis <alistair.francis@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 > >
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);
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- 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(-)