Missing boolean_expression TARGET_ZMMUL in riscv_rtx_costs() casuse different instructions when multiplying an integer with a constant. ( https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1482 )
int foo(int *ib) { *ib = *ib * 33938; return 0; } rv64im: lw a4,0(a1) li a5,32768 addiw a5,a5,1170 mulw a5,a5,a4 sw a5,0(a1) ret rv64i_zmmul: lw a4,0(a1) slliw a5,a4,5 addw a5,a5,a4 slliw a5,a5,3 addw a5,a5,a4 slliw a5,a5,3 addw a5,a5,a4 slliw a5,a5,3 addw a5,a5,a4 slliw a5,a5,1 sw a5,0(a1) ret Fixed. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_rtx_costs): Add TARGET_ZMMUL. --- gcc/config/riscv/riscv.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 85df5b7ab49..580ae007181 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -3753,7 +3753,7 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN case MULT: if (float_mode_p) *total = tune_param->fp_mul[mode == DFmode]; - else if (!TARGET_MUL) + else if (!(TARGET_MUL || TARGET_ZMMUL)) /* Estimate the cost of a library call. */ *total = COSTS_N_INSNS (speed ? 32 : 6); else if (GET_MODE_SIZE (mode).to_constant () > UNITS_PER_WORD) -- 2.34.1