1;; IA-64 machine description for vector operations. 2;; Copyright (C) 2004-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 21;; Integer vector operations 22 23(define_mode_iterator VEC [V8QI V4HI V2SI V2SF]) 24(define_mode_iterator VECINT [V8QI V4HI V2SI]) 25(define_mode_iterator VECINT12 [V8QI V4HI]) 26(define_mode_iterator VECINT24 [V4HI V2SI]) 27(define_mode_attr vecsize [(V8QI "1") (V4HI "2") (V2SI "4")]) 28(define_mode_attr vecwider [(V8QI "V4HI") (V4HI "V2SI")]) 29(define_mode_attr vecint 30 [(V8QI "V8QI") (V4HI "V4HI") (V2SI "V2SI") (V2SF "V2SI")]) 31 32(define_expand "mov<mode>" 33 [(set (match_operand:VECINT 0 "general_operand" "") 34 (match_operand:VECINT 1 "general_operand" ""))] 35 "" 36{ 37 rtx op1 = ia64_expand_move (operands[0], operands[1]); 38 if (!op1) 39 DONE; 40 operands[1] = op1; 41}) 42 43(define_insn "*mov<mode>_internal" 44 [(set (match_operand:VECINT 0 "destination_operand" 45 "=r,r,r,r,m ,*f ,*f,Q ,r ,*f") 46 (match_operand:VECINT 1 "move_operand" 47 "rU,W,i,m,rU,U*f,Q ,*f,*f,r "))] 48 "ia64_move_ok (operands[0], operands[1])" 49 "@ 50 mov %0 = %r1 51 addl %0 = %v1, r0 52 movl %0 = %v1 53 ld8%O1 %0 = %1%P1 54 st8%Q0 %0 = %r1%P0 55 mov %0 = %F1 56 ldf8 %0 = %1%P1 57 stf8 %0 = %1%P0 58 getf.sig %0 = %1 59 setf.sig %0 = %1" 60 [(set_attr "itanium_class" "ialu,ialu,long_i,ld,st,fmisc,fld,stf,frfr,tofr")]) 61 62(define_insn "one_cmpl<mode>2" 63 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 64 (not:VECINT (match_operand:VECINT 1 "gr_register_operand" "r")))] 65 "" 66 "andcm %0 = -1, %1" 67 [(set_attr "itanium_class" "ilog")]) 68 69(define_insn "and<mode>3" 70 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 71 (and:VECINT 72 (match_operand:VECINT 1 "grfr_register_operand" "r,*f") 73 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 74 "" 75 "@ 76 and %0 = %2, %1 77 fand %0 = %2, %1" 78 [(set_attr "itanium_class" "ilog,fmisc")]) 79 80(define_insn "*andnot<mode>" 81 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 82 (and:VECINT 83 (not:VECINT (match_operand:VECINT 1 "grfr_register_operand" "r,*f")) 84 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 85 "" 86 "@ 87 andcm %0 = %2, %1 88 fandcm %0 = %2, %1" 89 [(set_attr "itanium_class" "ilog,fmisc")]) 90 91(define_insn "ior<mode>3" 92 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 93 (ior:VECINT 94 (match_operand:VECINT 1 "grfr_register_operand" "r,*f") 95 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 96 "" 97 "@ 98 or %0 = %2, %1 99 for %0 = %2, %1" 100 [(set_attr "itanium_class" "ilog,fmisc")]) 101 102(define_insn "xor<mode>3" 103 [(set (match_operand:VECINT 0 "grfr_register_operand" "=r,*f") 104 (xor:VECINT 105 (match_operand:VECINT 1 "grfr_register_operand" "r,*f") 106 (match_operand:VECINT 2 "grfr_reg_or_8bit_operand" "r,*f")))] 107 "" 108 "@ 109 xor %0 = %2, %1 110 fxor %0 = %2, %1" 111 [(set_attr "itanium_class" "ilog,fmisc")]) 112 113(define_insn "neg<mode>2" 114 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 115 (neg:VECINT (match_operand:VECINT 1 "gr_register_operand" "r")))] 116 "" 117 "psub<vecsize> %0 = r0, %1" 118 [(set_attr "itanium_class" "mmalua")]) 119 120(define_insn "add<mode>3" 121 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 122 (plus:VECINT (match_operand:VECINT 1 "gr_register_operand" "r") 123 (match_operand:VECINT 2 "gr_register_operand" "r")))] 124 "" 125 "padd<vecsize> %0 = %1, %2" 126 [(set_attr "itanium_class" "mmalua")]) 127 128(define_insn "*ssadd<mode>3" 129 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 130 (ss_plus:VECINT12 131 (match_operand:VECINT12 1 "gr_register_operand" "r") 132 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 133 "" 134 "padd<vecsize>.sss %0 = %1, %2" 135 [(set_attr "itanium_class" "mmalua")]) 136 137(define_insn "*usadd<mode>3" 138 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 139 (us_plus:VECINT12 140 (match_operand:VECINT12 1 "gr_register_operand" "r") 141 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 142 "" 143 "padd<vecsize>.uuu %0 = %1, %2" 144 [(set_attr "itanium_class" "mmalua")]) 145 146(define_insn "sub<mode>3" 147 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 148 (minus:VECINT (match_operand:VECINT 1 "gr_register_operand" "r") 149 (match_operand:VECINT 2 "gr_register_operand" "r")))] 150 "" 151 "psub<vecsize> %0 = %1, %2" 152 [(set_attr "itanium_class" "mmalua")]) 153 154(define_insn "*sssub<mode>3" 155 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 156 (ss_minus:VECINT12 157 (match_operand:VECINT12 1 "gr_register_operand" "r") 158 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 159 "" 160 "psub<vecsize>.sss %0 = %1, %2" 161 [(set_attr "itanium_class" "mmalua")]) 162 163(define_insn "*ussub<mode>3" 164 [(set (match_operand:VECINT12 0 "gr_register_operand" "=r") 165 (us_minus:VECINT12 166 (match_operand:VECINT12 1 "gr_register_operand" "r") 167 (match_operand:VECINT12 2 "gr_register_operand" "r")))] 168 "" 169 "psub<vecsize>.uuu %0 = %1, %2" 170 [(set_attr "itanium_class" "mmalua")]) 171 172(define_expand "mulv8qi3" 173 [(set (match_operand:V8QI 0 "gr_register_operand" "") 174 (mult:V8QI (match_operand:V8QI 1 "gr_register_operand" "r") 175 (match_operand:V8QI 2 "gr_register_operand" "r")))] 176 "" 177{ 178 rtx l = gen_reg_rtx (V4HImode); 179 rtx h = gen_reg_rtx (V4HImode); 180 emit_insn (gen_vec_widen_umult_lo_v8qi (l, operands[1], operands[2])); 181 emit_insn (gen_vec_widen_umult_hi_v8qi (h, operands[1], operands[2])); 182 if (TARGET_BIG_ENDIAN) 183 emit_insn (gen_vec_pack_trunc_v4hi (operands[0], h, l)); 184 else 185 emit_insn (gen_vec_pack_trunc_v4hi (operands[0], l, h)); 186 DONE; 187}) 188 189(define_expand "vec_widen_umult_lo_v8qi" 190 [(match_operand:V4HI 0 "gr_register_operand" "") 191 (match_operand:V8QI 1 "gr_register_operand" "") 192 (match_operand:V8QI 2 "gr_register_operand" "")] 193 "" 194{ 195 rtx op1 = gen_reg_rtx (V4HImode); 196 rtx op2 = gen_reg_rtx (V4HImode); 197 emit_insn (gen_vec_unpacku_lo_v8qi (op1, operands[1])); 198 emit_insn (gen_vec_unpacku_lo_v8qi (op2, operands[2])); 199 emit_insn (gen_mulv4hi3 (operands[0], op1, op2)); 200 DONE; 201}); 202 203(define_expand "vec_widen_umult_hi_v8qi" 204 [(match_operand:V4HI 0 "gr_register_operand" "") 205 (match_operand:V8QI 1 "gr_register_operand" "") 206 (match_operand:V8QI 2 "gr_register_operand" "")] 207 "" 208{ 209 rtx op1 = gen_reg_rtx (V4HImode); 210 rtx op2 = gen_reg_rtx (V4HImode); 211 emit_insn (gen_vec_unpacku_hi_v8qi (op1, operands[1])); 212 emit_insn (gen_vec_unpacku_hi_v8qi (op2, operands[2])); 213 emit_insn (gen_mulv4hi3 (operands[0], op1, op2)); 214 DONE; 215}); 216 217(define_expand "vec_widen_smult_lo_v8qi" 218 [(match_operand:V4HI 0 "gr_register_operand" "") 219 (match_operand:V8QI 1 "gr_register_operand" "") 220 (match_operand:V8QI 2 "gr_register_operand" "")] 221 "" 222{ 223 rtx op1 = gen_reg_rtx (V4HImode); 224 rtx op2 = gen_reg_rtx (V4HImode); 225 emit_insn (gen_vec_unpacks_lo_v8qi (op1, operands[1])); 226 emit_insn (gen_vec_unpacks_lo_v8qi (op2, operands[2])); 227 emit_insn (gen_mulv4hi3 (operands[0], op1, op2)); 228 DONE; 229}); 230 231(define_expand "vec_widen_smult_hi_v8qi" 232 [(match_operand:V4HI 0 "gr_register_operand" "") 233 (match_operand:V8QI 1 "gr_register_operand" "") 234 (match_operand:V8QI 2 "gr_register_operand" "")] 235 "" 236{ 237 rtx op1 = gen_reg_rtx (V4HImode); 238 rtx op2 = gen_reg_rtx (V4HImode); 239 emit_insn (gen_vec_unpacks_hi_v8qi (op1, operands[1])); 240 emit_insn (gen_vec_unpacks_hi_v8qi (op2, operands[2])); 241 emit_insn (gen_mulv4hi3 (operands[0], op1, op2)); 242 DONE; 243}); 244 245(define_insn "mulv4hi3" 246 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 247 (mult:V4HI (match_operand:V4HI 1 "gr_register_operand" "r") 248 (match_operand:V4HI 2 "gr_register_operand" "r")))] 249 "" 250 "pmpyshr2 %0 = %1, %2, 0" 251 [(set_attr "itanium_class" "mmmul")]) 252 253(define_insn "pmpyshr2" 254 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 255 (truncate:V4HI 256 (ashiftrt:V4SI 257 (mult:V4SI 258 (sign_extend:V4SI 259 (match_operand:V4HI 1 "gr_register_operand" "r")) 260 (sign_extend:V4SI 261 (match_operand:V4HI 2 "gr_register_operand" "r"))) 262 (match_operand:SI 3 "pmpyshr_operand" "n"))))] 263 "" 264 "pmpyshr2 %0 = %1, %2, %3" 265 [(set_attr "itanium_class" "mmmul")]) 266 267(define_insn "pmpyshr2_u" 268 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 269 (truncate:V4HI 270 (lshiftrt:V4SI 271 (mult:V4SI 272 (zero_extend:V4SI 273 (match_operand:V4HI 1 "gr_register_operand" "r")) 274 (zero_extend:V4SI 275 (match_operand:V4HI 2 "gr_register_operand" "r"))) 276 (match_operand:SI 3 "pmpyshr_operand" "n"))))] 277 "" 278 "pmpyshr2.u %0 = %1, %2, %3" 279 [(set_attr "itanium_class" "mmmul")]) 280 281(define_expand "smulv4hi3_highpart" 282 [(match_operand:V4HI 0 "gr_register_operand") 283 (match_operand:V4HI 1 "gr_register_operand") 284 (match_operand:V4HI 2 "gr_register_operand")] 285 "" 286{ 287 emit_insn (gen_pmpyshr2 (operands[0], operands[1], 288 operands[2], GEN_INT (16))); 289 DONE; 290}) 291 292(define_expand "umulv4hi3_highpart" 293 [(match_operand:V4HI 0 "gr_register_operand") 294 (match_operand:V4HI 1 "gr_register_operand") 295 (match_operand:V4HI 2 "gr_register_operand")] 296 "" 297{ 298 emit_insn (gen_pmpyshr2_u (operands[0], operands[1], 299 operands[2], GEN_INT (16))); 300 DONE; 301}) 302 303(define_insn "vec_widen_smult_even_v4hi" 304 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 305 (mult:V2SI 306 (vec_select:V2SI 307 (sign_extend:V4SI 308 (match_operand:V4HI 1 "gr_register_operand" "r")) 309 (parallel [(const_int 0) (const_int 2)])) 310 (vec_select:V2SI 311 (sign_extend:V4SI 312 (match_operand:V4HI 2 "gr_register_operand" "r")) 313 (parallel [(const_int 0) (const_int 2)]))))] 314 "" 315{ 316 /* Recall that vector elements are numbered in memory order. */ 317 if (TARGET_BIG_ENDIAN) 318 return "%,pmpy2.l %0 = %1, %2"; 319 else 320 return "%,pmpy2.r %0 = %1, %2"; 321} 322 [(set_attr "itanium_class" "mmshf")]) 323 324(define_insn "vec_widen_smult_odd_v4hi" 325 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 326 (mult:V2SI 327 (vec_select:V2SI 328 (sign_extend:V4SI 329 (match_operand:V4HI 1 "gr_register_operand" "r")) 330 (parallel [(const_int 1) (const_int 3)])) 331 (vec_select:V2SI 332 (sign_extend:V4SI 333 (match_operand:V4HI 2 "gr_register_operand" "r")) 334 (parallel [(const_int 1) (const_int 3)]))))] 335 "" 336{ 337 /* Recall that vector elements are numbered in memory order. */ 338 if (TARGET_BIG_ENDIAN) 339 return "%,pmpy2.r %0 = %1, %2"; 340 else 341 return "%,pmpy2.l %0 = %1, %2"; 342} 343 [(set_attr "itanium_class" "mmshf")]) 344 345(define_expand "vec_widen_smult_lo_v4hi" 346 [(match_operand:V2SI 0 "gr_register_operand" "") 347 (match_operand:V4HI 1 "gr_register_operand" "") 348 (match_operand:V4HI 2 "gr_register_operand" "")] 349 "" 350{ 351 rtx l = gen_reg_rtx (V4HImode); 352 rtx h = gen_reg_rtx (V4HImode); 353 emit_insn (gen_mulv4hi3 (l, operands[1], operands[2])); 354 emit_insn (gen_pmpyshr2 (h, operands[1], operands[2], GEN_INT (16))); 355 ia64_unpack_assemble (operands[0], l, h, false); 356 DONE; 357}) 358 359(define_expand "vec_widen_smult_hi_v4hi" 360 [(match_operand:V2SI 0 "gr_register_operand" "") 361 (match_operand:V4HI 1 "gr_register_operand" "") 362 (match_operand:V4HI 2 "gr_register_operand" "")] 363 "" 364{ 365 rtx l = gen_reg_rtx (V4HImode); 366 rtx h = gen_reg_rtx (V4HImode); 367 emit_insn (gen_mulv4hi3 (l, operands[1], operands[2])); 368 emit_insn (gen_pmpyshr2 (h, operands[1], operands[2], GEN_INT (16))); 369 ia64_unpack_assemble (operands[0], l, h, true); 370 DONE; 371}) 372 373(define_expand "vec_widen_umult_lo_v4hi" 374 [(match_operand:V2SI 0 "gr_register_operand" "") 375 (match_operand:V4HI 1 "gr_register_operand" "") 376 (match_operand:V4HI 2 "gr_register_operand" "")] 377 "" 378{ 379 rtx l = gen_reg_rtx (V4HImode); 380 rtx h = gen_reg_rtx (V4HImode); 381 emit_insn (gen_mulv4hi3 (l, operands[1], operands[2])); 382 emit_insn (gen_pmpyshr2_u (h, operands[1], operands[2], GEN_INT (16))); 383 ia64_unpack_assemble (operands[0], l, h, false); 384 DONE; 385}) 386 387(define_expand "vec_widen_umult_hi_v4hi" 388 [(match_operand:V2SI 0 "gr_register_operand" "") 389 (match_operand:V4HI 1 "gr_register_operand" "") 390 (match_operand:V4HI 2 "gr_register_operand" "")] 391 "" 392{ 393 rtx l = gen_reg_rtx (V4HImode); 394 rtx h = gen_reg_rtx (V4HImode); 395 emit_insn (gen_mulv4hi3 (l, operands[1], operands[2])); 396 emit_insn (gen_pmpyshr2_u (h, operands[1], operands[2], GEN_INT (16))); 397 ia64_unpack_assemble (operands[0], l, h, true); 398 DONE; 399}) 400 401(define_expand "mulv2si3" 402 [(set (match_operand:V2SI 0 "gr_register_operand" "") 403 (mult:V2SI (match_operand:V2SI 1 "gr_register_operand" "r") 404 (match_operand:V2SI 2 "gr_register_operand" "r")))] 405 "" 406{ 407 rtx t0, t1, t2, t3, t4, t5, t6, t7, x; 408 rtx op1h = gen_lowpart (V4HImode, operands[1]); 409 rtx op2h = gen_lowpart (V4HImode, operands[2]); 410 411 t0 = gen_reg_rtx (V4HImode); 412 t1 = gen_reg_rtx (V4HImode); 413 t2 = gen_reg_rtx (V4HImode); 414 t3 = gen_reg_rtx (V4HImode); 415 t4 = gen_reg_rtx (V2SImode); 416 t5 = gen_reg_rtx (V2SImode); 417 t6 = gen_reg_rtx (V2SImode); 418 t7 = gen_reg_rtx (V2SImode); 419 420 /* Consider the HImode components of op1 = DCBA, op2 = ZYXW. 421 Consider .l and .h suffixes below the low and high 16 bits 422 of the full 32-bit product. */ 423 424 /* T0 = CDBA. */ 425 x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (4, const1_rtx, const0_rtx, 426 GEN_INT (3), const2_rtx)); 427 x = gen_rtx_VEC_SELECT (V4HImode, op1h, x); 428 emit_insn (gen_rtx_SET (t0, x)); 429 430 /* T1 = DZ.l, CY.l, BX.l, AW.l. */ 431 emit_insn (gen_mulv4hi3 (t1, op1h, op2h)); 432 433 /* T2 = DZ.h, CY.h, BX.h, AW.h. */ 434 emit_insn (gen_pmpyshr2_u (t2, op1h, op2h, GEN_INT (16))); 435 436 /* T3 = CZ.l, DY.l, AX.l, BW.l. */ 437 emit_insn (gen_mulv4hi3 (t3, t0, op2h)); 438 439 /* T4 = CY.h, CY.l, AW.h, AW.l = CY, AW. */ 440 x = gen_lowpart (V4HImode, t4); 441 if (TARGET_BIG_ENDIAN) 442 x = gen_mix2_odd (x, t2, t1); 443 else 444 x = gen_mix2_even (x, t1, t2); 445 emit_insn (x); 446 447 /* T5 = CZ.l, 0, AX.l, 0 = CZ << 16, AX << 16. */ 448 x = gen_lowpart (V4HImode, t5); 449 if (TARGET_BIG_ENDIAN) 450 x = gen_mix2_even (x, t3, CONST0_RTX (V4HImode)); 451 else 452 x = gen_mix2_odd (x, CONST0_RTX (V4HImode), t3); 453 emit_insn (x); 454 455 /* T6 = DY.l, 0, BW.l, 0 = DY << 16, BW << 16. */ 456 x = gen_lowpart (V4HImode, t6); 457 if (TARGET_BIG_ENDIAN) 458 x = gen_mix2_odd (x, t3, CONST0_RTX (V4HImode)); 459 else 460 x = gen_mix2_even (x, CONST0_RTX (V4HImode), t3); 461 emit_insn (x); 462 463 emit_insn (gen_addv2si3 (t7, t4, t5)); 464 emit_insn (gen_addv2si3 (operands[0], t6, t7)); 465 DONE; 466}) 467 468(define_expand "umax<mode>3" 469 [(set (match_operand:VECINT 0 "gr_register_operand" "") 470 (umax:VECINT (match_operand:VECINT 1 "gr_register_operand" "") 471 (match_operand:VECINT 2 "gr_register_operand" "")))] 472 "" 473{ 474 if (ia64_expand_vecint_minmax (UMAX, <MODE>mode, operands)) 475 DONE; 476}) 477 478(define_expand "smax<mode>3" 479 [(set (match_operand:VECINT 0 "gr_register_operand" "") 480 (smax:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 481 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 482 "" 483{ 484 if (ia64_expand_vecint_minmax (SMAX, <MODE>mode, operands)) 485 DONE; 486}) 487 488(define_expand "umin<mode>3" 489 [(set (match_operand:VECINT 0 "gr_register_operand" "") 490 (umin:VECINT (match_operand:VECINT 1 "gr_register_operand" "") 491 (match_operand:VECINT 2 "gr_register_operand" "")))] 492 "" 493{ 494 if (ia64_expand_vecint_minmax (UMIN, <MODE>mode, operands)) 495 DONE; 496}) 497 498(define_expand "smin<mode>3" 499 [(set (match_operand:VECINT 0 "gr_register_operand" "") 500 (smin:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 501 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 502 "" 503{ 504 if (ia64_expand_vecint_minmax (SMIN, <MODE>mode, operands)) 505 DONE; 506}) 507 508(define_insn "*umaxv8qi3" 509 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 510 (umax:V8QI (match_operand:V8QI 1 "gr_register_operand" "r") 511 (match_operand:V8QI 2 "gr_register_operand" "r")))] 512 "" 513 "pmax1.u %0 = %1, %2" 514 [(set_attr "itanium_class" "mmshf")]) 515 516(define_insn "*smaxv4hi3" 517 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 518 (smax:V4HI (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 519 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")))] 520 "" 521 "pmax2 %0 = %r1, %r2" 522 [(set_attr "itanium_class" "mmshf")]) 523 524(define_insn "*uminv8qi3" 525 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 526 (umin:V8QI (match_operand:V8QI 1 "gr_register_operand" "r") 527 (match_operand:V8QI 2 "gr_register_operand" "r")))] 528 "" 529 "pmin1.u %0 = %1, %2" 530 [(set_attr "itanium_class" "mmshf")]) 531 532(define_insn "*sminv4hi3" 533 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 534 (smin:V4HI (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 535 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")))] 536 "" 537 "pmin2 %0 = %r1, %r2" 538 [(set_attr "itanium_class" "mmshf")]) 539 540(define_insn "ashl<mode>3" 541 [(set (match_operand:VECINT24 0 "gr_register_operand" "=r") 542 (ashift:VECINT24 543 (match_operand:VECINT24 1 "gr_register_operand" "r") 544 (match_operand:DI 2 "gr_reg_or_5bit_operand" "rn")))] 545 "" 546 "pshl<vecsize> %0 = %1, %2" 547 [(set_attr "itanium_class" "mmshf")]) 548 549(define_insn "ashr<mode>3" 550 [(set (match_operand:VECINT24 0 "gr_register_operand" "=r") 551 (ashiftrt:VECINT24 552 (match_operand:VECINT24 1 "gr_register_operand" "r") 553 (match_operand:DI 2 "gr_reg_or_5bit_operand" "rn")))] 554 "" 555 "pshr<vecsize> %0 = %1, %2" 556 [(set_attr "itanium_class" "mmshf")]) 557 558(define_insn "lshr<mode>3" 559 [(set (match_operand:VECINT24 0 "gr_register_operand" "=r") 560 (lshiftrt:VECINT24 561 (match_operand:VECINT24 1 "gr_register_operand" "r") 562 (match_operand:DI 2 "gr_reg_or_5bit_operand" "rn")))] 563 "" 564 "pshr<vecsize>.u %0 = %1, %2" 565 [(set_attr "itanium_class" "mmshf")]) 566 567(define_expand "vec_shl_<mode>" 568 [(set (match_operand:VECINT 0 "gr_register_operand" "") 569 (ashift:DI (match_operand:VECINT 1 "gr_register_operand" "") 570 (match_operand:DI 2 "gr_reg_or_6bit_operand" "")))] 571 "" 572{ 573 operands[0] = gen_lowpart (DImode, operands[0]); 574 operands[1] = gen_lowpart (DImode, operands[1]); 575}) 576 577(define_expand "vec_shr_<mode>" 578 [(set (match_operand:VECINT 0 "gr_register_operand" "") 579 (lshiftrt:DI (match_operand:VECINT 1 "gr_register_operand" "") 580 (match_operand:DI 2 "gr_reg_or_6bit_operand" "")))] 581 "" 582{ 583 operands[0] = gen_lowpart (DImode, operands[0]); 584 operands[1] = gen_lowpart (DImode, operands[1]); 585}) 586 587(define_expand "widen_usumv8qi3" 588 [(match_operand:V4HI 0 "gr_register_operand" "") 589 (match_operand:V8QI 1 "gr_register_operand" "") 590 (match_operand:V4HI 2 "gr_register_operand" "")] 591 "" 592{ 593 ia64_expand_widen_sum (operands, true); 594 DONE; 595}) 596 597(define_expand "widen_usumv4hi3" 598 [(match_operand:V2SI 0 "gr_register_operand" "") 599 (match_operand:V4HI 1 "gr_register_operand" "") 600 (match_operand:V2SI 2 "gr_register_operand" "")] 601 "" 602{ 603 ia64_expand_widen_sum (operands, true); 604 DONE; 605}) 606 607(define_expand "widen_ssumv8qi3" 608 [(match_operand:V4HI 0 "gr_register_operand" "") 609 (match_operand:V8QI 1 "gr_register_operand" "") 610 (match_operand:V4HI 2 "gr_register_operand" "")] 611 "" 612{ 613 ia64_expand_widen_sum (operands, false); 614 DONE; 615}) 616 617(define_expand "widen_ssumv4hi3" 618 [(match_operand:V2SI 0 "gr_register_operand" "") 619 (match_operand:V4HI 1 "gr_register_operand" "") 620 (match_operand:V2SI 2 "gr_register_operand" "")] 621 "" 622{ 623 ia64_expand_widen_sum (operands, false); 624 DONE; 625}) 626 627(define_expand "vcond<mode><mode>" 628 [(set (match_operand:VECINT 0 "gr_register_operand" "") 629 (if_then_else:VECINT 630 (match_operator 3 "" 631 [(match_operand:VECINT 4 "gr_reg_or_0_operand" "") 632 (match_operand:VECINT 5 "gr_reg_or_0_operand" "")]) 633 (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 634 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 635 "" 636{ 637 ia64_expand_vecint_cmov (operands); 638 DONE; 639}) 640 641(define_expand "vcondu<mode><mode>" 642 [(set (match_operand:VECINT 0 "gr_register_operand" "") 643 (if_then_else:VECINT 644 (match_operator 3 "" 645 [(match_operand:VECINT 4 "gr_reg_or_0_operand" "") 646 (match_operand:VECINT 5 "gr_reg_or_0_operand" "")]) 647 (match_operand:VECINT 1 "gr_reg_or_0_operand" "") 648 (match_operand:VECINT 2 "gr_reg_or_0_operand" "")))] 649 "" 650{ 651 ia64_expand_vecint_cmov (operands); 652 DONE; 653}) 654 655(define_insn "*cmpeq_<mode>" 656 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 657 (eq:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "rU") 658 (match_operand:VECINT 2 "gr_reg_or_0_operand" "rU")))] 659 "" 660 "pcmp<vecsize>.eq %0 = %r1, %r2" 661 [(set_attr "itanium_class" "mmalua")]) 662 663(define_insn "*cmpgt_<mode>" 664 [(set (match_operand:VECINT 0 "gr_register_operand" "=r") 665 (gt:VECINT (match_operand:VECINT 1 "gr_reg_or_0_operand" "rU") 666 (match_operand:VECINT 2 "gr_reg_or_0_operand" "rU")))] 667 "" 668 "pcmp<vecsize>.gt %0 = %r1, %r2" 669 [(set_attr "itanium_class" "mmalua")]) 670 671(define_insn "vec_pack_ssat_v4hi" 672 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 673 (vec_concat:V8QI 674 (ss_truncate:V4QI 675 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU")) 676 (ss_truncate:V4QI 677 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU"))))] 678 "" 679{ 680 /* Recall that vector elements are numbered in memory order. */ 681 if (TARGET_BIG_ENDIAN) 682 return "%,pack2.sss %0 = %r2, %r1"; 683 else 684 return "%,pack2.sss %0 = %r1, %r2"; 685} 686 [(set_attr "itanium_class" "mmshf")]) 687 688(define_insn "vec_pack_usat_v4hi" 689 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 690 (vec_concat:V8QI 691 (us_truncate:V4QI 692 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU")) 693 (us_truncate:V4QI 694 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU"))))] 695 "" 696{ 697 /* Recall that vector elements are numbered in memory order. */ 698 if (TARGET_BIG_ENDIAN) 699 return "%,pack2.uss %0 = %r2, %r1"; 700 else 701 return "%,pack2.uss %0 = %r1, %r2"; 702} 703 [(set_attr "itanium_class" "mmshf")]) 704 705(define_insn "vec_pack_ssat_v2si" 706 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 707 (vec_concat:V4HI 708 (ss_truncate:V2HI 709 (match_operand:V2SI 1 "gr_reg_or_0_operand" "rU")) 710 (ss_truncate:V2HI 711 (match_operand:V2SI 2 "gr_reg_or_0_operand" "rU"))))] 712 "" 713{ 714 /* Recall that vector elements are numbered in memory order. */ 715 if (TARGET_BIG_ENDIAN) 716 return "%,pack4.sss %0 = %r2, %r1"; 717 else 718 return "%,pack4.sss %0 = %r1, %r2"; 719} 720 [(set_attr "itanium_class" "mmshf")]) 721 722(define_insn "*vec_interleave_lowv8qi" 723 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 724 (vec_select:V8QI 725 (vec_concat:V16QI 726 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 727 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 728 (parallel [(const_int 0) (const_int 8) 729 (const_int 1) (const_int 9) 730 (const_int 2) (const_int 10) 731 (const_int 3) (const_int 11)])))] 732 "" 733{ 734 /* Recall that vector elements are numbered in memory order. */ 735 if (TARGET_BIG_ENDIAN) 736 return "%,unpack1.l %0 = %r1, %r2"; 737 else 738 return "%,unpack1.l %0 = %r2, %r1"; 739} 740 [(set_attr "itanium_class" "mmshf")]) 741 742(define_insn "*vec_interleave_highv8qi" 743 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 744 (vec_select:V8QI 745 (vec_concat:V16QI 746 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 747 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 748 (parallel [(const_int 4) (const_int 12) 749 (const_int 5) (const_int 13) 750 (const_int 6) (const_int 14) 751 (const_int 7) (const_int 15)])))] 752 "" 753{ 754 /* Recall that vector elements are numbered in memory order. */ 755 if (TARGET_BIG_ENDIAN) 756 return "%,unpack1.h %0 = %r1, %r2"; 757 else 758 return "%,unpack1.h %0 = %r2, %r1"; 759} 760 [(set_attr "itanium_class" "mmshf")]) 761 762(define_insn "*mix1_even" 763 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 764 (vec_select:V8QI 765 (vec_concat:V16QI 766 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 767 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 768 (parallel [(const_int 0) (const_int 8) 769 (const_int 2) (const_int 10) 770 (const_int 4) (const_int 12) 771 (const_int 6) (const_int 14)])))] 772 "" 773{ 774 /* Recall that vector elements are numbered in memory order. */ 775 if (TARGET_BIG_ENDIAN) 776 return "%,mix1.l %0 = %r1, %r2"; 777 else 778 return "%,mix1.r %0 = %r2, %r1"; 779} 780 [(set_attr "itanium_class" "mmshf")]) 781 782(define_insn "*mix1_odd" 783 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 784 (vec_select:V8QI 785 (vec_concat:V16QI 786 (match_operand:V8QI 1 "gr_reg_or_0_operand" "rU") 787 (match_operand:V8QI 2 "gr_reg_or_0_operand" "rU")) 788 (parallel [(const_int 1) (const_int 9) 789 (const_int 3) (const_int 11) 790 (const_int 5) (const_int 13) 791 (const_int 7) (const_int 15)])))] 792 "" 793{ 794 /* Recall that vector elements are numbered in memory order. */ 795 if (TARGET_BIG_ENDIAN) 796 return "%,mix1.r %0 = %r1, %r2"; 797 else 798 return "%,mix1.l %0 = %r2, %r1"; 799} 800 [(set_attr "itanium_class" "mmshf")]) 801 802(define_insn "*mux1_rev" 803 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 804 (vec_select:V8QI 805 (match_operand:V8QI 1 "gr_register_operand" "r") 806 (parallel [(const_int 7) (const_int 6) 807 (const_int 5) (const_int 4) 808 (const_int 3) (const_int 2) 809 (const_int 1) (const_int 0)])))] 810 "" 811 "mux1 %0 = %1, @rev" 812 [(set_attr "itanium_class" "mmshf")]) 813 814(define_insn "*mux1_mix" 815 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 816 (vec_select:V8QI 817 (match_operand:V8QI 1 "gr_register_operand" "r") 818 (parallel [(const_int 0) (const_int 4) 819 (const_int 2) (const_int 6) 820 (const_int 1) (const_int 5) 821 (const_int 3) (const_int 7)])))] 822 "" 823 "mux1 %0 = %1, @mix" 824 [(set_attr "itanium_class" "mmshf")]) 825 826(define_insn "*mux1_shuf" 827 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 828 (vec_select:V8QI 829 (match_operand:V8QI 1 "gr_register_operand" "r") 830 (parallel [(const_int 0) (const_int 4) 831 (const_int 1) (const_int 5) 832 (const_int 2) (const_int 6) 833 (const_int 3) (const_int 7)])))] 834 "" 835 "mux1 %0 = %1, @shuf" 836 [(set_attr "itanium_class" "mmshf")]) 837 838(define_insn "*mux1_alt" 839 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 840 (vec_select:V8QI 841 (match_operand:V8QI 1 "gr_register_operand" "r") 842 (parallel [(const_int 0) (const_int 2) 843 (const_int 4) (const_int 6) 844 (const_int 1) (const_int 3) 845 (const_int 5) (const_int 7)])))] 846 "" 847 "mux1 %0 = %1, @alt" 848 [(set_attr "itanium_class" "mmshf")]) 849 850(define_insn "*mux1_brcst_v8qi" 851 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 852 (vec_select:V8QI 853 (match_operand:V8QI 1 "gr_register_operand" "r") 854 (parallel [(match_operand 2 "mux1_brcst_element" "") 855 (match_dup 2) 856 (match_dup 2) 857 (match_dup 2) 858 (match_dup 2) 859 (match_dup 2) 860 (match_dup 2) 861 (match_dup 2)])))] 862 "" 863 "mux1 %0 = %1, @brcst" 864 [(set_attr "itanium_class" "mmshf")]) 865 866(define_insn "mux1_brcst_qi" 867 [(set (match_operand:V8QI 0 "gr_register_operand" "=r") 868 (vec_duplicate:V8QI 869 (match_operand:QI 1 "gr_register_operand" "r")))] 870 "" 871 "mux1 %0 = %1, @brcst" 872 [(set_attr "itanium_class" "mmshf")]) 873 874(define_insn "*vec_interleave_lowv4hi" 875 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 876 (vec_select:V4HI 877 (vec_concat:V8HI 878 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 879 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 880 (parallel [(const_int 0) (const_int 4) 881 (const_int 1) (const_int 5)])))] 882 "" 883{ 884 /* Recall that vector elements are numbered in memory order. */ 885 if (TARGET_BIG_ENDIAN) 886 return "%,unpack2.l %0 = %r1, %r2"; 887 else 888 return "%,unpack2.l %0 = %r2, %r1"; 889} 890 [(set_attr "itanium_class" "mmshf")]) 891 892(define_insn "*vec_interleave_highv4hi" 893 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 894 (vec_select:V4HI 895 (vec_concat:V8HI 896 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 897 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 898 (parallel [(const_int 2) (const_int 6) 899 (const_int 3) (const_int 7)])))] 900 "" 901{ 902 /* Recall that vector elements are numbered in memory order. */ 903 if (TARGET_BIG_ENDIAN) 904 return "%,unpack2.h %0 = %r1, %r2"; 905 else 906 return "%,unpack2.h %0 = %r2, %r1"; 907} 908 [(set_attr "itanium_class" "mmshf")]) 909 910(define_insn "mix2_even" 911 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 912 (vec_select:V4HI 913 (vec_concat:V8HI 914 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 915 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 916 (parallel [(const_int 0) (const_int 4) 917 (const_int 2) (const_int 6)])))] 918 "" 919{ 920 /* Recall that vector elements are numbered in memory order. */ 921 if (TARGET_BIG_ENDIAN) 922 return "%,mix2.l %0 = %r1, %r2"; 923 else 924 return "%,mix2.r %0 = %r2, %r1"; 925} 926 [(set_attr "itanium_class" "mmshf")]) 927 928(define_insn "mix2_odd" 929 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 930 (vec_select:V4HI 931 (vec_concat:V8HI 932 (match_operand:V4HI 1 "gr_reg_or_0_operand" "rU") 933 (match_operand:V4HI 2 "gr_reg_or_0_operand" "rU")) 934 (parallel [(const_int 1) (const_int 5) 935 (const_int 3) (const_int 7)])))] 936 "" 937{ 938 /* Recall that vector elements are numbered in memory order. */ 939 if (TARGET_BIG_ENDIAN) 940 return "%,mix2.r %0 = %r1, %r2"; 941 else 942 return "%,mix2.l %0 = %r2, %r1"; 943} 944 [(set_attr "itanium_class" "mmshf")]) 945 946(define_insn "*mux2" 947 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 948 (vec_select:V4HI 949 (match_operand:V4HI 1 "gr_register_operand" "r") 950 (parallel [(match_operand 2 "const_int_2bit_operand" "") 951 (match_operand 3 "const_int_2bit_operand" "") 952 (match_operand 4 "const_int_2bit_operand" "") 953 (match_operand 5 "const_int_2bit_operand" "")])))] 954 "" 955{ 956 int mask = 0; 957 if (TARGET_BIG_ENDIAN) 958 { 959 mask |= (3 - INTVAL (operands[2])) << 6; 960 mask |= (3 - INTVAL (operands[3])) << 4; 961 mask |= (3 - INTVAL (operands[4])) << 2; 962 mask |= 3 - INTVAL (operands[5]); 963 } 964 else 965 { 966 mask |= INTVAL (operands[2]); 967 mask |= INTVAL (operands[3]) << 2; 968 mask |= INTVAL (operands[4]) << 4; 969 mask |= INTVAL (operands[5]) << 6; 970 } 971 operands[2] = GEN_INT (mask); 972 return "%,mux2 %0 = %1, %2"; 973} 974 [(set_attr "itanium_class" "mmshf")]) 975 976(define_insn "*mux2_brcst_hi" 977 [(set (match_operand:V4HI 0 "gr_register_operand" "=r") 978 (vec_duplicate:V4HI 979 (match_operand:HI 1 "gr_register_operand" "r")))] 980 "" 981 "mux2 %0 = %1, 0" 982 [(set_attr "itanium_class" "mmshf")]) 983 984(define_insn "*vec_interleave_lowv2si" 985 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 986 (vec_select:V2SI 987 (vec_concat:V4SI 988 (match_operand:V2SI 1 "gr_reg_or_0_operand" "rU") 989 (match_operand:V2SI 2 "gr_reg_or_0_operand" "rU")) 990 (parallel [(const_int 0) (const_int 2)])))] 991 "" 992{ 993 /* Recall that vector elements are numbered in memory order. */ 994 if (TARGET_BIG_ENDIAN) 995 return "%,unpack4.l %0 = %r1, %r2"; 996 else 997 return "%,unpack4.l %0 = %r2, %r1"; 998} 999 [(set_attr "itanium_class" "mmshf")]) 1000 1001(define_insn "*vec_interleave_highv2si" 1002 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 1003 (vec_select:V2SI 1004 (vec_concat:V4SI 1005 (match_operand:V2SI 1 "gr_reg_or_0_operand" "rU") 1006 (match_operand:V2SI 2 "gr_reg_or_0_operand" "rU")) 1007 (parallel [(const_int 1) (const_int 3)])))] 1008 "" 1009{ 1010 /* Recall that vector elements are numbered in memory order. */ 1011 if (TARGET_BIG_ENDIAN) 1012 return "%,unpack4.h %0 = %r1, %r2"; 1013 else 1014 return "%,unpack4.h %0 = %r2, %r1"; 1015} 1016 [(set_attr "itanium_class" "mmshf")]) 1017 1018(define_expand "vec_initv2sisi" 1019 [(match_operand:V2SI 0 "gr_register_operand" "") 1020 (match_operand 1 "" "")] 1021 "" 1022{ 1023 rtx op1 = XVECEXP (operands[1], 0, 0); 1024 rtx op2 = XVECEXP (operands[1], 0, 1); 1025 rtx x; 1026 1027 if (GET_CODE (op1) == CONST_INT && GET_CODE (op2) == CONST_INT) 1028 { 1029 x = gen_rtx_CONST_VECTOR (V2SImode, XVEC (operands[1], 0)); 1030 emit_move_insn (operands[0], x); 1031 DONE; 1032 } 1033 1034 if (!gr_reg_or_0_operand (op1, SImode)) 1035 op1 = force_reg (SImode, op1); 1036 if (!gr_reg_or_0_operand (op2, SImode)) 1037 op2 = force_reg (SImode, op2); 1038 1039 x = gen_rtx_VEC_CONCAT (V2SImode, op1, op2); 1040 emit_insn (gen_rtx_SET (operands[0], x)); 1041 DONE; 1042}) 1043 1044(define_insn "*vecinit_v2si" 1045 [(set (match_operand:V2SI 0 "gr_register_operand" "=r") 1046 (vec_concat:V2SI 1047 (match_operand:SI 1 "gr_reg_or_0_operand" "rO") 1048 (match_operand:SI 2 "gr_reg_or_0_operand" "rO")))] 1049 "" 1050{ 1051 /* Recall that vector elements are numbered in memory order. */ 1052 if (TARGET_BIG_ENDIAN) 1053 return "%,unpack4.l %0 = %r1, %r2"; 1054 else 1055 return "%,unpack4.l %0 = %r2, %r1"; 1056} 1057 [(set_attr "itanium_class" "mmshf")]) 1058 1059;; Missing operations 1060;; padd.uus 1061;; pavg 1062;; pavgsub 1063;; psad 1064;; pshladd 1065;; pshradd 1066;; psub.uus 1067 1068;; Floating point vector operations 1069 1070(define_expand "movv2sf" 1071 [(set (match_operand:V2SF 0 "general_operand" "") 1072 (match_operand:V2SF 1 "general_operand" ""))] 1073 "" 1074{ 1075 rtx op1 = ia64_expand_move (operands[0], operands[1]); 1076 if (!op1) 1077 DONE; 1078 operands[1] = op1; 1079}) 1080 1081(define_insn "*movv2sf_internal" 1082 [(set (match_operand:V2SF 0 "destination_operand" 1083 "=f,f,f,Q,*r ,*r,*r,*r,m ,f ,*r") 1084 (match_operand:V2SF 1 "move_operand" 1085 "fU,Y,Q,f,U*r,W ,i ,m ,*r,*r,f "))] 1086 "ia64_move_ok (operands[0], operands[1])" 1087{ 1088 static const char * const alt[] = { 1089 "%,mov %0 = %F1", 1090 "%,fpack %0 = %F2, %F1", 1091 "%,ldf8 %0 = %1%P1", 1092 "%,stf8 %0 = %1%P0", 1093 "%,mov %0 = %r1", 1094 "%,addl %0 = %v1, r0", 1095 "%,movl %0 = %v1", 1096 "%,ld8%O1 %0 = %1%P1", 1097 "%,st8%Q0 %0 = %r1%P0", 1098 "%,setf.sig %0 = %1", 1099 "%,getf.sig %0 = %1" 1100 }; 1101 1102 if (which_alternative == 1) 1103 { 1104 operands[2] = XVECEXP (operands[1], 0, TARGET_BIG_ENDIAN ? 0 : 1); 1105 operands[1] = XVECEXP (operands[1], 0, TARGET_BIG_ENDIAN ? 1 : 0); 1106 } 1107 1108 return alt[which_alternative]; 1109} 1110 [(set_attr "itanium_class" "fmisc,fmisc,fld,stf,ialu,ialu,long_i,ld,st,tofr,frfr")]) 1111 1112(define_insn "absv2sf2" 1113 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1114 (abs:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")))] 1115 "" 1116 "fpabs %0 = %1" 1117 [(set_attr "itanium_class" "fmisc")]) 1118 1119(define_insn "negv2sf2" 1120 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1121 (neg:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")))] 1122 "" 1123 "fpneg %0 = %1" 1124 [(set_attr "itanium_class" "fmisc")]) 1125 1126(define_insn "*negabsv2sf2" 1127 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1128 (neg:V2SF 1129 (abs:V2SF (match_operand:V2SF 1 "fr_register_operand" "f"))))] 1130 "" 1131 "fpnegabs %0 = %1" 1132 [(set_attr "itanium_class" "fmisc")]) 1133 1134(define_expand "addv2sf3" 1135 [(set (match_operand:V2SF 0 "fr_register_operand" "") 1136 (fma:V2SF (match_operand:V2SF 1 "fr_register_operand" "") 1137 (match_dup 3) 1138 (match_operand:V2SF 2 "fr_register_operand" "")))] 1139 "" 1140{ 1141 operands[3] = force_reg (V2SFmode, CONST1_RTX (V2SFmode)); 1142}) 1143 1144(define_expand "subv2sf3" 1145 [(set (match_operand:V2SF 0 "fr_register_operand" "") 1146 (fma:V2SF 1147 (match_operand:V2SF 1 "fr_register_operand" "") 1148 (match_dup 3) 1149 (neg:V2SF (match_operand:V2SF 2 "fr_register_operand" ""))))] 1150 "" 1151{ 1152 operands[3] = force_reg (V2SFmode, CONST1_RTX (V2SFmode)); 1153}) 1154 1155(define_insn "mulv2sf3" 1156 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1157 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1158 (match_operand:V2SF 2 "fr_register_operand" "f")))] 1159 "" 1160 "fpmpy %0 = %1, %2" 1161 [(set_attr "itanium_class" "fmac")]) 1162 1163(define_insn "fmav2sf4" 1164 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1165 (fma:V2SF 1166 (match_operand:V2SF 1 "fr_register_operand" "f") 1167 (match_operand:V2SF 2 "fr_register_operand" "f") 1168 (match_operand:V2SF 3 "fr_register_operand" "f")))] 1169 "" 1170 "fpma %0 = %1, %2, %3" 1171 [(set_attr "itanium_class" "fmac")]) 1172 1173(define_insn "fmsv2sf4" 1174 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1175 (fma:V2SF 1176 (match_operand:V2SF 1 "fr_register_operand" "f") 1177 (match_operand:V2SF 2 "fr_register_operand" "f") 1178 (neg:V2SF (match_operand:V2SF 3 "fr_register_operand" "f"))))] 1179 "" 1180 "fpms %0 = %1, %2, %3" 1181 [(set_attr "itanium_class" "fmac")]) 1182 1183(define_insn "*fpnmpy" 1184 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1185 (neg:V2SF 1186 (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1187 (match_operand:V2SF 2 "fr_register_operand" "f"))))] 1188 "" 1189 "fpnmpy %0 = %1, %2" 1190 [(set_attr "itanium_class" "fmac")]) 1191 1192(define_insn "fnmav2sf4" 1193 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1194 (fma:V2SF 1195 (neg:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")) 1196 (match_operand:V2SF 2 "fr_register_operand" "f") 1197 (match_operand:V2SF 3 "fr_register_operand" "f")))] 1198 "" 1199 "fpnma %0 = %1, %2, %3" 1200 [(set_attr "itanium_class" "fmac")]) 1201 1202(define_insn "smaxv2sf3" 1203 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1204 (smax:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1205 (match_operand:V2SF 2 "fr_register_operand" "f")))] 1206 "" 1207 "fpmax %0 = %1, %2" 1208 [(set_attr "itanium_class" "fmisc")]) 1209 1210(define_insn "sminv2sf3" 1211 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1212 (smin:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") 1213 (match_operand:V2SF 2 "fr_register_operand" "f")))] 1214 "" 1215 "fpmin %0 = %1, %2" 1216 [(set_attr "itanium_class" "fmisc")]) 1217 1218(define_expand "reduc_splus_v2sf" 1219 [(match_operand:V2SF 0 "fr_register_operand" "") 1220 (match_operand:V2SF 1 "fr_register_operand" "")] 1221 "" 1222{ 1223 rtx tmp = gen_reg_rtx (V2SFmode); 1224 if (TARGET_BIG_ENDIAN) 1225 emit_insn (gen_fswap (tmp, CONST0_RTX (V2SFmode), operands[1])); 1226 else 1227 emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); 1228 emit_insn (gen_addv2sf3 (operands[0], operands[1], tmp)); 1229 DONE; 1230}) 1231 1232(define_expand "reduc_smax_v2sf" 1233 [(match_operand:V2SF 0 "fr_register_operand" "") 1234 (match_operand:V2SF 1 "fr_register_operand" "")] 1235 "" 1236{ 1237 rtx tmp = gen_reg_rtx (V2SFmode); 1238 if (TARGET_BIG_ENDIAN) 1239 emit_insn (gen_fswap (tmp, CONST0_RTX (V2SFmode), operands[1])); 1240 else 1241 emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); 1242 emit_insn (gen_smaxv2sf3 (operands[0], operands[1], tmp)); 1243 DONE; 1244}) 1245 1246(define_expand "reduc_smin_v2sf" 1247 [(match_operand:V2SF 0 "fr_register_operand" "") 1248 (match_operand:V2SF 1 "fr_register_operand" "")] 1249 "" 1250{ 1251 rtx tmp = gen_reg_rtx (V2SFmode); 1252 if (TARGET_BIG_ENDIAN) 1253 emit_insn (gen_fswap (tmp, CONST0_RTX (V2SFmode), operands[1])); 1254 else 1255 emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); 1256 emit_insn (gen_sminv2sf3 (operands[0], operands[1], tmp)); 1257 DONE; 1258}) 1259 1260(define_expand "vcondv2sfv2sf" 1261 [(set (match_operand:V2SF 0 "fr_register_operand" "") 1262 (if_then_else:V2SF 1263 (match_operator 3 "" 1264 [(match_operand:V2SF 4 "fr_reg_or_0_operand" "") 1265 (match_operand:V2SF 5 "fr_reg_or_0_operand" "")]) 1266 (match_operand:V2SF 1 "fr_reg_or_0_operand" "") 1267 (match_operand:V2SF 2 "fr_reg_or_0_operand" "")))] 1268 "" 1269{ 1270 rtx x, cmp; 1271 1272 cmp = gen_reg_rtx (V2SFmode); 1273 PUT_MODE (operands[3], V2SFmode); 1274 emit_insn (gen_rtx_SET (cmp, operands[3])); 1275 1276 x = gen_rtx_IF_THEN_ELSE (V2SFmode, cmp, operands[1], operands[2]); 1277 emit_insn (gen_rtx_SET (operands[0], x)); 1278 DONE; 1279}) 1280 1281(define_insn "*fpcmp" 1282 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1283 (match_operator:V2SF 3 "comparison_operator" 1284 [(match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1285 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")]))] 1286 "" 1287 "fpcmp.%D3 %0 = %F1, %F2" 1288 [(set_attr "itanium_class" "fmisc")]) 1289 1290(define_insn "*fselect" 1291 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1292 (if_then_else:V2SF 1293 (match_operand:V2SF 1 "fr_register_operand" "f") 1294 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU") 1295 (match_operand:V2SF 3 "fr_reg_or_0_operand" "fU")))] 1296 "" 1297 "fselect %0 = %F2, %F3, %1" 1298 [(set_attr "itanium_class" "fmisc")]) 1299 1300(define_expand "vec_initv2sfsf" 1301 [(match_operand:V2SF 0 "fr_register_operand" "") 1302 (match_operand 1 "" "")] 1303 "" 1304{ 1305 rtx op1 = XVECEXP (operands[1], 0, 0); 1306 rtx op2 = XVECEXP (operands[1], 0, 1); 1307 rtx x; 1308 1309 if (GET_CODE (op1) == CONST_DOUBLE && GET_CODE (op2) == CONST_DOUBLE) 1310 { 1311 x = gen_rtx_CONST_VECTOR (V2SFmode, XVEC (operands[1], 0)); 1312 emit_move_insn (operands[0], x); 1313 DONE; 1314 } 1315 1316 if (!fr_reg_or_fp01_operand (op1, SFmode)) 1317 op1 = force_reg (SFmode, op1); 1318 if (!fr_reg_or_fp01_operand (op2, SFmode)) 1319 op2 = force_reg (SFmode, op2); 1320 1321 emit_insn (gen_fpack (operands[0], op1, op2)); 1322 DONE; 1323}) 1324 1325(define_insn "fpack" 1326 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1327 (vec_concat:V2SF 1328 (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG") 1329 (match_operand:SF 2 "fr_reg_or_fp01_operand" "fG")))] 1330 "" 1331{ 1332 /* Recall that vector elements are numbered in memory order. */ 1333 if (TARGET_BIG_ENDIAN) 1334 return "%,fpack %0 = %F1, %F2"; 1335 else 1336 return "%,fpack %0 = %F2, %F1"; 1337} 1338 [(set_attr "itanium_class" "fmisc")]) 1339 1340(define_insn "fswap" 1341 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1342 (vec_select:V2SF 1343 (vec_concat:V4SF 1344 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1345 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1346 (parallel [(const_int 1) (const_int 2)])))] 1347 "" 1348{ 1349 /* Recall that vector elements are numbered in memory order. */ 1350 if (TARGET_BIG_ENDIAN) 1351 return "%,fswap %0 = %F2, %F1"; 1352 else 1353 return "%,fswap %0 = %F1, %F2"; 1354} 1355 [(set_attr "itanium_class" "fmisc")]) 1356 1357(define_insn "*vec_interleave_highv2sf" 1358 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1359 (vec_select:V2SF 1360 (vec_concat:V4SF 1361 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1362 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1363 (parallel [(const_int 1) (const_int 3)])))] 1364 "" 1365{ 1366 /* Recall that vector elements are numbered in memory order. */ 1367 if (TARGET_BIG_ENDIAN) 1368 return "%,fmix.l %0 = %F1, %F2"; 1369 else 1370 return "%,fmix.l %0 = %F2, %F1"; 1371} 1372 [(set_attr "itanium_class" "fmisc")]) 1373 1374(define_insn "*vec_interleave_lowv2sf" 1375 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1376 (vec_select:V2SF 1377 (vec_concat:V4SF 1378 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1379 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1380 (parallel [(const_int 0) (const_int 2)])))] 1381 "" 1382{ 1383 /* Recall that vector elements are numbered in memory order. */ 1384 if (TARGET_BIG_ENDIAN) 1385 return "%,fmix.r %0 = %F1, %F2"; 1386 else 1387 return "%,fmix.r %0 = %F2, %F1"; 1388} 1389 [(set_attr "itanium_class" "fmisc")]) 1390 1391(define_insn "fmix_lr" 1392 [(set (match_operand:V2SF 0 "fr_register_operand" "=f") 1393 (vec_select:V2SF 1394 (vec_concat:V4SF 1395 (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") 1396 (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) 1397 (parallel [(const_int 0) (const_int 3)])))] 1398 "" 1399{ 1400 /* Recall that vector elements are numbered in memory order. */ 1401 if (TARGET_BIG_ENDIAN) 1402 return "%,fmix.lr %0 = %F1, %F2"; 1403 else 1404 return "%,fmix.lr %0 = %F2, %F1"; 1405} 1406 [(set_attr "itanium_class" "fmisc")]) 1407 1408(define_expand "vec_setv2sf" 1409 [(match_operand:V2SF 0 "fr_register_operand" "") 1410 (match_operand:SF 1 "fr_register_operand" "") 1411 (match_operand 2 "const_int_operand" "")] 1412 "" 1413{ 1414 ia64_expand_vec_setv2sf (operands); 1415 DONE; 1416}) 1417 1418(define_insn_and_split "*vec_extractv2sf_0_le" 1419 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,f,m") 1420 (unspec:SF [(match_operand:V2SF 1 "nonimmediate_operand" "rfm,rm,r") 1421 (const_int 0)] 1422 UNSPEC_VECT_EXTR))] 1423 "!TARGET_BIG_ENDIAN" 1424 "#" 1425 "reload_completed" 1426 [(set (match_dup 0) (match_dup 1))] 1427{ 1428 if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1]))) 1429 operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0])); 1430 else if (MEM_P (operands[1])) 1431 operands[1] = adjust_address (operands[1], SFmode, 0); 1432 else 1433 operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1])); 1434}) 1435 1436(define_insn_and_split "*vec_extractv2sf_0_be" 1437 [(set (match_operand:SF 0 "register_operand" "=rf,r") 1438 (unspec:SF [(match_operand:V2SF 1 "nonimmediate_operand" "m,r") 1439 (const_int 0)] 1440 UNSPEC_VECT_EXTR))] 1441 "TARGET_BIG_ENDIAN" 1442 "#" 1443 "reload_completed" 1444 [(set (match_dup 0) (match_dup 1))] 1445{ 1446 if (MEM_P (operands[1])) 1447 operands[1] = adjust_address (operands[1], SFmode, 0); 1448 else 1449 { 1450 emit_insn (gen_lshrdi3 (operands[0], operands[1], GEN_INT (32))); 1451 DONE; 1452 } 1453}) 1454 1455(define_insn_and_split "*vec_extractv2sf_1_le" 1456 [(set (match_operand:SF 0 "register_operand" "=r") 1457 (unspec:SF [(match_operand:V2SF 1 "register_operand" "r") 1458 (const_int 1)] 1459 UNSPEC_VECT_EXTR))] 1460 "!TARGET_BIG_ENDIAN" 1461 "#" 1462 "&& reload_completed" 1463 [(const_int 0)] 1464{ 1465 operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); 1466 operands[1] = gen_rtx_REG (DImode, REGNO (operands[1])); 1467 emit_insn (gen_lshrdi3 (operands[0], operands[1], GEN_INT (32))); 1468 DONE; 1469}) 1470 1471(define_insn_and_split "*vec_extractv2sf_1_be" 1472 [(set (match_operand:SF 0 "register_operand" "=rf") 1473 (unspec:SF [(match_operand:V2SF 1 "register_operand" "r") 1474 (const_int 1)] 1475 UNSPEC_VECT_EXTR))] 1476 "TARGET_BIG_ENDIAN" 1477 "#" 1478 "&& reload_completed" 1479 [(set (match_dup 0) (match_dup 1))] 1480{ 1481 operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1])); 1482}) 1483 1484(define_expand "vec_extractv2sfsf" 1485 [(set (match_operand:SF 0 "register_operand" "") 1486 (unspec:SF [(match_operand:V2SF 1 "register_operand" "") 1487 (match_operand:DI 2 "const_int_operand" "")] 1488 UNSPEC_VECT_EXTR))] 1489 "" 1490 "") 1491 1492(define_expand "vec_unpacku_lo_<mode>" 1493 [(match_operand:<vecwider> 0 "register_operand" "") 1494 (match_operand:VECINT12 1 "register_operand" "")] 1495 "" 1496{ 1497 ia64_expand_unpack (operands, true, false); 1498 DONE; 1499}) 1500 1501(define_expand "vec_unpacku_hi_<mode>" 1502 [(match_operand:<vecwider> 0 "register_operand" "") 1503 (match_operand:VECINT12 1 "register_operand" "")] 1504 "" 1505{ 1506 ia64_expand_unpack (operands, true, true); 1507 DONE; 1508}) 1509 1510(define_expand "vec_unpacks_lo_<mode>" 1511 [(match_operand:<vecwider> 0 "register_operand" "") 1512 (match_operand:VECINT12 1 "register_operand" "")] 1513 "" 1514{ 1515 ia64_expand_unpack (operands, false, false); 1516 DONE; 1517}) 1518 1519(define_expand "vec_unpacks_hi_<mode>" 1520 [(match_operand:<vecwider> 0 "register_operand" "") 1521 (match_operand:VECINT12 1 "register_operand" "")] 1522 "" 1523{ 1524 ia64_expand_unpack (operands, false, true); 1525 DONE; 1526}) 1527 1528(define_expand "vec_pack_trunc_v4hi" 1529 [(match_operand:V8QI 0 "gr_register_operand" "") 1530 (match_operand:V4HI 1 "gr_register_operand" "") 1531 (match_operand:V4HI 2 "gr_register_operand" "")] 1532 "" 1533{ 1534 rtx op1 = gen_lowpart (V8QImode, operands[1]); 1535 rtx op2 = gen_lowpart (V8QImode, operands[2]); 1536 ia64_expand_vec_perm_even_odd (operands[0], op1, op2, TARGET_BIG_ENDIAN); 1537 DONE; 1538}) 1539 1540(define_expand "vec_pack_trunc_v2si" 1541 [(match_operand:V4HI 0 "gr_register_operand" "") 1542 (match_operand:V2SI 1 "gr_register_operand" "") 1543 (match_operand:V2SI 2 "gr_register_operand" "")] 1544 "" 1545{ 1546 rtx op1 = gen_lowpart (V4HImode, operands[1]); 1547 rtx op2 = gen_lowpart (V4HImode, operands[2]); 1548 ia64_expand_vec_perm_even_odd (operands[0], op1, op2, TARGET_BIG_ENDIAN); 1549 DONE; 1550}) 1551 1552;; Missing operations 1553;; fprcpa 1554;; fpsqrta 1555