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