| ;; Scheduling description for z10 (cpu 2097). |
| ;; Copyright (C) 2008-2022 Free Software Foundation, Inc. |
| ;; Contributed by Wolfgang Gellerich (gellerich@de.ibm.com). |
| |
| |
| ; General naming conventions used in this file: |
| ; - The two pipelines are called S and T, respectively. |
| ; - A name ending "_S" or "_T" indicates that something happens in |
| ; (or belongs to) this pipeline. |
| ; - A name ending "_ANY" indicates that something happens in (or belongs |
| ; to) either of the two pipelines. |
| ; - A name ending "_BOTH" indicates that something happens in (or belongs |
| ; to) both pipelines. |
| |
| |
| ;; Automaton and components. |
| |
| (define_automaton "z10_cpu") |
| |
| (define_cpu_unit "z10_e1_S, z10_e1_T" "z10_cpu") |
| (define_reservation "z10_e1_ANY" "(z10_e1_S | z10_e1_T)") |
| (define_reservation "z10_e1_BOTH" "(z10_e1_S + z10_e1_T)") |
| |
| |
| ; Both pipelines can execute a branch instruction, and branch |
| ; instructions can be grouped with all other groupable instructions |
| ; but not with a second branch instruction. |
| |
| (define_cpu_unit "z10_branch_ANY" "z10_cpu") |
| |
| (define_insn_reservation "z10_branch" 4 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "branch")) |
| "z10_branch_ANY + z10_e1_ANY, z10_Gate_ANY") |
| |
| |
| ; Z10 operand and result forwarding. |
| |
| ; Instructions marked with the attributes as z10_fwd or z10_fr can |
| ; forward a value they load from one of their operants into a register |
| ; if the instruction in the second pipeline reads the same register. |
| ; The second operation must be superscalar. Instructions marked as |
| ; z10_rec or z10_fr can receive a value they read from a register is |
| ; this register gets updated by an instruction in the first pipeline. |
| ; The first instruction must be superscalar. |
| |
| |
| ; Forwarding from z10_fwd and z10_fr to z10_super. |
| |
| (define_bypass 0 "z10_la_fwd, z10_la_fwd_A1, z10_larl_fwd, z10_larl_fwd_A3, \ |
| z10_load_fwd, z10_load_fwd_A3, \ |
| z10_other_fwd, z10_other_fwd_A1, z10_other_fwd_A3, \ |
| z10_other_fr, z10_other_fr_A3, z10_other_fr_E1, \ |
| z10_other_fwd_E1, z10_lr_fr, z10_lr_fr_E1, \ |
| z10_int_fwd, z10_int_fwd_A1, z10_int_fwd_A3, \ |
| z10_int_fwd_E1, z10_int_fr, z10_int_fr_E1, \ |
| z10_int_fr_A3" |
| "z10_other_super, z10_other_super_c_E1, z10_other_super_E1, \ |
| z10_int_super, z10_int_super_E1, \ |
| z10_lr, z10_store_super" |
| " ! s390_agen_dep_p") |
| |
| |
| ; Forwarding from z10_super to frz10_ and z10_rec. |
| |
| (define_bypass 0 "z10_other_super, z10_other_super_E1, z10_other_super_c_E1, \ |
| z10_int_super, z10_int_super_E1, \ |
| z10_larl_super_E1, z10_larl_super, \ |
| z10_store_super" |
| "z10_int_fr, z10_int_fr_E1, z10_int_fr_A3, \ |
| z10_other_fr, z10_other_fr_A3, z10_lr_fr, z10_lr_fr_E1, \ |
| z10_other_fr_E1, z10_store_rec" |
| " ! s390_agen_dep_p") |
| |
| |
| ; Forwarding from z10_fwd and z10_fr to z10_rec and z10_fr. |
| |
| (define_bypass 0 "z10_la_fwd, z10_la_fwd_A1, z10_larl_fwd, z10_larl_fwd_A3, \ |
| z10_load_fwd, z10_load_fwd_A3, \ |
| z10_other_fwd, z10_other_fwd_A1, z10_other_fwd_A3, \ |
| z10_other_fr, z10_other_fr_A3, z10_other_fr_E1, \ |
| z10_other_fwd_E1, \ |
| z10_lr_fr, z10_lr_fr_E1, \ |
| z10_int_fwd, z10_int_fwd_A1, z10_int_fwd_A3, \ |
| z10_int_fwd_E1, z10_int_fr, z10_int_fr_E1, \ |
| z10_int_fr_A3" |
| "z10_int_fr, z10_int_fr_E1, z10_int_fr_A3, \ |
| z10_other_fr, z10_other_fr_A3, z10_lr_fr, z10_lr_fr_E1, \ |
| z10_other_fr_E1, z10_store_rec" |
| " ! s390_agen_dep_p") |
| |
| |
| ; |
| ; Simple insns |
| ; |
| |
| ; Here is the cycle diagram for FXU-executed instructions: |
| ; ... A1 A2 A3 E1 P1 P2 P3 R0 ... |
| ; ^ ^ ^ |
| ; | | updated GPR is available |
| ; | write to GPR |
| ; instruction reads GPR during this cycle |
| |
| |
| ; Variants of z10_int follow. |
| |
| (define_insn_reservation "z10_int" 6 |
| (and (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "integer")) |
| (and (eq_attr "atype" "reg") |
| (and (and (eq_attr "z10prop" "!z10_super") |
| (eq_attr "z10prop" "!z10_super_c")) |
| (and (and (and (and (eq_attr "z10prop" "!z10_super_E1") |
| (eq_attr "z10prop" "!z10_super_c_E1")) |
| (eq_attr "z10prop" "!z10_fwd")) |
| (and (eq_attr "z10prop" "!z10_fwd_A1") |
| (eq_attr "z10prop" "!z10_fwd_A3"))) |
| (and (and (eq_attr "z10prop" "!z10_fwd_E1") |
| (eq_attr "z10prop" "!z10_fr")) |
| (and (eq_attr "z10prop" "!z10_fr_E1") |
| (eq_attr "z10prop" "!z10_fr_A3"))))))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_super" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (ior (eq_attr "z10prop" "z10_super") |
| (eq_attr "z10prop" "z10_super_c"))))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_super_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (ior (eq_attr "z10prop" "z10_super_E1") |
| (eq_attr "z10prop" "z10_super_c_E1"))))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fwd" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fwd")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fwd_A1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fwd_A1")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fwd_A3" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fwd_A3")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fwd_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fwd_E1")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fr" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fr")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fr_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fr_E1")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_int_fr_A3" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (and (eq_attr "atype" "reg") |
| (eq_attr "z10prop" "z10_fr_A3")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| ; END of z10_int variants |
| |
| |
| (define_insn_reservation "z10_agen" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "integer") |
| (eq_attr "atype" "agen"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| |
| (define_insn_reservation "z10_lr" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "lr") |
| (and (eq_attr "z10prop" "!z10_fr") |
| (eq_attr "z10prop" "!z10_fr_E1")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_lr_fr" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "lr") |
| (eq_attr "z10prop" "z10_fr"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_lr_fr_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "lr") |
| (eq_attr "z10prop" "z10_fr_E1"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_la" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "la") |
| (and (eq_attr "z10prop" "!z10_fwd") |
| (eq_attr "z10prop" "!z10_fwd_A1")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_la_fwd" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "la") |
| (eq_attr "z10prop" "z10_fwd"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_la_fwd_A1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "la") |
| (eq_attr "z10prop" "z10_fwd_A1"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| |
| ; larl-type instructions |
| |
| (define_insn_reservation "z10_larl" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "larl") |
| (and (eq_attr "z10prop" "!z10_super_A1") |
| (and (eq_attr "z10prop" "!z10_fwd") |
| (and (eq_attr "z10prop" "!z10_fwd_A3") |
| (and (eq_attr "z10prop" "!z10_super") |
| (eq_attr "z10prop" "!z10_super_c")) |
| (and (eq_attr "z10prop" "!z10_super_E1") |
| (eq_attr "z10prop" "!z10_super_c_E1"))))))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_larl_super" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "larl") |
| (and (eq_attr "z10prop" "z10_super") |
| (eq_attr "z10prop" "z10_super_c")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_larl_fwd" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "larl") |
| (eq_attr "z10prop" "z10_fwd"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_larl_fwd_A3" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "larl") |
| (eq_attr "z10prop" "z10_fwd_A3"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| |
| (define_insn_reservation "z10_larl_A1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "larl") |
| (eq_attr "z10prop" "z10_super_A1"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| ; "z10_e1_ANY") |
| |
| (define_insn_reservation "z10_larl_super_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "larl") |
| (ior (eq_attr "z10prop" "z10_super_E1") |
| (eq_attr "z10prop" "z10_super_c_E1")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| ; "z10_e1_ANY") |
| |
| |
| (define_insn_reservation "z10_load" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "load") |
| (and (eq_attr "z10prop" "!z10_fwd") |
| (eq_attr "z10prop" "!z10_fwd_A3")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_load_fwd" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "load") |
| (eq_attr "z10prop" "z10_fwd"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| ; "z10_e1_ANY") |
| |
| (define_insn_reservation "z10_load_fwd_A3" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "load") |
| (eq_attr "z10prop" "z10_fwd_A3"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| ; "z10_e1_ANY") |
| |
| (define_insn_reservation "z10_store" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "store") |
| (and (eq_attr "z10prop" "!z10_rec") |
| (and (eq_attr "z10prop" "!z10_super") |
| (eq_attr "z10prop" "!z10_super_c"))))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_store_super" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "store") |
| (ior (eq_attr "z10prop" "z10_super") |
| (eq_attr "z10prop" "z10_super_c")))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_store_rec" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "store") |
| (eq_attr "z10prop" "z10_rec"))) |
| "z10_e1_ANY, z10_Gate_ANY") |
| |
| ; The default_latency is chosen to drain off the pipeline. |
| (define_insn_reservation "z10_call" 14 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "jsr")) |
| "z10_e1_BOTH*4, z10_Gate_BOTH") |
| |
| ; The default latency is for worst case. CS and CSG take one |
| ; cycle only (i.e. latency would be 6). |
| (define_insn_reservation "z10_sem" 9 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "sem")) |
| "z10_e1_BOTH*5, z10_Gate_ANY") |
| |
| (define_insn_reservation "z10_cs" 6 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "cs")) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_vs" 6 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "vs")) |
| "z10_e1_BOTH*4, z10_Gate_BOTH") |
| |
| ; Load and store multiple. Actual number of cycles |
| ; in unknown at compile.time. |
| (define_insn_reservation "z10_stm" 10 |
| (and (eq_attr "cpu" "z10") |
| (ior (eq_attr "type" "stm") |
| (eq_attr "type" "lm"))) |
| "z10_e1_BOTH*4, z10_Gate_BOTH") |
| |
| |
| ; Subsets of z10_other follow. |
| |
| (define_insn_reservation "z10_other" 6 |
| (and (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "other")) |
| (and (and (eq_attr "z10prop" "!z10_fwd") |
| (eq_attr "z10prop" "!z10_fwd_A1")) |
| (and (and (and (eq_attr "z10prop" "!z10_fr_A3") |
| (eq_attr "z10prop" "!z10_fwd_A3")) |
| (and (eq_attr "z10prop" "!z10_fr") |
| (eq_attr "z10prop" "!z10_fr_E1"))) |
| (and (and (and (eq_attr "z10prop" "!z10_super") |
| (eq_attr "z10prop" "!z10_super_c")) |
| (eq_attr "z10prop" "!z10_super_c_E1")) |
| (and (eq_attr "z10prop" "!z10_super_E1") |
| (eq_attr "z10prop" "!z10_fwd_E1")))))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fr_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fr_E1"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_super_c_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_super_c_E1"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_super_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_super_E1"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fwd_E1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fwd_E1"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fwd" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fwd"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fwd_A3" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fwd_A3"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fwd_A1" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fwd_A1"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fr" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fr"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_fr_A3" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (eq_attr "z10prop" "z10_fr_A3"))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| (define_insn_reservation "z10_other_super" 6 |
| (and (eq_attr "cpu" "z10") |
| (and (eq_attr "type" "other") |
| (ior (eq_attr "z10prop" "z10_super") |
| (eq_attr "z10prop" "z10_super_c")))) |
| "z10_e1_BOTH, z10_Gate_BOTH") |
| |
| ; END of z10_other subsets. |
| |
| |
| ; |
| ; Floating point insns |
| ; |
| |
| ; Z10 executes the following integer operations in the BFU pipeline. |
| |
| (define_insn_reservation "z10_mul_sidi" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "imulsi,imuldi,imulhi")) |
| "z10_e1_BOTH, z10_Gate_FP") |
| |
| ; Some variants take fewer cycles, but that is not relevant here. |
| (define_insn_reservation "z10_div" 162 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "idiv")) |
| "z10_e1_BOTH*4, z10_Gate_FP") |
| |
| |
| ; BFP multiplication and general instructions |
| |
| (define_insn_reservation "z10_fsimpdf" 6 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsimpdf,fmuldf,fmadddf")) |
| "z10_e1_BOTH, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fsimpsf" 6 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsimpsf,fmulsf,fmaddsf")) |
| "z10_e1_BOTH, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fmultf" 52 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fmultf")) |
| "z10_e1_BOTH*4, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fsimptf" 14 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsimptf")) |
| "z10_e1_BOTH*2, z10_Gate_FP") |
| |
| |
| ; BFP division |
| |
| (define_insn_reservation "z10_fdivtf" 113 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fdivtf")) |
| "z10_e1_T*4, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fdivdf" 41 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fdivdf")) |
| "z10_e1_T*4, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fdivsf" 34 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fdivsf")) |
| "z10_e1_T*4, z10_Gate_FP") |
| |
| |
| ; BFP sqrt |
| |
| (define_insn_reservation "z10_fsqrtsf" 41 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsqrtsf")) |
| "z10_e1_T*4, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fsqrtdf" 54 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsqrtdf")) |
| "z10_e1_T*4, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fsqrtf" 122 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsqrttf")) |
| "z10_e1_T*4, z10_Gate_FP") |
| |
| |
| ; BFP load and store |
| |
| (define_insn_reservation "z10_floadtf" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "floadtf")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_floaddf" 1 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "floaddf")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_floadsf" 1 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "floadsf")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fstoredf" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fstoredf,fstoredd")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_fstoresf" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fstoresf,fstoresd")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| |
| ; BFP truncate |
| (define_insn_reservation "z10_ftrunctf" 16 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "ftrunctf")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_ftruncdf" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "ftruncdf")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| |
| ; Conversion between BFP and int. |
| (define_insn_reservation "z10_ftoi" 13 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "ftoi")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_itoftf" 14 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "itoftf")) |
| "z10_e1_T*2, z10_Gate_FP") |
| |
| (define_insn_reservation "z10_itofsfdf" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "itofdf,itofsf")) |
| "z10_e1_T, z10_Gate_FP") |
| |
| |
| |
| ; BFP-related bypasses. There is no bypass for extended mode. |
| (define_bypass 1 "z10_fsimpdf" "z10_fstoredf") |
| (define_bypass 1 "z10_fsimpsf" "z10_fstoresf") |
| (define_bypass 1 "z10_floaddf" "z10_fsimpdf, z10_fstoredf") |
| (define_bypass 1 "z10_floadsf" "z10_fsimpsf, z10_fstoresf") |
| |
| |
| ; |
| ; insn_reservations for DFP instructions. |
| ; |
| |
| ; Exact number of cycles is not known at compile-time. |
| (define_insn_reservation "z10_fdivddtd" 40 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fdivdd,fdivtd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_ftruncsd" 38 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "ftruncsd")) |
| "z10_e1_BOTH*4,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_ftruncdd" 340 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "ftruncsd")) |
| "z10_e1_BOTH*4,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_floaddd" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "floaddd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_floadsd" 12 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "floadsd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| ; Exact number of cycles is not known at compile-time. |
| (define_insn_reservation "z10_fmulddtd" 35 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fmuldd,fmultd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_fsimpdd" 17 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsimpdd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_fsimpsd" 17 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsimpsd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_fsimptd" 18 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "fsimptd")) |
| "z10_e1_BOTH,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_itofdd" 36 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "itofdd")) |
| "z10_e1_BOTH*3,z10_Gate_DFU") |
| |
| (define_insn_reservation "z10_itoftd" 49 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "itoftd")) |
| "z10_e1_BOTH*3,z10_Gate_DFU") |
| |
| ; Exact number of cycles is not known at compile-time. |
| (define_insn_reservation "z10_ftoidfp" 30 |
| (and (eq_attr "cpu" "z10") |
| (eq_attr "type" "ftoidfp")) |
| "z10_e1_BOTH*3,z10_Gate_DFU") |
| |
| |
| ; |
| ; Address-related bypasses |
| ; |
| |
| ; Here is the cycle diagram for address-related bypasses: |
| ; ... G1 G2 G3 A0 A1 A2 A3 E1 P1 P2 P3 R0 ... |
| ; ^ ^ ^ ^ ^ ^ |
| ; | | | | | without bypass, its available AFTER this cycle |
| ; | | | | E1-type bypasses provide the new value AFTER this cycle |
| ; | | | A3-type bypasses provide the new value AFTER this cycle |
| ; | | A1-type bypasses provide the new value AFTER this cycle |
| ; | AGI resolution, actual USE of new value is DURING this cycle |
| ; AGI detection |
| |
| (define_bypass 3 "z10_larl_A1, z10_la_fwd_A1, z10_other_fwd_A1, \ |
| z10_int_fwd_A1" |
| "z10_agen, z10_la, z10_branch, z10_call, z10_load, \ |
| z10_store, \ |
| z10_cs, z10_stm, z10_other" |
| "s390_agen_dep_p") |
| |
| (define_bypass 5 "z10_larl_fwd_A3, z10_load_fwd_A3, z10_other_fwd_A3, \ |
| z10_other_fr_A3, z10_int_fwd_A3, z10_int_fr_A3" |
| "z10_agen, z10_la, z10_branch, z10_call, z10_load, \ |
| z10_store, \ |
| z10_cs, z10_stm, z10_other" |
| "s390_agen_dep_p") |
| |
| (define_bypass 6 "z10_other_fr_E1, z10_other_super_c_E1, z10_other_super_E1, \ |
| z10_other_fwd_E1, \ |
| z10_lr_fr_E1, z10_larl_super_E1, \ |
| z10_int_super_E1, z10_int_fwd_E1, z10_int_fr_E1" |
| "z10_agen, z10_la, z10_branch, z10_call, z10_load, \ |
| z10_store, \ |
| z10_cs, z10_stm, z10_other" |
| "s390_agen_dep_p") |
| |
| (define_bypass 9 "z10_int_super, z10_int_fwd, z10_int_fr" |
| "z10_agen, z10_la, z10_branch, z10_call, z10_load, \ |
| z10_store, \ |
| z10_cs, z10_stm, z10_other" |
| "s390_agen_dep_p") |
| |
| |
| |
| ; |
| ; Try to avoid transitions between DFU-, BFU- and FXU-executed instructions as there is a |
| ; dispatch delay required. |
| ; |
| |
| |
| ; Declaration for some pseudo-pipeline stages that reflect the |
| ; dispatch gap when issuing an INT/FXU/BFU-executed instruction after |
| ; an instruction executed by a different unit has been executed. The |
| ; approach is that we pretend a pipelined execution of BFU operations |
| ; with as many stages as the gap is long and request that none of |
| ; these stages is busy when issuing a FXU- or DFU-executed |
| ; instruction. Similar for FXU- and DFU-executed instructions. |
| |
| ; Declaration for FPU stages. |
| (define_cpu_unit "z10_f0, z10_f1, z10_f2, z10_f3, z10_f4, z10_f5, z10_f6, \ |
| z10_f7, z10_f8, z10_f9, z10_f10, z10_f11, z10_f12" "z10_cpu") |
| (define_reservation "z10_FP_PP" "z10_f0, z10_f1, z10_f2, z10_f3, z10_f4, \ |
| z10_f5, z10_f6, z10_f7, z10_f8, z10_f9, z10_f10, z10_f11, \ |
| z10_f12") |
| |
| ; Declaration for FXU stages. |
| (define_cpu_unit "z10_S1, z10_S2, z10_S3, z10_S4, z10_S5, z10_S6" "z10_cpu") |
| (define_cpu_unit "z10_T1, z10_T2, z10_T3, z10_T4, z10_T5, z10_T6" "z10_cpu") |
| (define_reservation "z10_INT_PP" "z10_S1 | z10_T1, z10_S2 | z10_T2, z10_S3 \ |
| | z10_T3, z10_S4 | z10_T4, z10_S5 | \ |
| z10_T5, z10_S6 | z10_T6") |
| |
| ; Declaration for DFU stages. |
| (define_cpu_unit "z10_d0, z10_d1, z10_d2, z10_d3, z10_d4, z10_d5, z10_d6" |
| "z10_cpu") |
| (define_reservation "z10_DFU_PP" "z10_d0, z10_d1, z10_d2, z10_d3, z10_d4, \ |
| z10_d5, z10_d6") |
| |
| |
| ; Pseudo-units representing whether the respective unit is available |
| ; in the sense that using it does not cause a dispatch delay. |
| |
| (define_cpu_unit "z10_S_avail, z10_T_avail, z10_FP_avail, z10_DFU_avail" |
| "z10_cpu") |
| |
| (absence_set "z10_FP_avail" |
| "z10_S1, z10_S2, z10_S3, z10_S4, z10_S5, z10_S6, z10_T1, z10_T2, z10_T3, z10_T4, \ |
| z10_T5, z10_T6, \ |
| z10_d0, z10_d1, z10_d2, z10_d3, z10_d4, z10_d5, z10_d6") |
| |
| (absence_set "z10_S_avail,z10_T_avail" |
| "z10_f0, z10_f1, z10_f2, z10_f3, z10_f4, z10_f5, z10_f6, z10_f7, \ |
| z10_f8, z10_f9, z10_f10, z10_f11, z10_f12, \ |
| z10_d0, z10_d1, z10_d2, z10_d3, z10_d4, z10_d5, z10_d6") |
| |
| (absence_set "z10_DFU_avail" |
| "z10_S1, z10_S2, z10_S3, z10_S4, z10_S5, z10_S6, z10_T1, z10_T2, z10_T3, z10_T4, \ |
| z10_T5, z10_T6, \ |
| z10_f0, z10_f1, z10_f2, z10_f3, z10_f4, z10_f5, z10_f6, z10_f7, \ |
| z10_f8, z10_f9, z10_f10, z10_f11, z10_f12") |
| |
| |
| ; Pseudo-units to be used in insn_reservations. |
| |
| (define_reservation "z10_Gate_ANY" "((z10_S_avail | z10_T_avail), z10_INT_PP)") |
| (define_reservation "z10_Gate_BOTH" "((z10_S_avail + z10_T_avail), z10_INT_PP)") |
| |
| (define_reservation "z10_Gate_FP" "z10_FP_avail, z10_FP_PP") |
| |
| (define_reservation "z10_Gate_DFU" "z10_DFU_avail, z10_DFU_PP") |