Message ID | 20221111074101.2069454-33-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg: Support for Int128 with helpers | expand |
On 11/11/22 04:40, Richard Henderson wrote: > Implement the function for arm, i386, and s390x, which will use it. > Add stubs for all other backends. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- For ppc and common code bits: Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> > tcg/tcg.c | 2 ++ > tcg/aarch64/tcg-target.c.inc | 7 +++++++ > tcg/arm/tcg-target.c.inc | 20 ++++++++++++++++++++ > tcg/i386/tcg-target.c.inc | 8 ++++++++ > tcg/loongarch64/tcg-target.c.inc | 7 +++++++ > tcg/mips/tcg-target.c.inc | 7 +++++++ > tcg/ppc/tcg-target.c.inc | 7 +++++++ > tcg/riscv/tcg-target.c.inc | 7 +++++++ > tcg/s390x/tcg-target.c.inc | 7 +++++++ > tcg/sparc64/tcg-target.c.inc | 7 +++++++ > tcg/tci/tcg-target.c.inc | 7 +++++++ > 11 files changed, 86 insertions(+) > > diff --git a/tcg/tcg.c b/tcg/tcg.c > index 3eabb6ef4d..c276cc87ee 100644 > --- a/tcg/tcg.c > +++ b/tcg/tcg.c > @@ -103,6 +103,8 @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg1, > static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg); > static void tcg_out_movi(TCGContext *s, TCGType type, > TCGReg ret, tcg_target_long arg); > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long) > + __attribute__((unused)); > static void tcg_out_op(TCGContext *s, TCGOpcode opc, > const TCGArg args[TCG_MAX_OP_ARGS], > const int const_args[TCG_MAX_OP_ARGS]); > diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc > index ad1816e32d..2279a14c11 100644 > --- a/tcg/aarch64/tcg-target.c.inc > +++ b/tcg/aarch64/tcg-target.c.inc > @@ -1102,6 +1102,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, > tcg_out_insn(s, 3305, LDR, 0, rd); > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > /* Define something more legible for general use. */ > #define tcg_out_ldst_r tcg_out_insn_3310 > > diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc > index e82749a602..2950a29d49 100644 > --- a/tcg/arm/tcg-target.c.inc > +++ b/tcg/arm/tcg-target.c.inc > @@ -2548,6 +2548,26 @@ static void tcg_out_movi(TCGContext *s, TCGType type, > tcg_out_movi32(s, COND_AL, ret, arg); > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + int enc, opc = ARITH_ADD; > + > + /* All of the easiest immediates to encode are positive. */ > + if (imm < 0) { > + imm = -imm; > + opc = ARITH_SUB; > + } > + enc = encode_imm(imm); > + if (enc >= 0) { > + tcg_out_dat_imm(s, COND_AL, opc, rd, rs, enc); > + } else { > + tcg_out_movi32(s, COND_AL, TCG_REG_TMP, imm); > + tcg_out_dat_reg(s, COND_AL, opc, rd, rs, > + TCG_REG_TMP, SHIFT_IMM_LSL(0)); > + } > +} > + > /* Type is always V128, with I64 elements. */ > static void tcg_out_dup2_vec(TCGContext *s, TCGReg rd, TCGReg rl, TCGReg rh) > { > diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc > index 58bd5873f5..6a021dda8b 100644 > --- a/tcg/i386/tcg-target.c.inc > +++ b/tcg/i386/tcg-target.c.inc > @@ -1069,6 +1069,14 @@ static void tcg_out_movi(TCGContext *s, TCGType type, > } > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + tcg_debug_assert(TCG_TARGET_REG_BITS == 32); > + tcg_out_modrm_offset(s, OPC_LEA, rd, rs, imm); > +} > + > static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val) > { > if (val == (int8_t)val) { > diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc > index c9e99e8ec3..54b1dcd911 100644 > --- a/tcg/loongarch64/tcg-target.c.inc > +++ b/tcg/loongarch64/tcg-target.c.inc > @@ -389,6 +389,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, > } > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg) > { > tcg_out_opc_andi(s, ret, arg, 0xff); > diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc > index 292e490b5c..22b5463f0f 100644 > --- a/tcg/mips/tcg-target.c.inc > +++ b/tcg/mips/tcg-target.c.inc > @@ -550,6 +550,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, > } > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > static void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg, int flags) > { > /* ret and arg can't be register tmp0 */ > diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc > index f561a3492f..d9e4ba8883 100644 > --- a/tcg/ppc/tcg-target.c.inc > +++ b/tcg/ppc/tcg-target.c.inc > @@ -1125,6 +1125,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret, > } > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > static bool mask_operand(uint32_t c, int *mb, int *me) > { > uint32_t lsb, test; > diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc > index aa017d665a..6072945ccb 100644 > --- a/tcg/riscv/tcg-target.c.inc > +++ b/tcg/riscv/tcg-target.c.inc > @@ -545,6 +545,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, > tcg_out_opc_imm(s, OPC_LD, rd, rd, 0); > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg) > { > tcg_out_opc_imm(s, OPC_ANDI, ret, arg, 0xff); > diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc > index c3c0bcc3eb..8663a963a6 100644 > --- a/tcg/s390x/tcg-target.c.inc > +++ b/tcg/s390x/tcg-target.c.inc > @@ -1020,6 +1020,13 @@ static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val, > return false; > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + tcg_out_mem(s, RX_LA, RXY_LAY, rd, rs, TCG_REG_NONE, imm); > +} > + > /* load data from an absolute host address */ > static void tcg_out_ld_abs(TCGContext *s, TCGType type, > TCGReg dest, const void *abs) > diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc > index eb913f33c8..f6a8a8e605 100644 > --- a/tcg/sparc64/tcg-target.c.inc > +++ b/tcg/sparc64/tcg-target.c.inc > @@ -497,6 +497,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, > tcg_out_movi_int(s, type, ret, arg, false, TCG_REG_T2); > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > static void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1, > TCGReg a2, int op) > { > diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc > index d36a7ebdd1..633345d74b 100644 > --- a/tcg/tci/tcg-target.c.inc > +++ b/tcg/tci/tcg-target.c.inc > @@ -557,6 +557,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, > } > } > > +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, > + tcg_target_long imm) > +{ > + /* This function is only used for passing structs by reference. */ > + g_assert_not_reached(); > +} > + > static void tcg_out_call(TCGContext *s, const tcg_insn_unit *func, > const TCGHelperInfo *info) > {
diff --git a/tcg/tcg.c b/tcg/tcg.c index 3eabb6ef4d..c276cc87ee 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -103,6 +103,8 @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg1, static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg); static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret, tcg_target_long arg); +static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long) + __attribute__((unused)); static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg args[TCG_MAX_OP_ARGS], const int const_args[TCG_MAX_OP_ARGS]); diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc index ad1816e32d..2279a14c11 100644 --- a/tcg/aarch64/tcg-target.c.inc +++ b/tcg/aarch64/tcg-target.c.inc @@ -1102,6 +1102,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, tcg_out_insn(s, 3305, LDR, 0, rd); } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + /* Define something more legible for general use. */ #define tcg_out_ldst_r tcg_out_insn_3310 diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc index e82749a602..2950a29d49 100644 --- a/tcg/arm/tcg-target.c.inc +++ b/tcg/arm/tcg-target.c.inc @@ -2548,6 +2548,26 @@ static void tcg_out_movi(TCGContext *s, TCGType type, tcg_out_movi32(s, COND_AL, ret, arg); } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + int enc, opc = ARITH_ADD; + + /* All of the easiest immediates to encode are positive. */ + if (imm < 0) { + imm = -imm; + opc = ARITH_SUB; + } + enc = encode_imm(imm); + if (enc >= 0) { + tcg_out_dat_imm(s, COND_AL, opc, rd, rs, enc); + } else { + tcg_out_movi32(s, COND_AL, TCG_REG_TMP, imm); + tcg_out_dat_reg(s, COND_AL, opc, rd, rs, + TCG_REG_TMP, SHIFT_IMM_LSL(0)); + } +} + /* Type is always V128, with I64 elements. */ static void tcg_out_dup2_vec(TCGContext *s, TCGReg rd, TCGReg rl, TCGReg rh) { diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc index 58bd5873f5..6a021dda8b 100644 --- a/tcg/i386/tcg-target.c.inc +++ b/tcg/i386/tcg-target.c.inc @@ -1069,6 +1069,14 @@ static void tcg_out_movi(TCGContext *s, TCGType type, } } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + tcg_debug_assert(TCG_TARGET_REG_BITS == 32); + tcg_out_modrm_offset(s, OPC_LEA, rd, rs, imm); +} + static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val) { if (val == (int8_t)val) { diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc index c9e99e8ec3..54b1dcd911 100644 --- a/tcg/loongarch64/tcg-target.c.inc +++ b/tcg/loongarch64/tcg-target.c.inc @@ -389,6 +389,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, } } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg) { tcg_out_opc_andi(s, ret, arg, 0xff); diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc index 292e490b5c..22b5463f0f 100644 --- a/tcg/mips/tcg-target.c.inc +++ b/tcg/mips/tcg-target.c.inc @@ -550,6 +550,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, } } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + static void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg, int flags) { /* ret and arg can't be register tmp0 */ diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc index f561a3492f..d9e4ba8883 100644 --- a/tcg/ppc/tcg-target.c.inc +++ b/tcg/ppc/tcg-target.c.inc @@ -1125,6 +1125,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret, } } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + static bool mask_operand(uint32_t c, int *mb, int *me) { uint32_t lsb, test; diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc index aa017d665a..6072945ccb 100644 --- a/tcg/riscv/tcg-target.c.inc +++ b/tcg/riscv/tcg-target.c.inc @@ -545,6 +545,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, tcg_out_opc_imm(s, OPC_LD, rd, rd, 0); } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg) { tcg_out_opc_imm(s, OPC_ANDI, ret, arg, 0xff); diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc index c3c0bcc3eb..8663a963a6 100644 --- a/tcg/s390x/tcg-target.c.inc +++ b/tcg/s390x/tcg-target.c.inc @@ -1020,6 +1020,13 @@ static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val, return false; } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + tcg_out_mem(s, RX_LA, RXY_LAY, rd, rs, TCG_REG_NONE, imm); +} + /* load data from an absolute host address */ static void tcg_out_ld_abs(TCGContext *s, TCGType type, TCGReg dest, const void *abs) diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc index eb913f33c8..f6a8a8e605 100644 --- a/tcg/sparc64/tcg-target.c.inc +++ b/tcg/sparc64/tcg-target.c.inc @@ -497,6 +497,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, tcg_out_movi_int(s, type, ret, arg, false, TCG_REG_T2); } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + static void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1, TCGReg a2, int op) { diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc index d36a7ebdd1..633345d74b 100644 --- a/tcg/tci/tcg-target.c.inc +++ b/tcg/tci/tcg-target.c.inc @@ -557,6 +557,13 @@ static void tcg_out_movi(TCGContext *s, TCGType type, } } +static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs, + tcg_target_long imm) +{ + /* This function is only used for passing structs by reference. */ + g_assert_not_reached(); +} + static void tcg_out_call(TCGContext *s, const tcg_insn_unit *func, const TCGHelperInfo *info) {
Implement the function for arm, i386, and s390x, which will use it. Add stubs for all other backends. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/tcg.c | 2 ++ tcg/aarch64/tcg-target.c.inc | 7 +++++++ tcg/arm/tcg-target.c.inc | 20 ++++++++++++++++++++ tcg/i386/tcg-target.c.inc | 8 ++++++++ tcg/loongarch64/tcg-target.c.inc | 7 +++++++ tcg/mips/tcg-target.c.inc | 7 +++++++ tcg/ppc/tcg-target.c.inc | 7 +++++++ tcg/riscv/tcg-target.c.inc | 7 +++++++ tcg/s390x/tcg-target.c.inc | 7 +++++++ tcg/sparc64/tcg-target.c.inc | 7 +++++++ tcg/tci/tcg-target.c.inc | 7 +++++++ 11 files changed, 86 insertions(+)