Robert Suchanek <robert.sucha...@mips.com> writes: > Update to i6400 scheduler. > > Regards, > Robert > > gcc/ChangeLog: > > 2018-06-01 Prachi Godbole <prachi.godb...@imgtec.com> > > * config/mips/i6400.md (i6400_gpmuldiv): Remove cpu_unit. > (i6400_gpmul): Add cpu_unit. > (i6400_gpdiv): Likewise. > (i6400_msa_add_d): Update reservations. > (i6400_msa_int_add) Likewise. > (i6400_msa_short_logic3) Likewise. > (i6400_msa_short_logic2) Likewise. > (i6400_msa_short_logic) Likewise. > (i6400_msa_move) Likewise. > (i6400_msa_cmp) Likewise. > (i6400_msa_short_float2) Likewise. > (i6400_msa_div_d) Likewise. > (i6400_msa_long_logic1) Likewise. > (i6400_msa_long_logic2) Likewise. > (i6400_msa_mult) Likewise. > (i6400_msa_long_float2) Likewise. > (i6400_msa_long_float4) Likewise. > (i6400_msa_long_float5) Likewise. > (i6400_msa_long_float8) Likewise. > (i6400_fpu_minmax): New define_insn_reservation. > (i6400_fpu_fadd): Include frint type. > (i6400_fpu_store): New define_insn_reservation. > (i6400_fpu_load): Likewise. > (i6400_fpu_move): Likewise. > (i6400_fpu_fcmp): Likewise. > (i6400_fpu_fmadd): Likewise. > (i6400_int_mult): Include imul3nc type and update reservation. > (i6400_int_div): Include idiv3 type and update reservation. > (i6400_int_load): Update to check type not move_type. > (i6400_int_store): Likewise. > (i6400_int_prefetch): Set zero latency.
Hi Robert, Just to fill in the blanks on the submission history for this. The patch here was written by Prachi while MIPS was a part of IMG and was then transferred to MIPS Tech LLC when the business split. Both IMG and MIPS Tech LLC have copyright assignment in place so it does not matter that it is authored by someone from IMG and submitted by a MIPS Tech LLC employee. There is no public platform available to demonstrate the improvement of this patch but it was tested, when written, to meet or exceed existing performance on i6400. It is also included in the reference tools for the i6400 produced by MIPS Tech LLC. There does seem to be a temporal issue in submission for this as the i6400_fpu_minmax reservation refers to fminmax and fclass types that do not exist in trunk. Can you drop that reservation please? Otherwise, OK to commit. Thanks, Matthew > --- > gcc/config/mips/i6400.md | 86 ++++++++++++++++++++++++++++++++++------ > -------- > 1 file changed, 61 insertions(+), 25 deletions(-) > > diff --git a/gcc/config/mips/i6400.md b/gcc/config/mips/i6400.md > index 413e9e8..a985401 100644 > --- a/gcc/config/mips/i6400.md > +++ b/gcc/config/mips/i6400.md > @@ -21,7 +21,7 @@ > (define_automaton "i6400_int_pipe, i6400_mdu_pipe, > i6400_fpu_short_pipe, > i6400_fpu_long_pipe") > > -(define_cpu_unit "i6400_gpmuldiv" "i6400_mdu_pipe") > +(define_cpu_unit "i6400_gpmul, i6400_gpdiv" "i6400_mdu_pipe") > (define_cpu_unit "i6400_agen, i6400_alu1, i6400_lsu" "i6400_int_pipe") > (define_cpu_unit "i6400_control, i6400_ctu, i6400_alu0" > "i6400_int_pipe") > > @@ -50,49 +50,49 @@ (define_insn_reservation "i6400_msa_add_d" 1 > (and (eq_attr "cpu" "i6400") > (and (eq_attr "mode" "!V2DI") > (eq_attr "alu_type" "simd_add"))) > - "i6400_fpu_short, i6400_fpu_intadd") > + "i6400_fpu_short+i6400_fpu_intadd*2") > > ;; add, hadd, sub, hsub, average, min, max, compare > (define_insn_reservation "i6400_msa_int_add" 2 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_int_arith")) > - "i6400_fpu_short, i6400_fpu_intadd") > + "i6400_fpu_short+i6400_fpu_intadd*2") > > ;; sat, pcnt > (define_insn_reservation "i6400_msa_short_logic3" 3 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_sat,simd_pcnt")) > - "i6400_fpu_short, i6400_fpu_logic") > + "i6400_fpu_short+i6400_fpu_logic*2") > > ;; shifts, nloc, nlzc, bneg, bclr, shf > (define_insn_reservation "i6400_msa_short_logic2" 2 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_shift,simd_shf,simd_bit")) > - "i6400_fpu_short, i6400_fpu_logic") > + "i6400_fpu_short+i6400_fpu_logic*2") > > ;; and, or, xor, ilv, pck, fill, splat > (define_insn_reservation "i6400_msa_short_logic" 1 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" > "simd_permute,simd_logic,simd_splat,simd_fill")) > - "i6400_fpu_short, i6400_fpu_logic") > + "i6400_fpu_short+i6400_fpu_logic*2") > > ;; move.v, ldi > (define_insn_reservation "i6400_msa_move" 1 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_move")) > - "i6400_fpu_short, i6400_fpu_logic") > + "i6400_fpu_short+i6400_fpu_logic*2") > > ;; Float compare New: CMP.cond.fmt > (define_insn_reservation "i6400_msa_cmp" 2 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_fcmp")) > - "i6400_fpu_short, i6400_fpu_cmp") > + "i6400_fpu_short+i6400_fpu_cmp*2") > > ;; Float min, max, class > (define_insn_reservation "i6400_msa_short_float2" 2 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_fminmax,simd_fclass")) > - "i6400_fpu_short, i6400_fpu_float") > + "i6400_fpu_short+i6400_fpu_float*2") > > ;; div.d, mod.d (non-pipelined) > (define_insn_reservation "i6400_msa_div_d" 36 > @@ -158,43 +158,43 @@ (define_insn_reservation "i6400_fpu_msa_move" 1 > (define_insn_reservation "i6400_msa_long_logic1" 1 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_bitmov,simd_insert")) > - "i6400_fpu_long, i6400_fpu_logic_l") > + "i6400_fpu_long+i6400_fpu_logic_l*2") > > ;; binsl, binsr, vshf, sld > (define_insn_reservation "i6400_msa_long_logic2" 2 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_bitins,simd_sld")) > - "i6400_fpu_long, i6400_fpu_logic_l") > + "i6400_fpu_long+i6400_fpu_logic_l*2") > > ;; Vector mul, dotp, madd, msub > (define_insn_reservation "i6400_msa_mult" 5 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_mul")) > - "i6400_fpu_long, i6400_fpu_mult") > + "i6400_fpu_long+i6400_fpu_mult*2") > > ;; Float flog2 > (define_insn_reservation "i6400_msa_long_float2" 2 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_flog2")) > - "i6400_fpu_long, i6400_fpu_float_l") > + "i6400_fpu_long+i6400_fpu_float_l*2") > > ;; fadd, fsub > (define_insn_reservation "i6400_msa_long_float4" 4 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_fadd,simd_fcvt")) > - "i6400_fpu_long, i6400_fpu_float_l") > + "i6400_fpu_long+i6400_fpu_float_l*2") > > ;; fmul, fexp2 > (define_insn_reservation "i6400_msa_long_float5" 5 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_fmul,simd_fexp2")) > - "i6400_fpu_long, i6400_fpu_float_l") > + "i6400_fpu_long+i6400_fpu_float_l*2") > > ;; fmadd, fmsub > (define_insn_reservation "i6400_msa_long_float8" 8 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "simd_fmadd")) > - "i6400_fpu_long, i6400_fpu_float_l") > + "i6400_fpu_long+i6400_fpu_float_l*2") > > ;; fdiv.d > (define_insn_reservation "i6400_msa_fdiv_df" 30 > @@ -219,10 +219,16 @@ (define_insn_reservation "i6400_fpu_fabs" 1 > (eq_attr "type" "fabs,fneg,fmove")) > "i6400_fpu_short, i6400_fpu_apu") > > +;; min, max, min_a, max_a, class > +(define_insn_reservation "i6400_fpu_minmax" 2 > + (and (eq_attr "cpu" "i6400") > + (eq_attr "type" "fminmax,fclass")) > + "i6400_fpu_short+i6400_fpu_logic") > + > ;; fadd, fsub, fcvt > (define_insn_reservation "i6400_fpu_fadd" 4 > (and (eq_attr "cpu" "i6400") > - (eq_attr "type" "fadd, fcvt")) > + (eq_attr "type" "fadd, fcvt, frint")) > "i6400_fpu_long, i6400_fpu_apu") > > ;; fmul > @@ -244,6 +250,36 @@ (define_insn_reservation "i6400_fpu_div_sf" 22 > (eq_attr "type" "fdiv,frdiv,fsqrt,frsqrt")) > "i6400_fpu_long+i6400_fpu_apu*22") > > +;; sdc1, swc1 > +(define_insn_reservation "i6400_fpu_store" 1 > + (and (eq_attr "cpu" "i6400") > + (eq_attr "type" "fpstore")) > + "i6400_agen_lsu") > + > +;; ldc1, lwc1 > +(define_insn_reservation "i6400_fpu_load" 3 > + (and (eq_attr "cpu" "i6400") > + (eq_attr "type" "fpload")) > + "i6400_agen_lsu") > + > +;; mfc, mtc > +(define_insn_reservation "i6400_fpu_move" 1 > + (and (eq_attr "cpu" "i6400") > + (eq_attr "move_type" "mfc, mtc")) > + "i6400_control_alu0 | i6400_agen_alu1") > + > +;; fcmp > +(define_insn_reservation "i6400_fpu_fcmp" 2 > + (and (eq_attr "cpu" "i6400") > + (eq_attr "type" "fcmp")) > + "i6400_fpu_short, i6400_fpu_apu") > + > +;; fmadd > +(define_insn_reservation "i6400_fpu_fmadd" 8 > + (and (eq_attr "cpu" "i6400") > + (eq_attr "type" "fmadd")) > + "i6400_fpu_long, i6400_fpu_apu") > + > ;; > ;; Integer pipe > ;; > @@ -272,32 +308,32 @@ (define_insn_reservation "i6400_int_nop" 0 > (eq_attr "type" "nop")) > "nothing") > > -;; mult, multu, mul > +;; mul, mulu, muh, muhu > (define_insn_reservation "i6400_int_mult" 4 > (and (eq_attr "cpu" "i6400") > - (eq_attr "type" "imul3,imul")) > - "i6400_gpmuldiv") > + (eq_attr "type" "imul3,imul,imul3nc")) > + "i6400_gpmul") > > ;; divide > (define_insn_reservation "i6400_int_div" 32 > (and (eq_attr "cpu" "i6400") > - (eq_attr "type" "idiv")) > - "i6400_gpmuldiv*32") > + (eq_attr "type" "idiv,idiv3")) > + "i6400_gpdiv*32") > > ;; Load lb, lbu, lh, lhu, lq, lw, lw_i2f, lwxs > (define_insn_reservation "i6400_int_load" 3 > (and (eq_attr "cpu" "i6400") > - (eq_attr "move_type" "load")) > + (eq_attr "type" "load")) > "i6400_agen_lsu") > > ;; store > (define_insn_reservation "i6400_int_store" 1 > (and (eq_attr "cpu" "i6400") > - (eq_attr "move_type" "store")) > + (eq_attr "type" "store")) > "i6400_agen_lsu") > > ;; prefetch > -(define_insn_reservation "i6400_int_prefetch" 3 > +(define_insn_reservation "i6400_int_prefetch" 0 > (and (eq_attr "cpu" "i6400") > (eq_attr "type" "prefetch")) > "i6400_agen_lsu") > -- > 2.7.4