This patch introduces a vector cost model for the Spacemit-X60 core.
The model is LMUL-aware, based on measurements showing that vector instruction
latency and throughput vary significantly with LMUL, so the cost
model distinguishes between m1/m2/m4/m8 cases.
To keep the machine description manageable, a new 'vector_lmul'
attribute is introduced to map RVV modes to their corresponding LMUL
values. The costs are based on llvm-mca performance simulations
and microbenchmarks, with additional stress tests used to validate
and adjust individual instruction types.
On selected numerical benchmarks this results in performance improvements
of ~3%, while instruction counts remain effectively unchanged (<0.1%).
| Benchmark | Metric | Trunk | Vector Cost Model | Δ (%) |
|------------------|--------|------------------|-------------------|---------|
| SciMark2-C | cycles | 311,538,498,801 | 300,670,104,666 | -3.49% |
|------------------|--------|------------------|-------------------|---------|
| tramp3d-v4 | cycles | 23,673,618,009 | 22,916,964,182 | -3.20% |
|------------------|--------|------------------|-------------------|---------|
| Freebench/neural | cycles | 471,768,472 | 454,850,594 | -3.59% |
|------------------|--------|------------------|-------------------|---------|
Benchmarks were run from the LLVM test-suite
(MultiSource/Benchmarks) using:
taskset -c 0 perf stat -r 10 ./...
SciMark2-C, FreeBench/neural, and tramp3d-v4
were used as representative numerical workloads.
For tramp3d-v4, the workload parameters (--cartvis 1.0 0.0, --rhomin 1e-8,
-n 20) increase floating-point intensity and dependency pressure, placing
greater stress on the scheduler.
2026-02-04 Nikola Ratkovac <[email protected]>
gcc/ChangeLog:
* config/riscv/spacemit-x60.md: Add primary vector pipeline model
for the Spacemit-X60 core.
(vector_lmul): New attribute mapping machine modes to LMUL.
(spacemit_x60_dummy): Rename from spacemi6_x60_dummy.
CONFIDENTIALITY: The contents of this e-mail are confidential and intended only
for the above addressee(s). If you are not the intended recipient, or the
person responsible for delivering it to the intended recipient, copying or
delivering it to anyone else or using it in any unauthorized manner is
prohibited and may be unlawful. If you receive this e-mail by mistake, please
notify the sender and the systems administrator at [email protected]
immediately.
---
gcc/config/riscv/spacemit-x60.md | 843 ++++++++++++++++++++++++++++++-
1 file changed, 836 insertions(+), 7 deletions(-)
diff --git a/gcc/config/riscv/spacemit-x60.md b/gcc/config/riscv/spacemit-x60.md
index fdd7b87b3..b23b67310 100644
--- a/gcc/config/riscv/spacemit-x60.md
+++ b/gcc/config/riscv/spacemit-x60.md
@@ -26,10 +26,9 @@
;; There's actually two VXU units and ops get split across them
;; to give the illusion of a single wider unit with higher
;; performance. There are a few ops that can only be fed into
-;; one of the two units. Probably best to initially model as
-;; a single unit
+;; one of the two units. For the purposes of this scheduling
+;; model, the VXU is treated as a single unit.
;;
-;; The VXU is not currently modeled.
;; Some ops like shadd.uw and add.uw, cpop take an extra cycle
;; Given everything is in-order, anti-dependencies probably matter
;; FP sign injection isn't handled correctly
@@ -38,13 +37,35 @@
(define_automaton "spacemit_x60")
(define_cpu_unit "spacemit_x60_alu0,spacemit_x60_alu1" "spacemit_x60")
(define_cpu_unit "spacemit_x60_lsu0,spacemit_x60_lsu1" "spacemit_x60")
-;;(define_cpu_unit "spacemit_x60_vxu0" "spacemit_x60")
+(define_cpu_unit "spacemit_x60_vxu0" "spacemit_x60")
(define_cpu_unit "spacemit_x60_fpalu" "spacemit_x60")
(define_cpu_unit "spacemit_x60_fdivsqrt" "spacemit_x60")
(define_reservation "spacemit_x60_lsu" "spacemit_x60_lsu0, spacemit_x60_lsu1")
(define_reservation "spacemit_x60_alu" "spacemit_x60_alu0, spacemit_x60_alu1")
+;; Fractional LMUL (F2/F4/...) treated as m1 for scheduling
+(define_attr "vector_lmul" "m1,m2,m4,m8"
+ (cond [
+ (eq_attr "mode" "RVVM1QI,RVVM1HI,RVVM1SI,RVVM1DI,RVVM1HF,RVVM1BF,RVVM1SF,
+ RVVM1DF,RVVMF2QI,RVVMF2HI,RVVMF2SI,RVVMF2SF,RVVMF2HF,RVVMF2BF,RVVMF2BI,
+ RVVMF4QI,RVVMF4HI,RVVMF4BF,RVVMF4HF,RVVMF4BI,RVVMF8QI,RVVMF8BI,
+ RVVMF16BI,RVVMF32BI,RVVMF64BI,RVVM1BI")
+ (const_string "m1")
+
+ (eq_attr "mode" "RVVM2QI,RVVM2HI,RVVM2SI,RVVM2DI,
+ RVVM2HF,RVVM2BF,RVVM2SF,RVVM2DF")
+ (const_string "m2")
+
+ (eq_attr "mode" "RVVM4QI,RVVM4HI,RVVM4SI,RVVM4DI,
+ RVVM4HF,RVVM4BF,RVVM4SF,RVVM4DF")
+ (const_string "m4")
+
+ (eq_attr "mode" "RVVM8QI,RVVM8HI,RVVM8SI,RVVM8DI,
+ RVVM8HF,RVVM8BF,RVVM8SF,RVVM8DF")
+ (const_string "m8")
+ ] (const_string "m1")))
+
;; ----------------------------------------------------
;; Memory (load/store)
;; ----------------------------------------------------
@@ -183,8 +204,816 @@
(eq_attr "mode" "DF")))
"spacemit_x60_fdivsqrt*7")
-(define_insn_reservation "spacemi6_x60_dummy" 1
+;; ----------------------------------------------------
+;; Vector
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vsetvl" 1
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vsetvl_pre,vsetvl,rdvlenb,rdvl"))
+ "spacemit_x60_vxu0")
+
+;; ----------------------------------------------------
+;; Vector Memory (load/store)
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_load_m1" 3
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlde,vldr")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*3")
+
+(define_insn_reservation "spacemit_x60_vec_load_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlde,vldr")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_load_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlde,vldr")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_load_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlde,vldr")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_store_m1" 3
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vste,vstr")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*3")
+
+(define_insn_reservation "spacemit_x60_vec_store_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vste,vstr")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_store_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vste,vstr")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_store_m8" 19
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vste,vstr")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*19")
+
+(define_insn_reservation "spacemit_x60_vec_mask_load" 1
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vldm"))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_mask_store" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vstm"))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_vldff_m1" 5
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldff")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*5")
+
+(define_insn_reservation "spacemit_x60_vec_vldff_m2" 7
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldff")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*7")
+
+(define_insn_reservation "spacemit_x60_vec_vldff_m4" 11
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldff")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*11")
+
+(define_insn_reservation "spacemit_x60_vec_vldff_m8" 19
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldff")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*19")
+
+(define_insn_reservation "spacemit_x60_vec_strided_m1" 32
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlds,vsts")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*32")
+
+(define_insn_reservation "spacemit_x60_vec_strided_m2" 64
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlds,vsts")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*64")
+
+(define_insn_reservation "spacemit_x60_vec_strided_m4" 128
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlds,vsts")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*128")
+
+(define_insn_reservation "spacemit_x60_vec_strided_m8" 256
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlds,vsts")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*256")
+
+(define_insn_reservation "spacemit_x60_vec_indexed_m1" 64
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldux,vldox,vstux,vstox,
+ vlsegdux,vlsegdox,vssegtux,vssegtox")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*64")
+
+(define_insn_reservation "spacemit_x60_vec_indexed_m2" 96
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldux,vldox,vstux,vstox,
+ vlsegdux,vlsegdox,vssegtux,vssegtox")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*96")
+
+(define_insn_reservation "spacemit_x60_vec_indexed_m4" 128
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldux,vldox,vstux,vstox,
+ vlsegdux,vlsegdox,vssegtux,vssegtox")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*128")
+
+(define_insn_reservation "spacemit_x60_vec_indexed_m8" 256
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vldux,vldox,vstux,vstox,
+ vlsegdux,vlsegdox,vssegtux,vssegtox")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*256")
+
+(define_insn_reservation "spacemit_x60_vec_segmented_m1" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlsegde,vlsegds,vlsegdff,vssegte,vssegts")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_segmented_m2" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlsegde,vlsegds,vlsegdff,vssegte,vssegts")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_segmented_m4" 32
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlsegde,vlsegds,vlsegdff,vssegte,vssegts")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*32")
+
+(define_insn_reservation "spacemit_x60_vec_segmented_m8" 128
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vlsegde,vlsegds,vlsegdff,vssegte,vssegts")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*128")
+
+;; ----------------------------------------------------
+;; Vector Integer Arithmetic
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_ialu_m1" 1
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vialu")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_m2" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vialu")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_m4" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vialu")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_m8" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vialu")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_shift_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vshift")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_shift_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vshift")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_shift_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vshift")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_shift_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vshift")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_sshift_m1" 1
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsshift")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_sshift_m2" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsshift")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_sshift_m4" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsshift")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_sshift_m8" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsshift")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_cmp" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vicmp"))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_slow_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viminmax,vbrev,vext,
+ vbrev8,vclz,vctz,vcpop,vrol,vror,vandn")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_slow_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viminmax,vbrev,vext,
+ vbrev8,vclz,vctz,vcpop,vrol,vror,vandn")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_slow_m4" 5
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viminmax,vbrev,vext,
+ vbrev8,vclz,vctz,vcpop,vrol,vror,vandn")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_ialu_slow_m8" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viminmax,vbrev,vext,
+ vbrev8,vclz,vctz,vcpop,vrol,vror,vandn")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_imul_m1" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimul")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_imul_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimul")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_imul_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimul")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_imul_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimul")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_imuladd_m1" 7
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimuladd")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_imuladd_m2" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimuladd")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_imuladd_m4" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimuladd")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_imuladd_m8" 32
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimuladd")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_iwalu_m1" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwalu,viwmul,viwmuladd,vwsll")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_iwalu_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwalu,viwmul,viwmuladd,vwsll")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_iwalu_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwalu,viwmul,viwmuladd,vwsll")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_div_m1" 24
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vidiv")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*24")
+
+(define_insn_reservation "spacemit_x60_vec_div_m2" 48
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vidiv")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*48")
+
+(define_insn_reservation "spacemit_x60_vec_div_m4" 96
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vidiv")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*96")
+
+(define_insn_reservation "spacemit_x60_vec_div_m8" 192
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vidiv")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*192")
+
+;; ----------------------------------------------------
+;; Vector Fixed Point
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsalu,vaalu")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsalu,vaalu")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_m4" 5
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsalu,vaalu")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_m8" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsalu,vaalu")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_slow_m1" 7
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsmul")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_slow_m2" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsmul")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_slow_m4" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsmul")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_fixed_point_slow_m8" 32
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vsmul")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*32")
+
+(define_insn_reservation "spacemit_x60_vec_narrow_fixed_point_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vnshift,vnclip")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_narrow_fixed_point_m2" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vnshift,vnclip")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_narrow_fixed_point_m4" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vnshift,vnclip")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*16")
+
+;; ----------------------------------------------------
+;; Vector Floating Point
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_falu_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfalu,vfmul,vfmuladd,vfminmax,vfrecp,
+ vfcvtitof,vfcvtftoi,vfmerge")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_falu_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfalu,vfmul,vfmuladd,vfminmax,vfrecp,
+ vfcvtitof,vfcvtftoi,vfmerge")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_falu_m4" 5
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfalu,vfmul,vfmuladd,vfminmax,vfrecp,
+ vfcvtitof,vfcvtftoi,vfmerge")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_falu_m8" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfalu,vfmul,vfmuladd,vfminmax,vfrecp,
+ vfcvtitof,vfcvtftoi,vfmerge")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_fwalu_m1" 5
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwalu,vfwmul,vfwmuladd,vfwmaccbf16,vfwcvtitof,
+ vfwcvtftoi,vfwcvtftof,vfwcvtbf16,vfncvtitof,vfncvtftoi,vfncvtftof,
+ vfncvtbf16,sf_vfnrclip,sf_vqmacc")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_fwalu_m2" 9
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwalu,vfwmul,vfwmuladd,vfwmaccbf16,vfwcvtitof,
+ vfwcvtftoi,vfwcvtftof,vfwcvtbf16,vfncvtitof,vfncvtftoi,vfncvtftof,
+ vfncvtbf16,sf_vfnrclip,sf_vqmacc")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_fwalu_m4" 17
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwalu,vfwmul,vfwmuladd,vfwmaccbf16,vfwcvtitof,
+ vfwcvtftoi,vfwcvtftof,vfwcvtbf16,vfncvtitof,vfncvtftoi,vfncvtftof,
+ vfncvtbf16,sf_vfnrclip,sf_vqmacc")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*17")
+
+(define_insn_reservation "spacemit_x60_vec_fcmp_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfcmp")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_fcmp_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfcmp")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_fcmp_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfcmp")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_fcmp_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfcmp")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_fmov" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vfmovfv,vfmov"))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_fsimple_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfmovvf,vfclass,vfsgnj")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_fsimple_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfmovvf,vfclass,vfsgnj")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_fsimple_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfmovvf,vfclass,vfsgnj")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_fsimple_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfmovvf,vfclass,vfsgnj")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_fsqrt_fdiv_m1" 12
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfsqrt,vfdiv")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*12")
+
+(define_insn_reservation "spacemit_x60_vec_fsqrt_fdiv_m2" 24
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfsqrt,vfdiv")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*24")
+
+(define_insn_reservation "spacemit_x60_vec_fsqrt_fdiv_m4" 48
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfsqrt,vfdiv")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*48")
+
+(define_insn_reservation "spacemit_x60_vec_fsqrt_fdiv_m8" 96
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfsqrt,vfdiv")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*96")
+
+;; ----------------------------------------------------
+;; Vector Mask Operations
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_mask_alu" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vmalu"))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_mask_pop" 6
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vmpop,vmffs"))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_mask_special_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmidx,vmiota")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_mask_special_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmidx,vmiota")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_mask_special_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmidx,vmiota")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_mask_special_m8" 16
(and (eq_attr "tune" "spacemit_x60")
- (eq_attr "type"
"viminmax,vfmuladd,vfmovvf,vssegte,vlsegds,rdvlenb,vaesef,vfcmp,vmpop,vwsll,vsha2cl,vfwcvtbf16,vfncvtftoi,vgather,vsha2ch,vsts,vldm,vmsfs,vfmul,vcompress,vaesz,vssegtox,vstox,vclmulh,vghsh,vaalu,vslideup,vfalu,vaeskf1,vfcvtitof,vaesdm,vmffs,vandn,vstm,vgmul,vlds,viwmul,vfmerge,vlsegdff,vshift,vaesem,vaesdf,vste,ghost,viwred,vsalu,vfwredu,vmidx,sf_vfnrclip,vstux,vfslide1down,vfcvtftoi,vfncvtitof,vnshift,vsm3me,vired,vlde,vfwalu,sf_vc_se,vlsegdux,vicmp,vfncvtftof,vror,vfwmaccbf16,vfminmax,vldff,vstr,vsm3c,vfwcvtftoi,vbrev,vaeskf2,vidiv,vfwcvtftof,rdvl,vimul,vfsgnj,vimovvx,vsha2ms,vialu,vfredo,vctz,vlsegde,viwmuladd,vcpop,vsetvl,vldux,vfwmuladd,vector,wrvxrm,vsshift,vfredu,vimerge,vlsegdox,vfrecp,vnclip,vfclass,vbrev8,vslidedown,vldox,vmalu,vext,vimuladd,sf_vqmacc,vldr,vrol,vmov,vsmul,vclmul,vfmov,vislide1up,vssegtux,vclz,rdfrm,vfwcvtitof,vfncvtbf16,vfmovfv,vislide1down,vfwmul,vfsqrt,vrev8,vicalu,vimov,wrfrm,vfdiv,sf_vc,vsm4k,vmiota,vsm4r,viwalu,vsetvl_pre,vimovxv,vfwredo,vfslide1up,vssegts"))
- "nothing")
+ (and (eq_attr "type" "vmidx,vmiota")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*16")
+(define_insn_reservation "spacemit_x60_vec_mask_vmsfs_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmsfs")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_mask_vmsfs_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmsfs")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_mask_vmsfs_m4" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmsfs")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_mask_vmsfs_m8" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vmsfs")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*4")
+
+;; ----------------------------------------------------
+;; Vector Permutations
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_mov" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vmov,vimovxv,vimovvx,vimov"))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_merge_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimerge")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_merge_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimerge")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_merge_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimerge")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*8")
+
+(define_insn_reservation "spacemit_x60_vec_merge_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vimerge")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_gather_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vgather")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_gather_m2" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vgather")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_gather_m4" 64
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vgather")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*64")
+
+(define_insn_reservation "spacemit_x60_vec_gather_m8" 256
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vgather")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*256")
+
+(define_insn_reservation "spacemit_x60_vec_compress_m1" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vcompress")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*3")
+
+(define_insn_reservation "spacemit_x60_vec_compress_m2" 10
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vcompress")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*10")
+
+(define_insn_reservation "spacemit_x60_vec_compress_m4" 36
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vcompress")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*36")
+
+(define_insn_reservation "spacemit_x60_vec_compress_m8" 136
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vcompress")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*136")
+
+(define_insn_reservation "spacemit_x60_vec_slide_m1" 2
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vslideup,vslidedown,vislide1up,
+ vislide1down,vfslide1up,vfslide1down")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0")
+
+(define_insn_reservation "spacemit_x60_vec_slide_m2" 4
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vslideup,vslidedown,vislide1up,
+ vislide1down,vfslide1up,vfslide1down")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_slide_m4" 8
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vslideup,vslidedown,vislide1up,
+ vislide1down,vfslide1up,vfslide1down")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_slide_m8" 16
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vslideup,vslidedown,vislide1up,
+ vislide1down,vfslide1up,vfslide1down")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*8")
+
+;; ----------------------------------------------------
+;; Vector Reductions
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_vec_red" 7
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vired"))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_wred_m1" 6
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwred")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*2")
+
+(define_insn_reservation "spacemit_x60_vec_wred_m2" 10
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwred")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*4")
+
+(define_insn_reservation "spacemit_x60_vec_wred_m4" 18
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwred")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*9")
+
+(define_insn_reservation "spacemit_x60_vec_wred_m8" 35
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "viwred")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*17")
+
+(define_insn_reservation "spacemit_x60_vec_fwred_m1" 32
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwredo,vfwredu")
+ (eq_attr "vector_lmul" "m1")))
+ "spacemit_x60_vxu0*16")
+
+(define_insn_reservation "spacemit_x60_vec_fwred_m2" 64
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwredo,vfwredu")
+ (eq_attr "vector_lmul" "m2")))
+ "spacemit_x60_vxu0*32")
+
+(define_insn_reservation "spacemit_x60_vec_fwred_m4" 128
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwredo,vfwredu")
+ (eq_attr "vector_lmul" "m4")))
+ "spacemit_x60_vxu0*64")
+
+(define_insn_reservation "spacemit_x60_vec_fwred_m8" 256
+ (and (eq_attr "tune" "spacemit_x60")
+ (and (eq_attr "type" "vfwredo,vfwredu")
+ (eq_attr "vector_lmul" "m8")))
+ "spacemit_x60_vxu0*256")
+
+;; ----------------------------------------------------
+;; Vector Unknown
+;; ----------------------------------------------------
+
+(define_insn_reservation "spacemit_x60_dummy" 1
+ (and (eq_attr "tune" "spacemit_x60")
+ (eq_attr "type" "vaesef,
+ vsha2cl,vsha2ch,vaesz,vclmulh,vghsh,vaeskf1,vaesdm,vgmul,
+ vaesem,vaesdf,ghost,vicalu,vsm3me,sf_vc_se,vsm3c,
+ vaeskf2,vsha2ms,vfredo,vector,wrvxrm,vfredu,
+ vclmul,rdfrm,wrfrm,sf_vc,vsm4k,vsm4r"))
+ "nothing")
\ No newline at end of file
--
2.43.0