1;; IA-64 machine description for vector operations. 2;; Copyright (C) 2004, 2005 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 2, 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 COPYING. If not, write to 18;; the Free Software Foundation, 51 Franklin Street, Fifth Floor, 19;; Boston, MA 02110-1301, USA. 20 21 22;; Integer vector operations 23 24(define_mode_macro VECINT [V8QI V4HI V2SI]) 25(define_mode_macro VECINT12 [V8QI V4HI]) 26(define_mode_macro VECINT24 [V4HI V2SI]) 27(define_mode_attr vecsize [(V8QI "1") (V4HI "2") (V2SI "4")]) 28 29(define_expand "mov<mode>" 30 [(set (match_operand:VECINT 0 "general_operand" "") 31 (match_operand:VECINT 1 "general_operand" ""))] 32 "" 33{ 34 rtx op1 = ia64_expand_move (operands[0], operands[1]); 35 if (!op1) 36 DONE; 37 operands[1] = op1; 38}) 39 40(define_insn "*mov<mode>_internal" 41 [(set (match_operand:VECINT 0 "destination_operand" 42 "=r,r,r,r,m ,*f ,*f,Q ,r ,*f") 43 (match_operand:VECINT 1 "move_operand" 44 "rU,W,i,m,rU,U*f,Q ,*f,*f,r "))] 45 "ia64_move_ok (operands[0], operands[1])" 46 "@ 47 mov %0 = %r1 48 addl %0 = %v1, r0 49 movl %0 = %v1 50 ld8%O1 %0 = %1%P1 51 st8%Q0 %0 = %r1%P0 52 mov %0 = %F1 53 ldf8 %0 = %1%P1 54 stf8 %0 = %1%P0 55 getf.sig %0 = %1 56 setf.sig %0 = %1" 57 [(set_attr "itanium_class" "ialu,ialu,long_i,ld,st,fmisc,fld,stf,frfr,tofr")]) 58 59(define_insn "one_cmpl<mode>2" 60 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 61 (not:VECINT (match_operand:VECINT 1 "gr_register_operand" "r")))] 62 "" 63 "andcm %0 = -1, %1" 64 [(set_attr "itanium_class" "ilog")]) 65 66(define_insn "and<mode>3" 67 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 68 (and:VECINT 69 (match_operand:VECINT 1 "grfr_register_operand" "r,*f") 70 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 71 "" 72 "@ 73 and %0 = %2, %1 74 fand %0 = %2, %1" 75 [(set_attr "itanium_class" "ilog,fmisc")]) 76 77(define_insn "*andnot<mode>" 78 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 79 (and:VECINT 80 (not:VECINT (match_operand:VECINT 1 "grfr_register_operand" "r,*f")) 81 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 82 "" 83 "@ 84 andcm %0 = %2, %1 85 fandcm %0 = %2, %1" 86 [(set_attr "itanium_class" "ilog,fmisc")]) 87 88(define_insn "ior<mode>3" 89 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 90 (ior:VECINT 91 (match_operand:VECINT 1 "grfr_register_operand" "r,*f") 92 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 93 "" 94 "@ 95 or %0 = %2, %1 96 for %0 = %2, %1" 97 [(set_attr "itanium_class" "ilog,fmisc")]) 98 99(define_insn "xor<mode>3" 100 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 101 (xor:VECINT 102 (match_operand:VECINT 1 "grfr_register_operand" "r,*f") 103 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 104 "" 105 "@ 106 xor %0 = %2, %1 107 fxor %0 = %2, %1" 108 [(set_attr "itanium_class" "ilog,fmisc")]) 109 110(define_insn "neg<mode>2" 111 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 112 (neg:VECINT (match_operand:VECINT 1 "gr_register_operand" "r")))] 113 "" 114 "psub<vecsize> %0 = r0, %1" 115 [(set_attr "itanium_class" "mmalua")]) 116 117(define_insn "add<mode>3" 118 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 119 (plus:VECINT (match_operand:VECINT 1 "gr_register_operand" "r") 120 (match_operand:VECINT 2 "gr_register_operand" "r")))] 121 "" 122 "padd<vecsize> %0 = %1, %2" 123 [(set_attr "itanium_class" "mmalua")]) 124 125(define_insn "*ssadd<mode>3" 126 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 127 (ss_plus:VECINT12 128 (match_operand:VECINT12 1 "gr_register_operand" "r") 129 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 130 "" 131 "padd<vecsize>.sss %0 = %1, %2" 132 [(set_attr "itanium_class" "mmalua")]) 133 134(define_insn "*usadd<mode>3" 135 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 136 (us_plus:VECINT12 137 (match_operand:VECINT12 1 "gr_register_operand" "r") 138 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 139 "" 140 "padd<vecsize>.uuu %0 = %1, %2" 141 [(set_attr "itanium_class" "mmalua")]) 142 143(define_insn "sub<mode>3" 144 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 145 (minus:VECINT (match_operand:VECINT 1 "gr_register_operand" "r") 146 (match_operand:VECINT 2 "gr_register_operand" "r")))] 147 "" 148 "psub<vecsize> %0 = %1, %2" 149 [(set_attr "itanium_class" "mmalua")]) 150 151(define_insn "*sssub<mode>3" 152 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 153 (ss_minus:VECINT12 154 (match_operand:VECINT12 1 "gr_register_operand" "r") 155 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 156 "" 157 "psub<vecsize>.sss %0 = %1, %2" 158 [(set_attr "itanium_class" "mmalua")]) 159 160(define_insn "*ussub<mode>3" 161 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 162 (us_minus:VECINT12 163 (match_operand:VECINT12 1 "gr_register_operand" "r") 164 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 165 "" 166 "psub<vecsize>.uuu %0 = %1, %2" 167 [(set_attr "itanium_class" "mmalua")]) 168 169(define_expand "mulv8qi3" 170 [(set (match_operand:V8QI 0 "gr_register_operand" "") 171 (mult:V8QI (match_operand:V8QI 1 "gr_register_operand" "r") 172 (match_operand:V8QI 2 "gr_register_operand" "r")))] 173 "" 174{ 175 rtx r1, l1, r2, l2, rm, lm; 176 177 r1 = gen_reg_rtx (V4HImode); 178 l1 = gen_reg_rtx (V4HImode); 179 r2 = gen_reg_rtx (V4HImode); 180 l2 = gen_reg_rtx (V4HImode); 181 182 /* Zero-extend the QImode elements into two words of HImode elements 183 by interleaving them with zero bytes. */ 184 emit_insn (gen_mix1_r (gen_lowpart (V8QImode, r1), 185 operands[1], CONST0_RTX (V8QImode))); 186 emit_insn (gen_mix1_r (gen_lowpart (V8QImode, r2), 187 operands[2], CONST0_RTX (V8QImode))); 188 emit_insn (gen_mix1_l (gen_lowpart (V8QImode, l1), 189 operands[1], CONST0_RTX (V8QImode))); 190 emit_insn (gen_mix1_l (gen_lowpart (V8QImode, l2), 191 operands[2], CONST0_RTX (V8QImode))); 192 193 /* Multiply. */ 194 rm = gen_reg_rtx (V4HImode); 195 lm = gen_reg_rtx (V4HImode); 196 emit_insn (gen_mulv4hi3 (rm, r1, r2)); 197 emit_insn (gen_mulv4hi3 (lm, l1, l2)); 198 199 /* Zap the high order bytes of the HImode elements by overwriting those 200 in one part with the low order bytes of the other. */ 201 emit_insn (gen_mix1_r (operands[0], 202 gen_lowpart (V8QImode, rm), 203 gen_lowpart (V8QImode, lm))); 204 DONE; 205}) 206 207(define_insn "mulv4hi3" 208 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 209 (mult:V4HI (match_operand:V4HI 1 "gr_register_operand" "r") 210 (match_operand:V4HI 2 "gr_register_operand" "r")))] 211 "" 212 "pmpyshr2 %0 = %1, %2, 0" 213 [(set_attr "itanium_class" "mmmul")]) 214 215(define_insn "pmpy2_r" 216 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 217 (mult:V2SI 218 (vec_select:V2SI 219 (sign_extend:V4SI 220 (match_operand:V4HI 1 "gr_register_operand" "r")) 221 (parallel [(const_int 0) (const_int 2)])) 222 (vec_select:V2SI 223 (sign_extend:V4SI 224 (match_operand:V4HI 2 "gr_register_operand" "r")) 225 (parallel [(const_int 0) (const_int 2)]))))] 226 "" 227 "pmpy2.r %0 = %1, %2" 228 [(set_attr "itanium_class" "mmshf")]) 229 230(define_insn "pmpy2_l" 231 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 232 (mult:V2SI 233 (vec_select:V2SI 234 (sign_extend:V4SI 235 (match_operand:V4HI 1 "gr_register_operand" "r")) 236 (parallel [(const_int 1) (const_int 3)])) 237 (vec_select:V2SI 238 (sign_extend:V4SI 239 (match_operand:V4HI 2 "gr_register_operand" "r")) 240 (parallel [(const_int 1) (const_int 3)]))))] 241 "" 242 "pmpy2.l %0 = %1, %2" 243 [(set_attr "itanium_class" "mmshf")]) 244 245(define_expand "umax<mode>3" 246 [(set (match_operand:VECINT 0 "gr_register_operand" "") 247 (umax:VECINT (match_operand:VECINT 1 "gr_register_operand" "") 248 (match_operand:VECINT 2 "gr_register_operand" "")))] 249 "" 250{ 251 if (ia64_expand_vecint_minmax (UMAX, <MODE>mode, operands)) 252 DONE; 253}) 254 255(define_expand "smax<mode>3" 256 [(set (match_operand:VECINT 0 "gr_register_operand" "") 257 (smax:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 258 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 259 "" 260{ 261 if (ia64_expand_vecint_minmax (SMAX, <MODE>mode, operands)) 262 DONE; 263}) 264 265(define_expand "umin<mode>3" 266 [(set (match_operand:VECINT 0 "gr_register_operand" "") 267 (umin:VECINT (match_operand:VECINT 1 "gr_register_operand" "") 268 (match_operand:VECINT 2 "gr_register_operand" "")))] 269 "" 270{ 271 if (ia64_expand_vecint_minmax (UMIN, <MODE>mode, operands)) 272 DONE; 273}) 274 275(define_expand "smin<mode>3" 276 [(set (match_operand:VECINT 0 "gr_register_operand" "") 277 (smin:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 278 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 279 "" 280{ 281 if (ia64_expand_vecint_minmax (SMIN, <MODE>mode, operands)) 282 DONE; 283}) 284 285(define_insn "*umaxv8qi3" 286 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 287 (umax:V8QI (match_operand:V8QI 1 "gr_register_operand" "r") 288 (match_operand:V8QI 2 "gr_register_operand" "r")))] 289 "" 290 "pmax1.u %0 = %1, %2" 291 [(set_attr "itanium_class" "mmshf")]) 292 293(define_insn "*smaxv4hi3" 294 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 295 (smax:V4HI (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 296 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")))] 297 "" 298 "pmax2 %0 = %r1, %r2" 299 [(set_attr "itanium_class" "mmshf")]) 300 301(define_insn "*uminv8qi3" 302 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 303 (umin:V8QI (match_operand:V8QI 1 "gr_register_operand" "r") 304 (match_operand:V8QI 2 "gr_register_operand" "r")))] 305 "" 306 "pmin1.u %0 = %1, %2" 307 [(set_attr "itanium_class" "mmshf")]) 308 309(define_insn "*sminv4hi3" 310 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 311 (smin:V4HI (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 312 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")))] 313 "" 314 "pmin2 %0 = %r1, %r2" 315 [(set_attr "itanium_class" "mmshf")]) 316 317(define_insn "ashl<mode>3" 318 [(set (match_operand:VECINT24 0 "gr_register_operand" "=r") 319 (ashift:VECINT24 320 (match_operand:VECINT24 1 "gr_register_operand" "r") 321 (match_operand:DI 2 "gr_reg_or_5bit_operand" "rn")))] 322 "" 323 "pshl<vecsize> %0 = %1, %2" 324 [(set_attr "itanium_class" "mmshf")]) 325 326(define_insn "ashr<mode>3" 327 [(set (match_operand:VECINT24 0 "gr_register_operand" "=r") 328 (ashiftrt:VECINT24 329 (match_operand:VECINT24 1 "gr_register_operand" "r") 330 (match_operand:DI 2 "gr_reg_or_5bit_operand" "rn")))] 331 "" 332 "pshr<vecsize> %0 = %1, %2" 333 [(set_attr "itanium_class" "mmshf")]) 334 335(define_insn "lshr<mode>3" 336 [(set (match_operand:VECINT24 0 "gr_register_operand" "=r") 337 (lshiftrt:VECINT24 338 (match_operand:VECINT24 1 "gr_register_operand" "r") 339 (match_operand:DI 2 "gr_reg_or_5bit_operand" "rn")))] 340 "" 341 "pshr<vecsize>.u %0 = %1, %2" 342 [(set_attr "itanium_class" "mmshf")]) 343 344(define_expand "vec_shl_<mode>" 345 [(set (match_operand:VECINT 0 "gr_register_operand" "") 346 (ashift:DI (match_operand:VECINT 1 "gr_register_operand" "") 347 (match_operand:DI 2 "gr_reg_or_6bit_operand" "")))] 348 "" 349{ 350 operands[0] = gen_lowpart (DImode, operands[0]); 351 operands[1] = gen_lowpart (DImode, operands[1]); 352}) 353 354(define_expand "vec_shr_<mode>" 355 [(set (match_operand:VECINT 0 "gr_register_operand" "") 356 (lshiftrt:DI (match_operand:VECINT 1 "gr_register_operand" "") 357 (match_operand:DI 2 "gr_reg_or_6bit_operand" "")))] 358 "" 359{ 360 operands[0] = gen_lowpart (DImode, operands[0]); 361 operands[1] = gen_lowpart (DImode, operands[1]); 362}) 363 364(define_expand "widen_usumv8qi3" 365 [(match_operand:V4HI 0 "gr_register_operand" "") 366 (match_operand:V8QI 1 "gr_register_operand" "") 367 (match_operand:V4HI 2 "gr_register_operand" "")] 368 "" 369{ 370 ia64_expand_widen_sum (operands, true); 371 DONE; 372}) 373 374(define_expand "widen_usumv4hi3" 375 [(match_operand:V2SI 0 "gr_register_operand" "") 376 (match_operand:V4HI 1 "gr_register_operand" "") 377 (match_operand:V2SI 2 "gr_register_operand" "")] 378 "" 379{ 380 ia64_expand_widen_sum (operands, true); 381 DONE; 382}) 383 384(define_expand "widen_ssumv8qi3" 385 [(match_operand:V4HI 0 "gr_register_operand" "") 386 (match_operand:V8QI 1 "gr_register_operand" "") 387 (match_operand:V4HI 2 "gr_register_operand" "")] 388 "" 389{ 390 ia64_expand_widen_sum (operands, false); 391 DONE; 392}) 393 394(define_expand "widen_ssumv4hi3" 395 [(match_operand:V2SI 0 "gr_register_operand" "") 396 (match_operand:V4HI 1 "gr_register_operand" "") 397 (match_operand:V2SI 2 "gr_register_operand" "")] 398 "" 399{ 400 ia64_expand_widen_sum (operands, false); 401 DONE; 402}) 403 404(define_expand "udot_prodv8qi" 405 [(match_operand:V2SI 0 "gr_register_operand" "") 406 (match_operand:V8QI 1 "gr_register_operand" "") 407 (match_operand:V8QI 2 "gr_register_operand" "") 408 (match_operand:V2SI 3 "gr_register_operand" "")] 409 "" 410{ 411 ia64_expand_dot_prod_v8qi (operands, true); 412 DONE; 413}) 414 415(define_expand "sdot_prodv8qi" 416 [(match_operand:V2SI 0 "gr_register_operand" "") 417 (match_operand:V8QI 1 "gr_register_operand" "") 418 (match_operand:V8QI 2 "gr_register_operand" "") 419 (match_operand:V2SI 3 "gr_register_operand" "")] 420 "" 421{ 422 ia64_expand_dot_prod_v8qi (operands, false); 423 DONE; 424}) 425 426(define_expand "sdot_prodv4hi" 427 [(match_operand:V2SI 0 "gr_register_operand" "") 428 (match_operand:V4HI 1 "gr_register_operand" "") 429 (match_operand:V4HI 2 "gr_register_operand" "") 430 (match_operand:V2SI 3 "gr_register_operand" "")] 431 "" 432{ 433 rtx l, r, t; 434 435 r = gen_reg_rtx (V2SImode); 436 l = gen_reg_rtx (V2SImode); 437 t = gen_reg_rtx (V2SImode); 438 439 emit_insn (gen_pmpy2_r (r, operands[1], operands[2])); 440 emit_insn (gen_pmpy2_l (l, operands[1], operands[2])); 441 emit_insn (gen_addv2si3 (t, r, operands[3])); 442 emit_insn (gen_addv2si3 (operands[0], t, l)); 443 DONE; 444}) 445 446(define_expand "vcond<mode>" 447 [(set (match_operand:VECINT 0 "gr_register_operand" "") 448 (if_then_else:VECINT 449 (match_operator 3 "" 450 [(match_operand:VECINT 4 "gr_reg_or_0_operand" "") 451 (match_operand:VECINT 5 "gr_reg_or_0_operand" "")]) 452 (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 453 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 454 "" 455{ 456 ia64_expand_vecint_cmov (operands); 457 DONE; 458}) 459 460(define_expand "vcondu<mode>" 461 [(set (match_operand:VECINT 0 "gr_register_operand" "") 462 (if_then_else:VECINT 463 (match_operator 3 "" 464 [(match_operand:VECINT 4 "gr_reg_or_0_operand" "") 465 (match_operand:VECINT 5 "gr_reg_or_0_operand" "")]) 466 (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 467 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 468 "" 469{ 470 ia64_expand_vecint_cmov (operands); 471 DONE; 472}) 473 474(define_insn "*cmpeq_<mode>" 475 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 476 (eq:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "rU") 477 (match_operand:VECINT 2 "gr_reg_or_0_operand" "rU")))] 478 "" 479 "pcmp<vecsize>.eq %0 = %r1, %r2" 480 [(set_attr "itanium_class" "mmalua")]) 481 482(define_insn "*cmpgt_<mode>" 483 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 484 (gt:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "rU") 485 (match_operand:VECINT 2 "gr_reg_or_0_operand" "rU")))] 486 "" 487 "pcmp<vecsize>.gt %0 = %r1, %r2" 488 [(set_attr "itanium_class" "mmalua")]) 489 490(define_insn "pack2_sss" 491 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 492 (vec_concat:V8QI 493 (ss_truncate:V4QI 494 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU")) 495 (ss_truncate:V4QI 496 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU"))))] 497 "" 498 "pack2.sss %0 = %r1, %r2" 499 [(set_attr "itanium_class" "mmshf")]) 500 501(define_insn "*pack2_uss" 502 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 503 (vec_concat:V8QI 504 (us_truncate:V4QI 505 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU")) 506 (us_truncate:V4QI 507 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU"))))] 508 "" 509 "pack2.uss %0 = %r1, %r2" 510 [(set_attr "itanium_class" "mmshf")]) 511 512(define_insn "pack4_sss" 513 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 514 (vec_concat:V4HI 515 (ss_truncate:V2HI 516 (match_operand:V2SI 1 "gr_reg_or_0_operand" "rU")) 517 (ss_truncate:V2HI 518 (match_operand:V2SI 2 "gr_reg_or_0_operand" "rU"))))] 519 "" 520 "pack4.sss %0 = %r1, %r2" 521 [(set_attr "itanium_class" "mmshf")]) 522 523(define_insn "unpack1_l" 524 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 525 (vec_select:V8QI 526 (vec_concat:V16QI 527 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 528 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 529 (parallel [(const_int 0) 530 (const_int 1) 531 (const_int 2) 532 (const_int 3) 533 (const_int 8) 534 (const_int 9) 535 (const_int 10) 536 (const_int 11)])))] 537 "" 538 "unpack1.l %0 = %r2, %r1" 539 [(set_attr "itanium_class" "mmshf")]) 540 541(define_insn "unpack1_h" 542 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 543 (vec_select:V8QI 544 (vec_concat:V16QI 545 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 546 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 547 (parallel [(const_int 4) 548 (const_int 5) 549 (const_int 6) 550 (const_int 7) 551 (const_int 12) 552 (const_int 13) 553 (const_int 14) 554 (const_int 15)])))] 555 "" 556 "unpack1.h %0 = %r2, %r1" 557 [(set_attr "itanium_class" "mmshf")]) 558 559(define_insn "mix1_r" 560 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 561 (vec_select:V8QI 562 (vec_concat:V16QI 563 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 564 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 565 (parallel [(const_int 0) 566 (const_int 8) 567 (const_int 2) 568 (const_int 10) 569 (const_int 4) 570 (const_int 12) 571 (const_int 6) 572 (const_int 14)])))] 573 "" 574 "mix1.r %0 = %r2, %r1" 575 [(set_attr "itanium_class" "mmshf")]) 576 577(define_insn "mix1_l" 578 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 579 (vec_select:V8QI 580 (vec_concat:V16QI 581 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 582 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 583 (parallel [(const_int 1) 584 (const_int 9) 585 (const_int 3) 586 (const_int 11) 587 (const_int 5) 588 (const_int 13) 589 (const_int 7) 590 (const_int 15)])))] 591 "" 592 "mix1.l %0 = %r2, %r1" 593 [(set_attr "itanium_class" "mmshf")]) 594 595(define_insn "*mux1_rev" 596 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 597 (vec_select:V8QI 598 (match_operand:V8QI 1 "gr_register_operand" "r") 599 (parallel [(const_int 7) 600 (const_int 6) 601 (const_int 5) 602 (const_int 4) 603 (const_int 3) 604 (const_int 2) 605 (const_int 1) 606 (const_int 0)])))] 607 "" 608 "mux1 %0 = %1, @rev" 609 [(set_attr "itanium_class" "mmshf")]) 610 611(define_insn "*mux1_mix" 612 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 613 (vec_select:V8QI 614 (match_operand:V8QI 1 "gr_register_operand" "r") 615 (parallel [(const_int 0) 616 (const_int 4) 617 (const_int 2) 618 (const_int 6) 619 (const_int 1) 620 (const_int 5) 621 (const_int 3) 622 (const_int 7)])))] 623 "" 624 "mux1 %0 = %1, @mix" 625 [(set_attr "itanium_class" "mmshf")]) 626 627(define_insn "*mux1_shuf" 628 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 629 (vec_select:V8QI 630 (match_operand:V8QI 1 "gr_register_operand" "r") 631 (parallel [(const_int 0) 632 (const_int 4) 633 (const_int 1) 634 (const_int 5) 635 (const_int 2) 636 (const_int 6) 637 (const_int 3) 638 (const_int 7)])))] 639 "" 640 "mux1 %0 = %1, @shuf" 641 [(set_attr "itanium_class" "mmshf")]) 642 643(define_insn "*mux1_alt" 644 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 645 (vec_select:V8QI 646 (match_operand:V8QI 1 "gr_register_operand" "r") 647 (parallel [(const_int 0) 648 (const_int 2) 649 (const_int 4) 650 (const_int 6) 651 (const_int 1) 652 (const_int 3) 653 (const_int 5) 654 (const_int 7)])))] 655 "" 656 "mux1 %0 = %1, @alt" 657 [(set_attr "itanium_class" "mmshf")]) 658 659(define_insn "*mux1_brcst_v8qi" 660 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 661 (vec_select:V8QI 662 (match_operand:V8QI 1 "gr_register_operand" "r") 663 (parallel [(const_int 0) 664 (const_int 0) 665 (const_int 0) 666 (const_int 0) 667 (const_int 0) 668 (const_int 0) 669 (const_int 0) 670 (const_int 0)])))] 671 "" 672 "mux1 %0 = %1, @brcst" 673 [(set_attr "itanium_class" "mmshf")]) 674 675(define_insn "*mux1_brcst_qi" 676 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 677 (vec_duplicate:V8QI 678 (match_operand:QI 1 "gr_register_operand" "r")))] 679 "" 680 "mux1 %0 = %1, @brcst" 681 [(set_attr "itanium_class" "mmshf")]) 682 683(define_insn "unpack2_l" 684 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 685 (vec_select:V4HI 686 (vec_concat:V8HI 687 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 688 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 689 (parallel [(const_int 0) 690 (const_int 4) 691 (const_int 1) 692 (const_int 5)])))] 693 "" 694 "unpack2.l %0 = %r2, %r1" 695 [(set_attr "itanium_class" "mmshf")]) 696 697(define_insn "unpack2_h" 698 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 699 (vec_select:V4HI 700 (vec_concat:V8HI 701 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 702 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 703 (parallel [(const_int 2) 704 (const_int 6) 705 (const_int 3) 706 (const_int 7)])))] 707 "" 708 "unpack2.h %0 = %r2, %r1" 709 [(set_attr "itanium_class" "mmshf")]) 710 711(define_insn "*mix2_r" 712 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 713 (vec_select:V4HI 714 (vec_concat:V8HI 715 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 716 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 717 (parallel [(const_int 0) 718 (const_int 4) 719 (const_int 2) 720 (const_int 6)])))] 721 "" 722 "mix2.r %0 = %r2, %r1" 723 [(set_attr "itanium_class" "mmshf")]) 724 725(define_insn "*mix2_l" 726 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 727 (vec_select:V4HI 728 (vec_concat:V8HI 729 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 730 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 731 (parallel [(const_int 1) 732 (const_int 5) 733 (const_int 3) 734 (const_int 7)])))] 735 "" 736 "mix2.l %0 = %r2, %r1" 737 [(set_attr "itanium_class" "mmshf")]) 738 739(define_insn "*mux2" 740 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 741 (vec_select:V4HI 742 (match_operand:V4HI 1 "gr_register_operand" "r") 743 (parallel [(match_operand 2 "const_int_2bit_operand" "") 744 (match_operand 3 "const_int_2bit_operand" "") 745 (match_operand 4 "const_int_2bit_operand" "") 746 (match_operand 5 "const_int_2bit_operand" "")])))] 747 "" 748{ 749 int mask; 750 mask = INTVAL (operands[2]); 751 mask |= INTVAL (operands[3]) << 2; 752 mask |= INTVAL (operands[4]) << 4; 753 mask |= INTVAL (operands[5]) << 6; 754 operands[2] = GEN_INT (mask); 755 return "%,mux2 %0 = %1, %2"; 756} 757 [(set_attr "itanium_class" "mmshf")]) 758 759(define_insn "*mux2_brcst_hi" 760 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 761 (vec_duplicate:V4HI 762 (match_operand:HI 1 "gr_register_operand" "r")))] 763 "" 764 "mux2 %0 = %1, 0" 765 [(set_attr "itanium_class" "mmshf")]) 766 767;; Note that mix4.r performs the exact same operation. 768(define_insn "*unpack4_l" 769 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 770 (vec_select:V2SI 771 (vec_concat:V4SI 772 (match_operand:V2SI 1 "gr_reg_or_0_operand" "rU") 773 (match_operand:V2SI 2 "gr_reg_or_0_operand" "rU")) 774 (parallel [(const_int 0) 775 (const_int 2)])))] 776 "" 777 "unpack4.l %0 = %r2, %r1" 778 [(set_attr "itanium_class" "mmshf")]) 779 780;; Note that mix4.l performs the exact same operation. 781(define_insn "*unpack4_h" 782 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 783 (vec_select:V2SI 784 (vec_concat:V4SI 785 (match_operand:V2SI 1 "gr_reg_or_0_operand" "rU") 786 (match_operand:V2SI 2 "gr_reg_or_0_operand" "rU")) 787 (parallel [(const_int 1) 788 (const_int 3)])))] 789 "" 790 "unpack4.h %0 = %r2, %r1" 791 [(set_attr "itanium_class" "mmshf")]) 792 793(define_expand "vec_initv2si" 794 [(match_operand:V2SI 0 "gr_register_operand" "") 795 (match_operand 1 "" "")] 796 "" 797{ 798 rtx op1 = XVECEXP (operands[1], 0, 0); 799 rtx op2 = XVECEXP (operands[1], 0, 1); 800 rtx x; 801 802 if (GET_CODE (op1) == CONST_INT && GET_CODE (op2) == CONST_INT) 803 { 804 rtvec v = rtvec_alloc (2); 805 RTVEC_ELT (v, 0) = TARGET_BIG_ENDIAN ? op2 : op1; 806 RTVEC_ELT (v, 1) = TARGET_BIG_ENDIAN ? op1 : op2;; 807 x = gen_rtx_CONST_VECTOR (V2SImode, v); 808 emit_move_insn (operands[0], x); 809 DONE; 810 } 811 812 if (!gr_reg_or_0_operand (op1, SImode)) 813 op1 = force_reg (SImode, op1); 814 if (!gr_reg_or_0_operand (op2, SImode)) 815 op2 = force_reg (SImode, op2); 816 817 if (TARGET_BIG_ENDIAN) 818 x = gen_rtx_VEC_CONCAT (V2SImode, op2, op1); 819 else 820 x = gen_rtx_VEC_CONCAT (V2SImode, op1, op2); 821 emit_insn (gen_rtx_SET (VOIDmode, operands[0], x)); 822 DONE; 823}) 824 825(define_insn "*vecinit_v2si" 826 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 827 (vec_concat:V2SI 828 (match_operand:SI 1 "gr_reg_or_0_operand" "rO") 829 (match_operand:SI 2 "gr_reg_or_0_operand" "rO")))] 830 "" 831 "unpack4.l %0 = %r2, %r1" 832 [(set_attr "itanium_class" "mmshf")]) 833 834;; Missing operations 835;; padd.uus 836;; pavg 837;; pavgsub 838;; pmpyshr, general form 839;; psad 840;; pshladd 841;; pshradd 842;; psub.uus 843 844;; Floating point vector operations 845 846(define_expand "movv2sf" 847 [(set (match_operand:V2SF 0 "general_operand" "") 848 (match_operand:V2SF 1 "general_operand" ""))] 849 "" 850{ 851 rtx op1 = ia64_expand_move (operands[0], operands[1]); 852 if (!op1) 853 DONE; 854 operands[1] = op1; 855}) 856 857(define_insn "*movv2sf_internal" 858 [(set (match_operand:V2SF 0 "destination_operand" 859 "=f,f,f,Q,*r ,*r,*r,*r,m ,f ,*r") 860 (match_operand:V2SF 1 "move_operand" 861 "fU,Y,Q,f,U*r,W ,i ,m ,*r,*r,f "))] 862 "ia64_move_ok (operands[0], operands[1])" 863{ 864 static const char * const alt[] = { 865 "%,mov %0 = %F1", 866 "%,fpack %0 = %F2, %F1", 867 "%,ldf8 %0 = %1%P1", 868 "%,stf8 %0 = %1%P0", 869 "%,mov %0 = %r1", 870 "%,addl %0 = %v1, r0", 871 "%,movl %0 = %v1", 872 "%,ld8%O1 %0 = %1%P1", 873 "%,st8%Q0 %0 = %r1%P0", 874 "%,setf.sig %0 = %1", 875 "%,getf.sig %0 = %1" 876 }; 877 878 if (which_alternative == 1) 879 { 880 operands[2] = XVECEXP (operands[1], 0, 1); 881 operands[1] = XVECEXP (operands[1], 0, 0); 882 } 883 884 return alt[which_alternative]; 885} 886 [(set_attr "itanium_class" "fmisc,fmisc,fld,stf,ialu,ialu,long_i,ld,st,tofr,frfr")]) 887 888(define_insn "absv2sf2" 889 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 890 (abs:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")))] 891 "" 892 "fpabs %0 = %1" 893 [(set_attr "itanium_class" "fmisc")]) 894 895(define_insn "negv2sf2" 896 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 897 (neg:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")))] 898 "" 899 "fpneg %0 = %1" 900 [(set_attr "itanium_class" "fmisc")]) 901 902(define_insn "*negabsv2sf2" 903 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 904 (neg:V2SF 905 (abs:V2SF (match_operand:V2SF 1 "fr_register_operand" "f"))))] 906 "" 907 "fpnegabs %0 = %1" 908 [(set_attr "itanium_class" "fmisc")]) 909 910;; In order to convince combine to merge plus and mult to a useful fpma, 911;; we need a couple of extra patterns. 912(define_expand "addv2sf3" 913 [(parallel 914 [(set (match_operand:V2SF 0 "fr_register_operand" "") 915 (plus:V2SF (match_operand:V2SF 1 "fr_register_operand" "") 916 (match_operand:V2SF 2 "fr_register_operand" ""))) 917 (use (match_dup 3))])] 918 "" 919{ 920 rtvec v = gen_rtvec (2, CONST1_RTX (SFmode), CONST1_RTX (SFmode)); 921 operands[3] = force_reg (V2SFmode, gen_rtx_CONST_VECTOR (V2SFmode, v)); 922}) 923 924;; The split condition here could be combine_completed, if we had such. 925(define_insn_and_split "*addv2sf3_1" 926 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 927 (plus:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 928 (match_operand:V2SF 2 "fr_register_operand" "f"))) 929 (use (match_operand:V2SF 3 "fr_register_operand" "f"))] 930 "" 931 "#" 932 "reload_completed" 933 [(set (match_dup 0) 934 (plus:V2SF 935 (mult:V2SF (match_dup 1) (match_dup 3)) 936 (match_dup 2)))] 937 "") 938 939(define_insn_and_split "*addv2sf3_2" 940 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 941 (plus:V2SF 942 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 943 (match_operand:V2SF 2 "fr_register_operand" "f")) 944 (match_operand:V2SF 3 "fr_register_operand" "f"))) 945 (use (match_operand:V2SF 4 "" "X"))] 946 "" 947 "#" 948 "" 949 [(set (match_dup 0) 950 (plus:V2SF 951 (mult:V2SF (match_dup 1) (match_dup 2)) 952 (match_dup 3)))] 953 "") 954 955;; In order to convince combine to merge minus and mult to a useful fpms, 956;; we need a couple of extra patterns. 957(define_expand "subv2sf3" 958 [(parallel 959 [(set (match_operand:V2SF 0 "fr_register_operand" "") 960 (minus:V2SF (match_operand:V2SF 1 "fr_register_operand" "") 961 (match_operand:V2SF 2 "fr_register_operand" ""))) 962 (use (match_dup 3))])] 963 "" 964{ 965 rtvec v = gen_rtvec (2, CONST1_RTX (SFmode), CONST1_RTX (SFmode)); 966 operands[3] = force_reg (V2SFmode, gen_rtx_CONST_VECTOR (V2SFmode, v)); 967}) 968 969;; The split condition here could be combine_completed, if we had such. 970(define_insn_and_split "*subv2sf3_1" 971 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 972 (minus:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 973 (match_operand:V2SF 2 "fr_register_operand" "f"))) 974 (use (match_operand:V2SF 3 "fr_register_operand" "f"))] 975 "" 976 "#" 977 "reload_completed" 978 [(set (match_dup 0) 979 (minus:V2SF 980 (mult:V2SF (match_dup 1) (match_dup 3)) 981 (match_dup 2)))] 982 "") 983 984(define_insn_and_split "*subv2sf3_2" 985 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 986 (minus:V2SF 987 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 988 (match_operand:V2SF 2 "fr_register_operand" "f")) 989 (match_operand:V2SF 3 "fr_register_operand" "f"))) 990 (use (match_operand:V2SF 4 "" "X"))] 991 "" 992 "#" 993 "" 994 [(set (match_dup 0) 995 (minus:V2SF 996 (mult:V2SF (match_dup 1) (match_dup 2)) 997 (match_dup 3)))] 998 "") 999 1000(define_insn "mulv2sf3" 1001 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1002 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1003 (match_operand:V2SF 2 "fr_register_operand" "f")))] 1004 "" 1005 "fpmpy %0 = %1, %2" 1006 [(set_attr "itanium_class" "fmac")]) 1007 1008(define_insn "*fpma" 1009 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1010 (plus:V2SF 1011 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1012 (match_operand:V2SF 2 "fr_register_operand" "f")) 1013 (match_operand:V2SF 3 "fr_register_operand" "f")))] 1014 "" 1015 "fpma %0 = %1, %2, %3" 1016 [(set_attr "itanium_class" "fmac")]) 1017 1018(define_insn "*fpms" 1019 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1020 (minus:V2SF 1021 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1022 (match_operand:V2SF 2 "fr_register_operand" "f")) 1023 (match_operand:V2SF 3 "fr_register_operand" "f")))] 1024 "" 1025 "fpms %0 = %1, %2, %3" 1026 [(set_attr "itanium_class" "fmac")]) 1027 1028(define_insn "*fpnmpy" 1029 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1030 (neg:V2SF 1031 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1032 (match_operand:V2SF 2 "fr_register_operand" "f"))))] 1033 "" 1034 "fpnmpy %0 = %1, %2" 1035 [(set_attr "itanium_class" "fmac")]) 1036 1037(define_insn "*fpnma" 1038 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1039 (plus:V2SF 1040 (neg:V2SF 1041 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1042 (match_operand:V2SF 2 "fr_register_operand" "f"))) 1043 (match_operand:V2SF 3 "fr_register_operand" "f")))] 1044 "" 1045 "fpnma %0 = %1, %2, %3" 1046 [(set_attr "itanium_class" "fmac")]) 1047 1048(define_insn "smaxv2sf3" 1049 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1050 (smax:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1051 (match_operand:V2SF 2 "fr_register_operand" "f")))] 1052 "" 1053 "fpmax %0 = %1, %2" 1054 [(set_attr "itanium_class" "fmisc")]) 1055 1056(define_insn "sminv2sf3" 1057 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1058 (smin:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1059 (match_operand:V2SF 2 "fr_register_operand" "f")))] 1060 "" 1061 "fpmin %0 = %1, %2" 1062 [(set_attr "itanium_class" "fmisc")]) 1063 1064(define_expand "reduc_splus_v2sf" 1065 [(match_operand:V2SF 0 "fr_register_operand" "") 1066 (match_operand:V2SF 1 "fr_register_operand" "")] 1067 "" 1068{ 1069 rtx tmp = gen_reg_rtx (V2SFmode); 1070 emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); 1071 emit_insn (gen_addv2sf3 (operands[0], operands[1], tmp)); 1072 DONE; 1073}) 1074 1075(define_expand "reduc_smax_v2sf" 1076 [(match_operand:V2SF 0 "fr_register_operand" "") 1077 (match_operand:V2SF 1 "fr_register_operand" "")] 1078 "" 1079{ 1080 rtx tmp = gen_reg_rtx (V2SFmode); 1081 emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); 1082 emit_insn (gen_smaxv2sf3 (operands[0], operands[1], tmp)); 1083 DONE; 1084}) 1085 1086(define_expand "reduc_smin_v2sf" 1087 [(match_operand:V2SF 0 "fr_register_operand" "") 1088 (match_operand:V2SF 1 "fr_register_operand" "")] 1089 "" 1090{ 1091 rtx tmp = gen_reg_rtx (V2SFmode); 1092 emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); 1093 emit_insn (gen_sminv2sf3 (operands[0], operands[1], tmp)); 1094 DONE; 1095}) 1096 1097(define_expand "vcondv2sf" 1098 [(set (match_operand:V2SF 0 "fr_register_operand" "") 1099 (if_then_else:V2SF 1100 (match_operator 3 "" 1101 [(match_operand:V2SF 4 "fr_reg_or_0_operand" "") 1102 (match_operand:V2SF 5 "fr_reg_or_0_operand" "")]) 1103 (match_operand:V2SF 1 "fr_reg_or_0_operand" "") 1104 (match_operand:V2SF 2 "fr_reg_or_0_operand" "")))] 1105 "" 1106{ 1107 rtx x, cmp; 1108 1109 cmp = gen_reg_rtx (V2SFmode); 1110 PUT_MODE (operands[3], V2SFmode); 1111 emit_insn (gen_rtx_SET (VOIDmode, cmp, operands[3])); 1112 1113 x = gen_rtx_IF_THEN_ELSE (V2SFmode, cmp, operands[1], operands[2]); 1114 emit_insn (gen_rtx_SET (VOIDmode, operands[0], x)); 1115 DONE; 1116}) 1117 1118(define_insn "*fpcmp" 1119 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1120 (match_operator:V2SF 3 "comparison_operator" 1121 [(match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1122 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")]))] 1123 "" 1124 "fpcmp.%D3 %0 = %F1, %F2" 1125 [(set_attr "itanium_class" "fmisc")]) 1126 1127(define_insn "*fselect" 1128 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1129 (if_then_else:V2SF 1130 (match_operand:V2SF 1 "fr_register_operand" "f") 1131 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU") 1132 (match_operand:V2SF 3 "fr_reg_or_0_operand" "fU")))] 1133 "" 1134 "fselect %0 = %F2, %F3, %1" 1135 [(set_attr "itanium_class" "fmisc")]) 1136 1137(define_expand "vec_initv2sf" 1138 [(match_operand:V2SF 0 "fr_register_operand" "") 1139 (match_operand 1 "" "")] 1140 "" 1141{ 1142 rtx op1 = XVECEXP (operands[1], 0, 0); 1143 rtx op2 = XVECEXP (operands[1], 0, 1); 1144 rtx x; 1145 1146 if (GET_CODE (op1) == CONST_DOUBLE && GET_CODE (op2) == CONST_DOUBLE) 1147 { 1148 x = gen_rtx_CONST_VECTOR (V2SFmode, XVEC (operands[1], 0)); 1149 emit_move_insn (operands[0], x); 1150 DONE; 1151 } 1152 1153 if (!fr_reg_or_fp01_operand (op1, SFmode)) 1154 op1 = force_reg (SFmode, op1); 1155 if (!fr_reg_or_fp01_operand (op2, SFmode)) 1156 op2 = force_reg (SFmode, op2); 1157 1158 if (TARGET_BIG_ENDIAN) 1159 emit_insn (gen_fpack (operands[0], op2, op1)); 1160 else 1161 emit_insn (gen_fpack (operands[0], op1, op2)); 1162 DONE; 1163}) 1164 1165(define_insn "fpack" 1166 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1167 (vec_concat:V2SF 1168 (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG") 1169 (match_operand:SF 2 "fr_reg_or_fp01_operand" "fG")))] 1170 "" 1171 "fpack %0 = %F2, %F1" 1172 [(set_attr "itanium_class" "fmisc")]) 1173 1174(define_insn "fswap" 1175 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1176 (vec_select:V2SF 1177 (vec_concat:V4SF 1178 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1179 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1180 (parallel [(const_int 1) (const_int 2)])))] 1181 "" 1182 "fswap %0 = %F1, %F2" 1183 [(set_attr "itanium_class" "fmisc")]) 1184 1185(define_insn "*fmix_l" 1186 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1187 (vec_select:V2SF 1188 (vec_concat:V4SF 1189 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1190 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1191 (parallel [(const_int 1) (const_int 3)])))] 1192 "" 1193 "fmix.l %0 = %F2, %F1" 1194 [(set_attr "itanium_class" "fmisc")]) 1195 1196(define_insn "fmix_r" 1197 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1198 (vec_select:V2SF 1199 (vec_concat:V4SF 1200 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1201 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1202 (parallel [(const_int 0) (const_int 2)])))] 1203 "" 1204 "fmix.r %0 = %F2, %F1" 1205 [(set_attr "itanium_class" "fmisc")]) 1206 1207(define_insn "fmix_lr" 1208 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1209 (vec_select:V2SF 1210 (vec_concat:V4SF 1211 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1212 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1213 (parallel [(const_int 0) (const_int 3)])))] 1214 "" 1215 "fmix.lr %0 = %F2, %F1" 1216 [(set_attr "itanium_class" "fmisc")]) 1217 1218(define_expand "vec_setv2sf" 1219 [(match_operand:V2SF 0 "fr_register_operand" "") 1220 (match_operand:SF 1 "fr_register_operand" "") 1221 (match_operand 2 "const_int_operand" "")] 1222 "" 1223{ 1224 rtx tmp = gen_reg_rtx (V2SFmode); 1225 emit_insn (gen_fpack (tmp, operands[1], CONST0_RTX (SFmode))); 1226 1227 switch (INTVAL (operands[2])) 1228 { 1229 case 0: 1230 emit_insn (gen_fmix_lr (operands[0], tmp, operands[0])); 1231 break; 1232 case 1: 1233 emit_insn (gen_fmix_r (operands[0], operands[0], tmp)); 1234 break; 1235 default: 1236 gcc_unreachable (); 1237 } 1238 DONE; 1239}) 1240 1241(define_insn_and_split "*vec_extractv2sf_0_le" 1242 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,f,m") 1243 (unspec:SF [(match_operand:V2SF 1 "nonimmediate_operand" "rfm,rm,r") 1244 (const_int 0)] 1245 UNSPEC_VECT_EXTR))] 1246 "!TARGET_BIG_ENDIAN" 1247 "#" 1248 "reload_completed" 1249 [(set (match_dup 0) (match_dup 1))] 1250{ 1251 if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1]))) 1252 operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0])); 1253 else if (MEM_P (operands[1])) 1254 operands[1] = adjust_address (operands[1], SFmode, 0); 1255 else 1256 operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1])); 1257}) 1258 1259(define_insn_and_split "*vec_extractv2sf_0_be" 1260 [(set (match_operand:SF 0 "register_operand" "=r,f") 1261 (unspec:SF [(match_operand:V2SF 1 "register_operand" "rf,r") 1262 (const_int 0)] 1263 UNSPEC_VECT_EXTR))] 1264 "TARGET_BIG_ENDIAN" 1265 "#" 1266 "reload_completed" 1267 [(set (match_dup 0) (match_dup 1))] 1268{ 1269 if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1]))) 1270 operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0])); 1271 else 1272 operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1])); 1273}) 1274 1275(define_insn_and_split "*vec_extractv2sf_1" 1276 [(set (match_operand:SF 0 "register_operand" "=r") 1277 (unspec:SF [(match_operand:V2SF 1 "register_operand" "r") 1278 (const_int 1)] 1279 UNSPEC_VECT_EXTR))] 1280 "" 1281 "#" 1282 "reload_completed" 1283 [(const_int 0)] 1284{ 1285 operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); 1286 operands[1] = gen_rtx_REG (DImode, REGNO (operands[1])); 1287 if (TARGET_BIG_ENDIAN) 1288 emit_move_insn (operands[0], operands[1]); 1289 else 1290 emit_insn (gen_lshrdi3 (operands[0], operands[1], GEN_INT (32))); 1291 DONE; 1292}) 1293 1294(define_expand "vec_extractv2sf" 1295 [(set (match_operand:SF 0 "register_operand" "") 1296 (unspec:SF [(match_operand:V2SF 1 "register_operand" "") 1297 (match_operand:DI 2 "const_int_operand" "")] 1298 UNSPEC_VECT_EXTR))] 1299 "" 1300 "") 1301 1302;; Missing operations 1303;; fprcpa 1304;; fpsqrta 1305