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: clrldi r4, r4, 60 43; AIX-P8-64-NEXT: addi r5, r1, -16 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: clrlwi r3, r6, 28 52; AIX-P8-32-NEXT: addi r5, r1, -16 53; AIX-P8-32-NEXT: stxvw4x v2, 0, r5 54; AIX-P8-32-NEXT: stbx r4, r5, r3 55; AIX-P8-32-NEXT: lxvw4x v2, 0, r5 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: rlwinm r4, r4, 1, 28, 30 90; AIX-P8-64-NEXT: addi r5, r1, -16 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: rlwinm r3, r6, 1, 28, 30 99; AIX-P8-32-NEXT: addi r5, r1, -16 100; AIX-P8-32-NEXT: stxvw4x v2, 0, r5 101; AIX-P8-32-NEXT: sthx r4, r5, r3 102; AIX-P8-32-NEXT: lxvw4x v2, 0, r5 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: rlwinm r4, r4, 2, 28, 29 137; AIX-P8-64-NEXT: addi r5, r1, -16 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: rlwinm r3, r6, 2, 28, 29 146; AIX-P8-32-NEXT: addi r5, r1, -16 147; AIX-P8-32-NEXT: stxvw4x v2, 0, r5 148; AIX-P8-32-NEXT: stwx r4, r5, r3 149; AIX-P8-32-NEXT: lxvw4x v2, 0, r5 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: lxvw4x v3, 0, r3 195; AIX-P8-32-NEXT: addi r3, r1, -16 196; AIX-P8-32-NEXT: lxvw4x v4, 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: rlwinm r4, r4, 3, 28, 28 236; AIX-P8-64-NEXT: addi r5, r1, -16 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, r1, -16 250; AIX-P8-32-NEXT: lxvw4x vs0, 0, r5 251; AIX-P8-32-NEXT: addi r5, r6, 1 252; AIX-P8-32-NEXT: rlwinm r5, r5, 2, 28, 29 253; AIX-P8-32-NEXT: stxvw4x vs0, 0, r3 254; AIX-P8-32-NEXT: stwx r4, r3, r5 255; AIX-P8-32-NEXT: lxvw4x v2, 0, r3 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: stw r3, -16(r1) 290; AIX-P8-32-NEXT: lwz r3, L..C2(r2) # %const.0 291; AIX-P8-32-NEXT: stw r4, -32(r1) 292; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 293; AIX-P8-32-NEXT: addi r3, r1, -16 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: vperm v2, v2, v4, v3 297; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 298; AIX-P8-32-NEXT: addi r3, r1, -32 299; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 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: stw r3, -16(r1) 333; AIX-P8-32-NEXT: lwz r3, L..C4(r2) # %const.0 334; AIX-P8-32-NEXT: stw r4, -32(r1) 335; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 336; AIX-P8-32-NEXT: addi r3, r1, -16 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: vperm v2, v4, v2, v3 340; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 341; AIX-P8-32-NEXT: addi r3, r1, -32 342; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 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: slwi r3, r6, 2 357; CHECK-NEXT: vinswvrx v2, r3, v3 358; CHECK-NEXT: blr 359; 360; CHECK-BE-LABEL: testFloat1: 361; CHECK-BE: # %bb.0: # %entry 362; CHECK-BE-NEXT: xscvdpspn v3, f1 363; CHECK-BE-NEXT: slwi r3, r6, 2 364; CHECK-BE-NEXT: vinswvlx v2, r3, v3 365; CHECK-BE-NEXT: blr 366; 367; CHECK-P9-LABEL: testFloat1: 368; CHECK-P9: # %bb.0: # %entry 369; CHECK-P9-NEXT: addi r4, r1, -16 370; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29 371; CHECK-P9-NEXT: stxv v2, -16(r1) 372; CHECK-P9-NEXT: stfsx f1, r4, r3 373; CHECK-P9-NEXT: lxv v2, -16(r1) 374; CHECK-P9-NEXT: blr 375; 376; AIX-P8-LABEL: testFloat1: 377; AIX-P8: # %bb.0: # %entry 378; AIX-P8-NEXT: rlwinm r3, r4, 2, 28, 29 379; AIX-P8-NEXT: addi r4, r1, -16 380; AIX-P8-NEXT: stxvw4x v2, 0, r4 381; AIX-P8-NEXT: stfsx f1, r4, r3 382; AIX-P8-NEXT: lxvw4x v2, 0, r4 383; AIX-P8-NEXT: blr 384entry: 385 %vecins = insertelement <4 x float> %a, float %b, i32 %idx1 386 ret <4 x float> %vecins 387} 388 389define <4 x float> @testFloat2(<4 x float> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) { 390; CHECK-LABEL: testFloat2: 391; CHECK: # %bb.0: # %entry 392; CHECK-NEXT: lwz r3, 0(r5) 393; CHECK-NEXT: slwi r4, r6, 2 394; CHECK-NEXT: vinswrx v2, r4, r3 395; CHECK-NEXT: lwz r3, 1(r5) 396; CHECK-NEXT: slwi r4, r7, 2 397; CHECK-NEXT: vinswrx v2, r4, r3 398; CHECK-NEXT: blr 399; 400; CHECK-BE-LABEL: testFloat2: 401; CHECK-BE: # %bb.0: # %entry 402; CHECK-BE-NEXT: lwz r3, 0(r5) 403; CHECK-BE-NEXT: slwi r4, r6, 2 404; CHECK-BE-NEXT: vinswlx v2, r4, r3 405; CHECK-BE-NEXT: lwz r3, 1(r5) 406; CHECK-BE-NEXT: slwi r4, r7, 2 407; CHECK-BE-NEXT: vinswlx v2, r4, r3 408; CHECK-BE-NEXT: blr 409; 410; CHECK-P9-LABEL: testFloat2: 411; CHECK-P9: # %bb.0: # %entry 412; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29 413; CHECK-P9-NEXT: lwz r6, 0(r5) 414; CHECK-P9-NEXT: rlwinm r3, r7, 2, 28, 29 415; CHECK-P9-NEXT: addi r7, r1, -16 416; CHECK-P9-NEXT: stxv v2, -16(r1) 417; CHECK-P9-NEXT: stwx r6, r7, r4 418; CHECK-P9-NEXT: lxv vs0, -16(r1) 419; CHECK-P9-NEXT: lwz r4, 1(r5) 420; CHECK-P9-NEXT: addi r5, r1, -32 421; CHECK-P9-NEXT: stxv vs0, -32(r1) 422; CHECK-P9-NEXT: stwx r4, r5, r3 423; CHECK-P9-NEXT: lxv v2, -32(r1) 424; CHECK-P9-NEXT: blr 425; 426; AIX-P8-LABEL: testFloat2: 427; AIX-P8: # %bb.0: # %entry 428; AIX-P8-NEXT: lwz r6, 0(r3) 429; AIX-P8-NEXT: rlwinm r4, r4, 2, 28, 29 430; AIX-P8-NEXT: addi r7, r1, -32 431; AIX-P8-NEXT: stxvw4x v2, 0, r7 432; AIX-P8-NEXT: rlwinm r5, r5, 2, 28, 29 433; AIX-P8-NEXT: stwx r6, r7, r4 434; AIX-P8-NEXT: addi r4, r1, -16 435; AIX-P8-NEXT: lxvw4x vs0, 0, r7 436; AIX-P8-NEXT: lwz r3, 1(r3) 437; AIX-P8-NEXT: stxvw4x vs0, 0, r4 438; AIX-P8-NEXT: stwx r3, r4, r5 439; AIX-P8-NEXT: lxvw4x v2, 0, r4 440; AIX-P8-NEXT: blr 441entry: 442 %add.ptr1 = getelementptr inbounds i8, ptr %b, i64 1 443 %0 = load float, ptr %b, align 4 444 %vecins = insertelement <4 x float> %a, float %0, i32 %idx1 445 %1 = load float, ptr %add.ptr1, align 4 446 %vecins2 = insertelement <4 x float> %vecins, float %1, i32 %idx2 447 ret <4 x float> %vecins2 448} 449 450define <4 x float> @testFloat3(<4 x float> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) { 451; CHECK-LABEL: testFloat3: 452; CHECK: # %bb.0: # %entry 453; CHECK-NEXT: plwz r3, 65536(r5), 0 454; CHECK-NEXT: slwi r4, r6, 2 455; CHECK-NEXT: vinswrx v2, r4, r3 456; CHECK-NEXT: li r3, 1 457; CHECK-NEXT: slwi r4, r7, 2 458; CHECK-NEXT: rldic r3, r3, 36, 27 459; CHECK-NEXT: lwzx r3, r5, r3 460; CHECK-NEXT: vinswrx v2, r4, r3 461; CHECK-NEXT: blr 462; 463; CHECK-BE-LABEL: testFloat3: 464; CHECK-BE: # %bb.0: # %entry 465; CHECK-BE-NEXT: plwz r3, 65536(r5), 0 466; CHECK-BE-NEXT: slwi r4, r6, 2 467; CHECK-BE-NEXT: vinswlx v2, r4, r3 468; CHECK-BE-NEXT: li r3, 1 469; CHECK-BE-NEXT: slwi r4, r7, 2 470; CHECK-BE-NEXT: rldic r3, r3, 36, 27 471; CHECK-BE-NEXT: lwzx r3, r5, r3 472; CHECK-BE-NEXT: vinswlx v2, r4, r3 473; CHECK-BE-NEXT: blr 474; 475; CHECK-P9-LABEL: testFloat3: 476; CHECK-P9: # %bb.0: # %entry 477; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29 478; CHECK-P9-NEXT: lis r6, 1 479; CHECK-P9-NEXT: rlwinm r3, r7, 2, 28, 29 480; CHECK-P9-NEXT: addi r7, r1, -16 481; CHECK-P9-NEXT: lwzx r6, r5, r6 482; CHECK-P9-NEXT: stxv v2, -16(r1) 483; CHECK-P9-NEXT: stwx r6, r7, r4 484; CHECK-P9-NEXT: li r4, 1 485; CHECK-P9-NEXT: lxv vs0, -16(r1) 486; CHECK-P9-NEXT: rldic r4, r4, 36, 27 487; CHECK-P9-NEXT: lwzx r4, r5, r4 488; CHECK-P9-NEXT: addi r5, r1, -32 489; CHECK-P9-NEXT: stxv vs0, -32(r1) 490; CHECK-P9-NEXT: stwx r4, r5, r3 491; CHECK-P9-NEXT: lxv v2, -32(r1) 492; CHECK-P9-NEXT: blr 493; 494; AIX-P8-64-LABEL: testFloat3: 495; AIX-P8-64: # %bb.0: # %entry 496; AIX-P8-64-NEXT: lis r6, 1 497; AIX-P8-64-NEXT: rlwinm r4, r4, 2, 28, 29 498; AIX-P8-64-NEXT: addi r7, r1, -32 499; AIX-P8-64-NEXT: rlwinm r5, r5, 2, 28, 29 500; AIX-P8-64-NEXT: lwzx r6, r3, r6 501; AIX-P8-64-NEXT: stxvw4x v2, 0, r7 502; AIX-P8-64-NEXT: stwx r6, r7, r4 503; AIX-P8-64-NEXT: li r4, 1 504; AIX-P8-64-NEXT: lxvw4x vs0, 0, r7 505; AIX-P8-64-NEXT: rldic r4, r4, 36, 27 506; AIX-P8-64-NEXT: lwzx r3, r3, r4 507; AIX-P8-64-NEXT: addi r4, r1, -16 508; AIX-P8-64-NEXT: stxvw4x vs0, 0, r4 509; AIX-P8-64-NEXT: stwx r3, r4, r5 510; AIX-P8-64-NEXT: lxvw4x v2, 0, r4 511; AIX-P8-64-NEXT: blr 512; 513; AIX-P8-32-LABEL: testFloat3: 514; AIX-P8-32: # %bb.0: # %entry 515; AIX-P8-32-NEXT: lis r6, 1 516; AIX-P8-32-NEXT: rlwinm r4, r4, 2, 28, 29 517; AIX-P8-32-NEXT: addi r7, r1, -32 518; AIX-P8-32-NEXT: rlwinm r5, r5, 2, 28, 29 519; AIX-P8-32-NEXT: lwzx r6, r3, r6 520; AIX-P8-32-NEXT: stxvw4x v2, 0, r7 521; AIX-P8-32-NEXT: stwx r6, r7, r4 522; AIX-P8-32-NEXT: addi r4, r1, -16 523; AIX-P8-32-NEXT: lxvw4x vs0, 0, r7 524; AIX-P8-32-NEXT: lwz r3, 0(r3) 525; AIX-P8-32-NEXT: stxvw4x vs0, 0, r4 526; AIX-P8-32-NEXT: stwx r3, r4, r5 527; AIX-P8-32-NEXT: lxvw4x v2, 0, r4 528; AIX-P8-32-NEXT: blr 529entry: 530 %add.ptr = getelementptr inbounds i8, ptr %b, i64 65536 531 %add.ptr1 = getelementptr inbounds i8, ptr %b, i64 68719476736 532 %0 = load float, ptr %add.ptr, align 4 533 %vecins = insertelement <4 x float> %a, float %0, i32 %idx1 534 %1 = load float, ptr %add.ptr1, align 4 535 %vecins2 = insertelement <4 x float> %vecins, float %1, i32 %idx2 536 ret <4 x float> %vecins2 537} 538 539; Float immediate 540 541define <4 x float> @testFloatImm1(<4 x float> %a, float %b) { 542; CHECK-LABEL: testFloatImm1: 543; CHECK: # %bb.0: # %entry 544; CHECK-NEXT: xscvdpspn vs0, f1 545; CHECK-NEXT: xxinsertw v2, vs0, 12 546; CHECK-NEXT: xxinsertw v2, vs0, 4 547; CHECK-NEXT: blr 548; 549; CHECK-BE-LABEL: testFloatImm1: 550; CHECK-BE: # %bb.0: # %entry 551; CHECK-BE-NEXT: xscvdpspn vs0, f1 552; CHECK-BE-NEXT: xxinsertw v2, vs0, 0 553; CHECK-BE-NEXT: xxinsertw v2, vs0, 8 554; CHECK-BE-NEXT: blr 555; 556; CHECK-P9-LABEL: testFloatImm1: 557; CHECK-P9: # %bb.0: # %entry 558; CHECK-P9-NEXT: xscvdpspn vs0, f1 559; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 560; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 561; CHECK-P9-NEXT: blr 562; 563; AIX-P8-64-LABEL: testFloatImm1: 564; AIX-P8-64: # %bb.0: # %entry 565; AIX-P8-64-NEXT: ld r3, L..C2(r2) # %const.0 566; AIX-P8-64-NEXT: xscvdpspn v4, f1 567; AIX-P8-64-NEXT: lxvw4x v3, 0, r3 568; AIX-P8-64-NEXT: ld r3, L..C3(r2) # %const.1 569; AIX-P8-64-NEXT: vperm v2, v4, v2, v3 570; AIX-P8-64-NEXT: lxvw4x v3, 0, r3 571; AIX-P8-64-NEXT: vperm v2, v2, v4, v3 572; AIX-P8-64-NEXT: blr 573; 574; AIX-P8-32-LABEL: testFloatImm1: 575; AIX-P8-32: # %bb.0: # %entry 576; AIX-P8-32-NEXT: lwz r3, L..C6(r2) # %const.0 577; AIX-P8-32-NEXT: xscvdpspn v4, f1 578; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 579; AIX-P8-32-NEXT: lwz r3, L..C7(r2) # %const.1 580; AIX-P8-32-NEXT: vperm v2, v4, v2, v3 581; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 582; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 583; AIX-P8-32-NEXT: blr 584entry: 585 %vecins = insertelement <4 x float> %a, float %b, i32 0 586 %vecins1 = insertelement <4 x float> %vecins, float %b, i32 2 587 ret <4 x float> %vecins1 588} 589 590define <4 x float> @testFloatImm2(<4 x float> %a, ptr %b) { 591; CHECK-LABEL: testFloatImm2: 592; CHECK: # %bb.0: # %entry 593; CHECK-NEXT: lwz r3, 0(r5) 594; CHECK-NEXT: vinsw v2, r3, 12 595; CHECK-NEXT: lwz r3, 4(r5) 596; CHECK-NEXT: vinsw v2, r3, 4 597; CHECK-NEXT: blr 598; 599; CHECK-BE-LABEL: testFloatImm2: 600; CHECK-BE: # %bb.0: # %entry 601; CHECK-BE-NEXT: lwz r3, 0(r5) 602; CHECK-BE-NEXT: vinsw v2, r3, 0 603; CHECK-BE-NEXT: lwz r3, 4(r5) 604; CHECK-BE-NEXT: vinsw v2, r3, 8 605; CHECK-BE-NEXT: blr 606; 607; CHECK-P9-LABEL: testFloatImm2: 608; CHECK-P9: # %bb.0: # %entry 609; CHECK-P9-NEXT: lwz r3, 0(r5) 610; CHECK-P9-NEXT: mtfprwz f0, r3 611; CHECK-P9-NEXT: lwz r3, 4(r5) 612; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 613; CHECK-P9-NEXT: mtfprwz f0, r3 614; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 615; CHECK-P9-NEXT: blr 616; 617; AIX-P8-64-LABEL: testFloatImm2: 618; AIX-P8-64: # %bb.0: # %entry 619; AIX-P8-64-NEXT: ld r4, L..C4(r2) # %const.0 620; AIX-P8-64-NEXT: lxsiwzx v4, 0, r3 621; AIX-P8-64-NEXT: lxvw4x v3, 0, r4 622; AIX-P8-64-NEXT: li r4, 4 623; AIX-P8-64-NEXT: vperm v2, v4, v2, v3 624; AIX-P8-64-NEXT: lxsiwzx v3, r3, r4 625; AIX-P8-64-NEXT: ld r3, L..C5(r2) # %const.1 626; AIX-P8-64-NEXT: lxvw4x v4, 0, r3 627; AIX-P8-64-NEXT: vperm v2, v2, v3, v4 628; AIX-P8-64-NEXT: blr 629; 630; AIX-P8-32-LABEL: testFloatImm2: 631; AIX-P8-32: # %bb.0: # %entry 632; AIX-P8-32-NEXT: lwz r4, L..C8(r2) # %const.0 633; AIX-P8-32-NEXT: lxsiwzx v4, 0, r3 634; AIX-P8-32-NEXT: lxvw4x v3, 0, r4 635; AIX-P8-32-NEXT: li r4, 4 636; AIX-P8-32-NEXT: vperm v2, v4, v2, v3 637; AIX-P8-32-NEXT: lxsiwzx v3, r3, r4 638; AIX-P8-32-NEXT: lwz r3, L..C9(r2) # %const.1 639; AIX-P8-32-NEXT: lxvw4x v4, 0, r3 640; AIX-P8-32-NEXT: vperm v2, v2, v3, v4 641; AIX-P8-32-NEXT: blr 642entry: 643 %add.ptr1 = getelementptr inbounds i32, ptr %b, i64 1 644 %0 = load float, ptr %b, align 4 645 %vecins = insertelement <4 x float> %a, float %0, i32 0 646 %1 = load float, ptr %add.ptr1, align 4 647 %vecins2 = insertelement <4 x float> %vecins, float %1, i32 2 648 ret <4 x float> %vecins2 649} 650 651define <4 x float> @testFloatImm3(<4 x float> %a, ptr %b) { 652; CHECK-LABEL: testFloatImm3: 653; CHECK: # %bb.0: # %entry 654; CHECK-NEXT: plwz r3, 262144(r5), 0 655; CHECK-NEXT: vinsw v2, r3, 12 656; CHECK-NEXT: li r3, 1 657; CHECK-NEXT: rldic r3, r3, 38, 25 658; CHECK-NEXT: lwzx r3, r5, r3 659; CHECK-NEXT: vinsw v2, r3, 4 660; CHECK-NEXT: blr 661; 662; CHECK-BE-LABEL: testFloatImm3: 663; CHECK-BE: # %bb.0: # %entry 664; CHECK-BE-NEXT: plwz r3, 262144(r5), 0 665; CHECK-BE-NEXT: vinsw v2, r3, 0 666; CHECK-BE-NEXT: li r3, 1 667; CHECK-BE-NEXT: rldic r3, r3, 38, 25 668; CHECK-BE-NEXT: lwzx r3, r5, r3 669; CHECK-BE-NEXT: vinsw v2, r3, 8 670; CHECK-BE-NEXT: blr 671; 672; CHECK-P9-LABEL: testFloatImm3: 673; CHECK-P9: # %bb.0: # %entry 674; CHECK-P9-NEXT: lis r3, 4 675; CHECK-P9-NEXT: lwzx r3, r5, r3 676; CHECK-P9-NEXT: mtfprwz f0, r3 677; CHECK-P9-NEXT: li r3, 1 678; CHECK-P9-NEXT: rldic r3, r3, 38, 25 679; CHECK-P9-NEXT: xxinsertw v2, vs0, 0 680; CHECK-P9-NEXT: lwzx r3, r5, r3 681; CHECK-P9-NEXT: mtfprwz f0, r3 682; CHECK-P9-NEXT: xxinsertw v2, vs0, 8 683; CHECK-P9-NEXT: blr 684; 685; AIX-P8-64-LABEL: testFloatImm3: 686; AIX-P8-64: # %bb.0: # %entry 687; AIX-P8-64-NEXT: lis r4, 4 688; AIX-P8-64-NEXT: lxsiwzx v3, r3, r4 689; AIX-P8-64-NEXT: ld r4, L..C6(r2) # %const.0 690; AIX-P8-64-NEXT: lxvw4x v4, 0, r4 691; AIX-P8-64-NEXT: li r4, 1 692; AIX-P8-64-NEXT: rldic r4, r4, 38, 25 693; AIX-P8-64-NEXT: vperm v2, v3, v2, v4 694; AIX-P8-64-NEXT: lxsiwzx v3, r3, r4 695; AIX-P8-64-NEXT: ld r3, L..C7(r2) # %const.1 696; AIX-P8-64-NEXT: lxvw4x v4, 0, r3 697; AIX-P8-64-NEXT: vperm v2, v2, v3, v4 698; AIX-P8-64-NEXT: blr 699; 700; AIX-P8-32-LABEL: testFloatImm3: 701; AIX-P8-32: # %bb.0: # %entry 702; AIX-P8-32-NEXT: lis r4, 4 703; AIX-P8-32-NEXT: lxsiwzx v3, r3, r4 704; AIX-P8-32-NEXT: lwz r4, L..C10(r2) # %const.0 705; AIX-P8-32-NEXT: lxvw4x v4, 0, r4 706; AIX-P8-32-NEXT: lwz r4, L..C11(r2) # %const.1 707; AIX-P8-32-NEXT: vperm v2, v3, v2, v4 708; AIX-P8-32-NEXT: lxvw4x v3, 0, r4 709; AIX-P8-32-NEXT: lxsiwzx v4, 0, r3 710; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 711; AIX-P8-32-NEXT: blr 712entry: 713 %add.ptr = getelementptr inbounds i32, ptr %b, i64 65536 714 %add.ptr1 = getelementptr inbounds i32, ptr %b, i64 68719476736 715 %0 = load float, ptr %add.ptr, align 4 716 %vecins = insertelement <4 x float> %a, float %0, i32 0 717 %1 = load float, ptr %add.ptr1, align 4 718 %vecins2 = insertelement <4 x float> %vecins, float %1, i32 2 719 ret <4 x float> %vecins2 720} 721 722; Double indexed 723 724define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) { 725; CHECK-LABEL: testDouble1: 726; CHECK: # %bb.0: # %entry 727; CHECK-NEXT: mffprd r3, f1 728; CHECK-NEXT: rlwinm r4, r6, 3, 0, 28 729; CHECK-NEXT: vinsdrx v2, r4, r3 730; CHECK-NEXT: blr 731; 732; CHECK-BE-LABEL: testDouble1: 733; CHECK-BE: # %bb.0: # %entry 734; CHECK-BE-NEXT: mffprd r3, f1 735; CHECK-BE-NEXT: rlwinm r4, r6, 3, 0, 28 736; CHECK-BE-NEXT: vinsdlx v2, r4, r3 737; CHECK-BE-NEXT: blr 738; 739; CHECK-P9-LABEL: testDouble1: 740; CHECK-P9: # %bb.0: # %entry 741; CHECK-P9-NEXT: addi r4, r1, -16 742; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28 743; CHECK-P9-NEXT: stxv v2, -16(r1) 744; CHECK-P9-NEXT: stfdx f1, r4, r3 745; CHECK-P9-NEXT: lxv v2, -16(r1) 746; CHECK-P9-NEXT: blr 747; 748; AIX-P8-64-LABEL: testDouble1: 749; AIX-P8-64: # %bb.0: # %entry 750; AIX-P8-64-NEXT: rlwinm r3, r4, 3, 28, 28 751; AIX-P8-64-NEXT: addi r4, r1, -16 752; AIX-P8-64-NEXT: stxvd2x v2, 0, r4 753; AIX-P8-64-NEXT: stfdx f1, r4, r3 754; AIX-P8-64-NEXT: lxvd2x v2, 0, r4 755; AIX-P8-64-NEXT: blr 756; 757; AIX-P8-32-LABEL: testDouble1: 758; AIX-P8-32: # %bb.0: # %entry 759; AIX-P8-32-NEXT: rlwinm r3, r5, 3, 28, 28 760; AIX-P8-32-NEXT: addi r4, r1, -16 761; AIX-P8-32-NEXT: stxvd2x v2, 0, r4 762; AIX-P8-32-NEXT: stfdx f1, r4, r3 763; AIX-P8-32-NEXT: lxvd2x v2, 0, r4 764; AIX-P8-32-NEXT: blr 765entry: 766 %vecins = insertelement <2 x double> %a, double %b, i32 %idx1 767 ret <2 x double> %vecins 768} 769 770define <2 x double> @testDouble2(<2 x double> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) { 771; CHECK-LABEL: testDouble2: 772; CHECK: # %bb.0: # %entry 773; CHECK-NEXT: ld r3, 0(r5) 774; CHECK-NEXT: rlwinm r4, r6, 3, 0, 28 775; CHECK-NEXT: vinsdrx v2, r4, r3 776; CHECK-NEXT: pld r3, 1(r5), 0 777; CHECK-NEXT: rlwinm r4, r7, 3, 0, 28 778; CHECK-NEXT: vinsdrx v2, r4, r3 779; CHECK-NEXT: blr 780; 781; CHECK-BE-LABEL: testDouble2: 782; CHECK-BE: # %bb.0: # %entry 783; CHECK-BE-NEXT: ld r3, 0(r5) 784; CHECK-BE-NEXT: rlwinm r4, r6, 3, 0, 28 785; CHECK-BE-NEXT: vinsdlx v2, r4, r3 786; CHECK-BE-NEXT: pld r3, 1(r5), 0 787; CHECK-BE-NEXT: rlwinm r4, r7, 3, 0, 28 788; CHECK-BE-NEXT: vinsdlx v2, r4, r3 789; CHECK-BE-NEXT: blr 790; 791; CHECK-P9-LABEL: testDouble2: 792; CHECK-P9: # %bb.0: # %entry 793; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28 794; CHECK-P9-NEXT: ld r6, 0(r5) 795; CHECK-P9-NEXT: rlwinm r3, r7, 3, 28, 28 796; CHECK-P9-NEXT: addi r7, r1, -32 797; CHECK-P9-NEXT: stxv v2, -32(r1) 798; CHECK-P9-NEXT: stdx r6, r7, r4 799; CHECK-P9-NEXT: li r4, 1 800; CHECK-P9-NEXT: lxv vs0, -32(r1) 801; CHECK-P9-NEXT: ldx r4, r5, r4 802; CHECK-P9-NEXT: addi r5, r1, -16 803; CHECK-P9-NEXT: stxv vs0, -16(r1) 804; CHECK-P9-NEXT: stdx r4, r5, r3 805; CHECK-P9-NEXT: lxv v2, -16(r1) 806; CHECK-P9-NEXT: blr 807; 808; AIX-P8-64-LABEL: testDouble2: 809; AIX-P8-64: # %bb.0: # %entry 810; AIX-P8-64-NEXT: ld r6, 0(r3) 811; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28 812; AIX-P8-64-NEXT: addi r7, r1, -32 813; AIX-P8-64-NEXT: stxvd2x v2, 0, r7 814; AIX-P8-64-NEXT: rlwinm r5, r5, 3, 28, 28 815; AIX-P8-64-NEXT: stdx r6, r7, r4 816; AIX-P8-64-NEXT: li r4, 1 817; AIX-P8-64-NEXT: lxvd2x vs0, 0, r7 818; AIX-P8-64-NEXT: ldx r3, r3, r4 819; AIX-P8-64-NEXT: addi r4, r1, -16 820; AIX-P8-64-NEXT: stxvd2x vs0, 0, r4 821; AIX-P8-64-NEXT: stdx r3, r4, r5 822; AIX-P8-64-NEXT: lxvd2x v2, 0, r4 823; AIX-P8-64-NEXT: blr 824; 825; AIX-P8-32-LABEL: testDouble2: 826; AIX-P8-32: # %bb.0: # %entry 827; AIX-P8-32-NEXT: lfd f0, 0(r3) 828; AIX-P8-32-NEXT: rlwinm r4, r4, 3, 28, 28 829; AIX-P8-32-NEXT: addi r6, r1, -32 830; AIX-P8-32-NEXT: rlwinm r5, r5, 3, 28, 28 831; AIX-P8-32-NEXT: stxvd2x v2, 0, r6 832; AIX-P8-32-NEXT: stfdx f0, r6, r4 833; AIX-P8-32-NEXT: lxvd2x vs0, 0, r6 834; AIX-P8-32-NEXT: lfd f1, 1(r3) 835; AIX-P8-32-NEXT: addi r3, r1, -16 836; AIX-P8-32-NEXT: stxvd2x vs0, 0, r3 837; AIX-P8-32-NEXT: stfdx f1, r3, r5 838; AIX-P8-32-NEXT: lxvd2x v2, 0, r3 839; AIX-P8-32-NEXT: blr 840entry: 841 %add.ptr1 = getelementptr inbounds i8, ptr %b, i64 1 842 %0 = load double, ptr %b, align 8 843 %vecins = insertelement <2 x double> %a, double %0, i32 %idx1 844 %1 = load double, ptr %add.ptr1, align 8 845 %vecins2 = insertelement <2 x double> %vecins, double %1, i32 %idx2 846 ret <2 x double> %vecins2 847} 848 849define <2 x double> @testDouble3(<2 x double> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) { 850; CHECK-LABEL: testDouble3: 851; CHECK: # %bb.0: # %entry 852; CHECK-NEXT: pld r3, 65536(r5), 0 853; CHECK-NEXT: rlwinm r4, r6, 3, 0, 28 854; CHECK-NEXT: vinsdrx v2, r4, r3 855; CHECK-NEXT: li r3, 1 856; CHECK-NEXT: rlwinm r4, r7, 3, 0, 28 857; CHECK-NEXT: rldic r3, r3, 36, 27 858; CHECK-NEXT: ldx r3, r5, r3 859; CHECK-NEXT: vinsdrx v2, r4, r3 860; CHECK-NEXT: blr 861; 862; CHECK-BE-LABEL: testDouble3: 863; CHECK-BE: # %bb.0: # %entry 864; CHECK-BE-NEXT: pld r3, 65536(r5), 0 865; CHECK-BE-NEXT: rlwinm r4, r6, 3, 0, 28 866; CHECK-BE-NEXT: vinsdlx v2, r4, r3 867; CHECK-BE-NEXT: li r3, 1 868; CHECK-BE-NEXT: rlwinm r4, r7, 3, 0, 28 869; CHECK-BE-NEXT: rldic r3, r3, 36, 27 870; CHECK-BE-NEXT: ldx r3, r5, r3 871; CHECK-BE-NEXT: vinsdlx v2, r4, r3 872; CHECK-BE-NEXT: blr 873; 874; CHECK-P9-LABEL: testDouble3: 875; CHECK-P9: # %bb.0: # %entry 876; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28 877; CHECK-P9-NEXT: lis r6, 1 878; CHECK-P9-NEXT: rlwinm r3, r7, 3, 28, 28 879; CHECK-P9-NEXT: addi r7, r1, -32 880; CHECK-P9-NEXT: ldx r6, r5, r6 881; CHECK-P9-NEXT: stxv v2, -32(r1) 882; CHECK-P9-NEXT: stdx r6, r7, r4 883; CHECK-P9-NEXT: li r4, 1 884; CHECK-P9-NEXT: lxv vs0, -32(r1) 885; CHECK-P9-NEXT: rldic r4, r4, 36, 27 886; CHECK-P9-NEXT: ldx r4, r5, r4 887; CHECK-P9-NEXT: addi r5, r1, -16 888; CHECK-P9-NEXT: stxv vs0, -16(r1) 889; CHECK-P9-NEXT: stdx r4, r5, r3 890; CHECK-P9-NEXT: lxv v2, -16(r1) 891; CHECK-P9-NEXT: blr 892; 893; AIX-P8-64-LABEL: testDouble3: 894; AIX-P8-64: # %bb.0: # %entry 895; AIX-P8-64-NEXT: lis r6, 1 896; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28 897; AIX-P8-64-NEXT: addi r7, r1, -32 898; AIX-P8-64-NEXT: rlwinm r5, r5, 3, 28, 28 899; AIX-P8-64-NEXT: ldx r6, r3, r6 900; AIX-P8-64-NEXT: stxvd2x v2, 0, r7 901; AIX-P8-64-NEXT: stdx r6, r7, r4 902; AIX-P8-64-NEXT: li r4, 1 903; AIX-P8-64-NEXT: lxvd2x vs0, 0, r7 904; AIX-P8-64-NEXT: rldic r4, r4, 36, 27 905; AIX-P8-64-NEXT: ldx r3, r3, r4 906; AIX-P8-64-NEXT: addi r4, r1, -16 907; AIX-P8-64-NEXT: stxvd2x vs0, 0, r4 908; AIX-P8-64-NEXT: stdx r3, r4, r5 909; AIX-P8-64-NEXT: lxvd2x v2, 0, r4 910; AIX-P8-64-NEXT: blr 911; 912; AIX-P8-32-LABEL: testDouble3: 913; AIX-P8-32: # %bb.0: # %entry 914; AIX-P8-32-NEXT: lis r6, 1 915; AIX-P8-32-NEXT: rlwinm r4, r4, 3, 28, 28 916; AIX-P8-32-NEXT: rlwinm r5, r5, 3, 28, 28 917; AIX-P8-32-NEXT: lfdx f0, r3, r6 918; AIX-P8-32-NEXT: addi r6, r1, -32 919; AIX-P8-32-NEXT: stxvd2x v2, 0, r6 920; AIX-P8-32-NEXT: stfdx f0, r6, r4 921; AIX-P8-32-NEXT: lxvd2x vs0, 0, r6 922; AIX-P8-32-NEXT: lfd f1, 0(r3) 923; AIX-P8-32-NEXT: addi r3, r1, -16 924; AIX-P8-32-NEXT: stxvd2x vs0, 0, r3 925; AIX-P8-32-NEXT: stfdx f1, r3, r5 926; AIX-P8-32-NEXT: lxvd2x v2, 0, r3 927; AIX-P8-32-NEXT: blr 928entry: 929 %add.ptr = getelementptr inbounds i8, ptr %b, i64 65536 930 %add.ptr1 = getelementptr inbounds i8, ptr %b, i64 68719476736 931 %0 = load double, ptr %add.ptr, align 8 932 %vecins = insertelement <2 x double> %a, double %0, i32 %idx1 933 %1 = load double, ptr %add.ptr1, align 8 934 %vecins2 = insertelement <2 x double> %vecins, double %1, i32 %idx2 935 ret <2 x double> %vecins2 936} 937 938; Double immediate 939 940define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) { 941; CHECK-LABEL: testDoubleImm1: 942; CHECK: # %bb.0: # %entry 943; CHECK-NEXT: xxmrghd v2, v2, vs1 944; CHECK-NEXT: blr 945; 946; CHECK-BE-LABEL: testDoubleImm1: 947; CHECK-BE: # %bb.0: # %entry 948; CHECK-BE-NEXT: xxpermdi v2, vs1, v2, 1 949; CHECK-BE-NEXT: blr 950; 951; CHECK-P9-LABEL: testDoubleImm1: 952; CHECK-P9: # %bb.0: # %entry 953; CHECK-P9-NEXT: xxpermdi v2, vs1, v2, 1 954; CHECK-P9-NEXT: blr 955; 956; AIX-P8-LABEL: testDoubleImm1: 957; AIX-P8: # %bb.0: # %entry 958; AIX-P8-NEXT: xxpermdi v2, vs1, v2, 1 959; AIX-P8-NEXT: blr 960entry: 961 %vecins = insertelement <2 x double> %a, double %b, i32 0 962 ret <2 x double> %vecins 963} 964 965define <2 x double> @testDoubleImm2(<2 x double> %a, ptr %b) { 966; CHECK-LABEL: testDoubleImm2: 967; CHECK: # %bb.0: # %entry 968; CHECK-NEXT: lfd f0, 0(r5) 969; CHECK-NEXT: xxmrghd v2, v2, vs0 970; CHECK-NEXT: blr 971; 972; CHECK-BE-LABEL: testDoubleImm2: 973; CHECK-BE: # %bb.0: # %entry 974; CHECK-BE-NEXT: lfd f0, 0(r5) 975; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 976; CHECK-BE-NEXT: blr 977; 978; CHECK-P9-LABEL: testDoubleImm2: 979; CHECK-P9: # %bb.0: # %entry 980; CHECK-P9-NEXT: lfd f0, 0(r5) 981; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 982; CHECK-P9-NEXT: blr 983; 984; AIX-P8-LABEL: testDoubleImm2: 985; AIX-P8: # %bb.0: # %entry 986; AIX-P8-NEXT: lfd f0, 0(r3) 987; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1 988; AIX-P8-NEXT: blr 989entry: 990 %0 = load double, ptr %b, align 8 991 %vecins = insertelement <2 x double> %a, double %0, i32 0 992 ret <2 x double> %vecins 993} 994 995define <2 x double> @testDoubleImm3(<2 x double> %a, ptr %b) { 996; CHECK-LABEL: testDoubleImm3: 997; CHECK: # %bb.0: # %entry 998; CHECK-NEXT: lfd f0, 4(r5) 999; CHECK-NEXT: xxmrghd v2, v2, vs0 1000; CHECK-NEXT: blr 1001; 1002; CHECK-BE-LABEL: testDoubleImm3: 1003; CHECK-BE: # %bb.0: # %entry 1004; CHECK-BE-NEXT: lfd f0, 4(r5) 1005; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1006; CHECK-BE-NEXT: blr 1007; 1008; CHECK-P9-LABEL: testDoubleImm3: 1009; CHECK-P9: # %bb.0: # %entry 1010; CHECK-P9-NEXT: lfd f0, 4(r5) 1011; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1012; CHECK-P9-NEXT: blr 1013; 1014; AIX-P8-LABEL: testDoubleImm3: 1015; AIX-P8: # %bb.0: # %entry 1016; AIX-P8-NEXT: lfd f0, 4(r3) 1017; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1 1018; AIX-P8-NEXT: blr 1019entry: 1020 %add.ptr = getelementptr inbounds i32, ptr %b, i64 1 1021 %0 = load double, ptr %add.ptr, align 8 1022 %vecins = insertelement <2 x double> %a, double %0, i32 0 1023 ret <2 x double> %vecins 1024} 1025 1026define <2 x double> @testDoubleImm4(<2 x double> %a, ptr %b) { 1027; CHECK-LABEL: testDoubleImm4: 1028; CHECK: # %bb.0: # %entry 1029; CHECK-NEXT: plfd f0, 262144(r5), 0 1030; CHECK-NEXT: xxmrghd v2, v2, vs0 1031; CHECK-NEXT: blr 1032; 1033; CHECK-BE-LABEL: testDoubleImm4: 1034; CHECK-BE: # %bb.0: # %entry 1035; CHECK-BE-NEXT: plfd f0, 262144(r5), 0 1036; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1037; CHECK-BE-NEXT: blr 1038; 1039; CHECK-P9-LABEL: testDoubleImm4: 1040; CHECK-P9: # %bb.0: # %entry 1041; CHECK-P9-NEXT: lis r3, 4 1042; CHECK-P9-NEXT: lfdx f0, r5, r3 1043; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1044; CHECK-P9-NEXT: blr 1045; 1046; AIX-P8-LABEL: testDoubleImm4: 1047; AIX-P8: # %bb.0: # %entry 1048; AIX-P8-NEXT: lis r4, 4 1049; AIX-P8-NEXT: lfdx f0, r3, r4 1050; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1 1051; AIX-P8-NEXT: blr 1052entry: 1053 %add.ptr = getelementptr inbounds i32, ptr %b, i64 65536 1054 %0 = load double, ptr %add.ptr, align 8 1055 %vecins = insertelement <2 x double> %a, double %0, i32 0 1056 ret <2 x double> %vecins 1057} 1058 1059define <2 x double> @testDoubleImm5(<2 x double> %a, ptr %b) { 1060; CHECK-LABEL: testDoubleImm5: 1061; CHECK: # %bb.0: # %entry 1062; CHECK-NEXT: li r3, 1 1063; CHECK-NEXT: rldic r3, r3, 38, 25 1064; CHECK-NEXT: lfdx f0, r5, r3 1065; CHECK-NEXT: xxmrghd v2, v2, vs0 1066; CHECK-NEXT: blr 1067; 1068; CHECK-BE-LABEL: testDoubleImm5: 1069; CHECK-BE: # %bb.0: # %entry 1070; CHECK-BE-NEXT: li r3, 1 1071; CHECK-BE-NEXT: rldic r3, r3, 38, 25 1072; CHECK-BE-NEXT: lfdx f0, r5, r3 1073; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1 1074; CHECK-BE-NEXT: blr 1075; 1076; CHECK-P9-LABEL: testDoubleImm5: 1077; CHECK-P9: # %bb.0: # %entry 1078; CHECK-P9-NEXT: li r3, 1 1079; CHECK-P9-NEXT: rldic r3, r3, 38, 25 1080; CHECK-P9-NEXT: lfdx f0, r5, r3 1081; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1 1082; CHECK-P9-NEXT: blr 1083; 1084; AIX-P8-64-LABEL: testDoubleImm5: 1085; AIX-P8-64: # %bb.0: # %entry 1086; AIX-P8-64-NEXT: li r4, 1 1087; AIX-P8-64-NEXT: rldic r4, r4, 38, 25 1088; AIX-P8-64-NEXT: lfdx f0, r3, r4 1089; AIX-P8-64-NEXT: xxpermdi v2, vs0, v2, 1 1090; AIX-P8-64-NEXT: blr 1091; 1092; AIX-P8-32-LABEL: testDoubleImm5: 1093; AIX-P8-32: # %bb.0: # %entry 1094; AIX-P8-32-NEXT: lfd f0, 0(r3) 1095; AIX-P8-32-NEXT: xxpermdi v2, vs0, v2, 1 1096; AIX-P8-32-NEXT: blr 1097entry: 1098 %add.ptr = getelementptr inbounds i32, ptr %b, i64 68719476736 1099 %0 = load double, ptr %add.ptr, align 8 1100 %vecins = insertelement <2 x double> %a, double %0, i32 0 1101 ret <2 x double> %vecins 1102} 1103 1104define dso_local <4 x float> @testInsertDoubleToFloat(<4 x float> %a, double %b) local_unnamed_addr #0 { 1105; CHECK-LABEL: testInsertDoubleToFloat: 1106; CHECK: # %bb.0: # %entry 1107; CHECK-NEXT: xscvdpsp f0, f1 1108; CHECK-NEXT: xxinsertw v2, vs0, 8 1109; CHECK-NEXT: blr 1110; 1111; CHECK-BE-LABEL: testInsertDoubleToFloat: 1112; CHECK-BE: # %bb.0: # %entry 1113; CHECK-BE-NEXT: xscvdpsp f0, f1 1114; CHECK-BE-NEXT: xxinsertw v2, vs0, 4 1115; CHECK-BE-NEXT: blr 1116; 1117; CHECK-P9-LABEL: testInsertDoubleToFloat: 1118; CHECK-P9: # %bb.0: # %entry 1119; CHECK-P9-NEXT: xscvdpsp f0, f1 1120; CHECK-P9-NEXT: xxinsertw v2, vs0, 4 1121; CHECK-P9-NEXT: blr 1122; 1123; AIX-P8-64-LABEL: testInsertDoubleToFloat: 1124; AIX-P8-64: # %bb.0: # %entry 1125; AIX-P8-64-NEXT: xsrsp f0, f1 1126; AIX-P8-64-NEXT: ld r3, L..C8(r2) # %const.0 1127; AIX-P8-64-NEXT: lxvw4x v3, 0, r3 1128; AIX-P8-64-NEXT: xscvdpspn v4, f0 1129; AIX-P8-64-NEXT: vperm v2, v2, v4, v3 1130; AIX-P8-64-NEXT: blr 1131; 1132; AIX-P8-32-LABEL: testInsertDoubleToFloat: 1133; AIX-P8-32: # %bb.0: # %entry 1134; AIX-P8-32-NEXT: xsrsp f0, f1 1135; AIX-P8-32-NEXT: lwz r3, L..C12(r2) # %const.0 1136; AIX-P8-32-NEXT: lxvw4x v3, 0, r3 1137; AIX-P8-32-NEXT: xscvdpspn v4, f0 1138; AIX-P8-32-NEXT: vperm v2, v2, v4, v3 1139; AIX-P8-32-NEXT: blr 1140entry: 1141 %conv = fptrunc double %b to float 1142 %vecins = insertelement <4 x float> %a, float %conv, i32 1 1143 ret <4 x float> %vecins 1144} 1145