Home | History | Annotate | Line # | Download | only in i386
      1 ;; Goldmont(GLM) Scheduling
      2 ;; Copyright (C) 2018-2022 Free Software Foundation, Inc.
      3 ;;
      4 ;; This file is part of GCC.
      5 ;;
      6 ;; GCC is free software; you can redistribute it and/or modify
      7 ;; it under the terms of the GNU General Public License as published by
      8 ;; the Free Software Foundation; either version 3, or (at your option)
      9 ;; any later version.
     10 ;;
     11 ;; GCC is distributed in the hope that it will be useful,
     12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 ;; GNU General Public License for more details.
     15 ;;
     16 ;; You should have received a copy of the GNU General Public License
     17 ;; along with GCC; see the file COPYING3.  If not see
     18 ;; <http://www.gnu.org/licenses/>.
     19 ;;
     20 ;; Goldmont has 3 out-of-order IEC, 2 out-of--order FEC and out-of-order MEC.
     21 
     22 
     23 (define_automaton "glm")
     24 
     25 ;;  EU: Execution Unit
     26 ;;  Goldmont has 3 clusters - IEC, FPC, MEC
     27 
     28 ;;  IEC has three execution ports - IEC-0, IEC-1 and IEC-2.
     29 ;;  FPC has two execution ports - FPC-0 and FPC-1.
     30 ;;  MEC has two execution ports - MEC-0 (load) and MEC-1 (store0.
     31 (define_cpu_unit "glm-iec-0,glm-iec-1,glm-iec-2" "glm")
     32 (define_cpu_unit "glm-fec-0,glm-fec-1,glm-load,glm-store" "glm")
     33 
     34 ;; Some EUs have duplicated copied and can be accessed via either ports 0, 1 or 2.
     35 (define_reservation "glm-iec-any" "(glm-iec-0 | glm-iec-1 | glm-iec-2)")
     36 (define_reservation "glm-iec-any-load" "(glm-iec-0|glm-iec-1|glm-iec-2)+glm-load")
     37 (define_reservation "glm-iec-any-store" "(glm-iec-0|glm-iec-1|glm-iec-2)+glm-store")
     38 (define_reservation "glm-iec-any-both" "(glm-iec-0 | glm-iec-1 | glm-iec-2) + glm-load + glm-store")
     39 (define_reservation "glm-fec-all" "(glm-fec-0 + glm-fec-1)")
     40 (define_reservation "glm-all" "(glm-iec-0+glm-iec-1+glm-iec-2)+(glm-fec-0+glm-fec-1)+(glm-load+glm-store)")
     41 (define_reservation "glm-int-0" "glm-iec-0")
     42 (define_reservation "glm-int-0-load" "glm-iec-0 + glm-load")
     43 (define_reservation "glm-int-0-both" "glm-iec-0 + glm-load + glm-store")
     44 (define_reservation "glm-int-1" "glm-iec-1")
     45 (define_reservation "glm-int-1-mem" "glm-iec-1 + glm-load")
     46 (define_reservation "glm-int-2" "glm-iec-2")
     47 (define_reservation "glm-int-2-mem" "glm-iec-2 + glm-load")
     48 (define_reservation "glm-fp-0" "glm-fec-0")
     49 (define_reservation "glm-fec-any" "(glm-fec-0 | glm-fec-1)")
     50 
     51 ;;; fmul insn can have 4 or 5 cycles latency for scalar and vector types.
     52 (define_reservation "glm-fmul-4c" "glm-fec-0, nothing*3")
     53 (define_reservation "glm-fmul-4c-mem" "glm-fec-0+glm-load, nothing*3")
     54 (define_reservation "glm-fmul-5c" "glm-fec-0, nothing*4")
     55 
     56 ;;; fadd has 3 cycles latency.
     57 (define_reservation "glm-fadd-3c" "glm-fec-1, nothing*2")
     58 (define_reservation "glm-fadd-3c-mem" "glm-fec-1+glm-load, nothing*2")
     59 
     60 ;;; imul insn has 3 cycles latency for SI operands
     61 (define_reservation "glm-imul-32" "glm-iec-1, nothing*2")
     62 (define_reservation "glm-imul-mem-32"
     63 		    "(glm-iec-1+glm-load), nothing*2")
     64 ;;; imul has 5 cycles latency for DI operands with 1/2 tput
     65 (define_reservation "glm-imul-64"
     66 		    "glm-iec-1, glm-iec-1, nothing*3")
     67 (define_reservation "glm-imul-mem-64"
     68 		    "glm-iec-1+glm-load, glm-iec-1, nothing*3")
     69 
     70 
     71 (define_insn_reservation  "glm_other" 9
     72   (and (eq_attr "cpu" "glm")
     73        (and (eq_attr "type" "other")
     74 	    (eq_attr "atom_unit" "!jeu")))
     75   "glm-all*9")
     76 
     77 ;; return has type "other" with atom_unit "jeu"
     78 (define_insn_reservation  "glm_other_2" 1
     79   (and (eq_attr "cpu" "glm")
     80        (and (eq_attr "type" "other")
     81 	    (eq_attr "atom_unit" "jeu")))
     82   "glm-all")
     83 
     84 (define_insn_reservation  "glm_multi" 9
     85   (and (eq_attr "cpu" "glm")
     86        (eq_attr "type" "multi"))
     87   "glm-all*9")
     88 
     89 ;; Normal alu insns without carry
     90 (define_insn_reservation  "glm_alu" 1
     91   (and (eq_attr "cpu" "glm")
     92        (and (eq_attr "type" "alu")
     93 	    (and (eq_attr "memory" "none")
     94 		 (eq_attr "use_carry" "0"))))
     95   "glm-iec-any")
     96 
     97 ;; Normal alu insns without carry, but use MEC.
     98 (define_insn_reservation  "glm_alu_load" 1
     99   (and (eq_attr "cpu" "glm")
    100        (and (eq_attr "type" "alu")
    101 	    (and (eq_attr "memory" "load")
    102 		 (eq_attr "use_carry" "0"))))
    103   "glm-iec-any-load")
    104 
    105 (define_insn_reservation  "glm_alu_mem" 1
    106   (and (eq_attr "cpu" "glm")
    107        (and (eq_attr "type" "alu")
    108 	    (and (eq_attr "memory" "both")
    109 		 (eq_attr "use_carry" "0"))))
    110   "glm-iec-any-both")
    111 
    112 
    113 ;; Alu insn consuming CF, such as add/sbb
    114 (define_insn_reservation  "glm_alu_carry" 2
    115   (and (eq_attr "cpu" "glm")
    116        (and (eq_attr "type" "alu")
    117 	    (and (eq_attr "memory" "none")
    118 		 (eq_attr "use_carry" "1"))))
    119   "glm-int-2, nothing")
    120 
    121 ;; Alu insn consuming CF, such as add/sbb
    122 (define_insn_reservation  "glm_alu_carry_mem" 2
    123   (and (eq_attr "cpu" "glm")
    124        (and (eq_attr "type" "alu")
    125 	    (and (eq_attr "memory" "!none")
    126 		(eq_attr "use_carry" "1"))))
    127   "glm-int-2-mem, nothing")
    128 
    129 (define_insn_reservation  "glm_alu1" 1
    130   (and (eq_attr "cpu" "glm")
    131        (and (eq_attr "type" "alu1")
    132 	    (eq_attr "memory" "none") (eq_attr "prefix_0f" "0")))
    133   "glm-int-1")
    134 
    135 ;; bsf and bsf insn
    136 (define_insn_reservation  "glm_alu1_1" 10
    137   (and (eq_attr "cpu" "glm")
    138        (and (eq_attr "type" "alu1")
    139 	    (eq_attr "memory" "none") (eq_attr "prefix_0f" "1")))
    140   "glm-int-1*8,nothing*2")
    141 
    142 (define_insn_reservation  "glm_alu1_mem" 1
    143   (and (eq_attr "cpu" "glm")
    144        (and (eq_attr "type" "alu1")
    145 	    (eq_attr "memory" "!none")))
    146   "glm-int-1-mem")
    147 
    148 (define_insn_reservation  "glm_negnot" 1
    149   (and (eq_attr "cpu" "glm")
    150        (and (eq_attr "type" "negnot")
    151 	    (eq_attr "memory" "none")))
    152   "glm-iec-any")
    153 
    154 (define_insn_reservation  "glm_negnot_mem" 1
    155   (and (eq_attr "cpu" "glm")
    156        (and (eq_attr "type" "negnot")
    157 	    (eq_attr "memory" "!none")))
    158   "glm-iec-any-both")
    159 
    160 (define_insn_reservation  "glm_imov" 1
    161   (and (eq_attr "cpu" "glm")
    162        (and (eq_attr "type" "imov")
    163 	    (eq_attr "memory" "none")))
    164   "glm-iec-any")
    165 
    166 (define_insn_reservation  "glm_imov_load" 2
    167   (and (eq_attr "cpu" "glm")
    168        (and (eq_attr "type" "imov")
    169 	    (eq_attr "memory" "load")))
    170   "glm-iec-any-load,nothing")
    171 
    172 (define_insn_reservation  "glm_imov_store" 1
    173   (and (eq_attr "cpu" "glm")
    174        (and (eq_attr "type" "imov")
    175 	    (eq_attr "memory" "store")))
    176   "glm-iec-any-store")
    177 
    178 ;; 16<-16, 32<-32
    179 (define_insn_reservation  "glm_imovx" 1
    180   (and (eq_attr "cpu" "glm")
    181        (and (eq_attr "type" "imovx")
    182 	    (and (eq_attr "memory" "none")
    183 		 (ior (and (match_operand:HI 0 "register_operand")
    184 			   (match_operand:HI 1 "general_operand"))
    185 		      (and (match_operand:SI 0 "register_operand")
    186 			   (match_operand:SI 1 "general_operand"))))))
    187   "glm-iec-any")
    188 
    189 ;; 16<-16, 32<-32, mem
    190 (define_insn_reservation  "glm_imovx_mem" 1
    191   (and (eq_attr "cpu" "glm")
    192        (and (eq_attr "type" "imovx")
    193 	    (and (eq_attr "memory" "!none")
    194 		 (ior (and (match_operand:HI 0 "register_operand")
    195 			   (match_operand:HI 1 "general_operand"))
    196 		      (and (match_operand:SI 0 "register_operand")
    197 			   (match_operand:SI 1 "general_operand"))))))
    198   "glm-iec-any-load")
    199 
    200 
    201 ;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8
    202 (define_insn_reservation  "glm_imovx_2" 1
    203   (and (eq_attr "cpu" "glm")
    204        (and (eq_attr "type" "imovx")
    205 	    (and (eq_attr "memory" "none")
    206 		 (ior (match_operand:QI 0 "register_operand")
    207 		      (ior (and (match_operand:SI 0 "register_operand")
    208 				(not (match_operand:SI 1 "general_operand")))
    209 			   (match_operand:DI 0 "register_operand"))))))
    210   "glm-iec-any")
    211 
    212 ;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8, mem
    213 (define_insn_reservation  "glm_imovx_2_load" 2
    214   (and (eq_attr "cpu" "glm")
    215        (and (eq_attr "type" "imovx")
    216 	    (and (eq_attr "memory" "load")
    217 		 (ior (match_operand:QI 0 "register_operand")
    218 		      (ior (and (match_operand:SI 0 "register_operand")
    219 				(not (match_operand:SI 1 "general_operand")))
    220 			   (match_operand:DI 0 "register_operand"))))))
    221   "glm-iec-any-load,nothing")
    222 
    223 (define_insn_reservation  "glm_imovx_2_mem" 1
    224   (and (eq_attr "cpu" "glm")
    225        (and (eq_attr "type" "imovx")
    226 	    (and (eq_attr "memory" "!none")
    227 		 (ior (match_operand:QI 0 "register_operand")
    228 		      (ior (and (match_operand:SI 0 "register_operand")
    229 				(not (match_operand:SI 1 "general_operand")))
    230 			   (match_operand:DI 0 "register_operand"))))))
    231   "glm-iec-any-both")
    232 
    233 
    234 ;; 16<-8
    235 (define_insn_reservation  "glm_imovx_3" 3
    236   (and (eq_attr "cpu" "glm")
    237        (and (eq_attr "type" "imovx")
    238 	    (and (match_operand:HI 0 "register_operand")
    239 		 (match_operand:QI 1 "general_operand"))))
    240   "glm-int-0, nothing*2")
    241 
    242 (define_insn_reservation  "glm_lea" 1
    243   (and (eq_attr "cpu" "glm")
    244        (and (eq_attr "type" "lea")
    245 	    (eq_attr "mode" "!HI")))
    246   "glm-iec-any")
    247 
    248 ;; lea 16bit address is complex insn
    249 (define_insn_reservation  "glm_lea_2" 2
    250   (and (eq_attr "cpu" "glm")
    251        (and (eq_attr "type" "lea")
    252 	    (eq_attr "mode" "HI")))
    253   "glm-all*2")
    254 
    255 (define_insn_reservation  "glm_incdec" 1
    256   (and (eq_attr "cpu" "glm")
    257        (and (eq_attr "type" "incdec")
    258 	    (eq_attr "memory" "none")))
    259   "glm-int-0")
    260 
    261 (define_insn_reservation  "glm_incdec_mem" 3
    262   (and (eq_attr "cpu" "glm")
    263        (and (eq_attr "type" "incdec")
    264 	    (eq_attr "memory" "!none")))
    265   "glm-int-0-both, nothing*2")
    266 
    267 ;; simple shift instruction use SHIFT eu, none memory
    268 (define_insn_reservation  "glm_ishift" 1
    269   (and (eq_attr "cpu" "glm")
    270        (and (eq_attr "type" "ishift")
    271 	    (and (eq_attr "memory" "none") (eq_attr "prefix_0f" "0"))))
    272   "glm-int-0")
    273 
    274 ;; simple shift instruction use SHIFT eu, memory
    275 (define_insn_reservation  "glm_ishift_mem" 2
    276   (and (eq_attr "cpu" "glm")
    277        (and (eq_attr "type" "ishift")
    278 	    (and (eq_attr "memory" "!none") (eq_attr "prefix_0f" "0"))))
    279   "glm-int-0-both,nothing")
    280 
    281 ;; DF shift (prefixed with 0f) is complex insn with latency of 4 cycles
    282 (define_insn_reservation  "glm_ishift_3" 4
    283   (and (eq_attr "cpu" "glm")
    284        (and (eq_attr "type" "ishift")
    285 	    (eq_attr "prefix_0f" "1")))
    286   "glm-all*4")
    287 
    288 (define_insn_reservation  "glm_ishift1" 1
    289   (and (eq_attr "cpu" "glm")
    290        (and (eq_attr "type" "ishift1")
    291 	    (eq_attr "memory" "none")))
    292   "glm-int-0")
    293 
    294 (define_insn_reservation  "glm_ishift1_mem" 2
    295   (and (eq_attr "cpu" "glm")
    296        (and (eq_attr "type" "ishift1")
    297 	    (eq_attr "memory" "!none")))
    298   "glm-int-0-both,nothing")
    299 
    300 (define_insn_reservation  "glm_rotate" 1
    301   (and (eq_attr "cpu" "glm")
    302        (and (eq_attr "type" "rotate")
    303 	    (eq_attr "memory" "none")))
    304   "glm-int-0")
    305 
    306 (define_insn_reservation  "glm_rotate_mem" 2
    307   (and (eq_attr "cpu" "glm")
    308        (and (eq_attr "type" "rotate")
    309 	    (eq_attr "memory" "!none")))
    310   "glm-int-0-both,nothing")
    311 
    312 (define_insn_reservation  "glm_imul" 3
    313   (and (eq_attr "cpu" "glm")
    314        (and (eq_attr "type" "imul")
    315 	    (and (eq_attr "memory" "none") (eq_attr "mode" "SI"))))
    316   "glm-imul-32")
    317 
    318 (define_insn_reservation  "glm_imul_load" 3
    319   (and (eq_attr "cpu" "glm")
    320        (and (eq_attr "type" "imul")
    321 	    (and (eq_attr "memory" "!none") (eq_attr "mode" "SI"))))
    322   "glm-imul-mem-32")
    323 
    324 
    325 ;; latency set to 5 as common 64x64 imul with 1/2 tput
    326 (define_insn_reservation  "glm_imul64" 5
    327   (and (eq_attr "cpu" "glm")
    328        (and (eq_attr "type" "imul")
    329 	    (and (eq_attr "memory" "none") (eq_attr "mode" "!SI"))))
    330   "glm-imul-64")
    331 
    332 (define_insn_reservation  "glm_imul64-load" 5
    333   (and (eq_attr "cpu" "glm")
    334        (and (eq_attr "type" "imul")
    335 	    (and (eq_attr "memory" "!none") (eq_attr "mode" "!SI"))))
    336   "glm-imul-mem-64")
    337 
    338 (define_insn_reservation  "glm_idiv" 25
    339   (and (eq_attr "cpu" "glm")
    340        (eq_attr "type" "idiv"))
    341   "glm-all*16, nothing*9")
    342 
    343 (define_insn_reservation  "glm_icmp" 1
    344   (and (eq_attr "cpu" "glm")
    345        (and (eq_attr "type" "icmp")
    346 	    (eq_attr "memory" "none")))
    347   "glm-int-0")
    348 
    349 (define_insn_reservation  "glm_icmp_mem" 2
    350   (and (eq_attr "cpu" "glm")
    351        (and (eq_attr "type" "icmp")
    352 	    (eq_attr "memory" "!none")))
    353   "glm-int-0-load,nothing")
    354 
    355 (define_insn_reservation  "glm_test" 1
    356   (and (eq_attr "cpu" "glm")
    357        (and (eq_attr "type" "test")
    358 	    (eq_attr "memory" "none")))
    359   "glm-int-0")
    360 
    361 (define_insn_reservation  "glm_test_mem" 2
    362   (and (eq_attr "cpu" "glm")
    363        (and (eq_attr "type" "test")
    364 	    (eq_attr "memory" "!none")))
    365   "glm-int-0-load,nothing")
    366 
    367 (define_insn_reservation  "glm_ibr" 1
    368   (and (eq_attr "cpu" "glm")
    369        (and (eq_attr "type" "ibr")
    370 	    (eq_attr "memory" "!load")))
    371   "glm-int-1")
    372 
    373 ;; complex if jump target is from address
    374 (define_insn_reservation  "glm_ibr_2" 2
    375   (and (eq_attr "cpu" "glm")
    376        (and (eq_attr "type" "ibr")
    377 	    (eq_attr "memory" "load")))
    378   "glm-all*2")
    379 
    380 (define_insn_reservation  "glm_setcc" 1
    381   (and (eq_attr "cpu" "glm")
    382        (and (eq_attr "type" "setcc")
    383 	    (eq_attr "memory" "!store")))
    384   "glm-iec-any")
    385 
    386 ;; 2 cycles complex if target is in memory
    387 (define_insn_reservation  "glm_setcc_2" 2
    388   (and (eq_attr "cpu" "glm")
    389        (and (eq_attr "type" "setcc")
    390 	    (eq_attr "memory" "store")))
    391   "glm-all*2")
    392 
    393 (define_insn_reservation  "glm_icmov" 2
    394   (and (eq_attr "cpu" "glm")
    395        (and (eq_attr "type" "icmov")
    396 	    (eq_attr "memory" "none")))
    397   "glm-iec-any, nothing")
    398 
    399 (define_insn_reservation  "glm_icmov_mem" 2
    400   (and (eq_attr "cpu" "glm")
    401        (and (eq_attr "type" "icmov")
    402 	    (eq_attr "memory" "!none")))
    403   "glm-int-0-load, nothing")
    404 
    405 ;; UCODE if segreg, ignored
    406 (define_insn_reservation  "glm_push" 2
    407   (and (eq_attr "cpu" "glm")
    408        (eq_attr "type" "push"))
    409   "(glm-int-1+glm-int-2)*2")
    410 
    411 ;; pop r64 is 1 cycle. UCODE if segreg, ignored
    412 (define_insn_reservation  "glm_pop" 1
    413   (and (eq_attr "cpu" "glm")
    414        (and (eq_attr "type" "pop")
    415 	    (eq_attr "mode" "DI")))
    416   "glm-int-1+glm-int-2")
    417 
    418 ;; pop non-r64 is 2 cycles. UCODE if segreg, ignored
    419 (define_insn_reservation  "glm_pop_2" 2
    420   (and (eq_attr "cpu" "glm")
    421        (and (eq_attr "type" "pop")
    422 	    (eq_attr "mode" "!DI")))
    423   "(glm-int-1+glm-int-2)*2")
    424 
    425 ;; UCODE if segreg, ignored
    426 (define_insn_reservation  "glm_call" 1
    427   (and (eq_attr "cpu" "glm")
    428        (eq_attr "type" "call,callv"))
    429   "(glm-int-0+glm-int-1)")
    430 
    431 (define_insn_reservation  "glm_leave" 3
    432   (and (eq_attr "cpu" "glm")
    433        (eq_attr "type" "leave"))
    434   "glm-all*3")
    435 
    436 (define_insn_reservation  "glm_str" 3
    437   (and (eq_attr "cpu" "glm")
    438        (eq_attr "type" "str"))
    439   "glm-all*3")
    440 
    441 (define_insn_reservation  "glm_sselog" 1
    442   (and (eq_attr "cpu" "glm")
    443        (and (eq_attr "type" "sselog")
    444 	    (eq_attr "memory" "none")))
    445   "glm-fec-all")
    446 
    447 (define_insn_reservation  "glm_sselog_mem" 1
    448   (and (eq_attr "cpu" "glm")
    449        (and (eq_attr "type" "sselog")
    450 	    (eq_attr "memory" "!none")))
    451   "glm-fec-all+glm-load")
    452 
    453 (define_insn_reservation  "glm_sselog1" 1
    454   (and (eq_attr "cpu" "glm")
    455        (and (eq_attr "type" "sselog1")
    456 	    (eq_attr "memory" "none")))
    457   "glm-fp-0")
    458 
    459 (define_insn_reservation  "glm_sselog1_mem" 1
    460   (and (eq_attr "cpu" "glm")
    461        (and (eq_attr "type" "sselog1")
    462 	    (eq_attr "memory" "!none")))
    463   "glm-fp-0+glm-load")
    464 
    465 ;; not pmad, not psad
    466 (define_insn_reservation  "glm_sseiadd" 3
    467   (and (eq_attr "cpu" "glm")
    468        (and (eq_attr "type" "sseiadd")
    469 	    (and (not (match_operand:V2DI 0 "register_operand"))
    470 		 (and (eq_attr "atom_unit" "!simul")
    471 		      (eq_attr "atom_unit" "!complex")))))
    472   "glm-fadd-3c")
    473 
    474 ;; pmad, psad and 64
    475 (define_insn_reservation  "glm_sseiadd_2" 4
    476   (and (eq_attr "cpu" "glm")
    477        (and (eq_attr "type" "sseiadd")
    478 	    (and (not (match_operand:V2DI 0 "register_operand"))
    479 		 (and (eq_attr "atom_unit" "simul")
    480 		      (eq_attr "mode" "DI,TI")))))
    481   "glm-fmul-4c")
    482 
    483 ;; if paddq(64 bit op), phadd/phsub
    484 (define_insn_reservation  "glm_sseiadd_3" 5
    485   (and (eq_attr "cpu" "glm")
    486        (and (eq_attr "type" "sseiadd")
    487 	    (ior (match_operand:V2DI 0 "register_operand")
    488 		 (eq_attr "atom_unit" "complex"))))
    489   "glm-fmul-5c")
    490 
    491 ;; if immediate op.
    492 (define_insn_reservation  "glm_sseishft" 2
    493   (and (eq_attr "cpu" "glm")
    494        (and (eq_attr "type" "sseishft")
    495 	    (match_operand 2 "immediate_operand")))
    496   "glm-fp-0, nothing")
    497 
    498 (define_insn_reservation  "glm_sseimul" 4
    499   (and (eq_attr "cpu" "glm")
    500        (and (eq_attr "type" "sseimul")
    501 	    (eq_attr "memory" "none")))
    502   "glm-fmul-4c")
    503 
    504 (define_insn_reservation  "glm_sseimul_load" 4
    505   (and (eq_attr "cpu" "glm")
    506        (and (eq_attr "type" "sseimul")
    507 	    (eq_attr "memory" "!none")))
    508   "glm-fmul-4c-mem")
    509 
    510 
    511 ;; rcpss or rsqrtss
    512 (define_insn_reservation  "glm_sse" 4
    513   (and (eq_attr "cpu" "glm")
    514        (and (eq_attr "type" "sse")
    515 	    (and (eq_attr "atom_sse_attr" "rcp") (eq_attr "mode" "SF"))))
    516   "glm-fmul-4c")
    517 
    518 ;; movshdup, movsldup. Suggest to type sseishft
    519 (define_insn_reservation  "glm_sse_2" 1
    520   (and (eq_attr "cpu" "glm")
    521        (and (eq_attr "type" "sse")
    522 	    (eq_attr "atom_sse_attr" "movdup")))
    523   "glm-fec-any")
    524 
    525 ;; lfence
    526 (define_insn_reservation  "glm_sse_3" 1
    527   (and (eq_attr "cpu" "glm")
    528        (and (eq_attr "type" "sse")
    529 	    (eq_attr "atom_sse_attr" "lfence")))
    530   "glm-fec-any")
    531 
    532 ;; sfence,clflush,mfence, prefetch
    533 (define_insn_reservation  "glm_sse_4" 1
    534   (and (eq_attr "cpu" "glm")
    535        (and (eq_attr "type" "sse")
    536 	    (ior (eq_attr "atom_sse_attr" "fence")
    537 		 (eq_attr "atom_sse_attr" "prefetch"))))
    538   "glm-fp-0")
    539 
    540 ;; rcpps, rsqrtss, sqrt, ldmxcsr
    541 (define_insn_reservation  "glm_sse_5" 9
    542   (and (eq_attr "cpu" "glm")
    543        (and (eq_attr "type" "sse")
    544 	    (ior (ior (eq_attr "atom_sse_attr" "sqrt")
    545 		      (eq_attr "atom_sse_attr" "mxcsr"))
    546 		 (and (eq_attr "atom_sse_attr" "rcp")
    547 		      (eq_attr "mode" "V4SF")))))
    548   "glm-fec-all*6, nothing*3")
    549 
    550 ;; xmm->xmm
    551 (define_insn_reservation  "glm_ssemov" 1
    552   (and (eq_attr "cpu" "glm")
    553        (and (eq_attr "type" "ssemov")
    554 	    (and (match_operand 0 "register_operand" "xy")
    555 		 (match_operand 1 "register_operand" "xy"))))
    556   "glm-fec-any")
    557 
    558 ;; reg->xmm
    559 (define_insn_reservation  "glm_ssemov_2" 1
    560   (and (eq_attr "cpu" "glm")
    561        (and (eq_attr "type" "ssemov")
    562 	    (and (match_operand 0 "register_operand" "xy")
    563 		 (match_operand 1 "register_operand" "r"))))
    564   "glm-fp-0")
    565 
    566 ;; xmm->reg
    567 (define_insn_reservation  "glm_ssemov_3" 3
    568   (and (eq_attr "cpu" "glm")
    569        (and (eq_attr "type" "ssemov")
    570 	    (and (match_operand 0 "register_operand" "r")
    571 		 (match_operand 1 "register_operand" "xy"))))
    572   "glm-fp-0, nothing*2")
    573 
    574 ;; mov mem
    575 (define_insn_reservation  "glm_ssemov_load" 2
    576   (and (eq_attr "cpu" "glm")
    577        (and (eq_attr "type" "ssemov")
    578 	    (eq_attr "memory" "load")))
    579   "glm-fec-any+glm-load,nothing")
    580 
    581 (define_insn_reservation  "glm_ssemov_store" 1
    582   (and (eq_attr "cpu" "glm")
    583        (and (eq_attr "type" "ssemov")
    584 	    (eq_attr "memory" "store")))
    585   "glm-fec-any+glm-store")
    586 
    587 ;; no memory simple
    588 (define_insn_reservation  "glm_sseadd" 3
    589   (and (eq_attr "cpu" "glm")
    590        (and (eq_attr "type" "sseadd")
    591 	    (eq_attr "memory" "none")))
    592   "glm-fadd-3c")
    593 
    594 ;; memory simple
    595 (define_insn_reservation  "glm_sseadd_mem" 3
    596   (and (eq_attr "cpu" "glm")
    597        (and (eq_attr "type" "sseadd")
    598 	    (eq_attr "memory" "!none")))
    599   "glm-fadd-3c-mem")
    600 
    601 ;; Except dppd/dpps
    602 (define_insn_reservation  "glm_ssemul" 4
    603   (and (eq_attr "cpu" "glm")
    604        (and (eq_attr "type" "ssemul")
    605 	    (eq_attr "memory" "none")))
    606   "glm-fmul-4c")
    607 
    608 (define_insn_reservation  "glm_ssemul_mem" 4
    609   (and (eq_attr "cpu" "glm")
    610        (and (eq_attr "type" "ssemul")
    611 	    (eq_attr "memory" "!none")))
    612   "glm-fmul-4c-mem")
    613 
    614 (define_insn_reservation  "glm_ssecmp" 1
    615   (and (eq_attr "cpu" "glm")
    616        (eq_attr "type" "ssecmp"))
    617   "glm-fec-any")
    618 
    619 (define_insn_reservation  "glm_ssecomi" 1
    620   (and (eq_attr "cpu" "glm")
    621        (eq_attr "type" "ssecomi"))
    622   "glm-fp-0")
    623 
    624 ;; no memory and cvtpi2ps, cvtps2pi, cvttps2pi
    625 (define_insn_reservation  "glm_ssecvt" 4
    626   (and (eq_attr "cpu" "glm")
    627        (and (eq_attr "type" "ssecvt")
    628 	    (ior (and (match_operand:V2SI 0 "register_operand")
    629 		      (match_operand:V4SF 1 "register_operand"))
    630 		 (and (match_operand:V4SF 0 "register_operand")
    631 		      (match_operand:V2SI 1 "register_operand")))))
    632   "glm-fp-0, nothing*3")
    633 
    634 ;; memory and cvtpi2ps, cvtps2pi, cvttps2pi
    635 (define_insn_reservation  "glm_ssecvt_mem" 4
    636   (and (eq_attr "cpu" "glm")
    637        (and (eq_attr "type" "ssecvt")
    638 	    (ior (and (match_operand:V2SI 0 "register_operand")
    639 		      (match_operand:V4SF 1 "memory_operand"))
    640 		 (and (match_operand:V4SF 0 "register_operand")
    641 		      (match_operand:V2SI 1 "memory_operand")))))
    642   "glm-fp-0+glm-load, nothing*3")
    643 
    644 ;; memory and cvtsi2sd
    645 (define_insn_reservation  "glm_sseicvt" 1
    646   (and (eq_attr "cpu" "glm")
    647        (and (eq_attr "type" "sseicvt")
    648 	    (and (match_operand:V2DF 0 "register_operand")
    649 		 (match_operand:SI 1 "nonimmediate_operand"))))
    650   "glm-fp-0")
    651 
    652 ;; otherwise. 8 cycles average for cvtsd2si
    653 (define_insn_reservation  "glm_sseicvt_2" 4
    654   (and (eq_attr "cpu" "glm")
    655        (and (eq_attr "type" "sseicvt")
    656 	    (not (and (match_operand:V2DF 0 "register_operand")
    657 		      (match_operand:SI 1 "memory_operand")))))
    658   "glm-fp-0, nothing*3")
    659 
    660 (define_insn_reservation  "glm_ssediv" 13
    661   (and (eq_attr "cpu" "glm")
    662        (eq_attr "type" "ssediv"))
    663   "glm-fec-all*12, nothing")
    664 
    665 ;; simple for fmov
    666 (define_insn_reservation  "glm_fmov" 1
    667   (and (eq_attr "cpu" "glm")
    668        (and (eq_attr "type" "fmov")
    669 	    (eq_attr "memory" "none")))
    670   "glm-fec-any")
    671 
    672 ;; simple for fmov
    673 (define_insn_reservation  "glm_fmov_load" 3
    674   (and (eq_attr "cpu" "glm")
    675        (and (eq_attr "type" "fmov")
    676 	    (eq_attr "memory" "load")))
    677   "glm-fec-any+glm-load, nothing*2")
    678 
    679 (define_insn_reservation  "glm_fmov_store" 1
    680   (and (eq_attr "cpu" "glm")
    681        (and (eq_attr "type" "fmov")
    682 	    (eq_attr "memory" "store")))
    683   "glm-fec-any+glm-store")
    684 
    685 ;; Define bypass here
    686 
    687 ;; There will be 0 cycle stall from cmp/test to jcc
    688 
    689 ;; There will be 1 cycle stall from flag producer to cmov and adc/sbb
    690 (define_bypass 2 "glm_icmp, glm_test, glm_alu, glm_alu_carry,
    691 		  glm_alu1, glm_negnot, glm_incdec, glm_ishift,
    692 		  glm_ishift1, glm_rotate"
    693 		 "glm_icmov, glm_alu_carry")
    694 
    695 ;; lea to shift source stall is 1 cycle
    696 (define_bypass 2 "glm_lea"
    697 		 "glm_ishift, glm_ishift1, glm_rotate"
    698 		 "!ix86_dep_by_shift_count")
    699 
    700 ;; non-lea to shift count stall is 1 cycle
    701 (define_bypass 2 "glm_alu_carry,
    702 		  glm_alu,glm_alu1,glm_negnot,glm_imov,glm_imovx,
    703 		  glm_incdec,glm_ishift,glm_ishift1,glm_rotate,
    704 		  glm_setcc, glm_icmov, glm_pop, glm_imov_store,
    705 		  glm_alu_mem, glm_alu_carry_mem, glm_alu1_mem,
    706 		  glm_alu_load, glm_imovx_mem, glm_imovx_2_mem,
    707 		  glm_imov_load, glm_icmov_mem, glm_fmov_load, glm_fmov_store"
    708 		 "glm_ishift, glm_ishift1, glm_rotate,
    709 		  glm_ishift_mem, glm_ishift1_mem,
    710 		  glm_rotate_mem"
    711 		 "ix86_dep_by_shift_count")
    712