1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 \ 3; RUN: -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx \ 4; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s 5; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 \ 6; RUN: -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx \ 7; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck \ 8; RUN: -check-prefix=CHECK-REG %s 9; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 \ 10; RUN: -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -fast-isel -O0 \ 11; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck \ 12; RUN: -check-prefix=CHECK-FISL %s 13; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr8 \ 14; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mattr=+vsx \ 15; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck \ 16; RUN: -check-prefix=CHECK-LE %s 17 18define double @test1(double %a, double %b) { 19; CHECK-LABEL: test1: 20; CHECK: # %bb.0: # %entry 21; CHECK-NEXT: xsmuldp f1, f1, f2 22; CHECK-NEXT: blr 23; 24; CHECK-REG-LABEL: test1: 25; CHECK-REG: # %bb.0: # %entry 26; CHECK-REG-NEXT: xsmuldp f1, f1, f2 27; CHECK-REG-NEXT: blr 28; 29; CHECK-FISL-LABEL: test1: 30; CHECK-FISL: # %bb.0: # %entry 31; CHECK-FISL-NEXT: xsmuldp f1, f1, f2 32; CHECK-FISL-NEXT: blr 33; 34; CHECK-LE-LABEL: test1: 35; CHECK-LE: # %bb.0: # %entry 36; CHECK-LE-NEXT: xsmuldp f1, f1, f2 37; CHECK-LE-NEXT: blr 38entry: 39 %v = fmul double %a, %b 40 ret double %v 41 42 43} 44 45define double @test2(double %a, double %b) { 46; CHECK-LABEL: test2: 47; CHECK: # %bb.0: # %entry 48; CHECK-NEXT: xsdivdp f1, f1, f2 49; CHECK-NEXT: blr 50; 51; CHECK-REG-LABEL: test2: 52; CHECK-REG: # %bb.0: # %entry 53; CHECK-REG-NEXT: xsdivdp f1, f1, f2 54; CHECK-REG-NEXT: blr 55; 56; CHECK-FISL-LABEL: test2: 57; CHECK-FISL: # %bb.0: # %entry 58; CHECK-FISL-NEXT: xsdivdp f1, f1, f2 59; CHECK-FISL-NEXT: blr 60; 61; CHECK-LE-LABEL: test2: 62; CHECK-LE: # %bb.0: # %entry 63; CHECK-LE-NEXT: xsdivdp f1, f1, f2 64; CHECK-LE-NEXT: blr 65entry: 66 %v = fdiv double %a, %b 67 ret double %v 68 69 70} 71 72define double @test3(double %a, double %b) { 73; CHECK-LABEL: test3: 74; CHECK: # %bb.0: # %entry 75; CHECK-NEXT: xsadddp f1, f1, f2 76; CHECK-NEXT: blr 77; 78; CHECK-REG-LABEL: test3: 79; CHECK-REG: # %bb.0: # %entry 80; CHECK-REG-NEXT: xsadddp f1, f1, f2 81; CHECK-REG-NEXT: blr 82; 83; CHECK-FISL-LABEL: test3: 84; CHECK-FISL: # %bb.0: # %entry 85; CHECK-FISL-NEXT: xsadddp f1, f1, f2 86; CHECK-FISL-NEXT: blr 87; 88; CHECK-LE-LABEL: test3: 89; CHECK-LE: # %bb.0: # %entry 90; CHECK-LE-NEXT: xsadddp f1, f1, f2 91; CHECK-LE-NEXT: blr 92entry: 93 %v = fadd double %a, %b 94 ret double %v 95 96 97} 98 99define <2 x double> @test4(<2 x double> %a, <2 x double> %b) { 100; CHECK-LABEL: test4: 101; CHECK: # %bb.0: # %entry 102; CHECK-NEXT: xvadddp v2, v2, v3 103; CHECK-NEXT: blr 104; 105; CHECK-REG-LABEL: test4: 106; CHECK-REG: # %bb.0: # %entry 107; CHECK-REG-NEXT: xvadddp v2, v2, v3 108; CHECK-REG-NEXT: blr 109; 110; CHECK-FISL-LABEL: test4: 111; CHECK-FISL: # %bb.0: # %entry 112; CHECK-FISL-NEXT: xvadddp v2, v2, v3 113; CHECK-FISL-NEXT: blr 114; 115; CHECK-LE-LABEL: test4: 116; CHECK-LE: # %bb.0: # %entry 117; CHECK-LE-NEXT: xvadddp v2, v2, v3 118; CHECK-LE-NEXT: blr 119entry: 120 %v = fadd <2 x double> %a, %b 121 ret <2 x double> %v 122 123 124} 125 126define <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) { 127; CHECK-LABEL: test5: 128; CHECK: # %bb.0: # %entry 129; CHECK-NEXT: xxlxor v2, v2, v3 130; CHECK-NEXT: blr 131; 132; CHECK-REG-LABEL: test5: 133; CHECK-REG: # %bb.0: # %entry 134; CHECK-REG-NEXT: xxlxor v2, v2, v3 135; CHECK-REG-NEXT: blr 136; 137; CHECK-FISL-LABEL: test5: 138; CHECK-FISL: # %bb.0: # %entry 139; CHECK-FISL-NEXT: xxlxor v2, v2, v3 140; CHECK-FISL-NEXT: blr 141; 142; CHECK-LE-LABEL: test5: 143; CHECK-LE: # %bb.0: # %entry 144; CHECK-LE-NEXT: xxlxor v2, v2, v3 145; CHECK-LE-NEXT: blr 146entry: 147 %v = xor <4 x i32> %a, %b 148 ret <4 x i32> %v 149 150 151 152} 153 154define <8 x i16> @test6(<8 x i16> %a, <8 x i16> %b) { 155; CHECK-LABEL: test6: 156; CHECK: # %bb.0: # %entry 157; CHECK-NEXT: xxlxor v2, v2, v3 158; CHECK-NEXT: blr 159; 160; CHECK-REG-LABEL: test6: 161; CHECK-REG: # %bb.0: # %entry 162; CHECK-REG-NEXT: xxlxor v2, v2, v3 163; CHECK-REG-NEXT: blr 164; 165; CHECK-FISL-LABEL: test6: 166; CHECK-FISL: # %bb.0: # %entry 167; CHECK-FISL-NEXT: xxlxor v2, v2, v3 168; CHECK-FISL-NEXT: blr 169; 170; CHECK-LE-LABEL: test6: 171; CHECK-LE: # %bb.0: # %entry 172; CHECK-LE-NEXT: xxlxor v2, v2, v3 173; CHECK-LE-NEXT: blr 174entry: 175 %v = xor <8 x i16> %a, %b 176 ret <8 x i16> %v 177 178 179 180} 181 182define <16 x i8> @test7(<16 x i8> %a, <16 x i8> %b) { 183; CHECK-LABEL: test7: 184; CHECK: # %bb.0: # %entry 185; CHECK-NEXT: xxlxor v2, v2, v3 186; CHECK-NEXT: blr 187; 188; CHECK-REG-LABEL: test7: 189; CHECK-REG: # %bb.0: # %entry 190; CHECK-REG-NEXT: xxlxor v2, v2, v3 191; CHECK-REG-NEXT: blr 192; 193; CHECK-FISL-LABEL: test7: 194; CHECK-FISL: # %bb.0: # %entry 195; CHECK-FISL-NEXT: xxlxor v2, v2, v3 196; CHECK-FISL-NEXT: blr 197; 198; CHECK-LE-LABEL: test7: 199; CHECK-LE: # %bb.0: # %entry 200; CHECK-LE-NEXT: xxlxor v2, v2, v3 201; CHECK-LE-NEXT: blr 202entry: 203 %v = xor <16 x i8> %a, %b 204 ret <16 x i8> %v 205 206 207 208} 209 210define <4 x i32> @test8(<4 x i32> %a, <4 x i32> %b) { 211; CHECK-LABEL: test8: 212; CHECK: # %bb.0: # %entry 213; CHECK-NEXT: xxlor v2, v2, v3 214; CHECK-NEXT: blr 215; 216; CHECK-REG-LABEL: test8: 217; CHECK-REG: # %bb.0: # %entry 218; CHECK-REG-NEXT: xxlor v2, v2, v3 219; CHECK-REG-NEXT: blr 220; 221; CHECK-FISL-LABEL: test8: 222; CHECK-FISL: # %bb.0: # %entry 223; CHECK-FISL-NEXT: xxlor v2, v2, v3 224; CHECK-FISL-NEXT: blr 225; 226; CHECK-LE-LABEL: test8: 227; CHECK-LE: # %bb.0: # %entry 228; CHECK-LE-NEXT: xxlor v2, v2, v3 229; CHECK-LE-NEXT: blr 230entry: 231 %v = or <4 x i32> %a, %b 232 ret <4 x i32> %v 233 234 235 236} 237 238define <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) { 239; CHECK-LABEL: test9: 240; CHECK: # %bb.0: # %entry 241; CHECK-NEXT: xxlor v2, v2, v3 242; CHECK-NEXT: blr 243; 244; CHECK-REG-LABEL: test9: 245; CHECK-REG: # %bb.0: # %entry 246; CHECK-REG-NEXT: xxlor v2, v2, v3 247; CHECK-REG-NEXT: blr 248; 249; CHECK-FISL-LABEL: test9: 250; CHECK-FISL: # %bb.0: # %entry 251; CHECK-FISL-NEXT: xxlor v2, v2, v3 252; CHECK-FISL-NEXT: blr 253; 254; CHECK-LE-LABEL: test9: 255; CHECK-LE: # %bb.0: # %entry 256; CHECK-LE-NEXT: xxlor v2, v2, v3 257; CHECK-LE-NEXT: blr 258entry: 259 %v = or <8 x i16> %a, %b 260 ret <8 x i16> %v 261 262 263 264} 265 266define <16 x i8> @test10(<16 x i8> %a, <16 x i8> %b) { 267; CHECK-LABEL: test10: 268; CHECK: # %bb.0: # %entry 269; CHECK-NEXT: xxlor v2, v2, v3 270; CHECK-NEXT: blr 271; 272; CHECK-REG-LABEL: test10: 273; CHECK-REG: # %bb.0: # %entry 274; CHECK-REG-NEXT: xxlor v2, v2, v3 275; CHECK-REG-NEXT: blr 276; 277; CHECK-FISL-LABEL: test10: 278; CHECK-FISL: # %bb.0: # %entry 279; CHECK-FISL-NEXT: xxlor v2, v2, v3 280; CHECK-FISL-NEXT: blr 281; 282; CHECK-LE-LABEL: test10: 283; CHECK-LE: # %bb.0: # %entry 284; CHECK-LE-NEXT: xxlor v2, v2, v3 285; CHECK-LE-NEXT: blr 286entry: 287 %v = or <16 x i8> %a, %b 288 ret <16 x i8> %v 289 290 291 292} 293 294define <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) { 295; CHECK-LABEL: test11: 296; CHECK: # %bb.0: # %entry 297; CHECK-NEXT: xxland v2, v2, v3 298; CHECK-NEXT: blr 299; 300; CHECK-REG-LABEL: test11: 301; CHECK-REG: # %bb.0: # %entry 302; CHECK-REG-NEXT: xxland v2, v2, v3 303; CHECK-REG-NEXT: blr 304; 305; CHECK-FISL-LABEL: test11: 306; CHECK-FISL: # %bb.0: # %entry 307; CHECK-FISL-NEXT: xxland v2, v2, v3 308; CHECK-FISL-NEXT: blr 309; 310; CHECK-LE-LABEL: test11: 311; CHECK-LE: # %bb.0: # %entry 312; CHECK-LE-NEXT: xxland v2, v2, v3 313; CHECK-LE-NEXT: blr 314entry: 315 %v = and <4 x i32> %a, %b 316 ret <4 x i32> %v 317 318 319 320} 321 322define <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) { 323; CHECK-LABEL: test12: 324; CHECK: # %bb.0: # %entry 325; CHECK-NEXT: xxland v2, v2, v3 326; CHECK-NEXT: blr 327; 328; CHECK-REG-LABEL: test12: 329; CHECK-REG: # %bb.0: # %entry 330; CHECK-REG-NEXT: xxland v2, v2, v3 331; CHECK-REG-NEXT: blr 332; 333; CHECK-FISL-LABEL: test12: 334; CHECK-FISL: # %bb.0: # %entry 335; CHECK-FISL-NEXT: xxland v2, v2, v3 336; CHECK-FISL-NEXT: blr 337; 338; CHECK-LE-LABEL: test12: 339; CHECK-LE: # %bb.0: # %entry 340; CHECK-LE-NEXT: xxland v2, v2, v3 341; CHECK-LE-NEXT: blr 342entry: 343 %v = and <8 x i16> %a, %b 344 ret <8 x i16> %v 345 346 347 348} 349 350define <16 x i8> @test13(<16 x i8> %a, <16 x i8> %b) { 351; CHECK-LABEL: test13: 352; CHECK: # %bb.0: # %entry 353; CHECK-NEXT: xxland v2, v2, v3 354; CHECK-NEXT: blr 355; 356; CHECK-REG-LABEL: test13: 357; CHECK-REG: # %bb.0: # %entry 358; CHECK-REG-NEXT: xxland v2, v2, v3 359; CHECK-REG-NEXT: blr 360; 361; CHECK-FISL-LABEL: test13: 362; CHECK-FISL: # %bb.0: # %entry 363; CHECK-FISL-NEXT: xxland v2, v2, v3 364; CHECK-FISL-NEXT: blr 365; 366; CHECK-LE-LABEL: test13: 367; CHECK-LE: # %bb.0: # %entry 368; CHECK-LE-NEXT: xxland v2, v2, v3 369; CHECK-LE-NEXT: blr 370entry: 371 %v = and <16 x i8> %a, %b 372 ret <16 x i8> %v 373 374 375 376} 377 378define <4 x i32> @test14(<4 x i32> %a, <4 x i32> %b) { 379; CHECK-LABEL: test14: 380; CHECK: # %bb.0: # %entry 381; CHECK-NEXT: xxlnor v2, v2, v3 382; CHECK-NEXT: blr 383; 384; CHECK-REG-LABEL: test14: 385; CHECK-REG: # %bb.0: # %entry 386; CHECK-REG-NEXT: xxlnor v2, v2, v3 387; CHECK-REG-NEXT: blr 388; 389; CHECK-FISL-LABEL: test14: 390; CHECK-FISL: # %bb.0: # %entry 391; CHECK-FISL-NEXT: xxlor vs0, v2, v3 392; CHECK-FISL-NEXT: xxlnor v2, v2, v3 393; CHECK-FISL-NEXT: blr 394; 395; CHECK-LE-LABEL: test14: 396; CHECK-LE: # %bb.0: # %entry 397; CHECK-LE-NEXT: xxlnor v2, v2, v3 398; CHECK-LE-NEXT: blr 399entry: 400 %v = or <4 x i32> %a, %b 401 %w = xor <4 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1> 402 ret <4 x i32> %w 403 404 405 406} 407 408define <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) { 409; CHECK-LABEL: test15: 410; CHECK: # %bb.0: # %entry 411; CHECK-NEXT: xxlnor v2, v2, v3 412; CHECK-NEXT: blr 413; 414; CHECK-REG-LABEL: test15: 415; CHECK-REG: # %bb.0: # %entry 416; CHECK-REG-NEXT: xxlnor v2, v2, v3 417; CHECK-REG-NEXT: blr 418; 419; CHECK-FISL-LABEL: test15: 420; CHECK-FISL: # %bb.0: # %entry 421; CHECK-FISL-NEXT: xxlor v4, v2, v3 422; CHECK-FISL-NEXT: xxlnor v2, v2, v3 423; CHECK-FISL-NEXT: blr 424; 425; CHECK-LE-LABEL: test15: 426; CHECK-LE: # %bb.0: # %entry 427; CHECK-LE-NEXT: xxlnor v2, v2, v3 428; CHECK-LE-NEXT: blr 429entry: 430 %v = or <8 x i16> %a, %b 431 %w = xor <8 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 432 ret <8 x i16> %w 433 434 435 436} 437 438define <16 x i8> @test16(<16 x i8> %a, <16 x i8> %b) { 439; CHECK-LABEL: test16: 440; CHECK: # %bb.0: # %entry 441; CHECK-NEXT: xxlnor v2, v2, v3 442; CHECK-NEXT: blr 443; 444; CHECK-REG-LABEL: test16: 445; CHECK-REG: # %bb.0: # %entry 446; CHECK-REG-NEXT: xxlnor v2, v2, v3 447; CHECK-REG-NEXT: blr 448; 449; CHECK-FISL-LABEL: test16: 450; CHECK-FISL: # %bb.0: # %entry 451; CHECK-FISL-NEXT: xxlor v4, v2, v3 452; CHECK-FISL-NEXT: xxlnor v2, v2, v3 453; CHECK-FISL-NEXT: blr 454; 455; CHECK-LE-LABEL: test16: 456; CHECK-LE: # %bb.0: # %entry 457; CHECK-LE-NEXT: xxlnor v2, v2, v3 458; CHECK-LE-NEXT: blr 459entry: 460 %v = or <16 x i8> %a, %b 461 %w = xor <16 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 462 ret <16 x i8> %w 463 464 465 466} 467 468define <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) { 469; CHECK-LABEL: test17: 470; CHECK: # %bb.0: # %entry 471; CHECK-NEXT: xxlandc v2, v2, v3 472; CHECK-NEXT: blr 473; 474; CHECK-REG-LABEL: test17: 475; CHECK-REG: # %bb.0: # %entry 476; CHECK-REG-NEXT: xxlandc v2, v2, v3 477; CHECK-REG-NEXT: blr 478; 479; CHECK-FISL-LABEL: test17: 480; CHECK-FISL: # %bb.0: # %entry 481; CHECK-FISL-NEXT: xxlnor vs0, v3, v3 482; CHECK-FISL-NEXT: xxland v2, v2, vs0 483; CHECK-FISL-NEXT: blr 484; 485; CHECK-LE-LABEL: test17: 486; CHECK-LE: # %bb.0: # %entry 487; CHECK-LE-NEXT: xxlandc v2, v2, v3 488; CHECK-LE-NEXT: blr 489entry: 490 %w = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1> 491 %v = and <4 x i32> %a, %w 492 ret <4 x i32> %v 493 494 495 496} 497 498define <8 x i16> @test18(<8 x i16> %a, <8 x i16> %b) { 499; CHECK-LABEL: test18: 500; CHECK: # %bb.0: # %entry 501; CHECK-NEXT: xxlandc v2, v2, v3 502; CHECK-NEXT: blr 503; 504; CHECK-REG-LABEL: test18: 505; CHECK-REG: # %bb.0: # %entry 506; CHECK-REG-NEXT: xxlandc v2, v2, v3 507; CHECK-REG-NEXT: blr 508; 509; CHECK-FISL-LABEL: test18: 510; CHECK-FISL: # %bb.0: # %entry 511; CHECK-FISL-NEXT: xxlnor v4, v3, v3 512; CHECK-FISL-NEXT: xxlandc v2, v2, v3 513; CHECK-FISL-NEXT: blr 514; 515; CHECK-LE-LABEL: test18: 516; CHECK-LE: # %bb.0: # %entry 517; CHECK-LE-NEXT: xxlandc v2, v2, v3 518; CHECK-LE-NEXT: blr 519entry: 520 %w = xor <8 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 521 %v = and <8 x i16> %a, %w 522 ret <8 x i16> %v 523 524 525 526} 527 528define <16 x i8> @test19(<16 x i8> %a, <16 x i8> %b) { 529; CHECK-LABEL: test19: 530; CHECK: # %bb.0: # %entry 531; CHECK-NEXT: xxlandc v2, v2, v3 532; CHECK-NEXT: blr 533; 534; CHECK-REG-LABEL: test19: 535; CHECK-REG: # %bb.0: # %entry 536; CHECK-REG-NEXT: xxlandc v2, v2, v3 537; CHECK-REG-NEXT: blr 538; 539; CHECK-FISL-LABEL: test19: 540; CHECK-FISL: # %bb.0: # %entry 541; CHECK-FISL-NEXT: xxlnor v4, v3, v3 542; CHECK-FISL-NEXT: xxlandc v2, v2, v3 543; CHECK-FISL-NEXT: blr 544; 545; CHECK-LE-LABEL: test19: 546; CHECK-LE: # %bb.0: # %entry 547; CHECK-LE-NEXT: xxlandc v2, v2, v3 548; CHECK-LE-NEXT: blr 549entry: 550 %w = xor <16 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 551 %v = and <16 x i8> %a, %w 552 ret <16 x i8> %v 553 554 555 556} 557 558define <4 x i32> @test20(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) { 559; CHECK-LABEL: test20: 560; CHECK: # %bb.0: # %entry 561; CHECK-NEXT: vcmpequw v4, v4, v5 562; CHECK-NEXT: xxsel v2, v3, v2, v4 563; CHECK-NEXT: blr 564; 565; CHECK-REG-LABEL: test20: 566; CHECK-REG: # %bb.0: # %entry 567; CHECK-REG-NEXT: vcmpequw v4, v4, v5 568; CHECK-REG-NEXT: xxsel v2, v3, v2, v4 569; CHECK-REG-NEXT: blr 570; 571; CHECK-FISL-LABEL: test20: 572; CHECK-FISL: # %bb.0: # %entry 573; CHECK-FISL-NEXT: vcmpequw v4, v4, v5 574; CHECK-FISL-NEXT: xxsel v2, v3, v2, v4 575; CHECK-FISL-NEXT: blr 576; 577; CHECK-LE-LABEL: test20: 578; CHECK-LE: # %bb.0: # %entry 579; CHECK-LE-NEXT: vcmpequw v4, v4, v5 580; CHECK-LE-NEXT: xxsel v2, v3, v2, v4 581; CHECK-LE-NEXT: blr 582entry: 583 %m = icmp eq <4 x i32> %c, %d 584 %v = select <4 x i1> %m, <4 x i32> %a, <4 x i32> %b 585 ret <4 x i32> %v 586 587 588 589} 590 591define <4 x float> @test21(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) { 592; CHECK-LABEL: test21: 593; CHECK: # %bb.0: # %entry 594; CHECK-NEXT: xvcmpeqsp vs0, v4, v5 595; CHECK-NEXT: xxsel v2, v3, v2, vs0 596; CHECK-NEXT: blr 597; 598; CHECK-REG-LABEL: test21: 599; CHECK-REG: # %bb.0: # %entry 600; CHECK-REG-NEXT: xvcmpeqsp vs0, v4, v5 601; CHECK-REG-NEXT: xxsel v2, v3, v2, vs0 602; CHECK-REG-NEXT: blr 603; 604; CHECK-FISL-LABEL: test21: 605; CHECK-FISL: # %bb.0: # %entry 606; CHECK-FISL-NEXT: xvcmpeqsp vs0, v4, v5 607; CHECK-FISL-NEXT: xxsel v2, v3, v2, vs0 608; CHECK-FISL-NEXT: blr 609; 610; CHECK-LE-LABEL: test21: 611; CHECK-LE: # %bb.0: # %entry 612; CHECK-LE-NEXT: xvcmpeqsp vs0, v4, v5 613; CHECK-LE-NEXT: xxsel v2, v3, v2, vs0 614; CHECK-LE-NEXT: blr 615entry: 616 %m = fcmp oeq <4 x float> %c, %d 617 %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b 618 ret <4 x float> %v 619 620 621 622} 623 624define <4 x float> @test22(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) { 625; CHECK-LABEL: test22: 626; CHECK: # %bb.0: # %entry 627; CHECK-NEXT: xvcmpgtsp vs0, v5, v4 628; CHECK-NEXT: xvcmpgtsp vs1, v4, v5 629; CHECK-NEXT: xxlor vs0, vs1, vs0 630; CHECK-NEXT: xxsel v2, v2, v3, vs0 631; CHECK-NEXT: blr 632; 633; CHECK-REG-LABEL: test22: 634; CHECK-REG: # %bb.0: # %entry 635; CHECK-REG-NEXT: xvcmpgtsp vs0, v5, v4 636; CHECK-REG-NEXT: xvcmpgtsp vs1, v4, v5 637; CHECK-REG-NEXT: xxlor vs0, vs1, vs0 638; CHECK-REG-NEXT: xxsel v2, v2, v3, vs0 639; CHECK-REG-NEXT: blr 640; 641; CHECK-FISL-LABEL: test22: 642; CHECK-FISL: # %bb.0: # %entry 643; CHECK-FISL-NEXT: xvcmpgtsp vs1, v5, v4 644; CHECK-FISL-NEXT: xvcmpgtsp vs0, v4, v5 645; CHECK-FISL-NEXT: xxlor vs0, vs0, vs1 646; CHECK-FISL-NEXT: xxsel v2, v2, v3, vs0 647; CHECK-FISL-NEXT: blr 648; 649; CHECK-LE-LABEL: test22: 650; CHECK-LE: # %bb.0: # %entry 651; CHECK-LE-NEXT: xvcmpgtsp vs0, v5, v4 652; CHECK-LE-NEXT: xvcmpgtsp vs1, v4, v5 653; CHECK-LE-NEXT: xxlor vs0, vs1, vs0 654; CHECK-LE-NEXT: xxsel v2, v2, v3, vs0 655; CHECK-LE-NEXT: blr 656entry: 657 %m = fcmp ueq <4 x float> %c, %d 658 %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b 659 ret <4 x float> %v 660 661 662 663} 664 665define <8 x i16> @test23(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d) { 666; CHECK-LABEL: test23: 667; CHECK: # %bb.0: # %entry 668; CHECK-NEXT: vcmpequh v4, v4, v5 669; CHECK-NEXT: xxsel v2, v3, v2, v4 670; CHECK-NEXT: blr 671; 672; CHECK-REG-LABEL: test23: 673; CHECK-REG: # %bb.0: # %entry 674; CHECK-REG-NEXT: vcmpequh v4, v4, v5 675; CHECK-REG-NEXT: xxsel v2, v3, v2, v4 676; CHECK-REG-NEXT: blr 677; 678; CHECK-FISL-LABEL: test23: 679; CHECK-FISL: # %bb.0: # %entry 680; CHECK-FISL-NEXT: vcmpequh v4, v4, v5 681; CHECK-FISL-NEXT: xxlor vs0, v4, v4 682; CHECK-FISL-NEXT: xxsel v2, v3, v2, vs0 683; CHECK-FISL-NEXT: blr 684; 685; CHECK-LE-LABEL: test23: 686; CHECK-LE: # %bb.0: # %entry 687; CHECK-LE-NEXT: vcmpequh v4, v4, v5 688; CHECK-LE-NEXT: xxsel v2, v3, v2, v4 689; CHECK-LE-NEXT: blr 690entry: 691 %m = icmp eq <8 x i16> %c, %d 692 %v = select <8 x i1> %m, <8 x i16> %a, <8 x i16> %b 693 ret <8 x i16> %v 694 695 696 697} 698 699define <16 x i8> @test24(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) { 700; CHECK-LABEL: test24: 701; CHECK: # %bb.0: # %entry 702; CHECK-NEXT: vcmpequb v4, v4, v5 703; CHECK-NEXT: xxsel v2, v3, v2, v4 704; CHECK-NEXT: blr 705; 706; CHECK-REG-LABEL: test24: 707; CHECK-REG: # %bb.0: # %entry 708; CHECK-REG-NEXT: vcmpequb v4, v4, v5 709; CHECK-REG-NEXT: xxsel v2, v3, v2, v4 710; CHECK-REG-NEXT: blr 711; 712; CHECK-FISL-LABEL: test24: 713; CHECK-FISL: # %bb.0: # %entry 714; CHECK-FISL-NEXT: vcmpequb v4, v4, v5 715; CHECK-FISL-NEXT: xxlor vs0, v4, v4 716; CHECK-FISL-NEXT: xxsel v2, v3, v2, vs0 717; CHECK-FISL-NEXT: blr 718; 719; CHECK-LE-LABEL: test24: 720; CHECK-LE: # %bb.0: # %entry 721; CHECK-LE-NEXT: vcmpequb v4, v4, v5 722; CHECK-LE-NEXT: xxsel v2, v3, v2, v4 723; CHECK-LE-NEXT: blr 724entry: 725 %m = icmp eq <16 x i8> %c, %d 726 %v = select <16 x i1> %m, <16 x i8> %a, <16 x i8> %b 727 ret <16 x i8> %v 728 729 730 731} 732 733define <2 x double> @test25(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %d) { 734; CHECK-LABEL: test25: 735; CHECK: # %bb.0: # %entry 736; CHECK-NEXT: xvcmpeqdp vs0, v4, v5 737; CHECK-NEXT: xxsel v2, v3, v2, vs0 738; CHECK-NEXT: blr 739; 740; CHECK-REG-LABEL: test25: 741; CHECK-REG: # %bb.0: # %entry 742; CHECK-REG-NEXT: xvcmpeqdp vs0, v4, v5 743; CHECK-REG-NEXT: xxsel v2, v3, v2, vs0 744; CHECK-REG-NEXT: blr 745; 746; CHECK-FISL-LABEL: test25: 747; CHECK-FISL: # %bb.0: # %entry 748; CHECK-FISL-NEXT: xvcmpeqdp vs0, v4, v5 749; CHECK-FISL-NEXT: xxsel v2, v3, v2, vs0 750; CHECK-FISL-NEXT: blr 751; 752; CHECK-LE-LABEL: test25: 753; CHECK-LE: # %bb.0: # %entry 754; CHECK-LE-NEXT: xvcmpeqdp v4, v4, v5 755; CHECK-LE-NEXT: xxsel v2, v3, v2, v4 756; CHECK-LE-NEXT: blr 757entry: 758 %m = fcmp oeq <2 x double> %c, %d 759 %v = select <2 x i1> %m, <2 x double> %a, <2 x double> %b 760 ret <2 x double> %v 761 762 763} 764 765define <2 x i64> @test26(<2 x i64> %a, <2 x i64> %b) { 766; CHECK-LABEL: test26: 767; CHECK: # %bb.0: 768; CHECK-NEXT: addi r3, r1, -32 769; CHECK-NEXT: stxvd2x v3, 0, r3 770; CHECK-NEXT: addi r3, r1, -48 771; CHECK-NEXT: stxvd2x v2, 0, r3 772; CHECK-NEXT: ld r3, -24(r1) 773; CHECK-NEXT: ld r4, -40(r1) 774; CHECK-NEXT: add r3, r4, r3 775; CHECK-NEXT: ld r4, -48(r1) 776; CHECK-NEXT: std r3, -8(r1) 777; CHECK-NEXT: ld r3, -32(r1) 778; CHECK-NEXT: add r3, r4, r3 779; CHECK-NEXT: std r3, -16(r1) 780; CHECK-NEXT: addi r3, r1, -16 781; CHECK-NEXT: lxvd2x v2, 0, r3 782; CHECK-NEXT: blr 783; 784; CHECK-REG-LABEL: test26: 785; CHECK-REG: # %bb.0: 786; CHECK-REG-NEXT: addi r3, r1, -32 787; CHECK-REG-NEXT: stxvd2x v3, 0, r3 788; CHECK-REG-NEXT: addi r3, r1, -48 789; CHECK-REG-NEXT: stxvd2x v2, 0, r3 790; CHECK-REG-NEXT: ld r3, -24(r1) 791; CHECK-REG-NEXT: ld r4, -40(r1) 792; CHECK-REG-NEXT: add r3, r4, r3 793; CHECK-REG-NEXT: ld r4, -48(r1) 794; CHECK-REG-NEXT: std r3, -8(r1) 795; CHECK-REG-NEXT: ld r3, -32(r1) 796; CHECK-REG-NEXT: add r3, r4, r3 797; CHECK-REG-NEXT: std r3, -16(r1) 798; CHECK-REG-NEXT: addi r3, r1, -16 799; CHECK-REG-NEXT: lxvd2x v2, 0, r3 800; CHECK-REG-NEXT: blr 801; 802; CHECK-FISL-LABEL: test26: 803; CHECK-FISL: # %bb.0: 804; CHECK-FISL-NEXT: addi r3, r1, -32 805; CHECK-FISL-NEXT: stxvd2x v3, 0, r3 806; CHECK-FISL-NEXT: addi r3, r1, -48 807; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 808; CHECK-FISL-NEXT: ld r4, -24(r1) 809; CHECK-FISL-NEXT: ld r3, -40(r1) 810; CHECK-FISL-NEXT: add r3, r3, r4 811; CHECK-FISL-NEXT: std r3, -8(r1) 812; CHECK-FISL-NEXT: ld r4, -32(r1) 813; CHECK-FISL-NEXT: ld r3, -48(r1) 814; CHECK-FISL-NEXT: add r3, r3, r4 815; CHECK-FISL-NEXT: std r3, -16(r1) 816; CHECK-FISL-NEXT: addi r3, r1, -16 817; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 818; CHECK-FISL-NEXT: blr 819; 820; CHECK-LE-LABEL: test26: 821; CHECK-LE: # %bb.0: 822; CHECK-LE-NEXT: vaddudm v2, v2, v3 823; CHECK-LE-NEXT: blr 824 %v = add <2 x i64> %a, %b 825 ret <2 x i64> %v 826 827 828; Make sure we use only two stores (one for each operand). 829 830; FIXME: The code quality here is not good; just make sure we do something for now. 831 832} 833 834define <2 x i64> @test27(<2 x i64> %a, <2 x i64> %b) { 835; CHECK-LABEL: test27: 836; CHECK: # %bb.0: 837; CHECK-NEXT: xxland v2, v2, v3 838; CHECK-NEXT: blr 839; 840; CHECK-REG-LABEL: test27: 841; CHECK-REG: # %bb.0: 842; CHECK-REG-NEXT: xxland v2, v2, v3 843; CHECK-REG-NEXT: blr 844; 845; CHECK-FISL-LABEL: test27: 846; CHECK-FISL: # %bb.0: 847; CHECK-FISL-NEXT: xxland v2, v2, v3 848; CHECK-FISL-NEXT: blr 849; 850; CHECK-LE-LABEL: test27: 851; CHECK-LE: # %bb.0: 852; CHECK-LE-NEXT: xxland v2, v2, v3 853; CHECK-LE-NEXT: blr 854 %v = and <2 x i64> %a, %b 855 ret <2 x i64> %v 856 857 858} 859 860define <2 x double> @test28(ptr %a) { 861; CHECK-LABEL: test28: 862; CHECK: # %bb.0: 863; CHECK-NEXT: lxvd2x v2, 0, r3 864; CHECK-NEXT: blr 865; 866; CHECK-REG-LABEL: test28: 867; CHECK-REG: # %bb.0: 868; CHECK-REG-NEXT: lxvd2x v2, 0, r3 869; CHECK-REG-NEXT: blr 870; 871; CHECK-FISL-LABEL: test28: 872; CHECK-FISL: # %bb.0: 873; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 874; CHECK-FISL-NEXT: blr 875; 876; CHECK-LE-LABEL: test28: 877; CHECK-LE: # %bb.0: 878; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 879; CHECK-LE-NEXT: xxswapd v2, vs0 880; CHECK-LE-NEXT: blr 881 %v = load <2 x double>, ptr %a, align 16 882 ret <2 x double> %v 883 884 885} 886 887define void @test29(ptr %a, <2 x double> %b) { 888; CHECK-LABEL: test29: 889; CHECK: # %bb.0: 890; CHECK-NEXT: stxvd2x v2, 0, r3 891; CHECK-NEXT: blr 892; 893; CHECK-REG-LABEL: test29: 894; CHECK-REG: # %bb.0: 895; CHECK-REG-NEXT: stxvd2x v2, 0, r3 896; CHECK-REG-NEXT: blr 897; 898; CHECK-FISL-LABEL: test29: 899; CHECK-FISL: # %bb.0: 900; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 901; CHECK-FISL-NEXT: blr 902; 903; CHECK-LE-LABEL: test29: 904; CHECK-LE: # %bb.0: 905; CHECK-LE-NEXT: xxswapd vs0, v2 906; CHECK-LE-NEXT: stxvd2x vs0, 0, r3 907; CHECK-LE-NEXT: blr 908 store <2 x double> %b, ptr %a, align 16 909 ret void 910 911 912} 913 914define <2 x double> @test28u(ptr %a) { 915; CHECK-LABEL: test28u: 916; CHECK: # %bb.0: 917; CHECK-NEXT: lxvd2x v2, 0, r3 918; CHECK-NEXT: blr 919; 920; CHECK-REG-LABEL: test28u: 921; CHECK-REG: # %bb.0: 922; CHECK-REG-NEXT: lxvd2x v2, 0, r3 923; CHECK-REG-NEXT: blr 924; 925; CHECK-FISL-LABEL: test28u: 926; CHECK-FISL: # %bb.0: 927; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 928; CHECK-FISL-NEXT: blr 929; 930; CHECK-LE-LABEL: test28u: 931; CHECK-LE: # %bb.0: 932; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 933; CHECK-LE-NEXT: xxswapd v2, vs0 934; CHECK-LE-NEXT: blr 935 %v = load <2 x double>, ptr %a, align 8 936 ret <2 x double> %v 937 938 939} 940 941define void @test29u(ptr %a, <2 x double> %b) { 942; CHECK-LABEL: test29u: 943; CHECK: # %bb.0: 944; CHECK-NEXT: stxvd2x v2, 0, r3 945; CHECK-NEXT: blr 946; 947; CHECK-REG-LABEL: test29u: 948; CHECK-REG: # %bb.0: 949; CHECK-REG-NEXT: stxvd2x v2, 0, r3 950; CHECK-REG-NEXT: blr 951; 952; CHECK-FISL-LABEL: test29u: 953; CHECK-FISL: # %bb.0: 954; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 955; CHECK-FISL-NEXT: blr 956; 957; CHECK-LE-LABEL: test29u: 958; CHECK-LE: # %bb.0: 959; CHECK-LE-NEXT: xxswapd vs0, v2 960; CHECK-LE-NEXT: stxvd2x vs0, 0, r3 961; CHECK-LE-NEXT: blr 962 store <2 x double> %b, ptr %a, align 8 963 ret void 964 965 966} 967 968define <2 x i64> @test30(ptr %a) { 969; CHECK-LABEL: test30: 970; CHECK: # %bb.0: 971; CHECK-NEXT: lxvd2x v2, 0, r3 972; CHECK-NEXT: blr 973; 974; CHECK-REG-LABEL: test30: 975; CHECK-REG: # %bb.0: 976; CHECK-REG-NEXT: lxvd2x v2, 0, r3 977; CHECK-REG-NEXT: blr 978; 979; CHECK-FISL-LABEL: test30: 980; CHECK-FISL: # %bb.0: 981; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 982; CHECK-FISL-NEXT: blr 983; 984; CHECK-LE-LABEL: test30: 985; CHECK-LE: # %bb.0: 986; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 987; CHECK-LE-NEXT: xxswapd v2, vs0 988; CHECK-LE-NEXT: blr 989 %v = load <2 x i64>, ptr %a, align 16 990 ret <2 x i64> %v 991 992 993 994} 995 996define void @test31(ptr %a, <2 x i64> %b) { 997; CHECK-LABEL: test31: 998; CHECK: # %bb.0: 999; CHECK-NEXT: stxvd2x v2, 0, r3 1000; CHECK-NEXT: blr 1001; 1002; CHECK-REG-LABEL: test31: 1003; CHECK-REG: # %bb.0: 1004; CHECK-REG-NEXT: stxvd2x v2, 0, r3 1005; CHECK-REG-NEXT: blr 1006; 1007; CHECK-FISL-LABEL: test31: 1008; CHECK-FISL: # %bb.0: 1009; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 1010; CHECK-FISL-NEXT: blr 1011; 1012; CHECK-LE-LABEL: test31: 1013; CHECK-LE: # %bb.0: 1014; CHECK-LE-NEXT: xxswapd vs0, v2 1015; CHECK-LE-NEXT: stxvd2x vs0, 0, r3 1016; CHECK-LE-NEXT: blr 1017 store <2 x i64> %b, ptr %a, align 16 1018 ret void 1019 1020 1021} 1022 1023define <4 x float> @test32(ptr %a) { 1024; CHECK-LABEL: test32: 1025; CHECK: # %bb.0: 1026; CHECK-NEXT: lxvw4x v2, 0, r3 1027; CHECK-NEXT: blr 1028; 1029; CHECK-REG-LABEL: test32: 1030; CHECK-REG: # %bb.0: 1031; CHECK-REG-NEXT: lxvw4x v2, 0, r3 1032; CHECK-REG-NEXT: blr 1033; 1034; CHECK-FISL-LABEL: test32: 1035; CHECK-FISL: # %bb.0: 1036; CHECK-FISL-NEXT: lxvw4x v2, 0, r3 1037; CHECK-FISL-NEXT: blr 1038; 1039; CHECK-LE-LABEL: test32: 1040; CHECK-LE: # %bb.0: 1041; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 1042; CHECK-LE-NEXT: xxswapd v2, vs0 1043; CHECK-LE-NEXT: blr 1044 %v = load <4 x float>, ptr %a, align 16 1045 ret <4 x float> %v 1046 1047 1048 1049} 1050 1051define void @test33(ptr %a, <4 x float> %b) { 1052; CHECK-LABEL: test33: 1053; CHECK: # %bb.0: 1054; CHECK-NEXT: stxvw4x v2, 0, r3 1055; CHECK-NEXT: blr 1056; 1057; CHECK-REG-LABEL: test33: 1058; CHECK-REG: # %bb.0: 1059; CHECK-REG-NEXT: stxvw4x v2, 0, r3 1060; CHECK-REG-NEXT: blr 1061; 1062; CHECK-FISL-LABEL: test33: 1063; CHECK-FISL: # %bb.0: 1064; CHECK-FISL-NEXT: stxvw4x v2, 0, r3 1065; CHECK-FISL-NEXT: blr 1066; 1067; CHECK-LE-LABEL: test33: 1068; CHECK-LE: # %bb.0: 1069; CHECK-LE-NEXT: xxswapd vs0, v2 1070; CHECK-LE-NEXT: stxvd2x vs0, 0, r3 1071; CHECK-LE-NEXT: blr 1072 store <4 x float> %b, ptr %a, align 16 1073 ret void 1074 1075 1076 1077} 1078 1079define <4 x float> @test32u(ptr %a) { 1080; CHECK-LABEL: test32u: 1081; CHECK: # %bb.0: 1082; CHECK-NEXT: li r4, 15 1083; CHECK-NEXT: lvsl v3, 0, r3 1084; CHECK-NEXT: lvx v2, r3, r4 1085; CHECK-NEXT: lvx v4, 0, r3 1086; CHECK-NEXT: vperm v2, v4, v2, v3 1087; CHECK-NEXT: blr 1088; 1089; CHECK-REG-LABEL: test32u: 1090; CHECK-REG: # %bb.0: 1091; CHECK-REG-NEXT: li r4, 15 1092; CHECK-REG-NEXT: lvsl v3, 0, r3 1093; CHECK-REG-NEXT: lvx v2, r3, r4 1094; CHECK-REG-NEXT: lvx v4, 0, r3 1095; CHECK-REG-NEXT: vperm v2, v4, v2, v3 1096; CHECK-REG-NEXT: blr 1097; 1098; CHECK-FISL-LABEL: test32u: 1099; CHECK-FISL: # %bb.0: 1100; CHECK-FISL-NEXT: li r4, 15 1101; CHECK-FISL-NEXT: lvx v3, r3, r4 1102; CHECK-FISL-NEXT: lvsl v4, 0, r3 1103; CHECK-FISL-NEXT: lvx v2, 0, r3 1104; CHECK-FISL-NEXT: vperm v2, v2, v3, v4 1105; CHECK-FISL-NEXT: blr 1106; 1107; CHECK-LE-LABEL: test32u: 1108; CHECK-LE: # %bb.0: 1109; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 1110; CHECK-LE-NEXT: xxswapd v2, vs0 1111; CHECK-LE-NEXT: blr 1112 %v = load <4 x float>, ptr %a, align 8 1113 ret <4 x float> %v 1114 1115 1116} 1117 1118define void @test33u(ptr %a, <4 x float> %b) { 1119; CHECK-LABEL: test33u: 1120; CHECK: # %bb.0: 1121; CHECK-NEXT: stxvw4x v2, 0, r3 1122; CHECK-NEXT: blr 1123; 1124; CHECK-REG-LABEL: test33u: 1125; CHECK-REG: # %bb.0: 1126; CHECK-REG-NEXT: stxvw4x v2, 0, r3 1127; CHECK-REG-NEXT: blr 1128; 1129; CHECK-FISL-LABEL: test33u: 1130; CHECK-FISL: # %bb.0: 1131; CHECK-FISL-NEXT: stxvw4x v2, 0, r3 1132; CHECK-FISL-NEXT: blr 1133; 1134; CHECK-LE-LABEL: test33u: 1135; CHECK-LE: # %bb.0: 1136; CHECK-LE-NEXT: xxswapd vs0, v2 1137; CHECK-LE-NEXT: stxvd2x vs0, 0, r3 1138; CHECK-LE-NEXT: blr 1139 store <4 x float> %b, ptr %a, align 8 1140 ret void 1141 1142 1143 1144} 1145 1146define <4 x i32> @test34(ptr %a) { 1147; CHECK-LABEL: test34: 1148; CHECK: # %bb.0: 1149; CHECK-NEXT: lxvw4x v2, 0, r3 1150; CHECK-NEXT: blr 1151; 1152; CHECK-REG-LABEL: test34: 1153; CHECK-REG: # %bb.0: 1154; CHECK-REG-NEXT: lxvw4x v2, 0, r3 1155; CHECK-REG-NEXT: blr 1156; 1157; CHECK-FISL-LABEL: test34: 1158; CHECK-FISL: # %bb.0: 1159; CHECK-FISL-NEXT: lxvw4x v2, 0, r3 1160; CHECK-FISL-NEXT: blr 1161; 1162; CHECK-LE-LABEL: test34: 1163; CHECK-LE: # %bb.0: 1164; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 1165; CHECK-LE-NEXT: xxswapd v2, vs0 1166; CHECK-LE-NEXT: blr 1167 %v = load <4 x i32>, ptr %a, align 16 1168 ret <4 x i32> %v 1169 1170 1171 1172} 1173 1174define void @test35(ptr %a, <4 x i32> %b) { 1175; CHECK-LABEL: test35: 1176; CHECK: # %bb.0: 1177; CHECK-NEXT: stxvw4x v2, 0, r3 1178; CHECK-NEXT: blr 1179; 1180; CHECK-REG-LABEL: test35: 1181; CHECK-REG: # %bb.0: 1182; CHECK-REG-NEXT: stxvw4x v2, 0, r3 1183; CHECK-REG-NEXT: blr 1184; 1185; CHECK-FISL-LABEL: test35: 1186; CHECK-FISL: # %bb.0: 1187; CHECK-FISL-NEXT: stxvw4x v2, 0, r3 1188; CHECK-FISL-NEXT: blr 1189; 1190; CHECK-LE-LABEL: test35: 1191; CHECK-LE: # %bb.0: 1192; CHECK-LE-NEXT: xxswapd vs0, v2 1193; CHECK-LE-NEXT: stxvd2x vs0, 0, r3 1194; CHECK-LE-NEXT: blr 1195 store <4 x i32> %b, ptr %a, align 16 1196 ret void 1197 1198 1199 1200} 1201 1202define <2 x double> @test40(<2 x i64> %a) { 1203; CHECK-LABEL: test40: 1204; CHECK: # %bb.0: 1205; CHECK-NEXT: xvcvuxddp v2, v2 1206; CHECK-NEXT: blr 1207; 1208; CHECK-REG-LABEL: test40: 1209; CHECK-REG: # %bb.0: 1210; CHECK-REG-NEXT: xvcvuxddp v2, v2 1211; CHECK-REG-NEXT: blr 1212; 1213; CHECK-FISL-LABEL: test40: 1214; CHECK-FISL: # %bb.0: 1215; CHECK-FISL-NEXT: xvcvuxddp v2, v2 1216; CHECK-FISL-NEXT: blr 1217; 1218; CHECK-LE-LABEL: test40: 1219; CHECK-LE: # %bb.0: 1220; CHECK-LE-NEXT: xvcvuxddp v2, v2 1221; CHECK-LE-NEXT: blr 1222 %v = uitofp <2 x i64> %a to <2 x double> 1223 ret <2 x double> %v 1224 1225 1226} 1227 1228define <2 x double> @test41(<2 x i64> %a) { 1229; CHECK-LABEL: test41: 1230; CHECK: # %bb.0: 1231; CHECK-NEXT: xvcvsxddp v2, v2 1232; CHECK-NEXT: blr 1233; 1234; CHECK-REG-LABEL: test41: 1235; CHECK-REG: # %bb.0: 1236; CHECK-REG-NEXT: xvcvsxddp v2, v2 1237; CHECK-REG-NEXT: blr 1238; 1239; CHECK-FISL-LABEL: test41: 1240; CHECK-FISL: # %bb.0: 1241; CHECK-FISL-NEXT: xvcvsxddp v2, v2 1242; CHECK-FISL-NEXT: blr 1243; 1244; CHECK-LE-LABEL: test41: 1245; CHECK-LE: # %bb.0: 1246; CHECK-LE-NEXT: xvcvsxddp v2, v2 1247; CHECK-LE-NEXT: blr 1248 %v = sitofp <2 x i64> %a to <2 x double> 1249 ret <2 x double> %v 1250 1251 1252} 1253 1254define <2 x i64> @test42(<2 x double> %a) { 1255; CHECK-LABEL: test42: 1256; CHECK: # %bb.0: 1257; CHECK-NEXT: xvcvdpuxds v2, v2 1258; CHECK-NEXT: blr 1259; 1260; CHECK-REG-LABEL: test42: 1261; CHECK-REG: # %bb.0: 1262; CHECK-REG-NEXT: xvcvdpuxds v2, v2 1263; CHECK-REG-NEXT: blr 1264; 1265; CHECK-FISL-LABEL: test42: 1266; CHECK-FISL: # %bb.0: 1267; CHECK-FISL-NEXT: xvcvdpuxds v2, v2 1268; CHECK-FISL-NEXT: blr 1269; 1270; CHECK-LE-LABEL: test42: 1271; CHECK-LE: # %bb.0: 1272; CHECK-LE-NEXT: xvcvdpuxds v2, v2 1273; CHECK-LE-NEXT: blr 1274 %v = fptoui <2 x double> %a to <2 x i64> 1275 ret <2 x i64> %v 1276 1277 1278} 1279 1280define <2 x i64> @test43(<2 x double> %a) { 1281; CHECK-LABEL: test43: 1282; CHECK: # %bb.0: 1283; CHECK-NEXT: xvcvdpsxds v2, v2 1284; CHECK-NEXT: blr 1285; 1286; CHECK-REG-LABEL: test43: 1287; CHECK-REG: # %bb.0: 1288; CHECK-REG-NEXT: xvcvdpsxds v2, v2 1289; CHECK-REG-NEXT: blr 1290; 1291; CHECK-FISL-LABEL: test43: 1292; CHECK-FISL: # %bb.0: 1293; CHECK-FISL-NEXT: xvcvdpsxds v2, v2 1294; CHECK-FISL-NEXT: blr 1295; 1296; CHECK-LE-LABEL: test43: 1297; CHECK-LE: # %bb.0: 1298; CHECK-LE-NEXT: xvcvdpsxds v2, v2 1299; CHECK-LE-NEXT: blr 1300 %v = fptosi <2 x double> %a to <2 x i64> 1301 ret <2 x i64> %v 1302 1303 1304} 1305 1306define <2 x float> @test44(<2 x i64> %a) { 1307; CHECK-LABEL: test44: 1308; CHECK: # %bb.0: 1309; CHECK-NEXT: addi r3, r1, -16 1310; CHECK-NEXT: stxvd2x v2, 0, r3 1311; CHECK-NEXT: ld r3, -8(r1) 1312; CHECK-NEXT: std r3, -24(r1) 1313; CHECK-NEXT: ld r3, -16(r1) 1314; CHECK-NEXT: lfd f0, -24(r1) 1315; CHECK-NEXT: std r3, -32(r1) 1316; CHECK-NEXT: addi r3, r1, -48 1317; CHECK-NEXT: fcfidus f0, f0 1318; CHECK-NEXT: stfs f0, -48(r1) 1319; CHECK-NEXT: lfd f0, -32(r1) 1320; CHECK-NEXT: fcfidus f0, f0 1321; CHECK-NEXT: stfs f0, -64(r1) 1322; CHECK-NEXT: lxvw4x vs0, 0, r3 1323; CHECK-NEXT: addi r3, r1, -64 1324; CHECK-NEXT: lxvw4x vs1, 0, r3 1325; CHECK-NEXT: xxmrghw v2, vs1, vs0 1326; CHECK-NEXT: blr 1327; 1328; CHECK-REG-LABEL: test44: 1329; CHECK-REG: # %bb.0: 1330; CHECK-REG-NEXT: addi r3, r1, -16 1331; CHECK-REG-NEXT: stxvd2x v2, 0, r3 1332; CHECK-REG-NEXT: ld r3, -8(r1) 1333; CHECK-REG-NEXT: std r3, -24(r1) 1334; CHECK-REG-NEXT: ld r3, -16(r1) 1335; CHECK-REG-NEXT: lfd f0, -24(r1) 1336; CHECK-REG-NEXT: std r3, -32(r1) 1337; CHECK-REG-NEXT: addi r3, r1, -48 1338; CHECK-REG-NEXT: fcfidus f0, f0 1339; CHECK-REG-NEXT: stfs f0, -48(r1) 1340; CHECK-REG-NEXT: lfd f0, -32(r1) 1341; CHECK-REG-NEXT: fcfidus f0, f0 1342; CHECK-REG-NEXT: stfs f0, -64(r1) 1343; CHECK-REG-NEXT: lxvw4x vs0, 0, r3 1344; CHECK-REG-NEXT: addi r3, r1, -64 1345; CHECK-REG-NEXT: lxvw4x vs1, 0, r3 1346; CHECK-REG-NEXT: xxmrghw v2, vs1, vs0 1347; CHECK-REG-NEXT: blr 1348; 1349; CHECK-FISL-LABEL: test44: 1350; CHECK-FISL: # %bb.0: 1351; CHECK-FISL-NEXT: addi r3, r1, -16 1352; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 1353; CHECK-FISL-NEXT: ld r3, -8(r1) 1354; CHECK-FISL-NEXT: std r3, -24(r1) 1355; CHECK-FISL-NEXT: ld r3, -16(r1) 1356; CHECK-FISL-NEXT: std r3, -32(r1) 1357; CHECK-FISL-NEXT: lfd f0, -24(r1) 1358; CHECK-FISL-NEXT: fcfidus f0, f0 1359; CHECK-FISL-NEXT: stfs f0, -48(r1) 1360; CHECK-FISL-NEXT: lfd f0, -32(r1) 1361; CHECK-FISL-NEXT: fcfidus f0, f0 1362; CHECK-FISL-NEXT: stfs f0, -64(r1) 1363; CHECK-FISL-NEXT: addi r3, r1, -48 1364; CHECK-FISL-NEXT: lxvw4x vs1, 0, r3 1365; CHECK-FISL-NEXT: addi r3, r1, -64 1366; CHECK-FISL-NEXT: lxvw4x vs0, 0, r3 1367; CHECK-FISL-NEXT: xxmrghw v2, vs0, vs1 1368; CHECK-FISL-NEXT: blr 1369; 1370; CHECK-LE-LABEL: test44: 1371; CHECK-LE: # %bb.0: 1372; CHECK-LE-NEXT: xxswapd vs0, v2 1373; CHECK-LE-NEXT: xscvuxdsp f1, v2 1374; CHECK-LE-NEXT: xscvuxdsp f0, f0 1375; CHECK-LE-NEXT: xscvdpspn vs1, f1 1376; CHECK-LE-NEXT: xscvdpspn vs0, f0 1377; CHECK-LE-NEXT: xxmrghw v2, vs1, vs0 1378; CHECK-LE-NEXT: blr 1379 %v = uitofp <2 x i64> %a to <2 x float> 1380 ret <2 x float> %v 1381 1382; FIXME: The code quality here looks pretty bad. 1383} 1384 1385define <2 x float> @test45(<2 x i64> %a) { 1386; CHECK-LABEL: test45: 1387; CHECK: # %bb.0: 1388; CHECK-NEXT: addi r3, r1, -16 1389; CHECK-NEXT: stxvd2x v2, 0, r3 1390; CHECK-NEXT: ld r3, -8(r1) 1391; CHECK-NEXT: std r3, -24(r1) 1392; CHECK-NEXT: ld r3, -16(r1) 1393; CHECK-NEXT: lfd f0, -24(r1) 1394; CHECK-NEXT: std r3, -32(r1) 1395; CHECK-NEXT: addi r3, r1, -48 1396; CHECK-NEXT: fcfids f0, f0 1397; CHECK-NEXT: stfs f0, -48(r1) 1398; CHECK-NEXT: lfd f0, -32(r1) 1399; CHECK-NEXT: fcfids f0, f0 1400; CHECK-NEXT: stfs f0, -64(r1) 1401; CHECK-NEXT: lxvw4x vs0, 0, r3 1402; CHECK-NEXT: addi r3, r1, -64 1403; CHECK-NEXT: lxvw4x vs1, 0, r3 1404; CHECK-NEXT: xxmrghw v2, vs1, vs0 1405; CHECK-NEXT: blr 1406; 1407; CHECK-REG-LABEL: test45: 1408; CHECK-REG: # %bb.0: 1409; CHECK-REG-NEXT: addi r3, r1, -16 1410; CHECK-REG-NEXT: stxvd2x v2, 0, r3 1411; CHECK-REG-NEXT: ld r3, -8(r1) 1412; CHECK-REG-NEXT: std r3, -24(r1) 1413; CHECK-REG-NEXT: ld r3, -16(r1) 1414; CHECK-REG-NEXT: lfd f0, -24(r1) 1415; CHECK-REG-NEXT: std r3, -32(r1) 1416; CHECK-REG-NEXT: addi r3, r1, -48 1417; CHECK-REG-NEXT: fcfids f0, f0 1418; CHECK-REG-NEXT: stfs f0, -48(r1) 1419; CHECK-REG-NEXT: lfd f0, -32(r1) 1420; CHECK-REG-NEXT: fcfids f0, f0 1421; CHECK-REG-NEXT: stfs f0, -64(r1) 1422; CHECK-REG-NEXT: lxvw4x vs0, 0, r3 1423; CHECK-REG-NEXT: addi r3, r1, -64 1424; CHECK-REG-NEXT: lxvw4x vs1, 0, r3 1425; CHECK-REG-NEXT: xxmrghw v2, vs1, vs0 1426; CHECK-REG-NEXT: blr 1427; 1428; CHECK-FISL-LABEL: test45: 1429; CHECK-FISL: # %bb.0: 1430; CHECK-FISL-NEXT: addi r3, r1, -16 1431; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 1432; CHECK-FISL-NEXT: ld r3, -8(r1) 1433; CHECK-FISL-NEXT: std r3, -24(r1) 1434; CHECK-FISL-NEXT: ld r3, -16(r1) 1435; CHECK-FISL-NEXT: std r3, -32(r1) 1436; CHECK-FISL-NEXT: lfd f0, -24(r1) 1437; CHECK-FISL-NEXT: fcfids f0, f0 1438; CHECK-FISL-NEXT: stfs f0, -48(r1) 1439; CHECK-FISL-NEXT: lfd f0, -32(r1) 1440; CHECK-FISL-NEXT: fcfids f0, f0 1441; CHECK-FISL-NEXT: stfs f0, -64(r1) 1442; CHECK-FISL-NEXT: addi r3, r1, -48 1443; CHECK-FISL-NEXT: lxvw4x vs1, 0, r3 1444; CHECK-FISL-NEXT: addi r3, r1, -64 1445; CHECK-FISL-NEXT: lxvw4x vs0, 0, r3 1446; CHECK-FISL-NEXT: xxmrghw v2, vs0, vs1 1447; CHECK-FISL-NEXT: blr 1448; 1449; CHECK-LE-LABEL: test45: 1450; CHECK-LE: # %bb.0: 1451; CHECK-LE-NEXT: xxswapd vs0, v2 1452; CHECK-LE-NEXT: xscvsxdsp f1, v2 1453; CHECK-LE-NEXT: xscvsxdsp f0, f0 1454; CHECK-LE-NEXT: xscvdpspn vs1, f1 1455; CHECK-LE-NEXT: xscvdpspn vs0, f0 1456; CHECK-LE-NEXT: xxmrghw v2, vs1, vs0 1457; CHECK-LE-NEXT: blr 1458 %v = sitofp <2 x i64> %a to <2 x float> 1459 ret <2 x float> %v 1460 1461; FIXME: The code quality here looks pretty bad. 1462} 1463 1464define <2 x i64> @test46(<2 x float> %a) { 1465; CHECK-LABEL: test46: 1466; CHECK: # %bb.0: 1467; CHECK-NEXT: addi r3, r1, -48 1468; CHECK-NEXT: stxvw4x v2, 0, r3 1469; CHECK-NEXT: lfs f0, -44(r1) 1470; CHECK-NEXT: xscvdpuxds f0, f0 1471; CHECK-NEXT: stfd f0, -32(r1) 1472; CHECK-NEXT: lfs f0, -48(r1) 1473; CHECK-NEXT: ld r3, -32(r1) 1474; CHECK-NEXT: xscvdpuxds f0, f0 1475; CHECK-NEXT: std r3, -8(r1) 1476; CHECK-NEXT: stfd f0, -24(r1) 1477; CHECK-NEXT: ld r3, -24(r1) 1478; CHECK-NEXT: std r3, -16(r1) 1479; CHECK-NEXT: addi r3, r1, -16 1480; CHECK-NEXT: lxvd2x v2, 0, r3 1481; CHECK-NEXT: blr 1482; 1483; CHECK-REG-LABEL: test46: 1484; CHECK-REG: # %bb.0: 1485; CHECK-REG-NEXT: addi r3, r1, -48 1486; CHECK-REG-NEXT: stxvw4x v2, 0, r3 1487; CHECK-REG-NEXT: lfs f0, -44(r1) 1488; CHECK-REG-NEXT: xscvdpuxds f0, f0 1489; CHECK-REG-NEXT: stfd f0, -32(r1) 1490; CHECK-REG-NEXT: lfs f0, -48(r1) 1491; CHECK-REG-NEXT: ld r3, -32(r1) 1492; CHECK-REG-NEXT: xscvdpuxds f0, f0 1493; CHECK-REG-NEXT: std r3, -8(r1) 1494; CHECK-REG-NEXT: stfd f0, -24(r1) 1495; CHECK-REG-NEXT: ld r3, -24(r1) 1496; CHECK-REG-NEXT: std r3, -16(r1) 1497; CHECK-REG-NEXT: addi r3, r1, -16 1498; CHECK-REG-NEXT: lxvd2x v2, 0, r3 1499; CHECK-REG-NEXT: blr 1500; 1501; CHECK-FISL-LABEL: test46: 1502; CHECK-FISL: # %bb.0: 1503; CHECK-FISL-NEXT: addi r3, r1, -48 1504; CHECK-FISL-NEXT: stxvw4x v2, 0, r3 1505; CHECK-FISL-NEXT: lfs f0, -44(r1) 1506; CHECK-FISL-NEXT: xscvdpuxds f0, f0 1507; CHECK-FISL-NEXT: stfd f0, -32(r1) 1508; CHECK-FISL-NEXT: lfs f0, -48(r1) 1509; CHECK-FISL-NEXT: xscvdpuxds f0, f0 1510; CHECK-FISL-NEXT: stfd f0, -24(r1) 1511; CHECK-FISL-NEXT: ld r3, -32(r1) 1512; CHECK-FISL-NEXT: std r3, -8(r1) 1513; CHECK-FISL-NEXT: ld r3, -24(r1) 1514; CHECK-FISL-NEXT: std r3, -16(r1) 1515; CHECK-FISL-NEXT: addi r3, r1, -16 1516; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 1517; CHECK-FISL-NEXT: blr 1518; 1519; CHECK-LE-LABEL: test46: 1520; CHECK-LE: # %bb.0: 1521; CHECK-LE-NEXT: xxmrglw vs0, v2, v2 1522; CHECK-LE-NEXT: xvcvspdp vs0, vs0 1523; CHECK-LE-NEXT: xvcvdpuxds v2, vs0 1524; CHECK-LE-NEXT: blr 1525 %v = fptoui <2 x float> %a to <2 x i64> 1526 ret <2 x i64> %v 1527 1528; FIXME: The code quality here looks pretty bad. 1529} 1530 1531define <2 x i64> @test47(<2 x float> %a) { 1532; CHECK-LABEL: test47: 1533; CHECK: # %bb.0: 1534; CHECK-NEXT: addi r3, r1, -48 1535; CHECK-NEXT: stxvw4x v2, 0, r3 1536; CHECK-NEXT: lfs f0, -44(r1) 1537; CHECK-NEXT: xscvdpsxds f0, f0 1538; CHECK-NEXT: stfd f0, -32(r1) 1539; CHECK-NEXT: lfs f0, -48(r1) 1540; CHECK-NEXT: ld r3, -32(r1) 1541; CHECK-NEXT: xscvdpsxds f0, f0 1542; CHECK-NEXT: std r3, -8(r1) 1543; CHECK-NEXT: stfd f0, -24(r1) 1544; CHECK-NEXT: ld r3, -24(r1) 1545; CHECK-NEXT: std r3, -16(r1) 1546; CHECK-NEXT: addi r3, r1, -16 1547; CHECK-NEXT: lxvd2x v2, 0, r3 1548; CHECK-NEXT: blr 1549; 1550; CHECK-REG-LABEL: test47: 1551; CHECK-REG: # %bb.0: 1552; CHECK-REG-NEXT: addi r3, r1, -48 1553; CHECK-REG-NEXT: stxvw4x v2, 0, r3 1554; CHECK-REG-NEXT: lfs f0, -44(r1) 1555; CHECK-REG-NEXT: xscvdpsxds f0, f0 1556; CHECK-REG-NEXT: stfd f0, -32(r1) 1557; CHECK-REG-NEXT: lfs f0, -48(r1) 1558; CHECK-REG-NEXT: ld r3, -32(r1) 1559; CHECK-REG-NEXT: xscvdpsxds f0, f0 1560; CHECK-REG-NEXT: std r3, -8(r1) 1561; CHECK-REG-NEXT: stfd f0, -24(r1) 1562; CHECK-REG-NEXT: ld r3, -24(r1) 1563; CHECK-REG-NEXT: std r3, -16(r1) 1564; CHECK-REG-NEXT: addi r3, r1, -16 1565; CHECK-REG-NEXT: lxvd2x v2, 0, r3 1566; CHECK-REG-NEXT: blr 1567; 1568; CHECK-FISL-LABEL: test47: 1569; CHECK-FISL: # %bb.0: 1570; CHECK-FISL-NEXT: addi r3, r1, -48 1571; CHECK-FISL-NEXT: stxvw4x v2, 0, r3 1572; CHECK-FISL-NEXT: lfs f0, -44(r1) 1573; CHECK-FISL-NEXT: xscvdpsxds f0, f0 1574; CHECK-FISL-NEXT: stfd f0, -32(r1) 1575; CHECK-FISL-NEXT: lfs f0, -48(r1) 1576; CHECK-FISL-NEXT: xscvdpsxds f0, f0 1577; CHECK-FISL-NEXT: stfd f0, -24(r1) 1578; CHECK-FISL-NEXT: ld r3, -32(r1) 1579; CHECK-FISL-NEXT: std r3, -8(r1) 1580; CHECK-FISL-NEXT: ld r3, -24(r1) 1581; CHECK-FISL-NEXT: std r3, -16(r1) 1582; CHECK-FISL-NEXT: addi r3, r1, -16 1583; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 1584; CHECK-FISL-NEXT: blr 1585; 1586; CHECK-LE-LABEL: test47: 1587; CHECK-LE: # %bb.0: 1588; CHECK-LE-NEXT: xxmrglw vs0, v2, v2 1589; CHECK-LE-NEXT: xvcvspdp vs0, vs0 1590; CHECK-LE-NEXT: xvcvdpsxds v2, vs0 1591; CHECK-LE-NEXT: blr 1592 %v = fptosi <2 x float> %a to <2 x i64> 1593 ret <2 x i64> %v 1594 1595; FIXME: The code quality here looks pretty bad. 1596} 1597 1598define <2 x double> @test50(ptr %a) { 1599; CHECK-LABEL: test50: 1600; CHECK: # %bb.0: 1601; CHECK-NEXT: lxvdsx v2, 0, r3 1602; CHECK-NEXT: blr 1603; 1604; CHECK-REG-LABEL: test50: 1605; CHECK-REG: # %bb.0: 1606; CHECK-REG-NEXT: lxvdsx v2, 0, r3 1607; CHECK-REG-NEXT: blr 1608; 1609; CHECK-FISL-LABEL: test50: 1610; CHECK-FISL: # %bb.0: 1611; CHECK-FISL-NEXT: lxvdsx v2, 0, r3 1612; CHECK-FISL-NEXT: blr 1613; 1614; CHECK-LE-LABEL: test50: 1615; CHECK-LE: # %bb.0: 1616; CHECK-LE-NEXT: lxvdsx v2, 0, r3 1617; CHECK-LE-NEXT: blr 1618 %v = load double, ptr %a, align 8 1619 %w = insertelement <2 x double> undef, double %v, i32 0 1620 %x = insertelement <2 x double> %w, double %v, i32 1 1621 ret <2 x double> %x 1622 1623 1624} 1625 1626define <2 x double> @test51(<2 x double> %a, <2 x double> %b) { 1627; CHECK-LABEL: test51: 1628; CHECK: # %bb.0: 1629; CHECK-NEXT: xxspltd v2, v2, 0 1630; CHECK-NEXT: blr 1631; 1632; CHECK-REG-LABEL: test51: 1633; CHECK-REG: # %bb.0: 1634; CHECK-REG-NEXT: xxspltd v2, v2, 0 1635; CHECK-REG-NEXT: blr 1636; 1637; CHECK-FISL-LABEL: test51: 1638; CHECK-FISL: # %bb.0: 1639; CHECK-FISL-NEXT: xxspltd v2, v2, 0 1640; CHECK-FISL-NEXT: blr 1641; 1642; CHECK-LE-LABEL: test51: 1643; CHECK-LE: # %bb.0: 1644; CHECK-LE-NEXT: xxspltd v2, v2, 1 1645; CHECK-LE-NEXT: blr 1646 %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0> 1647 ret <2 x double> %v 1648 1649 1650} 1651 1652define <2 x double> @test52(<2 x double> %a, <2 x double> %b) { 1653; CHECK-LABEL: test52: 1654; CHECK: # %bb.0: 1655; CHECK-NEXT: xxmrghd v2, v2, v3 1656; CHECK-NEXT: blr 1657; 1658; CHECK-REG-LABEL: test52: 1659; CHECK-REG: # %bb.0: 1660; CHECK-REG-NEXT: xxmrghd v2, v2, v3 1661; CHECK-REG-NEXT: blr 1662; 1663; CHECK-FISL-LABEL: test52: 1664; CHECK-FISL: # %bb.0: 1665; CHECK-FISL-NEXT: xxmrghd v2, v2, v3 1666; CHECK-FISL-NEXT: blr 1667; 1668; CHECK-LE-LABEL: test52: 1669; CHECK-LE: # %bb.0: 1670; CHECK-LE-NEXT: xxmrgld v2, v3, v2 1671; CHECK-LE-NEXT: blr 1672 %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2> 1673 ret <2 x double> %v 1674 1675 1676} 1677 1678define <2 x double> @test53(<2 x double> %a, <2 x double> %b) { 1679; CHECK-LABEL: test53: 1680; CHECK: # %bb.0: 1681; CHECK-NEXT: xxmrghd v2, v3, v2 1682; CHECK-NEXT: blr 1683; 1684; CHECK-REG-LABEL: test53: 1685; CHECK-REG: # %bb.0: 1686; CHECK-REG-NEXT: xxmrghd v2, v3, v2 1687; CHECK-REG-NEXT: blr 1688; 1689; CHECK-FISL-LABEL: test53: 1690; CHECK-FISL: # %bb.0: 1691; CHECK-FISL-NEXT: xxmrghd v2, v3, v2 1692; CHECK-FISL-NEXT: blr 1693; 1694; CHECK-LE-LABEL: test53: 1695; CHECK-LE: # %bb.0: 1696; CHECK-LE-NEXT: xxmrgld v2, v2, v3 1697; CHECK-LE-NEXT: blr 1698 %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 0> 1699 ret <2 x double> %v 1700 1701 1702} 1703 1704define <2 x double> @test54(<2 x double> %a, <2 x double> %b) { 1705; CHECK-LABEL: test54: 1706; CHECK: # %bb.0: 1707; CHECK-NEXT: xxpermdi v2, v2, v3, 2 1708; CHECK-NEXT: blr 1709; 1710; CHECK-REG-LABEL: test54: 1711; CHECK-REG: # %bb.0: 1712; CHECK-REG-NEXT: xxpermdi v2, v2, v3, 2 1713; CHECK-REG-NEXT: blr 1714; 1715; CHECK-FISL-LABEL: test54: 1716; CHECK-FISL: # %bb.0: 1717; CHECK-FISL-NEXT: xxpermdi v2, v2, v3, 2 1718; CHECK-FISL-NEXT: blr 1719; 1720; CHECK-LE-LABEL: test54: 1721; CHECK-LE: # %bb.0: 1722; CHECK-LE-NEXT: xxpermdi v2, v3, v2, 2 1723; CHECK-LE-NEXT: blr 1724 %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 2> 1725 ret <2 x double> %v 1726 1727 1728} 1729 1730define <2 x double> @test55(<2 x double> %a, <2 x double> %b) { 1731; CHECK-LABEL: test55: 1732; CHECK: # %bb.0: 1733; CHECK-NEXT: xxmrgld v2, v2, v3 1734; CHECK-NEXT: blr 1735; 1736; CHECK-REG-LABEL: test55: 1737; CHECK-REG: # %bb.0: 1738; CHECK-REG-NEXT: xxmrgld v2, v2, v3 1739; CHECK-REG-NEXT: blr 1740; 1741; CHECK-FISL-LABEL: test55: 1742; CHECK-FISL: # %bb.0: 1743; CHECK-FISL-NEXT: xxmrgld v2, v2, v3 1744; CHECK-FISL-NEXT: blr 1745; 1746; CHECK-LE-LABEL: test55: 1747; CHECK-LE: # %bb.0: 1748; CHECK-LE-NEXT: xxmrghd v2, v3, v2 1749; CHECK-LE-NEXT: blr 1750 %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3> 1751 ret <2 x double> %v 1752 1753 1754} 1755 1756define <2 x i64> @test56(<2 x i64> %a, <2 x i64> %b) { 1757; CHECK-LABEL: test56: 1758; CHECK: # %bb.0: 1759; CHECK-NEXT: xxmrgld v2, v2, v3 1760; CHECK-NEXT: blr 1761; 1762; CHECK-REG-LABEL: test56: 1763; CHECK-REG: # %bb.0: 1764; CHECK-REG-NEXT: xxmrgld v2, v2, v3 1765; CHECK-REG-NEXT: blr 1766; 1767; CHECK-FISL-LABEL: test56: 1768; CHECK-FISL: # %bb.0: 1769; CHECK-FISL-NEXT: xxmrgld v2, v2, v3 1770; CHECK-FISL-NEXT: blr 1771; 1772; CHECK-LE-LABEL: test56: 1773; CHECK-LE: # %bb.0: 1774; CHECK-LE-NEXT: xxmrghd v2, v3, v2 1775; CHECK-LE-NEXT: blr 1776 %v = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3> 1777 ret <2 x i64> %v 1778 1779 1780} 1781 1782define <2 x i64> @test60(<2 x i64> %a, <2 x i64> %b) { 1783; CHECK-LABEL: test60: 1784; CHECK: # %bb.0: 1785; CHECK-NEXT: addi r3, r1, -32 1786; CHECK-NEXT: stxvd2x v3, 0, r3 1787; CHECK-NEXT: addi r3, r1, -48 1788; CHECK-NEXT: stxvd2x v2, 0, r3 1789; CHECK-NEXT: lwz r3, -20(r1) 1790; CHECK-NEXT: ld r4, -40(r1) 1791; CHECK-NEXT: sld r3, r4, r3 1792; CHECK-NEXT: ld r4, -48(r1) 1793; CHECK-NEXT: std r3, -8(r1) 1794; CHECK-NEXT: lwz r3, -28(r1) 1795; CHECK-NEXT: sld r3, r4, r3 1796; CHECK-NEXT: std r3, -16(r1) 1797; CHECK-NEXT: addi r3, r1, -16 1798; CHECK-NEXT: lxvd2x v2, 0, r3 1799; CHECK-NEXT: blr 1800; 1801; CHECK-REG-LABEL: test60: 1802; CHECK-REG: # %bb.0: 1803; CHECK-REG-NEXT: addi r3, r1, -32 1804; CHECK-REG-NEXT: stxvd2x v3, 0, r3 1805; CHECK-REG-NEXT: addi r3, r1, -48 1806; CHECK-REG-NEXT: stxvd2x v2, 0, r3 1807; CHECK-REG-NEXT: lwz r3, -20(r1) 1808; CHECK-REG-NEXT: ld r4, -40(r1) 1809; CHECK-REG-NEXT: sld r3, r4, r3 1810; CHECK-REG-NEXT: ld r4, -48(r1) 1811; CHECK-REG-NEXT: std r3, -8(r1) 1812; CHECK-REG-NEXT: lwz r3, -28(r1) 1813; CHECK-REG-NEXT: sld r3, r4, r3 1814; CHECK-REG-NEXT: std r3, -16(r1) 1815; CHECK-REG-NEXT: addi r3, r1, -16 1816; CHECK-REG-NEXT: lxvd2x v2, 0, r3 1817; CHECK-REG-NEXT: blr 1818; 1819; CHECK-FISL-LABEL: test60: 1820; CHECK-FISL: # %bb.0: 1821; CHECK-FISL-NEXT: addi r3, r1, -32 1822; CHECK-FISL-NEXT: stxvd2x v3, 0, r3 1823; CHECK-FISL-NEXT: addi r3, r1, -48 1824; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 1825; CHECK-FISL-NEXT: lwz r4, -20(r1) 1826; CHECK-FISL-NEXT: ld r3, -40(r1) 1827; CHECK-FISL-NEXT: sld r3, r3, r4 1828; CHECK-FISL-NEXT: std r3, -8(r1) 1829; CHECK-FISL-NEXT: lwz r4, -28(r1) 1830; CHECK-FISL-NEXT: ld r3, -48(r1) 1831; CHECK-FISL-NEXT: sld r3, r3, r4 1832; CHECK-FISL-NEXT: std r3, -16(r1) 1833; CHECK-FISL-NEXT: addi r3, r1, -16 1834; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 1835; CHECK-FISL-NEXT: blr 1836; 1837; CHECK-LE-LABEL: test60: 1838; CHECK-LE: # %bb.0: 1839; CHECK-LE-NEXT: vsld v2, v2, v3 1840; CHECK-LE-NEXT: blr 1841 %v = shl <2 x i64> %a, %b 1842 ret <2 x i64> %v 1843 1844; This should scalarize, and the current code quality is not good. 1845} 1846 1847define <2 x i64> @test61(<2 x i64> %a, <2 x i64> %b) { 1848; CHECK-LABEL: test61: 1849; CHECK: # %bb.0: 1850; CHECK-NEXT: addi r3, r1, -32 1851; CHECK-NEXT: stxvd2x v3, 0, r3 1852; CHECK-NEXT: addi r3, r1, -48 1853; CHECK-NEXT: stxvd2x v2, 0, r3 1854; CHECK-NEXT: lwz r3, -20(r1) 1855; CHECK-NEXT: ld r4, -40(r1) 1856; CHECK-NEXT: srd r3, r4, r3 1857; CHECK-NEXT: ld r4, -48(r1) 1858; CHECK-NEXT: std r3, -8(r1) 1859; CHECK-NEXT: lwz r3, -28(r1) 1860; CHECK-NEXT: srd r3, r4, r3 1861; CHECK-NEXT: std r3, -16(r1) 1862; CHECK-NEXT: addi r3, r1, -16 1863; CHECK-NEXT: lxvd2x v2, 0, r3 1864; CHECK-NEXT: blr 1865; 1866; CHECK-REG-LABEL: test61: 1867; CHECK-REG: # %bb.0: 1868; CHECK-REG-NEXT: addi r3, r1, -32 1869; CHECK-REG-NEXT: stxvd2x v3, 0, r3 1870; CHECK-REG-NEXT: addi r3, r1, -48 1871; CHECK-REG-NEXT: stxvd2x v2, 0, r3 1872; CHECK-REG-NEXT: lwz r3, -20(r1) 1873; CHECK-REG-NEXT: ld r4, -40(r1) 1874; CHECK-REG-NEXT: srd r3, r4, r3 1875; CHECK-REG-NEXT: ld r4, -48(r1) 1876; CHECK-REG-NEXT: std r3, -8(r1) 1877; CHECK-REG-NEXT: lwz r3, -28(r1) 1878; CHECK-REG-NEXT: srd r3, r4, r3 1879; CHECK-REG-NEXT: std r3, -16(r1) 1880; CHECK-REG-NEXT: addi r3, r1, -16 1881; CHECK-REG-NEXT: lxvd2x v2, 0, r3 1882; CHECK-REG-NEXT: blr 1883; 1884; CHECK-FISL-LABEL: test61: 1885; CHECK-FISL: # %bb.0: 1886; CHECK-FISL-NEXT: addi r3, r1, -32 1887; CHECK-FISL-NEXT: stxvd2x v3, 0, r3 1888; CHECK-FISL-NEXT: addi r3, r1, -48 1889; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 1890; CHECK-FISL-NEXT: lwz r4, -20(r1) 1891; CHECK-FISL-NEXT: ld r3, -40(r1) 1892; CHECK-FISL-NEXT: srd r3, r3, r4 1893; CHECK-FISL-NEXT: std r3, -8(r1) 1894; CHECK-FISL-NEXT: lwz r4, -28(r1) 1895; CHECK-FISL-NEXT: ld r3, -48(r1) 1896; CHECK-FISL-NEXT: srd r3, r3, r4 1897; CHECK-FISL-NEXT: std r3, -16(r1) 1898; CHECK-FISL-NEXT: addi r3, r1, -16 1899; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 1900; CHECK-FISL-NEXT: blr 1901; 1902; CHECK-LE-LABEL: test61: 1903; CHECK-LE: # %bb.0: 1904; CHECK-LE-NEXT: vsrd v2, v2, v3 1905; CHECK-LE-NEXT: blr 1906 %v = lshr <2 x i64> %a, %b 1907 ret <2 x i64> %v 1908 1909; This should scalarize, and the current code quality is not good. 1910} 1911 1912define <2 x i64> @test62(<2 x i64> %a, <2 x i64> %b) { 1913; CHECK-LABEL: test62: 1914; CHECK: # %bb.0: 1915; CHECK-NEXT: addi r3, r1, -32 1916; CHECK-NEXT: stxvd2x v3, 0, r3 1917; CHECK-NEXT: addi r3, r1, -48 1918; CHECK-NEXT: stxvd2x v2, 0, r3 1919; CHECK-NEXT: lwz r3, -20(r1) 1920; CHECK-NEXT: ld r4, -40(r1) 1921; CHECK-NEXT: srad r3, r4, r3 1922; CHECK-NEXT: ld r4, -48(r1) 1923; CHECK-NEXT: std r3, -8(r1) 1924; CHECK-NEXT: lwz r3, -28(r1) 1925; CHECK-NEXT: srad r3, r4, r3 1926; CHECK-NEXT: std r3, -16(r1) 1927; CHECK-NEXT: addi r3, r1, -16 1928; CHECK-NEXT: lxvd2x v2, 0, r3 1929; CHECK-NEXT: blr 1930; 1931; CHECK-REG-LABEL: test62: 1932; CHECK-REG: # %bb.0: 1933; CHECK-REG-NEXT: addi r3, r1, -32 1934; CHECK-REG-NEXT: stxvd2x v3, 0, r3 1935; CHECK-REG-NEXT: addi r3, r1, -48 1936; CHECK-REG-NEXT: stxvd2x v2, 0, r3 1937; CHECK-REG-NEXT: lwz r3, -20(r1) 1938; CHECK-REG-NEXT: ld r4, -40(r1) 1939; CHECK-REG-NEXT: srad r3, r4, r3 1940; CHECK-REG-NEXT: ld r4, -48(r1) 1941; CHECK-REG-NEXT: std r3, -8(r1) 1942; CHECK-REG-NEXT: lwz r3, -28(r1) 1943; CHECK-REG-NEXT: srad r3, r4, r3 1944; CHECK-REG-NEXT: std r3, -16(r1) 1945; CHECK-REG-NEXT: addi r3, r1, -16 1946; CHECK-REG-NEXT: lxvd2x v2, 0, r3 1947; CHECK-REG-NEXT: blr 1948; 1949; CHECK-FISL-LABEL: test62: 1950; CHECK-FISL: # %bb.0: 1951; CHECK-FISL-NEXT: addi r3, r1, -32 1952; CHECK-FISL-NEXT: stxvd2x v3, 0, r3 1953; CHECK-FISL-NEXT: addi r3, r1, -48 1954; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 1955; CHECK-FISL-NEXT: lwz r4, -20(r1) 1956; CHECK-FISL-NEXT: ld r3, -40(r1) 1957; CHECK-FISL-NEXT: srad r3, r3, r4 1958; CHECK-FISL-NEXT: std r3, -8(r1) 1959; CHECK-FISL-NEXT: lwz r4, -28(r1) 1960; CHECK-FISL-NEXT: ld r3, -48(r1) 1961; CHECK-FISL-NEXT: srad r3, r3, r4 1962; CHECK-FISL-NEXT: std r3, -16(r1) 1963; CHECK-FISL-NEXT: addi r3, r1, -16 1964; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 1965; CHECK-FISL-NEXT: blr 1966; 1967; CHECK-LE-LABEL: test62: 1968; CHECK-LE: # %bb.0: 1969; CHECK-LE-NEXT: vsrad v2, v2, v3 1970; CHECK-LE-NEXT: blr 1971 %v = ashr <2 x i64> %a, %b 1972 ret <2 x i64> %v 1973 1974; This should scalarize, and the current code quality is not good. 1975} 1976 1977define double @test63(<2 x double> %a) { 1978; CHECK-LABEL: test63: 1979; CHECK: # %bb.0: 1980; CHECK-NEXT: xxlor f1, v2, v2 1981; CHECK-NEXT: blr 1982; 1983; CHECK-REG-LABEL: test63: 1984; CHECK-REG: # %bb.0: 1985; CHECK-REG-NEXT: xxlor f1, v2, v2 1986; CHECK-REG-NEXT: blr 1987; 1988; CHECK-FISL-LABEL: test63: 1989; CHECK-FISL: # %bb.0: 1990; CHECK-FISL-NEXT: xxlor f1, v2, v2 1991; CHECK-FISL-NEXT: blr 1992; 1993; CHECK-LE-LABEL: test63: 1994; CHECK-LE: # %bb.0: 1995; CHECK-LE-NEXT: xxswapd vs1, v2 1996; CHECK-LE-NEXT: blr 1997 %v = extractelement <2 x double> %a, i32 0 1998 ret double %v 1999 2000 2001 2002} 2003 2004define double @test64(<2 x double> %a) { 2005; CHECK-LABEL: test64: 2006; CHECK: # %bb.0: 2007; CHECK-NEXT: xxswapd vs1, v2 2008; CHECK-NEXT: blr 2009; 2010; CHECK-REG-LABEL: test64: 2011; CHECK-REG: # %bb.0: 2012; CHECK-REG-NEXT: xxswapd vs1, v2 2013; CHECK-REG-NEXT: blr 2014; 2015; CHECK-FISL-LABEL: test64: 2016; CHECK-FISL: # %bb.0: 2017; CHECK-FISL-NEXT: xxswapd vs0, v2 2018; CHECK-FISL-NEXT: fmr f1, f0 2019; CHECK-FISL-NEXT: blr 2020; 2021; CHECK-LE-LABEL: test64: 2022; CHECK-LE: # %bb.0: 2023; CHECK-LE-NEXT: xxlor f1, v2, v2 2024; CHECK-LE-NEXT: blr 2025 %v = extractelement <2 x double> %a, i32 1 2026 ret double %v 2027 2028 2029 2030} 2031 2032define <2 x i1> @test65(<2 x i64> %a, <2 x i64> %b) { 2033; CHECK-LABEL: test65: 2034; CHECK: # %bb.0: 2035; CHECK-NEXT: addis r3, r2, .LCPI59_0@toc@ha 2036; CHECK-NEXT: vcmpequw v2, v2, v3 2037; CHECK-NEXT: addi r3, r3, .LCPI59_0@toc@l 2038; CHECK-NEXT: lxvw4x v3, 0, r3 2039; CHECK-NEXT: vperm v3, v2, v2, v3 2040; CHECK-NEXT: xxland v2, v3, v2 2041; CHECK-NEXT: blr 2042; 2043; CHECK-REG-LABEL: test65: 2044; CHECK-REG: # %bb.0: 2045; CHECK-REG-NEXT: addis r3, r2, .LCPI59_0@toc@ha 2046; CHECK-REG-NEXT: vcmpequw v2, v2, v3 2047; CHECK-REG-NEXT: addi r3, r3, .LCPI59_0@toc@l 2048; CHECK-REG-NEXT: lxvw4x v3, 0, r3 2049; CHECK-REG-NEXT: vperm v3, v2, v2, v3 2050; CHECK-REG-NEXT: xxland v2, v3, v2 2051; CHECK-REG-NEXT: blr 2052; 2053; CHECK-FISL-LABEL: test65: 2054; CHECK-FISL: # %bb.0: 2055; CHECK-FISL-NEXT: vcmpequw v3, v2, v3 2056; CHECK-FISL-NEXT: addis r3, r2, .LCPI59_0@toc@ha 2057; CHECK-FISL-NEXT: addi r3, r3, .LCPI59_0@toc@l 2058; CHECK-FISL-NEXT: lxvw4x v2, 0, r3 2059; CHECK-FISL-NEXT: vperm v2, v3, v3, v2 2060; CHECK-FISL-NEXT: xxland v2, v2, v3 2061; CHECK-FISL-NEXT: blr 2062; 2063; CHECK-LE-LABEL: test65: 2064; CHECK-LE: # %bb.0: 2065; CHECK-LE-NEXT: vcmpequd v2, v2, v3 2066; CHECK-LE-NEXT: blr 2067 %w = icmp eq <2 x i64> %a, %b 2068 ret <2 x i1> %w 2069 2070 2071 2072} 2073 2074define <2 x i1> @test66(<2 x i64> %a, <2 x i64> %b) { 2075; CHECK-LABEL: test66: 2076; CHECK: # %bb.0: 2077; CHECK-NEXT: addis r3, r2, .LCPI60_0@toc@ha 2078; CHECK-NEXT: vcmpequw v2, v2, v3 2079; CHECK-NEXT: addi r3, r3, .LCPI60_0@toc@l 2080; CHECK-NEXT: lxvw4x v3, 0, r3 2081; CHECK-NEXT: xxlnor v2, v2, v2 2082; CHECK-NEXT: vperm v3, v2, v2, v3 2083; CHECK-NEXT: xxlor v2, v3, v2 2084; CHECK-NEXT: blr 2085; 2086; CHECK-REG-LABEL: test66: 2087; CHECK-REG: # %bb.0: 2088; CHECK-REG-NEXT: addis r3, r2, .LCPI60_0@toc@ha 2089; CHECK-REG-NEXT: vcmpequw v2, v2, v3 2090; CHECK-REG-NEXT: addi r3, r3, .LCPI60_0@toc@l 2091; CHECK-REG-NEXT: lxvw4x v3, 0, r3 2092; CHECK-REG-NEXT: xxlnor v2, v2, v2 2093; CHECK-REG-NEXT: vperm v3, v2, v2, v3 2094; CHECK-REG-NEXT: xxlor v2, v3, v2 2095; CHECK-REG-NEXT: blr 2096; 2097; CHECK-FISL-LABEL: test66: 2098; CHECK-FISL: # %bb.0: 2099; CHECK-FISL-NEXT: vcmpequw v2, v2, v3 2100; CHECK-FISL-NEXT: xxlnor v3, v2, v2 2101; CHECK-FISL-NEXT: addis r3, r2, .LCPI60_0@toc@ha 2102; CHECK-FISL-NEXT: addi r3, r3, .LCPI60_0@toc@l 2103; CHECK-FISL-NEXT: lxvw4x v2, 0, r3 2104; CHECK-FISL-NEXT: vperm v2, v3, v3, v2 2105; CHECK-FISL-NEXT: xxlor v2, v2, v3 2106; CHECK-FISL-NEXT: blr 2107; 2108; CHECK-LE-LABEL: test66: 2109; CHECK-LE: # %bb.0: 2110; CHECK-LE-NEXT: vcmpequd v2, v2, v3 2111; CHECK-LE-NEXT: xxlnor v2, v2, v2 2112; CHECK-LE-NEXT: blr 2113 %w = icmp ne <2 x i64> %a, %b 2114 ret <2 x i1> %w 2115 2116 2117 2118} 2119 2120define <2 x i1> @test67(<2 x i64> %a, <2 x i64> %b) { 2121; CHECK-LABEL: test67: 2122; CHECK: # %bb.0: 2123; CHECK-NEXT: addi r3, r1, -32 2124; CHECK-NEXT: stxvd2x v3, 0, r3 2125; CHECK-NEXT: addi r3, r1, -48 2126; CHECK-NEXT: stxvd2x v2, 0, r3 2127; CHECK-NEXT: ld r3, -24(r1) 2128; CHECK-NEXT: ld r4, -40(r1) 2129; CHECK-NEXT: ld r6, -48(r1) 2130; CHECK-NEXT: cmpld r4, r3 2131; CHECK-NEXT: li r3, 0 2132; CHECK-NEXT: li r4, -1 2133; CHECK-NEXT: isellt r5, r4, r3 2134; CHECK-NEXT: std r5, -8(r1) 2135; CHECK-NEXT: ld r5, -32(r1) 2136; CHECK-NEXT: cmpld r6, r5 2137; CHECK-NEXT: isellt r3, r4, r3 2138; CHECK-NEXT: std r3, -16(r1) 2139; CHECK-NEXT: addi r3, r1, -16 2140; CHECK-NEXT: lxvd2x v2, 0, r3 2141; CHECK-NEXT: blr 2142; 2143; CHECK-REG-LABEL: test67: 2144; CHECK-REG: # %bb.0: 2145; CHECK-REG-NEXT: addi r3, r1, -32 2146; CHECK-REG-NEXT: stxvd2x v3, 0, r3 2147; CHECK-REG-NEXT: addi r3, r1, -48 2148; CHECK-REG-NEXT: stxvd2x v2, 0, r3 2149; CHECK-REG-NEXT: ld r3, -24(r1) 2150; CHECK-REG-NEXT: ld r4, -40(r1) 2151; CHECK-REG-NEXT: ld r6, -48(r1) 2152; CHECK-REG-NEXT: cmpld r4, r3 2153; CHECK-REG-NEXT: li r3, 0 2154; CHECK-REG-NEXT: li r4, -1 2155; CHECK-REG-NEXT: isellt r5, r4, r3 2156; CHECK-REG-NEXT: std r5, -8(r1) 2157; CHECK-REG-NEXT: ld r5, -32(r1) 2158; CHECK-REG-NEXT: cmpld r6, r5 2159; CHECK-REG-NEXT: isellt r3, r4, r3 2160; CHECK-REG-NEXT: std r3, -16(r1) 2161; CHECK-REG-NEXT: addi r3, r1, -16 2162; CHECK-REG-NEXT: lxvd2x v2, 0, r3 2163; CHECK-REG-NEXT: blr 2164; 2165; CHECK-FISL-LABEL: test67: 2166; CHECK-FISL: # %bb.0: 2167; CHECK-FISL-NEXT: addi r3, r1, -32 2168; CHECK-FISL-NEXT: stxvd2x v3, 0, r3 2169; CHECK-FISL-NEXT: addi r3, r1, -48 2170; CHECK-FISL-NEXT: stxvd2x v2, 0, r3 2171; CHECK-FISL-NEXT: ld r4, -24(r1) 2172; CHECK-FISL-NEXT: ld r3, -40(r1) 2173; CHECK-FISL-NEXT: cmpld r3, r4 2174; CHECK-FISL-NEXT: li r4, 0 2175; CHECK-FISL-NEXT: li r3, -1 2176; CHECK-FISL-NEXT: isellt r5, r3, r4 2177; CHECK-FISL-NEXT: std r5, -8(r1) 2178; CHECK-FISL-NEXT: ld r6, -32(r1) 2179; CHECK-FISL-NEXT: ld r5, -48(r1) 2180; CHECK-FISL-NEXT: cmpld r5, r6 2181; CHECK-FISL-NEXT: isellt r3, r3, r4 2182; CHECK-FISL-NEXT: std r3, -16(r1) 2183; CHECK-FISL-NEXT: addi r3, r1, -16 2184; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 2185; CHECK-FISL-NEXT: blr 2186; 2187; CHECK-LE-LABEL: test67: 2188; CHECK-LE: # %bb.0: 2189; CHECK-LE-NEXT: vcmpgtud v2, v3, v2 2190; CHECK-LE-NEXT: blr 2191 %w = icmp ult <2 x i64> %a, %b 2192 ret <2 x i1> %w 2193 2194; This should scalarize, and the current code quality is not good. 2195 2196} 2197 2198define <2 x double> @test68(<2 x i32> %a) { 2199; CHECK-LABEL: test68: 2200; CHECK: # %bb.0: 2201; CHECK-NEXT: xxmrghw vs0, v2, v2 2202; CHECK-NEXT: xvcvsxwdp v2, vs0 2203; CHECK-NEXT: blr 2204; 2205; CHECK-REG-LABEL: test68: 2206; CHECK-REG: # %bb.0: 2207; CHECK-REG-NEXT: xxmrghw vs0, v2, v2 2208; CHECK-REG-NEXT: xvcvsxwdp v2, vs0 2209; CHECK-REG-NEXT: blr 2210; 2211; CHECK-FISL-LABEL: test68: 2212; CHECK-FISL: # %bb.0: 2213; CHECK-FISL-NEXT: xxmrghw vs0, v2, v2 2214; CHECK-FISL-NEXT: xvcvsxwdp v2, vs0 2215; CHECK-FISL-NEXT: blr 2216; 2217; CHECK-LE-LABEL: test68: 2218; CHECK-LE: # %bb.0: 2219; CHECK-LE-NEXT: xxmrglw v2, v2, v2 2220; CHECK-LE-NEXT: xvcvsxwdp v2, v2 2221; CHECK-LE-NEXT: blr 2222 %w = sitofp <2 x i32> %a to <2 x double> 2223 ret <2 x double> %w 2224 2225 2226} 2227 2228; This gets scalarized so the code isn't great 2229define <2 x double> @test69(<2 x i16> %a) { 2230; CHECK-LABEL: test69: 2231; CHECK: # %bb.0: 2232; CHECK-NEXT: addis r3, r2, .LCPI63_0@toc@ha 2233; CHECK-NEXT: addi r3, r3, .LCPI63_0@toc@l 2234; CHECK-NEXT: lxvw4x v3, 0, r3 2235; CHECK-NEXT: addi r3, r1, -32 2236; CHECK-NEXT: vperm v2, v2, v2, v3 2237; CHECK-NEXT: stxvd2x v2, 0, r3 2238; CHECK-NEXT: lha r3, -18(r1) 2239; CHECK-NEXT: std r3, -8(r1) 2240; CHECK-NEXT: lha r3, -26(r1) 2241; CHECK-NEXT: std r3, -16(r1) 2242; CHECK-NEXT: addi r3, r1, -16 2243; CHECK-NEXT: lxvd2x v2, 0, r3 2244; CHECK-NEXT: xvcvsxddp v2, v2 2245; CHECK-NEXT: blr 2246; 2247; CHECK-REG-LABEL: test69: 2248; CHECK-REG: # %bb.0: 2249; CHECK-REG-NEXT: addis r3, r2, .LCPI63_0@toc@ha 2250; CHECK-REG-NEXT: addi r3, r3, .LCPI63_0@toc@l 2251; CHECK-REG-NEXT: lxvw4x v3, 0, r3 2252; CHECK-REG-NEXT: addi r3, r1, -32 2253; CHECK-REG-NEXT: vperm v2, v2, v2, v3 2254; CHECK-REG-NEXT: stxvd2x v2, 0, r3 2255; CHECK-REG-NEXT: lha r3, -18(r1) 2256; CHECK-REG-NEXT: std r3, -8(r1) 2257; CHECK-REG-NEXT: lha r3, -26(r1) 2258; CHECK-REG-NEXT: std r3, -16(r1) 2259; CHECK-REG-NEXT: addi r3, r1, -16 2260; CHECK-REG-NEXT: lxvd2x v2, 0, r3 2261; CHECK-REG-NEXT: xvcvsxddp v2, v2 2262; CHECK-REG-NEXT: blr 2263; 2264; CHECK-FISL-LABEL: test69: 2265; CHECK-FISL: # %bb.0: 2266; CHECK-FISL-NEXT: addis r3, r2, .LCPI63_0@toc@ha 2267; CHECK-FISL-NEXT: addi r3, r3, .LCPI63_0@toc@l 2268; CHECK-FISL-NEXT: lxvw4x v3, 0, r3 2269; CHECK-FISL-NEXT: vperm v2, v2, v2, v3 2270; CHECK-FISL-NEXT: xxlor vs0, v2, v2 2271; CHECK-FISL-NEXT: addi r3, r1, -32 2272; CHECK-FISL-NEXT: stxvd2x vs0, 0, r3 2273; CHECK-FISL-NEXT: lha r3, -18(r1) 2274; CHECK-FISL-NEXT: std r3, -8(r1) 2275; CHECK-FISL-NEXT: lha r3, -26(r1) 2276; CHECK-FISL-NEXT: std r3, -16(r1) 2277; CHECK-FISL-NEXT: addi r3, r1, -16 2278; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 2279; CHECK-FISL-NEXT: xvcvsxddp v2, v2 2280; CHECK-FISL-NEXT: blr 2281; 2282; CHECK-LE-LABEL: test69: 2283; CHECK-LE: # %bb.0: 2284; CHECK-LE-NEXT: addis r3, r2, .LCPI63_0@toc@ha 2285; CHECK-LE-NEXT: addi r3, r3, .LCPI63_0@toc@l 2286; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 2287; CHECK-LE-NEXT: addis r3, r2, .LCPI63_1@toc@ha 2288; CHECK-LE-NEXT: addi r3, r3, .LCPI63_1@toc@l 2289; CHECK-LE-NEXT: xxswapd v3, vs0 2290; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2291; CHECK-LE-NEXT: lxvd2x v3, 0, r3 2292; CHECK-LE-NEXT: vsld v2, v2, v3 2293; CHECK-LE-NEXT: vsrad v2, v2, v3 2294; CHECK-LE-NEXT: xvcvsxddp v2, v2 2295; CHECK-LE-NEXT: blr 2296 %w = sitofp <2 x i16> %a to <2 x double> 2297 ret <2 x double> %w 2298 2299 2300} 2301 2302; This gets scalarized so the code isn't great 2303define <2 x double> @test70(<2 x i8> %a) { 2304; CHECK-LABEL: test70: 2305; CHECK: # %bb.0: 2306; CHECK-NEXT: addis r3, r2, .LCPI64_0@toc@ha 2307; CHECK-NEXT: addi r3, r3, .LCPI64_0@toc@l 2308; CHECK-NEXT: lxvw4x v3, 0, r3 2309; CHECK-NEXT: addi r3, r1, -32 2310; CHECK-NEXT: vperm v2, v2, v2, v3 2311; CHECK-NEXT: stxvd2x v2, 0, r3 2312; CHECK-NEXT: ld r3, -24(r1) 2313; CHECK-NEXT: extsb r3, r3 2314; CHECK-NEXT: std r3, -8(r1) 2315; CHECK-NEXT: ld r3, -32(r1) 2316; CHECK-NEXT: extsb r3, r3 2317; CHECK-NEXT: std r3, -16(r1) 2318; CHECK-NEXT: addi r3, r1, -16 2319; CHECK-NEXT: lxvd2x v2, 0, r3 2320; CHECK-NEXT: xvcvsxddp v2, v2 2321; CHECK-NEXT: blr 2322; 2323; CHECK-REG-LABEL: test70: 2324; CHECK-REG: # %bb.0: 2325; CHECK-REG-NEXT: addis r3, r2, .LCPI64_0@toc@ha 2326; CHECK-REG-NEXT: addi r3, r3, .LCPI64_0@toc@l 2327; CHECK-REG-NEXT: lxvw4x v3, 0, r3 2328; CHECK-REG-NEXT: addi r3, r1, -32 2329; CHECK-REG-NEXT: vperm v2, v2, v2, v3 2330; CHECK-REG-NEXT: stxvd2x v2, 0, r3 2331; CHECK-REG-NEXT: ld r3, -24(r1) 2332; CHECK-REG-NEXT: extsb r3, r3 2333; CHECK-REG-NEXT: std r3, -8(r1) 2334; CHECK-REG-NEXT: ld r3, -32(r1) 2335; CHECK-REG-NEXT: extsb r3, r3 2336; CHECK-REG-NEXT: std r3, -16(r1) 2337; CHECK-REG-NEXT: addi r3, r1, -16 2338; CHECK-REG-NEXT: lxvd2x v2, 0, r3 2339; CHECK-REG-NEXT: xvcvsxddp v2, v2 2340; CHECK-REG-NEXT: blr 2341; 2342; CHECK-FISL-LABEL: test70: 2343; CHECK-FISL: # %bb.0: 2344; CHECK-FISL-NEXT: addis r3, r2, .LCPI64_0@toc@ha 2345; CHECK-FISL-NEXT: addi r3, r3, .LCPI64_0@toc@l 2346; CHECK-FISL-NEXT: lxvw4x v3, 0, r3 2347; CHECK-FISL-NEXT: vperm v2, v2, v2, v3 2348; CHECK-FISL-NEXT: xxlor vs0, v2, v2 2349; CHECK-FISL-NEXT: addi r3, r1, -32 2350; CHECK-FISL-NEXT: stxvd2x vs0, 0, r3 2351; CHECK-FISL-NEXT: ld r3, -24(r1) 2352; CHECK-FISL-NEXT: extsb r3, r3 2353; CHECK-FISL-NEXT: std r3, -8(r1) 2354; CHECK-FISL-NEXT: ld r3, -32(r1) 2355; CHECK-FISL-NEXT: extsb r3, r3 2356; CHECK-FISL-NEXT: std r3, -16(r1) 2357; CHECK-FISL-NEXT: addi r3, r1, -16 2358; CHECK-FISL-NEXT: lxvd2x v2, 0, r3 2359; CHECK-FISL-NEXT: xvcvsxddp v2, v2 2360; CHECK-FISL-NEXT: blr 2361; 2362; CHECK-LE-LABEL: test70: 2363; CHECK-LE: # %bb.0: 2364; CHECK-LE-NEXT: addis r3, r2, .LCPI64_0@toc@ha 2365; CHECK-LE-NEXT: addi r3, r3, .LCPI64_0@toc@l 2366; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 2367; CHECK-LE-NEXT: addis r3, r2, .LCPI64_1@toc@ha 2368; CHECK-LE-NEXT: addi r3, r3, .LCPI64_1@toc@l 2369; CHECK-LE-NEXT: xxswapd v3, vs0 2370; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2371; CHECK-LE-NEXT: lxvd2x v3, 0, r3 2372; CHECK-LE-NEXT: vsld v2, v2, v3 2373; CHECK-LE-NEXT: vsrad v2, v2, v3 2374; CHECK-LE-NEXT: xvcvsxddp v2, v2 2375; CHECK-LE-NEXT: blr 2376 %w = sitofp <2 x i8> %a to <2 x double> 2377 ret <2 x double> %w 2378 2379 2380} 2381 2382; This gets scalarized so the code isn't great 2383define <2 x i32> @test80(i32 %v) { 2384; CHECK-LABEL: test80: 2385; CHECK: # %bb.0: 2386; CHECK-NEXT: sldi r3, r3, 32 2387; CHECK-NEXT: std r3, -16(r1) 2388; CHECK-NEXT: std r3, -8(r1) 2389; CHECK-NEXT: addi r3, r1, -16 2390; CHECK-NEXT: lxvw4x vs0, 0, r3 2391; CHECK-NEXT: addis r3, r2, .LCPI65_0@toc@ha 2392; CHECK-NEXT: addi r3, r3, .LCPI65_0@toc@l 2393; CHECK-NEXT: lxvw4x v3, 0, r3 2394; CHECK-NEXT: xxspltw v2, vs0, 0 2395; CHECK-NEXT: vadduwm v2, v2, v3 2396; CHECK-NEXT: blr 2397; 2398; CHECK-REG-LABEL: test80: 2399; CHECK-REG: # %bb.0: 2400; CHECK-REG-NEXT: sldi r3, r3, 32 2401; CHECK-REG-NEXT: std r3, -16(r1) 2402; CHECK-REG-NEXT: std r3, -8(r1) 2403; CHECK-REG-NEXT: addi r3, r1, -16 2404; CHECK-REG-NEXT: lxvw4x vs0, 0, r3 2405; CHECK-REG-NEXT: addis r3, r2, .LCPI65_0@toc@ha 2406; CHECK-REG-NEXT: addi r3, r3, .LCPI65_0@toc@l 2407; CHECK-REG-NEXT: lxvw4x v3, 0, r3 2408; CHECK-REG-NEXT: xxspltw v2, vs0, 0 2409; CHECK-REG-NEXT: vadduwm v2, v2, v3 2410; CHECK-REG-NEXT: blr 2411; 2412; CHECK-FISL-LABEL: test80: 2413; CHECK-FISL: # %bb.0: 2414; CHECK-FISL-NEXT: mr r4, r3 2415; CHECK-FISL-NEXT: # implicit-def: $x3 2416; CHECK-FISL-NEXT: mr r3, r4 2417; CHECK-FISL-NEXT: sldi r3, r3, 32 2418; CHECK-FISL-NEXT: std r3, -8(r1) 2419; CHECK-FISL-NEXT: std r3, -16(r1) 2420; CHECK-FISL-NEXT: addi r3, r1, -16 2421; CHECK-FISL-NEXT: lxvw4x vs0, 0, r3 2422; CHECK-FISL-NEXT: xxspltw v2, vs0, 0 2423; CHECK-FISL-NEXT: addis r3, r2, .LCPI65_0@toc@ha 2424; CHECK-FISL-NEXT: addi r3, r3, .LCPI65_0@toc@l 2425; CHECK-FISL-NEXT: lxvw4x v3, 0, r3 2426; CHECK-FISL-NEXT: vadduwm v2, v2, v3 2427; CHECK-FISL-NEXT: blr 2428; 2429; CHECK-LE-LABEL: test80: 2430; CHECK-LE: # %bb.0: 2431; CHECK-LE-NEXT: mtfprwz f0, r3 2432; CHECK-LE-NEXT: addis r3, r2, .LCPI65_0@toc@ha 2433; CHECK-LE-NEXT: addi r3, r3, .LCPI65_0@toc@l 2434; CHECK-LE-NEXT: xxspltw v2, vs0, 1 2435; CHECK-LE-NEXT: lxvd2x vs0, 0, r3 2436; CHECK-LE-NEXT: xxswapd v3, vs0 2437; CHECK-LE-NEXT: vadduwm v2, v2, v3 2438; CHECK-LE-NEXT: blr 2439 %b1 = insertelement <2 x i32> undef, i32 %v, i32 0 2440 %b2 = shufflevector <2 x i32> %b1, <2 x i32> undef, <2 x i32> zeroinitializer 2441 %i = add <2 x i32> %b2, <i32 2, i32 3> 2442 ret <2 x i32> %i 2443 2444 2445 2446} 2447 2448define <2 x double> @test81(<4 x float> %b) { 2449; CHECK-LABEL: test81: 2450; CHECK: # %bb.0: 2451; CHECK-NEXT: blr 2452; 2453; CHECK-REG-LABEL: test81: 2454; CHECK-REG: # %bb.0: 2455; CHECK-REG-NEXT: blr 2456; 2457; CHECK-FISL-LABEL: test81: 2458; CHECK-FISL: # %bb.0: 2459; CHECK-FISL-NEXT: blr 2460; 2461; CHECK-LE-LABEL: test81: 2462; CHECK-LE: # %bb.0: 2463; CHECK-LE-NEXT: blr 2464 %w = bitcast <4 x float> %b to <2 x double> 2465 ret <2 x double> %w 2466 2467 2468} 2469 2470define double @test82(double %a, double %b, double %c, double %d) { 2471; CHECK-LABEL: test82: 2472; CHECK: # %bb.0: # %entry 2473; CHECK-NEXT: xscmpudp cr0, f3, f4 2474; CHECK-NEXT: beqlr cr0 2475; CHECK-NEXT: # %bb.1: # %entry 2476; CHECK-NEXT: fmr f1, f2 2477; CHECK-NEXT: blr 2478; 2479; CHECK-REG-LABEL: test82: 2480; CHECK-REG: # %bb.0: # %entry 2481; CHECK-REG-NEXT: xscmpudp cr0, f3, f4 2482; CHECK-REG-NEXT: beqlr cr0 2483; CHECK-REG-NEXT: # %bb.1: # %entry 2484; CHECK-REG-NEXT: fmr f1, f2 2485; CHECK-REG-NEXT: blr 2486; 2487; CHECK-FISL-LABEL: test82: 2488; CHECK-FISL: # %bb.0: # %entry 2489; CHECK-FISL-NEXT: stfd f2, -16(r1) # 8-byte Folded Spill 2490; CHECK-FISL-NEXT: fmr f2, f1 2491; CHECK-FISL-NEXT: xscmpudp cr0, f3, f4 2492; CHECK-FISL-NEXT: stfd f2, -8(r1) # 8-byte Folded Spill 2493; CHECK-FISL-NEXT: beq cr0, .LBB67_2 2494; CHECK-FISL-NEXT: # %bb.1: # %entry 2495; CHECK-FISL-NEXT: lfd f0, -16(r1) # 8-byte Folded Reload 2496; CHECK-FISL-NEXT: stfd f0, -8(r1) # 8-byte Folded Spill 2497; CHECK-FISL-NEXT: .LBB67_2: # %entry 2498; CHECK-FISL-NEXT: lfd f1, -8(r1) # 8-byte Folded Reload 2499; CHECK-FISL-NEXT: blr 2500; 2501; CHECK-LE-LABEL: test82: 2502; CHECK-LE: # %bb.0: # %entry 2503; CHECK-LE-NEXT: xscmpudp cr0, f3, f4 2504; CHECK-LE-NEXT: beqlr cr0 2505; CHECK-LE-NEXT: # %bb.1: # %entry 2506; CHECK-LE-NEXT: fmr f1, f2 2507; CHECK-LE-NEXT: blr 2508entry: 2509 %m = fcmp oeq double %c, %d 2510 %v = select i1 %m, double %a, double %b 2511 ret double %v 2512 2513 2514 2515} 2516