1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names \ 4; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s 5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names \ 7; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-BE 8; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 9; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names \ 10; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-P9 11 12; Byte indexed 13 14define <16 x i8> @testByte(<16 x i8> %a, i64 %b, i64 %idx) { 15; CHECK-LABEL: testByte: 16; CHECK: # %bb.0: # %entry 17; CHECK-NEXT: vinsbrx v2, r6, r5 18; CHECK-NEXT: blr 19; 20; CHECK-BE-LABEL: testByte: 21; CHECK-BE: # %bb.0: # %entry 22; CHECK-BE-NEXT: vinsblx v2, r6, r5 23; CHECK-BE-NEXT: blr 24; 25; CHECK-P9-LABEL: testByte: 26; CHECK-P9: # %bb.0: # %entry 27; CHECK-P9-NEXT: addi r4, r1, -16 28; CHECK-P9-NEXT: clrldi r3, r6, 60 29; CHECK-P9-NEXT: stxv v2, -16(r1) 30; CHECK-P9-NEXT: stbx r5, r4, r3 31; CHECK-P9-NEXT: lxv v2, -16(r1) 32; CHECK-P9-NEXT: blr 33entry: 34 %conv = trunc i64 %b to i8 35 %vecins = insertelement <16 x i8> %a, i8 %conv, i64 %idx 36 ret <16 x i8> %vecins 37} 38 39; Halfword indexed 40 41define <8 x i16> @testHalf(<8 x i16> %a, i64 %b, i64 %idx) { 42; CHECK-LABEL: testHalf: 43; CHECK: # %bb.0: # %entry 44; CHECK-NEXT: slwi r3, r6, 1 45; CHECK-NEXT: vinshrx v2, r3, r5 46; CHECK-NEXT: blr 47; 48; CHECK-BE-LABEL: testHalf: 49; CHECK-BE: # %bb.0: # %entry 50; CHECK-BE-NEXT: slwi r3, r6, 1 51; CHECK-BE-NEXT: vinshlx v2, r3, r5 52; CHECK-BE-NEXT: blr 53; 54; CHECK-P9-LABEL: testHalf: 55; CHECK-P9: # %bb.0: # %entry 56; CHECK-P9-NEXT: addi r4, r1, -16 57; CHECK-P9-NEXT: rlwinm r3, r6, 1, 28, 30 58; CHECK-P9-NEXT: stxv v2, -16(r1) 59; CHECK-P9-NEXT: sthx r5, r4, r3 60; CHECK-P9-NEXT: lxv v2, -16(r1) 61; CHECK-P9-NEXT: blr 62entry: 63 %conv = trunc i64 %b to i16 64 %vecins = insertelement <8 x i16> %a, i16 %conv, i64 %idx 65 ret <8 x i16> %vecins 66} 67 68; Word indexed 69 70define <4 x i32> @testWord(<4 x i32> %a, i64 %b, i64 %idx) { 71; CHECK-LABEL: testWord: 72; CHECK: # %bb.0: # %entry 73; CHECK-NEXT: slwi r3, r6, 2 74; CHECK-NEXT: vinswrx v2, r3, r5 75; CHECK-NEXT: blr 76; 77; CHECK-BE-LABEL: testWord: 78; CHECK-BE: # %bb.0: # %entry 79; CHECK-BE-NEXT: slwi r3, r6, 2 80; CHECK-BE-NEXT: vinswlx v2, r3, r5 81; CHECK-BE-NEXT: blr 82; 83; CHECK-P9-LABEL: testWord: 84; CHECK-P9: # %bb.0: # %entry 85; CHECK-P9-NEXT: addi r4, r1, -16 86; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29 87; CHECK-P9-NEXT: stxv v2, -16(r1) 88; CHECK-P9-NEXT: stwx r5, r4, r3 89; CHECK-P9-NEXT: lxv v2, -16(r1) 90; CHECK-P9-NEXT: blr 91entry: 92 %conv = trunc i64 %b to i32 93 %vecins = insertelement <4 x i32> %a, i32 %conv, i64 %idx 94 ret <4 x i32> %vecins 95} 96 97; Word immediate 98 99define <4 x i32> @testWordImm(<4 x i32> %a, i64 %b) { 100; CHECK-LABEL: testWordImm: 101; CHECK: # %bb.0: # %entry 102; CHECK-NEXT: vinsw v2, r5, 8 103; CHECK-NEXT: vinsw v2, r5, 0 104; CHECK-NEXT: blr 105; 106; CHECK-BE-LABEL: testWordImm: 107; CHECK-BE: # %bb.0: # %entry 108; CHECK-BE-NEXT: vinsw v2, r5, 4 109; CHECK-BE-NEXT: vinsw v2, r5, 12 110; CHECK-BE-NEXT: blr 111; 112; CHECK-P9-LABEL: testWordImm: 113; CHECK-P9: # %bb.0: # %entry 114; CHECK-P9-NEXT: mtfprwz f0, r5 115; CHECK-P9-NEXT: xxinsertw v2, vs0, 4 116; CHECK-P9-NEXT: xxinsertw v2, vs0, 12 117; CHECK-P9-NEXT: blr 118entry: 119 %conv = trunc i64 %b to i32 120 %vecins = insertelement <4 x i32> %a, i32 %conv, i32 1 121 %vecins2 = insertelement <4 x i32> %vecins, i32 %conv, i32 3 122 ret <4 x i32> %vecins2 123} 124 125; Doubleword indexed 126 127define <2 x i64> @testDoubleword(<2 x i64> %a, i64 %b, i64 %idx) { 128; CHECK-LABEL: testDoubleword: 129; CHECK: # %bb.0: # %entry 130; CHECK-NEXT: rlwinm r3, r6, 3, 0, 28 131; CHECK-NEXT: vinsdrx v2, r3, r5 132; CHECK-NEXT: blr 133; 134; CHECK-BE-LABEL: testDoubleword: 135; CHECK-BE: # %bb.0: # %entry 136; CHECK-BE-NEXT: rlwinm r3, r6, 3, 0, 28 137; CHECK-BE-NEXT: vinsdlx v2, r3, r5 138; CHECK-BE-NEXT: blr 139; 140; CHECK-P9-LABEL: testDoubleword: 141; CHECK-P9: # %bb.0: # %entry 142; CHECK-P9-NEXT: addi r4, r1, -16 143; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28 144; CHECK-P9-NEXT: stxv v2, -16(r1) 145; CHECK-P9-NEXT: stdx r5, r4, r3 146; CHECK-P9-NEXT: lxv v2, -16(r1) 147; CHECK-P9-NEXT: blr 148entry: 149 %vecins = insertelement <2 x i64> %a, i64 %b, i64 %idx 150 ret <2 x i64> %vecins 151} 152 153; Doubleword immediate 154 155define <2 x i64> @testDoublewordImm(<2 x i64> %a, i64 %b) { 156; CHECK-LABEL: testDoublewordImm: 157; CHECK: # %bb.0: # %entry 158; CHECK-NEXT: vinsd v2, r5, 0 159; CHECK-NEXT: blr 160; 161; CHECK-BE-LABEL: testDoublewordImm: 162; CHECK-BE: # %bb.0: # %entry 163; CHECK-BE-NEXT: vinsd v2, r5, 8 164; CHECK-BE-NEXT: blr 165; 166; CHECK-P9-LABEL: testDoublewordImm: 167; CHECK-P9: # %bb.0: # %entry 168; CHECK-P9-NEXT: mtfprd f0, r5 169; CHECK-P9-NEXT: xxmrghd v2, v2, vs0 170; CHECK-P9-NEXT: blr 171entry: 172 %vecins = insertelement <2 x i64> %a, i64 %b, i32 1 173 ret <2 x i64> %vecins 174} 175 176define <2 x i64> @testDoublewordImm2(<2 x i64> %a, i64 %b) { 177; CHECK-LABEL: testDoublewordImm2: 178; CHECK: # %bb.0: # %entry 179; CHECK-NEXT: vinsd v2, r5, 8 180; CHECK-NEXT: blr 181; 182; CHECK-BE-LABEL: testDoublewordImm2: 183; CHECK-BE: # %bb.0: # %entry 184; CHECK-BE-NEXT: vinsd v2, r5, 0 185; CHECK-BE-NEXT: blr 186; 187; CHECK-P9-LABEL: testDoublewordImm2: 188; CHECK-P9: # %bb.0: # %entry 189; CHECK-P9-NEXT: mtfprd f0, r5 190; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 191; CHECK-P9-NEXT: blr 192entry: 193 %vecins = insertelement <2 x i64> %a, i64 %b, i32 0 194 ret <2 x i64> %vecins 195} 196 197; Float indexed 198 199define <4 x float> @testFloat1(<4 x float> %a, float %b, i32 zeroext %idx1) { 200; CHECK-LABEL: testFloat1: 201; CHECK: # %bb.0: # %entry 202; CHECK-NEXT: xscvdpspn vs0, f1 203; CHECK-NEXT: extsw r3, r6 204; CHECK-NEXT: slwi r3, r3, 2 205; CHECK-NEXT: xxsldwi vs0, vs0, vs0, 3 206; CHECK-NEXT: mffprwz r4, f0 207; CHECK-NEXT: vinswrx v2, r3, r4 208; CHECK-NEXT: blr 209; 210; CHECK-BE-LABEL: testFloat1: 211; CHECK-BE: # %bb.0: # %entry 212; CHECK-BE-NEXT: xscvdpspn vs0, f1 213; CHECK-BE-NEXT: extsw r3, r6 214; CHECK-BE-NEXT: slwi r3, r3, 2 215; CHECK-BE-NEXT: xxsldwi vs0, vs0, vs0, 3 216; CHECK-BE-NEXT: mffprwz r4, f0 217; CHECK-BE-NEXT: vinswlx v2, r3, r4 218; CHECK-BE-NEXT: blr 219; 220; CHECK-P9-LABEL: testFloat1: 221; CHECK-P9: # %bb.0: # %entry 222; CHECK-P9-NEXT: addi r4, r1, -16 223; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29 224; CHECK-P9-NEXT: stxv v2, -16(r1) 225; CHECK-P9-NEXT: stfsx f1, r4, r3 226; CHECK-P9-NEXT: lxv v2, -16(r1) 227; CHECK-P9-NEXT: blr 228entry: 229 %vecins = insertelement <4 x float> %a, float %b, i32 %idx1 230 ret <4 x float> %vecins 231} 232 233define <4 x float> @testFloat2(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 234; CHECK-LABEL: testFloat2: 235; CHECK: # %bb.0: # %entry 236; CHECK-NEXT: lwz r3, 0(r5) 237; CHECK-NEXT: extsw r4, r6 238; CHECK-NEXT: slwi r4, r4, 2 239; CHECK-NEXT: vinswrx v2, r4, r3 240; CHECK-NEXT: lwz r3, 1(r5) 241; CHECK-NEXT: extsw r4, r7 242; CHECK-NEXT: slwi r4, r4, 2 243; CHECK-NEXT: vinswrx v2, r4, r3 244; CHECK-NEXT: blr 245; 246; CHECK-BE-LABEL: testFloat2: 247; CHECK-BE: # %bb.0: # %entry 248; CHECK-BE-NEXT: lwz r3, 0(r5) 249; CHECK-BE-NEXT: extsw r4, r6 250; CHECK-BE-NEXT: slwi r4, r4, 2 251; CHECK-BE-NEXT: vinswlx v2, r4, r3 252; CHECK-BE-NEXT: lwz r3, 1(r5) 253; CHECK-BE-NEXT: extsw r4, r7 254; CHECK-BE-NEXT: slwi r4, r4, 2 255; CHECK-BE-NEXT: vinswlx v2, r4, r3 256; CHECK-BE-NEXT: blr 257; 258; CHECK-P9-LABEL: testFloat2: 259; CHECK-P9: # %bb.0: # %entry 260; CHECK-P9-NEXT: lwz r3, 0(r5) 261; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29 262; CHECK-P9-NEXT: addi r6, r1, -32 263; CHECK-P9-NEXT: stxv v2, -32(r1) 264; CHECK-P9-NEXT: stwx r3, r6, r4 265; CHECK-P9-NEXT: rlwinm r4, r7, 2, 28, 29 266; CHECK-P9-NEXT: lxv vs0, -32(r1) 267; CHECK-P9-NEXT: lwz r3, 1(r5) 268; CHECK-P9-NEXT: addi r5, r1, -16 269; CHECK-P9-NEXT: stxv vs0, -16(r1) 270; CHECK-P9-NEXT: stwx r3, r5, r4 271; CHECK-P9-NEXT: lxv v2, -16(r1) 272; CHECK-P9-NEXT: blr 273entry: 274 %0 = bitcast i8* %b to float* 275 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1 276 %1 = bitcast i8* %add.ptr1 to float* 277 %2 = load float, float* %0, align 4 278 %vecins = insertelement <4 x float> %a, float %2, i32 %idx1 279 %3 = load float, float* %1, align 4 280 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2 281 ret <4 x float> %vecins2 282} 283 284define <4 x float> @testFloat3(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 285; CHECK-LABEL: testFloat3: 286; CHECK: # %bb.0: # %entry 287; CHECK-NEXT: plwz r3, 65536(r5), 0 288; CHECK-NEXT: extsw r4, r6 289; CHECK-NEXT: slwi r4, r4, 2 290; CHECK-NEXT: vinswrx v2, r4, r3 291; CHECK-NEXT: li r3, 1 292; CHECK-NEXT: extsw r4, r7 293; CHECK-NEXT: rldic r3, r3, 36, 27 294; CHECK-NEXT: slwi r4, r4, 2 295; CHECK-NEXT: lwzx r3, r5, r3 296; CHECK-NEXT: vinswrx v2, r4, r3 297; CHECK-NEXT: blr 298; 299; CHECK-BE-LABEL: testFloat3: 300; CHECK-BE: # %bb.0: # %entry 301; CHECK-BE-NEXT: plwz r3, 65536(r5), 0 302; CHECK-BE-NEXT: extsw r4, r6 303; CHECK-BE-NEXT: slwi r4, r4, 2 304; CHECK-BE-NEXT: vinswlx v2, r4, r3 305; CHECK-BE-NEXT: li r3, 1 306; CHECK-BE-NEXT: extsw r4, r7 307; CHECK-BE-NEXT: rldic r3, r3, 36, 27 308; CHECK-BE-NEXT: slwi r4, r4, 2 309; CHECK-BE-NEXT: lwzx r3, r5, r3 310; CHECK-BE-NEXT: vinswlx v2, r4, r3 311; CHECK-BE-NEXT: blr 312; 313; CHECK-P9-LABEL: testFloat3: 314; CHECK-P9: # %bb.0: # %entry 315; CHECK-P9-NEXT: lis r3, 1 316; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29 317; CHECK-P9-NEXT: addi r6, r1, -32 318; CHECK-P9-NEXT: lwzx r3, r5, r3 319; CHECK-P9-NEXT: stxv v2, -32(r1) 320; CHECK-P9-NEXT: stwx r3, r6, r4 321; CHECK-P9-NEXT: li r3, 1 322; CHECK-P9-NEXT: rlwinm r4, r7, 2, 28, 29 323; CHECK-P9-NEXT: lxv vs0, -32(r1) 324; CHECK-P9-NEXT: rldic r3, r3, 36, 27 325; CHECK-P9-NEXT: lwzx r3, r5, r3 326; CHECK-P9-NEXT: addi r5, r1, -16 327; CHECK-P9-NEXT: stxv vs0, -16(r1) 328; CHECK-P9-NEXT: stwx r3, r5, r4 329; CHECK-P9-NEXT: lxv v2, -16(r1) 330; CHECK-P9-NEXT: blr 331entry: 332 %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536 333 %0 = bitcast i8* %add.ptr to float* 334 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736 335 %1 = bitcast i8* %add.ptr1 to float* 336 %2 = load float, float* %0, align 4 337 %vecins = insertelement <4 x float> %a, float %2, i32 %idx1 338 %3 = load float, float* %1, align 4 339 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2 340 ret <4 x float> %vecins2 341} 342 343; Float immediate 344 345define <4 x float> @testFloatImm1(<4 x float> %a, float %b) { 346; CHECK-LABEL: testFloatImm1: 347; CHECK: # %bb.0: # %entry 348; CHECK-NEXT: xscvdpspn vs0, f1 349; CHECK-NEXT: xxsldwi vs0, vs0, vs0, 3 350; CHECK-NEXT: xxinsertw v2, vs0, 12 351; CHECK-NEXT: xxinsertw v2, vs0, 4 352; CHECK-NEXT: blr 353; 354; CHECK-BE-LABEL: testFloatImm1: 355; CHECK-BE: # %bb.0: # %entry 356; CHECK-BE-NEXT: xscvdpspn vs0, f1 357; CHECK-BE-NEXT: xxsldwi vs0, vs0, vs0, 3 358; CHECK-BE-NEXT: xxinsertw v2, vs0, 0 359; CHECK-BE-NEXT: xxinsertw v2, vs0, 8 360; CHECK-BE-NEXT: blr 361; 362; CHECK-P9-LABEL: testFloatImm1: 363; CHECK-P9: # %bb.0: # %entry 364; CHECK-P9-NEXT: xscvdpspn vs0, f1 365; CHECK-P9-NEXT: xxsldwi vs0, vs0, vs0, 3 366; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 367; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 368; CHECK-P9-NEXT: blr 369entry: 370 %vecins = insertelement <4 x float> %a, float %b, i32 0 371 %vecins1 = insertelement <4 x float> %vecins, float %b, i32 2 372 ret <4 x float> %vecins1 373} 374 375define <4 x float> @testFloatImm2(<4 x float> %a, i32* %b) { 376; CHECK-LABEL: testFloatImm2: 377; CHECK: # %bb.0: # %entry 378; CHECK-NEXT: lwz r3, 0(r5) 379; CHECK-NEXT: vinsw v2, r3, 12 380; CHECK-NEXT: lwz r3, 4(r5) 381; CHECK-NEXT: vinsw v2, r3, 4 382; CHECK-NEXT: blr 383; 384; CHECK-BE-LABEL: testFloatImm2: 385; CHECK-BE: # %bb.0: # %entry 386; CHECK-BE-NEXT: lwz r3, 0(r5) 387; CHECK-BE-NEXT: vinsw v2, r3, 0 388; CHECK-BE-NEXT: lwz r3, 4(r5) 389; CHECK-BE-NEXT: vinsw v2, r3, 8 390; CHECK-BE-NEXT: blr 391; 392; CHECK-P9-LABEL: testFloatImm2: 393; CHECK-P9: # %bb.0: # %entry 394; CHECK-P9-NEXT: lfs f0, 0(r5) 395; CHECK-P9-NEXT: xscvdpspn vs0, f0 396; CHECK-P9-NEXT: xxsldwi vs0, vs0, vs0, 3 397; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 398; CHECK-P9-NEXT: lfs f0, 4(r5) 399; CHECK-P9-NEXT: xscvdpspn vs0, f0 400; CHECK-P9-NEXT: xxsldwi vs0, vs0, vs0, 3 401; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 402; CHECK-P9-NEXT: blr 403entry: 404 %0 = bitcast i32* %b to float* 405 %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 1 406 %1 = bitcast i32* %add.ptr1 to float* 407 %2 = load float, float* %0, align 4 408 %vecins = insertelement <4 x float> %a, float %2, i32 0 409 %3 = load float, float* %1, align 4 410 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2 411 ret <4 x float> %vecins2 412} 413 414define <4 x float> @testFloatImm3(<4 x float> %a, i32* %b) { 415; CHECK-LABEL: testFloatImm3: 416; CHECK: # %bb.0: # %entry 417; CHECK-NEXT: plwz r3, 262144(r5), 0 418; CHECK-NEXT: vinsw v2, r3, 12 419; CHECK-NEXT: li r3, 1 420; CHECK-NEXT: rldic r3, r3, 38, 25 421; CHECK-NEXT: lwzx r3, r5, r3 422; CHECK-NEXT: vinsw v2, r3, 4 423; CHECK-NEXT: blr 424; 425; CHECK-BE-LABEL: testFloatImm3: 426; CHECK-BE: # %bb.0: # %entry 427; CHECK-BE-NEXT: plwz r3, 262144(r5), 0 428; CHECK-BE-NEXT: vinsw v2, r3, 0 429; CHECK-BE-NEXT: li r3, 1 430; CHECK-BE-NEXT: rldic r3, r3, 38, 25 431; CHECK-BE-NEXT: lwzx r3, r5, r3 432; CHECK-BE-NEXT: vinsw v2, r3, 8 433; CHECK-BE-NEXT: blr 434; 435; CHECK-P9-LABEL: testFloatImm3: 436; CHECK-P9: # %bb.0: # %entry 437; CHECK-P9-NEXT: lis r3, 4 438; CHECK-P9-NEXT: lfsx f0, r5, r3 439; CHECK-P9-NEXT: li r3, 1 440; CHECK-P9-NEXT: rldic r3, r3, 38, 25 441; CHECK-P9-NEXT: xscvdpspn vs0, f0 442; CHECK-P9-NEXT: xxsldwi vs0, vs0, vs0, 3 443; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 444; CHECK-P9-NEXT: lfsx f0, r5, r3 445; CHECK-P9-NEXT: xscvdpspn vs0, f0 446; CHECK-P9-NEXT: xxsldwi vs0, vs0, vs0, 3 447; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 448; CHECK-P9-NEXT: blr 449entry: 450 %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536 451 %0 = bitcast i32* %add.ptr to float* 452 %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 68719476736 453 %1 = bitcast i32* %add.ptr1 to float* 454 %2 = load float, float* %0, align 4 455 %vecins = insertelement <4 x float> %a, float %2, i32 0 456 %3 = load float, float* %1, align 4 457 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2 458 ret <4 x float> %vecins2 459} 460 461; Double indexed 462 463define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) { 464; CHECK-LABEL: testDouble1: 465; CHECK: # %bb.0: # %entry 466; CHECK-NEXT: extsw r4, r6 467; CHECK-NEXT: mffprd r3, f1 468; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 469; CHECK-NEXT: vinsdrx v2, r4, r3 470; CHECK-NEXT: blr 471; 472; CHECK-BE-LABEL: testDouble1: 473; CHECK-BE: # %bb.0: # %entry 474; CHECK-BE-NEXT: extsw r4, r6 475; CHECK-BE-NEXT: mffprd r3, f1 476; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 477; CHECK-BE-NEXT: vinsdlx v2, r4, r3 478; CHECK-BE-NEXT: blr 479; 480; CHECK-P9-LABEL: testDouble1: 481; CHECK-P9: # %bb.0: # %entry 482; CHECK-P9-NEXT: addi r4, r1, -16 483; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28 484; CHECK-P9-NEXT: stxv v2, -16(r1) 485; CHECK-P9-NEXT: stfdx f1, r4, r3 486; CHECK-P9-NEXT: lxv v2, -16(r1) 487; CHECK-P9-NEXT: blr 488entry: 489 %vecins = insertelement <2 x double> %a, double %b, i32 %idx1 490 ret <2 x double> %vecins 491} 492 493define <2 x double> @testDouble2(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 494; CHECK-LABEL: testDouble2: 495; CHECK: # %bb.0: # %entry 496; CHECK-NEXT: ld r3, 0(r5) 497; CHECK-NEXT: extsw r4, r6 498; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 499; CHECK-NEXT: vinsdrx v2, r4, r3 500; CHECK-NEXT: pld r3, 1(r5), 0 501; CHECK-NEXT: extsw r4, r7 502; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 503; CHECK-NEXT: vinsdrx v2, r4, r3 504; CHECK-NEXT: blr 505; 506; CHECK-BE-LABEL: testDouble2: 507; CHECK-BE: # %bb.0: # %entry 508; CHECK-BE-NEXT: ld r3, 0(r5) 509; CHECK-BE-NEXT: extsw r4, r6 510; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 511; CHECK-BE-NEXT: vinsdlx v2, r4, r3 512; CHECK-BE-NEXT: pld r3, 1(r5), 0 513; CHECK-BE-NEXT: extsw r4, r7 514; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 515; CHECK-BE-NEXT: vinsdlx v2, r4, r3 516; CHECK-BE-NEXT: blr 517; 518; CHECK-P9-LABEL: testDouble2: 519; CHECK-P9: # %bb.0: # %entry 520; CHECK-P9-NEXT: ld r3, 0(r5) 521; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28 522; CHECK-P9-NEXT: addi r6, r1, -32 523; CHECK-P9-NEXT: stxv v2, -32(r1) 524; CHECK-P9-NEXT: stdx r3, r6, r4 525; CHECK-P9-NEXT: li r3, 1 526; CHECK-P9-NEXT: rlwinm r4, r7, 3, 28, 28 527; CHECK-P9-NEXT: lxv vs0, -32(r1) 528; CHECK-P9-NEXT: ldx r3, r5, r3 529; CHECK-P9-NEXT: addi r5, r1, -16 530; CHECK-P9-NEXT: stxv vs0, -16(r1) 531; CHECK-P9-NEXT: stdx r3, r5, r4 532; CHECK-P9-NEXT: lxv v2, -16(r1) 533; CHECK-P9-NEXT: blr 534entry: 535 %0 = bitcast i8* %b to double* 536 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1 537 %1 = bitcast i8* %add.ptr1 to double* 538 %2 = load double, double* %0, align 8 539 %vecins = insertelement <2 x double> %a, double %2, i32 %idx1 540 %3 = load double, double* %1, align 8 541 %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2 542 ret <2 x double> %vecins2 543} 544 545define <2 x double> @testDouble3(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 546; CHECK-LABEL: testDouble3: 547; CHECK: # %bb.0: # %entry 548; CHECK-NEXT: pld r3, 65536(r5), 0 549; CHECK-NEXT: extsw r4, r6 550; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 551; CHECK-NEXT: vinsdrx v2, r4, r3 552; CHECK-NEXT: li r3, 1 553; CHECK-NEXT: extsw r4, r7 554; CHECK-NEXT: rldic r3, r3, 36, 27 555; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 556; CHECK-NEXT: ldx r3, r5, r3 557; CHECK-NEXT: vinsdrx v2, r4, r3 558; CHECK-NEXT: blr 559; 560; CHECK-BE-LABEL: testDouble3: 561; CHECK-BE: # %bb.0: # %entry 562; CHECK-BE-NEXT: pld r3, 65536(r5), 0 563; CHECK-BE-NEXT: extsw r4, r6 564; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 565; CHECK-BE-NEXT: vinsdlx v2, r4, r3 566; CHECK-BE-NEXT: li r3, 1 567; CHECK-BE-NEXT: extsw r4, r7 568; CHECK-BE-NEXT: rldic r3, r3, 36, 27 569; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 570; CHECK-BE-NEXT: ldx r3, r5, r3 571; CHECK-BE-NEXT: vinsdlx v2, r4, r3 572; CHECK-BE-NEXT: blr 573; 574; CHECK-P9-LABEL: testDouble3: 575; CHECK-P9: # %bb.0: # %entry 576; CHECK-P9-NEXT: lis r3, 1 577; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28 578; CHECK-P9-NEXT: addi r6, r1, -32 579; CHECK-P9-NEXT: ldx r3, r5, r3 580; CHECK-P9-NEXT: stxv v2, -32(r1) 581; CHECK-P9-NEXT: stdx r3, r6, r4 582; CHECK-P9-NEXT: li r3, 1 583; CHECK-P9-NEXT: rlwinm r4, r7, 3, 28, 28 584; CHECK-P9-NEXT: lxv vs0, -32(r1) 585; CHECK-P9-NEXT: rldic r3, r3, 36, 27 586; CHECK-P9-NEXT: ldx r3, r5, r3 587; CHECK-P9-NEXT: addi r5, r1, -16 588; CHECK-P9-NEXT: stxv vs0, -16(r1) 589; CHECK-P9-NEXT: stdx r3, r5, r4 590; CHECK-P9-NEXT: lxv v2, -16(r1) 591; CHECK-P9-NEXT: blr 592entry: 593 %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536 594 %0 = bitcast i8* %add.ptr to double* 595 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736 596 %1 = bitcast i8* %add.ptr1 to double* 597 %2 = load double, double* %0, align 8 598 %vecins = insertelement <2 x double> %a, double %2, i32 %idx1 599 %3 = load double, double* %1, align 8 600 %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2 601 ret <2 x double> %vecins2 602} 603 604; Double immediate 605 606define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) { 607; CHECK-LABEL: testDoubleImm1: 608; CHECK: # %bb.0: # %entry 609; CHECK-NEXT: # kill: def $f1 killed $f1 def $vsl1 610; CHECK-NEXT: xxmrghd v2, v2, vs1 611; CHECK-NEXT: blr 612; 613; CHECK-BE-LABEL: testDoubleImm1: 614; CHECK-BE: # %bb.0: # %entry 615; CHECK-BE-NEXT: # kill: def $f1 killed $f1 def $vsl1 616; CHECK-BE-NEXT: xxpermdi v2, vs1, v2, 1 617; CHECK-BE-NEXT: blr 618; 619; CHECK-P9-LABEL: testDoubleImm1: 620; CHECK-P9: # %bb.0: # %entry 621; CHECK-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 622; CHECK-P9-NEXT: xxpermdi v2, vs1, v2, 1 623; CHECK-P9-NEXT: blr 624entry: 625 %vecins = insertelement <2 x double> %a, double %b, i32 0 626 ret <2 x double> %vecins 627} 628 629define <2 x double> @testDoubleImm2(<2 x double> %a, i32* %b) { 630; CHECK-LABEL: testDoubleImm2: 631; CHECK: # %bb.0: # %entry 632; CHECK-NEXT: lfd f0, 0(r5) 633; CHECK-NEXT: xxmrghd v2, v2, vs0 634; CHECK-NEXT: blr 635; 636; CHECK-BE-LABEL: testDoubleImm2: 637; CHECK-BE: # %bb.0: # %entry 638; CHECK-BE-NEXT: lfd f0, 0(r5) 639; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 640; CHECK-BE-NEXT: blr 641; 642; CHECK-P9-LABEL: testDoubleImm2: 643; CHECK-P9: # %bb.0: # %entry 644; CHECK-P9-NEXT: lfd f0, 0(r5) 645; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 646; CHECK-P9-NEXT: blr 647entry: 648 %0 = bitcast i32* %b to double* 649 %1 = load double, double* %0, align 8 650 %vecins = insertelement <2 x double> %a, double %1, i32 0 651 ret <2 x double> %vecins 652} 653 654define <2 x double> @testDoubleImm3(<2 x double> %a, i32* %b) { 655; CHECK-LABEL: testDoubleImm3: 656; CHECK: # %bb.0: # %entry 657; CHECK-NEXT: lfd f0, 4(r5) 658; CHECK-NEXT: xxmrghd v2, v2, vs0 659; CHECK-NEXT: blr 660; 661; CHECK-BE-LABEL: testDoubleImm3: 662; CHECK-BE: # %bb.0: # %entry 663; CHECK-BE-NEXT: lfd f0, 4(r5) 664; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 665; CHECK-BE-NEXT: blr 666; 667; CHECK-P9-LABEL: testDoubleImm3: 668; CHECK-P9: # %bb.0: # %entry 669; CHECK-P9-NEXT: lfd f0, 4(r5) 670; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 671; CHECK-P9-NEXT: blr 672entry: 673 %add.ptr = getelementptr inbounds i32, i32* %b, i64 1 674 %0 = bitcast i32* %add.ptr to double* 675 %1 = load double, double* %0, align 8 676 %vecins = insertelement <2 x double> %a, double %1, i32 0 677 ret <2 x double> %vecins 678} 679 680define <2 x double> @testDoubleImm4(<2 x double> %a, i32* %b) { 681; CHECK-LABEL: testDoubleImm4: 682; CHECK: # %bb.0: # %entry 683; CHECK-NEXT: lis r3, 4 684; CHECK-NEXT: lfdx f0, r5, r3 685; CHECK-NEXT: xxmrghd v2, v2, vs0 686; CHECK-NEXT: blr 687; 688; CHECK-BE-LABEL: testDoubleImm4: 689; CHECK-BE: # %bb.0: # %entry 690; CHECK-BE-NEXT: lis r3, 4 691; CHECK-BE-NEXT: lfdx f0, r5, r3 692; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 693; CHECK-BE-NEXT: blr 694; 695; CHECK-P9-LABEL: testDoubleImm4: 696; CHECK-P9: # %bb.0: # %entry 697; CHECK-P9-NEXT: lis r3, 4 698; CHECK-P9-NEXT: lfdx f0, r5, r3 699; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 700; CHECK-P9-NEXT: blr 701entry: 702 %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536 703 %0 = bitcast i32* %add.ptr to double* 704 %1 = load double, double* %0, align 8 705 %vecins = insertelement <2 x double> %a, double %1, i32 0 706 ret <2 x double> %vecins 707} 708 709define <2 x double> @testDoubleImm5(<2 x double> %a, i32* %b) { 710; CHECK-LABEL: testDoubleImm5: 711; CHECK: # %bb.0: # %entry 712; CHECK-NEXT: li r3, 1 713; CHECK-NEXT: rldic r3, r3, 38, 25 714; CHECK-NEXT: lfdx f0, r5, r3 715; CHECK-NEXT: xxmrghd v2, v2, vs0 716; CHECK-NEXT: blr 717; 718; CHECK-BE-LABEL: testDoubleImm5: 719; CHECK-BE: # %bb.0: # %entry 720; CHECK-BE-NEXT: li r3, 1 721; CHECK-BE-NEXT: rldic r3, r3, 38, 25 722; CHECK-BE-NEXT: lfdx f0, r5, r3 723; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 724; CHECK-BE-NEXT: blr 725; 726; CHECK-P9-LABEL: testDoubleImm5: 727; CHECK-P9: # %bb.0: # %entry 728; CHECK-P9-NEXT: li r3, 1 729; CHECK-P9-NEXT: rldic r3, r3, 38, 25 730; CHECK-P9-NEXT: lfdx f0, r5, r3 731; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 732; CHECK-P9-NEXT: blr 733entry: 734 %add.ptr = getelementptr inbounds i32, i32* %b, i64 68719476736 735 %0 = bitcast i32* %add.ptr to double* 736 %1 = load double, double* %0, align 8 737 %vecins = insertelement <2 x double> %a, double %1, i32 0 738 ret <2 x double> %vecins 739} 740 741