Home | History | Annotate | Line # | Download | only in i386
      1 ;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
      2 ;;
      3 ;; This file is part of GCC.
      4 ;;
      5 ;; GCC is free software; you can redistribute it and/or modify
      6 ;; it under the terms of the GNU General Public License as published by
      7 ;; the Free Software Foundation; either version 3, or (at your option)
      8 ;; any later version.
      9 ;;
     10 ;; GCC is distributed in the hope that it will be useful,
     11 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13 ;; GNU General Public License for more details.
     14 ;;
     15 ;; You should have received a copy of the GNU General Public License
     16 ;; along with GCC; see the file COPYING3.  If not see
     17 ;; <http://www.gnu.org/licenses/>.
     18 ;;
     19 ;; AMD bdver3 and bdver4 Scheduling
     20 ;;
     21 ;; The bdver3 and bdver4 contains three pipelined FP units and two integer
     22 ;; units. ;; Fetching and decoding logic is different from previous fam15 
     23 ;; processors. Fetching is done every two cycles rather than every cycle 
     24 ;; and two decode units are available. The decode units therefore decode
     25 ;; four instructions in two cycles.
     26 ;;
     27 ;; The load/store queue unit is not attached to the schedulers but
     28 ;; communicates with all the execution units separately instead.
     29 ;;
     30 ;; bdver3 and bdver4 belong to fam15 processors. We use the same insn 
     31 ;; attribute that was used for bdver1 decoding scheme.
     32 
     33 (define_automaton "bdver3,bdver3_ieu,bdver3_load,bdver3_fp,bdver3_agu")
     34 
     35 (define_cpu_unit "bdver3-decode0" "bdver3")
     36 (define_cpu_unit "bdver3-decode1" "bdver3")
     37 (define_cpu_unit "bdver3-decode2" "bdver3")
     38 (define_cpu_unit "bdver3-decode3" "bdver3")
     39 
     40 ;; Double decoded instructions take two cycles whereas
     41 ;; direct instructions take one cycle.
     42 ;; Vectorpath instructions are single issue instructions.
     43 ;; So, we engage all units vector instructions.
     44 (define_reservation "bdver3-vector" "bdver3-decode0+bdver3-decode1+bdver3-decode2+bdver3-decode3")
     45 
     46 ;; Direct instructions can be issued to any of the four decoders
     47 (define_reservation "bdver3-direct" "(bdver3-decode0|bdver3-decode1|bdver3-decode2|bdver3-decode3)")
     48 
     49 ;; Double instructions take two cycles to decode.
     50 (define_reservation "bdver3-double" "(bdver3-decode0,bdver3-decode0)|
     51                (bdver3-decode1,bdver3-decode1)| (bdver3-decode2,bdver3-decode2)|
     52                (bdver3-decode3,bdver3-decode3)")
     53 
     54 (define_cpu_unit "bdver3-ieu0" "bdver3_ieu")
     55 (define_cpu_unit "bdver3-ieu1" "bdver3_ieu")
     56 (define_reservation "bdver3-ieu" "(bdver3-ieu0|bdver3-ieu1)")
     57 
     58 (define_cpu_unit "bdver3-agu0" "bdver3_agu")
     59 (define_cpu_unit "bdver3-agu1" "bdver3_agu")
     60 (define_reservation "bdver3-agu" "(bdver3-agu0|bdver3-agu1)")
     61 
     62 (define_cpu_unit "bdver3-load0" "bdver3_load")
     63 (define_cpu_unit "bdver3-load1" "bdver3_load")
     64 (define_reservation "bdver3-load" "bdver3-agu,
     65 				   (bdver3-load0|bdver3-load1),nothing")
     66 ;; 128bit SSE instructions issue two loads at once.
     67 (define_reservation "bdver3-load2" "bdver3-agu,
     68 				   (bdver3-load0+bdver3-load1),nothing")
     69 
     70 (define_reservation "bdver3-store" "(bdver3-load0 | bdver3-load1)")
     71 ;; 128bit SSE instructions issue two stores at once.
     72 (define_reservation "bdver3-store2" "(bdver3-load0+bdver3-load1)")
     73 
     74 ;; vectorpath (microcoded) instructions are single issue instructions.
     75 ;; So, they occupy all the integer units.
     76 (define_reservation "bdver3-ivector" "bdver3-ieu0+bdver3-ieu1+
     77                                       bdver3-agu0+bdver3-agu1+
     78                                       bdver3-load0+bdver3-load1")
     79 
     80 (define_reservation "bdver3-fpsched" "nothing,nothing,nothing")
     81 
     82 ;; The floating point loads.
     83 (define_reservation "bdver3-fpload" "(bdver3-fpsched + bdver3-load)")
     84 (define_reservation "bdver3-fpload2" "(bdver3-fpsched + bdver3-load2)")
     85 
     86 ;; Three FP units.
     87 (define_cpu_unit "bdver3-ffma0" "bdver3_fp")
     88 (define_cpu_unit "bdver3-ffma1" "bdver3_fp")
     89 (define_cpu_unit "bdver3-fpsto" "bdver3_fp")
     90 
     91 (define_reservation "bdver3-fvector" "bdver3-ffma0+bdver3-ffma1+
     92                                       bdver3-fpsto+bdver3-load0+
     93                                       bdver3-load1")
     94 
     95 (define_reservation "bdver3-ffma"     "(bdver3-ffma0 | bdver3-ffma1)")
     96 (define_reservation "bdver3-fcvt"     "bdver3-ffma0")
     97 (define_reservation "bdver3-fmma"     "bdver3-ffma0")
     98 (define_reservation "bdver3-fxbar"    "bdver3-ffma1")
     99 (define_reservation "bdver3-fmal"     "(bdver3-ffma0 | bdver3-fpsto)")
    100 (define_reservation "bdver3-fsto"     "bdver3-fpsto")
    101 (define_reservation "bdver3-fpshuf"    "bdver3-fpsto")
    102 
    103 ;; Jump instructions are executed in the branch unit completely transparent to us.
    104 (define_insn_reservation "bdver3_call" 2
    105 			 (and (eq_attr "cpu" "bdver3,bdver4")
    106 			      (eq_attr "type" "call,callv"))
    107 			 "bdver3-double,(bdver3-agu | bdver3-ieu),nothing")
    108 ;; PUSH mem is double path.
    109 (define_insn_reservation "bdver3_push" 1
    110 			 (and (eq_attr "cpu" "bdver3,bdver4")
    111 			      (eq_attr "type" "push"))
    112 			 "bdver3-direct,bdver3-ieu,bdver3-store")
    113 ;; POP r16/mem are double path.
    114 (define_insn_reservation "bdver3_pop" 1
    115                          (and (eq_attr "cpu" "bdver3,bdver4")
    116                               (eq_attr "type" "pop"))
    117                          "bdver3-direct,bdver3-ivector")
    118 ;; LEAVE no latency info so far, assume same with amdfam10.
    119 (define_insn_reservation "bdver3_leave" 3
    120                          (and (eq_attr "cpu" "bdver3,bdver4")
    121                               (eq_attr "type" "leave"))
    122                          "bdver3-vector,bdver3-ivector")
    123 ;; LEA executes in AGU unit with 1 cycle latency on BDVER3.
    124 (define_insn_reservation "bdver3_lea" 1
    125 			 (and (eq_attr "cpu" "bdver3,bdver4")
    126 			      (eq_attr "type" "lea"))
    127 			 "bdver3-direct,bdver3-ieu")
    128 ;; MUL executes in special multiplier unit attached to IEU1.
    129 (define_insn_reservation "bdver3_imul_DI" 6
    130 			 (and (eq_attr "cpu" "bdver3,bdver4")
    131 			      (and (eq_attr "type" "imul")
    132 				   (and (eq_attr "mode" "DI")
    133 					(eq_attr "memory" "none,unknown"))))
    134 			 "bdver3-direct,bdver3-ieu1")
    135 (define_insn_reservation "bdver3_imul" 4
    136 			 (and (eq_attr "cpu" "bdver3,bdver4")
    137 			      (and (eq_attr "type" "imul")
    138 				   (eq_attr "memory" "none,unknown")))
    139 			 "bdver3-direct,bdver3-ieu1")
    140 (define_insn_reservation "bdver3_imul_mem_DI" 10
    141 			 (and (eq_attr "cpu" "bdver3,bdver4")
    142 			      (and (eq_attr "type" "imul")
    143 				   (and (eq_attr "mode" "DI")
    144 					(eq_attr "memory" "load,both"))))
    145 			 "bdver3-direct,bdver3-load,bdver3-ieu1")
    146 (define_insn_reservation "bdver3_imul_mem" 8
    147 			 (and (eq_attr "cpu" "bdver3,bdver4")
    148 			      (and (eq_attr "type" "imul")
    149 				   (eq_attr "memory" "load,both")))
    150 			 "bdver3-direct,bdver3-load,bdver3-ieu1")
    151 
    152 (define_insn_reservation "bdver3_str" 6
    153 			 (and (eq_attr "cpu" "bdver3,bdver4")
    154 			      (and (eq_attr "type" "str")
    155 				   (eq_attr "memory" "load,both,store")))
    156 			 "bdver3-vector,bdver3-load,bdver3-ivector")
    157 
    158 ;; Integer instructions.
    159 (define_insn_reservation "bdver3_idirect" 1
    160 			 (and (eq_attr "cpu" "bdver3,bdver4")
    161 			      (and (eq_attr "bdver1_decode" "direct")
    162 				   (and (eq_attr "unit" "integer,unknown")
    163 					(eq_attr "memory" "none,unknown"))))
    164 			 "bdver3-direct,(bdver3-ieu|bdver3-agu)")
    165 (define_insn_reservation "bdver3_ivector" 2
    166 			 (and (eq_attr "cpu" "bdver3,bdver4")
    167 			      (and (eq_attr "bdver1_decode" "vector")
    168 				   (and (eq_attr "unit" "integer,unknown")
    169 					(eq_attr "memory" "none,unknown"))))
    170 			 "bdver3-vector,bdver3-ivector")
    171 (define_insn_reservation "bdver3_idirect_loadmov" 4
    172 			 (and (eq_attr "cpu" "bdver3,bdver4")
    173 			      (and (eq_attr "type" "imov")
    174 				   (eq_attr "memory" "load")))
    175 			 "bdver3-direct,bdver3-load")
    176 (define_insn_reservation "bdver3_idirect_load" 5
    177 			 (and (eq_attr "cpu" "bdver3,bdver4")
    178 			      (and (eq_attr "bdver1_decode" "direct")
    179 				   (and (eq_attr "unit" "integer,unknown")
    180 					(eq_attr "memory" "load"))))
    181 			 "bdver3-direct,bdver3-load,bdver3-ieu")
    182 (define_insn_reservation "bdver3_idirect_movstore" 5
    183 			 (and (eq_attr "cpu" "bdver3,bdver4")
    184 			      (and (eq_attr "type" "imov")
    185 				   (eq_attr "memory" "store")))
    186 			 "bdver3-direct,bdver3-ieu,bdver3-store")
    187 (define_insn_reservation "bdver3_idirect_both" 4
    188 			 (and (eq_attr "cpu" "bdver3,bdver4")
    189 			      (and (eq_attr "bdver1_decode" "direct")
    190 				   (and (eq_attr "unit" "integer,unknown")
    191 					(eq_attr "memory" "both"))))
    192 			 "bdver3-direct,bdver3-load,
    193 			  bdver3-ieu,bdver3-store,
    194 			  bdver3-store")
    195 (define_insn_reservation "bdver3_idirect_store" 4
    196 			 (and (eq_attr "cpu" "bdver3,bdver4")
    197 			      (and (eq_attr "bdver1_decode" "direct")
    198 				   (and (eq_attr "unit" "integer,unknown")
    199 					(eq_attr "memory" "store"))))
    200 			 "bdver3-direct,(bdver3-ieu+bdver3-agu),
    201 			  bdver3-store")
    202 ;; BDVER3 floating point units.
    203 (define_insn_reservation "bdver3_fldxf" 13
    204 			 (and (eq_attr "cpu" "bdver3,bdver4")
    205 			      (and (eq_attr "type" "fmov")
    206 				   (and (eq_attr "memory" "load")
    207 					(eq_attr "mode" "XF"))))
    208 			 "bdver3-vector,bdver3-fpload2,bdver3-fvector*9")
    209 (define_insn_reservation "bdver3_fld" 2
    210 			 (and (eq_attr "cpu" "bdver3,bdver4")
    211 			      (and (eq_attr "type" "fmov")
    212 				   (eq_attr "memory" "load")))
    213 			 "bdver3-direct,bdver3-fpload,bdver3-ffma")
    214 (define_insn_reservation "bdver3_fstxf" 4
    215 			 (and (eq_attr "cpu" "bdver3,bdver4")
    216 			      (and (eq_attr "type" "fmov")
    217 				   (and (eq_attr "memory" "store,both")
    218 					(eq_attr "mode" "XF"))))
    219 			 "bdver3-vector,(bdver3-fpsched+bdver3-agu),(bdver3-store2+(bdver3-fvector*6))")
    220 (define_insn_reservation "bdver3_fst" 2
    221 			 (and (eq_attr "cpu" "bdver3,bdver4")
    222 			      (and (eq_attr "type" "fmov")
    223 				   (eq_attr "memory" "store,both")))
    224 			 "bdver3-double,(bdver3-fpsched),(bdver3-fsto+bdver3-store)")
    225 (define_insn_reservation "bdver3_fist" 2
    226 			 (and (eq_attr "cpu" "bdver3,bdver4")
    227 			      (eq_attr "type" "fistp,fisttp"))
    228 			 "bdver3-double,(bdver3-fpsched),(bdver3-fsto+bdver3-store)")
    229 (define_insn_reservation "bdver3_fmov_bdver3" 2
    230 			 (and (eq_attr "cpu" "bdver3,bdver4")
    231 			      (eq_attr "type" "fmov"))
    232 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    233 (define_insn_reservation "bdver3_fadd_load" 10
    234 			 (and (eq_attr "cpu" "bdver3,bdver4")
    235 			      (and (eq_attr "type" "fop")
    236 				   (eq_attr "memory" "load")))
    237 			 "bdver3-direct,bdver3-fpload,bdver3-ffma")
    238 (define_insn_reservation "bdver3_fadd" 6
    239 			 (and (eq_attr "cpu" "bdver3,bdver4")
    240 			      (eq_attr "type" "fop"))
    241 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    242 (define_insn_reservation "bdver3_fmul_load" 6
    243 			 (and (eq_attr "cpu" "bdver3,bdver4")
    244 			      (and (eq_attr "type" "fmul")
    245 				   (eq_attr "memory" "load")))
    246 			 "bdver3-double,bdver3-fpload,bdver3-ffma")
    247 (define_insn_reservation "bdver3_fmul" 6
    248 			 (and (eq_attr "cpu" "bdver3,bdver4")
    249 			      (eq_attr "type" "fmul"))
    250 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    251 (define_insn_reservation "bdver3_fsgn" 2
    252 			 (and (eq_attr "cpu" "bdver3,bdver4")
    253 			      (eq_attr "type" "fsgn"))
    254 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    255 (define_insn_reservation "bdver3_fdiv_load" 42
    256 			 (and (eq_attr "cpu" "bdver3,bdver4")
    257 			      (and (eq_attr "type" "fdiv")
    258 				   (eq_attr "memory" "load")))
    259 			 "bdver3-direct,bdver3-fpload,bdver3-ffma")
    260 (define_insn_reservation "bdver3_fdiv" 42
    261 			 (and (eq_attr "cpu" "bdver3,bdver4")
    262 			      (eq_attr "type" "fdiv"))
    263 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    264 (define_insn_reservation "bdver3_fpspc_load" 143
    265 			 (and (eq_attr "cpu" "bdver3,bdver4")
    266 			      (and (eq_attr "type" "fpspc")
    267 				   (eq_attr "memory" "load")))
    268 			 "bdver3-vector,bdver3-fpload,bdver3-fvector")
    269 (define_insn_reservation "bdver3_fcmov_load" 17
    270 			 (and (eq_attr "cpu" "bdver3,bdver4")
    271 			      (and (eq_attr "type" "fcmov")
    272 				   (eq_attr "memory" "load")))
    273 			 "bdver3-vector,bdver3-fpload,bdver3-fvector")
    274 (define_insn_reservation "bdver3_fcmov" 15
    275 			 (and (eq_attr "cpu" "bdver3,bdver4")
    276 			      (eq_attr "type" "fcmov"))
    277 			 "bdver3-vector,bdver3-fpsched,bdver3-fvector")
    278 (define_insn_reservation "bdver3_fcomi_load" 6
    279 			 (and (eq_attr "cpu" "bdver3,bdver4")
    280 			      (and (eq_attr "type" "fcmp")
    281 				   (and (eq_attr "bdver1_decode" "double")
    282 					(eq_attr "memory" "load"))))
    283 			 "bdver3-double,bdver3-fpload,(bdver3-ffma | bdver3-fsto)")
    284 (define_insn_reservation "bdver3_fcomi" 2
    285 			 (and (eq_attr "cpu" "bdver3,bdver4")
    286 			      (and (eq_attr "bdver1_decode" "double")
    287 				   (eq_attr "type" "fcmp")))
    288 			 "bdver3-double,bdver3-fpsched,(bdver3-ffma | bdver3-fsto)")
    289 (define_insn_reservation "bdver3_fcom_load" 6
    290 			 (and (eq_attr "cpu" "bdver3,bdver4")
    291 			      (and (eq_attr "type" "fcmp")
    292 				   (eq_attr "memory" "load")))
    293 			 "bdver3-direct,bdver3-fpload,bdver3-ffma")
    294 (define_insn_reservation "bdver3_fcom" 2
    295 			 (and (eq_attr "cpu" "bdver3,bdver4")
    296 			      (eq_attr "type" "fcmp"))
    297 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    298 (define_insn_reservation "bdver3_fxch" 2
    299 			 (and (eq_attr "cpu" "bdver3,bdver4")
    300 			      (eq_attr "type" "fxch"))
    301 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    302 
    303 ;; SSE loads.
    304 (define_insn_reservation "bdver3_ssevector_avx128_unaligned_load" 4
    305 			 (and (eq_attr "cpu" "bdver3,bdver4")
    306 			      (and (eq_attr "type" "ssemov")
    307 				   (and (eq_attr "prefix" "vex")
    308 					(and (eq_attr "movu" "1")
    309 					     (and (eq_attr "mode" "V4SF,V2DF")
    310 						  (eq_attr "memory" "load"))))))
    311 			 "bdver3-direct,bdver3-fpload")
    312 (define_insn_reservation "bdver3_ssevector_avx256_unaligned_load" 5
    313 			 (and (eq_attr "cpu" "bdver3,bdver4")
    314 			      (and (eq_attr "type" "ssemov")
    315 				   (and (eq_attr "movu" "1")
    316 				        (and (eq_attr "mode" "V8SF,V4DF")
    317 				             (eq_attr "memory" "load")))))
    318 			 "bdver3-double,bdver3-fpload")
    319 (define_insn_reservation "bdver3_ssevector_sse128_unaligned_load" 4
    320 			 (and (eq_attr "cpu" "bdver3,bdver4")
    321 			      (and (eq_attr "type" "ssemov")
    322 				   (and (eq_attr "movu" "1")
    323 				        (and (eq_attr "mode" "V4SF,V2DF")
    324 				             (eq_attr "memory" "load")))))
    325 			 "bdver3-direct,bdver3-fpload,bdver3-fmal")
    326 (define_insn_reservation "bdver3_ssevector_avx128_load" 4
    327 			 (and (eq_attr "cpu" "bdver3,bdver4")
    328 			      (and (eq_attr "type" "ssemov")
    329 				   (and (eq_attr "prefix" "vex")
    330 				        (and (eq_attr "mode" "V4SF,V2DF,TI")
    331 				             (eq_attr "memory" "load")))))
    332 			 "bdver3-direct,bdver3-fpload,bdver3-fmal")
    333 (define_insn_reservation "bdver3_ssevector_avx256_load" 5
    334 			 (and (eq_attr "cpu" "bdver3,bdver4")
    335 			      (and (eq_attr "type" "ssemov")
    336 				   (and (eq_attr "mode" "V8SF,V4DF,OI")
    337 				        (eq_attr "memory" "load"))))
    338 			 "bdver3-double,bdver3-fpload,bdver3-fmal")
    339 (define_insn_reservation "bdver3_ssevector_sse128_load" 4
    340 			 (and (eq_attr "cpu" "bdver3,bdver4")
    341 			      (and (eq_attr "type" "ssemov")
    342 				   (and (eq_attr "mode" "V4SF,V2DF,TI")
    343 				        (eq_attr "memory" "load"))))
    344 			 "bdver3-direct,bdver3-fpload")
    345 (define_insn_reservation "bdver3_ssescalar_movq_load" 4
    346 			 (and (eq_attr "cpu" "bdver3,bdver4")
    347 			      (and (eq_attr "type" "ssemov")
    348 				   (and (eq_attr "mode" "DI")
    349 				        (eq_attr "memory" "load"))))
    350 			 "bdver3-direct,bdver3-fpload,bdver3-fmal")
    351 (define_insn_reservation "bdver3_ssescalar_vmovss_load" 4
    352 			 (and (eq_attr "cpu" "bdver3,bdver4")
    353 			      (and (eq_attr "type" "ssemov")
    354 				   (and (eq_attr "prefix" "vex")
    355 				        (and (eq_attr "mode" "SF")
    356 				             (eq_attr "memory" "load")))))
    357 			 "bdver3-direct,bdver3-fpload")
    358 (define_insn_reservation "bdver3_ssescalar_sse128_load" 4
    359 			 (and (eq_attr "cpu" "bdver3,bdver4")
    360 			      (and (eq_attr "type" "ssemov")
    361 				   (and (eq_attr "mode" "SF,DF")
    362 				        (eq_attr "memory" "load"))))
    363 			 "bdver3-direct,bdver3-fpload, bdver3-ffma")
    364 (define_insn_reservation "bdver3_mmxsse_load" 4
    365 			 (and (eq_attr "cpu" "bdver3,bdver4")
    366 			      (and (eq_attr "type" "mmxmov,ssemov")
    367 				   (eq_attr "memory" "load")))
    368 			 "bdver3-direct,bdver3-fpload, bdver3-fmal")
    369 
    370 ;; SSE stores.
    371 (define_insn_reservation "bdver3_sse_store_avx256" 5
    372 			 (and (eq_attr "cpu" "bdver3,bdver4")
    373 			      (and (eq_attr "type" "ssemov")
    374 				   (and (eq_attr "mode" "V8SF,V4DF,OI")
    375 					(eq_attr "memory" "store,both"))))
    376 			 "bdver3-double,bdver3-fpsched,((bdver3-fsto+bdver3-store)*2)")
    377 (define_insn_reservation "bdver3_sse_store" 4
    378 			 (and (eq_attr "cpu" "bdver3,bdver4")
    379 			      (and (eq_attr "type" "ssemov")
    380 				   (and (eq_attr "mode" "V4SF,V2DF,TI")
    381 					(eq_attr "memory" "store,both"))))
    382 			 "bdver3-direct,bdver3-fpsched,((bdver3-fsto+bdver3-store)*2)")
    383 (define_insn_reservation "bdver3_mmxsse_store_short" 4
    384 			 (and (eq_attr "cpu" "bdver3,bdver4")
    385 			      (and (eq_attr "type" "mmxmov,ssemov")
    386 				   (eq_attr "memory" "store,both")))
    387 			 "bdver3-direct,bdver3-fpsched,(bdver3-fsto+bdver3-store)")
    388 
    389 ;; Register moves.
    390 (define_insn_reservation "bdver3_ssevector_avx256" 3
    391 			 (and (eq_attr "cpu" "bdver3,bdver4")
    392 			      (and (eq_attr "type" "ssemov")
    393 				   (and (eq_attr "mode" "V8SF,V4DF,OI")
    394 					(eq_attr "memory" "none"))))
    395 			 "bdver3-double,bdver3-fpsched,bdver3-fmal")
    396 (define_insn_reservation "bdver3_movss_movsd" 2
    397 			 (and (eq_attr "cpu" "bdver3,bdver4")
    398 			      (and (eq_attr "type" "ssemov")
    399 				   (and (eq_attr "mode" "SF,DF")
    400                                         (eq_attr "memory" "none"))))
    401 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    402 (define_insn_reservation "bdver3_mmxssemov" 2
    403 			 (and (eq_attr "cpu" "bdver3,bdver4")
    404 			      (and (eq_attr "type" "mmxmov,ssemov")
    405 				   (eq_attr "memory" "none")))
    406 			 "bdver3-direct,bdver3-fpsched,bdver3-fmal")
    407 ;; SSE logs.
    408 (define_insn_reservation "bdver3_sselog_load_256" 7
    409 			 (and (eq_attr "cpu" "bdver3,bdver4")
    410 			      (and (eq_attr "type" "sselog,sselog1")
    411 				   (and (eq_attr "mode" "V8SF")
    412 				   (eq_attr "memory" "load"))))
    413 			 "bdver3-double,bdver3-fpload,bdver3-fmal")
    414 (define_insn_reservation "bdver3_sselog_256" 3
    415 			 (and (eq_attr "cpu" "bdver3,bdver4")
    416 			      (and (eq_attr "type" "sselog,sselog1")
    417                                    (eq_attr "mode" "V8SF")))
    418 			 "bdver3-double,bdver3-fpsched,bdver3-fmal")
    419 (define_insn_reservation "bdver3_sselog_load" 6
    420 			 (and (eq_attr "cpu" "bdver3,bdver4")
    421 			      (and (eq_attr "type" "sselog,sselog1")
    422 				   (eq_attr "memory" "load")))
    423 			 "bdver3-direct,bdver3-fpload,bdver3-fxbar")
    424 (define_insn_reservation "bdver3_sselog" 2
    425 			 (and (eq_attr "cpu" "bdver3,bdver4")
    426 			      (eq_attr "type" "sselog,sselog1"))
    427 			 "bdver3-direct,bdver3-fpsched,bdver3-fxbar")
    428 
    429 ;; SSE Shuffles
    430 (define_insn_reservation "bdver3_sseshuf_load_256" 7
    431                          (and (eq_attr "cpu" "bdver3,bdver4")
    432                               (and (eq_attr "type" "sseshuf,sseshuf1")
    433                                    (and (eq_attr "mode" "V8SF")
    434                                    (eq_attr "memory" "load"))))
    435                          "bdver3-double,bdver3-fpload,bdver3-fpshuf")
    436 (define_insn_reservation "bdver3_sseshuf_load" 6
    437                          (and (eq_attr "cpu" "bdver3,bdver4")
    438                               (and (eq_attr "type" "sseshuf,sseshuf1")
    439                                    (eq_attr "memory" "load")))
    440                          "bdver3-direct,bdver3-fpload,bdver3-fpshuf")
    441 
    442 (define_insn_reservation "bdver3_sseshuf_256" 3
    443                          (and (eq_attr "cpu" "bdver3,bdver4")
    444                               (and (eq_attr "type" "sseshuf")
    445                                    (eq_attr "mode" "V8SF")))
    446                          "bdver3-double,bdver3-fpsched,bdver3-fpshuf")
    447 (define_insn_reservation "bdver3_sseshuf" 2
    448                          (and (eq_attr "cpu" "bdver3,bdver4")
    449                               (eq_attr "type" "sseshuf,sseshuf1"))
    450                          "bdver3-direct,bdver3-fpsched,bdver3-fpshuf")
    451 
    452 ;; PCMP actually executes in FMAL.
    453 (define_insn_reservation "bdver3_ssecmp_load" 6
    454 			 (and (eq_attr "cpu" "bdver3,bdver4")
    455 			      (and (eq_attr "type" "ssecmp")
    456 				   (eq_attr "memory" "load")))
    457 			 "bdver3-direct,bdver3-fpload,bdver3-ffma")
    458 (define_insn_reservation "bdver3_ssecmp" 2
    459 			 (and (eq_attr "cpu" "bdver3,bdver4")
    460 			      (eq_attr "type" "ssecmp"))
    461 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    462 (define_insn_reservation "bdver3_ssecomi_load" 6
    463 			 (and (eq_attr "cpu" "bdver3,bdver4")
    464 			      (and (eq_attr "type" "ssecomi")
    465 				   (eq_attr "memory" "load")))
    466 			 "bdver3-double,bdver3-fpload,(bdver3-ffma | bdver3-fsto)")
    467 (define_insn_reservation "bdver3_ssecomi" 2
    468 			 (and (eq_attr "cpu" "bdver3,bdver4")
    469 			      (eq_attr "type" "ssecomi"))
    470 			 "bdver3-double,bdver3-fpsched,(bdver3-ffma | bdver3-fsto)")
    471 
    472 ;; Conversions behaves very irregularly and the scheduling is critical here.
    473 ;; Take each instruction separately.
    474 
    475 ;; 256 bit conversion.
    476 (define_insn_reservation "bdver3_vcvtX2Y_avx256_load" 8
    477 			 (and (eq_attr "cpu" "bdver3,bdver4")
    478 			      (and (eq_attr "type" "ssecvt")
    479 				   (and (eq_attr "memory" "load")
    480 					(ior (ior (match_operand:V4DF 0 "register_operand")
    481 					          (ior (match_operand:V8SF 0 "register_operand")
    482 						       (match_operand:V8SI 0 "register_operand")))
    483 					     (ior (match_operand:V4DF 1 "nonimmediate_operand")
    484 						  (ior (match_operand:V8SF 1 "nonimmediate_operand")
    485 						       (match_operand:V8SI 1 "nonimmediate_operand")))))))
    486 			 "bdver3-vector,bdver3-fpload,bdver3-fvector")
    487 (define_insn_reservation "bdver3_vcvtX2Y_avx256" 4
    488 			 (and (eq_attr "cpu" "bdver3,bdver4")
    489 			      (and (eq_attr "type" "ssecvt")
    490 				   (and (eq_attr "memory" "none")
    491 					(ior (ior (match_operand:V4DF 0 "register_operand")
    492 					          (ior (match_operand:V8SF 0 "register_operand")
    493 						       (match_operand:V8SI 0 "register_operand")))
    494 					     (ior (match_operand:V4DF 1 "nonimmediate_operand")
    495 						  (ior (match_operand:V8SF 1 "nonimmediate_operand")
    496 						       (match_operand:V8SI 1 "nonimmediate_operand")))))))
    497 			 "bdver3-vector,bdver3-fpsched,bdver3-fvector")
    498 ;; CVTSS2SD, CVTSD2SS.
    499 (define_insn_reservation "bdver3_ssecvt_cvtss2sd_load" 8
    500 			 (and (eq_attr "cpu" "bdver3,bdver4")
    501 			      (and (eq_attr "type" "ssecvt")
    502 				   (and (eq_attr "mode" "SF,DF")
    503 					(eq_attr "memory" "load"))))
    504 			 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
    505 (define_insn_reservation "bdver3_ssecvt_cvtss2sd" 4
    506 			 (and (eq_attr "cpu" "bdver3,bdver4")
    507 			      (and (eq_attr "type" "ssecvt")
    508 				   (and (eq_attr "mode" "SF,DF")
    509 					(eq_attr "memory" "none"))))
    510 			 "bdver3-direct,bdver3-fpsched,bdver3-fcvt")
    511 ;; CVTSI2SD, CVTSI2SS, CVTSI2SDQ, CVTSI2SSQ.
    512 (define_insn_reservation "bdver3_sseicvt_cvtsi2sd_load" 8
    513 			 (and (eq_attr "cpu" "bdver3,bdver4")
    514 			      (and (eq_attr "type" "sseicvt")
    515 				   (and (eq_attr "mode" "SF,DF")
    516 					(eq_attr "memory" "load"))))
    517 			 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
    518 (define_insn_reservation "bdver3_sseicvt_cvtsi2sd" 4
    519 			 (and (eq_attr "cpu" "bdver3,bdver4")
    520 			      (and (eq_attr "type" "sseicvt")
    521 				   (and (eq_attr "mode" "SF,DF")
    522 					(eq_attr "memory" "none"))))
    523 			 "bdver3-double,bdver3-fpsched,(nothing | bdver3-fcvt)")
    524 ;; CVTPD2PS.
    525 (define_insn_reservation "bdver3_ssecvt_cvtpd2ps_load" 8
    526 			 (and (eq_attr "cpu" "bdver3,bdver4")
    527 			      (and (eq_attr "type" "ssecvt")
    528 				   (and (eq_attr "memory" "load")
    529                                         (and (match_operand:V4SF 0 "register_operand")
    530 					     (match_operand:V2DF 1 "nonimmediate_operand")))))
    531 			 "bdver3-double,bdver3-fpload,(bdver3-fxbar | bdver3-fcvt)")
    532 (define_insn_reservation "bdver3_ssecvt_cvtpd2ps" 4
    533 			 (and (eq_attr "cpu" "bdver3,bdver4")
    534 			      (and (eq_attr "type" "ssecvt")
    535 				   (and (eq_attr "memory" "none")
    536                                         (and (match_operand:V4SF 0 "register_operand")
    537 					     (match_operand:V2DF 1 "nonimmediate_operand")))))
    538 			 "bdver3-double,bdver3-fpsched,(bdver3-fxbar | bdver3-fcvt)")
    539 ;; CVTPI2PS, CVTDQ2PS.
    540 (define_insn_reservation "bdver3_ssecvt_cvtdq2ps_load" 8
    541 			 (and (eq_attr "cpu" "bdver3,bdver4")
    542 			      (and (eq_attr "type" "ssecvt")
    543 				   (and (eq_attr "memory" "load")
    544                                         (and (match_operand:V4SF 0 "register_operand")
    545 					     (ior (match_operand:V2SI 1 "nonimmediate_operand")
    546 					          (match_operand:V4SI 1 "nonimmediate_operand"))))))
    547 			 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
    548 (define_insn_reservation "bdver3_ssecvt_cvtdq2ps" 4
    549 			 (and (eq_attr "cpu" "bdver3,bdver4")
    550 			      (and (eq_attr "type" "ssecvt")
    551 				   (and (eq_attr "memory" "none")
    552                                         (and (match_operand:V4SF 0 "register_operand")
    553 					     (ior (match_operand:V2SI 1 "nonimmediate_operand")
    554 					          (match_operand:V4SI 1 "nonimmediate_operand"))))))
    555 			 "bdver3-direct,bdver3-fpsched,bdver3-fcvt")
    556 ;; CVTDQ2PD.
    557 (define_insn_reservation "bdver3_ssecvt_cvtdq2pd_load" 8
    558 			 (and (eq_attr "cpu" "bdver3,bdver4")
    559 			      (and (eq_attr "type" "ssecvt")
    560 				   (and (eq_attr "memory" "load")
    561                                         (and (match_operand:V2DF 0 "register_operand")
    562 					     (match_operand:V4SI 1 "nonimmediate_operand")))))
    563 			 "bdver3-double,bdver3-fpload,(bdver3-fxbar | bdver3-fcvt)")
    564 (define_insn_reservation "bdver3_ssecvt_cvtdq2pd" 4
    565 			 (and (eq_attr "cpu" "bdver3,bdver4")
    566 			      (and (eq_attr "type" "ssecvt")
    567 				   (and (eq_attr "memory" "none")
    568                                         (and (match_operand:V2DF 0 "register_operand")
    569 					     (match_operand:V4SI 1 "nonimmediate_operand")))))
    570 			 "bdver3-double,bdver3-fpsched,(bdver3-fxbar | bdver3-fcvt)")
    571 ;; CVTPS2PD, CVTPI2PD.
    572 (define_insn_reservation "bdver3_ssecvt_cvtps2pd_load" 6
    573 			 (and (eq_attr "cpu" "bdver3,bdver4")
    574 			      (and (eq_attr "type" "ssecvt")
    575 				   (and (eq_attr "memory" "load")
    576                                         (and (match_operand:V2DF 0 "register_operand")
    577 					     (ior (match_operand:V2SI 1 "nonimmediate_operand")
    578 					          (match_operand:V4SF 1 "nonimmediate_operand"))))))
    579 			 "bdver3-double,bdver3-fpload,(bdver3-fxbar | bdver3-fcvt)")
    580 (define_insn_reservation "bdver3_ssecvt_cvtps2pd" 2
    581 			 (and (eq_attr "cpu" "bdver3,bdver4")
    582 			      (and (eq_attr "type" "ssecvt")
    583 				   (and (eq_attr "memory" "load")
    584                                         (and (match_operand:V2DF 0 "register_operand")
    585 					     (ior (match_operand:V2SI 1 "nonimmediate_operand")
    586 					          (match_operand:V4SF 1 "nonimmediate_operand"))))))
    587 			 "bdver3-double,bdver3-fpsched,(bdver3-fxbar | bdver3-fcvt)")
    588 ;; CVTSD2SI, CVTSD2SIQ, CVTSS2SI, CVTSS2SIQ, CVTTSD2SI, CVTTSD2SIQ, CVTTSS2SI, CVTTSS2SIQ.
    589 (define_insn_reservation "bdver3_ssecvt_cvtsX2si_load" 8
    590 			 (and (eq_attr "cpu" "bdver3,bdver4")
    591 			      (and (eq_attr "type" "sseicvt")
    592 				   (and (eq_attr "mode" "SI,DI")
    593 					(eq_attr "memory" "load"))))
    594 			 "bdver3-double,bdver3-fpload,(bdver3-fcvt | bdver3-fsto)")
    595 (define_insn_reservation "bdver3_ssecvt_cvtsX2si" 4
    596 			 (and (eq_attr "cpu" "bdver3,bdver4")
    597 			      (and (eq_attr "type" "sseicvt")
    598 				   (and (eq_attr "mode" "SI,DI")
    599 					(eq_attr "memory" "none"))))
    600 			 "bdver3-double,bdver3-fpsched,(bdver3-fcvt | bdver3-fsto)")
    601 ;; CVTPD2PI, CVTTPD2PI.
    602 (define_insn_reservation "bdver3_ssecvt_cvtpd2pi_load" 8
    603 			 (and (eq_attr "cpu" "bdver3,bdver4")
    604 			      (and (eq_attr "type" "ssecvt")
    605 				   (and (eq_attr "memory" "load")
    606 				        (and (match_operand:V2DF 1 "nonimmediate_operand")
    607 					     (match_operand:V2SI 0 "register_operand")))))
    608 			 "bdver3-double,bdver3-fpload,(bdver3-fcvt | bdver3-fxbar)")
    609 (define_insn_reservation "bdver3_ssecvt_cvtpd2pi" 4
    610 			 (and (eq_attr "cpu" "bdver3,bdver4")
    611 			      (and (eq_attr "type" "ssecvt")
    612 				   (and (eq_attr "memory" "none")
    613 				        (and (match_operand:V2DF 1 "nonimmediate_operand")
    614 					     (match_operand:V2SI 0 "register_operand")))))
    615 			 "bdver3-double,bdver3-fpsched,(bdver3-fcvt | bdver3-fxbar)")
    616 ;; CVTPD2DQ, CVTTPD2DQ.
    617 (define_insn_reservation "bdver3_ssecvt_cvtpd2dq_load" 6
    618 			 (and (eq_attr "cpu" "bdver3,bdver4")
    619 			      (and (eq_attr "type" "ssecvt")
    620 				   (and (eq_attr "memory" "load")
    621 				        (and (match_operand:V2DF 1 "nonimmediate_operand")
    622 					     (match_operand:V4SI 0 "register_operand")))))
    623 			 "bdver3-double,bdver3-fpload,(bdver3-fcvt | bdver3-fxbar)")
    624 (define_insn_reservation "bdver3_ssecvt_cvtpd2dq" 2
    625 			 (and (eq_attr "cpu" "bdver3,bdver4")
    626 			      (and (eq_attr "type" "ssecvt")
    627 				   (and (eq_attr "memory" "none")
    628 				        (and (match_operand:V2DF 1 "nonimmediate_operand")
    629 					     (match_operand:V4SI 0 "register_operand")))))
    630 			 "bdver3-double,bdver3-fpsched,(bdver3-fcvt | bdver3-fxbar)")
    631 ;; CVTPS2PI, CVTTPS2PI, CVTPS2DQ, CVTTPS2DQ.
    632 (define_insn_reservation "bdver3_ssecvt_cvtps2pi_load" 8
    633 			 (and (eq_attr "cpu" "bdver3,bdver4")
    634 			      (and (eq_attr "type" "ssecvt")
    635                                    (and (eq_attr "memory" "load")
    636 				        (and (match_operand:V4SF 1 "nonimmediate_operand")
    637 				             (ior (match_operand: V2SI 0 "register_operand")
    638 						  (match_operand: V4SI 0 "register_operand"))))))
    639 			 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
    640 (define_insn_reservation "bdver3_ssecvt_cvtps2pi" 4
    641 			 (and (eq_attr "cpu" "bdver3,bdver4")
    642 			      (and (eq_attr "type" "ssecvt")
    643 				   (and (eq_attr "memory" "none")
    644 				        (and (match_operand:V4SF 1 "nonimmediate_operand")
    645 				             (ior (match_operand: V2SI 0 "register_operand")
    646 						  (match_operand: V4SI 0 "register_operand"))))))
    647 			 "bdver3-direct,bdver3-fpsched,bdver3-fcvt")
    648 
    649 ;; SSE MUL, ADD, and MULADD.
    650 (define_insn_reservation "bdver3_ssemuladd_load_256" 11
    651 			 (and (eq_attr "cpu" "bdver3,bdver4")
    652 			      (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
    653 				   (and (eq_attr "mode" "V8SF,V4DF")
    654 					(eq_attr "memory" "load"))))
    655 			 "bdver3-double,bdver3-fpload,bdver3-ffma")
    656 (define_insn_reservation "bdver3_ssemuladd_256" 7
    657 			 (and (eq_attr "cpu" "bdver3,bdver4")
    658 			      (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
    659 				   (and (eq_attr "mode" "V8SF,V4DF")
    660 					(eq_attr "memory" "none"))))
    661 			 "bdver3-double,bdver3-fpsched,bdver3-ffma")
    662 (define_insn_reservation "bdver3_ssemuladd_load" 10
    663 			 (and (eq_attr "cpu" "bdver3,bdver4")
    664 			      (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
    665 				   (eq_attr "memory" "load")))
    666 			 "bdver3-direct,bdver3-fpload,bdver3-ffma")
    667 (define_insn_reservation "bdver3_ssemuladd" 6
    668 			 (and (eq_attr "cpu" "bdver3,bdver4")
    669 			      (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
    670 				   (eq_attr "memory" "none")))
    671 			 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
    672 (define_insn_reservation "bdver3_sseimul_load" 8
    673 			 (and (eq_attr "cpu" "bdver3,bdver4")
    674 			      (and (eq_attr "type" "sseimul")
    675 				   (eq_attr "memory" "load")))
    676 			 "bdver3-direct,bdver3-fpload,bdver3-fmma")
    677 (define_insn_reservation "bdver3_sseimul" 4
    678 			 (and (eq_attr "cpu" "bdver3,bdver4")
    679 			      (and (eq_attr "type" "sseimul")
    680 				   (eq_attr "memory" "none")))
    681 			 "bdver3-direct,bdver3-fpsched,bdver3-fmma")
    682 (define_insn_reservation "bdver3_sseiadd_load" 6
    683 			 (and (eq_attr "cpu" "bdver3,bdver4")
    684 			      (and (eq_attr "type" "sseiadd")
    685 				   (eq_attr "memory" "load")))
    686 			 "bdver3-direct,bdver3-fpload,bdver3-fmal")
    687 (define_insn_reservation "bdver3_sseiadd" 2
    688 			 (and (eq_attr "cpu" "bdver3,bdver4")
    689 			      (and (eq_attr "type" "sseiadd")
    690 				   (eq_attr "memory" "none")))
    691 			 "bdver3-direct,bdver3-fpsched,bdver3-fmal")
    692 
    693 ;; SSE DIV: no throughput information (assume same as amdfam10).
    694 (define_insn_reservation "bdver3_ssediv_double_load_256" 27
    695 			 (and (eq_attr "cpu" "bdver3,bdver4")
    696 			      (and (eq_attr "type" "ssediv")
    697 				   (and (eq_attr "mode" "V4DF")
    698 				        (eq_attr "memory" "load"))))
    699 			 "bdver3-double,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    700 (define_insn_reservation "bdver3_ssediv_double_256" 27
    701 			 (and (eq_attr "cpu" "bdver3,bdver4")
    702 			      (and (eq_attr "type" "ssediv")
    703 				   (and (eq_attr "mode" "V4DF")
    704 				        (eq_attr "memory" "none"))))
    705 			 "bdver3-double,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    706 (define_insn_reservation "bdver3_ssediv_single_load_256" 27
    707 			 (and (eq_attr "cpu" "bdver3,bdver4")
    708 			      (and (eq_attr "type" "ssediv")
    709 				   (and (eq_attr "mode" "V8SF")
    710 				        (eq_attr "memory" "load"))))
    711 			 "bdver3-double,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    712 (define_insn_reservation "bdver3_ssediv_single_256" 24
    713 			 (and (eq_attr "cpu" "bdver3,bdver4")
    714 			      (and (eq_attr "type" "ssediv")
    715 				   (and (eq_attr "mode" "V8SF")
    716 				        (eq_attr "memory" "none"))))
    717 			 "bdver3-double,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    718 (define_insn_reservation "bdver3_ssediv_double_load" 27
    719 			 (and (eq_attr "cpu" "bdver3,bdver4")
    720 			      (and (eq_attr "type" "ssediv")
    721 				   (and (eq_attr "mode" "DF,V2DF")
    722 					(eq_attr "memory" "load"))))
    723 			 "bdver3-direct,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    724 (define_insn_reservation "bdver3_ssediv_double" 27
    725 			 (and (eq_attr "cpu" "bdver3,bdver4")
    726 			      (and (eq_attr "type" "ssediv")
    727 				   (and (eq_attr "mode" "DF,V2DF")
    728 					(eq_attr "memory" "none"))))
    729 			 "bdver3-direct,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    730 (define_insn_reservation "bdver3_ssediv_single_load" 27 
    731 			 (and (eq_attr "cpu" "bdver3,bdver4")
    732 			      (and (eq_attr "type" "ssediv")
    733 				   (and (eq_attr "mode" "SF,V4SF")
    734 					(eq_attr "memory" "load"))))
    735 			 "bdver3-direct,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    736 (define_insn_reservation "bdver3_ssediv_single" 24
    737 			 (and (eq_attr "cpu" "bdver3,bdver4")
    738 			      (and (eq_attr "type" "ssediv")
    739 				   (and (eq_attr "mode" "SF,V4SF")
    740 					(eq_attr "memory" "none"))))
    741 			 "bdver3-direct,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
    742 
    743 (define_insn_reservation "bdver3_sseins" 3
    744                          (and (eq_attr "cpu" "bdver3,bdver4")
    745                               (and (eq_attr "type" "sseins")
    746                                    (eq_attr "mode" "TI")))
    747                          "bdver3-direct,bdver3-fpsched,bdver3-fxbar")
    748 
    749