1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 < %s | FileCheck %s -check-prefix=CHECK-64 3; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 < %s | FileCheck %s -check-prefix=CHECK-32 4; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff -vec-extabi -mcpu=pwr10 < %s | FileCheck %s -check-prefix=CHECK-64-P10 5; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix-xcoff -vec-extabi -mcpu=pwr10 < %s | FileCheck %s -check-prefix=CHECK-32-P10 6 7; Byte indexed 8 9define <16 x i8> @testByte(<16 x i8> %a, i64 %b, i64 %idx) { 10; CHECK-64-LABEL: testByte: 11; CHECK-64: # %bb.0: # %entry 12; CHECK-64-NEXT: addi 5, 1, -16 13; CHECK-64-NEXT: clrldi 4, 4, 60 14; CHECK-64-NEXT: stxv 34, -16(1) 15; CHECK-64-NEXT: stbx 3, 5, 4 16; CHECK-64-NEXT: lxv 34, -16(1) 17; CHECK-64-NEXT: blr 18; 19; CHECK-32-LABEL: testByte: 20; CHECK-32: # %bb.0: # %entry 21; CHECK-32-NEXT: addi 5, 1, -16 22; CHECK-32-NEXT: clrlwi 3, 6, 28 23; CHECK-32-NEXT: stxv 34, -16(1) 24; CHECK-32-NEXT: stbx 4, 5, 3 25; CHECK-32-NEXT: lxv 34, -16(1) 26; CHECK-32-NEXT: blr 27; 28; CHECK-64-P10-LABEL: testByte: 29; CHECK-64-P10: # %bb.0: # %entry 30; CHECK-64-P10-NEXT: vinsblx 2, 4, 3 31; CHECK-64-P10-NEXT: blr 32; 33; CHECK-32-P10-LABEL: testByte: 34; CHECK-32-P10: # %bb.0: # %entry 35; CHECK-32-P10-NEXT: vinsblx 2, 6, 4 36; CHECK-32-P10-NEXT: blr 37entry: 38 %conv = trunc i64 %b to i8 39 %vecins = insertelement <16 x i8> %a, i8 %conv, i64 %idx 40 ret <16 x i8> %vecins 41} 42 43; Halfword indexed 44 45define <8 x i16> @testHalf(<8 x i16> %a, i64 %b, i64 %idx) { 46; CHECK-64-LABEL: testHalf: 47; CHECK-64: # %bb.0: # %entry 48; CHECK-64-NEXT: addi 5, 1, -16 49; CHECK-64-NEXT: rlwinm 4, 4, 1, 28, 30 50; CHECK-64-NEXT: stxv 34, -16(1) 51; CHECK-64-NEXT: sthx 3, 5, 4 52; CHECK-64-NEXT: lxv 34, -16(1) 53; CHECK-64-NEXT: blr 54; 55; CHECK-32-LABEL: testHalf: 56; CHECK-32: # %bb.0: # %entry 57; CHECK-32-NEXT: addi 5, 1, -16 58; CHECK-32-NEXT: rlwinm 3, 6, 1, 28, 30 59; CHECK-32-NEXT: stxv 34, -16(1) 60; CHECK-32-NEXT: sthx 4, 5, 3 61; CHECK-32-NEXT: lxv 34, -16(1) 62; CHECK-32-NEXT: blr 63; 64; CHECK-64-P10-LABEL: testHalf: 65; CHECK-64-P10: # %bb.0: # %entry 66; CHECK-64-P10-NEXT: slwi 4, 4, 1 67; CHECK-64-P10-NEXT: vinshlx 2, 4, 3 68; CHECK-64-P10-NEXT: blr 69; 70; CHECK-32-P10-LABEL: testHalf: 71; CHECK-32-P10: # %bb.0: # %entry 72; CHECK-32-P10-NEXT: slwi 3, 6, 1 73; CHECK-32-P10-NEXT: vinshlx 2, 3, 4 74; CHECK-32-P10-NEXT: blr 75entry: 76 %conv = trunc i64 %b to i16 77 %vecins = insertelement <8 x i16> %a, i16 %conv, i64 %idx 78 ret <8 x i16> %vecins 79} 80 81; Word indexed 82 83define <4 x i32> @testWord(<4 x i32> %a, i64 %b, i64 %idx) { 84; CHECK-64-LABEL: testWord: 85; CHECK-64: # %bb.0: # %entry 86; CHECK-64-NEXT: addi 5, 1, -16 87; CHECK-64-NEXT: rlwinm 4, 4, 2, 28, 29 88; CHECK-64-NEXT: stxv 34, -16(1) 89; CHECK-64-NEXT: stwx 3, 5, 4 90; CHECK-64-NEXT: lxv 34, -16(1) 91; CHECK-64-NEXT: blr 92; 93; CHECK-32-LABEL: testWord: 94; CHECK-32: # %bb.0: # %entry 95; CHECK-32-NEXT: addi 5, 1, -16 96; CHECK-32-NEXT: rlwinm 3, 6, 2, 28, 29 97; CHECK-32-NEXT: stxv 34, -16(1) 98; CHECK-32-NEXT: stwx 4, 5, 3 99; CHECK-32-NEXT: lxv 34, -16(1) 100; CHECK-32-NEXT: blr 101; 102; CHECK-64-P10-LABEL: testWord: 103; CHECK-64-P10: # %bb.0: # %entry 104; CHECK-64-P10-NEXT: slwi 4, 4, 2 105; CHECK-64-P10-NEXT: vinswlx 2, 4, 3 106; CHECK-64-P10-NEXT: blr 107; 108; CHECK-32-P10-LABEL: testWord: 109; CHECK-32-P10: # %bb.0: # %entry 110; CHECK-32-P10-NEXT: slwi 3, 6, 2 111; CHECK-32-P10-NEXT: vinswlx 2, 3, 4 112; CHECK-32-P10-NEXT: blr 113entry: 114 %conv = trunc i64 %b to i32 115 %vecins = insertelement <4 x i32> %a, i32 %conv, i64 %idx 116 ret <4 x i32> %vecins 117} 118 119; Word immediate 120 121define <4 x i32> @testWordImm(<4 x i32> %a, i64 %b) { 122; CHECK-64-LABEL: testWordImm: 123; CHECK-64: # %bb.0: # %entry 124; CHECK-64-NEXT: mtfprwz 0, 3 125; CHECK-64-NEXT: xxinsertw 34, 0, 4 126; CHECK-64-NEXT: xxinsertw 34, 0, 12 127; CHECK-64-NEXT: blr 128; 129; CHECK-32-LABEL: testWordImm: 130; CHECK-32: # %bb.0: # %entry 131; CHECK-32-NEXT: mtfprwz 0, 4 132; CHECK-32-NEXT: xxinsertw 34, 0, 4 133; CHECK-32-NEXT: xxinsertw 34, 0, 12 134; CHECK-32-NEXT: blr 135; 136; CHECK-64-P10-LABEL: testWordImm: 137; CHECK-64-P10: # %bb.0: # %entry 138; CHECK-64-P10-NEXT: vinsw 2, 3, 4 139; CHECK-64-P10-NEXT: vinsw 2, 3, 12 140; CHECK-64-P10-NEXT: blr 141; 142; CHECK-32-P10-LABEL: testWordImm: 143; CHECK-32-P10: # %bb.0: # %entry 144; CHECK-32-P10-NEXT: vinsw 2, 4, 4 145; CHECK-32-P10-NEXT: vinsw 2, 4, 12 146; CHECK-32-P10-NEXT: blr 147entry: 148 %conv = trunc i64 %b to i32 149 %vecins = insertelement <4 x i32> %a, i32 %conv, i32 1 150 %vecins2 = insertelement <4 x i32> %vecins, i32 %conv, i32 3 151 ret <4 x i32> %vecins2 152} 153 154; Doubleword indexed 155 156define <2 x i64> @testDoubleword(<2 x i64> %a, i64 %b, i64 %idx) { 157; CHECK-64-LABEL: testDoubleword: 158; CHECK-64: # %bb.0: # %entry 159; CHECK-64-NEXT: addi 5, 1, -16 160; CHECK-64-NEXT: rlwinm 4, 4, 3, 28, 28 161; CHECK-64-NEXT: stxv 34, -16(1) 162; CHECK-64-NEXT: stdx 3, 5, 4 163; CHECK-64-NEXT: lxv 34, -16(1) 164; CHECK-64-NEXT: blr 165; 166; CHECK-32-LABEL: testDoubleword: 167; CHECK-32: # %bb.0: # %entry 168; CHECK-32-NEXT: add 5, 6, 6 169; CHECK-32-NEXT: addi 7, 1, -32 170; CHECK-32-NEXT: stxv 34, -32(1) 171; CHECK-32-NEXT: rlwinm 6, 5, 2, 28, 29 172; CHECK-32-NEXT: stwx 3, 7, 6 173; CHECK-32-NEXT: addi 3, 5, 1 174; CHECK-32-NEXT: addi 5, 1, -16 175; CHECK-32-NEXT: lxv 0, -32(1) 176; CHECK-32-NEXT: rlwinm 3, 3, 2, 28, 29 177; CHECK-32-NEXT: stxv 0, -16(1) 178; CHECK-32-NEXT: stwx 4, 5, 3 179; CHECK-32-NEXT: lxv 34, -16(1) 180; CHECK-32-NEXT: blr 181; 182; CHECK-64-P10-LABEL: testDoubleword: 183; CHECK-64-P10: # %bb.0: # %entry 184; CHECK-64-P10-NEXT: rlwinm 4, 4, 3, 0, 28 185; CHECK-64-P10-NEXT: vinsdlx 2, 4, 3 186; CHECK-64-P10-NEXT: blr 187; 188; CHECK-32-P10-LABEL: testDoubleword: 189; CHECK-32-P10: # %bb.0: # %entry 190; CHECK-32-P10-NEXT: add 5, 6, 6 191; CHECK-32-P10-NEXT: slwi 6, 5, 2 192; CHECK-32-P10-NEXT: vinswlx 2, 6, 3 193; CHECK-32-P10-NEXT: addi 3, 5, 1 194; CHECK-32-P10-NEXT: slwi 3, 3, 2 195; CHECK-32-P10-NEXT: vinswlx 2, 3, 4 196; CHECK-32-P10-NEXT: blr 197entry: 198 %vecins = insertelement <2 x i64> %a, i64 %b, i64 %idx 199 ret <2 x i64> %vecins 200} 201 202; Doubleword immediate 203 204define <2 x i64> @testDoublewordImm(<2 x i64> %a, i64 %b) { 205; CHECK-64-LABEL: testDoublewordImm: 206; CHECK-64: # %bb.0: # %entry 207; CHECK-64-NEXT: mtfprd 0, 3 208; CHECK-64-NEXT: xxmrghd 34, 34, 0 209; CHECK-64-NEXT: blr 210; 211; CHECK-32-LABEL: testDoublewordImm: 212; CHECK-32: # %bb.0: # %entry 213; CHECK-32-NEXT: mtfprwz 0, 3 214; CHECK-32-NEXT: xxinsertw 34, 0, 8 215; CHECK-32-NEXT: mtfprwz 0, 4 216; CHECK-32-NEXT: xxinsertw 34, 0, 12 217; CHECK-32-NEXT: blr 218; 219; CHECK-64-P10-LABEL: testDoublewordImm: 220; CHECK-64-P10: # %bb.0: # %entry 221; CHECK-64-P10-NEXT: vinsd 2, 3, 8 222; CHECK-64-P10-NEXT: blr 223; 224; CHECK-32-P10-LABEL: testDoublewordImm: 225; CHECK-32-P10: # %bb.0: # %entry 226; CHECK-32-P10-NEXT: vinsw 2, 3, 8 227; CHECK-32-P10-NEXT: vinsw 2, 4, 12 228; CHECK-32-P10-NEXT: blr 229entry: 230 %vecins = insertelement <2 x i64> %a, i64 %b, i32 1 231 ret <2 x i64> %vecins 232} 233 234define <2 x i64> @testDoublewordImm2(<2 x i64> %a, i64 %b) { 235; CHECK-64-LABEL: testDoublewordImm2: 236; CHECK-64: # %bb.0: # %entry 237; CHECK-64-NEXT: mtfprd 0, 3 238; CHECK-64-NEXT: xxpermdi 34, 0, 34, 1 239; CHECK-64-NEXT: blr 240; 241; CHECK-32-LABEL: testDoublewordImm2: 242; CHECK-32: # %bb.0: # %entry 243; CHECK-32-NEXT: mtfprwz 0, 3 244; CHECK-32-NEXT: xxinsertw 34, 0, 0 245; CHECK-32-NEXT: mtfprwz 0, 4 246; CHECK-32-NEXT: xxinsertw 34, 0, 4 247; CHECK-32-NEXT: blr 248; 249; CHECK-64-P10-LABEL: testDoublewordImm2: 250; CHECK-64-P10: # %bb.0: # %entry 251; CHECK-64-P10-NEXT: vinsd 2, 3, 0 252; CHECK-64-P10-NEXT: blr 253; 254; CHECK-32-P10-LABEL: testDoublewordImm2: 255; CHECK-32-P10: # %bb.0: # %entry 256; CHECK-32-P10-NEXT: vinsw 2, 3, 0 257; CHECK-32-P10-NEXT: vinsw 2, 4, 4 258; CHECK-32-P10-NEXT: blr 259entry: 260 %vecins = insertelement <2 x i64> %a, i64 %b, i32 0 261 ret <2 x i64> %vecins 262} 263 264; Float indexed 265 266define <4 x float> @testFloat1(<4 x float> %a, float %b, i32 zeroext %idx1) { 267; CHECK-64-LABEL: testFloat1: 268; CHECK-64: # %bb.0: # %entry 269; CHECK-64-DAG: rlwinm 3, 4, 2, 28, 29 270; CHECK-64-DAG: addi 4, 1, -16 271; CHECK-64-NEXT: stxv 34, -16(1) 272; CHECK-64-NEXT: stfsx 1, 4, 3 273; CHECK-64-NEXT: lxv 34, -16(1) 274; CHECK-64-NEXT: blr 275; 276; CHECK-32-LABEL: testFloat1: 277; CHECK-32: # %bb.0: # %entry 278; CHECK-32-NEXT: rlwinm 3, 4, 2, 28, 29 279; CHECK-32-NEXT: addi 4, 1, -16 280; CHECK-32-NEXT: stxv 34, -16(1) 281; CHECK-32-NEXT: stfsx 1, 4, 3 282; CHECK-32-NEXT: lxv 34, -16(1) 283; CHECK-32-NEXT: blr 284; 285; CHECK-64-P10-LABEL: testFloat1: 286; CHECK-64-P10: # %bb.0: # %entry 287; CHECK-64-P10-NEXT: xscvdpspn 35, 1 288; CHECK-64-P10-NEXT: extsw 3, 4 289; CHECK-64-P10-NEXT: slwi 3, 3, 2 290; CHECK-64-P10-NEXT: vinswvlx 2, 3, 3 291; CHECK-64-P10-NEXT: blr 292; 293; CHECK-32-P10-LABEL: testFloat1: 294; CHECK-32-P10: # %bb.0: # %entry 295; CHECK-32-P10-NEXT: xscvdpspn 35, 1 296; CHECK-32-P10-NEXT: slwi 3, 4, 2 297; CHECK-32-P10-NEXT: vinswvlx 2, 3, 3 298; CHECK-32-P10-NEXT: blr 299entry: 300 %vecins = insertelement <4 x float> %a, float %b, i32 %idx1 301 ret <4 x float> %vecins 302} 303 304define <4 x float> @testFloat2(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 305; CHECK-64-LABEL: testFloat2: 306; CHECK-64: # %bb.0: # %entry 307; CHECK-64-NEXT: lwz 6, 0(3) 308; CHECK-64-DAG: rlwinm 4, 4, 2, 28, 29 309; CHECK-64-DAG: addi 7, 1, -32 310; CHECK-64-NEXT: stxv 34, -32(1) 311; CHECK-64-NEXT: stwx 6, 7, 4 312; CHECK-64-NEXT: rlwinm 4, 5, 2, 28, 29 313; CHECK-64-NEXT: addi 5, 1, -16 314; CHECK-64-NEXT: lxv 0, -32(1) 315; CHECK-64-NEXT: lwz 3, 1(3) 316; CHECK-64-NEXT: stxv 0, -16(1) 317; CHECK-64-NEXT: stwx 3, 5, 4 318; CHECK-64-NEXT: lxv 34, -16(1) 319; CHECK-64-NEXT: blr 320; 321; CHECK-32-LABEL: testFloat2: 322; CHECK-32: # %bb.0: # %entry 323; CHECK-32-NEXT: lwz 6, 0(3) 324; CHECK-32-NEXT: addi 7, 1, -32 325; CHECK-32-NEXT: rlwinm 4, 4, 2, 28, 29 326; CHECK-32-NEXT: stxv 34, -32(1) 327; CHECK-32-NEXT: rlwinm 5, 5, 2, 28, 29 328; CHECK-32-NEXT: stwx 6, 7, 4 329; CHECK-32-NEXT: addi 4, 1, -16 330; CHECK-32-NEXT: lxv 0, -32(1) 331; CHECK-32-NEXT: lwz 3, 1(3) 332; CHECK-32-NEXT: stxv 0, -16(1) 333; CHECK-32-NEXT: stwx 3, 4, 5 334; CHECK-32-NEXT: lxv 34, -16(1) 335; CHECK-32-NEXT: blr 336; 337; CHECK-64-P10-LABEL: testFloat2: 338; CHECK-64-P10: # %bb.0: # %entry 339; CHECK-64-P10-NEXT: lwz 6, 0(3) 340; CHECK-64-P10-NEXT: extsw 4, 4 341; CHECK-64-P10-NEXT: lwz 3, 1(3) 342; CHECK-64-P10-NEXT: slwi 4, 4, 2 343; CHECK-64-P10-NEXT: vinswlx 2, 4, 6 344; CHECK-64-P10-NEXT: extsw 4, 5 345; CHECK-64-P10-NEXT: slwi 4, 4, 2 346; CHECK-64-P10-NEXT: vinswlx 2, 4, 3 347; CHECK-64-P10-NEXT: blr 348; 349; CHECK-32-P10-LABEL: testFloat2: 350; CHECK-32-P10: # %bb.0: # %entry 351; CHECK-32-P10-NEXT: lwz 6, 0(3) 352; CHECK-32-P10-NEXT: lwz 3, 1(3) 353; CHECK-32-P10-NEXT: slwi 4, 4, 2 354; CHECK-32-P10-NEXT: vinswlx 2, 4, 6 355; CHECK-32-P10-NEXT: slwi 4, 5, 2 356; CHECK-32-P10-NEXT: vinswlx 2, 4, 3 357; CHECK-32-P10-NEXT: blr 358entry: 359 %0 = bitcast i8* %b to float* 360 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1 361 %1 = bitcast i8* %add.ptr1 to float* 362 %2 = load float, float* %0, align 4 363 %vecins = insertelement <4 x float> %a, float %2, i32 %idx1 364 %3 = load float, float* %1, align 4 365 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2 366 ret <4 x float> %vecins2 367} 368 369define <4 x float> @testFloat3(<4 x float> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 370; CHECK-64-LABEL: testFloat3: 371; CHECK-64: # %bb.0: # %entry 372; CHECK-64-NEXT: lis 6, 1 373; CHECK-64-DAG: rlwinm 4, 4, 2, 28, 29 374; CHECK-64-DAG: addi 7, 1, -32 375; CHECK-64-NEXT: lwzx 6, 3, 6 376; CHECK-64-NEXT: stxv 34, -32(1) 377; CHECK-64-NEXT: stwx 6, 7, 4 378; CHECK-64-NEXT: li 4, 1 379; CHECK-64-NEXT: lxv 0, -32(1) 380; CHECK-64-NEXT: rldic 4, 4, 36, 27 381; CHECK-64-NEXT: lwzx 3, 3, 4 382; CHECK-64-NEXT: rlwinm 4, 5, 2, 28, 29 383; CHECK-64-NEXT: addi 5, 1, -16 384; CHECK-64-NEXT: stxv 0, -16(1) 385; CHECK-64-NEXT: stwx 3, 5, 4 386; CHECK-64-NEXT: lxv 34, -16(1) 387; CHECK-64-NEXT: blr 388; 389; CHECK-32-LABEL: testFloat3: 390; CHECK-32: # %bb.0: # %entry 391; CHECK-32-NEXT: lis 6, 1 392; CHECK-32-NEXT: addi 7, 1, -32 393; CHECK-32-NEXT: rlwinm 4, 4, 2, 28, 29 394; CHECK-32-NEXT: rlwinm 5, 5, 2, 28, 29 395; CHECK-32-NEXT: lwzx 6, 3, 6 396; CHECK-32-NEXT: stxv 34, -32(1) 397; CHECK-32-NEXT: stwx 6, 7, 4 398; CHECK-32-NEXT: addi 4, 1, -16 399; CHECK-32-NEXT: lxv 0, -32(1) 400; CHECK-32-NEXT: lwz 3, 0(3) 401; CHECK-32-NEXT: stxv 0, -16(1) 402; CHECK-32-NEXT: stwx 3, 4, 5 403; CHECK-32-NEXT: lxv 34, -16(1) 404; CHECK-32-NEXT: blr 405; 406; CHECK-64-P10-LABEL: testFloat3: 407; CHECK-64-P10: # %bb.0: # %entry 408; CHECK-64-P10-NEXT: plwz 6, 65536(3), 0 409; CHECK-64-P10-NEXT: extsw 4, 4 410; CHECK-64-P10-NEXT: slwi 4, 4, 2 411; CHECK-64-P10-NEXT: vinswlx 2, 4, 6 412; CHECK-64-P10-NEXT: li 4, 1 413; CHECK-64-P10-NEXT: rldic 4, 4, 36, 27 414; CHECK-64-P10-NEXT: lwzx 3, 3, 4 415; CHECK-64-P10-NEXT: extsw 4, 5 416; CHECK-64-P10-NEXT: slwi 4, 4, 2 417; CHECK-64-P10-NEXT: vinswlx 2, 4, 3 418; CHECK-64-P10-NEXT: blr 419; 420; CHECK-32-P10-LABEL: testFloat3: 421; CHECK-32-P10: # %bb.0: # %entry 422; CHECK-32-P10-NEXT: lis 6, 1 423; CHECK-32-P10-NEXT: slwi 4, 4, 2 424; CHECK-32-P10-NEXT: lwzx 6, 3, 6 425; CHECK-32-P10-NEXT: lwz 3, 0(3) 426; CHECK-32-P10-NEXT: vinswlx 2, 4, 6 427; CHECK-32-P10-NEXT: slwi 4, 5, 2 428; CHECK-32-P10-NEXT: vinswlx 2, 4, 3 429; CHECK-32-P10-NEXT: blr 430entry: 431 %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536 432 %0 = bitcast i8* %add.ptr to float* 433 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736 434 %1 = bitcast i8* %add.ptr1 to float* 435 %2 = load float, float* %0, align 4 436 %vecins = insertelement <4 x float> %a, float %2, i32 %idx1 437 %3 = load float, float* %1, align 4 438 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 %idx2 439 ret <4 x float> %vecins2 440} 441 442; Float immediate 443 444define <4 x float> @testFloatImm1(<4 x float> %a, float %b) { 445; CHECK-64-LABEL: testFloatImm1: 446; CHECK-64: # %bb.0: # %entry 447; CHECK-64-NEXT: xscvdpspn 0, 1 448; CHECK-64-NEXT: xxinsertw 34, 0, 0 449; CHECK-64-NEXT: xxinsertw 34, 0, 8 450; CHECK-64-NEXT: blr 451; 452; CHECK-32-LABEL: testFloatImm1: 453; CHECK-32: # %bb.0: # %entry 454; CHECK-32-NEXT: xscvdpspn 0, 1 455; CHECK-32-NEXT: xxinsertw 34, 0, 0 456; CHECK-32-NEXT: xxinsertw 34, 0, 8 457; CHECK-32-NEXT: blr 458; 459; CHECK-64-P10-LABEL: testFloatImm1: 460; CHECK-64-P10: # %bb.0: # %entry 461; CHECK-64-P10-NEXT: xscvdpspn 0, 1 462; CHECK-64-P10-NEXT: xxinsertw 34, 0, 0 463; CHECK-64-P10-NEXT: xxinsertw 34, 0, 8 464; CHECK-64-P10-NEXT: blr 465; 466; CHECK-32-P10-LABEL: testFloatImm1: 467; CHECK-32-P10: # %bb.0: # %entry 468; CHECK-32-P10-NEXT: xscvdpspn 0, 1 469; CHECK-32-P10-NEXT: xxinsertw 34, 0, 0 470; CHECK-32-P10-NEXT: xxinsertw 34, 0, 8 471; CHECK-32-P10-NEXT: blr 472entry: 473 %vecins = insertelement <4 x float> %a, float %b, i32 0 474 %vecins1 = insertelement <4 x float> %vecins, float %b, i32 2 475 ret <4 x float> %vecins1 476} 477 478define <4 x float> @testFloatImm2(<4 x float> %a, i32* %b) { 479; CHECK-64-LABEL: testFloatImm2: 480; CHECK-64: # %bb.0: # %entry 481; CHECK-64-NEXT: lfs 0, 0(3) 482; CHECK-64-NEXT: xscvdpspn 0, 0 483; CHECK-64-NEXT: xxinsertw 34, 0, 0 484; CHECK-64-NEXT: lfs 0, 4(3) 485; CHECK-64-NEXT: xscvdpspn 0, 0 486; CHECK-64-NEXT: xxinsertw 34, 0, 8 487; CHECK-64-NEXT: blr 488; 489; CHECK-32-LABEL: testFloatImm2: 490; CHECK-32: # %bb.0: # %entry 491; CHECK-32-NEXT: lfs 0, 0(3) 492; CHECK-32-NEXT: xscvdpspn 0, 0 493; CHECK-32-NEXT: xxinsertw 34, 0, 0 494; CHECK-32-NEXT: lfs 0, 4(3) 495; CHECK-32-NEXT: xscvdpspn 0, 0 496; CHECK-32-NEXT: xxinsertw 34, 0, 8 497; CHECK-32-NEXT: blr 498; 499; CHECK-64-P10-LABEL: testFloatImm2: 500; CHECK-64-P10: # %bb.0: # %entry 501; CHECK-64-P10-NEXT: lwz 4, 0(3) 502; CHECK-64-P10-NEXT: lwz 3, 4(3) 503; CHECK-64-P10-NEXT: vinsw 2, 4, 0 504; CHECK-64-P10-NEXT: vinsw 2, 3, 8 505; CHECK-64-P10-NEXT: blr 506; 507; CHECK-32-P10-LABEL: testFloatImm2: 508; CHECK-32-P10: # %bb.0: # %entry 509; CHECK-32-P10-NEXT: lwz 4, 0(3) 510; CHECK-32-P10-NEXT: lwz 3, 4(3) 511; CHECK-32-P10-NEXT: vinsw 2, 4, 0 512; CHECK-32-P10-NEXT: vinsw 2, 3, 8 513; CHECK-32-P10-NEXT: blr 514entry: 515 %0 = bitcast i32* %b to float* 516 %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 1 517 %1 = bitcast i32* %add.ptr1 to float* 518 %2 = load float, float* %0, align 4 519 %vecins = insertelement <4 x float> %a, float %2, i32 0 520 %3 = load float, float* %1, align 4 521 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2 522 ret <4 x float> %vecins2 523} 524 525define <4 x float> @testFloatImm3(<4 x float> %a, i32* %b) { 526; CHECK-64-LABEL: testFloatImm3: 527; CHECK-64: # %bb.0: # %entry 528; CHECK-64-NEXT: lis 4, 4 529; CHECK-64-NEXT: lfsx 0, 3, 4 530; CHECK-64-NEXT: li 4, 1 531; CHECK-64-NEXT: rldic 4, 4, 38, 25 532; CHECK-64-NEXT: xscvdpspn 0, 0 533; CHECK-64-NEXT: xxinsertw 34, 0, 0 534; CHECK-64-NEXT: lfsx 0, 3, 4 535; CHECK-64-NEXT: xscvdpspn 0, 0 536; CHECK-64-NEXT: xxinsertw 34, 0, 8 537; CHECK-64-NEXT: blr 538; 539; CHECK-32-LABEL: testFloatImm3: 540; CHECK-32: # %bb.0: # %entry 541; CHECK-32-NEXT: lis 4, 4 542; CHECK-32-NEXT: lfsx 0, 3, 4 543; CHECK-32-NEXT: xscvdpspn 0, 0 544; CHECK-32-NEXT: xxinsertw 34, 0, 0 545; CHECK-32-NEXT: lfs 0, 0(3) 546; CHECK-32-NEXT: xscvdpspn 0, 0 547; CHECK-32-NEXT: xxinsertw 34, 0, 8 548; CHECK-32-NEXT: blr 549; 550; CHECK-64-P10-LABEL: testFloatImm3: 551; CHECK-64-P10: # %bb.0: # %entry 552; CHECK-64-P10-NEXT: plwz 4, 262144(3), 0 553; CHECK-64-P10-NEXT: vinsw 2, 4, 0 554; CHECK-64-P10-NEXT: li 4, 1 555; CHECK-64-P10-NEXT: rldic 4, 4, 38, 25 556; CHECK-64-P10-NEXT: lwzx 3, 3, 4 557; CHECK-64-P10-NEXT: vinsw 2, 3, 8 558; CHECK-64-P10-NEXT: blr 559; 560; CHECK-32-P10-LABEL: testFloatImm3: 561; CHECK-32-P10: # %bb.0: # %entry 562; CHECK-32-P10-NEXT: lis 4, 4 563; CHECK-32-P10-NEXT: lwzx 4, 3, 4 564; CHECK-32-P10-NEXT: lwz 3, 0(3) 565; CHECK-32-P10-NEXT: vinsw 2, 4, 0 566; CHECK-32-P10-NEXT: vinsw 2, 3, 8 567; CHECK-32-P10-NEXT: blr 568entry: 569 %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536 570 %0 = bitcast i32* %add.ptr to float* 571 %add.ptr1 = getelementptr inbounds i32, i32* %b, i64 68719476736 572 %1 = bitcast i32* %add.ptr1 to float* 573 %2 = load float, float* %0, align 4 574 %vecins = insertelement <4 x float> %a, float %2, i32 0 575 %3 = load float, float* %1, align 4 576 %vecins2 = insertelement <4 x float> %vecins, float %3, i32 2 577 ret <4 x float> %vecins2 578} 579 580; Double indexed 581 582define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) { 583; CHECK-64-LABEL: testDouble1: 584; CHECK-64: # %bb.0: # %entry 585; CHECK-64: rlwinm 3, 4, 3, 28, 28 586; CHECK-64-NEXT: addi 4, 1, -16 587; CHECK-64-NEXT: stxv 34, -16(1) 588; CHECK-64-NEXT: stfdx 1, 4, 3 589; CHECK-64-NEXT: lxv 34, -16(1) 590; CHECK-64-NEXT: blr 591; 592; CHECK-32-LABEL: testDouble1: 593; CHECK-32: # %bb.0: # %entry 594; CHECK-32-NEXT: addi 4, 1, -16 595; CHECK-32-NEXT: rlwinm 3, 5, 3, 28, 28 596; CHECK-32-NEXT: stxv 34, -16(1) 597; CHECK-32-NEXT: stfdx 1, 4, 3 598; CHECK-32-NEXT: lxv 34, -16(1) 599; CHECK-32-NEXT: blr 600; 601; CHECK-64-P10-LABEL: testDouble1: 602; CHECK-64-P10: # %bb.0: # %entry 603; CHECK-64-P10-NEXT: extsw 4, 4 604; CHECK-64-P10-NEXT: mffprd 3, 1 605; CHECK-64-P10-NEXT: rlwinm 4, 4, 3, 0, 28 606; CHECK-64-P10-NEXT: vinsdlx 2, 4, 3 607; CHECK-64-P10-NEXT: blr 608; 609; CHECK-32-P10-LABEL: testDouble1: 610; CHECK-32-P10: # %bb.0: # %entry 611; CHECK-32-P10-DAG: addi 4, 1, -16 612; CHECK-32-P10-DAG: rlwinm 3, 5, 3, 28, 28 613; CHECK-32-P10-NEXT: stxv 34, -16(1) 614; CHECK-32-P10-NEXT: stfdx 1, 4, 3 615; CHECK-32-P10-NEXT: lxv 34, -16(1) 616; CHECK-32-P10-NEXT: blr 617entry: 618 %vecins = insertelement <2 x double> %a, double %b, i32 %idx1 619 ret <2 x double> %vecins 620} 621 622define <2 x double> @testDouble2(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 623; CHECK-64-LABEL: testDouble2: 624; CHECK-64: # %bb.0: # %entry 625; CHECK-64-NEXT: ld 6, 0(3) 626; CHECK-64-DAG: rlwinm 4, 4, 3, 28, 28 627; CHECK-64-DAG: addi 7, 1, -32 628; CHECK-64-NEXT: stxv 34, -32(1) 629; CHECK-64-NEXT: stdx 6, 7, 4 630; CHECK-64-NEXT: li 4, 1 631; CHECK-64-NEXT: lxv 0, -32(1) 632; CHECK-64-NEXT: ldx 3, 3, 4 633; CHECK-64-NEXT: rlwinm 4, 5, 3, 28, 28 634; CHECK-64-NEXT: addi 5, 1, -16 635; CHECK-64-NEXT: stxv 0, -16(1) 636; CHECK-64-NEXT: stdx 3, 5, 4 637; CHECK-64-NEXT: lxv 34, -16(1) 638; CHECK-64-NEXT: blr 639; 640; CHECK-32-LABEL: testDouble2: 641; CHECK-32: # %bb.0: # %entry 642; CHECK-32-NEXT: lfd 0, 0(3) 643; CHECK-32-NEXT: addi 6, 1, -32 644; CHECK-32-NEXT: rlwinm 4, 4, 3, 28, 28 645; CHECK-32-NEXT: stxv 34, -32(1) 646; CHECK-32-NEXT: rlwinm 5, 5, 3, 28, 28 647; CHECK-32-NEXT: stfdx 0, 6, 4 648; CHECK-32-NEXT: lxv 0, -32(1) 649; CHECK-32-NEXT: lfd 1, 1(3) 650; CHECK-32-NEXT: addi 3, 1, -16 651; CHECK-32-NEXT: stxv 0, -16(1) 652; CHECK-32-NEXT: stfdx 1, 3, 5 653; CHECK-32-NEXT: lxv 34, -16(1) 654; CHECK-32-NEXT: blr 655; 656; CHECK-64-P10-LABEL: testDouble2: 657; CHECK-64-P10: # %bb.0: # %entry 658; CHECK-64-P10-NEXT: ld 6, 0(3) 659; CHECK-64-P10-NEXT: extsw 4, 4 660; CHECK-64-P10-NEXT: pld 3, 1(3), 0 661; CHECK-64-P10-NEXT: rlwinm 4, 4, 3, 0, 28 662; CHECK-64-P10-NEXT: vinsdlx 2, 4, 6 663; CHECK-64-P10-NEXT: extsw 4, 5 664; CHECK-64-P10-NEXT: rlwinm 4, 4, 3, 0, 28 665; CHECK-64-P10-NEXT: vinsdlx 2, 4, 3 666; CHECK-64-P10-NEXT: blr 667; 668; CHECK-32-P10-LABEL: testDouble2: 669; CHECK-32-P10: # %bb.0: # %entry 670; CHECK-32-P10-NEXT: lfd 0, 0(3) 671; CHECK-32-P10-DAG: addi 6, 1, -32 672; CHECK-32-P10-DAG: rlwinm 4, 4, 3, 28, 28 673; CHECK-32-P10-NEXT: stxv 34, -32(1) 674; CHECK-32-P10-NEXT: rlwinm 5, 5, 3, 28, 28 675; CHECK-32-P10-NEXT: stfdx 0, 6, 4 676; CHECK-32-P10-NEXT: lxv 0, -32(1) 677; CHECK-32-P10-NEXT: plfd 1, 1(3), 0 678; CHECK-32-P10-NEXT: addi 3, 1, -16 679; CHECK-32-P10-NEXT: stxv 0, -16(1) 680; CHECK-32-P10-NEXT: stfdx 1, 3, 5 681; CHECK-32-P10-NEXT: lxv 34, -16(1) 682; CHECK-32-P10-NEXT: blr 683entry: 684 %0 = bitcast i8* %b to double* 685 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 1 686 %1 = bitcast i8* %add.ptr1 to double* 687 %2 = load double, double* %0, align 8 688 %vecins = insertelement <2 x double> %a, double %2, i32 %idx1 689 %3 = load double, double* %1, align 8 690 %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2 691 ret <2 x double> %vecins2 692} 693 694define <2 x double> @testDouble3(<2 x double> %a, i8* %b, i32 zeroext %idx1, i32 zeroext %idx2) { 695; CHECK-64-LABEL: testDouble3: 696; CHECK-64: # %bb.0: # %entry 697; CHECK-64-NEXT: lis 6, 1 698; CHECK-64-DAG: rlwinm 4, 4, 3, 28, 28 699; CHECK-64-DAG: addi 7, 1, -32 700; CHECK-64-NEXT: ldx 6, 3, 6 701; CHECK-64-NEXT: stxv 34, -32(1) 702; CHECK-64-NEXT: stdx 6, 7, 4 703; CHECK-64-NEXT: li 4, 1 704; CHECK-64-NEXT: lxv 0, -32(1) 705; CHECK-64-NEXT: rldic 4, 4, 36, 27 706; CHECK-64-NEXT: ldx 3, 3, 4 707; CHECK-64-NEXT: rlwinm 4, 5, 3, 28, 28 708; CHECK-64-NEXT: addi 5, 1, -16 709; CHECK-64-NEXT: stxv 0, -16(1) 710; CHECK-64-NEXT: stdx 3, 5, 4 711; CHECK-64-NEXT: lxv 34, -16(1) 712; CHECK-64-NEXT: blr 713; 714; CHECK-32-LABEL: testDouble3: 715; CHECK-32: # %bb.0: # %entry 716; CHECK-32-NEXT: lis 6, 1 717; CHECK-32-NEXT: rlwinm 4, 4, 3, 28, 28 718; CHECK-32-NEXT: rlwinm 5, 5, 3, 28, 28 719; CHECK-32-NEXT: lfdx 0, 3, 6 720; CHECK-32-NEXT: addi 6, 1, -32 721; CHECK-32-NEXT: stxv 34, -32(1) 722; CHECK-32-NEXT: stfdx 0, 6, 4 723; CHECK-32-NEXT: lxv 0, -32(1) 724; CHECK-32-NEXT: lfd 1, 0(3) 725; CHECK-32-NEXT: addi 3, 1, -16 726; CHECK-32-NEXT: stxv 0, -16(1) 727; CHECK-32-NEXT: stfdx 1, 3, 5 728; CHECK-32-NEXT: lxv 34, -16(1) 729; CHECK-32-NEXT: blr 730; 731; CHECK-64-P10-LABEL: testDouble3: 732; CHECK-64-P10: # %bb.0: # %entry 733; CHECK-64-P10-NEXT: pld 6, 65536(3), 0 734; CHECK-64-P10-NEXT: extsw 4, 4 735; CHECK-64-P10-NEXT: rlwinm 4, 4, 3, 0, 28 736; CHECK-64-P10-NEXT: vinsdlx 2, 4, 6 737; CHECK-64-P10-NEXT: li 4, 1 738; CHECK-64-P10-NEXT: rldic 4, 4, 36, 27 739; CHECK-64-P10-NEXT: ldx 3, 3, 4 740; CHECK-64-P10-NEXT: extsw 4, 5 741; CHECK-64-P10-NEXT: rlwinm 4, 4, 3, 0, 28 742; CHECK-64-P10-NEXT: vinsdlx 2, 4, 3 743; CHECK-64-P10-NEXT: blr 744; 745; CHECK-32-P10-LABEL: testDouble3: 746; CHECK-32-P10: # %bb.0: # %entry 747; CHECK-32-P10-NEXT: plfd 0, 65536(3), 0 748; CHECK-32-P10-DAG: addi 6, 1, -32 749; CHECK-32-P10-DAG: rlwinm 4, 4, 3, 28, 28 750; CHECK-32-P10-NEXT: stxv 34, -32(1) 751; CHECK-32-P10-NEXT: rlwinm 5, 5, 3, 28, 28 752; CHECK-32-P10-NEXT: stfdx 0, 6, 4 753; CHECK-32-P10-NEXT: lxv 0, -32(1) 754; CHECK-32-P10-NEXT: lfd 1, 0(3) 755; CHECK-32-P10-NEXT: addi 3, 1, -16 756; CHECK-32-P10-NEXT: stxv 0, -16(1) 757; CHECK-32-P10-NEXT: stfdx 1, 3, 5 758; CHECK-32-P10-NEXT: lxv 34, -16(1) 759; CHECK-32-P10-NEXT: blr 760entry: 761 %add.ptr = getelementptr inbounds i8, i8* %b, i64 65536 762 %0 = bitcast i8* %add.ptr to double* 763 %add.ptr1 = getelementptr inbounds i8, i8* %b, i64 68719476736 764 %1 = bitcast i8* %add.ptr1 to double* 765 %2 = load double, double* %0, align 8 766 %vecins = insertelement <2 x double> %a, double %2, i32 %idx1 767 %3 = load double, double* %1, align 8 768 %vecins2 = insertelement <2 x double> %vecins, double %3, i32 %idx2 769 ret <2 x double> %vecins2 770} 771 772; Double immediate 773 774define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) { 775; CHECK-64-LABEL: testDoubleImm1: 776; CHECK-64: # %bb.0: # %entry 777; CHECK-64-NEXT: # kill: def $f1 killed $f1 def $vsl1 778; CHECK-64-NEXT: xxpermdi 34, 1, 34, 1 779; CHECK-64-NEXT: blr 780; 781; CHECK-32-LABEL: testDoubleImm1: 782; CHECK-32: # %bb.0: # %entry 783; CHECK-32-NEXT: # kill: def $f1 killed $f1 def $vsl1 784; CHECK-32-NEXT: xxpermdi 34, 1, 34, 1 785; CHECK-32-NEXT: blr 786; 787; CHECK-64-P10-LABEL: testDoubleImm1: 788; CHECK-64-P10: # %bb.0: # %entry 789; CHECK-64-P10-NEXT: # kill: def $f1 killed $f1 def $vsl1 790; CHECK-64-P10-NEXT: xxpermdi 34, 1, 34, 1 791; CHECK-64-P10-NEXT: blr 792; 793; CHECK-32-P10-LABEL: testDoubleImm1: 794; CHECK-32-P10: # %bb.0: # %entry 795; CHECK-32-P10-NEXT: # kill: def $f1 killed $f1 def $vsl1 796; CHECK-32-P10-NEXT: xxpermdi 34, 1, 34, 1 797; CHECK-32-P10-NEXT: blr 798entry: 799 %vecins = insertelement <2 x double> %a, double %b, i32 0 800 ret <2 x double> %vecins 801} 802 803define <2 x double> @testDoubleImm2(<2 x double> %a, i32* %b) { 804; CHECK-64-LABEL: testDoubleImm2: 805; CHECK-64: # %bb.0: # %entry 806; CHECK-64-NEXT: lfd 0, 0(3) 807; CHECK-64-NEXT: xxpermdi 34, 0, 34, 1 808; CHECK-64-NEXT: blr 809; 810; CHECK-32-LABEL: testDoubleImm2: 811; CHECK-32: # %bb.0: # %entry 812; CHECK-32-NEXT: lfd 0, 0(3) 813; CHECK-32-NEXT: xxpermdi 34, 0, 34, 1 814; CHECK-32-NEXT: blr 815; 816; CHECK-64-P10-LABEL: testDoubleImm2: 817; CHECK-64-P10: # %bb.0: # %entry 818; CHECK-64-P10-NEXT: lfd 0, 0(3) 819; CHECK-64-P10-NEXT: xxpermdi 34, 0, 34, 1 820; CHECK-64-P10-NEXT: blr 821; 822; CHECK-32-P10-LABEL: testDoubleImm2: 823; CHECK-32-P10: # %bb.0: # %entry 824; CHECK-32-P10-NEXT: lfd 0, 0(3) 825; CHECK-32-P10-NEXT: xxpermdi 34, 0, 34, 1 826; CHECK-32-P10-NEXT: blr 827entry: 828 %0 = bitcast i32* %b to double* 829 %1 = load double, double* %0, align 8 830 %vecins = insertelement <2 x double> %a, double %1, i32 0 831 ret <2 x double> %vecins 832} 833 834define <2 x double> @testDoubleImm3(<2 x double> %a, i32* %b) { 835; CHECK-64-LABEL: testDoubleImm3: 836; CHECK-64: # %bb.0: # %entry 837; CHECK-64-NEXT: lfd 0, 4(3) 838; CHECK-64-NEXT: xxpermdi 34, 0, 34, 1 839; CHECK-64-NEXT: blr 840; 841; CHECK-32-LABEL: testDoubleImm3: 842; CHECK-32: # %bb.0: # %entry 843; CHECK-32-NEXT: lfd 0, 4(3) 844; CHECK-32-NEXT: xxpermdi 34, 0, 34, 1 845; CHECK-32-NEXT: blr 846; 847; CHECK-64-P10-LABEL: testDoubleImm3: 848; CHECK-64-P10: # %bb.0: # %entry 849; CHECK-64-P10-NEXT: lfd 0, 4(3) 850; CHECK-64-P10-NEXT: xxpermdi 34, 0, 34, 1 851; CHECK-64-P10-NEXT: blr 852; 853; CHECK-32-P10-LABEL: testDoubleImm3: 854; CHECK-32-P10: # %bb.0: # %entry 855; CHECK-32-P10-NEXT: lfd 0, 4(3) 856; CHECK-32-P10-NEXT: xxpermdi 34, 0, 34, 1 857; CHECK-32-P10-NEXT: blr 858entry: 859 %add.ptr = getelementptr inbounds i32, i32* %b, i64 1 860 %0 = bitcast i32* %add.ptr to double* 861 %1 = load double, double* %0, align 8 862 %vecins = insertelement <2 x double> %a, double %1, i32 0 863 ret <2 x double> %vecins 864} 865 866define <2 x double> @testDoubleImm4(<2 x double> %a, i32* %b) { 867; CHECK-64-LABEL: testDoubleImm4: 868; CHECK-64: # %bb.0: # %entry 869; CHECK-64-NEXT: lis 4, 4 870; CHECK-64-NEXT: lfdx 0, 3, 4 871; CHECK-64-NEXT: xxpermdi 34, 0, 34, 1 872; CHECK-64-NEXT: blr 873; 874; CHECK-32-LABEL: testDoubleImm4: 875; CHECK-32: # %bb.0: # %entry 876; CHECK-32-NEXT: lis 4, 4 877; CHECK-32-NEXT: lfdx 0, 3, 4 878; CHECK-32-NEXT: xxpermdi 34, 0, 34, 1 879; CHECK-32-NEXT: blr 880; 881; CHECK-64-P10-LABEL: testDoubleImm4: 882; CHECK-64-P10: # %bb.0: # %entry 883; CHECK-64-P10-NEXT: plfd 0, 262144(3), 0 884; CHECK-64-P10-NEXT: xxpermdi 34, 0, 34, 1 885; CHECK-64-P10-NEXT: blr 886; 887; CHECK-32-P10-LABEL: testDoubleImm4: 888; CHECK-32-P10: # %bb.0: # %entry 889; CHECK-32-P10-NEXT: plfd 0, 262144(3), 0 890; CHECK-32-P10-NEXT: xxpermdi 34, 0, 34, 1 891; CHECK-32-P10-NEXT: blr 892entry: 893 %add.ptr = getelementptr inbounds i32, i32* %b, i64 65536 894 %0 = bitcast i32* %add.ptr to double* 895 %1 = load double, double* %0, align 8 896 %vecins = insertelement <2 x double> %a, double %1, i32 0 897 ret <2 x double> %vecins 898} 899 900define <2 x double> @testDoubleImm5(<2 x double> %a, i32* %b) { 901; CHECK-64-LABEL: testDoubleImm5: 902; CHECK-64: # %bb.0: # %entry 903; CHECK-64-NEXT: li 4, 1 904; CHECK-64-NEXT: rldic 4, 4, 38, 25 905; CHECK-64-NEXT: lfdx 0, 3, 4 906; CHECK-64-NEXT: xxpermdi 34, 0, 34, 1 907; CHECK-64-NEXT: blr 908; 909; CHECK-32-LABEL: testDoubleImm5: 910; CHECK-32: # %bb.0: # %entry 911; CHECK-32-NEXT: lfd 0, 0(3) 912; CHECK-32-NEXT: xxpermdi 34, 0, 34, 1 913; CHECK-32-NEXT: blr 914; 915; CHECK-64-P10-LABEL: testDoubleImm5: 916; CHECK-64-P10: # %bb.0: # %entry 917; CHECK-64-P10-NEXT: li 4, 1 918; CHECK-64-P10-NEXT: rldic 4, 4, 38, 25 919; CHECK-64-P10-NEXT: lfdx 0, 3, 4 920; CHECK-64-P10-NEXT: xxpermdi 34, 0, 34, 1 921; CHECK-64-P10-NEXT: blr 922; 923; CHECK-32-P10-LABEL: testDoubleImm5: 924; CHECK-32-P10: # %bb.0: # %entry 925; CHECK-32-P10-NEXT: lfd 0, 0(3) 926; CHECK-32-P10-NEXT: xxpermdi 34, 0, 34, 1 927; CHECK-32-P10-NEXT: blr 928entry: 929 %add.ptr = getelementptr inbounds i32, i32* %b, i64 68719476736 930 %0 = bitcast i32* %add.ptr to double* 931 %1 = load double, double* %0, align 8 932 %vecins = insertelement <2 x double> %a, double %1, i32 0 933 ret <2 x double> %vecins 934} 935 936