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, double* @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: clrldi r3, r3, 56 680; CHECK-NEXT: blr 681; 682; CHECK-LE-LABEL: getuc0: 683; CHECK-LE: # %bb.0: # %entry 684; CHECK-LE-NEXT: xxswapd vs0, v2 685; CHECK-LE-NEXT: mffprd r3, f0 686; CHECK-LE-NEXT: clrldi r3, r3, 56 687; CHECK-LE-NEXT: clrldi r3, r3, 56 688; CHECK-LE-NEXT: blr 689; 690; CHECK-AIX-LABEL: getuc0: 691; CHECK-AIX: # %bb.0: # %entry 692; CHECK-AIX-NEXT: mfvsrd 3, 34 693; CHECK-AIX-NEXT: rldicl 3, 3, 8, 56 694; CHECK-AIX-NEXT: clrldi 3, 3, 56 695; CHECK-AIX-NEXT: blr 696entry: 697 %vecext = extractelement <16 x i8> %vuc, i32 0 698 ret i8 %vecext 699 700 701} 702 703; Function Attrs: norecurse nounwind readnone 704define zeroext i8 @getuc1(<16 x i8> %vuc) { 705; CHECK-LABEL: getuc1: 706; CHECK: # %bb.0: # %entry 707; CHECK-NEXT: mfvsrd r3, v2 708; CHECK-NEXT: rldicl r3, r3, 16, 56 709; CHECK-NEXT: clrldi r3, r3, 56 710; CHECK-NEXT: blr 711; 712; CHECK-LE-LABEL: getuc1: 713; CHECK-LE: # %bb.0: # %entry 714; CHECK-LE-NEXT: xxswapd vs0, v2 715; CHECK-LE-NEXT: mffprd r3, f0 716; CHECK-LE-NEXT: rldicl r3, r3, 56, 56 717; CHECK-LE-NEXT: clrldi r3, r3, 56 718; CHECK-LE-NEXT: blr 719; 720; CHECK-AIX-LABEL: getuc1: 721; CHECK-AIX: # %bb.0: # %entry 722; CHECK-AIX-NEXT: mfvsrd 3, 34 723; CHECK-AIX-NEXT: rldicl 3, 3, 16, 56 724; CHECK-AIX-NEXT: clrldi 3, 3, 56 725; CHECK-AIX-NEXT: blr 726entry: 727 %vecext = extractelement <16 x i8> %vuc, i32 1 728 ret i8 %vecext 729 730 731} 732 733; Function Attrs: norecurse nounwind readnone 734define zeroext i8 @getuc2(<16 x i8> %vuc) { 735; CHECK-LABEL: getuc2: 736; CHECK: # %bb.0: # %entry 737; CHECK-NEXT: mfvsrd r3, v2 738; CHECK-NEXT: rldicl r3, r3, 24, 56 739; CHECK-NEXT: clrldi r3, r3, 56 740; CHECK-NEXT: blr 741; 742; CHECK-LE-LABEL: getuc2: 743; CHECK-LE: # %bb.0: # %entry 744; CHECK-LE-NEXT: xxswapd vs0, v2 745; CHECK-LE-NEXT: mffprd r3, f0 746; CHECK-LE-NEXT: rldicl r3, r3, 48, 56 747; CHECK-LE-NEXT: clrldi r3, r3, 56 748; CHECK-LE-NEXT: blr 749; 750; CHECK-AIX-LABEL: getuc2: 751; CHECK-AIX: # %bb.0: # %entry 752; CHECK-AIX-NEXT: mfvsrd 3, 34 753; CHECK-AIX-NEXT: rldicl 3, 3, 24, 56 754; CHECK-AIX-NEXT: clrldi 3, 3, 56 755; CHECK-AIX-NEXT: blr 756entry: 757 %vecext = extractelement <16 x i8> %vuc, i32 2 758 ret i8 %vecext 759} 760 761; Function Attrs: norecurse nounwind readnone 762define zeroext i8 @getuc3(<16 x i8> %vuc) { 763; CHECK-LABEL: getuc3: 764; CHECK: # %bb.0: # %entry 765; CHECK-NEXT: mfvsrd r3, v2 766; CHECK-NEXT: rldicl r3, r3, 32, 56 767; CHECK-NEXT: clrldi r3, r3, 56 768; CHECK-NEXT: blr 769; 770; CHECK-LE-LABEL: getuc3: 771; CHECK-LE: # %bb.0: # %entry 772; CHECK-LE-NEXT: xxswapd vs0, v2 773; CHECK-LE-NEXT: mffprd r3, f0 774; CHECK-LE-NEXT: rldicl r3, r3, 40, 56 775; CHECK-LE-NEXT: clrldi r3, r3, 56 776; CHECK-LE-NEXT: blr 777; 778; CHECK-AIX-LABEL: getuc3: 779; CHECK-AIX: # %bb.0: # %entry 780; CHECK-AIX-NEXT: mfvsrd 3, 34 781; CHECK-AIX-NEXT: rldicl 3, 3, 32, 56 782; CHECK-AIX-NEXT: clrldi 3, 3, 56 783; CHECK-AIX-NEXT: blr 784entry: 785 %vecext = extractelement <16 x i8> %vuc, i32 3 786 ret i8 %vecext 787 788 789} 790 791; Function Attrs: norecurse nounwind readnone 792define zeroext i8 @getuc4(<16 x i8> %vuc) { 793; CHECK-LABEL: getuc4: 794; CHECK: # %bb.0: # %entry 795; CHECK-NEXT: mfvsrd r3, v2 796; CHECK-NEXT: rldicl r3, r3, 40, 56 797; CHECK-NEXT: clrldi r3, r3, 56 798; CHECK-NEXT: blr 799; 800; CHECK-LE-LABEL: getuc4: 801; CHECK-LE: # %bb.0: # %entry 802; CHECK-LE-NEXT: xxswapd vs0, v2 803; CHECK-LE-NEXT: mffprd r3, f0 804; CHECK-LE-NEXT: rldicl r3, r3, 32, 56 805; CHECK-LE-NEXT: clrldi r3, r3, 56 806; CHECK-LE-NEXT: blr 807; 808; CHECK-AIX-LABEL: getuc4: 809; CHECK-AIX: # %bb.0: # %entry 810; CHECK-AIX-NEXT: mfvsrd 3, 34 811; CHECK-AIX-NEXT: rldicl 3, 3, 40, 56 812; CHECK-AIX-NEXT: clrldi 3, 3, 56 813; CHECK-AIX-NEXT: blr 814entry: 815 %vecext = extractelement <16 x i8> %vuc, i32 4 816 ret i8 %vecext 817 818 819} 820 821; Function Attrs: norecurse nounwind readnone 822define zeroext i8 @getuc5(<16 x i8> %vuc) { 823; CHECK-LABEL: getuc5: 824; CHECK: # %bb.0: # %entry 825; CHECK-NEXT: mfvsrd r3, v2 826; CHECK-NEXT: rldicl r3, r3, 48, 56 827; CHECK-NEXT: clrldi r3, r3, 56 828; CHECK-NEXT: blr 829; 830; CHECK-LE-LABEL: getuc5: 831; CHECK-LE: # %bb.0: # %entry 832; CHECK-LE-NEXT: xxswapd vs0, v2 833; CHECK-LE-NEXT: mffprd r3, f0 834; CHECK-LE-NEXT: rldicl r3, r3, 24, 56 835; CHECK-LE-NEXT: clrldi r3, r3, 56 836; CHECK-LE-NEXT: blr 837; 838; CHECK-AIX-LABEL: getuc5: 839; CHECK-AIX: # %bb.0: # %entry 840; CHECK-AIX-NEXT: mfvsrd 3, 34 841; CHECK-AIX-NEXT: rldicl 3, 3, 48, 56 842; CHECK-AIX-NEXT: clrldi 3, 3, 56 843; CHECK-AIX-NEXT: blr 844entry: 845 %vecext = extractelement <16 x i8> %vuc, i32 5 846 ret i8 %vecext 847 848 849} 850 851; Function Attrs: norecurse nounwind readnone 852define zeroext i8 @getuc6(<16 x i8> %vuc) { 853; CHECK-LABEL: getuc6: 854; CHECK: # %bb.0: # %entry 855; CHECK-NEXT: mfvsrd r3, v2 856; CHECK-NEXT: rldicl r3, r3, 56, 56 857; CHECK-NEXT: clrldi r3, r3, 56 858; CHECK-NEXT: blr 859; 860; CHECK-LE-LABEL: getuc6: 861; CHECK-LE: # %bb.0: # %entry 862; CHECK-LE-NEXT: xxswapd vs0, v2 863; CHECK-LE-NEXT: mffprd r3, f0 864; CHECK-LE-NEXT: rldicl r3, r3, 16, 56 865; CHECK-LE-NEXT: clrldi r3, r3, 56 866; CHECK-LE-NEXT: blr 867; 868; CHECK-AIX-LABEL: getuc6: 869; CHECK-AIX: # %bb.0: # %entry 870; CHECK-AIX-NEXT: mfvsrd 3, 34 871; CHECK-AIX-NEXT: rldicl 3, 3, 56, 56 872; CHECK-AIX-NEXT: clrldi 3, 3, 56 873; CHECK-AIX-NEXT: blr 874entry: 875 %vecext = extractelement <16 x i8> %vuc, i32 6 876 ret i8 %vecext 877 878 879} 880 881; Function Attrs: norecurse nounwind readnone 882define zeroext i8 @getuc7(<16 x i8> %vuc) { 883; CHECK-LABEL: getuc7: 884; CHECK: # %bb.0: # %entry 885; CHECK-NEXT: mfvsrd r3, v2 886; CHECK-NEXT: clrldi r3, r3, 56 887; CHECK-NEXT: clrldi r3, r3, 56 888; CHECK-NEXT: blr 889; 890; CHECK-LE-LABEL: getuc7: 891; CHECK-LE: # %bb.0: # %entry 892; CHECK-LE-NEXT: xxswapd vs0, v2 893; CHECK-LE-NEXT: mffprd r3, f0 894; CHECK-LE-NEXT: rldicl r3, r3, 8, 56 895; CHECK-LE-NEXT: clrldi r3, r3, 56 896; CHECK-LE-NEXT: blr 897; 898; CHECK-AIX-LABEL: getuc7: 899; CHECK-AIX: # %bb.0: # %entry 900; CHECK-AIX-NEXT: mfvsrd 3, 34 901; CHECK-AIX-NEXT: clrldi 3, 3, 56 902; CHECK-AIX-NEXT: clrldi 3, 3, 56 903; CHECK-AIX-NEXT: blr 904entry: 905 %vecext = extractelement <16 x i8> %vuc, i32 7 906 ret i8 %vecext 907 908 909} 910 911; Function Attrs: norecurse nounwind readnone 912define zeroext i8 @getuc8(<16 x i8> %vuc) { 913; CHECK-LABEL: getuc8: 914; CHECK: # %bb.0: # %entry 915; CHECK-NEXT: xxswapd vs0, v2 916; CHECK-NEXT: mffprd r3, f0 917; CHECK-NEXT: rldicl r3, r3, 8, 56 918; CHECK-NEXT: clrldi r3, r3, 56 919; CHECK-NEXT: blr 920; 921; CHECK-LE-LABEL: getuc8: 922; CHECK-LE: # %bb.0: # %entry 923; CHECK-LE-NEXT: mfvsrd r3, v2 924; CHECK-LE-NEXT: clrldi r3, r3, 56 925; CHECK-LE-NEXT: clrldi r3, r3, 56 926; CHECK-LE-NEXT: blr 927; 928; CHECK-AIX-LABEL: getuc8: 929; CHECK-AIX: # %bb.0: # %entry 930; CHECK-AIX-NEXT: xxswapd 0, 34 931; CHECK-AIX-NEXT: mffprd 3, 0 932; CHECK-AIX-NEXT: rldicl 3, 3, 8, 56 933; CHECK-AIX-NEXT: clrldi 3, 3, 56 934; CHECK-AIX-NEXT: blr 935entry: 936 %vecext = extractelement <16 x i8> %vuc, i32 8 937 ret i8 %vecext 938 939 940} 941 942; Function Attrs: norecurse nounwind readnone 943define zeroext i8 @getuc9(<16 x i8> %vuc) { 944; CHECK-LABEL: getuc9: 945; CHECK: # %bb.0: # %entry 946; CHECK-NEXT: xxswapd vs0, v2 947; CHECK-NEXT: mffprd r3, f0 948; CHECK-NEXT: rldicl r3, r3, 16, 56 949; CHECK-NEXT: clrldi r3, r3, 56 950; CHECK-NEXT: blr 951; 952; CHECK-LE-LABEL: getuc9: 953; CHECK-LE: # %bb.0: # %entry 954; CHECK-LE-NEXT: mfvsrd r3, v2 955; CHECK-LE-NEXT: rldicl r3, r3, 56, 56 956; CHECK-LE-NEXT: clrldi r3, r3, 56 957; CHECK-LE-NEXT: blr 958; 959; CHECK-AIX-LABEL: getuc9: 960; CHECK-AIX: # %bb.0: # %entry 961; CHECK-AIX-NEXT: xxswapd 0, 34 962; CHECK-AIX-NEXT: mffprd 3, 0 963; CHECK-AIX-NEXT: rldicl 3, 3, 16, 56 964; CHECK-AIX-NEXT: clrldi 3, 3, 56 965; CHECK-AIX-NEXT: blr 966entry: 967 %vecext = extractelement <16 x i8> %vuc, i32 9 968 ret i8 %vecext 969 970 971} 972 973; Function Attrs: norecurse nounwind readnone 974define zeroext i8 @getuc10(<16 x i8> %vuc) { 975; CHECK-LABEL: getuc10: 976; CHECK: # %bb.0: # %entry 977; CHECK-NEXT: xxswapd vs0, v2 978; CHECK-NEXT: mffprd r3, f0 979; CHECK-NEXT: rldicl r3, r3, 24, 56 980; CHECK-NEXT: clrldi r3, r3, 56 981; CHECK-NEXT: blr 982; 983; CHECK-LE-LABEL: getuc10: 984; CHECK-LE: # %bb.0: # %entry 985; CHECK-LE-NEXT: mfvsrd r3, v2 986; CHECK-LE-NEXT: rldicl r3, r3, 48, 56 987; CHECK-LE-NEXT: clrldi r3, r3, 56 988; CHECK-LE-NEXT: blr 989; 990; CHECK-AIX-LABEL: getuc10: 991; CHECK-AIX: # %bb.0: # %entry 992; CHECK-AIX-NEXT: xxswapd 0, 34 993; CHECK-AIX-NEXT: mffprd 3, 0 994; CHECK-AIX-NEXT: rldicl 3, 3, 24, 56 995; CHECK-AIX-NEXT: clrldi 3, 3, 56 996; CHECK-AIX-NEXT: blr 997entry: 998 %vecext = extractelement <16 x i8> %vuc, i32 10 999 ret i8 %vecext 1000 1001 1002} 1003 1004; Function Attrs: norecurse nounwind readnone 1005define zeroext i8 @getuc11(<16 x i8> %vuc) { 1006; CHECK-LABEL: getuc11: 1007; CHECK: # %bb.0: # %entry 1008; CHECK-NEXT: xxswapd vs0, v2 1009; CHECK-NEXT: mffprd r3, f0 1010; CHECK-NEXT: rldicl r3, r3, 32, 56 1011; CHECK-NEXT: clrldi r3, r3, 56 1012; CHECK-NEXT: blr 1013; 1014; CHECK-LE-LABEL: getuc11: 1015; CHECK-LE: # %bb.0: # %entry 1016; CHECK-LE-NEXT: mfvsrd r3, v2 1017; CHECK-LE-NEXT: rldicl r3, r3, 40, 56 1018; CHECK-LE-NEXT: clrldi r3, r3, 56 1019; CHECK-LE-NEXT: blr 1020; 1021; CHECK-AIX-LABEL: getuc11: 1022; CHECK-AIX: # %bb.0: # %entry 1023; CHECK-AIX-NEXT: xxswapd 0, 34 1024; CHECK-AIX-NEXT: mffprd 3, 0 1025; CHECK-AIX-NEXT: rldicl 3, 3, 32, 56 1026; CHECK-AIX-NEXT: clrldi 3, 3, 56 1027; CHECK-AIX-NEXT: blr 1028entry: 1029 %vecext = extractelement <16 x i8> %vuc, i32 11 1030 ret i8 %vecext 1031 1032 1033} 1034 1035; Function Attrs: norecurse nounwind readnone 1036define zeroext i8 @getuc12(<16 x i8> %vuc) { 1037; CHECK-LABEL: getuc12: 1038; CHECK: # %bb.0: # %entry 1039; CHECK-NEXT: xxswapd vs0, v2 1040; CHECK-NEXT: mffprd r3, f0 1041; CHECK-NEXT: rldicl r3, r3, 40, 56 1042; CHECK-NEXT: clrldi r3, r3, 56 1043; CHECK-NEXT: blr 1044; 1045; CHECK-LE-LABEL: getuc12: 1046; CHECK-LE: # %bb.0: # %entry 1047; CHECK-LE-NEXT: mfvsrd r3, v2 1048; CHECK-LE-NEXT: rldicl r3, r3, 32, 56 1049; CHECK-LE-NEXT: clrldi r3, r3, 56 1050; CHECK-LE-NEXT: blr 1051; 1052; CHECK-AIX-LABEL: getuc12: 1053; CHECK-AIX: # %bb.0: # %entry 1054; CHECK-AIX-NEXT: xxswapd 0, 34 1055; CHECK-AIX-NEXT: mffprd 3, 0 1056; CHECK-AIX-NEXT: rldicl 3, 3, 40, 56 1057; CHECK-AIX-NEXT: clrldi 3, 3, 56 1058; CHECK-AIX-NEXT: blr 1059entry: 1060 %vecext = extractelement <16 x i8> %vuc, i32 12 1061 ret i8 %vecext 1062 1063 1064} 1065 1066; Function Attrs: norecurse nounwind readnone 1067define zeroext i8 @getuc13(<16 x i8> %vuc) { 1068; CHECK-LABEL: getuc13: 1069; CHECK: # %bb.0: # %entry 1070; CHECK-NEXT: xxswapd vs0, v2 1071; CHECK-NEXT: mffprd r3, f0 1072; CHECK-NEXT: rldicl r3, r3, 48, 56 1073; CHECK-NEXT: clrldi r3, r3, 56 1074; CHECK-NEXT: blr 1075; 1076; CHECK-LE-LABEL: getuc13: 1077; CHECK-LE: # %bb.0: # %entry 1078; CHECK-LE-NEXT: mfvsrd r3, v2 1079; CHECK-LE-NEXT: rldicl r3, r3, 24, 56 1080; CHECK-LE-NEXT: clrldi r3, r3, 56 1081; CHECK-LE-NEXT: blr 1082; 1083; CHECK-AIX-LABEL: getuc13: 1084; CHECK-AIX: # %bb.0: # %entry 1085; CHECK-AIX-NEXT: xxswapd 0, 34 1086; CHECK-AIX-NEXT: mffprd 3, 0 1087; CHECK-AIX-NEXT: rldicl 3, 3, 48, 56 1088; CHECK-AIX-NEXT: clrldi 3, 3, 56 1089; CHECK-AIX-NEXT: blr 1090entry: 1091 %vecext = extractelement <16 x i8> %vuc, i32 13 1092 ret i8 %vecext 1093 1094 1095} 1096 1097; Function Attrs: norecurse nounwind readnone 1098define zeroext i8 @getuc14(<16 x i8> %vuc) { 1099; CHECK-LABEL: getuc14: 1100; CHECK: # %bb.0: # %entry 1101; CHECK-NEXT: xxswapd vs0, v2 1102; CHECK-NEXT: mffprd r3, f0 1103; CHECK-NEXT: rldicl r3, r3, 56, 56 1104; CHECK-NEXT: clrldi r3, r3, 56 1105; CHECK-NEXT: blr 1106; 1107; CHECK-LE-LABEL: getuc14: 1108; CHECK-LE: # %bb.0: # %entry 1109; CHECK-LE-NEXT: mfvsrd r3, v2 1110; CHECK-LE-NEXT: rldicl r3, r3, 16, 56 1111; CHECK-LE-NEXT: clrldi r3, r3, 56 1112; CHECK-LE-NEXT: blr 1113; 1114; CHECK-AIX-LABEL: getuc14: 1115; CHECK-AIX: # %bb.0: # %entry 1116; CHECK-AIX-NEXT: xxswapd 0, 34 1117; CHECK-AIX-NEXT: mffprd 3, 0 1118; CHECK-AIX-NEXT: rldicl 3, 3, 56, 56 1119; CHECK-AIX-NEXT: clrldi 3, 3, 56 1120; CHECK-AIX-NEXT: blr 1121entry: 1122 %vecext = extractelement <16 x i8> %vuc, i32 14 1123 ret i8 %vecext 1124 1125 1126} 1127 1128; Function Attrs: norecurse nounwind readnone 1129define zeroext i8 @getuc15(<16 x i8> %vuc) { 1130; CHECK-LABEL: getuc15: 1131; CHECK: # %bb.0: # %entry 1132; CHECK-NEXT: xxswapd vs0, v2 1133; CHECK-NEXT: mffprd r3, f0 1134; CHECK-NEXT: clrldi r3, r3, 56 1135; CHECK-NEXT: clrldi r3, r3, 56 1136; CHECK-NEXT: blr 1137; 1138; CHECK-LE-LABEL: getuc15: 1139; CHECK-LE: # %bb.0: # %entry 1140; CHECK-LE-NEXT: mfvsrd r3, v2 1141; CHECK-LE-NEXT: rldicl r3, r3, 8, 56 1142; CHECK-LE-NEXT: clrldi r3, r3, 56 1143; CHECK-LE-NEXT: blr 1144; 1145; CHECK-AIX-LABEL: getuc15: 1146; CHECK-AIX: # %bb.0: # %entry 1147; CHECK-AIX-NEXT: xxswapd 0, 34 1148; CHECK-AIX-NEXT: mffprd 3, 0 1149; CHECK-AIX-NEXT: clrldi 3, 3, 56 1150; CHECK-AIX-NEXT: clrldi 3, 3, 56 1151; CHECK-AIX-NEXT: blr 1152entry: 1153 %vecext = extractelement <16 x i8> %vuc, i32 15 1154 ret i8 %vecext 1155 1156 1157} 1158 1159; Function Attrs: norecurse nounwind readnone 1160define signext i8 @getvelsc(<16 x i8> %vsc, i32 signext %i) { 1161; CHECK-LABEL: getvelsc: 1162; CHECK: # %bb.0: # %entry 1163; CHECK-NEXT: andi. r4, r5, 8 1164; CHECK-NEXT: li r3, 7 1165; CHECK-NEXT: lvsl v3, 0, r4 1166; CHECK-NEXT: andc r3, r3, r5 1167; CHECK-NEXT: sldi r3, r3, 3 1168; CHECK-NEXT: vperm v2, v2, v2, v3 1169; CHECK-NEXT: mfvsrd r4, v2 1170; CHECK-NEXT: srd r3, r4, r3 1171; CHECK-NEXT: extsb r3, r3 1172; CHECK-NEXT: blr 1173; 1174; CHECK-LE-LABEL: getvelsc: 1175; CHECK-LE: # %bb.0: # %entry 1176; CHECK-LE-NEXT: li r3, 8 1177; CHECK-LE-NEXT: andc r3, r3, r5 1178; CHECK-LE-NEXT: lvsl v3, 0, r3 1179; CHECK-LE-NEXT: li r3, 7 1180; CHECK-LE-NEXT: and r3, r3, r5 1181; CHECK-LE-NEXT: vperm v2, v2, v2, v3 1182; CHECK-LE-NEXT: sldi r3, r3, 3 1183; CHECK-LE-NEXT: mfvsrd r4, v2 1184; CHECK-LE-NEXT: srd r3, r4, r3 1185; CHECK-LE-NEXT: extsb r3, r3 1186; CHECK-LE-NEXT: blr 1187; 1188; CHECK-AIX-LABEL: getvelsc: 1189; CHECK-AIX: # %bb.0: # %entry 1190; CHECK-AIX-NEXT: andi. 5, 3, 8 1191; CHECK-AIX-NEXT: li 4, 7 1192; CHECK-AIX-NEXT: lvsl 3, 0, 5 1193; CHECK-AIX-NEXT: andc 3, 4, 3 1194; CHECK-AIX-NEXT: sldi 3, 3, 3 1195; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 1196; CHECK-AIX-NEXT: mfvsrd 4, 34 1197; CHECK-AIX-NEXT: srd 3, 4, 3 1198; CHECK-AIX-NEXT: extsb 3, 3 1199; CHECK-AIX-NEXT: blr 1200 1201 1202entry: 1203 %vecext = extractelement <16 x i8> %vsc, i32 %i 1204 ret i8 %vecext 1205} 1206 1207; Function Attrs: norecurse nounwind readnone 1208define zeroext i8 @getveluc(<16 x i8> %vuc, i32 signext %i) { 1209; CHECK-LABEL: getveluc: 1210; CHECK: # %bb.0: # %entry 1211; CHECK-NEXT: andi. r4, r5, 8 1212; CHECK-NEXT: li r3, 7 1213; CHECK-NEXT: lvsl v3, 0, r4 1214; CHECK-NEXT: andc r3, r3, r5 1215; CHECK-NEXT: sldi r3, r3, 3 1216; CHECK-NEXT: vperm v2, v2, v2, v3 1217; CHECK-NEXT: mfvsrd r4, v2 1218; CHECK-NEXT: srd r3, r4, r3 1219; CHECK-NEXT: clrldi r3, r3, 56 1220; CHECK-NEXT: blr 1221; 1222; CHECK-LE-LABEL: getveluc: 1223; CHECK-LE: # %bb.0: # %entry 1224; CHECK-LE-NEXT: li r3, 8 1225; CHECK-LE-NEXT: andc r3, r3, r5 1226; CHECK-LE-NEXT: lvsl v3, 0, r3 1227; CHECK-LE-NEXT: li r3, 7 1228; CHECK-LE-NEXT: and r3, r3, r5 1229; CHECK-LE-NEXT: vperm v2, v2, v2, v3 1230; CHECK-LE-NEXT: sldi r3, r3, 3 1231; CHECK-LE-NEXT: mfvsrd r4, v2 1232; CHECK-LE-NEXT: srd r3, r4, r3 1233; CHECK-LE-NEXT: clrldi r3, r3, 56 1234; CHECK-LE-NEXT: blr 1235; 1236; CHECK-AIX-LABEL: getveluc: 1237; CHECK-AIX: # %bb.0: # %entry 1238; CHECK-AIX-NEXT: andi. 5, 3, 8 1239; CHECK-AIX-NEXT: li 4, 7 1240; CHECK-AIX-NEXT: lvsl 3, 0, 5 1241; CHECK-AIX-NEXT: andc 3, 4, 3 1242; CHECK-AIX-NEXT: sldi 3, 3, 3 1243; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 1244; CHECK-AIX-NEXT: mfvsrd 4, 34 1245; CHECK-AIX-NEXT: srd 3, 4, 3 1246; CHECK-AIX-NEXT: clrldi 3, 3, 56 1247; CHECK-AIX-NEXT: blr 1248 1249 1250entry: 1251 %vecext = extractelement <16 x i8> %vuc, i32 %i 1252 ret i8 %vecext 1253} 1254 1255; Function Attrs: norecurse nounwind readnone 1256define signext i16 @getss0(<8 x i16> %vss) { 1257; CHECK-LABEL: getss0: 1258; CHECK: # %bb.0: # %entry 1259; CHECK-NEXT: mfvsrd r3, v2 1260; CHECK-NEXT: rldicl r3, r3, 16, 48 1261; CHECK-NEXT: extsh r3, r3 1262; CHECK-NEXT: blr 1263; 1264; CHECK-LE-LABEL: getss0: 1265; CHECK-LE: # %bb.0: # %entry 1266; CHECK-LE-NEXT: xxswapd vs0, v2 1267; CHECK-LE-NEXT: mffprd r3, f0 1268; CHECK-LE-NEXT: clrldi r3, r3, 48 1269; CHECK-LE-NEXT: extsh r3, r3 1270; CHECK-LE-NEXT: blr 1271; 1272; CHECK-AIX-LABEL: getss0: 1273; CHECK-AIX: # %bb.0: # %entry 1274; CHECK-AIX-NEXT: mfvsrd 3, 34 1275; CHECK-AIX-NEXT: rldicl 3, 3, 16, 48 1276; CHECK-AIX-NEXT: extsh 3, 3 1277; CHECK-AIX-NEXT: blr 1278entry: 1279 %vecext = extractelement <8 x i16> %vss, i32 0 1280 ret i16 %vecext 1281 1282 1283} 1284 1285; Function Attrs: norecurse nounwind readnone 1286define signext i16 @getss1(<8 x i16> %vss) { 1287; CHECK-LABEL: getss1: 1288; CHECK: # %bb.0: # %entry 1289; CHECK-NEXT: mfvsrd r3, v2 1290; CHECK-NEXT: rldicl r3, r3, 32, 48 1291; CHECK-NEXT: extsh r3, r3 1292; CHECK-NEXT: blr 1293; 1294; CHECK-LE-LABEL: getss1: 1295; CHECK-LE: # %bb.0: # %entry 1296; CHECK-LE-NEXT: xxswapd vs0, v2 1297; CHECK-LE-NEXT: mffprd r3, f0 1298; CHECK-LE-NEXT: rldicl r3, r3, 48, 48 1299; CHECK-LE-NEXT: extsh r3, r3 1300; CHECK-LE-NEXT: blr 1301; 1302; CHECK-AIX-LABEL: getss1: 1303; CHECK-AIX: # %bb.0: # %entry 1304; CHECK-AIX-NEXT: mfvsrd 3, 34 1305; CHECK-AIX-NEXT: rldicl 3, 3, 32, 48 1306; CHECK-AIX-NEXT: extsh 3, 3 1307; CHECK-AIX-NEXT: blr 1308entry: 1309 %vecext = extractelement <8 x i16> %vss, i32 1 1310 ret i16 %vecext 1311 1312 1313} 1314 1315; Function Attrs: norecurse nounwind readnone 1316define signext i16 @getss2(<8 x i16> %vss) { 1317; CHECK-LABEL: getss2: 1318; CHECK: # %bb.0: # %entry 1319; CHECK-NEXT: mfvsrd r3, v2 1320; CHECK-NEXT: rldicl r3, r3, 48, 48 1321; CHECK-NEXT: extsh r3, r3 1322; CHECK-NEXT: blr 1323; 1324; CHECK-LE-LABEL: getss2: 1325; CHECK-LE: # %bb.0: # %entry 1326; CHECK-LE-NEXT: xxswapd vs0, v2 1327; CHECK-LE-NEXT: mffprd r3, f0 1328; CHECK-LE-NEXT: rldicl r3, r3, 32, 48 1329; CHECK-LE-NEXT: extsh r3, r3 1330; CHECK-LE-NEXT: blr 1331; 1332; CHECK-AIX-LABEL: getss2: 1333; CHECK-AIX: # %bb.0: # %entry 1334; CHECK-AIX-NEXT: mfvsrd 3, 34 1335; CHECK-AIX-NEXT: rldicl 3, 3, 48, 48 1336; CHECK-AIX-NEXT: extsh 3, 3 1337; CHECK-AIX-NEXT: blr 1338entry: 1339 %vecext = extractelement <8 x i16> %vss, i32 2 1340 ret i16 %vecext 1341 1342 1343} 1344 1345; Function Attrs: norecurse nounwind readnone 1346define signext i16 @getss3(<8 x i16> %vss) { 1347; CHECK-LABEL: getss3: 1348; CHECK: # %bb.0: # %entry 1349; CHECK-NEXT: mfvsrd r3, v2 1350; CHECK-NEXT: clrldi r3, r3, 48 1351; CHECK-NEXT: extsh r3, r3 1352; CHECK-NEXT: blr 1353; 1354; CHECK-LE-LABEL: getss3: 1355; CHECK-LE: # %bb.0: # %entry 1356; CHECK-LE-NEXT: xxswapd vs0, v2 1357; CHECK-LE-NEXT: mffprd r3, f0 1358; CHECK-LE-NEXT: rldicl r3, r3, 16, 48 1359; CHECK-LE-NEXT: extsh r3, r3 1360; CHECK-LE-NEXT: blr 1361; 1362; CHECK-AIX-LABEL: getss3: 1363; CHECK-AIX: # %bb.0: # %entry 1364; CHECK-AIX-NEXT: mfvsrd 3, 34 1365; CHECK-AIX-NEXT: clrldi 3, 3, 48 1366; CHECK-AIX-NEXT: extsh 3, 3 1367; CHECK-AIX-NEXT: blr 1368entry: 1369 %vecext = extractelement <8 x i16> %vss, i32 3 1370 ret i16 %vecext 1371 1372 1373} 1374 1375; Function Attrs: norecurse nounwind readnone 1376define signext i16 @getss4(<8 x i16> %vss) { 1377; CHECK-LABEL: getss4: 1378; CHECK: # %bb.0: # %entry 1379; CHECK-NEXT: xxswapd vs0, v2 1380; CHECK-NEXT: mffprd r3, f0 1381; CHECK-NEXT: rldicl r3, r3, 16, 48 1382; CHECK-NEXT: extsh r3, r3 1383; CHECK-NEXT: blr 1384; 1385; CHECK-LE-LABEL: getss4: 1386; CHECK-LE: # %bb.0: # %entry 1387; CHECK-LE-NEXT: mfvsrd r3, v2 1388; CHECK-LE-NEXT: clrldi r3, r3, 48 1389; CHECK-LE-NEXT: extsh r3, r3 1390; CHECK-LE-NEXT: blr 1391; 1392; CHECK-AIX-LABEL: getss4: 1393; CHECK-AIX: # %bb.0: # %entry 1394; CHECK-AIX-NEXT: xxswapd 0, 34 1395; CHECK-AIX-NEXT: mffprd 3, 0 1396; CHECK-AIX-NEXT: rldicl 3, 3, 16, 48 1397; CHECK-AIX-NEXT: extsh 3, 3 1398; CHECK-AIX-NEXT: blr 1399entry: 1400 %vecext = extractelement <8 x i16> %vss, i32 4 1401 ret i16 %vecext 1402 1403 1404} 1405 1406; Function Attrs: norecurse nounwind readnone 1407define signext i16 @getss5(<8 x i16> %vss) { 1408; CHECK-LABEL: getss5: 1409; CHECK: # %bb.0: # %entry 1410; CHECK-NEXT: xxswapd vs0, v2 1411; CHECK-NEXT: mffprd r3, f0 1412; CHECK-NEXT: rldicl r3, r3, 32, 48 1413; CHECK-NEXT: extsh r3, r3 1414; CHECK-NEXT: blr 1415; 1416; CHECK-LE-LABEL: getss5: 1417; CHECK-LE: # %bb.0: # %entry 1418; CHECK-LE-NEXT: mfvsrd r3, v2 1419; CHECK-LE-NEXT: rldicl r3, r3, 48, 48 1420; CHECK-LE-NEXT: extsh r3, r3 1421; CHECK-LE-NEXT: blr 1422; 1423; CHECK-AIX-LABEL: getss5: 1424; CHECK-AIX: # %bb.0: # %entry 1425; CHECK-AIX-NEXT: xxswapd 0, 34 1426; CHECK-AIX-NEXT: mffprd 3, 0 1427; CHECK-AIX-NEXT: rldicl 3, 3, 32, 48 1428; CHECK-AIX-NEXT: extsh 3, 3 1429; CHECK-AIX-NEXT: blr 1430entry: 1431 %vecext = extractelement <8 x i16> %vss, i32 5 1432 ret i16 %vecext 1433 1434 1435} 1436 1437; Function Attrs: norecurse nounwind readnone 1438define signext i16 @getss6(<8 x i16> %vss) { 1439; CHECK-LABEL: getss6: 1440; CHECK: # %bb.0: # %entry 1441; CHECK-NEXT: xxswapd vs0, v2 1442; CHECK-NEXT: mffprd r3, f0 1443; CHECK-NEXT: rldicl r3, r3, 48, 48 1444; CHECK-NEXT: extsh r3, r3 1445; CHECK-NEXT: blr 1446; 1447; CHECK-LE-LABEL: getss6: 1448; CHECK-LE: # %bb.0: # %entry 1449; CHECK-LE-NEXT: mfvsrd r3, v2 1450; CHECK-LE-NEXT: rldicl r3, r3, 32, 48 1451; CHECK-LE-NEXT: extsh r3, r3 1452; CHECK-LE-NEXT: blr 1453; 1454; CHECK-AIX-LABEL: getss6: 1455; CHECK-AIX: # %bb.0: # %entry 1456; CHECK-AIX-NEXT: xxswapd 0, 34 1457; CHECK-AIX-NEXT: mffprd 3, 0 1458; CHECK-AIX-NEXT: rldicl 3, 3, 48, 48 1459; CHECK-AIX-NEXT: extsh 3, 3 1460; CHECK-AIX-NEXT: blr 1461entry: 1462 %vecext = extractelement <8 x i16> %vss, i32 6 1463 ret i16 %vecext 1464 1465 1466} 1467 1468; Function Attrs: norecurse nounwind readnone 1469define signext i16 @getss7(<8 x i16> %vss) { 1470; CHECK-LABEL: getss7: 1471; CHECK: # %bb.0: # %entry 1472; CHECK-NEXT: xxswapd vs0, v2 1473; CHECK-NEXT: mffprd r3, f0 1474; CHECK-NEXT: clrldi r3, r3, 48 1475; CHECK-NEXT: extsh r3, r3 1476; CHECK-NEXT: blr 1477; 1478; CHECK-LE-LABEL: getss7: 1479; CHECK-LE: # %bb.0: # %entry 1480; CHECK-LE-NEXT: mfvsrd r3, v2 1481; CHECK-LE-NEXT: rldicl r3, r3, 16, 48 1482; CHECK-LE-NEXT: extsh r3, r3 1483; CHECK-LE-NEXT: blr 1484; 1485; CHECK-AIX-LABEL: getss7: 1486; CHECK-AIX: # %bb.0: # %entry 1487; CHECK-AIX-NEXT: xxswapd 0, 34 1488; CHECK-AIX-NEXT: mffprd 3, 0 1489; CHECK-AIX-NEXT: clrldi 3, 3, 48 1490; CHECK-AIX-NEXT: extsh 3, 3 1491; CHECK-AIX-NEXT: blr 1492entry: 1493 %vecext = extractelement <8 x i16> %vss, i32 7 1494 ret i16 %vecext 1495 1496 1497} 1498 1499; Function Attrs: norecurse nounwind readnone 1500define zeroext i16 @getus0(<8 x i16> %vus) { 1501; CHECK-LABEL: getus0: 1502; CHECK: # %bb.0: # %entry 1503; CHECK-NEXT: mfvsrd r3, v2 1504; CHECK-NEXT: rldicl r3, r3, 16, 48 1505; CHECK-NEXT: clrldi r3, r3, 48 1506; CHECK-NEXT: blr 1507; 1508; CHECK-LE-LABEL: getus0: 1509; CHECK-LE: # %bb.0: # %entry 1510; CHECK-LE-NEXT: xxswapd vs0, v2 1511; CHECK-LE-NEXT: mffprd r3, f0 1512; CHECK-LE-NEXT: clrldi r3, r3, 48 1513; CHECK-LE-NEXT: clrldi r3, r3, 48 1514; CHECK-LE-NEXT: blr 1515; 1516; CHECK-AIX-LABEL: getus0: 1517; CHECK-AIX: # %bb.0: # %entry 1518; CHECK-AIX-NEXT: mfvsrd 3, 34 1519; CHECK-AIX-NEXT: rldicl 3, 3, 16, 48 1520; CHECK-AIX-NEXT: clrldi 3, 3, 48 1521; CHECK-AIX-NEXT: blr 1522entry: 1523 %vecext = extractelement <8 x i16> %vus, i32 0 1524 ret i16 %vecext 1525 1526 1527} 1528 1529; Function Attrs: norecurse nounwind readnone 1530define zeroext i16 @getus1(<8 x i16> %vus) { 1531; CHECK-LABEL: getus1: 1532; CHECK: # %bb.0: # %entry 1533; CHECK-NEXT: mfvsrd r3, v2 1534; CHECK-NEXT: rldicl r3, r3, 32, 48 1535; CHECK-NEXT: clrldi r3, r3, 48 1536; CHECK-NEXT: blr 1537; 1538; CHECK-LE-LABEL: getus1: 1539; CHECK-LE: # %bb.0: # %entry 1540; CHECK-LE-NEXT: xxswapd vs0, v2 1541; CHECK-LE-NEXT: mffprd r3, f0 1542; CHECK-LE-NEXT: rldicl r3, r3, 48, 48 1543; CHECK-LE-NEXT: clrldi r3, r3, 48 1544; CHECK-LE-NEXT: blr 1545; 1546; CHECK-AIX-LABEL: getus1: 1547; CHECK-AIX: # %bb.0: # %entry 1548; CHECK-AIX-NEXT: mfvsrd 3, 34 1549; CHECK-AIX-NEXT: rldicl 3, 3, 32, 48 1550; CHECK-AIX-NEXT: clrldi 3, 3, 48 1551; CHECK-AIX-NEXT: blr 1552entry: 1553 %vecext = extractelement <8 x i16> %vus, i32 1 1554 ret i16 %vecext 1555 1556 1557} 1558 1559; Function Attrs: norecurse nounwind readnone 1560define zeroext i16 @getus2(<8 x i16> %vus) { 1561; CHECK-LABEL: getus2: 1562; CHECK: # %bb.0: # %entry 1563; CHECK-NEXT: mfvsrd r3, v2 1564; CHECK-NEXT: rldicl r3, r3, 48, 48 1565; CHECK-NEXT: clrldi r3, r3, 48 1566; CHECK-NEXT: blr 1567; 1568; CHECK-LE-LABEL: getus2: 1569; CHECK-LE: # %bb.0: # %entry 1570; CHECK-LE-NEXT: xxswapd vs0, v2 1571; CHECK-LE-NEXT: mffprd r3, f0 1572; CHECK-LE-NEXT: rldicl r3, r3, 32, 48 1573; CHECK-LE-NEXT: clrldi r3, r3, 48 1574; CHECK-LE-NEXT: blr 1575; 1576; CHECK-AIX-LABEL: getus2: 1577; CHECK-AIX: # %bb.0: # %entry 1578; CHECK-AIX-NEXT: mfvsrd 3, 34 1579; CHECK-AIX-NEXT: rldicl 3, 3, 48, 48 1580; CHECK-AIX-NEXT: clrldi 3, 3, 48 1581; CHECK-AIX-NEXT: blr 1582entry: 1583 %vecext = extractelement <8 x i16> %vus, i32 2 1584 ret i16 %vecext 1585 1586 1587} 1588 1589; Function Attrs: norecurse nounwind readnone 1590define zeroext i16 @getus3(<8 x i16> %vus) { 1591; CHECK-LABEL: getus3: 1592; CHECK: # %bb.0: # %entry 1593; CHECK-NEXT: mfvsrd r3, v2 1594; CHECK-NEXT: clrldi r3, r3, 48 1595; CHECK-NEXT: clrldi r3, r3, 48 1596; CHECK-NEXT: blr 1597; 1598; CHECK-LE-LABEL: getus3: 1599; CHECK-LE: # %bb.0: # %entry 1600; CHECK-LE-NEXT: xxswapd vs0, v2 1601; CHECK-LE-NEXT: mffprd r3, f0 1602; CHECK-LE-NEXT: rldicl r3, r3, 16, 48 1603; CHECK-LE-NEXT: clrldi r3, r3, 48 1604; CHECK-LE-NEXT: blr 1605; 1606; CHECK-AIX-LABEL: getus3: 1607; CHECK-AIX: # %bb.0: # %entry 1608; CHECK-AIX-NEXT: mfvsrd 3, 34 1609; CHECK-AIX-NEXT: clrldi 3, 3, 48 1610; CHECK-AIX-NEXT: clrldi 3, 3, 48 1611; CHECK-AIX-NEXT: blr 1612entry: 1613 %vecext = extractelement <8 x i16> %vus, i32 3 1614 ret i16 %vecext 1615 1616 1617} 1618 1619; Function Attrs: norecurse nounwind readnone 1620define zeroext i16 @getus4(<8 x i16> %vus) { 1621; CHECK-LABEL: getus4: 1622; CHECK: # %bb.0: # %entry 1623; CHECK-NEXT: xxswapd vs0, v2 1624; CHECK-NEXT: mffprd r3, f0 1625; CHECK-NEXT: rldicl r3, r3, 16, 48 1626; CHECK-NEXT: clrldi r3, r3, 48 1627; CHECK-NEXT: blr 1628; 1629; CHECK-LE-LABEL: getus4: 1630; CHECK-LE: # %bb.0: # %entry 1631; CHECK-LE-NEXT: mfvsrd r3, v2 1632; CHECK-LE-NEXT: clrldi r3, r3, 48 1633; CHECK-LE-NEXT: clrldi r3, r3, 48 1634; CHECK-LE-NEXT: blr 1635; 1636; CHECK-AIX-LABEL: getus4: 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, 16, 48 1641; CHECK-AIX-NEXT: clrldi 3, 3, 48 1642; CHECK-AIX-NEXT: blr 1643entry: 1644 %vecext = extractelement <8 x i16> %vus, i32 4 1645 ret i16 %vecext 1646 1647 1648} 1649 1650; Function Attrs: norecurse nounwind readnone 1651define zeroext i16 @getus5(<8 x i16> %vus) { 1652; CHECK-LABEL: getus5: 1653; CHECK: # %bb.0: # %entry 1654; CHECK-NEXT: xxswapd vs0, v2 1655; CHECK-NEXT: mffprd r3, f0 1656; CHECK-NEXT: rldicl r3, r3, 32, 48 1657; CHECK-NEXT: clrldi r3, r3, 48 1658; CHECK-NEXT: blr 1659; 1660; CHECK-LE-LABEL: getus5: 1661; CHECK-LE: # %bb.0: # %entry 1662; CHECK-LE-NEXT: mfvsrd r3, v2 1663; CHECK-LE-NEXT: rldicl r3, r3, 48, 48 1664; CHECK-LE-NEXT: clrldi r3, r3, 48 1665; CHECK-LE-NEXT: blr 1666; 1667; CHECK-AIX-LABEL: getus5: 1668; CHECK-AIX: # %bb.0: # %entry 1669; CHECK-AIX-NEXT: xxswapd 0, 34 1670; CHECK-AIX-NEXT: mffprd 3, 0 1671; CHECK-AIX-NEXT: rldicl 3, 3, 32, 48 1672; CHECK-AIX-NEXT: clrldi 3, 3, 48 1673; CHECK-AIX-NEXT: blr 1674entry: 1675 %vecext = extractelement <8 x i16> %vus, i32 5 1676 ret i16 %vecext 1677 1678 1679} 1680 1681; Function Attrs: norecurse nounwind readnone 1682define zeroext i16 @getus6(<8 x i16> %vus) { 1683; CHECK-LABEL: getus6: 1684; CHECK: # %bb.0: # %entry 1685; CHECK-NEXT: xxswapd vs0, v2 1686; CHECK-NEXT: mffprd r3, f0 1687; CHECK-NEXT: rldicl r3, r3, 48, 48 1688; CHECK-NEXT: clrldi r3, r3, 48 1689; CHECK-NEXT: blr 1690; 1691; CHECK-LE-LABEL: getus6: 1692; CHECK-LE: # %bb.0: # %entry 1693; CHECK-LE-NEXT: mfvsrd r3, v2 1694; CHECK-LE-NEXT: rldicl r3, r3, 32, 48 1695; CHECK-LE-NEXT: clrldi r3, r3, 48 1696; CHECK-LE-NEXT: blr 1697; 1698; CHECK-AIX-LABEL: getus6: 1699; CHECK-AIX: # %bb.0: # %entry 1700; CHECK-AIX-NEXT: xxswapd 0, 34 1701; CHECK-AIX-NEXT: mffprd 3, 0 1702; CHECK-AIX-NEXT: rldicl 3, 3, 48, 48 1703; CHECK-AIX-NEXT: clrldi 3, 3, 48 1704; CHECK-AIX-NEXT: blr 1705entry: 1706 %vecext = extractelement <8 x i16> %vus, i32 6 1707 ret i16 %vecext 1708 1709 1710} 1711 1712; Function Attrs: norecurse nounwind readnone 1713define zeroext i16 @getus7(<8 x i16> %vus) { 1714; CHECK-LABEL: getus7: 1715; CHECK: # %bb.0: # %entry 1716; CHECK-NEXT: xxswapd vs0, v2 1717; CHECK-NEXT: mffprd r3, f0 1718; CHECK-NEXT: clrldi r3, r3, 48 1719; CHECK-NEXT: clrldi r3, r3, 48 1720; CHECK-NEXT: blr 1721; 1722; CHECK-LE-LABEL: getus7: 1723; CHECK-LE: # %bb.0: # %entry 1724; CHECK-LE-NEXT: mfvsrd r3, v2 1725; CHECK-LE-NEXT: rldicl r3, r3, 16, 48 1726; CHECK-LE-NEXT: clrldi r3, r3, 48 1727; CHECK-LE-NEXT: blr 1728; 1729; CHECK-AIX-LABEL: getus7: 1730; CHECK-AIX: # %bb.0: # %entry 1731; CHECK-AIX-NEXT: xxswapd 0, 34 1732; CHECK-AIX-NEXT: mffprd 3, 0 1733; CHECK-AIX-NEXT: clrldi 3, 3, 48 1734; CHECK-AIX-NEXT: clrldi 3, 3, 48 1735; CHECK-AIX-NEXT: blr 1736entry: 1737 %vecext = extractelement <8 x i16> %vus, i32 7 1738 ret i16 %vecext 1739 1740 1741} 1742 1743; Function Attrs: norecurse nounwind readnone 1744define signext i16 @getvelss(<8 x i16> %vss, i32 signext %i) { 1745; CHECK-LABEL: getvelss: 1746; CHECK: # %bb.0: # %entry 1747; CHECK-NEXT: andi. r4, r5, 4 1748; CHECK-NEXT: li r3, 3 1749; CHECK-NEXT: sldi r4, r4, 1 1750; CHECK-NEXT: andc r3, r3, r5 1751; CHECK-NEXT: lvsl v3, 0, r4 1752; CHECK-NEXT: sldi r3, r3, 4 1753; CHECK-NEXT: vperm v2, v2, v2, v3 1754; CHECK-NEXT: mfvsrd r4, v2 1755; CHECK-NEXT: srd r3, r4, r3 1756; CHECK-NEXT: extsh r3, r3 1757; CHECK-NEXT: blr 1758; 1759; CHECK-LE-LABEL: getvelss: 1760; CHECK-LE: # %bb.0: # %entry 1761; CHECK-LE-NEXT: li r3, 4 1762; CHECK-LE-NEXT: andc r3, r3, r5 1763; CHECK-LE-NEXT: sldi r3, r3, 1 1764; CHECK-LE-NEXT: lvsl v3, 0, r3 1765; CHECK-LE-NEXT: li r3, 3 1766; CHECK-LE-NEXT: and r3, r3, r5 1767; CHECK-LE-NEXT: vperm v2, v2, v2, v3 1768; CHECK-LE-NEXT: sldi r3, r3, 4 1769; CHECK-LE-NEXT: mfvsrd r4, v2 1770; CHECK-LE-NEXT: srd r3, r4, r3 1771; CHECK-LE-NEXT: extsh r3, r3 1772; CHECK-LE-NEXT: blr 1773; 1774; CHECK-AIX-LABEL: getvelss: 1775; CHECK-AIX: # %bb.0: # %entry 1776; CHECK-AIX-NEXT: andi. 5, 3, 4 1777; CHECK-AIX-NEXT: li 4, 3 1778; CHECK-AIX-NEXT: sldi 5, 5, 1 1779; CHECK-AIX-NEXT: andc 3, 4, 3 1780; CHECK-AIX-NEXT: lvsl 3, 0, 5 1781; CHECK-AIX-NEXT: sldi 3, 3, 4 1782; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 1783; CHECK-AIX-NEXT: mfvsrd 4, 34 1784; CHECK-AIX-NEXT: srd 3, 4, 3 1785; CHECK-AIX-NEXT: extsh 3, 3 1786; CHECK-AIX-NEXT: blr 1787 1788 1789entry: 1790 %vecext = extractelement <8 x i16> %vss, i32 %i 1791 ret i16 %vecext 1792} 1793 1794; Function Attrs: norecurse nounwind readnone 1795define zeroext i16 @getvelus(<8 x i16> %vus, i32 signext %i) { 1796; CHECK-LABEL: getvelus: 1797; CHECK: # %bb.0: # %entry 1798; CHECK-NEXT: andi. r4, r5, 4 1799; CHECK-NEXT: li r3, 3 1800; CHECK-NEXT: sldi r4, r4, 1 1801; CHECK-NEXT: andc r3, r3, r5 1802; CHECK-NEXT: lvsl v3, 0, r4 1803; CHECK-NEXT: sldi r3, r3, 4 1804; CHECK-NEXT: vperm v2, v2, v2, v3 1805; CHECK-NEXT: mfvsrd r4, v2 1806; CHECK-NEXT: srd r3, r4, r3 1807; CHECK-NEXT: clrldi r3, r3, 48 1808; CHECK-NEXT: blr 1809; 1810; CHECK-LE-LABEL: getvelus: 1811; CHECK-LE: # %bb.0: # %entry 1812; CHECK-LE-NEXT: li r3, 4 1813; CHECK-LE-NEXT: andc r3, r3, r5 1814; CHECK-LE-NEXT: sldi r3, r3, 1 1815; CHECK-LE-NEXT: lvsl v3, 0, r3 1816; CHECK-LE-NEXT: li r3, 3 1817; CHECK-LE-NEXT: and r3, r3, r5 1818; CHECK-LE-NEXT: vperm v2, v2, v2, v3 1819; CHECK-LE-NEXT: sldi r3, r3, 4 1820; CHECK-LE-NEXT: mfvsrd r4, v2 1821; CHECK-LE-NEXT: srd r3, r4, r3 1822; CHECK-LE-NEXT: clrldi r3, r3, 48 1823; CHECK-LE-NEXT: blr 1824; 1825; CHECK-AIX-LABEL: getvelus: 1826; CHECK-AIX: # %bb.0: # %entry 1827; CHECK-AIX-NEXT: andi. 5, 3, 4 1828; CHECK-AIX-NEXT: li 4, 3 1829; CHECK-AIX-NEXT: sldi 5, 5, 1 1830; CHECK-AIX-NEXT: andc 3, 4, 3 1831; CHECK-AIX-NEXT: lvsl 3, 0, 5 1832; CHECK-AIX-NEXT: sldi 3, 3, 4 1833; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 1834; CHECK-AIX-NEXT: mfvsrd 4, 34 1835; CHECK-AIX-NEXT: srd 3, 4, 3 1836; CHECK-AIX-NEXT: clrldi 3, 3, 48 1837; CHECK-AIX-NEXT: blr 1838 1839 1840entry: 1841 %vecext = extractelement <8 x i16> %vus, i32 %i 1842 ret i16 %vecext 1843} 1844 1845; Function Attrs: norecurse nounwind readnone 1846define signext i32 @getsi0(<4 x i32> %vsi) { 1847; CHECK-LABEL: getsi0: 1848; CHECK: # %bb.0: # %entry 1849; CHECK-NEXT: xxsldwi vs0, v2, v2, 3 1850; CHECK-NEXT: mffprwz r3, f0 1851; CHECK-NEXT: extsw r3, r3 1852; CHECK-NEXT: blr 1853; 1854; CHECK-LE-LABEL: getsi0: 1855; CHECK-LE: # %bb.0: # %entry 1856; CHECK-LE-NEXT: xxswapd vs0, v2 1857; CHECK-LE-NEXT: mffprwz r3, f0 1858; CHECK-LE-NEXT: extsw r3, r3 1859; CHECK-LE-NEXT: blr 1860; 1861; CHECK-AIX-LABEL: getsi0: 1862; CHECK-AIX: # %bb.0: # %entry 1863; CHECK-AIX-NEXT: xxsldwi 0, 34, 34, 3 1864; CHECK-AIX-NEXT: mffprwz 3, 0 1865; CHECK-AIX-NEXT: extsw 3, 3 1866; CHECK-AIX-NEXT: blr 1867entry: 1868 %vecext = extractelement <4 x i32> %vsi, i32 0 1869 ret i32 %vecext 1870 1871 1872} 1873 1874; Function Attrs: norecurse nounwind readnone 1875define signext i32 @getsi1(<4 x i32> %vsi) { 1876; CHECK-LABEL: getsi1: 1877; CHECK: # %bb.0: # %entry 1878; CHECK-NEXT: mfvsrwz r3, v2 1879; CHECK-NEXT: extsw r3, r3 1880; CHECK-NEXT: blr 1881; 1882; CHECK-LE-LABEL: getsi1: 1883; CHECK-LE: # %bb.0: # %entry 1884; CHECK-LE-NEXT: xxsldwi vs0, v2, v2, 1 1885; CHECK-LE-NEXT: mffprwz r3, f0 1886; CHECK-LE-NEXT: extsw r3, r3 1887; CHECK-LE-NEXT: blr 1888; 1889; CHECK-AIX-LABEL: getsi1: 1890; CHECK-AIX: # %bb.0: # %entry 1891; CHECK-AIX-NEXT: mfvsrwz 3, 34 1892; CHECK-AIX-NEXT: extsw 3, 3 1893; CHECK-AIX-NEXT: blr 1894entry: 1895 %vecext = extractelement <4 x i32> %vsi, i32 1 1896 ret i32 %vecext 1897 1898 1899} 1900 1901; Function Attrs: norecurse nounwind readnone 1902define signext i32 @getsi2(<4 x i32> %vsi) { 1903; CHECK-LABEL: getsi2: 1904; CHECK: # %bb.0: # %entry 1905; CHECK-NEXT: xxsldwi vs0, v2, v2, 1 1906; CHECK-NEXT: mffprwz r3, f0 1907; CHECK-NEXT: extsw r3, r3 1908; CHECK-NEXT: blr 1909; 1910; CHECK-LE-LABEL: getsi2: 1911; CHECK-LE: # %bb.0: # %entry 1912; CHECK-LE-NEXT: mfvsrwz r3, v2 1913; CHECK-LE-NEXT: extsw r3, r3 1914; CHECK-LE-NEXT: blr 1915; 1916; CHECK-AIX-LABEL: getsi2: 1917; CHECK-AIX: # %bb.0: # %entry 1918; CHECK-AIX-NEXT: xxsldwi 0, 34, 34, 1 1919; CHECK-AIX-NEXT: mffprwz 3, 0 1920; CHECK-AIX-NEXT: extsw 3, 3 1921; CHECK-AIX-NEXT: blr 1922entry: 1923 %vecext = extractelement <4 x i32> %vsi, i32 2 1924 ret i32 %vecext 1925 1926 1927} 1928 1929; Function Attrs: norecurse nounwind readnone 1930define signext i32 @getsi3(<4 x i32> %vsi) { 1931; CHECK-LABEL: getsi3: 1932; CHECK: # %bb.0: # %entry 1933; CHECK-NEXT: xxswapd vs0, v2 1934; CHECK-NEXT: mffprwz r3, f0 1935; CHECK-NEXT: extsw r3, r3 1936; CHECK-NEXT: blr 1937; 1938; CHECK-LE-LABEL: getsi3: 1939; CHECK-LE: # %bb.0: # %entry 1940; CHECK-LE-NEXT: xxsldwi vs0, v2, v2, 3 1941; CHECK-LE-NEXT: mffprwz r3, f0 1942; CHECK-LE-NEXT: extsw r3, r3 1943; CHECK-LE-NEXT: blr 1944; 1945; CHECK-AIX-LABEL: getsi3: 1946; CHECK-AIX: # %bb.0: # %entry 1947; CHECK-AIX-NEXT: xxswapd 0, 34 1948; CHECK-AIX-NEXT: mffprwz 3, 0 1949; CHECK-AIX-NEXT: extsw 3, 3 1950; CHECK-AIX-NEXT: blr 1951entry: 1952 %vecext = extractelement <4 x i32> %vsi, i32 3 1953 ret i32 %vecext 1954 1955 1956} 1957 1958; Function Attrs: norecurse nounwind readnone 1959define zeroext i32 @getui0(<4 x i32> %vui) { 1960; CHECK-LABEL: getui0: 1961; CHECK: # %bb.0: # %entry 1962; CHECK-NEXT: xxsldwi vs0, v2, v2, 3 1963; CHECK-NEXT: mffprwz r3, f0 1964; CHECK-NEXT: clrldi r3, r3, 32 1965; CHECK-NEXT: blr 1966; 1967; CHECK-LE-LABEL: getui0: 1968; CHECK-LE: # %bb.0: # %entry 1969; CHECK-LE-NEXT: xxswapd vs0, v2 1970; CHECK-LE-NEXT: mffprwz r3, f0 1971; CHECK-LE-NEXT: clrldi r3, r3, 32 1972; CHECK-LE-NEXT: blr 1973; 1974; CHECK-AIX-LABEL: getui0: 1975; CHECK-AIX: # %bb.0: # %entry 1976; CHECK-AIX-NEXT: xxsldwi 0, 34, 34, 3 1977; CHECK-AIX-NEXT: mffprwz 3, 0 1978; CHECK-AIX-NEXT: clrldi 3, 3, 32 1979; CHECK-AIX-NEXT: blr 1980entry: 1981 %vecext = extractelement <4 x i32> %vui, i32 0 1982 ret i32 %vecext 1983 1984 1985} 1986 1987; Function Attrs: norecurse nounwind readnone 1988define zeroext i32 @getui1(<4 x i32> %vui) { 1989; CHECK-LABEL: getui1: 1990; CHECK: # %bb.0: # %entry 1991; CHECK-NEXT: mfvsrwz r3, v2 1992; CHECK-NEXT: clrldi r3, r3, 32 1993; CHECK-NEXT: blr 1994; 1995; CHECK-LE-LABEL: getui1: 1996; CHECK-LE: # %bb.0: # %entry 1997; CHECK-LE-NEXT: xxsldwi vs0, v2, v2, 1 1998; CHECK-LE-NEXT: mffprwz r3, f0 1999; CHECK-LE-NEXT: clrldi r3, r3, 32 2000; CHECK-LE-NEXT: blr 2001; 2002; CHECK-AIX-LABEL: getui1: 2003; CHECK-AIX: # %bb.0: # %entry 2004; CHECK-AIX-NEXT: mfvsrwz 3, 34 2005; CHECK-AIX-NEXT: clrldi 3, 3, 32 2006; CHECK-AIX-NEXT: blr 2007entry: 2008 %vecext = extractelement <4 x i32> %vui, i32 1 2009 ret i32 %vecext 2010 2011 2012} 2013 2014; Function Attrs: norecurse nounwind readnone 2015define zeroext i32 @getui2(<4 x i32> %vui) { 2016; CHECK-LABEL: getui2: 2017; CHECK: # %bb.0: # %entry 2018; CHECK-NEXT: xxsldwi vs0, v2, v2, 1 2019; CHECK-NEXT: mffprwz r3, f0 2020; CHECK-NEXT: clrldi r3, r3, 32 2021; CHECK-NEXT: blr 2022; 2023; CHECK-LE-LABEL: getui2: 2024; CHECK-LE: # %bb.0: # %entry 2025; CHECK-LE-NEXT: mfvsrwz r3, v2 2026; CHECK-LE-NEXT: clrldi r3, r3, 32 2027; CHECK-LE-NEXT: blr 2028; 2029; CHECK-AIX-LABEL: getui2: 2030; CHECK-AIX: # %bb.0: # %entry 2031; CHECK-AIX-NEXT: xxsldwi 0, 34, 34, 1 2032; CHECK-AIX-NEXT: mffprwz 3, 0 2033; CHECK-AIX-NEXT: clrldi 3, 3, 32 2034; CHECK-AIX-NEXT: blr 2035entry: 2036 %vecext = extractelement <4 x i32> %vui, i32 2 2037 ret i32 %vecext 2038 2039 2040} 2041 2042; Function Attrs: norecurse nounwind readnone 2043define zeroext i32 @getui3(<4 x i32> %vui) { 2044; CHECK-LABEL: getui3: 2045; CHECK: # %bb.0: # %entry 2046; CHECK-NEXT: xxswapd vs0, v2 2047; CHECK-NEXT: mffprwz r3, f0 2048; CHECK-NEXT: clrldi r3, r3, 32 2049; CHECK-NEXT: blr 2050; 2051; CHECK-LE-LABEL: getui3: 2052; CHECK-LE: # %bb.0: # %entry 2053; CHECK-LE-NEXT: xxsldwi vs0, v2, v2, 3 2054; CHECK-LE-NEXT: mffprwz r3, f0 2055; CHECK-LE-NEXT: clrldi r3, r3, 32 2056; CHECK-LE-NEXT: blr 2057; 2058; CHECK-AIX-LABEL: getui3: 2059; CHECK-AIX: # %bb.0: # %entry 2060; CHECK-AIX-NEXT: xxswapd 0, 34 2061; CHECK-AIX-NEXT: mffprwz 3, 0 2062; CHECK-AIX-NEXT: clrldi 3, 3, 32 2063; CHECK-AIX-NEXT: blr 2064entry: 2065 %vecext = extractelement <4 x i32> %vui, i32 3 2066 ret i32 %vecext 2067 2068 2069} 2070 2071; Function Attrs: norecurse nounwind readnone 2072define signext i32 @getvelsi(<4 x i32> %vsi, i32 signext %i) { 2073; CHECK-LABEL: getvelsi: 2074; CHECK: # %bb.0: # %entry 2075; CHECK-NEXT: andi. r4, r5, 2 2076; CHECK-NEXT: li r3, 1 2077; CHECK-NEXT: sldi r4, r4, 2 2078; CHECK-NEXT: andc r3, r3, r5 2079; CHECK-NEXT: lvsl v3, 0, r4 2080; CHECK-NEXT: sldi r3, r3, 5 2081; CHECK-NEXT: vperm v2, v2, v2, v3 2082; CHECK-NEXT: mfvsrd r4, v2 2083; CHECK-NEXT: srd r3, r4, r3 2084; CHECK-NEXT: extsw r3, r3 2085; CHECK-NEXT: blr 2086; 2087; CHECK-LE-LABEL: getvelsi: 2088; CHECK-LE: # %bb.0: # %entry 2089; CHECK-LE-NEXT: li r3, 2 2090; CHECK-LE-NEXT: andc r3, r3, r5 2091; CHECK-LE-NEXT: sldi r3, r3, 2 2092; CHECK-LE-NEXT: lvsl v3, 0, r3 2093; CHECK-LE-NEXT: li r3, 1 2094; CHECK-LE-NEXT: and r3, r3, r5 2095; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2096; CHECK-LE-NEXT: sldi r3, r3, 5 2097; CHECK-LE-NEXT: mfvsrd r4, v2 2098; CHECK-LE-NEXT: srd r3, r4, r3 2099; CHECK-LE-NEXT: extsw r3, r3 2100; CHECK-LE-NEXT: blr 2101; 2102; CHECK-AIX-LABEL: getvelsi: 2103; CHECK-AIX: # %bb.0: # %entry 2104; CHECK-AIX-NEXT: andi. 5, 3, 2 2105; CHECK-AIX-NEXT: li 4, 1 2106; CHECK-AIX-NEXT: sldi 5, 5, 2 2107; CHECK-AIX-NEXT: andc 3, 4, 3 2108; CHECK-AIX-NEXT: lvsl 3, 0, 5 2109; CHECK-AIX-NEXT: sldi 3, 3, 5 2110; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 2111; CHECK-AIX-NEXT: mfvsrd 4, 34 2112; CHECK-AIX-NEXT: srd 3, 4, 3 2113; CHECK-AIX-NEXT: extsw 3, 3 2114; CHECK-AIX-NEXT: blr 2115entry: 2116 %vecext = extractelement <4 x i32> %vsi, i32 %i 2117 ret i32 %vecext 2118; FIXME: add check patterns when variable element extraction is implemented 2119} 2120 2121; Function Attrs: norecurse nounwind readnone 2122define zeroext i32 @getvelui(<4 x i32> %vui, i32 signext %i) { 2123; CHECK-LABEL: getvelui: 2124; CHECK: # %bb.0: # %entry 2125; CHECK-NEXT: andi. r4, r5, 2 2126; CHECK-NEXT: li r3, 1 2127; CHECK-NEXT: sldi r4, r4, 2 2128; CHECK-NEXT: andc r3, r3, r5 2129; CHECK-NEXT: lvsl v3, 0, r4 2130; CHECK-NEXT: sldi r3, r3, 5 2131; CHECK-NEXT: vperm v2, v2, v2, v3 2132; CHECK-NEXT: mfvsrd r4, v2 2133; CHECK-NEXT: srd r3, r4, r3 2134; CHECK-NEXT: clrldi r3, r3, 32 2135; CHECK-NEXT: blr 2136; 2137; CHECK-LE-LABEL: getvelui: 2138; CHECK-LE: # %bb.0: # %entry 2139; CHECK-LE-NEXT: li r3, 2 2140; CHECK-LE-NEXT: andc r3, r3, r5 2141; CHECK-LE-NEXT: sldi r3, r3, 2 2142; CHECK-LE-NEXT: lvsl v3, 0, r3 2143; CHECK-LE-NEXT: li r3, 1 2144; CHECK-LE-NEXT: and r3, r3, r5 2145; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2146; CHECK-LE-NEXT: sldi r3, r3, 5 2147; CHECK-LE-NEXT: mfvsrd r4, v2 2148; CHECK-LE-NEXT: srd r3, r4, r3 2149; CHECK-LE-NEXT: clrldi r3, r3, 32 2150; CHECK-LE-NEXT: blr 2151; 2152; CHECK-AIX-LABEL: getvelui: 2153; CHECK-AIX: # %bb.0: # %entry 2154; CHECK-AIX-NEXT: andi. 5, 3, 2 2155; CHECK-AIX-NEXT: li 4, 1 2156; CHECK-AIX-NEXT: sldi 5, 5, 2 2157; CHECK-AIX-NEXT: andc 3, 4, 3 2158; CHECK-AIX-NEXT: lvsl 3, 0, 5 2159; CHECK-AIX-NEXT: sldi 3, 3, 5 2160; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 2161; CHECK-AIX-NEXT: mfvsrd 4, 34 2162; CHECK-AIX-NEXT: srd 3, 4, 3 2163; CHECK-AIX-NEXT: clrldi 3, 3, 32 2164; CHECK-AIX-NEXT: blr 2165entry: 2166 %vecext = extractelement <4 x i32> %vui, i32 %i 2167 ret i32 %vecext 2168; FIXME: add check patterns when variable element extraction is implemented 2169} 2170 2171; Function Attrs: norecurse nounwind readnone 2172define i64 @getsl0(<2 x i64> %vsl) { 2173; CHECK-LABEL: getsl0: 2174; CHECK: # %bb.0: # %entry 2175; CHECK-NEXT: mfvsrd r3, v2 2176; CHECK-NEXT: blr 2177; 2178; CHECK-LE-LABEL: getsl0: 2179; CHECK-LE: # %bb.0: # %entry 2180; CHECK-LE-NEXT: xxswapd vs0, v2 2181; CHECK-LE-NEXT: mffprd r3, f0 2182; CHECK-LE-NEXT: blr 2183; 2184; CHECK-AIX-LABEL: getsl0: 2185; CHECK-AIX: # %bb.0: # %entry 2186; CHECK-AIX-NEXT: mfvsrd 3, 34 2187; CHECK-AIX-NEXT: blr 2188entry: 2189 %vecext = extractelement <2 x i64> %vsl, i32 0 2190 ret i64 %vecext 2191 2192 2193} 2194 2195; Function Attrs: norecurse nounwind readnone 2196define i64 @getsl1(<2 x i64> %vsl) { 2197; CHECK-LABEL: getsl1: 2198; CHECK: # %bb.0: # %entry 2199; CHECK-NEXT: xxswapd vs0, v2 2200; CHECK-NEXT: mffprd r3, f0 2201; CHECK-NEXT: blr 2202; 2203; CHECK-LE-LABEL: getsl1: 2204; CHECK-LE: # %bb.0: # %entry 2205; CHECK-LE-NEXT: mfvsrd r3, v2 2206; CHECK-LE-NEXT: blr 2207; 2208; CHECK-AIX-LABEL: getsl1: 2209; CHECK-AIX: # %bb.0: # %entry 2210; CHECK-AIX-NEXT: xxswapd 0, 34 2211; CHECK-AIX-NEXT: mffprd 3, 0 2212; CHECK-AIX-NEXT: blr 2213entry: 2214 %vecext = extractelement <2 x i64> %vsl, i32 1 2215 ret i64 %vecext 2216 2217 2218} 2219 2220; Function Attrs: norecurse nounwind readnone 2221define i64 @getul0(<2 x i64> %vul) { 2222; CHECK-LABEL: getul0: 2223; CHECK: # %bb.0: # %entry 2224; CHECK-NEXT: mfvsrd r3, v2 2225; CHECK-NEXT: blr 2226; 2227; CHECK-LE-LABEL: getul0: 2228; CHECK-LE: # %bb.0: # %entry 2229; CHECK-LE-NEXT: xxswapd vs0, v2 2230; CHECK-LE-NEXT: mffprd r3, f0 2231; CHECK-LE-NEXT: blr 2232; 2233; CHECK-AIX-LABEL: getul0: 2234; CHECK-AIX: # %bb.0: # %entry 2235; CHECK-AIX-NEXT: mfvsrd 3, 34 2236; CHECK-AIX-NEXT: blr 2237entry: 2238 %vecext = extractelement <2 x i64> %vul, i32 0 2239 ret i64 %vecext 2240 2241 2242} 2243 2244; Function Attrs: norecurse nounwind readnone 2245define i64 @getul1(<2 x i64> %vul) { 2246; CHECK-LABEL: getul1: 2247; CHECK: # %bb.0: # %entry 2248; CHECK-NEXT: xxswapd vs0, v2 2249; CHECK-NEXT: mffprd r3, f0 2250; CHECK-NEXT: blr 2251; 2252; CHECK-LE-LABEL: getul1: 2253; CHECK-LE: # %bb.0: # %entry 2254; CHECK-LE-NEXT: mfvsrd r3, v2 2255; CHECK-LE-NEXT: blr 2256; 2257; CHECK-AIX-LABEL: getul1: 2258; CHECK-AIX: # %bb.0: # %entry 2259; CHECK-AIX-NEXT: xxswapd 0, 34 2260; CHECK-AIX-NEXT: mffprd 3, 0 2261; CHECK-AIX-NEXT: blr 2262entry: 2263 %vecext = extractelement <2 x i64> %vul, i32 1 2264 ret i64 %vecext 2265 2266 2267} 2268 2269; Function Attrs: norecurse nounwind readnone 2270define i64 @getvelsl(<2 x i64> %vsl, i32 signext %i) { 2271; CHECK-LABEL: getvelsl: 2272; CHECK: # %bb.0: # %entry 2273; CHECK-NEXT: andi. r3, r5, 1 2274; CHECK-NEXT: sldi r3, r3, 3 2275; CHECK-NEXT: lvsl v3, 0, r3 2276; CHECK-NEXT: vperm v2, v2, v2, v3 2277; CHECK-NEXT: mfvsrd r3, v2 2278; CHECK-NEXT: blr 2279; 2280; CHECK-LE-LABEL: getvelsl: 2281; CHECK-LE: # %bb.0: # %entry 2282; CHECK-LE-NEXT: li r3, 1 2283; CHECK-LE-NEXT: andc r3, r3, r5 2284; CHECK-LE-NEXT: sldi r3, r3, 3 2285; CHECK-LE-NEXT: lvsl v3, 0, r3 2286; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2287; CHECK-LE-NEXT: mfvsrd r3, v2 2288; CHECK-LE-NEXT: blr 2289; 2290; CHECK-AIX-LABEL: getvelsl: 2291; CHECK-AIX: # %bb.0: # %entry 2292; CHECK-AIX-NEXT: andi. 3, 3, 1 2293; CHECK-AIX-NEXT: sldi 3, 3, 3 2294; CHECK-AIX-NEXT: lvsl 3, 0, 3 2295; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 2296; CHECK-AIX-NEXT: mfvsrd 3, 34 2297; CHECK-AIX-NEXT: blr 2298entry: 2299 %vecext = extractelement <2 x i64> %vsl, i32 %i 2300 ret i64 %vecext 2301; FIXME: add check patterns when variable element extraction is implemented 2302} 2303 2304; Function Attrs: norecurse nounwind readnone 2305define i64 @getvelul(<2 x i64> %vul, i32 signext %i) { 2306; CHECK-LABEL: getvelul: 2307; CHECK: # %bb.0: # %entry 2308; CHECK-NEXT: andi. r3, r5, 1 2309; CHECK-NEXT: sldi r3, r3, 3 2310; CHECK-NEXT: lvsl v3, 0, r3 2311; CHECK-NEXT: vperm v2, v2, v2, v3 2312; CHECK-NEXT: mfvsrd r3, v2 2313; CHECK-NEXT: blr 2314; 2315; CHECK-LE-LABEL: getvelul: 2316; CHECK-LE: # %bb.0: # %entry 2317; CHECK-LE-NEXT: li r3, 1 2318; CHECK-LE-NEXT: andc r3, r3, r5 2319; CHECK-LE-NEXT: sldi r3, r3, 3 2320; CHECK-LE-NEXT: lvsl v3, 0, r3 2321; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2322; CHECK-LE-NEXT: mfvsrd r3, v2 2323; CHECK-LE-NEXT: blr 2324; 2325; CHECK-AIX-LABEL: getvelul: 2326; CHECK-AIX: # %bb.0: # %entry 2327; CHECK-AIX-NEXT: andi. 3, 3, 1 2328; CHECK-AIX-NEXT: sldi 3, 3, 3 2329; CHECK-AIX-NEXT: lvsl 3, 0, 3 2330; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 2331; CHECK-AIX-NEXT: mfvsrd 3, 34 2332; CHECK-AIX-NEXT: blr 2333entry: 2334 %vecext = extractelement <2 x i64> %vul, i32 %i 2335 ret i64 %vecext 2336; FIXME: add check patterns when variable element extraction is implemented 2337} 2338 2339; Function Attrs: norecurse nounwind readnone 2340define float @getf0(<4 x float> %vf) { 2341; CHECK-LABEL: getf0: 2342; CHECK: # %bb.0: # %entry 2343; CHECK-NEXT: xscvspdpn f1, v2 2344; CHECK-NEXT: blr 2345; 2346; CHECK-LE-LABEL: getf0: 2347; CHECK-LE: # %bb.0: # %entry 2348; CHECK-LE-NEXT: xxsldwi vs0, v2, v2, 3 2349; CHECK-LE-NEXT: xscvspdpn f1, vs0 2350; CHECK-LE-NEXT: blr 2351; 2352; CHECK-AIX-LABEL: getf0: 2353; CHECK-AIX: # %bb.0: # %entry 2354; CHECK-AIX-NEXT: xscvspdpn 1, 34 2355; CHECK-AIX-NEXT: blr 2356entry: 2357 %vecext = extractelement <4 x float> %vf, i32 0 2358 ret float %vecext 2359 2360 2361} 2362 2363; Function Attrs: norecurse nounwind readnone 2364define float @getf1(<4 x float> %vf) { 2365; CHECK-LABEL: getf1: 2366; CHECK: # %bb.0: # %entry 2367; CHECK-NEXT: xxsldwi vs0, v2, v2, 1 2368; CHECK-NEXT: xscvspdpn f1, vs0 2369; CHECK-NEXT: blr 2370; 2371; CHECK-LE-LABEL: getf1: 2372; CHECK-LE: # %bb.0: # %entry 2373; CHECK-LE-NEXT: xxswapd vs0, v2 2374; CHECK-LE-NEXT: xscvspdpn f1, vs0 2375; CHECK-LE-NEXT: blr 2376; 2377; CHECK-AIX-LABEL: getf1: 2378; CHECK-AIX: # %bb.0: # %entry 2379; CHECK-AIX-NEXT: xxsldwi 0, 34, 34, 1 2380; CHECK-AIX-NEXT: xscvspdpn 1, 0 2381; CHECK-AIX-NEXT: blr 2382entry: 2383 %vecext = extractelement <4 x float> %vf, i32 1 2384 ret float %vecext 2385 2386 2387} 2388 2389; Function Attrs: norecurse nounwind readnone 2390define float @getf2(<4 x float> %vf) { 2391; CHECK-LABEL: getf2: 2392; CHECK: # %bb.0: # %entry 2393; CHECK-NEXT: xxswapd vs0, v2 2394; CHECK-NEXT: xscvspdpn f1, vs0 2395; CHECK-NEXT: blr 2396; 2397; CHECK-LE-LABEL: getf2: 2398; CHECK-LE: # %bb.0: # %entry 2399; CHECK-LE-NEXT: xxsldwi vs0, v2, v2, 1 2400; CHECK-LE-NEXT: xscvspdpn f1, vs0 2401; CHECK-LE-NEXT: blr 2402; 2403; CHECK-AIX-LABEL: getf2: 2404; CHECK-AIX: # %bb.0: # %entry 2405; CHECK-AIX-NEXT: xxswapd 0, 34 2406; CHECK-AIX-NEXT: xscvspdpn 1, 0 2407; CHECK-AIX-NEXT: blr 2408entry: 2409 %vecext = extractelement <4 x float> %vf, i32 2 2410 ret float %vecext 2411 2412 2413} 2414 2415; Function Attrs: norecurse nounwind readnone 2416define float @getf3(<4 x float> %vf) { 2417; CHECK-LABEL: getf3: 2418; CHECK: # %bb.0: # %entry 2419; CHECK-NEXT: xxsldwi vs0, v2, v2, 3 2420; CHECK-NEXT: xscvspdpn f1, vs0 2421; CHECK-NEXT: blr 2422; 2423; CHECK-LE-LABEL: getf3: 2424; CHECK-LE: # %bb.0: # %entry 2425; CHECK-LE-NEXT: xscvspdpn f1, v2 2426; CHECK-LE-NEXT: blr 2427; 2428; CHECK-AIX-LABEL: getf3: 2429; CHECK-AIX: # %bb.0: # %entry 2430; CHECK-AIX-NEXT: xxsldwi 0, 34, 34, 3 2431; CHECK-AIX-NEXT: xscvspdpn 1, 0 2432; CHECK-AIX-NEXT: blr 2433entry: 2434 %vecext = extractelement <4 x float> %vf, i32 3 2435 ret float %vecext 2436 2437 2438} 2439 2440; Function Attrs: norecurse nounwind readnone 2441define float @getvelf(<4 x float> %vf, i32 signext %i) { 2442; CHECK-LABEL: getvelf: 2443; CHECK: # %bb.0: # %entry 2444; CHECK-NEXT: sldi r3, r5, 2 2445; CHECK-NEXT: lvsl v3, 0, r3 2446; CHECK-NEXT: vperm v2, v2, v2, v3 2447; CHECK-NEXT: xscvspdpn f1, v2 2448; CHECK-NEXT: blr 2449; 2450; CHECK-LE-LABEL: getvelf: 2451; CHECK-LE: # %bb.0: # %entry 2452; CHECK-LE-NEXT: xori r3, r5, 3 2453; CHECK-LE-NEXT: sldi r3, r3, 2 2454; CHECK-LE-NEXT: lvsl v3, 0, r3 2455; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2456; CHECK-LE-NEXT: xscvspdpn f1, v2 2457; CHECK-LE-NEXT: blr 2458; 2459; CHECK-AIX-LABEL: getvelf: 2460; CHECK-AIX: # %bb.0: # %entry 2461; CHECK-AIX-NEXT: sldi 3, 3, 2 2462; CHECK-AIX-NEXT: lvsl 3, 0, 3 2463; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 2464; CHECK-AIX-NEXT: xscvspdpn 1, 34 2465; CHECK-AIX-NEXT: blr 2466entry: 2467 %vecext = extractelement <4 x float> %vf, i32 %i 2468 ret float %vecext 2469; FIXME: add check patterns when variable element extraction is implemented 2470} 2471 2472; Function Attrs: norecurse nounwind readnone 2473define double @getd0(<2 x double> %vd) { 2474; CHECK-LABEL: getd0: 2475; CHECK: # %bb.0: # %entry 2476; CHECK-NEXT: xxlor f1, v2, v2 2477; CHECK-NEXT: blr 2478; 2479; CHECK-LE-LABEL: getd0: 2480; CHECK-LE: # %bb.0: # %entry 2481; CHECK-LE-NEXT: xxswapd vs1, v2 2482; CHECK-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1 2483; CHECK-LE-NEXT: blr 2484; 2485; CHECK-AIX-LABEL: getd0: 2486; CHECK-AIX: # %bb.0: # %entry 2487; CHECK-AIX-NEXT: xxlor 1, 34, 34 2488; CHECK-AIX-NEXT: blr 2489entry: 2490 %vecext = extractelement <2 x double> %vd, i32 0 2491 ret double %vecext 2492 2493 2494} 2495 2496; Function Attrs: norecurse nounwind readnone 2497define double @getd1(<2 x double> %vd) { 2498; CHECK-LABEL: getd1: 2499; CHECK: # %bb.0: # %entry 2500; CHECK-NEXT: xxswapd vs1, v2 2501; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1 2502; CHECK-NEXT: blr 2503; 2504; CHECK-LE-LABEL: getd1: 2505; CHECK-LE: # %bb.0: # %entry 2506; CHECK-LE-NEXT: xxlor f1, v2, v2 2507; CHECK-LE-NEXT: blr 2508; 2509; CHECK-AIX-LABEL: getd1: 2510; CHECK-AIX: # %bb.0: # %entry 2511; CHECK-AIX-NEXT: xxswapd 1, 34 2512; CHECK-AIX-NEXT: # kill: def $f1 killed $f1 killed $vsl1 2513; CHECK-AIX-NEXT: blr 2514entry: 2515 %vecext = extractelement <2 x double> %vd, i32 1 2516 ret double %vecext 2517} 2518 2519; Function Attrs: norecurse nounwind readnone 2520define double @getveld(<2 x double> %vd, i32 signext %i) { 2521; CHECK-LABEL: getveld: 2522; CHECK: # %bb.0: # %entry 2523; CHECK-NEXT: andi. r3, r5, 1 2524; CHECK-NEXT: sldi r3, r3, 3 2525; CHECK-NEXT: lvsl v3, 0, r3 2526; CHECK-NEXT: vperm v2, v2, v2, v3 2527; CHECK-NEXT: xxlor vs1, v2, v2 2528; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1 2529; CHECK-NEXT: blr 2530; 2531; CHECK-LE-LABEL: getveld: 2532; CHECK-LE: # %bb.0: # %entry 2533; CHECK-LE-NEXT: li r3, 1 2534; CHECK-LE-NEXT: andc r3, r3, r5 2535; CHECK-LE-NEXT: sldi r3, r3, 3 2536; CHECK-LE-NEXT: lvsl v3, 0, r3 2537; CHECK-LE-NEXT: vperm v2, v2, v2, v3 2538; CHECK-LE-NEXT: xxlor vs1, v2, v2 2539; CHECK-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1 2540; CHECK-LE-NEXT: blr 2541; 2542; CHECK-AIX-LABEL: getveld: 2543; CHECK-AIX: # %bb.0: # %entry 2544; CHECK-AIX-NEXT: andi. 3, 3, 1 2545; CHECK-AIX-NEXT: sldi 3, 3, 3 2546; CHECK-AIX-NEXT: lvsl 3, 0, 3 2547; CHECK-AIX-NEXT: vperm 2, 2, 2, 3 2548; CHECK-AIX-NEXT: xxlor 1, 34, 34 2549; CHECK-AIX-NEXT: # kill: def $f1 killed $f1 killed $vsl1 2550; CHECK-AIX-NEXT: blr 2551entry: 2552 %vecext = extractelement <2 x double> %vd, i32 %i 2553 ret double %vecext 2554; FIXME: add check patterns when variable element extraction is implemented 2555} 2556 2557; To check when LHS is i32 to vector and RHS is i64 to vector, 2558; the combination should be skipped properly. 2559define <2 x i64> @buildi2(i64 %arg, i32 %arg1) { 2560; CHECK-LABEL: buildi2: 2561; CHECK: # %bb.0: # %entry 2562; CHECK-NEXT: sldi r4, r4, 32 2563; CHECK-NEXT: mtfprd f1, r3 2564; CHECK-NEXT: mtfprd f0, r4 2565; CHECK-NEXT: xxmrghd v2, vs0, vs1 2566; CHECK-NEXT: blr 2567; 2568; CHECK-LE-LABEL: buildi2: 2569; CHECK-LE: # %bb.0: # %entry 2570; CHECK-LE-NEXT: mtfprd f0, r4 2571; CHECK-LE-NEXT: mtfprd f1, r3 2572; CHECK-LE-NEXT: xxswapd vs0, vs0 2573; CHECK-LE-NEXT: xxswapd v2, vs1 2574; CHECK-LE-NEXT: xxmrgld v2, v2, vs0 2575; CHECK-LE-NEXT: blr 2576; 2577; CHECK-AIX-LABEL: buildi2: 2578; CHECK-AIX: # %bb.0: # %entry 2579; CHECK-AIX-NEXT: sldi 4, 4, 32 2580; CHECK-AIX-NEXT: mtfprd 1, 3 2581; CHECK-AIX-NEXT: mtfprd 0, 4 2582; CHECK-AIX-NEXT: xxmrghd 34, 0, 1 2583; CHECK-AIX-NEXT: blr 2584entry: 2585 %lhs.i32 = insertelement <4 x i32> undef, i32 %arg1, i32 0 2586 %rhs = insertelement <2 x i64> undef, i64 %arg, i32 0 2587 %lhs = bitcast <4 x i32> %lhs.i32 to <2 x i64> 2588 %shuffle = shufflevector <2 x i64> %lhs, <2 x i64> %rhs, <2 x i32> <i32 0, i32 2> 2589 ret <2 x i64> %shuffle 2590} 2591