From ea5367e98e6611b566916387a0c337fb38983c60 Mon Sep 17 00:00:00 2001 From: Alex Turjan Date: Fri, 12 Dec 2025 06:05:43 -0800 Subject: [PATCH] fixed rmx500 latencies and rtx_costs --- gcc/config/riscv/arcv-rmx500.md | 25 ++++++++++++----------- gcc/config/riscv/riscv.cc | 36 ++++++++++++++++----------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/gcc/config/riscv/arcv-rmx500.md b/gcc/config/riscv/arcv-rmx500.md index 0c9df3e23da8..b78d1211c33b 100644 --- a/gcc/config/riscv/arcv-rmx500.md +++ b/gcc/config/riscv/arcv-rmx500.md @@ -35,6 +35,7 @@ (define_cpu_unit "arcv_rmx500_issueB_fuse1" "arcv_rmx500") ;; Instruction reservation for arithmetic instructions (pipe A, pipe B). +;; instructions can be issued back to back - after 1 cycle the result is available (define_insn_reservation "arcv_rmx500_alu_early_arith" 1 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "unknown,move,const,arith,shift,slt,multi,auipc,nop,logical,\ @@ -42,10 +43,10 @@ condmove,mvpair,zicond,cpop,clmul")) "((arcv_rmx500_issueA_fuse0 + arcv_rmx500_ALU_A_fuse0_early) | (arcv_rmx500_issueA_fuse1 + arcv_rmx500_ALU_A_fuse1_early)) | ((arcv_rmx500_issueB_fuse0 + arcv_rmx500_ALU_B_fuse0_early) | (arcv_rmx500_issueB_fuse1 + arcv_rmx500_ALU_B_fuse1_early))") -(define_insn_reservation "arcv_rmx500_imul_fused" 1 +(define_insn_reservation "arcv_rmx500_imul_fused" 3 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "imul_fused")) - "(arcv_rmx500_issueA_fuse0 + arcv_rmx500_issueA_fuse1 + arcv_rmx500_ALU_A_fuse0_early + arcv_rmx500_ALU_A_fuse1_early + arcv_rmx500_MPY32)") + "(arcv_rmx500_issueA_fuse0 + arcv_rmx500_issueA_fuse1 + arcv_rmx500_ALU_A_fuse0_early + arcv_rmx500_ALU_A_fuse1_early + arcv_rmx500_MPY32), nothing*2") (define_insn_reservation "arcv_rmx500_alu_fused" 1 (and (eq_attr "tune" "arcv_rmx500") @@ -58,20 +59,20 @@ (eq_attr "type" "branch,jump,call,jalr,ret,trap")) "arcv_rmx500_issueA_fuse0 | arcv_rmx500_issueA_fuse1") -(define_insn_reservation "arcv_rmx500_div_insn" 22 +(define_insn_reservation "arcv_rmx500_div_insn" 21 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "idiv")) - "arcv_rmx500_issueA_fuse0 + arcv_rmx500_DIV, nothing*21") + "arcv_rmx500_issueA_fuse0 + arcv_rmx500_DIV, nothing*20") -(define_insn_reservation "arcv_rmx500_mpy32_insn" 10 +(define_insn_reservation "arcv_rmx500_mpy32_insn" 3 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "imul")) - "arcv_rmx500_issueA_fuse0 + arcv_rmx500_MPY32, nothing*9") + "arcv_rmx500_issueA_fuse0 + arcv_rmx500_MPY32, nothing*2") -(define_insn_reservation "arcv_rmx500_load_insn" 1 +(define_insn_reservation "arcv_rmx500_load_insn" 2 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "load,fpload")) - "(arcv_rmx500_issueB_fuse0 + arcv_rmx500_DMP_fuse0) | (arcv_rmx500_issueB_fuse1 + arcv_rmx500_DMP_fuse1)") + "(arcv_rmx500_issueB_fuse0 + arcv_rmx500_DMP_fuse0) | (arcv_rmx500_issueB_fuse1 + arcv_rmx500_DMP_fuse1), nothing") (define_insn_reservation "arcv_rmx500_store_insn" 1 (and (eq_attr "tune" "arcv_rmx500") @@ -79,15 +80,15 @@ "(arcv_rmx500_issueB_fuse0 + arcv_rmx500_DMP_fuse0) | (arcv_rmx500_issueB_fuse1 + arcv_rmx500_DMP_fuse1)") ;; (soft) floating points -(define_insn_reservation "arcv_rmx500_xfer" 2 +(define_insn_reservation "arcv_rmx500_xfer" 3 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "mfc,mtc,fcvt,fcvt_i2f,fcvt_f2i,fmove,fcmp")) - "(arcv_rmx500_ALU_A_fuse0_early | arcv_rmx500_ALU_B_fuse0_early), nothing") + "(arcv_rmx500_ALU_A_fuse0_early | arcv_rmx500_ALU_B_fuse0_early), nothing*2") -(define_insn_reservation "arcv_rmx500_fmul" 2 +(define_insn_reservation "arcv_rmx500_fmul" 3 (and (eq_attr "tune" "arcv_rmx500") (eq_attr "type" "fadd,fmul,fmadd")) - "(arcv_rmx500_ALU_A_fuse0_early | arcv_rmx500_ALU_B_fuse0_early,nothing)") + "(arcv_rmx500_ALU_A_fuse0_early | arcv_rmx500_ALU_B_fuse0_early,nothing*2)") (define_insn_reservation "arcv_rmx500_fdiv" 17 (and (eq_attr "tune" "arcv_rmx500") diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 03ae56f172ff..cae5855679b5 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -605,17 +605,17 @@ static const struct riscv_tune_param arcv_rmx100_tune_info = { NULL, /* loop_align */ }; -/* Costs to use when optimizing for Synopsys RMX-500. */ -static const struct riscv_tune_param arcv_rmx500_tune_info = { - {COSTS_N_INSNS (2), COSTS_N_INSNS (2)}, /* fp_add */ - {COSTS_N_INSNS (2), COSTS_N_INSNS (2)}, /* fp_mul */ - {COSTS_N_INSNS (17), COSTS_N_INSNS (17)}, /* fp_div */ - {COSTS_N_INSNS (2), COSTS_N_INSNS (2)}, /* int_mul */ - {COSTS_N_INSNS (17), COSTS_N_INSNS (17)}, /* int_div */ - 1, /* issue_rate */ - 4, /* branch_cost */ +/* Costs to use when optimizing for Synopsys RHX-100. */ +static const struct riscv_tune_param arcv_rhx100_tune_info = { + {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_add */ + {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_mul */ + {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */ + {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */ + {COSTS_N_INSNS (27), COSTS_N_INSNS (43)}, /* int_div */ + 4, /* issue_rate */ + 9, /* branch_cost */ 2, /* memory_cost */ - 4, /* fmv_cost */ + 8, /* fmv_cost */ false, /* slow_unaligned_access */ false, /* vector_unaligned_access */ false, /* use_divmod_expansion */ @@ -627,8 +627,8 @@ static const struct riscv_tune_param arcv_rmx500_tune_info = { NULL, /* loop_align */ }; -/* Costs to use when optimizing for Synopsys RHX-100. */ -static const struct riscv_tune_param arcv_rhx100_tune_info = { +/* Costs to use when optimizing for Synopsys RPX-100. */ +static const struct riscv_tune_param arcv_rpx100_tune_info = { {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_add */ {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_mul */ {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */ @@ -649,13 +649,13 @@ static const struct riscv_tune_param arcv_rhx100_tune_info = { NULL, /* loop_align */ }; -/* Costs to use when optimizing for Synopsys RPX-100. */ -static const struct riscv_tune_param arcv_rpx100_tune_info = { - {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_add */ - {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_mul */ - {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */ +/* Costs to use when optimizing for Synopsys RMX-500. */ +static const struct riscv_tune_param arcv_rmx500_tune_info = { + {COSTS_N_INSNS (4), COSTS_N_INSNS (64)}, /* fp_add */ + {COSTS_N_INSNS (4), COSTS_N_INSNS (75)}, /* fp_mul */ + {COSTS_N_INSNS (20), COSTS_N_INSNS (120)}, /* fp_div */ {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */ - {COSTS_N_INSNS (27), COSTS_N_INSNS (43)}, /* int_div */ + {COSTS_N_INSNS (27), COSTS_N_INSNS (87)}, /* int_div */ 4, /* issue_rate */ 9, /* branch_cost */ 2, /* memory_cost */