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; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr \ 12; RUN: -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix-xcoff < %s | \ 13; RUN: FileCheck %s --check-prefixes=AIX-P8,AIX-P8-64 14; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr \ 15; RUN: -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix-xcoff < %s | \ 16; RUN: FileCheck %s --check-prefixes=AIX-P8,AIX-P8-32 17 18; Byte indexed 19 20define <16 x i8> @testByte(<16 x i8> %a, i64 %b, i64 %idx) { 21; CHECK-LABEL: testByte: 22; CHECK: # %bb.0: # %entry 23; CHECK-NEXT: vinsbrx v2, r6, r5 24; CHECK-NEXT: blr 25; 26; CHECK-BE-LABEL: testByte: 27; CHECK-BE: # %bb.0: # %entry 28; CHECK-BE-NEXT: vinsblx v2, r6, r5 29; CHECK-BE-NEXT: blr 30; 31; CHECK-P9-LABEL: testByte: 32; CHECK-P9: # %bb.0: # %entry 33; CHECK-P9-NEXT: addi r4, r1, -16 34; CHECK-P9-NEXT: clrldi r3, r6, 60 35; CHECK-P9-NEXT: stxv v2, -16(r1) 36; CHECK-P9-NEXT: stbx r5, r4, r3 37; CHECK-P9-NEXT: lxv v2, -16(r1) 38; CHECK-P9-NEXT: blr 39; 40; AIX-P8-64-LABEL: testByte: 41; AIX-P8-64: # %bb.0: # %entry 42; AIX-P8-64-NEXT: addi r5, r1, -16 43; AIX-P8-64-NEXT: clrldi r4, r4, 60 44; AIX-P8-64-NEXT: stxvw4x v2, 0, r5 45; AIX-P8-64-NEXT: stbx r3, r5, r4 46; AIX-P8-64-NEXT: lxvw4x v2, 0, r5 47; AIX-P8-64-NEXT: blr 48; 49; AIX-P8-32-LABEL: testByte: 50; AIX-P8-32: # %bb.0: # %entry 51; AIX-P8-32-NEXT: addi r3, r1, -16 52; AIX-P8-32-NEXT: clrlwi r5, r6, 28 53; AIX-P8-32-NEXT: stxvw4x v2, 0, r3 54; AIX-P8-32-NEXT: stbx r4, r3, r5 55; AIX-P8-32-NEXT: lxvw4x v2, 0, r3 56; AIX-P8-32-NEXT: blr 57entry: 58 %conv = trunc i64 %b to i8 59 %vecins = insertelement <16 x i8> %a, i8 %conv, i64 %idx 60 ret <16 x i8> %vecins 61} 62 63; Halfword indexed 64 65define <8 x i16> @testHalf(<8 x i16> %a, i64 %b, i64 %idx) { 66; CHECK-LABEL: testHalf: 67; CHECK: # %bb.0: # %entry 68; CHECK-NEXT: slwi r3, r6, 1 69; CHECK-NEXT: vinshrx v2, r3, r5 70; CHECK-NEXT: blr 71; 72; CHECK-BE-LABEL: testHalf: 73; CHECK-BE: # %bb.0: # %entry 74; CHECK-BE-NEXT: slwi r3, r6, 1 75; CHECK-BE-NEXT: vinshlx v2, r3, r5 76; CHECK-BE-NEXT: blr 77; 78; CHECK-P9-LABEL: testHalf: 79; CHECK-P9: # %bb.0: # %entry 80; CHECK-P9-NEXT: addi r4, r1, -16 81; CHECK-P9-NEXT: rlwinm r3, r6, 1, 28, 30 82; CHECK-P9-NEXT: stxv v2, -16(r1) 83; CHECK-P9-NEXT: sthx r5, r4, r3 84; CHECK-P9-NEXT: lxv v2, -16(r1) 85; CHECK-P9-NEXT: blr 86; 87; AIX-P8-64-LABEL: testHalf: 88; AIX-P8-64: # %bb.0: # %entry 89; AIX-P8-64-NEXT: addi r5, r1, -16 90; AIX-P8-64-NEXT: rlwinm r4, r4, 1, 28, 30 91; AIX-P8-64-NEXT: stxvw4x v2, 0, r5 92; AIX-P8-64-NEXT: sthx r3, r5, r4 93; AIX-P8-64-NEXT: lxvw4x v2, 0, r5 94; AIX-P8-64-NEXT: blr 95; 96; AIX-P8-32-LABEL: testHalf: 97; AIX-P8-32: # %bb.0: # %entry 98; AIX-P8-32-NEXT: addi r3, r1, -16 99; AIX-P8-32-NEXT: rlwinm r5, r6, 1, 28, 30 100; AIX-P8-32-NEXT: stxvw4x v2, 0, r3 101; AIX-P8-32-NEXT: sthx r4, r3, r5 102; AIX-P8-32-NEXT: lxvw4x v2, 0, r3 103; AIX-P8-32-NEXT: blr 104entry: 105 %conv = trunc i64 %b to i16 106 %vecins = insertelement <8 x i16> %a, i16 %conv, i64 %idx 107 ret <8 x i16> %vecins 108} 109 110; Word indexed 111 112define <4 x i32> @testWord(<4 x i32> %a, i64 %b, i64 %idx) { 113; CHECK-LABEL: testWord: 114; CHECK: # %bb.0: # %entry 115; CHECK-NEXT: slwi r3, r6, 2 116; CHECK-NEXT: vinswrx v2, r3, r5 117; CHECK-NEXT: blr 118; 119; CHECK-BE-LABEL: testWord: 120; CHECK-BE: # %bb.0: # %entry 121; CHECK-BE-NEXT: slwi r3, r6, 2 122; CHECK-BE-NEXT: vinswlx v2, r3, r5 123; CHECK-BE-NEXT: blr 124; 125; CHECK-P9-LABEL: testWord: 126; CHECK-P9: # %bb.0: # %entry 127; CHECK-P9-NEXT: addi r4, r1, -16 128; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29 129; CHECK-P9-NEXT: stxv v2, -16(r1) 130; CHECK-P9-NEXT: stwx r5, r4, r3 131; CHECK-P9-NEXT: lxv v2, -16(r1) 132; CHECK-P9-NEXT: blr 133; 134; AIX-P8-64-LABEL: testWord: 135; AIX-P8-64: # %bb.0: # %entry 136; AIX-P8-64-NEXT: addi r5, r1, -16 137; AIX-P8-64-NEXT: rlwinm r4, r4, 2, 28, 29 138; AIX-P8-64-NEXT: stxvw4x v2, 0, r5 139; AIX-P8-64-NEXT: stwx r3, r5, r4 140; AIX-P8-64-NEXT: lxvw4x v2, 0, r5 141; AIX-P8-64-NEXT: blr 142; 143; AIX-P8-32-LABEL: testWord: 144; AIX-P8-32: # %bb.0: # %entry 145; AIX-P8-32-NEXT: addi r3, r1, -16 146; AIX-P8-32-NEXT: rlwinm r5, r6, 2, 28, 29 147; AIX-P8-32-NEXT: stxvw4x v2, 0, r3 148; AIX-P8-32-NEXT: stwx r4, r3, r5 149; AIX-P8-32-NEXT: lxvw4x v2, 0, r3 150; AIX-P8-32-NEXT: blr 151entry: 152 %conv = trunc i64 %b to i32 153 %vecins = insertelement <4 x i32> %a, i32 %conv, i64 %idx 154 ret <4 x i32> %vecins 155} 156 157; Word immediate 158 159define <4 x i32> @testWordImm(<4 x i32> %a, i64 %b) { 160; CHECK-LABEL: testWordImm: 161; CHECK: # %bb.0: # %entry 162; CHECK-NEXT: vinsw v2, r5, 8 163; CHECK-NEXT: vinsw v2, r5, 0 164; CHECK-NEXT: blr 165; 166; CHECK-BE-LABEL: testWordImm: 167; CHECK-BE: # %bb.0: # %entry 168; CHECK-BE-NEXT: vinsw v2, r5, 4 169; CHECK-BE-NEXT: vinsw v2, r5, 12 170; CHECK-BE-NEXT: blr 171; 172; CHECK-P9-LABEL: testWordImm: 173; CHECK-P9: # %bb.0: # %entry 174; CHECK-P9-NEXT: mtfprwz f0, r5 175; CHECK-P9-NEXT: xxinsertw v2, vs0, 4 176; CHECK-P9-NEXT: xxinsertw v2, vs0, 12 177; CHECK-P9-NEXT: blr 178; 179; AIX-P8-64-LABEL: testWordImm: 180; AIX-P8-64: # %bb.0: # %entry 181; AIX-P8-64-NEXT: ld r4, L..C0(r2) # %const.0 182; AIX-P8-64-NEXT: mtvsrwz v4, r3 183; AIX-P8-64-NEXT: ld r3, L..C1(r2) # %const.1 184; AIX-P8-64-NEXT: lxvw4x v3, 0, r4 185; AIX-P8-64-NEXT: vperm v2, v2, v4, v3 186; AIX-P8-64-NEXT: lxvw4x v3, 0, r3 187; AIX-P8-64-NEXT: vperm v2, v2, v4, v3 188; AIX-P8-64-NEXT: blr 189; 190; AIX-P8-32-LABEL: testWordImm: 191; AIX-P8-32: # %bb.0: # %entry 192; AIX-P8-32-NEXT: lwz r3, L..C0(r2) # %const.0 193; AIX-P8-32-NEXT: stw r4, -16(r1) 194; AIX-P8-32-NEXT: addi r4, r1, -16 195; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 196; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 197; AIX-P8-32-NEXT: lwz r3, L..C1(r2) # %const.1 198; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 199; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 200; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 201; AIX-P8-32-NEXT: blr 202entry: 203 %conv = trunc i64 %b to i32 204 %vecins = insertelement <4 x i32> %a, i32 %conv, i32 1 205 %vecins2 = insertelement <4 x i32> %vecins, i32 %conv, i32 3 206 ret <4 x i32> %vecins2 207} 208 209; Doubleword indexed 210 211define <2 x i64> @testDoubleword(<2 x i64> %a, i64 %b, i64 %idx) { 212; CHECK-LABEL: testDoubleword: 213; CHECK: # %bb.0: # %entry 214; CHECK-NEXT: rlwinm r3, r6, 3, 0, 28 215; CHECK-NEXT: vinsdrx v2, r3, r5 216; CHECK-NEXT: blr 217; 218; CHECK-BE-LABEL: testDoubleword: 219; CHECK-BE: # %bb.0: # %entry 220; CHECK-BE-NEXT: rlwinm r3, r6, 3, 0, 28 221; CHECK-BE-NEXT: vinsdlx v2, r3, r5 222; CHECK-BE-NEXT: blr 223; 224; CHECK-P9-LABEL: testDoubleword: 225; CHECK-P9: # %bb.0: # %entry 226; CHECK-P9-NEXT: addi r4, r1, -16 227; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28 228; CHECK-P9-NEXT: stxv v2, -16(r1) 229; CHECK-P9-NEXT: stdx r5, r4, r3 230; CHECK-P9-NEXT: lxv v2, -16(r1) 231; CHECK-P9-NEXT: blr 232; 233; AIX-P8-64-LABEL: testDoubleword: 234; AIX-P8-64: # %bb.0: # %entry 235; AIX-P8-64-NEXT: addi r5, r1, -16 236; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28 237; AIX-P8-64-NEXT: stxvd2x v2, 0, r5 238; AIX-P8-64-NEXT: stdx r3, r5, r4 239; AIX-P8-64-NEXT: lxvd2x v2, 0, r5 240; AIX-P8-64-NEXT: blr 241; 242; AIX-P8-32-LABEL: testDoubleword: 243; AIX-P8-32: # %bb.0: # %entry 244; AIX-P8-32-NEXT: add r6, r6, r6 245; AIX-P8-32-NEXT: addi r5, r1, -32 246; AIX-P8-32-NEXT: rlwinm r7, r6, 2, 28, 29 247; AIX-P8-32-NEXT: stxvw4x v2, 0, r5 248; AIX-P8-32-NEXT: stwx r3, r5, r7 249; AIX-P8-32-NEXT: addi r3, r6, 1 250; AIX-P8-32-NEXT: lxvw4x vs0, 0, r5 251; AIX-P8-32-NEXT: addi r5, r1, -16 252; AIX-P8-32-NEXT: rlwinm r3, r3, 2, 28, 29 253; AIX-P8-32-NEXT: stxvw4x vs0, 0, r5 254; AIX-P8-32-NEXT: stwx r4, r5, r3 255; AIX-P8-32-NEXT: lxvw4x v2, 0, r5 256; AIX-P8-32-NEXT: blr 257entry: 258 %vecins = insertelement <2 x i64> %a, i64 %b, i64 %idx 259 ret <2 x i64> %vecins 260} 261 262; Doubleword immediate 263 264define <2 x i64> @testDoublewordImm(<2 x i64> %a, i64 %b) { 265; CHECK-LABEL: testDoublewordImm: 266; CHECK: # %bb.0: # %entry 267; CHECK-NEXT: vinsd v2, r5, 0 268; CHECK-NEXT: blr 269; 270; CHECK-BE-LABEL: testDoublewordImm: 271; CHECK-BE: # %bb.0: # %entry 272; CHECK-BE-NEXT: vinsd v2, r5, 8 273; CHECK-BE-NEXT: blr 274; 275; CHECK-P9-LABEL: testDoublewordImm: 276; CHECK-P9: # %bb.0: # %entry 277; CHECK-P9-NEXT: mtfprd f0, r5 278; CHECK-P9-NEXT: xxmrghd v2, v2, vs0 279; CHECK-P9-NEXT: blr 280; 281; AIX-P8-64-LABEL: testDoublewordImm: 282; AIX-P8-64: # %bb.0: # %entry 283; AIX-P8-64-NEXT: mtfprd f0, r3 284; AIX-P8-64-NEXT: xxmrghd v2, v2, vs0 285; AIX-P8-64-NEXT: blr 286; 287; AIX-P8-32-LABEL: testDoublewordImm: 288; AIX-P8-32: # %bb.0: # %entry 289; AIX-P8-32-NEXT: lwz r5, L..C2(r2) # %const.0 290; AIX-P8-32-NEXT: stw r3, -16(r1) 291; AIX-P8-32-NEXT: stw r4, -32(r1) 292; AIX-P8-32-NEXT: addi r3, r1, -16 293; AIX-P8-32-NEXT: addi r4, r1, -32 294; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 295; AIX-P8-32-NEXT: lwz r3, L..C3(r2) # %const.1 296; AIX-P8-32-NEXT: lxvw4x v3, 0, r5 297; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 298; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 299; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 300; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 301; AIX-P8-32-NEXT: blr 302entry: 303 %vecins = insertelement <2 x i64> %a, i64 %b, i32 1 304 ret <2 x i64> %vecins 305} 306 307define <2 x i64> @testDoublewordImm2(<2 x i64> %a, i64 %b) { 308; CHECK-LABEL: testDoublewordImm2: 309; CHECK: # %bb.0: # %entry 310; CHECK-NEXT: vinsd v2, r5, 8 311; CHECK-NEXT: blr 312; 313; CHECK-BE-LABEL: testDoublewordImm2: 314; CHECK-BE: # %bb.0: # %entry 315; CHECK-BE-NEXT: vinsd v2, r5, 0 316; CHECK-BE-NEXT: blr 317; 318; CHECK-P9-LABEL: testDoublewordImm2: 319; CHECK-P9: # %bb.0: # %entry 320; CHECK-P9-NEXT: mtfprd f0, r5 321; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 322; CHECK-P9-NEXT: blr 323; 324; AIX-P8-64-LABEL: testDoublewordImm2: 325; AIX-P8-64: # %bb.0: # %entry 326; AIX-P8-64-NEXT: mtfprd f0, r3 327; AIX-P8-64-NEXT: xxpermdi v2, vs0, v2, 1 328; AIX-P8-64-NEXT: blr 329; 330; AIX-P8-32-LABEL: testDoublewordImm2: 331; AIX-P8-32: # %bb.0: # %entry 332; AIX-P8-32-NEXT: lwz r5, L..C4(r2) # %const.0 333; AIX-P8-32-NEXT: stw r3, -16(r1) 334; AIX-P8-32-NEXT: stw r4, -32(r1) 335; AIX-P8-32-NEXT: addi r3, r1, -16 336; AIX-P8-32-NEXT: addi r4, r1, -32 337; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 338; AIX-P8-32-NEXT: lwz r3, L..C5(r2) # %const.1 339; AIX-P8-32-NEXT: lxvw4x v3, 0, r5 340; AIX-P8-32-NEXT: vperm v2, v4, v2, v3 341; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 342; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 343; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 344; AIX-P8-32-NEXT: blr 345entry: 346 %vecins = insertelement <2 x i64> %a, i64 %b, i32 0 347 ret <2 x i64> %vecins 348} 349 350; Float indexed 351 352define <4 x float> @testFloat1(<4 x float> %a, float %b, i32 zeroext %idx1) { 353; CHECK-LABEL: testFloat1: 354; CHECK: # %bb.0: # %entry 355; CHECK-NEXT: xscvdpspn v3, f1 356; CHECK-NEXT: extsw r3, r6 357; CHECK-NEXT: slwi r3, r3, 2 358; CHECK-NEXT: vinswvrx v2, r3, v3 359; CHECK-NEXT: blr 360; 361; CHECK-BE-LABEL: testFloat1: 362; CHECK-BE: # %bb.0: # %entry 363; CHECK-BE-NEXT: xscvdpspn v3, f1 364; CHECK-BE-NEXT: extsw r3, r6 365; CHECK-BE-NEXT: slwi r3, r3, 2 366; CHECK-BE-NEXT: vinswvlx v2, r3, v3 367; CHECK-BE-NEXT: blr 368; 369; CHECK-P9-LABEL: testFloat1: 370; CHECK-P9: # %bb.0: # %entry 371; CHECK-P9-NEXT: addi r4, r1, -16 372; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29 373; CHECK-P9-NEXT: stxv v2, -16(r1) 374; CHECK-P9-NEXT: stfsx f1, r4, r3 375; CHECK-P9-NEXT: lxv v2, -16(r1) 376; CHECK-P9-NEXT: blr 377; 378; AIX-P8-LABEL: testFloat1: 379; AIX-P8: # %bb.0: # %entry 380; AIX-P8-NEXT: addi r3, r1, -16 381; AIX-P8-NEXT: rlwinm r4, r4, 2, 28, 29 382; AIX-P8-NEXT: stxvw4x v2, 0, r3 383; AIX-P8-NEXT: stfsx f1, r3, r4 384; AIX-P8-NEXT: lxvw4x v2, 0, r3 385; AIX-P8-NEXT: blr 386entry: 387 %vecins = insertelement <4 x float> %a, float %b, i32 %idx1 388 ret <4 x float> %vecins 389} 390 391define <4 x float> @testFloat2(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 392; CHECK-LABEL: testFloat2: 393; CHECK: # %bb.0: # %entry 394; CHECK-NEXT: lwz r3, 0(r5) 395; CHECK-NEXT: extsw r4, r6 396; CHECK-NEXT: slwi r4, r4, 2 397; CHECK-NEXT: vinswrx v2, r4, r3 398; CHECK-NEXT: lwz r3, 1(r5) 399; CHECK-NEXT: extsw r4, r7 400; CHECK-NEXT: slwi r4, r4, 2 401; CHECK-NEXT: vinswrx v2, r4, r3 402; CHECK-NEXT: blr 403; 404; CHECK-BE-LABEL: testFloat2: 405; CHECK-BE: # %bb.0: # %entry 406; CHECK-BE-NEXT: lwz r3, 0(r5) 407; CHECK-BE-NEXT: extsw r4, r6 408; CHECK-BE-NEXT: slwi r4, r4, 2 409; CHECK-BE-NEXT: vinswlx v2, r4, r3 410; CHECK-BE-NEXT: lwz r3, 1(r5) 411; CHECK-BE-NEXT: extsw r4, r7 412; CHECK-BE-NEXT: slwi r4, r4, 2 413; CHECK-BE-NEXT: vinswlx v2, r4, r3 414; CHECK-BE-NEXT: blr 415; 416; CHECK-P9-LABEL: testFloat2: 417; CHECK-P9: # %bb.0: # %entry 418; CHECK-P9-NEXT: lwz r3, 0(r5) 419; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29 420; CHECK-P9-NEXT: addi r6, r1, -16 421; CHECK-P9-NEXT: stxv v2, -16(r1) 422; CHECK-P9-NEXT: stwx r3, r6, r4 423; CHECK-P9-NEXT: rlwinm r4, r7, 2, 28, 29 424; CHECK-P9-NEXT: lxv vs0, -16(r1) 425; CHECK-P9-NEXT: lwz r3, 1(r5) 426; CHECK-P9-NEXT: addi r5, r1, -32 427; CHECK-P9-NEXT: stxv vs0, -32(r1) 428; CHECK-P9-NEXT: stwx r3, r5, r4 429; CHECK-P9-NEXT: lxv v2, -32(r1) 430; CHECK-P9-NEXT: blr 431; 432; AIX-P8-64-LABEL: testFloat2: 433; AIX-P8-64: # %bb.0: # %entry 434; AIX-P8-64-NEXT: lwz r7, 0(r3) 435; AIX-P8-64-NEXT: addi r6, r1, -32 436; AIX-P8-64-NEXT: rlwinm r4, r4, 2, 28, 29 437; AIX-P8-64-NEXT: rlwinm r5, r5, 2, 28, 29 438; AIX-P8-64-NEXT: stxvw4x v2, 0, r6 439; AIX-P8-64-NEXT: stwx r7, r6, r4 440; AIX-P8-64-NEXT: addi r4, r1, -16 441; AIX-P8-64-NEXT: lxvw4x vs0, 0, r6 442; AIX-P8-64-NEXT: lwz r3, 1(r3) 443; AIX-P8-64-NEXT: stxvw4x vs0, 0, r4 444; AIX-P8-64-NEXT: stwx r3, r4, r5 445; AIX-P8-64-NEXT: lxvw4x v2, 0, r4 446; AIX-P8-64-NEXT: blr 447; 448; AIX-P8-32-LABEL: testFloat2: 449; AIX-P8-32: # %bb.0: # %entry 450; AIX-P8-32-NEXT: lwz r7, 0(r3) 451; AIX-P8-32-NEXT: addi r6, r1, -32 452; AIX-P8-32-NEXT: rlwinm r4, r4, 2, 28, 29 453; AIX-P8-32-NEXT: stxvw4x v2, 0, r6 454; AIX-P8-32-NEXT: stwx r7, r6, r4 455; AIX-P8-32-NEXT: rlwinm r4, r5, 2, 28, 29 456; AIX-P8-32-NEXT: addi r5, r1, -16 457; AIX-P8-32-NEXT: lxvw4x vs0, 0, r6 458; AIX-P8-32-NEXT: lwz r3, 1(r3) 459; AIX-P8-32-NEXT: stxvw4x vs0, 0, r5 460; AIX-P8-32-NEXT: stwx r3, r5, r4 461; AIX-P8-32-NEXT: lxvw4x v2, 0, r5 462; AIX-P8-32-NEXT: blr 463entry: 464 %0 = bitcast i8* %b to float* 465 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1 466 %1 = bitcast i8* %add.ptr1 to float* 467 %2 = load float, float* %0, align 4 468 %vecins = insertelement <4 x float> %a, float %2, i32 %idx1 469 %3 = load float, float* %1, align 4 470 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2 471 ret <4 x float> %vecins2 472} 473 474define <4 x float> @testFloat3(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 475; CHECK-LABEL: testFloat3: 476; CHECK: # %bb.0: # %entry 477; CHECK-NEXT: plwz r3, 65536(r5), 0 478; CHECK-NEXT: extsw r4, r6 479; CHECK-NEXT: slwi r4, r4, 2 480; CHECK-NEXT: vinswrx v2, r4, r3 481; CHECK-NEXT: li r3, 1 482; CHECK-NEXT: extsw r4, r7 483; CHECK-NEXT: rldic r3, r3, 36, 27 484; CHECK-NEXT: slwi r4, r4, 2 485; CHECK-NEXT: lwzx r3, r5, r3 486; CHECK-NEXT: vinswrx v2, r4, r3 487; CHECK-NEXT: blr 488; 489; CHECK-BE-LABEL: testFloat3: 490; CHECK-BE: # %bb.0: # %entry 491; CHECK-BE-NEXT: plwz r3, 65536(r5), 0 492; CHECK-BE-NEXT: extsw r4, r6 493; CHECK-BE-NEXT: slwi r4, r4, 2 494; CHECK-BE-NEXT: vinswlx v2, r4, r3 495; CHECK-BE-NEXT: li r3, 1 496; CHECK-BE-NEXT: extsw r4, r7 497; CHECK-BE-NEXT: rldic r3, r3, 36, 27 498; CHECK-BE-NEXT: slwi r4, r4, 2 499; CHECK-BE-NEXT: lwzx r3, r5, r3 500; CHECK-BE-NEXT: vinswlx v2, r4, r3 501; CHECK-BE-NEXT: blr 502; 503; CHECK-P9-LABEL: testFloat3: 504; CHECK-P9: # %bb.0: # %entry 505; CHECK-P9-NEXT: lis r3, 1 506; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29 507; CHECK-P9-NEXT: addi r6, r1, -16 508; CHECK-P9-NEXT: lwzx r3, r5, r3 509; CHECK-P9-NEXT: stxv v2, -16(r1) 510; CHECK-P9-NEXT: stwx r3, r6, r4 511; CHECK-P9-NEXT: li r3, 1 512; CHECK-P9-NEXT: rlwinm r4, r7, 2, 28, 29 513; CHECK-P9-NEXT: lxv vs0, -16(r1) 514; CHECK-P9-NEXT: rldic r3, r3, 36, 27 515; CHECK-P9-NEXT: lwzx r3, r5, r3 516; CHECK-P9-NEXT: addi r5, r1, -32 517; CHECK-P9-NEXT: stxv vs0, -32(r1) 518; CHECK-P9-NEXT: stwx r3, r5, r4 519; CHECK-P9-NEXT: lxv v2, -32(r1) 520; CHECK-P9-NEXT: blr 521; 522; AIX-P8-64-LABEL: testFloat3: 523; AIX-P8-64: # %bb.0: # %entry 524; AIX-P8-64-NEXT: lis r6, 1 525; AIX-P8-64-NEXT: addi r7, r1, -32 526; AIX-P8-64-NEXT: rlwinm r4, r4, 2, 28, 29 527; AIX-P8-64-NEXT: rlwinm r5, r5, 2, 28, 29 528; AIX-P8-64-NEXT: lwzx r6, r3, r6 529; AIX-P8-64-NEXT: stxvw4x v2, 0, r7 530; AIX-P8-64-NEXT: stwx r6, r7, r4 531; AIX-P8-64-NEXT: li r4, 1 532; AIX-P8-64-NEXT: lxvw4x vs0, 0, r7 533; AIX-P8-64-NEXT: rldic r4, r4, 36, 27 534; AIX-P8-64-NEXT: lwzx r3, r3, r4 535; AIX-P8-64-NEXT: addi r4, r1, -16 536; AIX-P8-64-NEXT: stxvw4x vs0, 0, r4 537; AIX-P8-64-NEXT: stwx r3, r4, r5 538; AIX-P8-64-NEXT: lxvw4x v2, 0, r4 539; AIX-P8-64-NEXT: blr 540; 541; AIX-P8-32-LABEL: testFloat3: 542; AIX-P8-32: # %bb.0: # %entry 543; AIX-P8-32-NEXT: lis r6, 1 544; AIX-P8-32-NEXT: rlwinm r4, r4, 2, 28, 29 545; AIX-P8-32-NEXT: addi r7, r1, -32 546; AIX-P8-32-NEXT: lwzx r6, r3, r6 547; AIX-P8-32-NEXT: stxvw4x v2, 0, r7 548; AIX-P8-32-NEXT: stwx r6, r7, r4 549; AIX-P8-32-NEXT: rlwinm r4, r5, 2, 28, 29 550; AIX-P8-32-NEXT: addi r5, r1, -16 551; AIX-P8-32-NEXT: lxvw4x vs0, 0, r7 552; AIX-P8-32-NEXT: lwz r3, 0(r3) 553; AIX-P8-32-NEXT: stxvw4x vs0, 0, r5 554; AIX-P8-32-NEXT: stwx r3, r5, r4 555; AIX-P8-32-NEXT: lxvw4x v2, 0, r5 556; AIX-P8-32-NEXT: blr 557entry: 558 %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536 559 %0 = bitcast i8* %add.ptr to float* 560 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736 561 %1 = bitcast i8* %add.ptr1 to float* 562 %2 = load float, float* %0, align 4 563 %vecins = insertelement <4 x float> %a, float %2, i32 %idx1 564 %3 = load float, float* %1, align 4 565 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2 566 ret <4 x float> %vecins2 567} 568 569; Float immediate 570 571define <4 x float> @testFloatImm1(<4 x float> %a, float %b) { 572; CHECK-LABEL: testFloatImm1: 573; CHECK: # %bb.0: # %entry 574; CHECK-NEXT: xscvdpspn vs0, f1 575; CHECK-NEXT: xxinsertw v2, vs0, 12 576; CHECK-NEXT: xxinsertw v2, vs0, 4 577; CHECK-NEXT: blr 578; 579; CHECK-BE-LABEL: testFloatImm1: 580; CHECK-BE: # %bb.0: # %entry 581; CHECK-BE-NEXT: xscvdpspn vs0, f1 582; CHECK-BE-NEXT: xxinsertw v2, vs0, 0 583; CHECK-BE-NEXT: xxinsertw v2, vs0, 8 584; CHECK-BE-NEXT: blr 585; 586; CHECK-P9-LABEL: testFloatImm1: 587; CHECK-P9: # %bb.0: # %entry 588; CHECK-P9-NEXT: xscvdpspn vs0, f1 589; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 590; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 591; CHECK-P9-NEXT: blr 592; 593; AIX-P8-64-LABEL: testFloatImm1: 594; AIX-P8-64: # %bb.0: # %entry 595; AIX-P8-64-NEXT: ld r3, L..C2(r2) # %const.0 596; AIX-P8-64-NEXT: xscvdpspn v3, f1 597; AIX-P8-64-NEXT: lxvw4x v4, 0, r3 598; AIX-P8-64-NEXT: ld r3, L..C3(r2) # %const.1 599; AIX-P8-64-NEXT: vperm v2, v3, v2, v4 600; AIX-P8-64-NEXT: lxvw4x v4, 0, r3 601; AIX-P8-64-NEXT: vperm v2, v2, v3, v4 602; AIX-P8-64-NEXT: blr 603; 604; AIX-P8-32-LABEL: testFloatImm1: 605; AIX-P8-32: # %bb.0: # %entry 606; AIX-P8-32-NEXT: lwz r3, L..C6(r2) # %const.0 607; AIX-P8-32-NEXT: xscvdpspn v3, f1 608; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 609; AIX-P8-32-NEXT: lwz r3, L..C7(r2) # %const.1 610; AIX-P8-32-NEXT: vperm v2, v3, v2, v4 611; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 612; AIX-P8-32-NEXT: vperm v2, v2, v3, v4 613; AIX-P8-32-NEXT: blr 614entry: 615 %vecins = insertelement <4 x float> %a, float %b, i32 0 616 %vecins1 = insertelement <4 x float> %vecins, float %b, i32 2 617 ret <4 x float> %vecins1 618} 619 620define <4 x float> @testFloatImm2(<4 x float> %a, i32* %b) { 621; CHECK-LABEL: testFloatImm2: 622; CHECK: # %bb.0: # %entry 623; CHECK-NEXT: lwz r3, 0(r5) 624; CHECK-NEXT: vinsw v2, r3, 12 625; CHECK-NEXT: lwz r3, 4(r5) 626; CHECK-NEXT: vinsw v2, r3, 4 627; CHECK-NEXT: blr 628; 629; CHECK-BE-LABEL: testFloatImm2: 630; CHECK-BE: # %bb.0: # %entry 631; CHECK-BE-NEXT: lwz r3, 0(r5) 632; CHECK-BE-NEXT: vinsw v2, r3, 0 633; CHECK-BE-NEXT: lwz r3, 4(r5) 634; CHECK-BE-NEXT: vinsw v2, r3, 8 635; CHECK-BE-NEXT: blr 636; 637; CHECK-P9-LABEL: testFloatImm2: 638; CHECK-P9: # %bb.0: # %entry 639; CHECK-P9-NEXT: lwz r3, 0(r5) 640; CHECK-P9-NEXT: mtfprwz f0, r3 641; CHECK-P9-NEXT: lwz r3, 4(r5) 642; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 643; CHECK-P9-NEXT: mtfprwz f0, r3 644; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 645; CHECK-P9-NEXT: blr 646; 647; AIX-P8-64-LABEL: testFloatImm2: 648; AIX-P8-64: # %bb.0: # %entry 649; AIX-P8-64-NEXT: ld r4, L..C4(r2) # %const.0 650; AIX-P8-64-NEXT: lxsiwzx v3, 0, r3 651; AIX-P8-64-NEXT: li r5, 4 652; AIX-P8-64-NEXT: lxvw4x v4, 0, r4 653; AIX-P8-64-NEXT: ld r4, L..C5(r2) # %const.1 654; AIX-P8-64-NEXT: vperm v2, v3, v2, v4 655; AIX-P8-64-NEXT: lxsiwzx v3, r3, r5 656; AIX-P8-64-NEXT: lxvw4x v4, 0, r4 657; AIX-P8-64-NEXT: vperm v2, v2, v3, v4 658; AIX-P8-64-NEXT: blr 659; 660; AIX-P8-32-LABEL: testFloatImm2: 661; AIX-P8-32: # %bb.0: # %entry 662; AIX-P8-32-NEXT: lwz r4, L..C8(r2) # %const.0 663; AIX-P8-32-NEXT: lxsiwzx v3, 0, r3 664; AIX-P8-32-NEXT: li r5, 4 665; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 666; AIX-P8-32-NEXT: lwz r4, L..C9(r2) # %const.1 667; AIX-P8-32-NEXT: vperm v2, v3, v2, v4 668; AIX-P8-32-NEXT: lxsiwzx v3, r3, r5 669; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 670; AIX-P8-32-NEXT: vperm v2, v2, v3, v4 671; AIX-P8-32-NEXT: blr 672entry: 673 %0 = bitcast i32* %b to float* 674 %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 1 675 %1 = bitcast i32* %add.ptr1 to float* 676 %2 = load float, float* %0, align 4 677 %vecins = insertelement <4 x float> %a, float %2, i32 0 678 %3 = load float, float* %1, align 4 679 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2 680 ret <4 x float> %vecins2 681} 682 683define <4 x float> @testFloatImm3(<4 x float> %a, i32* %b) { 684; CHECK-LABEL: testFloatImm3: 685; CHECK: # %bb.0: # %entry 686; CHECK-NEXT: plwz r3, 262144(r5), 0 687; CHECK-NEXT: vinsw v2, r3, 12 688; CHECK-NEXT: li r3, 1 689; CHECK-NEXT: rldic r3, r3, 38, 25 690; CHECK-NEXT: lwzx r3, r5, r3 691; CHECK-NEXT: vinsw v2, r3, 4 692; CHECK-NEXT: blr 693; 694; CHECK-BE-LABEL: testFloatImm3: 695; CHECK-BE: # %bb.0: # %entry 696; CHECK-BE-NEXT: plwz r3, 262144(r5), 0 697; CHECK-BE-NEXT: vinsw v2, r3, 0 698; CHECK-BE-NEXT: li r3, 1 699; CHECK-BE-NEXT: rldic r3, r3, 38, 25 700; CHECK-BE-NEXT: lwzx r3, r5, r3 701; CHECK-BE-NEXT: vinsw v2, r3, 8 702; CHECK-BE-NEXT: blr 703; 704; CHECK-P9-LABEL: testFloatImm3: 705; CHECK-P9: # %bb.0: # %entry 706; CHECK-P9-NEXT: lis r3, 4 707; CHECK-P9-NEXT: lwzx r3, r5, r3 708; CHECK-P9-NEXT: mtfprwz f0, r3 709; CHECK-P9-NEXT: li r3, 1 710; CHECK-P9-NEXT: rldic r3, r3, 38, 25 711; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 712; CHECK-P9-NEXT: lwzx r3, r5, r3 713; CHECK-P9-NEXT: mtfprwz f0, r3 714; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 715; CHECK-P9-NEXT: blr 716; 717; AIX-P8-64-LABEL: testFloatImm3: 718; AIX-P8-64: # %bb.0: # %entry 719; AIX-P8-64-NEXT: ld r4, L..C6(r2) # %const.0 720; AIX-P8-64-NEXT: lis r5, 4 721; AIX-P8-64-NEXT: lxsiwzx v3, r3, r5 722; AIX-P8-64-NEXT: li r5, 1 723; AIX-P8-64-NEXT: rldic r5, r5, 38, 25 724; AIX-P8-64-NEXT: lxvw4x v4, 0, r4 725; AIX-P8-64-NEXT: ld r4, L..C7(r2) # %const.1 726; AIX-P8-64-NEXT: vperm v2, v3, v2, v4 727; AIX-P8-64-NEXT: lxsiwzx v3, r3, r5 728; AIX-P8-64-NEXT: lxvw4x v4, 0, r4 729; AIX-P8-64-NEXT: vperm v2, v2, v3, v4 730; AIX-P8-64-NEXT: blr 731; 732; AIX-P8-32-LABEL: testFloatImm3: 733; AIX-P8-32: # %bb.0: # %entry 734; AIX-P8-32-NEXT: lwz r4, L..C10(r2) # %const.0 735; AIX-P8-32-NEXT: lis r5, 4 736; AIX-P8-32-NEXT: lxsiwzx v3, r3, r5 737; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 738; AIX-P8-32-NEXT: lwz r4, L..C11(r2) # %const.1 739; AIX-P8-32-NEXT: vperm v2, v3, v2, v4 740; AIX-P8-32-NEXT: lxvw4x v3, 0, r4 741; AIX-P8-32-NEXT: lxsiwzx v4, 0, r3 742; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 743; AIX-P8-32-NEXT: blr 744entry: 745 %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536 746 %0 = bitcast i32* %add.ptr to float* 747 %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 68719476736 748 %1 = bitcast i32* %add.ptr1 to float* 749 %2 = load float, float* %0, align 4 750 %vecins = insertelement <4 x float> %a, float %2, i32 0 751 %3 = load float, float* %1, align 4 752 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2 753 ret <4 x float> %vecins2 754} 755 756; Double indexed 757 758define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) { 759; CHECK-LABEL: testDouble1: 760; CHECK: # %bb.0: # %entry 761; CHECK-NEXT: extsw r4, r6 762; CHECK-NEXT: mffprd r3, f1 763; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 764; CHECK-NEXT: vinsdrx v2, r4, r3 765; CHECK-NEXT: blr 766; 767; CHECK-BE-LABEL: testDouble1: 768; CHECK-BE: # %bb.0: # %entry 769; CHECK-BE-NEXT: extsw r4, r6 770; CHECK-BE-NEXT: mffprd r3, f1 771; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 772; CHECK-BE-NEXT: vinsdlx v2, r4, r3 773; CHECK-BE-NEXT: blr 774; 775; CHECK-P9-LABEL: testDouble1: 776; CHECK-P9: # %bb.0: # %entry 777; CHECK-P9-NEXT: addi r4, r1, -16 778; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28 779; CHECK-P9-NEXT: stxv v2, -16(r1) 780; CHECK-P9-NEXT: stfdx f1, r4, r3 781; CHECK-P9-NEXT: lxv v2, -16(r1) 782; CHECK-P9-NEXT: blr 783; 784; AIX-P8-64-LABEL: testDouble1: 785; AIX-P8-64: # %bb.0: # %entry 786; AIX-P8-64-NEXT: addi r3, r1, -16 787; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28 788; AIX-P8-64-NEXT: stxvd2x v2, 0, r3 789; AIX-P8-64-NEXT: stfdx f1, r3, r4 790; AIX-P8-64-NEXT: lxvd2x v2, 0, r3 791; AIX-P8-64-NEXT: blr 792; 793; AIX-P8-32-LABEL: testDouble1: 794; AIX-P8-32: # %bb.0: # %entry 795; AIX-P8-32-NEXT: addi r3, r1, -16 796; AIX-P8-32-NEXT: rlwinm r4, r5, 3, 28, 28 797; AIX-P8-32-NEXT: stxvd2x v2, 0, r3 798; AIX-P8-32-NEXT: stfdx f1, r3, r4 799; AIX-P8-32-NEXT: lxvd2x v2, 0, r3 800; AIX-P8-32-NEXT: blr 801entry: 802 %vecins = insertelement <2 x double> %a, double %b, i32 %idx1 803 ret <2 x double> %vecins 804} 805 806define <2 x double> @testDouble2(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 807; CHECK-LABEL: testDouble2: 808; CHECK: # %bb.0: # %entry 809; CHECK-NEXT: ld r3, 0(r5) 810; CHECK-NEXT: extsw r4, r6 811; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 812; CHECK-NEXT: vinsdrx v2, r4, r3 813; CHECK-NEXT: pld r3, 1(r5), 0 814; CHECK-NEXT: extsw r4, r7 815; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 816; CHECK-NEXT: vinsdrx v2, r4, r3 817; CHECK-NEXT: blr 818; 819; CHECK-BE-LABEL: testDouble2: 820; CHECK-BE: # %bb.0: # %entry 821; CHECK-BE-NEXT: ld r3, 0(r5) 822; CHECK-BE-NEXT: extsw r4, r6 823; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 824; CHECK-BE-NEXT: vinsdlx v2, r4, r3 825; CHECK-BE-NEXT: pld r3, 1(r5), 0 826; CHECK-BE-NEXT: extsw r4, r7 827; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 828; CHECK-BE-NEXT: vinsdlx v2, r4, r3 829; CHECK-BE-NEXT: blr 830; 831; CHECK-P9-LABEL: testDouble2: 832; CHECK-P9: # %bb.0: # %entry 833; CHECK-P9-NEXT: ld r3, 0(r5) 834; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28 835; CHECK-P9-NEXT: addi r6, r1, -32 836; CHECK-P9-NEXT: stxv v2, -32(r1) 837; CHECK-P9-NEXT: stdx r3, r6, r4 838; CHECK-P9-NEXT: li r3, 1 839; CHECK-P9-NEXT: rlwinm r4, r7, 3, 28, 28 840; CHECK-P9-NEXT: lxv vs0, -32(r1) 841; CHECK-P9-NEXT: ldx r3, r5, r3 842; CHECK-P9-NEXT: addi r5, r1, -16 843; CHECK-P9-NEXT: stxv vs0, -16(r1) 844; CHECK-P9-NEXT: stdx r3, r5, r4 845; CHECK-P9-NEXT: lxv v2, -16(r1) 846; CHECK-P9-NEXT: blr 847; 848; AIX-P8-64-LABEL: testDouble2: 849; AIX-P8-64: # %bb.0: # %entry 850; AIX-P8-64-NEXT: ld r7, 0(r3) 851; AIX-P8-64-NEXT: addi r6, r1, -32 852; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28 853; AIX-P8-64-NEXT: rlwinm r5, r5, 3, 28, 28 854; AIX-P8-64-NEXT: stxvd2x v2, 0, r6 855; AIX-P8-64-NEXT: stdx r7, r6, r4 856; AIX-P8-64-NEXT: li r4, 1 857; AIX-P8-64-NEXT: lxvd2x vs0, 0, r6 858; AIX-P8-64-NEXT: ldx r3, r3, r4 859; AIX-P8-64-NEXT: addi r4, r1, -16 860; AIX-P8-64-NEXT: stxvd2x vs0, 0, r4 861; AIX-P8-64-NEXT: stdx r3, r4, r5 862; AIX-P8-64-NEXT: lxvd2x v2, 0, r4 863; AIX-P8-64-NEXT: blr 864; 865; AIX-P8-32-LABEL: testDouble2: 866; AIX-P8-32: # %bb.0: # %entry 867; AIX-P8-32-NEXT: lfd f0, 0(r3) 868; AIX-P8-32-NEXT: addi r6, r1, -32 869; AIX-P8-32-NEXT: rlwinm r4, r4, 3, 28, 28 870; AIX-P8-32-NEXT: stxvd2x v2, 0, r6 871; AIX-P8-32-NEXT: stfdx f0, r6, r4 872; AIX-P8-32-NEXT: addi r4, r1, -16 873; AIX-P8-32-NEXT: lxvd2x vs0, 0, r6 874; AIX-P8-32-NEXT: lfd f1, 1(r3) 875; AIX-P8-32-NEXT: rlwinm r3, r5, 3, 28, 28 876; AIX-P8-32-NEXT: stxvd2x vs0, 0, r4 877; AIX-P8-32-NEXT: stfdx f1, r4, r3 878; AIX-P8-32-NEXT: lxvd2x v2, 0, r4 879; AIX-P8-32-NEXT: blr 880entry: 881 %0 = bitcast i8* %b to double* 882 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1 883 %1 = bitcast i8* %add.ptr1 to double* 884 %2 = load double, double* %0, align 8 885 %vecins = insertelement <2 x double> %a, double %2, i32 %idx1 886 %3 = load double, double* %1, align 8 887 %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2 888 ret <2 x double> %vecins2 889} 890 891define <2 x double> @testDouble3(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 892; CHECK-LABEL: testDouble3: 893; CHECK: # %bb.0: # %entry 894; CHECK-NEXT: pld r3, 65536(r5), 0 895; CHECK-NEXT: extsw r4, r6 896; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 897; CHECK-NEXT: vinsdrx v2, r4, r3 898; CHECK-NEXT: li r3, 1 899; CHECK-NEXT: extsw r4, r7 900; CHECK-NEXT: rldic r3, r3, 36, 27 901; CHECK-NEXT: rlwinm r4, r4, 3, 0, 28 902; CHECK-NEXT: ldx r3, r5, r3 903; CHECK-NEXT: vinsdrx v2, r4, r3 904; CHECK-NEXT: blr 905; 906; CHECK-BE-LABEL: testDouble3: 907; CHECK-BE: # %bb.0: # %entry 908; CHECK-BE-NEXT: pld r3, 65536(r5), 0 909; CHECK-BE-NEXT: extsw r4, r6 910; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 911; CHECK-BE-NEXT: vinsdlx v2, r4, r3 912; CHECK-BE-NEXT: li r3, 1 913; CHECK-BE-NEXT: extsw r4, r7 914; CHECK-BE-NEXT: rldic r3, r3, 36, 27 915; CHECK-BE-NEXT: rlwinm r4, r4, 3, 0, 28 916; CHECK-BE-NEXT: ldx r3, r5, r3 917; CHECK-BE-NEXT: vinsdlx v2, r4, r3 918; CHECK-BE-NEXT: blr 919; 920; CHECK-P9-LABEL: testDouble3: 921; CHECK-P9: # %bb.0: # %entry 922; CHECK-P9-NEXT: lis r3, 1 923; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28 924; CHECK-P9-NEXT: addi r6, r1, -32 925; CHECK-P9-NEXT: ldx r3, r5, r3 926; CHECK-P9-NEXT: stxv v2, -32(r1) 927; CHECK-P9-NEXT: stdx r3, r6, r4 928; CHECK-P9-NEXT: li r3, 1 929; CHECK-P9-NEXT: rlwinm r4, r7, 3, 28, 28 930; CHECK-P9-NEXT: lxv vs0, -32(r1) 931; CHECK-P9-NEXT: rldic r3, r3, 36, 27 932; CHECK-P9-NEXT: ldx r3, r5, r3 933; CHECK-P9-NEXT: addi r5, r1, -16 934; CHECK-P9-NEXT: stxv vs0, -16(r1) 935; CHECK-P9-NEXT: stdx r3, r5, r4 936; CHECK-P9-NEXT: lxv v2, -16(r1) 937; CHECK-P9-NEXT: blr 938; 939; AIX-P8-64-LABEL: testDouble3: 940; AIX-P8-64: # %bb.0: # %entry 941; AIX-P8-64-NEXT: lis r6, 1 942; AIX-P8-64-NEXT: addi r7, r1, -32 943; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28 944; AIX-P8-64-NEXT: li r8, 1 945; AIX-P8-64-NEXT: rlwinm r5, r5, 3, 28, 28 946; AIX-P8-64-NEXT: ldx r6, r3, r6 947; AIX-P8-64-NEXT: stxvd2x v2, 0, r7 948; AIX-P8-64-NEXT: stdx r6, r7, r4 949; AIX-P8-64-NEXT: rldic r4, r8, 36, 27 950; AIX-P8-64-NEXT: lxvd2x vs0, 0, r7 951; AIX-P8-64-NEXT: ldx r3, r3, r4 952; AIX-P8-64-NEXT: addi r4, r1, -16 953; AIX-P8-64-NEXT: stxvd2x vs0, 0, r4 954; AIX-P8-64-NEXT: stdx r3, r4, r5 955; AIX-P8-64-NEXT: lxvd2x v2, 0, r4 956; AIX-P8-64-NEXT: blr 957; 958; AIX-P8-32-LABEL: testDouble3: 959; AIX-P8-32: # %bb.0: # %entry 960; AIX-P8-32-NEXT: lis r6, 1 961; AIX-P8-32-NEXT: rlwinm r4, r4, 3, 28, 28 962; AIX-P8-32-NEXT: lfdx f0, r3, r6 963; AIX-P8-32-NEXT: addi r6, r1, -32 964; AIX-P8-32-NEXT: stxvd2x v2, 0, r6 965; AIX-P8-32-NEXT: stfdx f0, r6, r4 966; AIX-P8-32-NEXT: addi r4, r1, -16 967; AIX-P8-32-NEXT: lxvd2x vs0, 0, r6 968; AIX-P8-32-NEXT: lfd f1, 0(r3) 969; AIX-P8-32-NEXT: rlwinm r3, r5, 3, 28, 28 970; AIX-P8-32-NEXT: stxvd2x vs0, 0, r4 971; AIX-P8-32-NEXT: stfdx f1, r4, r3 972; AIX-P8-32-NEXT: lxvd2x v2, 0, r4 973; AIX-P8-32-NEXT: blr 974entry: 975 %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536 976 %0 = bitcast i8* %add.ptr to double* 977 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736 978 %1 = bitcast i8* %add.ptr1 to double* 979 %2 = load double, double* %0, align 8 980 %vecins = insertelement <2 x double> %a, double %2, i32 %idx1 981 %3 = load double, double* %1, align 8 982 %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2 983 ret <2 x double> %vecins2 984} 985 986; Double immediate 987 988define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) { 989; CHECK-LABEL: testDoubleImm1: 990; CHECK: # %bb.0: # %entry 991; CHECK-NEXT: # kill: def $f1 killed $f1 def $vsl1 992; CHECK-NEXT: xxmrghd v2, v2, vs1 993; CHECK-NEXT: blr 994; 995; CHECK-BE-LABEL: testDoubleImm1: 996; CHECK-BE: # %bb.0: # %entry 997; CHECK-BE-NEXT: # kill: def $f1 killed $f1 def $vsl1 998; CHECK-BE-NEXT: xxpermdi v2, vs1, v2, 1 999; CHECK-BE-NEXT: blr 1000; 1001; CHECK-P9-LABEL: testDoubleImm1: 1002; CHECK-P9: # %bb.0: # %entry 1003; CHECK-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1 1004; CHECK-P9-NEXT: xxpermdi v2, vs1, v2, 1 1005; CHECK-P9-NEXT: blr 1006; 1007; AIX-P8-LABEL: testDoubleImm1: 1008; AIX-P8: # %bb.0: # %entry 1009; AIX-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1 1010; AIX-P8-NEXT: xxpermdi v2, vs1, v2, 1 1011; AIX-P8-NEXT: blr 1012entry: 1013 %vecins = insertelement <2 x double> %a, double %b, i32 0 1014 ret <2 x double> %vecins 1015} 1016 1017define <2 x double> @testDoubleImm2(<2 x double> %a, i32* %b) { 1018; CHECK-LABEL: testDoubleImm2: 1019; CHECK: # %bb.0: # %entry 1020; CHECK-NEXT: lfd f0, 0(r5) 1021; CHECK-NEXT: xxmrghd v2, v2, vs0 1022; CHECK-NEXT: blr 1023; 1024; CHECK-BE-LABEL: testDoubleImm2: 1025; CHECK-BE: # %bb.0: # %entry 1026; CHECK-BE-NEXT: lfd f0, 0(r5) 1027; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1028; CHECK-BE-NEXT: blr 1029; 1030; CHECK-P9-LABEL: testDoubleImm2: 1031; CHECK-P9: # %bb.0: # %entry 1032; CHECK-P9-NEXT: lfd f0, 0(r5) 1033; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1034; CHECK-P9-NEXT: blr 1035; 1036; AIX-P8-LABEL: testDoubleImm2: 1037; AIX-P8: # %bb.0: # %entry 1038; AIX-P8-NEXT: lfd f0, 0(r3) 1039; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1 1040; AIX-P8-NEXT: blr 1041entry: 1042 %0 = bitcast i32* %b to double* 1043 %1 = load double, double* %0, align 8 1044 %vecins = insertelement <2 x double> %a, double %1, i32 0 1045 ret <2 x double> %vecins 1046} 1047 1048define <2 x double> @testDoubleImm3(<2 x double> %a, i32* %b) { 1049; CHECK-LABEL: testDoubleImm3: 1050; CHECK: # %bb.0: # %entry 1051; CHECK-NEXT: lfd f0, 4(r5) 1052; CHECK-NEXT: xxmrghd v2, v2, vs0 1053; CHECK-NEXT: blr 1054; 1055; CHECK-BE-LABEL: testDoubleImm3: 1056; CHECK-BE: # %bb.0: # %entry 1057; CHECK-BE-NEXT: lfd f0, 4(r5) 1058; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1059; CHECK-BE-NEXT: blr 1060; 1061; CHECK-P9-LABEL: testDoubleImm3: 1062; CHECK-P9: # %bb.0: # %entry 1063; CHECK-P9-NEXT: lfd f0, 4(r5) 1064; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1065; CHECK-P9-NEXT: blr 1066; 1067; AIX-P8-LABEL: testDoubleImm3: 1068; AIX-P8: # %bb.0: # %entry 1069; AIX-P8-NEXT: lfd f0, 4(r3) 1070; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1 1071; AIX-P8-NEXT: blr 1072entry: 1073 %add.ptr = getelementptr inbounds i32, i32* %b, i64 1 1074 %0 = bitcast i32* %add.ptr to double* 1075 %1 = load double, double* %0, align 8 1076 %vecins = insertelement <2 x double> %a, double %1, i32 0 1077 ret <2 x double> %vecins 1078} 1079 1080define <2 x double> @testDoubleImm4(<2 x double> %a, i32* %b) { 1081; CHECK-LABEL: testDoubleImm4: 1082; CHECK: # %bb.0: # %entry 1083; CHECK-NEXT: plfd f0, 262144(r5), 0 1084; CHECK-NEXT: xxmrghd v2, v2, vs0 1085; CHECK-NEXT: blr 1086; 1087; CHECK-BE-LABEL: testDoubleImm4: 1088; CHECK-BE: # %bb.0: # %entry 1089; CHECK-BE-NEXT: plfd f0, 262144(r5), 0 1090; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1091; CHECK-BE-NEXT: blr 1092; 1093; CHECK-P9-LABEL: testDoubleImm4: 1094; CHECK-P9: # %bb.0: # %entry 1095; CHECK-P9-NEXT: lis r3, 4 1096; CHECK-P9-NEXT: lfdx f0, r5, r3 1097; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1098; CHECK-P9-NEXT: blr 1099; 1100; AIX-P8-LABEL: testDoubleImm4: 1101; AIX-P8: # %bb.0: # %entry 1102; AIX-P8-NEXT: lis r4, 4 1103; AIX-P8-NEXT: lfdx f0, r3, r4 1104; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1 1105; AIX-P8-NEXT: blr 1106entry: 1107 %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536 1108 %0 = bitcast i32* %add.ptr to double* 1109 %1 = load double, double* %0, align 8 1110 %vecins = insertelement <2 x double> %a, double %1, i32 0 1111 ret <2 x double> %vecins 1112} 1113 1114define <2 x double> @testDoubleImm5(<2 x double> %a, i32* %b) { 1115; CHECK-LABEL: testDoubleImm5: 1116; CHECK: # %bb.0: # %entry 1117; CHECK-NEXT: li r3, 1 1118; CHECK-NEXT: rldic r3, r3, 38, 25 1119; CHECK-NEXT: lfdx f0, r5, r3 1120; CHECK-NEXT: xxmrghd v2, v2, vs0 1121; CHECK-NEXT: blr 1122; 1123; CHECK-BE-LABEL: testDoubleImm5: 1124; CHECK-BE: # %bb.0: # %entry 1125; CHECK-BE-NEXT: li r3, 1 1126; CHECK-BE-NEXT: rldic r3, r3, 38, 25 1127; CHECK-BE-NEXT: lfdx f0, r5, r3 1128; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1129; CHECK-BE-NEXT: blr 1130; 1131; CHECK-P9-LABEL: testDoubleImm5: 1132; CHECK-P9: # %bb.0: # %entry 1133; CHECK-P9-NEXT: li r3, 1 1134; CHECK-P9-NEXT: rldic r3, r3, 38, 25 1135; CHECK-P9-NEXT: lfdx f0, r5, r3 1136; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1137; CHECK-P9-NEXT: blr 1138; 1139; AIX-P8-64-LABEL: testDoubleImm5: 1140; AIX-P8-64: # %bb.0: # %entry 1141; AIX-P8-64-NEXT: li r4, 1 1142; AIX-P8-64-NEXT: rldic r4, r4, 38, 25 1143; AIX-P8-64-NEXT: lfdx f0, r3, r4 1144; AIX-P8-64-NEXT: xxpermdi v2, vs0, v2, 1 1145; AIX-P8-64-NEXT: blr 1146; 1147; AIX-P8-32-LABEL: testDoubleImm5: 1148; AIX-P8-32: # %bb.0: # %entry 1149; AIX-P8-32-NEXT: lfd f0, 0(r3) 1150; AIX-P8-32-NEXT: xxpermdi v2, vs0, v2, 1 1151; AIX-P8-32-NEXT: blr 1152entry: 1153 %add.ptr = getelementptr inbounds i32, i32* %b, i64 68719476736 1154 %0 = bitcast i32* %add.ptr to double* 1155 %1 = load double, double* %0, align 8 1156 %vecins = insertelement <2 x double> %a, double %1, i32 0 1157 ret <2 x double> %vecins 1158} 1159 1160define dso_local <4 x float> @testInsertDoubleToFloat(<4 x float> %a, double %b) local_unnamed_addr #0 { 1161; CHECK-LABEL: testInsertDoubleToFloat: 1162; CHECK: # %bb.0: # %entry 1163; CHECK-NEXT: xscvdpsp f0, f1 1164; CHECK-NEXT: xxinsertw v2, vs0, 8 1165; CHECK-NEXT: blr 1166; 1167; CHECK-BE-LABEL: testInsertDoubleToFloat: 1168; CHECK-BE: # %bb.0: # %entry 1169; CHECK-BE-NEXT: xscvdpsp f0, f1 1170; CHECK-BE-NEXT: xxinsertw v2, vs0, 4 1171; CHECK-BE-NEXT: blr 1172; 1173; CHECK-P9-LABEL: testInsertDoubleToFloat: 1174; CHECK-P9: # %bb.0: # %entry 1175; CHECK-P9-NEXT: xscvdpsp f0, f1 1176; CHECK-P9-NEXT: xxinsertw v2, vs0, 4 1177; CHECK-P9-NEXT: blr 1178; 1179; AIX-P8-64-LABEL: testInsertDoubleToFloat: 1180; AIX-P8-64: # %bb.0: # %entry 1181; AIX-P8-64-NEXT: xsrsp f0, f1 1182; AIX-P8-64-NEXT: ld r3, L..C8(r2) # %const.0 1183; AIX-P8-64-NEXT: lxvw4x v4, 0, r3 1184; AIX-P8-64-NEXT: xscvdpspn v3, f0 1185; AIX-P8-64-NEXT: vperm v2, v2, v3, v4 1186; AIX-P8-64-NEXT: blr 1187; 1188; AIX-P8-32-LABEL: testInsertDoubleToFloat: 1189; AIX-P8-32: # %bb.0: # %entry 1190; AIX-P8-32-NEXT: xsrsp f0, f1 1191; AIX-P8-32-NEXT: lwz r3, L..C12(r2) # %const.0 1192; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 1193; AIX-P8-32-NEXT: xscvdpspn v3, f0 1194; AIX-P8-32-NEXT: vperm v2, v2, v3, v4 1195; AIX-P8-32-NEXT: blr 1196entry: 1197 %conv = fptrunc double %b to float 1198 %vecins = insertelement <4 x float> %a, float %conv, i32 1 1199 ret <4 x float> %vecins 1200} 1201