1 ;; Scheduling description for Sifive p400.
3 ;; Sifive p400 series is a triple-issue, superscalar, out-of-order processor.
5 ;; CPU execution units:
6 ;; ialu Integer Units: all arithmetic and logic.
8 ;; bru Branch Resolution Unit: all branches.
10 ;; st Memory Write Unit: all writes to memory.
12 ;; ld Memory Read Unit: all reads from memory.
14 ;; imul Integer Multiply Unit
16 ;; idiv Integer Divide Unit
18 ;; system System Unit: all coprocessor accesses.
20 ;; fpu Floating Point Unit
22 ;; fmul Floating Point Multiply Unit
24 ;; fdiv Floating Point Divide Unit
26 ;; Four automata are defined to reduce number of states
27 ;; which a single large automaton will have.
28 (define_automaton "sifive_p400_iex,sifive_p400_fex,sifive_p400_mem,sifive_p400_div")
30 ;; The Sifive p400 has six pipelines:
33 ;; M-pipe ALU, MUL, DIV and I2F(integer to float instruction)
34 ;; C-pipe ALU, Conditional move and system for coprocessor accesses
35 ;; F-pipe FPU, MUL, F2I(float to integer instruction)
36 ;; FM-pipe FPU, MUL, DIV
38 (define_cpu_unit "sifive_p400_A" "sifive_p400_mem")
39 (define_cpu_unit "sifive_p400_B" "sifive_p400_iex")
40 (define_cpu_unit "sifive_p400_M" "sifive_p400_iex")
41 (define_cpu_unit "sifive_p400_C" "sifive_p400_iex")
42 (define_cpu_unit "sifive_p400_F" "sifive_p400_fex")
43 (define_cpu_unit "sifive_p400_FM" "sifive_p400_fex")
45 ;; Load and store unit.
46 (define_cpu_unit "sifive_p400_ld" "sifive_p400_mem")
47 (define_cpu_unit "sifive_p400_st" "sifive_p400_mem")
50 (define_cpu_unit "sifive_p400_bru" "sifive_p400_iex")
52 ;; Integer and multiply unit.
53 (define_cpu_unit "sifive_p400_ialu" "sifive_p400_iex")
54 (define_cpu_unit "sifive_p400_imul" "sifive_p400_iex")
55 (define_cpu_unit "sifive_p400_system" "sifive_p400_iex")
58 (define_cpu_unit "sifive_p400_idiv" "sifive_p400_div")
59 (define_cpu_unit "sifive_p400_fdiv" "sifive_p400_div")
61 ;; Float and multiply unit.
62 (define_cpu_unit "sifive_p400_fmul" "sifive_p400_fex")
63 (define_cpu_unit "sifive_p400_fpu" "sifive_p400_fex")
65 ;; ALU instruction can use pipeline C, B and M.
66 (define_reservation "p400_int_pipe" "(sifive_p400_C|sifive_p400_B|sifive_p400_M)")
67 ;; FPU instruction can use pipeline F and FM.
68 (define_reservation "p400_float_pipe" "(sifive_p400_F|sifive_p400_FM)")
70 (define_insn_reservation "sifive_p400_load" 3
71 (and (eq_attr "tune" "sifive_p400")
72 (eq_attr "type" "load"))
73 "sifive_p400_A,sifive_p400_ld*2")
75 (define_insn_reservation "sifive_p400_fpload" 4
76 (and (eq_attr "tune" "sifive_p400")
77 (eq_attr "type" "fpload"))
78 "sifive_p400_A,sifive_p400_ld*3")
80 (define_insn_reservation "sifive_p400_store" 1
81 (and (eq_attr "tune" "sifive_p400")
82 (eq_attr "type" "store"))
83 "sifive_p400_A+sifive_p400_st")
85 (define_insn_reservation "sifive_p400_fpstore" 1
86 (and (eq_attr "tune" "sifive_p400")
87 (eq_attr "type" "fpstore"))
88 "sifive_p400_A+sifive_p400_st")
90 (define_insn_reservation "sifive_p400_branch" 1
91 (and (eq_attr "tune" "sifive_p400")
92 (eq_attr "type" "branch,jump,call,jalr,ret,trap"))
93 "sifive_p400_B+sifive_p400_bru")
95 (define_insn_reservation "sifive_p400_sfb_alu" 1
96 (and (eq_attr "tune" "sifive_p400")
97 (eq_attr "type" "sfb_alu"))
98 "sifive_p400_C+sifive_p400_bru+sifive_p400_ialu")
100 (define_insn_reservation "sifive_p400_atomic" 3
101 (and (eq_attr "tune" "sifive_p400")
102 (eq_attr "type" "atomic"))
103 "sifive_p400_C,sifive_p400_system*2")
105 (define_insn_reservation "sifive_p400_mul" 3
106 (and (eq_attr "tune" "sifive_p400")
107 (eq_attr "type" "imul"))
108 "sifive_p400_M,sifive_p400_imul*2")
110 (define_insn_reservation "sifive_p400_div" 31
111 (and (eq_attr "tune" "sifive_p400")
112 (eq_attr "type" "idiv"))
113 "sifive_p400_M, sifive_p400_idiv*5")
115 (define_insn_reservation "sifive_p400_alu" 1
116 (and (eq_attr "tune" "sifive_p400")
117 (eq_attr "type" "unknown,arith,logical,shift,slt,multi,bitmanip,\
118 clz,ctz,rotate,min,max,minu,maxu,condmove,mvpair,zicond"))
119 "p400_int_pipe+sifive_p400_ialu")
121 (define_insn_reservation "sifive_p400_cpop" 3
122 (and (eq_attr "tune" "sifive_p400")
123 (eq_attr "type" "cpop"))
124 "p400_int_pipe,sifive_p400_ialu*2")
126 (define_insn_reservation "sifive_p400_clmul" 3
127 (and (eq_attr "tune" "sifive_p400")
128 (eq_attr "type" "clmul"))
129 "p400_int_pipe,sifive_p400_ialu*2")
131 (define_insn_reservation "sifive_p400_load_immediate" 1
132 (and (eq_attr "tune" "sifive_p400")
133 (eq_attr "type" "nop,const,auipc,move"))
136 (define_insn_reservation "sifive_p400_fma" 4
137 (and (eq_attr "tune" "sifive_p400")
138 (eq_attr "type" "fadd,fmul,fmadd"))
139 "p400_float_pipe,sifive_p400_fmul*3")
141 (define_insn_reservation "sifive_p400_i2f" 2
142 (and (eq_attr "tune" "sifive_p400")
143 (eq_attr "type" "mtc,fcvt_i2f"))
144 "sifive_p400_M,sifive_p400_ialu")
146 (define_insn_reservation "sifive_p400_f2i" 2
147 (and (eq_attr "tune" "sifive_p400")
148 (eq_attr "type" "mfc,fcmp,fcvt_f2i"))
149 "sifive_p400_F,sifive_p400_fpu")
151 (define_insn_reservation "sifive_p400_fmove" 2
152 (and (eq_attr "tune" "sifive_p400")
153 (eq_attr "type" "fmove,fcvt"))
154 "p400_float_pipe,sifive_p400_fpu")
156 (define_insn_reservation "sifive_p400_fdiv_s" 18
157 (and (eq_attr "tune" "sifive_p400")
158 (eq_attr "type" "fdiv,fsqrt")
159 (eq_attr "mode" "SF"))
160 "sifive_p400_FM, sifive_p400_fdiv*5")
162 (define_insn_reservation "sifive_p400_fdiv_d" 31
163 (and (eq_attr "tune" "sifive_p400")
164 (eq_attr "type" "fdiv,fsqrt")
165 (eq_attr "mode" "DF"))
166 "sifive_p400_FM, sifive_p400_fdiv*5")
168 (define_bypass 1 "sifive_p400_load,sifive_p400_alu,sifive_p400_mul,sifive_p400_sfb_alu"
169 "sifive_p400_alu,sifive_p400_branch")
171 (define_bypass 1 "sifive_p400_load,sifive_p400_alu,sifive_p400_mul,
172 sifive_p400_f2i,sifive_p400_fmove,sifive_p400_sfb_alu"
173 "sifive_p400_store" "riscv_store_data_bypass_p")
175 (define_bypass 1 "sifive_p400_i2f"
176 "sifive_p400_fma,sifive_p400_f2i,sifive_p400_fmove,sifive_p400_fdiv_s,sifive_p400_fdiv_d")
178 (define_bypass 1 "sifive_p400_f2i"
179 "sifive_p400_branch,sifive_p400_sfb_alu,sifive_p400_mul,
180 sifive_p400_div,sifive_p400_alu,sifive_p400_cpop")