162216Sdes;; Machine description for AppliedMicro xgene1 core. 216504Sasami;; Copyright (C) 2012-2015 Free Software Foundation, Inc. 3156813Sru;; Contributed by Theobroma Systems Design und Consulting GmbH. 4156813Sru;; 562216Sdes;; This file is part of GCC. 6114422Sdes;; 7240496Sdes;; GCC is free software; you can redistribute it and/or modify it 8240496Sdes;; under the terms of the GNU General Public License as published by 9240496Sdes;; the Free Software Foundation; either version 3, or (at your option) 10240496Sdes;; any later version. 11204352Sru;; 12204352Sru;; GCC is distributed in the hope that it will be useful, but 1397888Sdes;; WITHOUT ANY WARRANTY; without even the implied warranty of 1416783Sgpalmer;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1516504Sasami;; General Public License for more details. 16;; 17;; You should have received a copy of the GNU General Public License 18;; along with GCC; see the file COPYING3. If not see 19;; <http://www.gnu.org/licenses/>. 20 21;; Pipeline description for the xgene1 micro-architecture 22 23(define_automaton "xgene1") 24 25(define_cpu_unit "xgene1_decode_out0" "xgene1") 26(define_cpu_unit "xgene1_decode_out1" "xgene1") 27(define_cpu_unit "xgene1_decode_out2" "xgene1") 28(define_cpu_unit "xgene1_decode_out3" "xgene1") 29 30(define_cpu_unit "xgene1_divide" "xgene1") 31(define_cpu_unit "xgene1_fp_divide" "xgene1") 32(define_cpu_unit "xgene1_fsu" "xgene1") 33(define_cpu_unit "xgene1_fcmp" "xgene1") 34 35(define_reservation "xgene1_decode1op" 36 "( xgene1_decode_out0 ) 37 |( xgene1_decode_out1 ) 38 |( xgene1_decode_out2 ) 39 |( xgene1_decode_out3 )" 40) 41(define_reservation "xgene1_decode2op" 42 "( xgene1_decode_out0 + xgene1_decode_out1 ) 43 |( xgene1_decode_out0 + xgene1_decode_out2 ) 44 |( xgene1_decode_out0 + xgene1_decode_out3 ) 45 |( xgene1_decode_out1 + xgene1_decode_out2 ) 46 |( xgene1_decode_out1 + xgene1_decode_out3 ) 47 |( xgene1_decode_out2 + xgene1_decode_out3 )" 48) 49(define_reservation "xgene1_decodeIsolated" 50 "( xgene1_decode_out0 + xgene1_decode_out1 + xgene1_decode_out2 + xgene1_decode_out3 )" 51) 52 53(define_insn_reservation "xgene1_branch" 1 54 (and (eq_attr "tune" "xgene1") 55 (eq_attr "type" "branch")) 56 "xgene1_decode1op") 57 58(define_insn_reservation "xgene1_nop" 1 59 (and (eq_attr "tune" "xgene1") 60 (eq_attr "type" "no_insn")) 61 "xgene1_decode1op") 62 63(define_insn_reservation "xgene1_call" 1 64 (and (eq_attr "tune" "xgene1") 65 (eq_attr "type" "call")) 66 "xgene1_decode2op") 67 68(define_insn_reservation "xgene1_f_load" 10 69 (and (eq_attr "tune" "xgene1") 70 (eq_attr "type" "f_loadd,f_loads")) 71 "xgene1_decode2op") 72 73(define_insn_reservation "xgene1_f_store" 4 74 (and (eq_attr "tune" "xgene1") 75 (eq_attr "type" "f_stored,f_stores")) 76 "xgene1_decode2op") 77 78(define_insn_reservation "xgene1_fmov" 2 79 (and (eq_attr "tune" "xgene1") 80 (eq_attr "type" "fmov,fconsts,fconstd")) 81 "xgene1_decode1op") 82 83(define_insn_reservation "xgene1_f_mcr" 10 84 (and (eq_attr "tune" "xgene1") 85 (eq_attr "type" "f_mcr")) 86 "xgene1_decodeIsolated") 87 88(define_insn_reservation "xgene1_f_mrc" 4 89 (and (eq_attr "tune" "xgene1") 90 (eq_attr "type" "f_mrc")) 91 "xgene1_decode2op") 92 93(define_insn_reservation "xgene1_load_pair" 6 94 (and (eq_attr "tune" "xgene1") 95 (eq_attr "type" "load2")) 96 "xgene1_decodeIsolated") 97 98(define_insn_reservation "xgene1_store_pair" 2 99 (and (eq_attr "tune" "xgene1") 100 (eq_attr "type" "store2")) 101 "xgene1_decodeIsolated") 102 103(define_insn_reservation "xgene1_fp_load1" 10 104 (and (eq_attr "tune" "xgene1") 105 (eq_attr "type" "load1") 106 (eq_attr "fp" "yes")) 107 "xgene1_decode1op") 108 109(define_insn_reservation "xgene1_load1" 5 110 (and (eq_attr "tune" "xgene1") 111 (eq_attr "type" "load1")) 112 "xgene1_decode1op") 113 114(define_insn_reservation "xgene1_store1" 2 115 (and (eq_attr "tune" "xgene1") 116 (eq_attr "type" "store1")) 117 "xgene1_decode2op") 118 119(define_insn_reservation "xgene1_move" 1 120 (and (eq_attr "tune" "xgene1") 121 (eq_attr "type" "mov_reg,mov_imm,mrs")) 122 "xgene1_decode1op") 123 124(define_insn_reservation "xgene1_alu" 1 125 (and (eq_attr "tune" "xgene1") 126 (eq_attr "type" "alu_imm,alu_sreg,alu_shift_imm,\ 127 alu_ext,adc_reg,csel,logic_imm,\ 128 logic_reg,logic_shift_imm,clz,\ 129 rbit,shift_reg,adr,mov_reg,\ 130 mov_imm,extend")) 131 "xgene1_decode1op") 132 133(define_insn_reservation "xgene1_simd" 1 134 (and (eq_attr "tune" "xgene1") 135 (eq_attr "type" "rev")) 136 "xgene1_decode1op") 137 138(define_insn_reservation "xgene1_alus" 1 139 (and (eq_attr "tune" "xgene1") 140 (eq_attr "type" "alus_imm,alu_sreg,alus_shift_imm,\ 141 alus_ext,logics_imm,logics_reg,\ 142 logics_shift_imm")) 143 "xgene1_decode1op") 144 145(define_insn_reservation "xgene1_mul" 6 146 (and (eq_attr "tune" "xgene1") 147 (eq_attr "type" "mul,mla,smull,umull,smlal,umlal")) 148 "xgene1_decode2op") 149 150(define_insn_reservation "xgene1_div" 34 151 (and (eq_attr "tune" "xgene1") 152 (eq_attr "type" "sdiv,udiv")) 153 "xgene1_decode1op,xgene1_divide*7") 154 155(define_insn_reservation "xgene1_fcmp" 10 156 (and (eq_attr "tune" "xgene1") 157 (eq_attr "type" "fcmpd,fcmps")) 158 "xgene1_decode1op,xgene1_fsu+xgene1_fcmp*3") 159 160(define_insn_reservation "xgene1_fcsel" 3 161 (and (eq_attr "tune" "xgene1") 162 (eq_attr "type" "fcsel")) 163 "xgene1_decode1op,xgene1_fsu") 164 165(define_insn_reservation "xgene1_bfm" 2 166 (and (eq_attr "tune" "xgene1") 167 (eq_attr "type" "bfm")) 168 "xgene1_decode1op,xgene1_fsu") 169 170(define_insn_reservation "xgene1_f_rint" 5 171 (and (eq_attr "tune" "xgene1") 172 (eq_attr "type" "f_rintd,f_rints")) 173 "xgene1_decode1op,xgene1_fsu") 174 175(define_insn_reservation "xgene1_f_cvt" 3 176 (and (eq_attr "tune" "xgene1") 177 (eq_attr "type" "f_cvt")) 178 "xgene1_decode1op,xgene1_fsu") 179 180(define_insn_reservation "xgene1_f_cvtf2i" 11 181 (and (eq_attr "tune" "xgene1") 182 (eq_attr "type" "f_cvtf2i")) 183 "xgene1_decodeIsolated,xgene1_fsu") 184 185(define_insn_reservation "xgene1_f_cvti2f" 14 186 (and (eq_attr "tune" "xgene1") 187 (eq_attr "type" "f_cvti2f")) 188 "xgene1_decodeIsolated,xgene1_fsu") 189 190(define_insn_reservation "xgene1_f_add" 5 191 (and (eq_attr "tune" "xgene1") 192 (eq_attr "type" "faddd,fadds,fmuld,fmuls")) 193 "xgene1_decode1op,xgene1_fsu") 194 195(define_insn_reservation "xgene1_f_divs" 22 196 (and (eq_attr "tune" "xgene1") 197 (eq_attr "type" "fdivs,fsqrts")) 198 "xgene1_decode1op,(xgene1_fp_divide+xgene1_fsu)*8,xgene1_fp_divide*14") 199 200(define_insn_reservation "xgene1_f_divd" 28 201 (and (eq_attr "tune" "xgene1") 202 (eq_attr "type" "fdivd")) 203 "xgene1_decode1op,(xgene1_fp_divide+xgene1_fsu)*11,xgene1_fp_divide*17") 204 205(define_insn_reservation "xgene1_f_sqrtd" 28 206 (and (eq_attr "tune" "xgene1") 207 (eq_attr "type" "fsqrtd")) 208 "xgene1_decode1op,(xgene1_fp_divide+xgene1_fsu)*17,xgene1_fp_divide*11") 209 210(define_insn_reservation "xgene1_f_arith" 2 211 (and (eq_attr "tune" "xgene1") 212 (eq_attr "type" "ffarithd,ffariths")) 213 "xgene1_decode1op,xgene1_fsu") 214 215(define_insn_reservation "xgene1_f_select" 3 216 (and (eq_attr "tune" "xgene1") 217 (eq_attr "type" "f_minmaxd,f_minmaxs")) 218 "xgene1_decode1op,xgene1_fsu") 219 220(define_insn_reservation "xgene1_neon_dup" 3 221 (and (eq_attr "tune" "xgene1") 222 (eq_attr "type" "neon_dup,neon_dup_q")) 223 "xgene1_decode1op,xgene1_fsu") 224 225(define_insn_reservation "xgene1_neon_load1" 11 226 (and (eq_attr "tune" "xgene1") 227 (eq_attr "type" "neon_load1_1reg, neon_load1_1reg_q")) 228 "xgene1_decode2op,xgene1_fsu") 229 230(define_insn_reservation "xgene1_neon_store1" 5 231 (and (eq_attr "tune" "xgene1") 232 (eq_attr "type" "neon_store1_1reg, neon_store1_1reg_q")) 233 "xgene1_decode2op,xgene1_fsu") 234 235(define_insn_reservation "xgene1_neon_logic" 2 236 (and (eq_attr "tune" "xgene1") 237 (eq_attr "type" "neon_logic,\ 238 neon_logic_q,\ 239 neon_bsl,\ 240 neon_bsl_q,\ 241 neon_move,\ 242 neon_move_q,\ 243 ")) 244 "xgene1_decode1op,xgene1_fsu") 245 246(define_insn_reservation "xgene1_neon_umov" 7 247 (and (eq_attr "tune" "xgene1") 248 (eq_attr "type" "neon_to_gp, neon_to_gp_q")) 249 "xgene1_decodeIsolated") 250 251(define_insn_reservation "xgene1_neon_ins" 14 252 (and (eq_attr "tune" "xgene1") 253 (eq_attr "type" "neon_from_gp,\ 254 neon_from_gp_q,\ 255 neon_ins,\ 256 neon_ins_q,\ 257 ")) 258 "xgene1_decodeIsolated,xgene1_fsu") 259 260(define_insn_reservation "xgene1_neon_shift" 3 261 (and (eq_attr "tune" "xgene1") 262 (eq_attr "type" "neon_shift_imm,\ 263 neon_shift_imm_q,\ 264 neon_shift_reg,\ 265 neon_shift_reg_q,\ 266 neon_shift_imm_long,\ 267 neon_sat_shift_imm,\ 268 neon_sat_shift_imm_q,\ 269 neon_sat_shift_imm_narrow_q,\ 270 neon_sat_shift_reg,\ 271 neon_sat_shift_reg_q,\ 272 neon_shift_imm_narrow_q,\ 273 ")) 274 "xgene1_decode1op,xgene1_fsu") 275 276(define_insn_reservation "xgene1_neon_arith" 3 277 (and (eq_attr "tune" "xgene1") 278 (eq_attr "type" "neon_add,\ 279 neon_add_q,\ 280 neon_sub,\ 281 neon_sub_q,\ 282 neon_neg,\ 283 neon_neg_q,\ 284 neon_abs,\ 285 neon_abs_q,\ 286 neon_abd_q,\ 287 neon_arith_acc,\ 288 neon_arith_acc_q,\ 289 neon_reduc_add,\ 290 neon_reduc_add_q,\ 291 neon_add_halve,\ 292 neon_add_halve_q,\ 293 neon_sub_halve,\ 294 neon_sub_halve_q,\ 295 neon_qadd,\ 296 neon_qadd_q,\ 297 neon_compare,\ 298 neon_compare_q,\ 299 neon_compare_zero,\ 300 neon_compare_zero_q,\ 301 neon_tst,\ 302 neon_tst_q,\ 303 ")) 304 "xgene1_decode1op,xgene1_fsu") 305 306(define_insn_reservation "xgene1_neon_abs_diff" 6 307 (and (eq_attr "tune" "xgene1") 308 (eq_attr "type" "neon_arith_acc,neon_arith_acc_q")) 309 "xgene1_decode2op,xgene1_fsu*2") 310 311(define_insn_reservation "xgene1_neon_mul" 5 312 (and (eq_attr "tune" "xgene1") 313 (eq_attr "type" "neon_mul_b,\ 314 neon_mul_b_q,\ 315 neon_mul_h,\ 316 neon_mul_h_q,\ 317 neon_mul_s,\ 318 neon_mul_s_q,\ 319 neon_fp_mul_s_scalar,\ 320 neon_fp_mul_s_scalar_q,\ 321 neon_fp_mul_d_scalar_q,\ 322 neon_mla_b,neon_mla_b_q,\ 323 neon_mla_h,neon_mla_h_q,\ 324 neon_mla_s,neon_mla_s_q,\ 325 neon_mla_h_scalar,\ 326 neon_mla_h_scalar_q,\ 327 neon_mla_s_scalar,\ 328 neon_mla_s_scalar_q,\ 329 neon_mla_b_long,\ 330 neon_mla_h_long,\ 331 neon_mla_s_long,\ 332 neon_fp_mul_s,\ 333 neon_fp_mul_s_q,\ 334 neon_fp_mul_d,\ 335 neon_fp_mul_d_q,\ 336 neon_fp_mla_s,\ 337 neon_fp_mla_s_q,\ 338 neon_fp_mla_d,\ 339 neon_fp_mla_d_q,\ 340 neon_fp_mla_s_scalar,\ 341 neon_fp_mla_s_scalar_q,\ 342 neon_fp_mla_d_scalar_q,\ 343 neon_sat_mul_b,\ 344 neon_sat_mul_b_q,\ 345 neon_sat_mul_h,\ 346 neon_sat_mul_h_q,\ 347 neon_sat_mul_s,\ 348 neon_sat_mul_s_q,\ 349 neon_sat_mul_h_scalar,\ 350 neon_sat_mul_h_scalar_q,\ 351 neon_sat_mul_s_scalar,\ 352 neon_sat_mul_s_scalar_q,\ 353 neon_sat_mul_h_scalar_long,\ 354 neon_sat_mul_s_scalar_long,\ 355 neon_sat_mla_b_long,\ 356 neon_sat_mla_h_long,\ 357 neon_sat_mla_s_long,\ 358 neon_sat_mla_h_scalar_long,\ 359 neon_sat_mla_s_scalar_long,\ 360 ")) 361 "xgene1_decode2op,xgene1_fsu*2") 362 363(define_insn_reservation "xgene1_fp_abd_diff" 5 364 (and (eq_attr "tune" "xgene1") 365 (eq_attr "type" "neon_fp_abd_s,\ 366 neon_fp_abd_s_q,\ 367 neon_fp_abd_d,\ 368 neon_fp_abd_d_q,\ 369 ")) 370 "xgene1_decode1op,xgene1_fsu") 371 372(define_insn_reservation "xgene1_neon_f_add" 5 373 (and (eq_attr "tune" "xgene1") 374 (eq_attr "type" "neon_fp_addsub_s,\ 375 neon_fp_addsub_s_q,\ 376 neon_fp_addsub_d,\ 377 neon_fp_addsub_d_q,\ 378 ")) 379 "xgene1_decode1op") 380 381(define_insn_reservation "xgene1_neon_f_div" 2 382 (and (eq_attr "tune" "xgene1") 383 (eq_attr "type" "neon_fp_div_s,\ 384 neon_fp_div_s_q,\ 385 neon_fp_div_d,\ 386 neon_fp_div_d_q,\ 387 ")) 388 "xgene1_decode1op,(xgene1_fsu+xgene1_fp_divide)") 389 390(define_insn_reservation "xgene1_neon_f_neg" 2 391 (and (eq_attr "tune" "xgene1") 392 (eq_attr "type" "neon_fp_neg_s,\ 393 neon_fp_neg_s_q,\ 394 neon_fp_neg_d,\ 395 neon_fp_neg_d_q,\ 396 neon_fp_abs_s,\ 397 neon_fp_abs_s_q,\ 398 neon_fp_abs_d,\ 399 neon_fp_abs_d_q,\ 400 ")) 401 "xgene1_decode1op") 402 403(define_insn_reservation "xgene1_neon_f_round" 5 404 (and (eq_attr "tune" "xgene1") 405 (eq_attr "type" "neon_fp_round_s,\ 406 neon_fp_round_s_q,\ 407 neon_fp_round_d,\ 408 neon_fp_round_d_q,\ 409 ")) 410 "xgene1_decode1op") 411 412(define_insn_reservation "xgene1_neon_f_cvt" 5 413 (and (eq_attr "tune" "xgene1") 414 (eq_attr "type" "neon_int_to_fp_s,\ 415 neon_int_to_fp_s_q,\ 416 neon_int_to_fp_d,\ 417 neon_int_to_fp_d_q,\ 418 neon_fp_cvt_widen_s,\ 419 neon_fp_cvt_narrow_s_q,\ 420 neon_fp_cvt_narrow_d_q,\ 421 ")) 422 "xgene1_decode1op") 423 424(define_insn_reservation "xgene1_neon_f_reduc" 5 425 (and (eq_attr "tune" "xgene1") 426 (eq_attr "type" "neon_fp_reduc_add_s,\ 427 neon_fp_reduc_add_s_q,\ 428 neon_fp_reduc_add_d,\ 429 neon_fp_reduc_add_d_q,\ 430 ")) 431 "xgene1_decode1op") 432 433(define_insn_reservation "xgene1_neon_cls" 2 434 (and (eq_attr "tune" "xgene1") 435 (eq_attr "type" "neon_cls,neon_cls_q")) 436 "xgene1_decode1op") 437 438(define_insn_reservation "xgene1_neon_st1" 4 439 (and (eq_attr "tune" "xgene1") 440 (eq_attr "type" "neon_store1_one_lane,\ 441 neon_store1_one_lane_q,\ 442 ")) 443 "xgene1_decode1op") 444 445(define_insn_reservation "xgene1_neon_halve_narrow" 6 446 (and (eq_attr "tune" "xgene1") 447 (eq_attr "type" "neon_sub_halve_narrow_q,\ 448 neon_add_halve_narrow_q,\ 449 ")) 450 "xgene1_decodeIsolated") 451 452(define_insn_reservation "xgene1_neon_shift_acc" 6 453 (and (eq_attr "tune" "xgene1") 454 (eq_attr "type" "neon_shift_acc,\ 455 neon_shift_acc_q,\ 456 ")) 457 "xgene1_decode2op") 458 459(define_insn_reservation "xgene1_neon_fp_compare" 3 460 (and (eq_attr "tune" "xgene1") 461 (eq_attr "type" "neon_fp_compare_s,\ 462 neon_fp_compare_s_q,\ 463 neon_fp_compare_d,\ 464 neon_fp_compare_d_q,\ 465 ")) 466 "xgene1_decode1op") 467 468(define_insn_reservation "xgene1_neon_fp_sqrt" 2 469 (and (eq_attr "tune" "xgene1") 470 (eq_attr "type" "neon_fp_sqrt_s,\ 471 neon_fp_sqrt_s_q,\ 472 neon_fp_sqrt_d,\ 473 neon_fp_sqrt_d_q,\ 474 ")) 475 "xgene1_decode1op,(xgene1_fsu+xgene1_fp_divide)") 476 477(define_insn_reservation "xgene1_neon_tbl1" 4 478 (and (eq_attr "tune" "xgene1") 479 (eq_attr "type" "neon_tbl1,\ 480 neon_tbl1_q,\ 481 ")) 482 "xgene1_decode2op") 483 484(define_insn_reservation "xgene1_neon_tbl2" 8 485 (and (eq_attr "tune" "xgene1") 486 (eq_attr "type" "neon_tbl2,\ 487 neon_tbl2_q,\ 488 ")) 489 "xgene1_decodeIsolated") 490 491(define_insn_reservation "xgene1_neon_permute" 3 492 (and (eq_attr "tune" "xgene1") 493 (eq_attr "type" "neon_permute,\ 494 neon_permute_q,\ 495 ")) 496 "xgene1_decode2op") 497 498(define_insn_reservation "xgene1_neon_ld1r" 10 499 (and (eq_attr "tune" "xgene1") 500 (eq_attr "type" "neon_load1_all_lanes,\ 501 ")) 502 "xgene1_decode1op") 503 504(define_insn_reservation "xgene1_neon_fp_recp" 3 505 (and (eq_attr "tune" "xgene1") 506 (eq_attr "type" "neon_fp_recpe_s,\ 507 neon_fp_recpe_s_q,\ 508 neon_fp_recpe_d,\ 509 neon_fp_recpe_d_q,\ 510 neon_fp_recpx_s,\ 511 neon_fp_recpx_s_q,\ 512 neon_fp_recpx_d,\ 513 neon_fp_recpx_d_q,\ 514 ")) 515 "xgene1_decode1op") 516 517 518(define_insn_reservation "xgene1_neon_fp_recp_s" 5 519 (and (eq_attr "tune" "xgene1") 520 (eq_attr "type" "neon_fp_recps_s,\ 521 neon_fp_recps_s_q,\ 522 neon_fp_recps_d,\ 523 neon_fp_recps_d_q,\ 524 ")) 525 "xgene1_decode1op") 526 527(define_insn_reservation "xgene1_neon_pmull" 5 528 (and (eq_attr "tune" "xgene1") 529 (eq_attr "type" "neon_mul_d_long,\ 530 ")) 531 "xgene1_decode2op") 532