1;; Slivermont(SLM) Scheduling 2;; Copyright (C) 2009-2020 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;; Silvermont has 2 out-of-order IEC, 2 in-order FEC and 1 in-order MEC. 21 22 23(define_automaton "slm") 24 25;; EU: Execution Unit 26;; Silvermont EUs are connected by port 0 or port 1. 27 28;; SLM has two ports: port 0 and port 1 connecting to all execution units 29(define_cpu_unit "slm-port-0,slm-port-1" "slm") 30 31(define_cpu_unit "slm-ieu-0, slm-ieu-1, 32 slm-imul, slm-feu-0, slm-feu-1" 33 "slm") 34 35(define_reservation "slm-all-ieu" "(slm-ieu-0 + slm-ieu-1 + slm-imul)") 36(define_reservation "slm-all-feu" "(slm-feu-0 + slm-feu-1)") 37(define_reservation "slm-all-eu" "(slm-all-ieu + slm-all-feu)") 38(define_reservation "slm-fp-0" "(slm-port-0 + slm-feu-0)") 39 40;; Some EUs have duplicated copied and can be accessed via either 41;; port 0 or port 1 42;; (define_reservation "slm-port-either" "(slm-port-0 | slm-port-1)" 43(define_reservation "slm-port-dual" "(slm-port-0 + slm-port-1)") 44 45;;; fmul insn can have 4 or 5 cycles latency 46(define_reservation "slm-fmul-5c" 47 "(slm-port-0 + slm-feu-0), slm-feu-0, nothing*3") 48(define_reservation "slm-fmul-4c" "(slm-port-0 + slm-feu-0), nothing*3") 49 50;;; fadd can has 3 cycles latency depends on instruction forms 51(define_reservation "slm-fadd-3c" "(slm-port-1 + slm-feu-1), nothing*2") 52(define_reservation "slm-fadd-4c" 53 "(slm-port-1 + slm-feu-1), slm-feu-1, nothing*2") 54 55;;; imul insn has 3 cycles latency for SI operands 56(define_reservation "slm-imul-32" 57 "(slm-port-1 + slm-imul), nothing*2") 58(define_reservation "slm-imul-mem-32" 59 "(slm-port-1 + slm-imul + slm-port-0), nothing*2") 60;;; imul has 4 cycles latency for DI operands with 1/2 tput 61(define_reservation "slm-imul-64" 62 "(slm-port-1 + slm-imul), slm-imul, nothing*2") 63 64;;; dual-execution instructions can have 1,2,4,5 cycles latency depends on 65;;; instruction forms 66(define_reservation "slm-dual-1c" "(slm-port-dual + slm-all-eu)") 67(define_reservation "slm-dual-2c" 68 "(slm-port-dual + slm-all-eu, nothing)") 69 70;;; Most of simple ALU instructions have 1 cycle latency. Some of them 71;;; issue in port 0, some in port 0 and some in either port. 72(define_reservation "slm-simple-0" "(slm-port-0 + slm-ieu-0)") 73(define_reservation "slm-simple-1" "(slm-port-1 + slm-ieu-1)") 74(define_reservation "slm-simple-either" "(slm-simple-0 | slm-simple-1)") 75 76;;; Complex macro-instruction has variants of latency, and uses both ports. 77(define_reservation "slm-complex" "(slm-port-dual + slm-all-eu)") 78 79(define_insn_reservation "slm_other" 9 80 (and (eq_attr "cpu" "slm") 81 (and (eq_attr "type" "other") 82 (eq_attr "atom_unit" "!jeu"))) 83 "slm-complex, slm-all-eu*8") 84 85;; return has type "other" with atom_unit "jeu" 86(define_insn_reservation "slm_other_2" 1 87 (and (eq_attr "cpu" "slm") 88 (and (eq_attr "type" "other") 89 (eq_attr "atom_unit" "jeu"))) 90 "slm-dual-1c") 91 92(define_insn_reservation "slm_multi" 9 93 (and (eq_attr "cpu" "slm") 94 (eq_attr "type" "multi")) 95 "slm-complex, slm-all-eu*8") 96 97;; Normal alu insns without carry 98(define_insn_reservation "slm_alu" 1 99 (and (eq_attr "cpu" "slm") 100 (and (eq_attr "type" "alu") 101 (and (eq_attr "memory" "none") 102 (eq_attr "use_carry" "0")))) 103 "slm-simple-either") 104 105;; Normal alu insns without carry, but use MEC. 106(define_insn_reservation "slm_alu_mem" 1 107 (and (eq_attr "cpu" "slm") 108 (and (eq_attr "type" "alu") 109 (and (eq_attr "memory" "!none") 110 (eq_attr "use_carry" "0")))) 111 "slm-simple-either") 112 113;; Alu insn consuming CF, such as add/sbb 114(define_insn_reservation "slm_alu_carry" 2 115 (and (eq_attr "cpu" "slm") 116 (and (eq_attr "type" "alu") 117 (and (eq_attr "memory" "none") 118 (eq_attr "use_carry" "1")))) 119 "slm-simple-either, nothing") 120 121;; Alu insn consuming CF, such as add/sbb 122(define_insn_reservation "slm_alu_carry_mem" 2 123 (and (eq_attr "cpu" "slm") 124 (and (eq_attr "type" "alu") 125 (and (eq_attr "memory" "!none") 126 (eq_attr "use_carry" "1")))) 127 "slm-simple-either, nothing") 128 129(define_insn_reservation "slm_alu1" 1 130 (and (eq_attr "cpu" "slm") 131 (and (eq_attr "type" "alu1") 132 (eq_attr "memory" "none") (eq_attr "prefix_0f" "0"))) 133 "slm-simple-either") 134 135;; bsf and bsf insn 136(define_insn_reservation "slm_alu1_1" 10 137 (and (eq_attr "cpu" "slm") 138 (and (eq_attr "type" "alu1") 139 (eq_attr "memory" "none") (eq_attr "prefix_0f" "1"))) 140 "slm-simple-1, slm-ieu-1*9") 141 142(define_insn_reservation "slm_alu1_mem" 1 143 (and (eq_attr "cpu" "slm") 144 (and (eq_attr "type" "alu1") 145 (eq_attr "memory" "!none"))) 146 "slm-simple-either") 147 148(define_insn_reservation "slm_negnot" 1 149 (and (eq_attr "cpu" "slm") 150 (and (eq_attr "type" "negnot") 151 (eq_attr "memory" "none"))) 152 "slm-simple-either") 153 154(define_insn_reservation "slm_negnot_mem" 1 155 (and (eq_attr "cpu" "slm") 156 (and (eq_attr "type" "negnot") 157 (eq_attr "memory" "!none"))) 158 "slm-simple-either") 159 160(define_insn_reservation "slm_imov" 1 161 (and (eq_attr "cpu" "slm") 162 (and (eq_attr "type" "imov") 163 (eq_attr "memory" "none"))) 164 "slm-simple-either") 165 166(define_insn_reservation "slm_imov_mem" 1 167 (and (eq_attr "cpu" "slm") 168 (and (eq_attr "type" "imov") 169 (eq_attr "memory" "!none"))) 170 "slm-simple-0") 171 172;; 16<-16, 32<-32 173(define_insn_reservation "slm_imovx" 1 174 (and (eq_attr "cpu" "slm") 175 (and (eq_attr "type" "imovx") 176 (and (eq_attr "memory" "none") 177 (ior (and (match_operand:HI 0 "register_operand") 178 (match_operand:HI 1 "general_operand")) 179 (and (match_operand:SI 0 "register_operand") 180 (match_operand:SI 1 "general_operand")))))) 181 "slm-simple-either") 182 183;; 16<-16, 32<-32, mem 184(define_insn_reservation "slm_imovx_mem" 1 185 (and (eq_attr "cpu" "slm") 186 (and (eq_attr "type" "imovx") 187 (and (eq_attr "memory" "!none") 188 (ior (and (match_operand:HI 0 "register_operand") 189 (match_operand:HI 1 "general_operand")) 190 (and (match_operand:SI 0 "register_operand") 191 (match_operand:SI 1 "general_operand")))))) 192 "slm-simple-either") 193 194;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8 195(define_insn_reservation "slm_imovx_2" 1 196 (and (eq_attr "cpu" "slm") 197 (and (eq_attr "type" "imovx") 198 (and (eq_attr "memory" "none") 199 (ior (match_operand:QI 0 "register_operand") 200 (ior (and (match_operand:SI 0 "register_operand") 201 (not (match_operand:SI 1 "general_operand"))) 202 (match_operand:DI 0 "register_operand")))))) 203 "slm-simple-either") 204 205;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8, mem 206(define_insn_reservation "slm_imovx_2_mem" 1 207 (and (eq_attr "cpu" "slm") 208 (and (eq_attr "type" "imovx") 209 (and (eq_attr "memory" "!none") 210 (ior (match_operand:QI 0 "register_operand") 211 (ior (and (match_operand:SI 0 "register_operand") 212 (not (match_operand:SI 1 "general_operand"))) 213 (match_operand:DI 0 "register_operand")))))) 214 "slm-simple-0") 215 216;; 16<-8 217(define_insn_reservation "slm_imovx_3" 3 218 (and (eq_attr "cpu" "slm") 219 (and (eq_attr "type" "imovx") 220 (and (match_operand:HI 0 "register_operand") 221 (match_operand:QI 1 "general_operand")))) 222 "slm-simple-0, nothing*2") 223 224(define_insn_reservation "slm_lea" 1 225 (and (eq_attr "cpu" "slm") 226 (and (eq_attr "type" "lea") 227 (eq_attr "mode" "!HI"))) 228 "slm-simple-either") 229 230;; lea 16bit address is complex insn 231(define_insn_reservation "slm_lea_2" 2 232 (and (eq_attr "cpu" "slm") 233 (and (eq_attr "type" "lea") 234 (eq_attr "mode" "HI"))) 235 "slm-complex, slm-all-eu") 236 237(define_insn_reservation "slm_incdec" 1 238 (and (eq_attr "cpu" "slm") 239 (and (eq_attr "type" "incdec") 240 (eq_attr "memory" "none"))) 241 "slm-simple-0") 242 243(define_insn_reservation "slm_incdec_mem" 3 244 (and (eq_attr "cpu" "slm") 245 (and (eq_attr "type" "incdec") 246 (eq_attr "memory" "!none"))) 247 "slm-simple-0, nothing*2") 248 249;; simple shift instruction use SHIFT eu, none memory 250(define_insn_reservation "slm_ishift" 1 251 (and (eq_attr "cpu" "slm") 252 (and (eq_attr "type" "ishift") 253 (and (eq_attr "memory" "none") (eq_attr "prefix_0f" "0")))) 254 "slm-simple-0") 255 256;; simple shift instruction use SHIFT eu, memory 257(define_insn_reservation "slm_ishift_mem" 1 258 (and (eq_attr "cpu" "slm") 259 (and (eq_attr "type" "ishift") 260 (and (eq_attr "memory" "!none") (eq_attr "prefix_0f" "0")))) 261 "slm-simple-0") 262 263;; DF shift (prefixed with 0f) is complex insn with latency of 4 cycles 264(define_insn_reservation "slm_ishift_3" 4 265 (and (eq_attr "cpu" "slm") 266 (and (eq_attr "type" "ishift") 267 (eq_attr "prefix_0f" "1"))) 268 "slm-complex, slm-all-eu*3") 269 270(define_insn_reservation "slm_ishift1" 1 271 (and (eq_attr "cpu" "slm") 272 (and (eq_attr "type" "ishift1") 273 (eq_attr "memory" "none"))) 274 "slm-simple-0") 275 276(define_insn_reservation "slm_ishift1_mem" 1 277 (and (eq_attr "cpu" "slm") 278 (and (eq_attr "type" "ishift1") 279 (eq_attr "memory" "!none"))) 280 "slm-simple-0") 281 282(define_insn_reservation "slm_rotate" 1 283 (and (eq_attr "cpu" "slm") 284 (and (eq_attr "type" "rotate") 285 (eq_attr "memory" "none"))) 286 "slm-simple-0") 287 288(define_insn_reservation "slm_rotate_mem" 1 289 (and (eq_attr "cpu" "slm") 290 (and (eq_attr "type" "rotate") 291 (eq_attr "memory" "!none"))) 292 "slm-simple-0") 293 294(define_insn_reservation "slm_rotate1" 1 295 (and (eq_attr "cpu" "slm") 296 (and (eq_attr "type" "rotate1") 297 (eq_attr "memory" "none"))) 298 "slm-simple-0") 299 300(define_insn_reservation "slm_rotate1_mem" 1 301 (and (eq_attr "cpu" "slm") 302 (and (eq_attr "type" "rotate1") 303 (eq_attr "memory" "!none"))) 304 "slm-simple-0") 305 306(define_insn_reservation "slm_imul" 3 307 (and (eq_attr "cpu" "slm") 308 (and (eq_attr "type" "imul") 309 (and (eq_attr "memory" "none") (eq_attr "mode" "SI")))) 310 "slm-imul-32") 311 312(define_insn_reservation "slm_imul_mem" 3 313 (and (eq_attr "cpu" "slm") 314 (and (eq_attr "type" "imul") 315 (and (eq_attr "memory" "!none") (eq_attr "mode" "SI")))) 316 "slm-imul-mem-32") 317 318;; latency set to 4 as common 64x64 imul with 1/2 tput 319(define_insn_reservation "slm_imul_3" 4 320 (and (eq_attr "cpu" "slm") 321 (and (eq_attr "type" "imul") 322 (eq_attr "mode" "!SI"))) 323 "slm-imul-64") 324 325(define_insn_reservation "slm_idiv" 33 326 (and (eq_attr "cpu" "slm") 327 (eq_attr "type" "idiv")) 328 "slm-complex, slm-all-eu*16, nothing*16") 329 330(define_insn_reservation "slm_icmp" 1 331 (and (eq_attr "cpu" "slm") 332 (and (eq_attr "type" "icmp") 333 (eq_attr "memory" "none"))) 334 "slm-simple-either") 335 336(define_insn_reservation "slm_icmp_mem" 1 337 (and (eq_attr "cpu" "slm") 338 (and (eq_attr "type" "icmp") 339 (eq_attr "memory" "!none"))) 340 "slm-simple-either") 341 342(define_insn_reservation "slm_test" 1 343 (and (eq_attr "cpu" "slm") 344 (and (eq_attr "type" "test") 345 (eq_attr "memory" "none"))) 346 "slm-simple-either") 347 348(define_insn_reservation "slm_test_mem" 1 349 (and (eq_attr "cpu" "slm") 350 (and (eq_attr "type" "test") 351 (eq_attr "memory" "!none"))) 352 "slm-simple-either") 353 354(define_insn_reservation "slm_ibr" 1 355 (and (eq_attr "cpu" "slm") 356 (and (eq_attr "type" "ibr") 357 (eq_attr "memory" "!load"))) 358 "slm-simple-1") 359 360;; complex if jump target is from address 361(define_insn_reservation "slm_ibr_2" 2 362 (and (eq_attr "cpu" "slm") 363 (and (eq_attr "type" "ibr") 364 (eq_attr "memory" "load"))) 365 "slm-complex, slm-all-eu") 366 367(define_insn_reservation "slm_setcc" 1 368 (and (eq_attr "cpu" "slm") 369 (and (eq_attr "type" "setcc") 370 (eq_attr "memory" "!store"))) 371 "slm-simple-either") 372 373;; 2 cycles complex if target is in memory 374(define_insn_reservation "slm_setcc_2" 2 375 (and (eq_attr "cpu" "slm") 376 (and (eq_attr "type" "setcc") 377 (eq_attr "memory" "store"))) 378 "slm-complex, slm-all-eu") 379 380(define_insn_reservation "slm_icmov" 2 381 (and (eq_attr "cpu" "slm") 382 (and (eq_attr "type" "icmov") 383 (eq_attr "memory" "none"))) 384 "slm-simple-either, nothing") 385 386(define_insn_reservation "slm_icmov_mem" 2 387 (and (eq_attr "cpu" "slm") 388 (and (eq_attr "type" "icmov") 389 (eq_attr "memory" "!none"))) 390 "slm-simple-0, nothing") 391 392;; UCODE if segreg, ignored 393(define_insn_reservation "slm_push" 2 394 (and (eq_attr "cpu" "slm") 395 (eq_attr "type" "push")) 396 "slm-dual-2c") 397 398;; pop r64 is 1 cycle. UCODE if segreg, ignored 399(define_insn_reservation "slm_pop" 1 400 (and (eq_attr "cpu" "slm") 401 (and (eq_attr "type" "pop") 402 (eq_attr "mode" "DI"))) 403 "slm-dual-1c") 404 405;; pop non-r64 is 2 cycles. UCODE if segreg, ignored 406(define_insn_reservation "slm_pop_2" 2 407 (and (eq_attr "cpu" "slm") 408 (and (eq_attr "type" "pop") 409 (eq_attr "mode" "!DI"))) 410 "slm-dual-2c") 411 412;; UCODE if segreg, ignored 413(define_insn_reservation "slm_call" 1 414 (and (eq_attr "cpu" "slm") 415 (eq_attr "type" "call")) 416 "slm-dual-1c") 417 418(define_insn_reservation "slm_callv" 1 419 (and (eq_attr "cpu" "slm") 420 (eq_attr "type" "callv")) 421 "slm-dual-1c") 422 423(define_insn_reservation "slm_leave" 3 424 (and (eq_attr "cpu" "slm") 425 (eq_attr "type" "leave")) 426 "slm-complex, slm-all-eu*2") 427 428(define_insn_reservation "slm_str" 3 429 (and (eq_attr "cpu" "slm") 430 (eq_attr "type" "str")) 431 "slm-complex, slm-all-eu*2") 432 433(define_insn_reservation "slm_sselog" 1 434 (and (eq_attr "cpu" "slm") 435 (and (eq_attr "type" "sselog") 436 (eq_attr "memory" "none"))) 437 "slm-simple-either") 438 439(define_insn_reservation "slm_sselog_mem" 1 440 (and (eq_attr "cpu" "slm") 441 (and (eq_attr "type" "sselog") 442 (eq_attr "memory" "!none"))) 443 "slm-simple-either") 444 445(define_insn_reservation "slm_sselog1" 1 446 (and (eq_attr "cpu" "slm") 447 (and (eq_attr "type" "sselog1") 448 (eq_attr "memory" "none"))) 449 "slm-simple-0") 450 451(define_insn_reservation "slm_sselog1_mem" 1 452 (and (eq_attr "cpu" "slm") 453 (and (eq_attr "type" "sselog1") 454 (eq_attr "memory" "!none"))) 455 "slm-simple-0") 456 457;; not pmad, not psad 458(define_insn_reservation "slm_sseiadd" 1 459 (and (eq_attr "cpu" "slm") 460 (and (eq_attr "type" "sseiadd") 461 (and (not (match_operand:V2DI 0 "register_operand")) 462 (and (eq_attr "atom_unit" "!simul") 463 (eq_attr "atom_unit" "!complex"))))) 464 "slm-simple-either") 465 466;; pmad, psad and 64 467(define_insn_reservation "slm_sseiadd_2" 4 468 (and (eq_attr "cpu" "slm") 469 (and (eq_attr "type" "sseiadd") 470 (and (not (match_operand:V2DI 0 "register_operand")) 471 (and (eq_attr "atom_unit" "simul" ) 472 (eq_attr "mode" "DI"))))) 473 "slm-fmul-4c") 474 475;; pmad, psad and 128 476(define_insn_reservation "slm_sseiadd_3" 5 477 (and (eq_attr "cpu" "slm") 478 (and (eq_attr "type" "sseiadd") 479 (and (not (match_operand:V2DI 0 "register_operand")) 480 (and (eq_attr "atom_unit" "simul" ) 481 (eq_attr "mode" "TI"))))) 482 "slm-fmul-5c") 483 484;; if paddq(64 bit op), phadd/phsub 485(define_insn_reservation "slm_sseiadd_4" 4 486 (and (eq_attr "cpu" "slm") 487 (and (eq_attr "type" "sseiadd") 488 (ior (match_operand:V2DI 0 "register_operand") 489 (eq_attr "atom_unit" "complex")))) 490 "slm-fadd-4c") 491 492;; if immediate op. 493(define_insn_reservation "slm_sseishft" 1 494 (and (eq_attr "cpu" "slm") 495 (and (eq_attr "type" "sseishft") 496 (and (eq_attr "atom_unit" "!sishuf") 497 (match_operand 2 "immediate_operand")))) 498 "slm-simple-either") 499 500;; if palignr or psrldq 501(define_insn_reservation "slm_sseishft_2" 1 502 (and (eq_attr "cpu" "slm") 503 (ior (eq_attr "type" "sseishft1") 504 (and (eq_attr "type" "sseishft") 505 (and (eq_attr "atom_unit" "sishuf") 506 (match_operand 2 "immediate_operand"))))) 507 "slm-simple-0") 508 509;; if reg/mem op 510(define_insn_reservation "slm_sseishft_3" 2 511 (and (eq_attr "cpu" "slm") 512 (and (eq_attr "type" "sseishft") 513 (not (match_operand 2 "immediate_operand")))) 514 "slm-complex, slm-all-eu") 515 516(define_insn_reservation "slm_sseimul" 5 517 (and (eq_attr "cpu" "slm") 518 (eq_attr "type" "sseimul")) 519 "slm-fmul-5c") 520 521;; rcpss or rsqrtss 522(define_insn_reservation "slm_sse" 4 523 (and (eq_attr "cpu" "slm") 524 (and (eq_attr "type" "sse") 525 (and (eq_attr "atom_sse_attr" "rcp") (eq_attr "mode" "SF")))) 526 "slm-fmul-4c") 527 528;; movshdup, movsldup. Suggest to type sseishft 529(define_insn_reservation "slm_sse_2" 1 530 (and (eq_attr "cpu" "slm") 531 (and (eq_attr "type" "sse") 532 (eq_attr "atom_sse_attr" "movdup"))) 533 "slm-simple-0") 534 535;; lfence 536(define_insn_reservation "slm_sse_3" 1 537 (and (eq_attr "cpu" "slm") 538 (and (eq_attr "type" "sse") 539 (eq_attr "atom_sse_attr" "lfence"))) 540 "slm-simple-either") 541 542;; sfence,clflush,mfence, prefetch 543(define_insn_reservation "slm_sse_4" 1 544 (and (eq_attr "cpu" "slm") 545 (and (eq_attr "type" "sse") 546 (ior (eq_attr "atom_sse_attr" "fence") 547 (eq_attr "atom_sse_attr" "prefetch")))) 548 "slm-simple-0") 549 550;; rcpps, rsqrtss, sqrt, ldmxcsr 551(define_insn_reservation "slm_sse_5" 9 552 (and (eq_attr "cpu" "slm") 553 (and (eq_attr "type" "sse") 554 (ior (ior (eq_attr "atom_sse_attr" "sqrt") 555 (eq_attr "atom_sse_attr" "mxcsr")) 556 (and (eq_attr "atom_sse_attr" "rcp") 557 (eq_attr "mode" "V4SF"))))) 558 "slm-complex, slm-all-eu*7, nothing") 559 560;; xmm->xmm 561(define_insn_reservation "slm_ssemov" 1 562 (and (eq_attr "cpu" "slm") 563 (and (eq_attr "type" "ssemov") 564 (and (match_operand 0 "register_operand" "xy") 565 (match_operand 1 "register_operand" "xy")))) 566 "slm-simple-either") 567 568;; reg->xmm 569(define_insn_reservation "slm_ssemov_2" 1 570 (and (eq_attr "cpu" "slm") 571 (and (eq_attr "type" "ssemov") 572 (and (match_operand 0 "register_operand" "xy") 573 (match_operand 1 "register_operand" "r")))) 574 "slm-simple-0") 575 576;; xmm->reg 577(define_insn_reservation "slm_ssemov_3" 3 578 (and (eq_attr "cpu" "slm") 579 (and (eq_attr "type" "ssemov") 580 (and (match_operand 0 "register_operand" "r") 581 (match_operand 1 "register_operand" "xy")))) 582 "slm-simple-0, nothing*2") 583 584;; mov mem 585(define_insn_reservation "slm_ssemov_4" 1 586 (and (eq_attr "cpu" "slm") 587 (and (eq_attr "type" "ssemov") 588 (and (eq_attr "movu" "0") (eq_attr "memory" "!none")))) 589 "slm-simple-0") 590 591;; movu mem 592(define_insn_reservation "slm_ssemov_5" 2 593 (and (eq_attr "cpu" "slm") 594 (and (eq_attr "type" "ssemov") 595 (ior (eq_attr "movu" "1") (eq_attr "memory" "!none")))) 596 "slm-simple-0, nothing") 597 598;; no memory simple 599(define_insn_reservation "slm_sseadd" 3 600 (and (eq_attr "cpu" "slm") 601 (and (eq_attr "type" "sseadd") 602 (and (eq_attr "memory" "none") 603 (and (eq_attr "mode" "!V2DF") 604 (eq_attr "atom_unit" "!complex"))))) 605 "slm-fadd-3c") 606 607;; memory simple 608(define_insn_reservation "slm_sseadd_mem" 3 609 (and (eq_attr "cpu" "slm") 610 (and (eq_attr "type" "sseadd") 611 (and (eq_attr "memory" "!none") 612 (and (eq_attr "mode" "!V2DF") 613 (eq_attr "atom_unit" "!complex"))))) 614 "slm-fadd-3c") 615 616;; maxps, minps, *pd, hadd, hsub 617(define_insn_reservation "slm_sseadd_3" 4 618 (and (eq_attr "cpu" "slm") 619 (and (eq_attr "type" "sseadd") 620 (ior (eq_attr "mode" "V2DF") (eq_attr "atom_unit" "complex")))) 621 "slm-fadd-4c") 622 623;; Except dppd/dpps 624(define_insn_reservation "slm_ssemul" 5 625 (and (eq_attr "cpu" "slm") 626 (and (eq_attr "type" "ssemul") 627 (eq_attr "mode" "!SF"))) 628 "slm-fmul-5c") 629 630;; Except dppd/dpps, 4 cycle if mulss 631(define_insn_reservation "slm_ssemul_2" 4 632 (and (eq_attr "cpu" "slm") 633 (and (eq_attr "type" "ssemul") 634 (eq_attr "mode" "SF"))) 635 "slm-fmul-4c") 636 637(define_insn_reservation "slm_ssecmp" 1 638 (and (eq_attr "cpu" "slm") 639 (eq_attr "type" "ssecmp")) 640 "slm-simple-either") 641 642(define_insn_reservation "slm_ssecomi" 1 643 (and (eq_attr "cpu" "slm") 644 (eq_attr "type" "ssecomi")) 645 "slm-simple-0") 646 647;; no memory and cvtpi2ps, cvtps2pi, cvttps2pi 648(define_insn_reservation "slm_ssecvt" 5 649 (and (eq_attr "cpu" "slm") 650 (and (eq_attr "type" "ssecvt") 651 (ior (and (match_operand:V2SI 0 "register_operand") 652 (match_operand:V4SF 1 "register_operand")) 653 (and (match_operand:V4SF 0 "register_operand") 654 (match_operand:V2SI 1 "register_operand"))))) 655 "slm-fp-0, slm-feu-0, nothing*3") 656 657;; memory and cvtpi2ps, cvtps2pi, cvttps2pi 658(define_insn_reservation "slm_ssecvt_mem" 5 659 (and (eq_attr "cpu" "slm") 660 (and (eq_attr "type" "ssecvt") 661 (ior (and (match_operand:V2SI 0 "register_operand") 662 (match_operand:V4SF 1 "memory_operand")) 663 (and (match_operand:V4SF 0 "register_operand") 664 (match_operand:V2SI 1 "memory_operand"))))) 665"slm-fp-0, slm-feu-0, nothing*3") 666 667;; cvtpd2pi, cvtpi2pd 668(define_insn_reservation "slm_ssecvt_1" 2 669 (and (eq_attr "cpu" "slm") 670 (and (eq_attr "type" "ssecvt") 671 (ior (and (match_operand:V2DF 0 "register_operand") 672 (match_operand:V2SI 1 "register_operand")) 673 (and (match_operand:V2SI 0 "register_operand") 674 (match_operand:V2DF 1 "register_operand"))))) 675 "slm-fp-0, slm-feu-0") 676 677;; memory and cvtpd2pi, cvtpi2pd 678(define_insn_reservation "slm_ssecvt_1_mem" 2 679 (and (eq_attr "cpu" "slm") 680 (and (eq_attr "type" "ssecvt") 681 (ior (and (match_operand:V2DF 0 "register_operand") 682 (match_operand:V2SI 1 "memory_operand")) 683 (and (match_operand:V2SI 0 "register_operand") 684 (match_operand:V2DF 1 "memory_operand"))))) 685 "slm-fp-0, slm-feu-0") 686 687;; otherwise. 4 cycles average for cvtss2sd 688(define_insn_reservation "slm_ssecvt_3" 4 689 (and (eq_attr "cpu" "slm") 690 (and (eq_attr "type" "ssecvt") 691 (not (ior (and (match_operand:V2SI 0 "register_operand") 692 (match_operand:V4SF 1 "nonimmediate_operand")) 693 (and (match_operand:V4SF 0 "register_operand") 694 (match_operand:V2SI 1 "nonimmediate_operand")))))) 695 "slm-fp-0, nothing*3") 696 697;; memory and cvtsi2sd 698(define_insn_reservation "slm_sseicvt" 1 699 (and (eq_attr "cpu" "slm") 700 (and (eq_attr "type" "sseicvt") 701 (and (match_operand:V2DF 0 "register_operand") 702 (match_operand:SI 1 "nonimmediate_operand")))) 703 "slm-fp-0") 704 705;; otherwise. 8 cycles average for cvtsd2si 706(define_insn_reservation "slm_sseicvt_2" 4 707 (and (eq_attr "cpu" "slm") 708 (and (eq_attr "type" "sseicvt") 709 (not (and (match_operand:V2DF 0 "register_operand") 710 (match_operand:SI 1 "memory_operand"))))) 711 "slm-fp-0, nothing*3") 712 713(define_insn_reservation "slm_ssediv" 13 714 (and (eq_attr "cpu" "slm") 715 (eq_attr "type" "ssediv")) 716 "slm-fp-0, slm-feu-0*10, nothing*2") 717 718;; simple for fmov 719(define_insn_reservation "slm_fmov" 1 720 (and (eq_attr "cpu" "slm") 721 (and (eq_attr "type" "fmov") 722 (eq_attr "memory" "none"))) 723 "slm-simple-either") 724 725;; simple for fmov 726(define_insn_reservation "slm_fmov_mem" 1 727 (and (eq_attr "cpu" "slm") 728 (and (eq_attr "type" "fmov") 729 (eq_attr "memory" "!none"))) 730 "slm-simple-either") 731 732;; Define bypass here 733 734;; There will be 0 cycle stall from cmp/test to jcc 735 736;; There will be 1 cycle stall from flag producer to cmov and adc/sbb 737(define_bypass 2 "slm_icmp, slm_test, slm_alu, slm_alu_carry, 738 slm_alu1, slm_negnot, slm_incdec, slm_ishift, 739 slm_ishift1, slm_rotate, slm_rotate1" 740 "slm_icmov, slm_alu_carry") 741 742;; lea to shift source stall is 1 cycle 743(define_bypass 2 "slm_lea" 744 "slm_ishift, slm_ishift1, slm_rotate, slm_rotate1" 745 "!ix86_dep_by_shift_count") 746 747;; non-lea to shift count stall is 1 cycle 748(define_bypass 2 "slm_alu_carry, 749 slm_alu,slm_alu1,slm_negnot,slm_imov,slm_imovx, 750 slm_incdec,slm_ishift,slm_ishift1,slm_rotate, 751 slm_rotate1, slm_setcc, slm_icmov, slm_pop, 752 slm_alu_mem, slm_alu_carry_mem, slm_alu1_mem, 753 slm_imovx_mem, slm_imovx_2_mem, 754 slm_imov_mem, slm_icmov_mem, slm_fmov_mem" 755 "slm_ishift, slm_ishift1, slm_rotate, slm_rotate1, 756 slm_ishift_mem, slm_ishift1_mem, 757 slm_rotate_mem, slm_rotate1_mem" 758 "ix86_dep_by_shift_count") 759