File ibm304071-z10-7 of Package gcc43
Index: gcc/config/s390/2097.md
===================================================================
*** /dev/null 1970-01-01 00:00:00.000000000 +0000
--- gcc/config/s390/2097.md 2008-08-15 09:09:26.000000000 +0200
***************
*** 0 ****
--- 1,764 ----
+ ;; Scheduling description for z10 (cpu 2097).
+ ;; Copyright (C) 2008 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")
+
+
+ ; 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")
+
+
+ ; 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")
+
+
+ ;
+ ; 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")
+ ; "z10_e1_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")
+ ; "z10_e1_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")
+ ; "z10_e1_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")
+ ; "z10_e1_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" 12
+ (and (eq_attr "cpu" "z10")
+ (eq_attr "type" "fsimpdf,fmuldf"))
+ "z10_e1_BOTH, z10_Gate_FP")
+ ; Wg "z10_e1_T, z10_Gate_FP")
+
+ (define_insn_reservation "z10_fsimpsf" 12
+ (and (eq_attr "cpu" "z10")
+ (eq_attr "type" "fsimpsf,fmulsf"))
+ "z10_e1_BOTH, z10_Gate_FP")
+ ; Wg "z10_e1_T, 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")
+ ; Wg "z10_e1_T*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")
+ ; Wg "z10_e1_T*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" 12
+ (and (eq_attr "cpu" "z10")
+ (eq_attr "type" "floaddf"))
+ "z10_e1_T, z10_Gate_FP")
+
+ (define_insn_reservation "z10_floadsf" 12
+ (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" 12
+ (and (eq_attr "cpu" "z10")
+ (eq_attr "type" "ftrunctf"))
+ "z10_e1_T, z10_Gate_FP")
+
+ (define_insn_reservation "z10_ftruncdf" 16
+ (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, z10_floaddf")
+ (define_bypass 1 "z10_floadsf" "z10_fsimpsf, z10_fstoresf, z10_floadsf")
+
+
+ ;
+ ; 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 ...
+ ; ^ ^ ^ ^ ^
+ ; | | | | E1-type bypasses provide the new addr AFTER this cycle
+ ; | | | A3-type bypasses provide the new addr AFTER this cycle
+ ; | | A1-type bypasses provide the new addr AFTER this cycle
+ ; | AGI resolution, actual USE of address 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")
+
+
+
+ ;
+ ; 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 issueing 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 issueing 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")
Index: gcc/config/s390/s390.md
===================================================================
*** gcc/config/s390/s390.md.orig 2008-08-15 09:08:50.000000000 +0200
--- gcc/config/s390/s390.md 2008-08-15 09:09:26.000000000 +0200
***************
*** 202,209 ****
branch,jsr,fsimptf,fsimpdf,fsimpsf,
floadtf,floaddf,floadsf,fstoredf,fstoresf,
fmultf,fmuldf,fmulsf,fdivtf,fdivdf,fdivsf,
! ftoi,itof,fsqrttf,fsqrtdf,fsqrtsf,
! ftrunctf,ftruncdf,other"
(cond [(eq_attr "op_type" "NN") (const_string "other")
(eq_attr "op_type" "SS") (const_string "cs")]
(const_string "integer")))
--- 202,213 ----
branch,jsr,fsimptf,fsimpdf,fsimpsf,
floadtf,floaddf,floadsf,fstoredf,fstoresf,
fmultf,fmuldf,fmulsf,fdivtf,fdivdf,fdivsf,
! ftoi,fsqrttf,fsqrtdf,fsqrtsf,
! ftrunctf,ftruncdf, ftruncsd, ftruncdd,
! itoftf, itofdf, itofsf, itofdd, itoftd,
! fdivdd, fdivtd, floaddd, floadsd, fmuldd, fmultd,
! fsimpdd, fsimpsd, fsimptd, fstoredd, fstoresd,
! ftoidfp, other"
(cond [(eq_attr "op_type" "NN") (const_string "other")
(eq_attr "op_type" "SS") (const_string "cs")]
(const_string "integer")))
***************
*** 217,222 ****
--- 221,251 ----
(const_string "reg")
(const_string "agen")))
+ ;; Properties concerning Z10 execution grouping and value forwarding.
+ ;; z10_super: instruction is superscalar.
+ ;; z10_super_c: instruction is superscalar and meets the condition of z10_c.
+ ;; z10_fwd: The instruction reads the value of an operand and stores it into a
+ ;; target register. It can forward this value to a second instruction that reads
+ ;; the same register if that second instruction is issued in the same group.
+ ;; z10_rec: The instruction is in the T pipeline and reads a register. If the
+ ;; instruction in the S pipe writes to the register, then the T instruction
+ ;; can immediately read the new value.
+ ;; z10_fr: union of Z10_fwd and z10_rec.
+ ;; z10_c: second operand of instruction is a register and read with complemented bits.
+ ;; z10_cobra: its a compare and branch instruction
+ ;;
+ ;; An additional suffix A1, A3, or E1 indicates the respective AGI bypass.
+
+
+ (define_attr "z10prop" "none,
+ z10_super, z10_super_E1, z10_super_A1, z10_super_c, z10_super_c_E1,
+ z10_fwd, z10_fwd_A1, z10_fwd_A3, z10_fwd_E1,
+ z10_rec,
+ z10_fr, z10_fr_A3, z10_fr_E1,
+ z10_c, z10_cobra"
+ (const_string "none"))
+
+
;; Length in bytes.
(define_attr "length" ""
***************
*** 272,277 ****
--- 301,309 ----
;; Pipeline description for z990, z9-109 and z9-ec.
(include "2084.md")
+ ;; Pipeline description for z10
+ (include "2097.md")
+
;; Predicates
(include "predicates.md")
***************
*** 388,399 ****
;; modes and to an empty string for bfp modes.
(define_mode_attr _d [(TF "") (DF "") (SF "") (TD "d") (DD "d") (SD "d")])
- ;; Although it is imprecise for z9-ec we handle all dfp instructions like
- ;; bfp regarding the pipeline description.
- (define_mode_attr bfp [(TF "tf") (DF "df") (SF "sf")
- (TD "tf") (DD "df") (SD "sf")])
-
-
;; In GPR and P templates, a constraint like "<d0>" will expand to "d" in DImode
;; and "0" in SImode. This allows to combine instructions of which the 31bit
;; version only operates on one register.
--- 420,425 ----
***************
*** 403,415 ****
;; version only operates on one register. The DImode version needs an additional
;; register for the assembler output.
(define_mode_attr 1 [(DI "%1,") (SI "")])
!
! ;; In SHIFT templates, a string like "s<lr>dl" will expand to "sldl" in
;; 'ashift' and "srdl" in 'lshiftrt'.
(define_code_attr lr [(ashift "l") (lshiftrt "r")])
;; In SHIFT templates, this attribute holds the correct standard name for the
! ;; pattern itself and the corresponding function calls.
(define_code_attr shift [(ashift "ashl") (lshiftrt "lshr")])
;; This attribute handles differences in the instruction 'type' and will result
--- 429,441 ----
;; version only operates on one register. The DImode version needs an additional
;; register for the assembler output.
(define_mode_attr 1 [(DI "%1,") (SI "")])
!
! ;; In SHIFT templates, a string like "s<lr>dl" will expand to "sldl" in
;; 'ashift' and "srdl" in 'lshiftrt'.
(define_code_attr lr [(ashift "l") (lshiftrt "r")])
;; In SHIFT templates, this attribute holds the correct standard name for the
! ;; pattern itself and the corresponding function calls.
(define_code_attr shift [(ashift "ashl") (lshiftrt "lshr")])
;; This attribute handles differences in the instruction 'type' and will result
***************
*** 499,505 ****
"@
tm\t%S0,%b1
tmy\t%S0,%b1"
! [(set_attr "op_type" "SI,SIY")])
(define_insn "*tmdi_reg"
[(set (reg CC_REGNUM)
--- 525,532 ----
"@
tm\t%S0,%b1
tmy\t%S0,%b1"
! [(set_attr "op_type" "SI,SIY")
! (set_attr "z10prop" "z10_super,z10_super")])
(define_insn "*tmdi_reg"
[(set (reg CC_REGNUM)
***************
*** 515,521 ****
tmhl\t%0,%i1
tmlh\t%0,%i1
tmll\t%0,%i1"
! [(set_attr "op_type" "RI")])
(define_insn "*tmsi_reg"
[(set (reg CC_REGNUM)
--- 542,549 ----
tmhl\t%0,%i1
tmlh\t%0,%i1
tmll\t%0,%i1"
! [(set_attr "op_type" "RI")
! (set_attr "z10prop" "z10_super,z10_super,z10_super,z10_super")])
(define_insn "*tmsi_reg"
[(set (reg CC_REGNUM)
***************
*** 558,564 ****
"ltgfr\t%2,%0
ltgf\t%2,%0"
[(set_attr "op_type" "RRE,RXY")
! (set_attr "cpu_facility" "*,z10")])
; ltr, lt, ltgr, ltg
(define_insn "*tst<mode>_extimm"
--- 586,593 ----
"ltgfr\t%2,%0
ltgf\t%2,%0"
[(set_attr "op_type" "RRE,RXY")
! (set_attr "cpu_facility" "*,z10")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1") ])
; ltr, lt, ltgr, ltg
(define_insn "*tst<mode>_extimm"
***************
*** 571,577 ****
"@
lt<g>r\t%2,%0
lt<g>\t%2,%0"
! [(set_attr "op_type" "RR<E>,RXY")])
; ltr, lt, ltgr, ltg
(define_insn "*tst<mode>_cconly_extimm"
--- 600,607 ----
"@
lt<g>r\t%2,%0
lt<g>\t%2,%0"
! [(set_attr "op_type" "RR<E>,RXY")
! (set_attr "z10prop" "z10_fr_E1,z10_fr_A3") ])
; ltr, lt, ltgr, ltg
(define_insn "*tst<mode>_cconly_extimm"
***************
*** 583,589 ****
"@
lt<g>r\t%0,%0
lt<g>\t%2,%0"
! [(set_attr "op_type" "RR<E>,RXY")])
(define_insn "*tstdi"
[(set (reg CC_REGNUM)
--- 613,620 ----
"@
lt<g>r\t%0,%0
lt<g>\t%2,%0"
! [(set_attr "op_type" "RR<E>,RXY")
! (set_attr "z10prop" "z10_fr_E1,z10_fr_A3")])
(define_insn "*tstdi"
[(set (reg CC_REGNUM)
***************
*** 593,599 ****
(match_dup 0))]
"s390_match_ccmode(insn, CCSmode) && TARGET_64BIT && !TARGET_EXTIMM"
"ltgr\t%2,%0"
! [(set_attr "op_type" "RRE")])
(define_insn "*tstsi"
[(set (reg CC_REGNUM)
--- 624,631 ----
(match_dup 0))]
"s390_match_ccmode(insn, CCSmode) && TARGET_64BIT && !TARGET_EXTIMM"
"ltgr\t%2,%0"
! [(set_attr "op_type" "RRE")
! (set_attr "z10prop" "z10_fr_E1")])
(define_insn "*tstsi"
[(set (reg CC_REGNUM)
***************
*** 606,612 ****
ltr\t%2,%0
icm\t%2,15,%S0
icmy\t%2,15,%S0"
! [(set_attr "op_type" "RR,RS,RSY")])
(define_insn "*tstsi_cconly"
[(set (reg CC_REGNUM)
--- 638,645 ----
ltr\t%2,%0
icm\t%2,15,%S0
icmy\t%2,15,%S0"
! [(set_attr "op_type" "RR,RS,RSY")
! (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
(define_insn "*tstsi_cconly"
[(set (reg CC_REGNUM)
***************
*** 618,624 ****
ltr\t%0,%0
icm\t%2,15,%S0
icmy\t%2,15,%S0"
! [(set_attr "op_type" "RR,RS,RSY")])
(define_insn "*tstdi_cconly_31"
[(set (reg CC_REGNUM)
--- 651,658 ----
ltr\t%0,%0
icm\t%2,15,%S0
icmy\t%2,15,%S0"
! [(set_attr "op_type" "RR,RS,RSY")
! (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
(define_insn "*tstdi_cconly_31"
[(set (reg CC_REGNUM)
***************
*** 636,642 ****
(match_operand:GPR 1 "const0_operand" "")))]
"s390_match_ccmode(insn, CCSmode)"
"lt<g>r\t%0,%0"
! [(set_attr "op_type" "RR<E>")])
; tst(hi|qi) instruction pattern(s).
--- 670,677 ----
(match_operand:GPR 1 "const0_operand" "")))]
"s390_match_ccmode(insn, CCSmode)"
"lt<g>r\t%0,%0"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_fr_E1")])
; tst(hi|qi) instruction pattern(s).
***************
*** 651,657 ****
icm\t%2,<icm_lo>,%S0
icmy\t%2,<icm_lo>,%S0
tml\t%0,<max_uint>"
! [(set_attr "op_type" "RS,RSY,RI")])
(define_insn "*tsthiCCT_cconly"
[(set (reg CC_REGNUM)
--- 686,693 ----
icm\t%2,<icm_lo>,%S0
icmy\t%2,<icm_lo>,%S0
tml\t%0,<max_uint>"
! [(set_attr "op_type" "RS,RSY,RI")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
(define_insn "*tsthiCCT_cconly"
[(set (reg CC_REGNUM)
***************
*** 663,669 ****
icm\t%2,3,%S0
icmy\t%2,3,%S0
tml\t%0,65535"
! [(set_attr "op_type" "RS,RSY,RI")])
(define_insn "*tstqiCCT_cconly"
[(set (reg CC_REGNUM)
--- 699,706 ----
icm\t%2,3,%S0
icmy\t%2,3,%S0
tml\t%0,65535"
! [(set_attr "op_type" "RS,RSY,RI")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
(define_insn "*tstqiCCT_cconly"
[(set (reg CC_REGNUM)
***************
*** 674,680 ****
cli\t%S0,0
cliy\t%S0,0
tml\t%0,255"
! [(set_attr "op_type" "SI,SIY,RI")])
(define_insn "*tst<mode>"
[(set (reg CC_REGNUM)
--- 711,718 ----
cli\t%S0,0
cliy\t%S0,0
tml\t%0,255"
! [(set_attr "op_type" "SI,SIY,RI")
! (set_attr "z10prop" "z10_super,z10_super,*")])
(define_insn "*tst<mode>"
[(set (reg CC_REGNUM)
***************
*** 686,692 ****
"@
icm\t%2,<icm_lo>,%S0
icmy\t%2,<icm_lo>,%S0"
! [(set_attr "op_type" "RS,RSY")])
(define_insn "*tst<mode>_cconly"
[(set (reg CC_REGNUM)
--- 724,731 ----
"@
icm\t%2,<icm_lo>,%S0
icmy\t%2,<icm_lo>,%S0"
! [(set_attr "op_type" "RS,RSY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*tst<mode>_cconly"
[(set (reg CC_REGNUM)
***************
*** 697,703 ****
"@
icm\t%2,<icm_lo>,%S0
icmy\t%2,<icm_lo>,%S0"
! [(set_attr "op_type" "RS,RSY")])
; Compare (equality) instructions
--- 736,743 ----
"@
icm\t%2,<icm_lo>,%S0
icmy\t%2,<icm_lo>,%S0"
! [(set_attr "op_type" "RS,RSY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
; Compare (equality) instructions
***************
*** 713,719 ****
cgfi\t%0,%1
cg\t%0,%1
#"
! [(set_attr "op_type" "RRE,RI,RIL,RXY,SS")])
(define_insn "*cmpsi_cct"
[(set (reg CC_REGNUM)
--- 753,760 ----
cgfi\t%0,%1
cg\t%0,%1
#"
! [(set_attr "op_type" "RRE,RI,RIL,RXY,SS")
! (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,*")])
(define_insn "*cmpsi_cct"
[(set (reg CC_REGNUM)
***************
*** 727,734 ****
c\t%0,%1
cy\t%0,%1
#"
! [(set_attr "op_type" "RR,RI,RIL,RX,RXY,SS")])
!
; Compare (signed) instructions
--- 768,775 ----
c\t%0,%1
cy\t%0,%1
#"
! [(set_attr "op_type" "RR,RI,RIL,RX,RXY,SS")
! (set_attr "z10prop" "z10_super,z10_super,z10_super,z10_super,z10_super,*")])
; Compare (signed) instructions
***************
*** 743,751 ****
cgf\t%0,%1
cgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
! (set_attr "cpu_facility" "*,*,z10")
(set_attr "type" "*,*,larl")])
(define_insn "*cmpsi_ccs_sign"
[(set (reg CC_REGNUM)
(compare (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T,b"))
--- 784,794 ----
cgf\t%0,%1
cgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
! (set_attr "z10prop" "z10_c,*,*")
(set_attr "type" "*,*,larl")])
+
+
(define_insn "*cmpsi_ccs_sign"
[(set (reg CC_REGNUM)
(compare (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T,b"))
***************
*** 796,802 ****
c<g>rl\t%0,%1"
[(set_attr "op_type" "RR<E>,RI,SIL,RIL,RX<Y>,RXY,RIL")
(set_attr "cpu_facility" "*,*,z10,extimm,*,*,z10")
! (set_attr "type" "*,*,*,*,*,*,larl")])
; Compare (unsigned) instructions
--- 839,846 ----
c<g>rl\t%0,%1"
[(set_attr "op_type" "RR<E>,RI,SIL,RIL,RX<Y>,RXY,RIL")
(set_attr "cpu_facility" "*,*,z10,extimm,*,*,z10")
! (set_attr "type" "*,*,*,*,*,*,larl")
! (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,z10_super")])
; Compare (unsigned) instructions
***************
*** 820,826 ****
"s390_match_ccmode(insn, CCURmode) && TARGET_Z10"
"cl<g>hrl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")])
(define_insn "*cmpdi_ccu_zero"
[(set (reg CC_REGNUM)
--- 864,871 ----
"s390_match_ccmode(insn, CCURmode) && TARGET_Z10"
"cl<g>hrl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")
! (set_attr "z10prop" "z10_super")])
(define_insn "*cmpdi_ccu_zero"
[(set (reg CC_REGNUM)
***************
*** 834,840 ****
clgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "cpu_facility" "*,*,z10")
! (set_attr "type" "*,*,larl")])
(define_insn "*cmpdi_ccu"
[(set (reg CC_REGNUM)
--- 879,886 ----
clgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "cpu_facility" "*,*,z10")
! (set_attr "type" "*,*,larl")
! (set_attr "z10prop" "z10_super_c,z10_super_E1,z10_super")])
(define_insn "*cmpdi_ccu"
[(set (reg CC_REGNUM)
***************
*** 853,859 ****
#"
[(set_attr "op_type" "RRE,RIL,RIL,SIL,RXY,SS,SS")
(set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*")
! (set_attr "type" "*,*,larl,*,*,*,*")])
(define_insn "*cmpsi_ccu"
[(set (reg CC_REGNUM)
--- 899,906 ----
#"
[(set_attr "op_type" "RRE,RIL,RIL,SIL,RXY,SS,SS")
(set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*")
! (set_attr "type" "*,*,larl,*,*,*,*")
! (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,*,*")])
(define_insn "*cmpsi_ccu"
[(set (reg CC_REGNUM)
***************
*** 871,877 ****
#"
[(set_attr "op_type" "RR,RIL,RIL,SIL,RX,RXY,SS,SS")
(set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*,*")
! (set_attr "type" "*,*,larl,*,*,*,*,*")])
(define_insn "*cmphi_ccu"
[(set (reg CC_REGNUM)
--- 918,925 ----
#"
[(set_attr "op_type" "RR,RIL,RIL,SIL,RX,RXY,SS,SS")
(set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*,*")
! (set_attr "type" "*,*,larl,*,*,*,*,*")
! (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,*,*")])
(define_insn "*cmphi_ccu"
[(set (reg CC_REGNUM)
***************
*** 886,892 ****
#
#"
[(set_attr "op_type" "RS,RSY,SIL,SS,SS")
! (set_attr "cpu_facility" "*,*,z10,*,*")])
(define_insn "*cmpqi_ccu"
[(set (reg CC_REGNUM)
--- 934,941 ----
#
#"
[(set_attr "op_type" "RS,RSY,SIL,SS,SS")
! (set_attr "cpu_facility" "*,*,z10,*,*")
! (set_attr "z10prop" "*,*,z10_super,*,*")])
(define_insn "*cmpqi_ccu"
[(set (reg CC_REGNUM)
***************
*** 901,907 ****
cliy\t%S0,%b1
#
#"
! [(set_attr "op_type" "RS,RSY,SI,SIY,SS,SS")])
; Block compare (CLC) instruction patterns.
--- 950,957 ----
cliy\t%S0,%b1
#
#"
! [(set_attr "op_type" "RS,RSY,SI,SIY,SS,SS")
! (set_attr "z10prop" "*,*,z10_super,z10_super,*,*")])
; Block compare (CLC) instruction patterns.
***************
*** 948,954 ****
"s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
"lt<xde><bt>r\t%0,%0"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<bfp>")])
; cxtr, cxbr, cdbr, cebr, cxb, cdb, ceb, cxbtr, cdbtr
(define_insn "*cmp<mode>_ccs"
--- 998,1004 ----
"s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
"lt<xde><bt>r\t%0,%0"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<mode>")])
; cxtr, cxbr, cdbr, cebr, cxb, cdb, ceb, cxbtr, cdbtr
(define_insn "*cmp<mode>_ccs"
***************
*** 960,971 ****
c<xde><bt>r\t%0,%1
c<xde>b\t%0,%1"
[(set_attr "op_type" "RRE,RXE")
! (set_attr "type" "fsimp<bfp>")])
; Compare and Branch instructions
; cij, cgij, crj, cgrj, cfi, cgfi, cr, cgr
(define_insn "*cmp_and_br_signed_<mode>"
[(set (pc)
(if_then_else (match_operator 0 "s390_signed_integer_comparison"
--- 1010,1023 ----
c<xde><bt>r\t%0,%1
c<xde>b\t%0,%1"
[(set_attr "op_type" "RRE,RXE")
! (set_attr "type" "fsimp<mode>")])
; Compare and Branch instructions
; cij, cgij, crj, cgrj, cfi, cgfi, cr, cgr
+ ; The following instructions do a complementary access of their second
+ ; operand (z01 only): crj_c, cgrjc, cr, cgr
(define_insn "*cmp_and_br_signed_<mode>"
[(set (pc)
(if_then_else (match_operator 0 "s390_signed_integer_comparison"
***************
*** 985,996 ****
--- 1037,1051 ----
}
[(set_attr "op_type" "RIE")
(set_attr "type" "branch")
+ (set_attr "z10prop" "z10_cobra,z10_super")
(set (attr "length")
(if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
(const_int 6) (const_int 12)))]) ; 8 byte for cr/jg
; 10 byte for cgr/jg
; clij, clgij, clrj, clgrj, clfi, clgfi, clr, clgr
+ ; The following instructions do a complementary access of their second
+ ; operand (z10 only): clrj, clgrj, clr, clgr
(define_insn "*cmp_and_br_unsigned_<mode>"
[(set (pc)
(if_then_else (match_operator 0 "s390_unsigned_integer_comparison"
***************
*** 1010,1015 ****
--- 1065,1071 ----
}
[(set_attr "op_type" "RIE")
(set_attr "type" "branch")
+ (set_attr "z10prop" "z10_cobra,z10_super")
(set (attr "length")
(if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
(const_int 6) (const_int 12)))]) ; 8 byte for clr/jg
***************
*** 1200,1206 ****
&& !FP_REG_P (operands[0])"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")])
(define_insn "*movdi_64"
[(set (match_operand:DI 0 "nonimmediate_operand"
--- 1256,1263 ----
&& !FP_REG_P (operands[0])"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")
! (set_attr "z10prop" "z10_super_A1")])
(define_insn "*movdi_64"
[(set (match_operand:DI 0 "nonimmediate_operand"
***************
*** 1245,1251 ****
*,*,*")
(set_attr "cpu_facility" "*,*,*,*,*,extimm,extimm,extimm,dfp,dfp,longdisp,
z10,*,*,*,*,*,longdisp,*,longdisp,
! z10,z10,*,*,*,*,*")])
(define_split
[(set (match_operand:DI 0 "register_operand" "")
--- 1302,1336 ----
*,*,*")
(set_attr "cpu_facility" "*,*,*,*,*,extimm,extimm,extimm,dfp,dfp,longdisp,
z10,*,*,*,*,*,longdisp,*,longdisp,
! z10,z10,*,*,*,*,*")
! (set_attr "z10prop" "z10_fwd_A1,
! z10_fwd_E1,
! z10_fwd_E1,
! z10_fwd_E1,
! z10_fwd_E1,
! z10_fwd_A1,
! z10_fwd_E1,
! z10_fwd_E1,
! *,
! *,
! z10_fwd_A1,
! z10_fwd_A3,
! z10_fr_E1,
! z10_fwd_A3,
! z10_rec,
! *,
! *,
! *,
! *,
! *,
! z10_rec,
! z10_super,
! *,
! *,
! *,
! *,
! *")
! ])
(define_split
[(set (match_operand:DI 0 "register_operand" "")
***************
*** 1380,1386 ****
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX,RXY")
! (set_attr "type" "la")])
(define_peephole2
[(parallel
--- 1465,1472 ----
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX,RXY")
! (set_attr "type" "la")
! (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
(define_peephole2
[(parallel
***************
*** 1431,1437 ****
&& !FP_REG_P (operands[0])"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")])
(define_insn "*movsi_zarch"
[(set (match_operand:SI 0 "nonimmediate_operand"
--- 1517,1524 ----
&& !FP_REG_P (operands[0])"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")
! (set_attr "z10prop" "z10_super_A1")])
(define_insn "*movsi_zarch"
[(set (match_operand:SI 0 "nonimmediate_operand"
***************
*** 1465,1474 ****
#"
[(set_attr "op_type" "RI,RI,RI,RIL,RXY,RIL,RR,RX,RXY,RX,RXY,
RR,RX,RXY,RX,RXY,RRE,RRE,RS,RIL,SIL,RS,SS")
! (set_attr "type" "*,*,*,*,la,larl,lr,load,load,store,store,
! floadsf,floadsf,floadsf,fstoresf,fstoresf,*,*,*,larl,*,*,*")
(set_attr "cpu_facility" "*,*,*,extimm,longdisp,z10,*,*,longdisp,*,longdisp,
! *,*,longdisp,*,longdisp,*,*,*,z10,z10,*,*")])
(define_insn "*movsi_esa"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,R,!*f,!*f,!R,d,t,Q,t,?Q")
--- 1552,1605 ----
#"
[(set_attr "op_type" "RI,RI,RI,RIL,RXY,RIL,RR,RX,RXY,RX,RXY,
RR,RX,RXY,RX,RXY,RRE,RRE,RS,RIL,SIL,RS,SS")
! (set_attr "type" "*,
! *,
! *,
! *,
! la,
! larl,
! lr,
! load,
! load,
! store,
! store,
! floadsf,
! floadsf,
! floadsf,
! fstoresf,
! fstoresf,
! *,
! *,
! *,
! larl,
! *,
! *,
! *")
(set_attr "cpu_facility" "*,*,*,extimm,longdisp,z10,*,*,longdisp,*,longdisp,
! *,*,longdisp,*,longdisp,*,*,*,z10,z10,*,*")
! (set_attr "z10prop" "z10_fwd_A1,
! z10_fwd_E1,
! z10_fwd_E1,
! z10_fwd_A1,
! z10_fwd_A1,
! z10_fwd_A3,
! z10_fr_E1,
! z10_fwd_A3,
! z10_fwd_A3,
! z10_super,
! z10_rec,
! *,
! *,
! *,
! *,
! *,
! z10_super_E1,
! z10_super,
! *,
! z10_rec,
! z10_super,
! *,
! *")])
(define_insn "*movsi_esa"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,R,!*f,!*f,!R,d,t,Q,t,?Q")
***************
*** 1488,1494 ****
lam\t%0,%0,%S1
#"
[(set_attr "op_type" "RI,RR,RX,RX,RR,RX,RX,RRE,RRE,RS,RS,SS")
! (set_attr "type" "*,lr,load,store,floadsf,floadsf,fstoresf,*,*,*,*,*")])
(define_peephole2
[(set (match_operand:SI 0 "register_operand" "")
--- 1619,1638 ----
lam\t%0,%0,%S1
#"
[(set_attr "op_type" "RI,RR,RX,RX,RR,RX,RX,RRE,RRE,RS,RS,SS")
! (set_attr "type" "*,lr,load,store,floadsf,floadsf,fstoresf,*,*,*,*,*")
! (set_attr "z10prop" "z10_fwd_A1,
! z10_fr_E1,
! z10_fwd_A3,
! z10_super,
! *,
! *,
! *,
! z10_super_E1,
! z10_super,
! *,
! *,
! *")
! ])
(define_peephole2
[(set (match_operand:SI 0 "register_operand" "")
***************
*** 1509,1515 ****
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX,RXY")
! (set_attr "type" "la")])
(define_peephole2
[(parallel
--- 1653,1660 ----
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX,RXY")
! (set_attr "type" "la")
! (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
(define_peephole2
[(parallel
***************
*** 1544,1550 ****
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX,RXY")
! (set_attr "type" "la")])
(define_insn_and_split "*la_31_and_cc"
[(set (match_operand:SI 0 "register_operand" "=d")
--- 1689,1696 ----
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX,RXY")
! (set_attr "type" "la")
! (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
(define_insn_and_split "*la_31_and_cc"
[(set (match_operand:SI 0 "register_operand" "=d")
***************
*** 1569,1575 ****
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX")
! (set_attr "type" "la")])
;
; movhi instruction pattern(s).
--- 1715,1722 ----
la\t%0,%a1
lay\t%0,%a1"
[(set_attr "op_type" "RX")
! (set_attr "type" "la")
! (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
;
; movhi instruction pattern(s).
***************
*** 1610,1616 ****
#"
[(set_attr "op_type" "RR,RI,RX,RXY,RIL,RX,RXY,RIL,SIL,SS")
(set_attr "type" "lr,*,*,*,larl,store,store,store,*,*")
! (set_attr "cpu_facility" "*,*,*,*,z10,*,*,z10,z10,*")])
(define_peephole2
[(set (match_operand:HI 0 "register_operand" "")
--- 1757,1773 ----
#"
[(set_attr "op_type" "RR,RI,RX,RXY,RIL,RX,RXY,RIL,SIL,SS")
(set_attr "type" "lr,*,*,*,larl,store,store,store,*,*")
! (set_attr "cpu_facility" "*,*,*,*,z10,*,*,z10,z10,*")
! (set_attr "z10prop" "z10_fr_E1,
! z10_fwd_A1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super,
! z10_rec,
! z10_rec,
! z10_super,
! *")])
(define_peephole2
[(set (match_operand:HI 0 "register_operand" "")
***************
*** 1659,1665 ****
mviy\t%S0,%b1
#"
[(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SI,SIY,SS")
! (set_attr "type" "lr,*,*,*,store,store,store,store,*")])
(define_peephole2
[(set (match_operand:QI 0 "nonimmediate_operand" "")
--- 1816,1831 ----
mviy\t%S0,%b1
#"
[(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SI,SIY,SS")
! (set_attr "type" "lr,*,*,*,store,store,store,store,*")
! (set_attr "z10prop" "z10_fr_E1,
! z10_fwd_A1,
! z10_super_E1,
! z10_super_E1,
! z10_super,
! z10_rec,
! z10_super,
! z10_super,
! *")])
(define_peephole2
[(set (match_operand:QI 0 "nonimmediate_operand" "")
***************
*** 1682,1688 ****
"@
ic\t%0,%1
icy\t%0,%1"
! [(set_attr "op_type" "RX,RXY")])
;
; movstricthi instruction pattern(s).
--- 1848,1855 ----
"@
ic\t%0,%1
icy\t%0,%1"
! [(set_attr "op_type" "RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super")])
;
; movstricthi instruction pattern(s).
***************
*** 1696,1702 ****
"@
icm\t%0,3,%S1
icmy\t%0,3,%S1"
! [(set_attr "op_type" "RS,RSY")])
;
; movstrictsi instruction pattern(s).
--- 1863,1870 ----
"@
icm\t%0,3,%S1
icmy\t%0,3,%S1"
! [(set_attr "op_type" "RS,RSY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
;
; movstrictsi instruction pattern(s).
***************
*** 1712,1718 ****
ly\t%0,%1
ear\t%0,%1"
[(set_attr "op_type" "RR,RX,RXY,RRE")
! (set_attr "type" "lr,load,load,*")])
;
; mov(tf|td) instruction pattern(s).
--- 1880,1887 ----
ly\t%0,%1
ear\t%0,%1"
[(set_attr "op_type" "RR,RX,RXY,RRE")
! (set_attr "type" "lr,load,load,*")
! (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_super_E1")])
;
; mov(tf|td) instruction pattern(s).
***************
*** 1802,1808 ****
(define_split
[(set (match_operand:TD_TF 0 "register_operand" "")
(match_operand:TD_TF 1 "memory_operand" ""))]
! "reload_completed && offsettable_memref_p (operands[1])
&& FP_REG_P (operands[0])"
[(set (match_dup 2) (match_dup 4))
(set (match_dup 3) (match_dup 5))]
--- 1971,1977 ----
(define_split
[(set (match_operand:TD_TF 0 "register_operand" "")
(match_operand:TD_TF 1 "memory_operand" ""))]
! "reload_completed && offsettable_memref_p (operands[1])
&& FP_REG_P (operands[0])"
[(set (match_dup 2) (match_dup 4))
(set (match_dup 3) (match_dup 5))]
***************
*** 1862,1868 ****
#"
[(set_attr "op_type" "RRE,RR,RRE,RRE,RX,RXY,RX,RXY,RRE,RXY,RXY,SS")
(set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,floaddf,floaddf,
! fstoredf,fstoredf,lr,load,store,*")])
(define_insn "*mov<mode>_64"
[(set (match_operand:DD_DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d, d,RT,?Q")
--- 2031,2050 ----
#"
[(set_attr "op_type" "RRE,RR,RRE,RRE,RX,RXY,RX,RXY,RRE,RXY,RXY,SS")
(set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,floaddf,floaddf,
! fstoredf,fstoredf,lr,load,store,*")
! (set_attr "z10prop" "*,
! *,
! *,
! *,
! *,
! *,
! *,
! *,
! z10_fr_E1,
! z10_fwd_A3,
! z10_rec,
! *")
! ])
(define_insn "*mov<mode>_64"
[(set (match_operand:DD_DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d, d,RT,?Q")
***************
*** 1880,1887 ****
stg\t%1,%0
#"
[(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RRE,RXY,RXY,SS")
! (set_attr "type" "fsimp<bfp>,fload<bfp>,fload<bfp>,fload<bfp>,
! fstore<bfp>,fstore<bfp>,lr,load,store,*")])
(define_insn "*mov<mode>_31"
[(set (match_operand:DD_DF 0 "nonimmediate_operand"
--- 2062,2079 ----
stg\t%1,%0
#"
[(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RRE,RXY,RXY,SS")
! (set_attr "type" "fsimp<mode>,fload<mode>,fload<mode>,fload<mode>,
! fstore<mode>,fstore<mode>,lr,load,store,*")
! (set_attr "z10prop" "*,
! *,
! *,
! *,
! *,
! *,
! z10_fr_E1,
! z10_fwd_A3,
! z10_rec,
! *")])
(define_insn "*mov<mode>_31"
[(set (match_operand:DD_DF 0 "nonimmediate_operand"
***************
*** 1904,1911 ****
#
#"
[(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RS,RSY,RS,RSY,*,*,SS")
! (set_attr "type" "fsimp<bfp>,fload<bfp>,fload<bfp>,fload<bfp>,
! fstore<bfp>,fstore<bfp>,lm,lm,stm,stm,*,*,*")])
(define_split
[(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
--- 2096,2103 ----
#
#"
[(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RS,RSY,RS,RSY,*,*,SS")
! (set_attr "type" "fsimp<mode>,fload<mode>,fload<mode>,fload<mode>,
! fstore<mode>,fstore<mode>,lm,lm,stm,stm,*,*,*")])
(define_split
[(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
***************
*** 1972,1979 ****
sty\t%1,%0
#"
[(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RR,RX,RXY,RX,RXY,SS")
! (set_attr "type" "fsimp<bfp>,fload<bfp>,fload<bfp>,fload<bfp>,
! fstore<bfp>,fstore<bfp>,lr,load,load,store,store,*")])
;
; movcc instruction pattern
--- 2164,2183 ----
sty\t%1,%0
#"
[(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RR,RX,RXY,RX,RXY,SS")
! (set_attr "type" "fsimp<mode>,fload<mode>,fload<mode>,fload<mode>,
! fstore<mode>,fstore<mode>,lr,load,load,store,store,*")
! (set_attr "z10prop" "*,
! *,
! *,
! *,
! *,
! *,
! z10_fr_E1,
! z10_fwd_A3,
! z10_fwd_A3,
! z10_super,
! z10_rec,
! *")])
;
; movcc instruction pattern
***************
*** 1992,1998 ****
l\t%1,%0
ly\t%1,%0"
[(set_attr "op_type" "RR,RI,RRE,RX,RXY,RX,RXY")
! (set_attr "type" "lr,*,*,store,store,load,load")])
;
; Block move (MVC) patterns.
--- 2196,2203 ----
l\t%1,%0
ly\t%1,%0"
[(set_attr "op_type" "RR,RI,RRE,RX,RXY,RX,RXY")
! (set_attr "type" "lr,*,*,store,store,load,load")
! (set_attr "z10prop" "z10_fr_E1,*,*,z10_super,z10_rec,z10_fwd_A3,z10_fwd_A3")])
;
; Block move (MVC) patterns.
***************
*** 2032,2038 ****
(use (match_operand 5 "const_int_operand" ""))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
--- 2237,2243 ----
(use (match_operand 5 "const_int_operand" ""))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
***************
*** 2338,2356 ****
"clst\t%0,%1\;jo\t.-4"
[(set_attr "length" "8")
(set_attr "type" "vs")])
!
;
; movstr instruction pattern.
;
(define_expand "movstr"
[(set (reg:SI 0) (const_int 0))
! (parallel
[(clobber (match_dup 3))
(set (match_operand:BLK 1 "memory_operand" "")
(match_operand:BLK 2 "memory_operand" ""))
(set (match_operand 0 "register_operand" "")
! (unspec [(match_dup 1)
(match_dup 2)
(reg:SI 0)] UNSPEC_MVST))
(clobber (reg:CC CC_REGNUM))])]
--- 2543,2561 ----
"clst\t%0,%1\;jo\t.-4"
[(set_attr "length" "8")
(set_attr "type" "vs")])
!
;
; movstr instruction pattern.
;
(define_expand "movstr"
[(set (reg:SI 0) (const_int 0))
! (parallel
[(clobber (match_dup 3))
(set (match_operand:BLK 1 "memory_operand" "")
(match_operand:BLK 2 "memory_operand" ""))
(set (match_operand 0 "register_operand" "")
! (unspec [(match_dup 1)
(match_dup 2)
(reg:SI 0)] UNSPEC_MVST))
(clobber (reg:CC CC_REGNUM))])]
***************
*** 2371,2377 ****
(set (mem:BLK (match_operand:P 1 "register_operand" "0"))
(mem:BLK (match_operand:P 3 "register_operand" "2")))
(set (match_operand:P 0 "register_operand" "=d")
! (unspec [(mem:BLK (match_dup 1))
(mem:BLK (match_dup 3))
(reg:SI 0)] UNSPEC_MVST))
(clobber (reg:CC CC_REGNUM))]
--- 2576,2582 ----
(set (mem:BLK (match_operand:P 1 "register_operand" "0"))
(mem:BLK (match_operand:P 3 "register_operand" "2")))
(set (match_operand:P 0 "register_operand" "=d")
! (unspec [(mem:BLK (match_dup 1))
(mem:BLK (match_dup 3))
(reg:SI 0)] UNSPEC_MVST))
(clobber (reg:CC CC_REGNUM))]
***************
*** 2379,2385 ****
"mvst\t%1,%2\;jo\t.-4"
[(set_attr "length" "8")
(set_attr "type" "vs")])
!
;
; movmemM instruction pattern(s).
--- 2584,2590 ----
"mvst\t%1,%2\;jo\t.-4"
[(set_attr "length" "8")
(set_attr "type" "vs")])
!
;
; movmemM instruction pattern(s).
***************
*** 2467,2473 ****
"reload_completed && TARGET_CPU_ZARCH"
[(set (match_dup 3) (label_ref (match_dup 4)))
(parallel
! [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
(label_ref (match_dup 4))] UNSPEC_EXECUTE)
(set (match_dup 0) (match_dup 1))
(use (const_int 1))])]
--- 2672,2678 ----
"reload_completed && TARGET_CPU_ZARCH"
[(set (match_dup 3) (label_ref (match_dup 4)))
(parallel
! [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
(label_ref (match_dup 4))] UNSPEC_EXECUTE)
(set (match_dup 0) (match_dup 1))
(use (const_int 1))])]
***************
*** 2528,2535 ****
(define_expand "signbit<mode>2"
[(set (reg:CCZ CC_REGNUM)
! (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
! (match_dup 2)]
UNSPEC_TDC_INSN))
(set (match_operand:SI 0 "register_operand" "=d")
(unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CCZ_TO_INT))]
--- 2733,2740 ----
(define_expand "signbit<mode>2"
[(set (reg:CCZ CC_REGNUM)
! (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
! (match_dup 2)]
UNSPEC_TDC_INSN))
(set (match_operand:SI 0 "register_operand" "=d")
(unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CCZ_TO_INT))]
***************
*** 2540,2547 ****
(define_expand "isinf<mode>2"
[(set (reg:CCZ CC_REGNUM)
! (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
! (match_dup 2)]
UNSPEC_TDC_INSN))
(set (match_operand:SI 0 "register_operand" "=d")
(unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CCZ_TO_INT))]
--- 2745,2752 ----
(define_expand "isinf<mode>2"
[(set (reg:CCZ CC_REGNUM)
! (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
! (match_dup 2)]
UNSPEC_TDC_INSN))
(set (match_operand:SI 0 "register_operand" "=d")
(unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CCZ_TO_INT))]
***************
*** 2553,2568 ****
; This insn is used to generate all variants of the Test Data Class
; instruction, namely tcxb, tcdb, and tceb. The insn's first operand
; is the register to be tested and the second one is the bit mask
! ; specifying the required test(s).
;
(define_insn "*TDC_insn_<mode>"
[(set (reg:CCZ CC_REGNUM)
! (unspec:CCZ [(match_operand:FP_ALL 0 "register_operand" "f")
(match_operand:SI 1 "const_int_operand")] UNSPEC_TDC_INSN))]
"TARGET_HARD_FLOAT"
"t<_d>c<xde><bt>\t%0,%1"
[(set_attr "op_type" "RXE")
! (set_attr "type" "fsimp<bfp>")])
(define_insn_and_split "*ccz_to_int"
[(set (match_operand:SI 0 "register_operand" "=d")
--- 2758,2773 ----
; This insn is used to generate all variants of the Test Data Class
; instruction, namely tcxb, tcdb, and tceb. The insn's first operand
; is the register to be tested and the second one is the bit mask
! ; specifying the required test(s).
;
(define_insn "*TDC_insn_<mode>"
[(set (reg:CCZ CC_REGNUM)
! (unspec:CCZ [(match_operand:FP_ALL 0 "register_operand" "f")
(match_operand:SI 1 "const_int_operand")] UNSPEC_TDC_INSN))]
"TARGET_HARD_FLOAT"
"t<_d>c<xde><bt>\t%0,%1"
[(set_attr "op_type" "RXE")
! (set_attr "type" "fsimp<mode>")])
(define_insn_and_split "*ccz_to_int"
[(set (match_operand:SI 0 "register_operand" "=d")
***************
*** 2669,2682 ****
"reload_completed && TARGET_CPU_ZARCH"
[(set (match_dup 2) (label_ref (match_dup 3)))
(parallel
! [(unspec [(match_dup 1) (mem:BLK (match_dup 2))
(label_ref (match_dup 3))] UNSPEC_EXECUTE)
(set (match_dup 0) (const_int 0))
(use (const_int 1))
(clobber (reg:CC CC_REGNUM))])]
"operands[3] = gen_label_rtx ();")
! ; Initialize a block of arbitrary length with (operands[2] % 256).
(define_expand "setmem_long"
[(parallel
--- 2874,2887 ----
"reload_completed && TARGET_CPU_ZARCH"
[(set (match_dup 2) (label_ref (match_dup 3)))
(parallel
! [(unspec [(match_dup 1) (mem:BLK (match_dup 2))
(label_ref (match_dup 3))] UNSPEC_EXECUTE)
(set (match_dup 0) (const_int 0))
(use (const_int 1))
(clobber (reg:CC CC_REGNUM))])]
"operands[3] = gen_label_rtx ();")
! ; Initialize a block of arbitrary length with (operands[2] % 256).
(define_expand "setmem_long"
[(parallel
***************
*** 2823,2829 ****
"reload_completed && TARGET_CPU_ZARCH"
[(set (match_dup 3) (label_ref (match_dup 4)))
(parallel
! [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
(label_ref (match_dup 4))] UNSPEC_EXECUTE)
(set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
(use (const_int 1))])]
--- 3028,3034 ----
"reload_completed && TARGET_CPU_ZARCH"
[(set (match_dup 3) (label_ref (match_dup 4)))
(parallel
! [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
(label_ref (match_dup 4))] UNSPEC_EXECUTE)
(set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
(use (const_int 1))])]
***************
*** 2928,2934 ****
(define_insn_and_split "*cmpint_sign_cc"
[(set (reg CC_REGNUM)
! (compare (ashiftrt:DI (ashift:DI (subreg:DI
(unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
UNSPEC_CCU_TO_INT) 0)
(const_int 32)) (const_int 32))
--- 3133,3139 ----
(define_insn_and_split "*cmpint_sign_cc"
[(set (reg CC_REGNUM)
! (compare (ashiftrt:DI (ashift:DI (subreg:DI
(unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
UNSPEC_CCU_TO_INT) 0)
(const_int 32)) (const_int 32))
***************
*** 2962,2968 ****
"@
icm\t%0,%2,%S1
icmy\t%0,%2,%S1"
! [(set_attr "op_type" "RS,RSY")])
(define_insn "*sethighpartdi_64"
[(set (match_operand:DI 0 "register_operand" "=d")
--- 3167,3174 ----
"@
icm\t%0,%2,%S1
icmy\t%0,%2,%S1"
! [(set_attr "op_type" "RS,RSY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*sethighpartdi_64"
[(set (match_operand:DI 0 "register_operand" "=d")
***************
*** 2982,2988 ****
"@
icm\t%0,%2,%S1
icmy\t%0,%2,%S1"
! [(set_attr "op_type" "RS,RSY")])
(define_insn_and_split "*extzv<mode>"
[(set (match_operand:GPR 0 "register_operand" "=d")
--- 3188,3196 ----
"@
icm\t%0,%2,%S1
icmy\t%0,%2,%S1"
! [(set_attr "op_type" "RS,RSY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
!
(define_insn_and_split "*extzv<mode>"
[(set (match_operand:GPR 0 "register_operand" "=d")
***************
*** 3073,3079 ****
return "risbg\t%0,%3,%b2,%b1,%b4";
}
! [(set_attr "op_type" "RIE")])
; and op1 with a mask being 1 for the selected bits and 0 for the rest
; and op3=op0 with a mask being 0 for the selected bits and 1 for the rest
--- 3281,3288 ----
return "risbg\t%0,%3,%b2,%b1,%b4";
}
! [(set_attr "op_type" "RIE")
! (set_attr "z10prop" "z10_super_E1")])
; and op1 with a mask being 1 for the selected bits and 0 for the rest
; and op3=op0 with a mask being 0 for the selected bits and 1 for the rest
***************
*** 3102,3108 ****
return "risbg\t%0,%1,%b5,%b6,%b7";
}
! [(set_attr "op_type" "RIE")])
; and op1 with a mask being 1 for the selected bits and 0 for the rest
(define_insn "*insv<mode>_or_z10_noshift"
--- 3311,3318 ----
return "risbg\t%0,%1,%b5,%b6,%b7";
}
! [(set_attr "op_type" "RIE")
! (set_attr "z10prop" "z10_super_E1")])
; and op1 with a mask being 1 for the selected bits and 0 for the rest
(define_insn "*insv<mode>_or_z10_noshift"
***************
*** 3141,3150 ****
int size = INTVAL (operands[1]) / BITS_PER_UNIT;
operands[1] = GEN_INT ((1ul << size) - 1);
! return (which_alternative == 0) ? "stcm\t%2,%1,%S0"
: "stcmy\t%2,%1,%S0";
}
! [(set_attr "op_type" "RS,RSY")])
(define_insn "*insvdi_mem_reghigh"
[(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+QS")
--- 3351,3361 ----
int size = INTVAL (operands[1]) / BITS_PER_UNIT;
operands[1] = GEN_INT ((1ul << size) - 1);
! return (which_alternative == 0) ? "stcm\t%2,%1,%S0"
: "stcmy\t%2,%1,%S0";
}
! [(set_attr "op_type" "RS,RSY")
! (set_attr "z10prop" "z10_super,z10_super")])
(define_insn "*insvdi_mem_reghigh"
[(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+QS")
***************
*** 3162,3168 ****
operands[1] = GEN_INT ((1ul << size) - 1);
return "stcmh\t%2,%1,%S0";
}
! [(set_attr "op_type" "RSY")])
(define_insn "*insv<mode>_reg_imm"
[(set (zero_extract:P (match_operand:P 0 "register_operand" "+d")
--- 3373,3380 ----
operands[1] = GEN_INT ((1ul << size) - 1);
return "stcmh\t%2,%1,%S0";
}
! [(set_attr "op_type" "RSY")
! (set_attr "z10prop" "z10_super")])
(define_insn "*insv<mode>_reg_imm"
[(set (zero_extract:P (match_operand:P 0 "register_operand" "+d")
***************
*** 3183,3189 ****
default: gcc_unreachable();
}
}
! [(set_attr "op_type" "RI")])
(define_insn "*insv<mode>_reg_extimm"
[(set (zero_extract:P (match_operand:P 0 "register_operand" "+d")
--- 3395,3403 ----
default: gcc_unreachable();
}
}
! [(set_attr "op_type" "RI")
! (set_attr "z10prop" "z10_super_E1")])
!
(define_insn "*insv<mode>_reg_extimm"
[(set (zero_extract:P (match_operand:P 0 "register_operand" "+d")
***************
*** 3202,3208 ****
default: gcc_unreachable();
}
}
! [(set_attr "op_type" "RIL")])
;
; extendsidi2 instruction pattern(s).
--- 3416,3424 ----
default: gcc_unreachable();
}
}
! [(set_attr "op_type" "RIL")
! (set_attr "z10prop" "z10_fwd_E1")])
!
;
; extendsidi2 instruction pattern(s).
***************
*** 3233,3239 ****
lgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "*,*,z10")])
;
; extend(hi|qi)(si|di)2 instruction pattern(s).
--- 3449,3456 ----
lgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "*,*,z10")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
;
; extend(hi|qi)(si|di)2 instruction pattern(s).
***************
*** 3277,3290 ****
lghrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "extimm,extimm,z10")])
(define_insn "*extendhidi2"
[(set (match_operand:DI 0 "register_operand" "=d")
(sign_extend:DI (match_operand:HI 1 "memory_operand" "RT")))]
"TARGET_64BIT"
"lgh\t%0,%1"
! [(set_attr "op_type" "RXY")])
;
; extendhisi2 instruction pattern(s).
--- 3494,3509 ----
lghrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "extimm,extimm,z10")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*extendhidi2"
[(set (match_operand:DI 0 "register_operand" "=d")
(sign_extend:DI (match_operand:HI 1 "memory_operand" "RT")))]
"TARGET_64BIT"
"lgh\t%0,%1"
! [(set_attr "op_type" "RXY")
! (set_attr "z10prop" "z10_super_E1")])
;
; extendhisi2 instruction pattern(s).
***************
*** 3301,3307 ****
lhrl\t%0,%1"
[(set_attr "op_type" "RRE,RX,RXY,RIL")
(set_attr "type" "*,*,*,larl")
! (set_attr "cpu_facility" "extimm,extimm,extimm,z10")])
(define_insn "*extendhisi2"
[(set (match_operand:SI 0 "register_operand" "=d,d")
--- 3520,3527 ----
lhrl\t%0,%1"
[(set_attr "op_type" "RRE,RX,RXY,RIL")
(set_attr "type" "*,*,*,larl")
! (set_attr "cpu_facility" "extimm,extimm,extimm,z10")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*extendhisi2"
[(set (match_operand:SI 0 "register_operand" "=d,d")
***************
*** 3310,3316 ****
"@
lh\t%0,%1
lhy\t%0,%1"
! [(set_attr "op_type" "RX,RXY")])
;
; extendqi(si|di)2 instruction pattern(s).
--- 3530,3537 ----
"@
lh\t%0,%1
lhy\t%0,%1"
! [(set_attr "op_type" "RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
;
; extendqi(si|di)2 instruction pattern(s).
***************
*** 3324,3330 ****
"@
l<g>br\t%0,%1
l<g>b\t%0,%1"
! [(set_attr "op_type" "RRE,RXY")])
; lb, lgb
(define_insn "*extendqi<mode>2"
--- 3545,3552 ----
"@
l<g>br\t%0,%1
l<g>b\t%0,%1"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
; lb, lgb
(define_insn "*extendqi<mode>2"
***************
*** 3332,3338 ****
(sign_extend:GPR (match_operand:QI 1 "memory_operand" "RT")))]
"!TARGET_EXTIMM && TARGET_LONG_DISPLACEMENT"
"l<g>b\t%0,%1"
! [(set_attr "op_type" "RXY")])
(define_insn_and_split "*extendqi<mode>2_short_displ"
[(set (match_operand:GPR 0 "register_operand" "=d")
--- 3554,3561 ----
(sign_extend:GPR (match_operand:QI 1 "memory_operand" "RT")))]
"!TARGET_EXTIMM && TARGET_LONG_DISPLACEMENT"
"l<g>b\t%0,%1"
! [(set_attr "op_type" "RXY")
! (set_attr "z10prop" "z10_super_E1")])
(define_insn_and_split "*extendqi<mode>2_short_displ"
[(set (match_operand:GPR 0 "register_operand" "=d")
***************
*** 3382,3388 ****
llgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "*,*,z10")])
;
; LLGT-type instructions (zero-extend from 31 bit to 64 bit).
--- 3605,3612 ----
llgfrl\t%0,%1"
[(set_attr "op_type" "RRE,RXY,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "*,*,z10")
! (set_attr "z10prop" "z10_fwd_E1,z10_fwd_A3,z10_fwd_A3")])
;
; LLGT-type instructions (zero-extend from 31 bit to 64 bit).
***************
*** 3394,3400 ****
(const_int 2147483647)))]
"TARGET_64BIT"
"llgt\t%0,%1"
! [(set_attr "op_type" "RXE")])
(define_insn_and_split "*llgt_sidi_split"
[(set (match_operand:DI 0 "register_operand" "=d")
--- 3618,3625 ----
(const_int 2147483647)))]
"TARGET_64BIT"
"llgt\t%0,%1"
! [(set_attr "op_type" "RXE")
! (set_attr "z10prop" "z10_super_E1")])
(define_insn_and_split "*llgt_sidi_split"
[(set (match_operand:DI 0 "register_operand" "=d")
***************
*** 3417,3423 ****
"@
llgtr\t%0,%1
llgt\t%0,%1"
! [(set_attr "op_type" "RRE,RXE")])
(define_insn "*llgt_didi"
[(set (match_operand:DI 0 "register_operand" "=d,d")
--- 3642,3649 ----
"@
llgtr\t%0,%1
llgt\t%0,%1"
! [(set_attr "op_type" "RRE,RXE")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*llgt_didi"
[(set (match_operand:DI 0 "register_operand" "=d,d")
***************
*** 3427,3433 ****
"@
llgtr\t%0,%1
llgt\t%0,%N1"
! [(set_attr "op_type" "RRE,RXE")])
(define_split
[(set (match_operand:GPR 0 "register_operand" "")
--- 3653,3660 ----
"@
llgtr\t%0,%1
llgt\t%0,%N1"
! [(set_attr "op_type" "RRE,RXE")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_split
[(set (match_operand:GPR 0 "register_operand" "")
***************
*** 3458,3464 ****
}
else if (!TARGET_EXTIMM)
{
! rtx bitcount = GEN_INT (GET_MODE_BITSIZE(DImode) -
GET_MODE_BITSIZE(<MODE>mode));
operands[1] = gen_lowpart (DImode, operands[1]);
emit_insn (gen_ashldi3 (operands[0], operands[1], bitcount));
--- 3685,3691 ----
}
else if (!TARGET_EXTIMM)
{
! rtx bitcount = GEN_INT (GET_MODE_BITSIZE(DImode) -
GET_MODE_BITSIZE(<MODE>mode));
operands[1] = gen_lowpart (DImode, operands[1]);
emit_insn (gen_ashldi3 (operands[0], operands[1], bitcount));
***************
*** 3475,3481 ****
if (!TARGET_EXTIMM)
{
operands[1] = gen_lowpart (SImode, operands[1]);
! emit_insn (gen_andsi3 (operands[0], operands[1],
GEN_INT ((1 << GET_MODE_BITSIZE(<MODE>mode)) - 1)));
DONE;
}
--- 3702,3708 ----
if (!TARGET_EXTIMM)
{
operands[1] = gen_lowpart (SImode, operands[1]);
! emit_insn (gen_andsi3 (operands[0], operands[1],
GEN_INT ((1 << GET_MODE_BITSIZE(<MODE>mode)) - 1)));
DONE;
}
***************
*** 3492,3498 ****
ll<g>hrl\t%0,%1"
[(set_attr "op_type" "RXY,RRE,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "*,*,z10")])
; llhr, llcr, llghr, llgcr, llh, llc, llgh, llgc
(define_insn "*zero_extend<HQI:mode><GPR:mode>2_extimm"
--- 3719,3726 ----
ll<g>hrl\t%0,%1"
[(set_attr "op_type" "RXY,RRE,RIL")
(set_attr "type" "*,*,larl")
! (set_attr "cpu_facility" "*,*,z10")
! (set_attr "z10prop" "z10_fwd_A3")])
; llhr, llcr, llghr, llgcr, llh, llc, llgh, llgc
(define_insn "*zero_extend<HQI:mode><GPR:mode>2_extimm"
***************
*** 3502,3508 ****
"@
ll<g><hc>r\t%0,%1
ll<g><hc>\t%0,%1"
! [(set_attr "op_type" "RRE,RXY")])
; llgh, llgc
(define_insn "*zero_extend<HQI:mode><GPR:mode>2"
--- 3730,3737 ----
"@
ll<g><hc>r\t%0,%1
ll<g><hc>\t%0,%1"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_fwd_A3")])
; llgh, llgc
(define_insn "*zero_extend<HQI:mode><GPR:mode>2"
***************
*** 3510,3516 ****
(zero_extend:GPR (match_operand:HQI 1 "memory_operand" "RT")))]
"TARGET_ZARCH && !TARGET_EXTIMM"
"llg<hc>\t%0,%1"
! [(set_attr "op_type" "RXY")])
(define_insn_and_split "*zero_extendhisi2_31"
[(set (match_operand:SI 0 "register_operand" "=&d")
--- 3739,3746 ----
(zero_extend:GPR (match_operand:HQI 1 "memory_operand" "RT")))]
"TARGET_ZARCH && !TARGET_EXTIMM"
"llg<hc>\t%0,%1"
! [(set_attr "op_type" "RXY")
! (set_attr "z10prop" "z10_fwd_A3")])
(define_insn_and_split "*zero_extendhisi2_31"
[(set (match_operand:SI 0 "register_operand" "=&d")
***************
*** 3554,3560 ****
(zero_extend:HI (match_operand:QI 1 "memory_operand" "RT")))]
"TARGET_ZARCH && !TARGET_EXTIMM"
"llgc\t%0,%1"
! [(set_attr "op_type" "RXY")])
(define_insn_and_split "*zero_extendqihi2_31"
[(set (match_operand:HI 0 "register_operand" "=&d")
--- 3784,3791 ----
(zero_extend:HI (match_operand:QI 1 "memory_operand" "RT")))]
"TARGET_ZARCH && !TARGET_EXTIMM"
"llgc\t%0,%1"
! [(set_attr "op_type" "RXY")
! (set_attr "z10prop" "z10_fwd_A3")])
(define_insn_and_split "*zero_extendqihi2_31"
[(set (match_operand:HI 0 "register_operand" "=&d")
***************
*** 3575,3581 ****
[(set (match_operand:DI 0 "register_operand" "")
(unsigned_fix:DI (match_operand:DD 1 "register_operand" "")))
(clobber (match_scratch:TD 2 "=f"))])]
!
"TARGET_HARD_FLOAT && TARGET_HARD_DFP"
{
rtx label1 = gen_label_rtx ();
--- 3806,3812 ----
[(set (match_operand:DI 0 "register_operand" "")
(unsigned_fix:DI (match_operand:DD 1 "register_operand" "")))
(clobber (match_scratch:TD 2 "=f"))])]
!
"TARGET_HARD_FLOAT && TARGET_HARD_DFP"
{
rtx label1 = gen_label_rtx ();
***************
*** 3587,3593 ****
decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
/* 2^63 can't be represented as 64bit DFP number with full precision. The
! solution is doing the check and the subtraction in TD mode and using a
TD -> DI convert afterwards. */
emit_insn (gen_extendddtd2 (temp, operands[1]));
temp = force_reg (TDmode, temp);
--- 3818,3824 ----
decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
/* 2^63 can't be represented as 64bit DFP number with full precision. The
! solution is doing the check and the subtraction in TD mode and using a
TD -> DI convert afterwards. */
emit_insn (gen_extendddtd2 (temp, operands[1]));
temp = force_reg (TDmode, temp);
***************
*** 3614,3624 ****
rtx label2 = gen_label_rtx ();
rtx temp = gen_reg_rtx (TDmode);
REAL_VALUE_TYPE cmp, sub;
!
operands[1] = force_reg (TDmode, operands[1]);
decimal_real_from_string (&cmp, "9223372036854775808.0"); /* 2^63 */
decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
!
emit_insn (gen_cmptd (operands[1],
CONST_DOUBLE_FROM_REAL_VALUE (cmp, TDmode)));
emit_jump_insn (gen_blt (label1));
--- 3845,3855 ----
rtx label2 = gen_label_rtx ();
rtx temp = gen_reg_rtx (TDmode);
REAL_VALUE_TYPE cmp, sub;
!
operands[1] = force_reg (TDmode, operands[1]);
decimal_real_from_string (&cmp, "9223372036854775808.0"); /* 2^63 */
decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
!
emit_insn (gen_cmptd (operands[1],
CONST_DOUBLE_FROM_REAL_VALUE (cmp, TDmode)));
emit_jump_insn (gen_blt (label1));
***************
*** 3634,3640 ****
})
;
! ; fixuns_trunc(sf|df)(si|di)2 and fix_trunc(sf|df)(si|di)2
; instruction pattern(s).
;
--- 3865,3871 ----
})
;
! ; fixuns_trunc(sf|df)(si|di)2 and fix_trunc(sf|df)(si|di)2
; instruction pattern(s).
;
***************
*** 3647,3657 ****
rtx label2 = gen_label_rtx ();
rtx temp = gen_reg_rtx (<BFP:MODE>mode);
REAL_VALUE_TYPE cmp, sub;
!
operands[1] = force_reg (<BFP:MODE>mode, operands[1]);
real_2expN (&cmp, GET_MODE_BITSIZE(<GPR:MODE>mode) - 1, <BFP:MODE>mode);
real_2expN (&sub, GET_MODE_BITSIZE(<GPR:MODE>mode), <BFP:MODE>mode);
!
emit_insn (gen_cmp<BFP:mode> (operands[1],
CONST_DOUBLE_FROM_REAL_VALUE (cmp, <BFP:MODE>mode)));
emit_jump_insn (gen_blt (label1));
--- 3878,3888 ----
rtx label2 = gen_label_rtx ();
rtx temp = gen_reg_rtx (<BFP:MODE>mode);
REAL_VALUE_TYPE cmp, sub;
!
operands[1] = force_reg (<BFP:MODE>mode, operands[1]);
real_2expN (&cmp, GET_MODE_BITSIZE(<GPR:MODE>mode) - 1, <BFP:MODE>mode);
real_2expN (&sub, GET_MODE_BITSIZE(<GPR:MODE>mode), <BFP:MODE>mode);
!
emit_insn (gen_cmp<BFP:mode> (operands[1],
CONST_DOUBLE_FROM_REAL_VALUE (cmp, <BFP:MODE>mode)));
emit_jump_insn (gen_blt (label1));
***************
*** 3714,3720 ****
"TARGET_64BIT && TARGET_HARD_FLOAT && TARGET_HARD_DFP"
"cg<DFP:xde>tr\t%0,%h2,%1"
[(set_attr "op_type" "RRF")
! (set_attr "type" "ftoi")])
;
--- 3945,3951 ----
"TARGET_64BIT && TARGET_HARD_FLOAT && TARGET_HARD_DFP"
"cg<DFP:xde>tr\t%0,%h2,%1"
[(set_attr "op_type" "RRF")
! (set_attr "type" "ftoidfp")])
;
***************
*** 3741,3747 ****
"TARGET_64BIT && TARGET_HARD_FLOAT"
"c<xde>g<bt>r\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "itof" )])
; cxfbr, cdfbr, cefbr
(define_insn "floatsi<mode>2"
--- 3972,3978 ----
"TARGET_64BIT && TARGET_HARD_FLOAT"
"c<xde>g<bt>r\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "itof<mode>" )])
; cxfbr, cdfbr, cefbr
(define_insn "floatsi<mode>2"
***************
*** 3750,3756 ****
"TARGET_HARD_FLOAT"
"c<xde>fbr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "itof" )])
;
--- 3981,3987 ----
"TARGET_HARD_FLOAT"
"c<xde>fbr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "itof<mode>" )])
;
***************
*** 3777,3783 ****
"TARGET_HARD_FLOAT"
"l<xde>xbr\t%2,%1\;l<xde>r\t%0,%2"
[(set_attr "length" "6")
! (set_attr "type" "ftrunctf")])
;
; trunctddd2 and truncddsd2 instruction pattern(s).
--- 4008,4014 ----
"TARGET_HARD_FLOAT"
"l<xde>xbr\t%2,%1\;l<xde>r\t%0,%2"
[(set_attr "length" "6")
! (set_attr "type" "ftrunctf")])
;
; trunctddd2 and truncddsd2 instruction pattern(s).
***************
*** 3790,3796 ****
"TARGET_HARD_FLOAT && TARGET_HARD_DFP"
"ldxtr\t%2,0,%1,0\;ldr\t%0,%2"
[(set_attr "length" "6")
! (set_attr "type" "ftrunctf")])
(define_insn "truncddsd2"
[(set (match_operand:SD 0 "register_operand" "=f")
--- 4021,4027 ----
"TARGET_HARD_FLOAT && TARGET_HARD_DFP"
"ldxtr\t%2,0,%1,0\;ldr\t%0,%2"
[(set_attr "length" "6")
! (set_attr "type" "ftruncdd")])
(define_insn "truncddsd2"
[(set (match_operand:SD 0 "register_operand" "=f")
***************
*** 3798,3804 ****
"TARGET_HARD_FLOAT && TARGET_HARD_DFP"
"ledtr\t%0,0,%1,0"
[(set_attr "op_type" "RRF")
! (set_attr "type" "fsimptf")])
;
; extend(sf|df)(df|tf)2 instruction pattern(s).
--- 4029,4035 ----
"TARGET_HARD_FLOAT && TARGET_HARD_DFP"
"ledtr\t%0,0,%1,0"
[(set_attr "op_type" "RRF")
! (set_attr "type" "ftruncsd")])
;
; extend(sf|df)(df|tf)2 instruction pattern(s).
***************
*** 4035,4041 ****
"@
algfr\t%0,%2
algf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*adddi3_zero_cconly"
[(set (reg CC_REGNUM)
--- 4266,4273 ----
"@
algfr\t%0,%2
algf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*adddi3_zero_cconly"
[(set (reg CC_REGNUM)
***************
*** 4047,4053 ****
"@
algfr\t%0,%2
algf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*adddi3_zero"
[(set (match_operand:DI 0 "register_operand" "=d,d")
--- 4279,4286 ----
"@
algfr\t%0,%2
algf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*adddi3_zero"
[(set (match_operand:DI 0 "register_operand" "=d,d")
***************
*** 4058,4064 ****
"@
algfr\t%0,%2
algf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn_and_split "*adddi3_31z"
[(set (match_operand:DI 0 "nonimmediate_operand" "=&d")
--- 4291,4298 ----
"@
algfr\t%0,%2
algf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn_and_split "*adddi3_31z"
[(set (match_operand:DI 0 "nonimmediate_operand" "=&d")
***************
*** 4161,4167 ****
a<y>\t%0,%2
a<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RI,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,*,extimm,extimm,*,*,z10")])
; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi
(define_insn "*add<mode>3_carry1_cc"
--- 4395,4408 ----
a<y>\t%0,%2
a<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RI,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,*,extimm,extimm,*,*,z10")
! (set_attr "z10prop" "z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1")])
; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi
(define_insn "*add<mode>3_carry1_cc"
***************
*** 4180,4186 ****
al<y>\t%0,%2
al<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,extimm,extimm,*,*,z10")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_carry1_cconly"
--- 4421,4433 ----
al<y>\t%0,%2
al<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,extimm,extimm,*,*,z10")
! (set_attr "z10prop" "z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_carry1_cconly"
***************
*** 4194,4200 ****
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi
(define_insn "*add<mode>3_carry2_cc"
--- 4441,4448 ----
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi
(define_insn "*add<mode>3_carry2_cc"
***************
*** 4213,4219 ****
al<y>\t%0,%2
al<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,extimm,extimm,*,*,z10")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_carry2_cconly"
--- 4461,4473 ----
al<y>\t%0,%2
al<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,extimm,extimm,*,*,z10")
! (set_attr "z10prop" "z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_carry2_cconly"
***************
*** 4227,4233 ****
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi
(define_insn "*add<mode>3_cc"
--- 4481,4488 ----
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi
(define_insn "*add<mode>3_cc"
***************
*** 4246,4252 ****
al<y>\t%0,%2
al<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,extimm,extimm,*,*,z10")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_cconly"
--- 4501,4513 ----
al<y>\t%0,%2
al<g>si\t%0,%c2"
[(set_attr "op_type" "RR<E>,RIL,RIL,RX<Y>,RXY,SIY")
! (set_attr "cpu_facility" "*,extimm,extimm,*,*,z10")
! (set_attr "z10prop" "z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_cconly"
***************
*** 4260,4266 ****
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_cconly2"
--- 4521,4528 ----
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
; alr, al, aly, algr, alg
(define_insn "*add<mode>3_cconly2"
***************
*** 4273,4279 ****
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; ahi, afi, aghi, agfi, asi, agsi
(define_insn "*add<mode>3_imm_cc"
--- 4535,4542 ----
al<g>r\t%0,%2
al<g>\t%0,%2
al<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
; ahi, afi, aghi, agfi, asi, agsi
(define_insn "*add<mode>3_imm_cc"
***************
*** 4293,4299 ****
a<g>fi\t%0,%2
a<g>si\t%0,%c2"
[(set_attr "op_type" "RI,RIL,SIY")
! (set_attr "cpu_facility" "*,extimm,z10")])
;
; add(tf|df|sf|td|dd)3 instruction pattern(s).
--- 4556,4563 ----
a<g>fi\t%0,%2
a<g>si\t%0,%c2"
[(set_attr "op_type" "RI,RIL,SIY")
! (set_attr "cpu_facility" "*,extimm,z10")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
;
; add(tf|df|sf|td|dd)3 instruction pattern(s).
***************
*** 4310,4316 ****
a<xde><bt>r\t%0,<op1>%2
a<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<bfp>")])
; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
(define_insn "*add<mode>3_cc"
--- 4574,4580 ----
a<xde><bt>r\t%0,<op1>%2
a<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<mode>")])
; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
(define_insn "*add<mode>3_cc"
***************
*** 4325,4331 ****
a<xde><bt>r\t%0,<op1>%2
a<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<bfp>")])
; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
(define_insn "*add<mode>3_cconly"
--- 4589,4595 ----
a<xde><bt>r\t%0,<op1>%2
a<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<mode>")])
; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
(define_insn "*add<mode>3_cconly"
***************
*** 4339,4345 ****
a<xde><bt>r\t%0,<op1>%2
a<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<bfp>")])
;;
--- 4603,4609 ----
a<xde><bt>r\t%0,<op1>%2
a<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<mode>")])
;;
***************
*** 4396,4402 ****
"@
sgfr\t%0,%2
sgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*subdi3_zero_cc"
[(set (reg CC_REGNUM)
--- 4660,4667 ----
"@
sgfr\t%0,%2
sgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_c,*")])
(define_insn "*subdi3_zero_cc"
[(set (reg CC_REGNUM)
***************
*** 4409,4415 ****
"@
slgfr\t%0,%2
slgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*subdi3_zero_cconly"
[(set (reg CC_REGNUM)
--- 4674,4681 ----
"@
slgfr\t%0,%2
slgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
(define_insn "*subdi3_zero_cconly"
[(set (reg CC_REGNUM)
***************
*** 4421,4427 ****
"@
slgfr\t%0,%2
slgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*subdi3_zero"
[(set (match_operand:DI 0 "register_operand" "=d,d")
--- 4687,4694 ----
"@
slgfr\t%0,%2
slgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
(define_insn "*subdi3_zero"
[(set (match_operand:DI 0 "register_operand" "=d,d")
***************
*** 4432,4438 ****
"@
slgfr\t%0,%2
slgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn_and_split "*subdi3_31z"
[(set (match_operand:DI 0 "register_operand" "=&d")
--- 4699,4706 ----
"@
slgfr\t%0,%2
slgf\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
(define_insn_and_split "*subdi3_31z"
[(set (match_operand:DI 0 "register_operand" "=&d")
***************
*** 4529,4535 ****
s<g>r\t%0,%2
s<g>\t%0,%2
s<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_borrow_cc"
--- 4797,4804 ----
s<g>r\t%0,%2
s<g>\t%0,%2
s<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_borrow_cc"
***************
*** 4544,4550 ****
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_borrow_cconly"
--- 4813,4820 ----
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_borrow_cconly"
***************
*** 4558,4564 ****
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cc"
--- 4828,4835 ----
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cc"
***************
*** 4573,4579 ****
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cc2"
--- 4844,4851 ----
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cc2"
***************
*** 4587,4593 ****
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cconly"
--- 4859,4866 ----
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cconly"
***************
*** 4601,4607 ****
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cconly2"
--- 4874,4882 ----
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
!
; slr, sl, sly, slgr, slg
(define_insn "*sub<mode>3_cconly2"
***************
*** 4614,4620 ****
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")])
;
; sub(tf|df|sf|td|dd)3 instruction pattern(s).
--- 4889,4897 ----
sl<g>r\t%0,%2
sl<g>\t%0,%2
sl<y>\t%0,%2"
! [(set_attr "op_type" "RR<E>,RX<Y>,RXY")
! (set_attr "z10prop" "z10_super_c_E1,z10_super_E1,z10_super_E1")])
!
;
; sub(tf|df|sf|td|dd)3 instruction pattern(s).
***************
*** 4631,4637 ****
s<xde><bt>r\t%0,<op1>%2
s<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<bfp>")])
; sxbr, sdbr, sebr, sxb, sdb, seb, sxtr, sdtr
(define_insn "*sub<mode>3_cc"
--- 4908,4914 ----
s<xde><bt>r\t%0,<op1>%2
s<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<mode>")])
; sxbr, sdbr, sebr, sxb, sdb, seb, sxtr, sdtr
(define_insn "*sub<mode>3_cc"
***************
*** 4646,4652 ****
s<xde><bt>r\t%0,<op1>%2
s<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<bfp>")])
; sxbr, sdbr, sebr, sxb, sdb, seb, sxtr, sdtr
(define_insn "*sub<mode>3_cconly"
--- 4923,4929 ----
s<xde><bt>r\t%0,<op1>%2
s<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<mode>")])
; sxbr, sdbr, sebr, sxb, sdb, seb, sxtr, sdtr
(define_insn "*sub<mode>3_cconly"
***************
*** 4660,4666 ****
s<xde><bt>r\t%0,<op1>%2
s<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<bfp>")])
;;
--- 4937,4943 ----
s<xde><bt>r\t%0,<op1>%2
s<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fsimp<mode>")])
;;
***************
*** 4783,4789 ****
"@
slb<g>r\t%0,%2
slb<g>\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
; slbr, slb, slbgr, slbg
(define_insn "*sub<mode>3_slb"
--- 5060,5067 ----
"@
slb<g>r\t%0,%2
slb<g>\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_c,*")])
; slbr, slb, slbgr, slbg
(define_insn "*sub<mode>3_slb"
***************
*** 4796,4802 ****
"@
slb<g>r\t%0,%2
slb<g>\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_expand "add<mode>cc"
[(match_operand:GPR 0 "register_operand" "")
--- 5074,5081 ----
"@
slb<g>r\t%0,%2
slb<g>\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_c,*")])
(define_expand "add<mode>cc"
[(match_operand:GPR 0 "register_operand" "")
***************
*** 4804,4812 ****
(match_operand:GPR 2 "register_operand" "")
(match_operand:GPR 3 "const_int_operand" "")]
"TARGET_CPU_ZARCH"
! "if (!s390_expand_addcc (GET_CODE (operands[1]),
! s390_compare_op0, s390_compare_op1,
! operands[0], operands[2],
operands[3])) FAIL; DONE;")
;
--- 5083,5091 ----
(match_operand:GPR 2 "register_operand" "")
(match_operand:GPR 3 "const_int_operand" "")]
"TARGET_CPU_ZARCH"
! "if (!s390_expand_addcc (GET_CODE (operands[1]),
! s390_compare_op0, s390_compare_op1,
! operands[0], operands[2],
operands[3])) FAIL; DONE;")
;
***************
*** 4862,4868 ****
[(set (match_dup 0) (xor:SI (match_dup 0) (const_int 1)))
(clobber (reg:CC CC_REGNUM))])]
""
! {
if (!s390_compare_emitted || GET_MODE (s390_compare_emitted) != CCZ1mode)
FAIL;
operands[1] = s390_emit_compare (NE, s390_compare_op0, s390_compare_op1);
--- 5141,5147 ----
[(set (match_dup 0) (xor:SI (match_dup 0) (const_int 1)))
(clobber (reg:CC CC_REGNUM))])]
""
! {
if (!s390_compare_emitted || GET_MODE (s390_compare_emitted) != CCZ1mode)
FAIL;
operands[1] = s390_emit_compare (NE, s390_compare_op0, s390_compare_op1);
***************
*** 4871,4877 ****
(define_insn_and_split "*sne"
[(set (match_operand:SI 0 "register_operand" "=d")
! (ne:SI (match_operand:CCZ1 1 "register_operand" "0")
(const_int 0)))
(clobber (reg:CC CC_REGNUM))]
""
--- 5150,5156 ----
(define_insn_and_split "*sne"
[(set (match_operand:SI 0 "register_operand" "=d")
! (ne:SI (match_operand:CCZ1 1 "register_operand" "0")
(const_int 0)))
(clobber (reg:CC CC_REGNUM))]
""
***************
*** 4986,4992 ****
; mul(tf|df|sf|td|dd)3 instruction pattern(s).
;
! ; mxbr mdbr, meebr, mxb, mxb, meeb, mdtr, mxtr
(define_insn "mul<mode>3"
[(set (match_operand:FP 0 "register_operand" "=f,f")
(mult:FP (match_operand:FP 1 "nonimmediate_operand" "%<f0>,0")
--- 5265,5271 ----
; mul(tf|df|sf|td|dd)3 instruction pattern(s).
;
! ; mxbr, mdbr, meebr, mxb, mxb, meeb, mdtr, mxtr
(define_insn "mul<mode>3"
[(set (match_operand:FP 0 "register_operand" "=f,f")
(mult:FP (match_operand:FP 1 "nonimmediate_operand" "%<f0>,0")
***************
*** 4996,5004 ****
m<xdee><bt>r\t%0,<op1>%2
m<xdee>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fmul<bfp>")])
! ; maxbr, madbr, maebr, maxb, madb, maeb
(define_insn "*fmadd<mode>"
[(set (match_operand:DSF 0 "register_operand" "=f,f")
(plus:DSF (mult:DSF (match_operand:DSF 1 "register_operand" "%f,f")
--- 5275,5283 ----
m<xdee><bt>r\t%0,<op1>%2
m<xdee>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fmul<mode>")])
! ; madbr, maebr, maxb, madb, maeb
(define_insn "*fmadd<mode>"
[(set (match_operand:DSF 0 "register_operand" "=f,f")
(plus:DSF (mult:DSF (match_operand:DSF 1 "register_operand" "%f,f")
***************
*** 5456,5462 ****
d<xde><bt>r\t%0,<op1>%2
d<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fdiv<bfp>")])
;;
--- 5735,5741 ----
d<xde><bt>r\t%0,<op1>%2
d<xde>b\t%0,%2"
[(set_attr "op_type" "<RRer>,RXE")
! (set_attr "type" "fdiv<mode>")])
;;
***************
*** 5486,5492 ****
"@
ngr\t%0,%2
ng\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*anddi3_cconly"
[(set (reg CC_REGNUM)
--- 5765,5772 ----
"@
ngr\t%0,%2
ng\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*anddi3_cconly"
[(set (reg CC_REGNUM)
***************
*** 5500,5506 ****
"@
ngr\t%0,%2
ng\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*anddi3"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,d,d,AQ,Q")
--- 5780,5787 ----
"@
ngr\t%0,%2
ng\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1, z10_super_E1")])
(define_insn "*anddi3"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,d,d,AQ,Q")
***************
*** 5524,5530 ****
#
#"
[(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RIL,RIL,RRE,RXY,SI,SS")
! (set_attr "cpu_facility" "*,*,*,*,*,*,extimm,extimm,*,*,*,*")])
(define_split
[(set (match_operand:DI 0 "s_operand" "")
--- 5805,5823 ----
#
#"
[(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RIL,RIL,RRE,RXY,SI,SS")
! (set_attr "cpu_facility" "*,*,*,*,*,*,extimm,extimm,*,*,*,*")
! (set_attr "z10prop" "*,
! *,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! *,
! *")])
(define_split
[(set (match_operand:DI 0 "s_operand" "")
***************
*** 5554,5560 ****
nr\t%0,%2
n\t%0,%2
ny\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")])
(define_insn "*andsi3_cconly"
[(set (reg CC_REGNUM)
--- 5847,5854 ----
nr\t%0,%2
n\t%0,%2
ny\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*andsi3_cconly"
[(set (reg CC_REGNUM)
***************
*** 5570,5576 ****
nr\t%0,%2
n\t%0,%2
ny\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")])
(define_insn "*andsi3_zarch"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
--- 5864,5871 ----
nr\t%0,%2
n\t%0,%2
ny\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*andsi3_zarch"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
***************
*** 5591,5597 ****
ny\t%0,%2
#
#"
! [(set_attr "op_type" "RRE,RXE,RI,RI,RIL,RR,RX,RXY,SI,SS")])
(define_insn "*andsi3_esa"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
--- 5886,5902 ----
ny\t%0,%2
#
#"
! [(set_attr "op_type" "RRE,RXE,RI,RI,RIL,RR,RX,RXY,SI,SS")
! (set_attr "z10prop" "*,
! *,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! *,
! *")])
(define_insn "*andsi3_esa"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
***************
*** 5604,5610 ****
n\t%0,%2
#
#"
! [(set_attr "op_type" "RR,RX,SI,SS")])
(define_split
[(set (match_operand:SI 0 "s_operand" "")
--- 5909,5917 ----
n\t%0,%2
#
#"
! [(set_attr "op_type" "RR,RX,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
!
(define_split
[(set (match_operand:SI 0 "s_operand" "")
***************
*** 5631,5637 ****
nill\t%0,%x2
#
#"
! [(set_attr "op_type" "RR,RI,SI,SS")])
(define_insn "*andhi3_esa"
[(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
--- 5938,5946 ----
nill\t%0,%x2
#
#"
! [(set_attr "op_type" "RR,RI,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")
! ])
(define_insn "*andhi3_esa"
[(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
***************
*** 5643,5649 ****
nr\t%0,%2
#
#"
! [(set_attr "op_type" "RR,SI,SS")])
(define_split
[(set (match_operand:HI 0 "s_operand" "")
--- 5952,5960 ----
nr\t%0,%2
#
#"
! [(set_attr "op_type" "RR,SI,SS")
! (set_attr "z10prop" "z10_super_E1,*,*")
! ])
(define_split
[(set (match_operand:HI 0 "s_operand" "")
***************
*** 5671,5677 ****
ni\t%S0,%b2
niy\t%S0,%b2
#"
! [(set_attr "op_type" "RR,RI,SI,SIY,SS")])
(define_insn "*andqi3_esa"
[(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
--- 5982,5989 ----
ni\t%S0,%b2
niy\t%S0,%b2
#"
! [(set_attr "op_type" "RR,RI,SI,SIY,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super,z10_super,*")])
(define_insn "*andqi3_esa"
[(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
***************
*** 5683,5689 ****
nr\t%0,%2
ni\t%S0,%b2
#"
! [(set_attr "op_type" "RR,SI,SS")])
;
; Block and (NC) patterns.
--- 5995,6002 ----
nr\t%0,%2
ni\t%S0,%b2
#"
! [(set_attr "op_type" "RR,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super,*")])
;
; Block and (NC) patterns.
***************
*** 5732,5738 ****
(clobber (reg:CC CC_REGNUM))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
--- 6045,6051 ----
(clobber (reg:CC CC_REGNUM))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
***************
*** 5771,5777 ****
"@
ogr\t%0,%2
og\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*iordi3_cconly"
[(set (reg CC_REGNUM)
--- 6084,6091 ----
"@
ogr\t%0,%2
og\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*iordi3_cconly"
[(set (reg CC_REGNUM)
***************
*** 5783,5789 ****
"@
ogr\t%0,%2
og\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*iordi3"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
--- 6097,6104 ----
"@
ogr\t%0,%2
og\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*iordi3"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
***************
*** 5804,5810 ****
#
#"
[(set_attr "op_type" "RI,RI,RI,RI,RIL,RIL,RRE,RXY,SI,SS")
! (set_attr "cpu_facility" "*,*,*,*,extimm,extimm,*,*,*,*")])
(define_split
[(set (match_operand:DI 0 "s_operand" "")
--- 6119,6135 ----
#
#"
[(set_attr "op_type" "RI,RI,RI,RI,RIL,RIL,RRE,RXY,SI,SS")
! (set_attr "cpu_facility" "*,*,*,*,extimm,extimm,*,*,*,*")
! (set_attr "z10prop" "z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! *,
! *")])
(define_split
[(set (match_operand:DI 0 "s_operand" "")
***************
*** 5833,5839 ****
or\t%0,%2
o\t%0,%2
oy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")])
(define_insn "*iorsi3_cconly"
[(set (reg CC_REGNUM)
--- 6158,6165 ----
or\t%0,%2
o\t%0,%2
oy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*iorsi3_cconly"
[(set (reg CC_REGNUM)
***************
*** 5847,5853 ****
or\t%0,%2
o\t%0,%2
oy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")])
(define_insn "*iorsi3_zarch"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,AQ,Q")
--- 6173,6180 ----
or\t%0,%2
o\t%0,%2
oy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*iorsi3_zarch"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,AQ,Q")
***************
*** 5864,5870 ****
oy\t%0,%2
#
#"
! [(set_attr "op_type" "RI,RI,RIL,RR,RX,RXY,SI,SS")])
(define_insn "*iorsi3_esa"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
--- 6191,6205 ----
oy\t%0,%2
#
#"
! [(set_attr "op_type" "RI,RI,RIL,RR,RX,RXY,SI,SS")
! (set_attr "z10prop" "z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! z10_super_E1,
! *,
! *")])
(define_insn "*iorsi3_esa"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
***************
*** 5877,5883 ****
o\t%0,%2
#
#"
! [(set_attr "op_type" "RR,RX,SI,SS")])
(define_split
[(set (match_operand:SI 0 "s_operand" "")
--- 6212,6219 ----
o\t%0,%2
#
#"
! [(set_attr "op_type" "RR,RX,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
(define_split
[(set (match_operand:SI 0 "s_operand" "")
***************
*** 5904,5910 ****
oill\t%0,%x2
#
#"
! [(set_attr "op_type" "RR,RI,SI,SS")])
(define_insn "*iorhi3_esa"
[(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
--- 6240,6247 ----
oill\t%0,%x2
#
#"
! [(set_attr "op_type" "RR,RI,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
(define_insn "*iorhi3_esa"
[(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
***************
*** 5916,5922 ****
or\t%0,%2
#
#"
! [(set_attr "op_type" "RR,SI,SS")])
(define_split
[(set (match_operand:HI 0 "s_operand" "")
--- 6253,6260 ----
or\t%0,%2
#
#"
! [(set_attr "op_type" "RR,SI,SS")
! (set_attr "z10prop" "z10_super_E1,*,*")])
(define_split
[(set (match_operand:HI 0 "s_operand" "")
***************
*** 5944,5950 ****
oi\t%S0,%b2
oiy\t%S0,%b2
#"
! [(set_attr "op_type" "RR,RI,SI,SIY,SS")])
(define_insn "*iorqi3_esa"
[(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
--- 6282,6289 ----
oi\t%S0,%b2
oiy\t%S0,%b2
#"
! [(set_attr "op_type" "RR,RI,SI,SIY,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super,z10_super,*")])
(define_insn "*iorqi3_esa"
[(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
***************
*** 5956,5962 ****
or\t%0,%2
oi\t%S0,%b2
#"
! [(set_attr "op_type" "RR,SI,SS")])
;
; Block inclusive or (OC) patterns.
--- 6295,6302 ----
or\t%0,%2
oi\t%S0,%b2
#"
! [(set_attr "op_type" "RR,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super,*")])
;
; Block inclusive or (OC) patterns.
***************
*** 6005,6011 ****
(clobber (reg:CC CC_REGNUM))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
--- 6345,6351 ----
(clobber (reg:CC CC_REGNUM))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
***************
*** 6044,6050 ****
"@
xgr\t%0,%2
xg\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*xordi3_cconly"
[(set (reg CC_REGNUM)
--- 6384,6391 ----
"@
xgr\t%0,%2
xg\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*xordi3_cconly"
[(set (reg CC_REGNUM)
***************
*** 6056,6062 ****
"@
xgr\t%0,%2
xg\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")])
(define_insn "*xordi3"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,AQ,Q")
--- 6397,6404 ----
"@
xgr\t%0,%2
xg\t%0,%2"
! [(set_attr "op_type" "RRE,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
(define_insn "*xordi3"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,AQ,Q")
***************
*** 6072,6078 ****
#
#"
[(set_attr "op_type" "RIL,RIL,RRE,RXY,SI,SS")
! (set_attr "cpu_facility" "extimm,extimm,*,*,*,*")])
(define_split
[(set (match_operand:DI 0 "s_operand" "")
--- 6414,6421 ----
#
#"
[(set_attr "op_type" "RIL,RIL,RRE,RXY,SI,SS")
! (set_attr "cpu_facility" "extimm,extimm,*,*,*,*")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1,*,*")])
(define_split
[(set (match_operand:DI 0 "s_operand" "")
***************
*** 6101,6107 ****
xr\t%0,%2
x\t%0,%2
xy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")])
(define_insn "*xorsi3_cconly"
[(set (reg CC_REGNUM)
--- 6444,6451 ----
xr\t%0,%2
x\t%0,%2
xy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*xorsi3_cconly"
[(set (reg CC_REGNUM)
***************
*** 6115,6121 ****
xr\t%0,%2
x\t%0,%2
xy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")])
(define_insn "*xorsi3"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,AQ,Q")
--- 6459,6466 ----
xr\t%0,%2
x\t%0,%2
xy\t%0,%2"
! [(set_attr "op_type" "RIL,RR,RX,RXY")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
(define_insn "*xorsi3"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,AQ,Q")
***************
*** 6130,6136 ****
xy\t%0,%2
#
#"
! [(set_attr "op_type" "RIL,RR,RX,RXY,SI,SS")])
(define_split
[(set (match_operand:SI 0 "s_operand" "")
--- 6475,6482 ----
xy\t%0,%2
#
#"
! [(set_attr "op_type" "RIL,RR,RX,RXY,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1,*,*")])
(define_split
[(set (match_operand:SI 0 "s_operand" "")
***************
*** 6157,6163 ****
xr\t%0,%2
#
#"
! [(set_attr "op_type" "RIL,RR,SI,SS")])
(define_split
[(set (match_operand:HI 0 "s_operand" "")
--- 6503,6510 ----
xr\t%0,%2
#
#"
! [(set_attr "op_type" "RIL,RR,SI,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
(define_split
[(set (match_operand:HI 0 "s_operand" "")
***************
*** 6185,6191 ****
xi\t%S0,%b2
xiy\t%S0,%b2
#"
! [(set_attr "op_type" "RIL,RR,SI,SIY,SS")])
;
; Block exclusive or (XC) patterns.
--- 6532,6540 ----
xi\t%S0,%b2
xiy\t%S0,%b2
#"
! [(set_attr "op_type" "RIL,RR,SI,SIY,SS")
! (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super,z10_super,*")])
!
;
; Block exclusive or (XC) patterns.
***************
*** 6234,6240 ****
(clobber (reg:CC CC_REGNUM))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
--- 6583,6589 ----
(clobber (reg:CC CC_REGNUM))])]
"s390_offset_p (operands[0], operands[3], operands[2])
&& s390_offset_p (operands[1], operands[4], operands[2])
! && !s390_overlap_p (operands[0], operands[1],
INTVAL (operands[2]) + INTVAL (operands[5]))
&& INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
[(parallel
***************
*** 6306,6312 ****
"TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
"lcgfr\t%0,%1"
[(set_attr "op_type" "RRE")])
!
(define_insn "*negdi2_sign"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
--- 6655,6661 ----
"TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
"lcgfr\t%0,%1"
[(set_attr "op_type" "RRE")])
!
(define_insn "*negdi2_sign"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
***************
*** 6324,6330 ****
(neg:GPR (match_dup 1)))]
"s390_match_ccmode (insn, CCAmode)"
"lc<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
; lcr, lcgr
(define_insn "*neg<mode>2_cconly"
--- 6673,6680 ----
(neg:GPR (match_dup 1)))]
"s390_match_ccmode (insn, CCAmode)"
"lc<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_super_c_E1")])
; lcr, lcgr
(define_insn "*neg<mode>2_cconly"
***************
*** 6334,6340 ****
(clobber (match_scratch:GPR 0 "=d"))]
"s390_match_ccmode (insn, CCAmode)"
"lc<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
; lcr, lcgr
(define_insn "*neg<mode>2"
--- 6684,6691 ----
(clobber (match_scratch:GPR 0 "=d"))]
"s390_match_ccmode (insn, CCAmode)"
"lc<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_super_c_E1")])
; lcr, lcgr
(define_insn "*neg<mode>2"
***************
*** 6343,6349 ****
(clobber (reg:CC CC_REGNUM))]
""
"lc<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
(define_insn_and_split "*negdi2_31"
[(set (match_operand:DI 0 "register_operand" "=d")
--- 6694,6701 ----
(clobber (reg:CC CC_REGNUM))]
""
"lc<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_super_c_E1")])
(define_insn_and_split "*negdi2_31"
[(set (match_operand:DI 0 "register_operand" "=d")
***************
*** 6415,6421 ****
"TARGET_HARD_FLOAT && TARGET_DFP"
"lcdfr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<bfp>")])
; lcxbr, lcdbr, lcebr
(define_insn "*neg<mode>2"
--- 6767,6773 ----
"TARGET_HARD_FLOAT && TARGET_DFP"
"lcdfr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<mode>")])
; lcxbr, lcdbr, lcebr
(define_insn "*neg<mode>2"
***************
*** 6465,6473 ****
(abs:GPR (match_dup 1)))]
"s390_match_ccmode (insn, CCAmode)"
"lp<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
! ; lpr, lpgr
(define_insn "*abs<mode>2_cconly"
[(set (reg CC_REGNUM)
(compare (abs:GPR (match_operand:GPR 1 "register_operand" "d"))
--- 6817,6826 ----
(abs:GPR (match_dup 1)))]
"s390_match_ccmode (insn, CCAmode)"
"lp<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_c")])
! ; lpr, lpgr
(define_insn "*abs<mode>2_cconly"
[(set (reg CC_REGNUM)
(compare (abs:GPR (match_operand:GPR 1 "register_operand" "d"))
***************
*** 6475,6481 ****
(clobber (match_scratch:GPR 0 "=d"))]
"s390_match_ccmode (insn, CCAmode)"
"lp<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
; lpr, lpgr
(define_insn "abs<mode>2"
--- 6828,6835 ----
(clobber (match_scratch:GPR 0 "=d"))]
"s390_match_ccmode (insn, CCAmode)"
"lp<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_c")])
; lpr, lpgr
(define_insn "abs<mode>2"
***************
*** 6484,6490 ****
(clobber (reg:CC CC_REGNUM))]
""
"lp<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
;
; abs(df|sf)2 instruction pattern(s).
--- 6838,6845 ----
(clobber (reg:CC CC_REGNUM))]
""
"lp<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_c")])
;
; abs(df|sf)2 instruction pattern(s).
***************
*** 6528,6534 ****
"TARGET_HARD_FLOAT && TARGET_DFP"
"lpdfr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<bfp>")])
; lpxbr, lpdbr, lpebr
(define_insn "*abs<mode>2"
--- 6883,6889 ----
"TARGET_HARD_FLOAT && TARGET_DFP"
"lpdfr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<mode>")])
; lpxbr, lpdbr, lpebr
(define_insn "*abs<mode>2"
***************
*** 6560,6566 ****
"TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
"lngfr\t%0,%1"
[(set_attr "op_type" "RRE")])
!
(define_insn "*negabsdi2_sign"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (abs:DI (sign_extend:DI
--- 6915,6921 ----
"TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
"lngfr\t%0,%1"
[(set_attr "op_type" "RRE")])
!
(define_insn "*negabsdi2_sign"
[(set (match_operand:DI 0 "register_operand" "=d")
(neg:DI (abs:DI (sign_extend:DI
***************
*** 6579,6585 ****
(neg:GPR (abs:GPR (match_dup 1))))]
"s390_match_ccmode (insn, CCAmode)"
"ln<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
; lnr, lngr
(define_insn "*negabs<mode>2_cconly"
--- 6934,6941 ----
(neg:GPR (abs:GPR (match_dup 1))))]
"s390_match_ccmode (insn, CCAmode)"
"ln<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_c")])
; lnr, lngr
(define_insn "*negabs<mode>2_cconly"
***************
*** 6589,6595 ****
(clobber (match_scratch:GPR 0 "=d"))]
"s390_match_ccmode (insn, CCAmode)"
"ln<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
; lnr, lngr
(define_insn "*negabs<mode>2"
--- 6945,6952 ----
(clobber (match_scratch:GPR 0 "=d"))]
"s390_match_ccmode (insn, CCAmode)"
"ln<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_c")])
; lnr, lngr
(define_insn "*negabs<mode>2"
***************
*** 6598,6604 ****
(clobber (reg:CC CC_REGNUM))]
""
"ln<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")])
;
; Floating point
--- 6955,6962 ----
(clobber (reg:CC CC_REGNUM))]
""
"ln<g>r\t%0,%1"
! [(set_attr "op_type" "RR<E>")
! (set_attr "z10prop" "z10_c")])
;
; Floating point
***************
*** 6634,6640 ****
"TARGET_HARD_FLOAT && TARGET_DFP"
"lndfr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<bfp>")])
; lnxbr, lndbr, lnebr
(define_insn "*negabs<mode>2"
--- 6992,6998 ----
"TARGET_HARD_FLOAT && TARGET_DFP"
"lndfr\t%0,%1"
[(set_attr "op_type" "RRE")
! (set_attr "type" "fsimp<mode>")])
; lnxbr, lndbr, lnebr
(define_insn "*negabs<mode>2"
***************
*** 6654,6665 ****
(define_insn "copysign<mode>3"
[(set (match_operand:FP 0 "register_operand" "=f")
(unspec:FP [(match_operand:FP 1 "register_operand" "<fT0>")
! (match_operand:FP 2 "register_operand" "f")]
UNSPEC_COPYSIGN))]
"TARGET_HARD_FLOAT && TARGET_DFP"
"cpsdr\t%0,%2,%1"
[(set_attr "op_type" "RRF")
! (set_attr "type" "fsimp<bfp>")])
;;
;;- Square root instructions.
--- 7012,7023 ----
(define_insn "copysign<mode>3"
[(set (match_operand:FP 0 "register_operand" "=f")
(unspec:FP [(match_operand:FP 1 "register_operand" "<fT0>")
! (match_operand:FP 2 "register_operand" "f")]
UNSPEC_COPYSIGN))]
"TARGET_HARD_FLOAT && TARGET_DFP"
"cpsdr\t%0,%2,%1"
[(set_attr "op_type" "RRF")
! (set_attr "type" "fsimp<mode>")])
;;
;;- Square root instructions.
***************
*** 6669,6675 ****
; sqrt(df|sf)2 instruction pattern(s).
;
! ; sqxbr, sqdbr, sqebr, sqxb, sqdb, sqeb
(define_insn "sqrt<mode>2"
[(set (match_operand:BFP 0 "register_operand" "=f,f")
(sqrt:BFP (match_operand:BFP 1 "general_operand" "f,<Rf>")))]
--- 7027,7033 ----
; sqrt(df|sf)2 instruction pattern(s).
;
! ; sqxbr, sqdbr, sqebr, sqdb, sqeb
(define_insn "sqrt<mode>2"
[(set (match_operand:BFP 0 "register_operand" "=f,f")
(sqrt:BFP (match_operand:BFP 1 "general_operand" "f,<Rf>")))]
***************
*** 6716,6722 ****
emit_insn (gen_clztidi2 (wide_reg, operands[1], msb));
! insn = emit_move_insn (operands[0], gen_highpart (DImode, wide_reg));
set_unique_reg_note (insn, REG_EQUAL, clz_equal);
DONE;
--- 7074,7080 ----
emit_insn (gen_clztidi2 (wide_reg, operands[1], msb));
! insn = emit_move_insn (operands[0], gen_highpart (DImode, wide_reg));
set_unique_reg_note (insn, REG_EQUAL, clz_equal);
DONE;
***************
*** 6725,6740 ****
(define_insn "clztidi2"
[(set (match_operand:TI 0 "register_operand" "=d")
(ior:TI
! (ashift:TI
! (zero_extend:TI
(xor:DI (match_operand:DI 1 "register_operand" "d")
(lshiftrt (match_operand:DI 2 "const_int_operand" "")
(subreg:SI (clz:DI (match_dup 1)) 4))))
!
(const_int 64))
(zero_extend:TI (clz:DI (match_dup 1)))))
(clobber (reg:CC CC_REGNUM))]
! "(unsigned HOST_WIDE_INT) INTVAL (operands[2])
== (unsigned HOST_WIDE_INT) 1 << 63
&& TARGET_EXTIMM && TARGET_64BIT"
"flogr\t%0,%1"
--- 7083,7098 ----
(define_insn "clztidi2"
[(set (match_operand:TI 0 "register_operand" "=d")
(ior:TI
! (ashift:TI
! (zero_extend:TI
(xor:DI (match_operand:DI 1 "register_operand" "d")
(lshiftrt (match_operand:DI 2 "const_int_operand" "")
(subreg:SI (clz:DI (match_dup 1)) 4))))
!
(const_int 64))
(zero_extend:TI (clz:DI (match_dup 1)))))
(clobber (reg:CC CC_REGNUM))]
! "(unsigned HOST_WIDE_INT) INTVAL (operands[2])
== (unsigned HOST_WIDE_INT) 1 << 63
&& TARGET_EXTIMM && TARGET_64BIT"
"flogr\t%0,%1"
***************
*** 6757,6763 ****
"TARGET_CPU_ZARCH"
"rll<g>\t%0,%1,%Y2"
[(set_attr "op_type" "RSE")
! (set_attr "atype" "reg")])
; rll, rllg
(define_insn "*rotl<mode>3_and"
--- 7115,7122 ----
"TARGET_CPU_ZARCH"
"rll<g>\t%0,%1,%Y2"
[(set_attr "op_type" "RSE")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; rll, rllg
(define_insn "*rotl<mode>3_and"
***************
*** 6768,6774 ****
"TARGET_CPU_ZARCH && (INTVAL (operands[3]) & 63) == 63"
"rll<g>\t%0,%1,%Y2"
[(set_attr "op_type" "RSE")
! (set_attr "atype" "reg")])
;;
--- 7127,7134 ----
"TARGET_CPU_ZARCH && (INTVAL (operands[3]) & 63) == 63"
"rll<g>\t%0,%1,%Y2"
[(set_attr "op_type" "RSE")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
;;
***************
*** 6804,6810 ****
""
"s<lr>l<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
; sldl, srdl
(define_insn "*<shift>di3_31_and"
--- 7164,7171 ----
""
"s<lr>l<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; sldl, srdl
(define_insn "*<shift>di3_31_and"
***************
*** 6826,6832 ****
"(INTVAL (operands[3]) & 63) == 63"
"s<lr>l<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
;
; ashr(di|si)3 instruction pattern(s).
--- 7187,7194 ----
"(INTVAL (operands[3]) & 63) == 63"
"s<lr>l<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
;
; ashr(di|si)3 instruction pattern(s).
***************
*** 6885,6891 ****
"s390_match_ccmode(insn, CCSmode)"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
; sra, srag
(define_insn "*ashr<mode>3_cconly"
--- 7247,7254 ----
"s390_match_ccmode(insn, CCSmode)"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; sra, srag
(define_insn "*ashr<mode>3_cconly"
***************
*** 6897,6903 ****
"s390_match_ccmode(insn, CCSmode)"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
; sra, srag
(define_insn "*ashr<mode>3"
--- 7260,7267 ----
"s390_match_ccmode(insn, CCSmode)"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; sra, srag
(define_insn "*ashr<mode>3"
***************
*** 6908,6914 ****
""
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
; shift pattern with implicit ANDs
--- 7272,7279 ----
""
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; shift pattern with implicit ANDs
***************
*** 6963,6969 ****
"s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
; sra, srag
(define_insn "*ashr<mode>3_cconly_and"
--- 7328,7335 ----
"s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; sra, srag
(define_insn "*ashr<mode>3_cconly_and"
***************
*** 6976,6982 ****
"s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
; sra, srag
(define_insn "*ashr<mode>3_and"
--- 7342,7349 ----
"s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
; sra, srag
(define_insn "*ashr<mode>3_and"
***************
*** 6988,6994 ****
"(INTVAL (operands[3]) & 63) == 63"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")])
;;
--- 7355,7362 ----
"(INTVAL (operands[3]) & 63) == 63"
"sra<g>\t%0,<1>%Y2"
[(set_attr "op_type" "RS<E>")
! (set_attr "atype" "reg")
! (set_attr "z10prop" "z10_super_E1")])
;;
***************
*** 7148,7154 ****
""
{
if (operands[1] != const0_rtx) FAIL;
! operands[0] = s390_emit_compare (GET_CODE (operands[0]),
s390_compare_op0, s390_compare_op1);
})
--- 7516,7522 ----
""
{
if (operands[1] != const0_rtx) FAIL;
! operands[0] = s390_emit_compare (GET_CODE (operands[0]),
s390_compare_op0, s390_compare_op1);
})
***************
*** 7171,7177 ****
c<g>rt%C0\t%1,%2
c<g>it%C0\t%1,%h2"
[(set_attr "op_type" "RRF,RIE")
! (set_attr "type" "branch")])
; clrt, clgrt, clfit, clgit
(define_insn "*cmp_and_trap_unsigned_int<mode>"
--- 7539,7546 ----
c<g>rt%C0\t%1,%2
c<g>it%C0\t%1,%h2"
[(set_attr "op_type" "RRF,RIE")
! (set_attr "type" "branch")
! (set_attr "z10prop" "z10_c,*")])
; clrt, clgrt, clfit, clgit
(define_insn "*cmp_and_trap_unsigned_int<mode>"
***************
*** 7184,7190 ****
cl<g>rt%C0\t%1,%2
cl<gf>it%C0\t%1,%x2"
[(set_attr "op_type" "RRF,RIE")
! (set_attr "type" "branch")])
;;
;;- Loop instructions.
--- 7553,7560 ----
cl<g>rt%C0\t%1,%2
cl<gf>it%C0\t%1,%x2"
[(set_attr "op_type" "RRF,RIE")
! (set_attr "type" "branch")
! (set_attr "z10prop" "z10_c,*")])
;;
;;- Loop instructions.
***************
*** 7246,7251 ****
--- 7616,7624 ----
(pc)))]
""
[(set_attr "op_type" "RI")
+ ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
+ ; hurt us in the (rare) case of ahi.
+ (set_attr "z10prop" "z10_super")
(set_attr "type" "branch")
(set (attr "length")
(if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
***************
*** 7285,7290 ****
--- 7658,7666 ----
(pc)))]
""
[(set_attr "op_type" "RI")
+ ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
+ ; hurt us in the (rare) case of ahi.
+ (set_attr "z10prop" "z10_super")
(set_attr "type" "branch")
(set (attr "length")
(if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
***************
*** 7351,7356 ****
--- 7727,7735 ----
(pc)))]
""
[(set_attr "op_type" "RI")
+ ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
+ ; hurt us in the (rare) case of ahi.
+ (set_attr "z10prop" "z10_super")
(set_attr "type" "branch")
(set (attr "length")
(if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
***************
*** 7417,7423 ****
(if_then_else (match_operand 0 "register_operand" "")
(const_string "RR") (const_string "RX")))
(set_attr "type" "branch")
! (set_attr "atype" "agen")])
;
; casesi instruction pattern(s).
--- 7796,7803 ----
(if_then_else (match_operand 0 "register_operand" "")
(const_string "RR") (const_string "RX")))
(set_attr "type" "branch")
! (set_attr "atype" "agen")
! (set_attr "z10prop" "z10_super")])
;
; casesi instruction pattern(s).
***************
*** 7760,7766 ****
UNSPEC_TLS_LOAD))]
"TARGET_64BIT"
"lg\t%0,%1%J2"
! [(set_attr "op_type" "RXE")])
(define_insn "*tls_load_31"
[(set (match_operand:SI 0 "register_operand" "=d,d")
--- 8140,8147 ----
UNSPEC_TLS_LOAD))]
"TARGET_64BIT"
"lg\t%0,%1%J2"
! [(set_attr "op_type" "RXE")
! (set_attr "z10prop" "z10_fwd_A3")])
(define_insn "*tls_load_31"
[(set (match_operand:SI 0 "register_operand" "=d,d")
***************
*** 7771,7777 ****
"@
l\t%0,%1%J2
ly\t%0,%1%J2"
! [(set_attr "op_type" "RX,RXY")])
(define_insn "*bras_tls"
[(set (match_operand 0 "" "")
--- 8152,8159 ----
"@
l\t%0,%1%J2
ly\t%0,%1%J2"
! [(set_attr "op_type" "RX,RXY")
! (set_attr "z10prop" "z10_fwd_A3,z10_fwd_A3")])
(define_insn "*bras_tls"
[(set (match_operand 0 "" "")
***************
*** 7841,7846 ****
--- 8223,8230 ----
""
"bcr\t15,0"
[(set_attr "op_type" "RR")])
+ ; Although bcr is superscalar on Z10, this variant will never become part of
+ ; an execution group.
;
; compare and swap patterns.
***************
*** 7873,7879 ****
(set (reg:CCZ1 CC_REGNUM)
(compare:CCZ1 (match_dup 1) (match_dup 2)))])]
""
! "s390_expand_cs_hqi (<MODE>mode, operands[0], operands[1],
operands[2], operands[3]); DONE;")
(define_expand "sync_compare_and_swap_cc<mode>"
--- 8257,8263 ----
(set (reg:CCZ1 CC_REGNUM)
(compare:CCZ1 (match_dup 1) (match_dup 2)))])]
""
! "s390_expand_cs_hqi (<MODE>mode, operands[0], operands[1],
operands[2], operands[3]); DONE;")
(define_expand "sync_compare_and_swap_cc<mode>"
***************
*** 7926,7932 ****
UNSPECV_CAS))
(set (reg:CCZ1 CC_REGNUM)
(compare:CCZ1 (match_dup 1) (match_dup 2)))]
! ""
"cs<g>\t%0,%3,%S1"
[(set_attr "op_type" "RS<E>")
(set_attr "type" "sem")])
--- 8310,8316 ----
UNSPECV_CAS))
(set (reg:CCZ1 CC_REGNUM)
(compare:CCZ1 (match_dup 1) (match_dup 2)))]
! ""
"cs<g>\t%0,%3,%S1"
[(set_attr "op_type" "RS<E>")
(set_attr "type" "sem")])
***************
*** 7941,7947 ****
(match_operand:HQI 1 "memory_operand")
(match_operand:HQI 2 "general_operand")]
""
! "s390_expand_atomic (<MODE>mode, SET, operands[0], operands[1],
operands[2], false); DONE;")
(define_expand "sync_<atomic><mode>"
--- 8325,8331 ----
(match_operand:HQI 1 "memory_operand")
(match_operand:HQI 2 "general_operand")]
""
! "s390_expand_atomic (<MODE>mode, SET, operands[0], operands[1],
operands[2], false); DONE;")
(define_expand "sync_<atomic><mode>"
***************
*** 7949,7955 ****
(ATOMIC:HQI (match_dup 0)
(match_operand:HQI 1 "general_operand")))]
""
! "s390_expand_atomic (<MODE>mode, <CODE>, NULL_RTX, operands[0],
operands[1], false); DONE;")
(define_expand "sync_old_<atomic><mode>"
--- 8333,8339 ----
(ATOMIC:HQI (match_dup 0)
(match_operand:HQI 1 "general_operand")))]
""
! "s390_expand_atomic (<MODE>mode, <CODE>, NULL_RTX, operands[0],
operands[1], false); DONE;")
(define_expand "sync_old_<atomic><mode>"
***************
*** 7959,7974 ****
(ATOMIC:HQI (match_dup 1)
(match_operand:HQI 2 "general_operand")))]
""
! "s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
operands[2], false); DONE;")
(define_expand "sync_new_<atomic><mode>"
[(set (match_operand:HQI 0 "register_operand")
(ATOMIC:HQI (match_operand:HQI 1 "memory_operand")
! (match_operand:HQI 2 "general_operand")))
(set (match_dup 1) (ATOMIC:HQI (match_dup 1) (match_dup 2)))]
""
! "s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
operands[2], true); DONE;")
;;
--- 8343,8358 ----
(ATOMIC:HQI (match_dup 1)
(match_operand:HQI 2 "general_operand")))]
""
! "s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
operands[2], false); DONE;")
(define_expand "sync_new_<atomic><mode>"
[(set (match_operand:HQI 0 "register_operand")
(ATOMIC:HQI (match_operand:HQI 1 "memory_operand")
! (match_operand:HQI 2 "general_operand")))
(set (match_dup 1) (ATOMIC:HQI (match_dup 1) (match_dup 2)))]
""
! "s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
operands[2], true); DONE;")
;;
***************
*** 8080,8086 ****
if (TARGET_BACKCHAIN)
temp = force_reg (Pmode, operand_subword (operands[1], 0, 0, mode));
!
emit_move_insn (base, operand_subword (operands[1], 2, 0, mode));
emit_move_insn (operands[0], operand_subword (operands[1], 1, 0, mode));
--- 8464,8470 ----
if (TARGET_BACKCHAIN)
temp = force_reg (Pmode, operand_subword (operands[1], 0, 0, mode));
!
emit_move_insn (base, operand_subword (operands[1], 2, 0, mode));
emit_move_insn (operands[0], operand_subword (operands[1], 1, 0, mode));
***************
*** 8168,8174 ****
"TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")])
(define_insn "main_pool"
[(set (match_operand 0 "register_operand" "=a")
--- 8552,8559 ----
"TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")
! (set_attr "z10prop" "z10_super_A1")])
(define_insn "main_pool"
[(set (match_operand 0 "register_operand" "=a")
***************
*** 8177,8183 ****
{
gcc_unreachable ();
}
! [(set (attr "type")
(if_then_else (ne (symbol_ref "TARGET_CPU_ZARCH") (const_int 0))
(const_string "larl") (const_string "la")))])
--- 8562,8568 ----
{
gcc_unreachable ();
}
! [(set (attr "type")
(if_then_else (ne (symbol_ref "TARGET_CPU_ZARCH") (const_int 0))
(const_string "larl") (const_string "la")))])
***************
*** 8195,8201 ****
"TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")])
(define_insn "pool"
[(unspec_volatile [(match_operand 0 "const_int_operand" "n")] UNSPECV_POOL)]
--- 8580,8587 ----
"TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
"larl\t%0,%1"
[(set_attr "op_type" "RIL")
! (set_attr "type" "larl")
! (set_attr "z10prop" "z10_super_A1")])
(define_insn "pool"
[(unspec_volatile [(match_operand 0 "const_int_operand" "n")] UNSPECV_POOL)]
***************
*** 8356,8361 ****
instruction. */
return "";
!
! } [(set_attr "type" "load,larl")
! (set_attr "op_type" "RXY,RIL")])
--- 8742,8748 ----
instruction. */
return "";
! }
! [(set_attr "type" "load,larl")
! (set_attr "op_type" "RXY,RIL")
! (set_attr "z10prop" "z10_super")])
Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig 2008-08-15 09:08:50.000000000 +0200
--- gcc/config/s390/s390.c 2008-08-15 09:09:26.000000000 +0200
*************** struct processor_costs z9_109_cost =
*** 192,224 ****
static const
struct processor_costs z10_cost =
{
! COSTS_N_INSNS (4), /* M */
! COSTS_N_INSNS (2), /* MGHI */
! COSTS_N_INSNS (2), /* MH */
! COSTS_N_INSNS (2), /* MHI */
! COSTS_N_INSNS (4), /* ML */
! COSTS_N_INSNS (4), /* MR */
! COSTS_N_INSNS (5), /* MS */
! COSTS_N_INSNS (6), /* MSG */
! COSTS_N_INSNS (4), /* MSGF */
! COSTS_N_INSNS (4), /* MSGFR */
! COSTS_N_INSNS (4), /* MSGR */
! COSTS_N_INSNS (4), /* MSR */
! COSTS_N_INSNS (1), /* multiplication in DFmode */
! COSTS_N_INSNS (28), /* MXBR */
! COSTS_N_INSNS (130), /* SQXBR */
! COSTS_N_INSNS (66), /* SQDBR */
COSTS_N_INSNS (38), /* SQEBR */
! COSTS_N_INSNS (1), /* MADBR */
! COSTS_N_INSNS (1), /* MAEBR */
! COSTS_N_INSNS (60), /* DXBR */
! COSTS_N_INSNS (40), /* DDBR */
! COSTS_N_INSNS (26), /* DEBR */
! COSTS_N_INSNS (30), /* DLGR */
! COSTS_N_INSNS (23), /* DLR */
! COSTS_N_INSNS (23), /* DR */
! COSTS_N_INSNS (24), /* DSGFR */
! COSTS_N_INSNS (24), /* DSGR */
};
extern int reload_completed;
--- 192,224 ----
static const
struct processor_costs z10_cost =
{
! COSTS_N_INSNS (10), /* M */
! COSTS_N_INSNS (10), /* MGHI */
! COSTS_N_INSNS (10), /* MH */
! COSTS_N_INSNS (10), /* MHI */
! COSTS_N_INSNS (10), /* ML */
! COSTS_N_INSNS (10), /* MR */
! COSTS_N_INSNS (10), /* MS */
! COSTS_N_INSNS (10), /* MSG */
! COSTS_N_INSNS (10), /* MSGF */
! COSTS_N_INSNS (10), /* MSGFR */
! COSTS_N_INSNS (10), /* MSGR */
! COSTS_N_INSNS (10), /* MSR */
! COSTS_N_INSNS (10), /* multiplication in DFmode */
! COSTS_N_INSNS (50), /* MXBR */
! COSTS_N_INSNS (120), /* SQXBR */
! COSTS_N_INSNS (52), /* SQDBR */
COSTS_N_INSNS (38), /* SQEBR */
! COSTS_N_INSNS (10), /* MADBR */
! COSTS_N_INSNS (10), /* MAEBR */
! COSTS_N_INSNS (111), /* DXBR */
! COSTS_N_INSNS (39), /* DDBR */
! COSTS_N_INSNS (32), /* DEBR */
! COSTS_N_INSNS (160), /* DLGR */
! COSTS_N_INSNS (71), /* DLR */
! COSTS_N_INSNS (71), /* DR */
! COSTS_N_INSNS (71), /* DSGFR */
! COSTS_N_INSNS (71), /* DSGR */
};
extern int reload_completed;
*************** s390_agen_dep_p (rtx dep_insn, rtx insn)
*** 5249,5254 ****
--- 5249,5255 ----
return 0;
}
+
/* A C statement (sans semicolon) to update the integer scheduling priority
INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
reduce the priority to execute INSN later. Do not define this macro if
Index: gcc/config/s390/2084.md
===================================================================
*** gcc/config/s390/2084.md.orig 2008-08-15 09:08:50.000000000 +0200
--- gcc/config/s390/2084.md 2008-08-15 09:09:26.000000000 +0200
***************
*** 243,249 ****
(define_insn_reservation "x_itof" 7
(and (eq_attr "cpu" "z990,z9_109")
! (eq_attr "type" "itof"))
"x_e1_t*3,x-wr-fp")
(define_bypass 1 "x_fsimpdf" "x_fstoredf")
--- 243,249 ----
(define_insn_reservation "x_itof" 7
(and (eq_attr "cpu" "z990,z9_109")
! (eq_attr "type" "itoftf,itofdf,itofsf"))
"x_e1_t*3,x-wr-fp")
(define_bypass 1 "x_fsimpdf" "x_fstoredf")