1; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \ 2; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P9LE 3; RUN: llc -mcpu=pwr9 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \ 4; RUN: -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P9BE 5; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \ 6; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P8LE 7; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names \ 8; RUN: -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=P8BE 9 10; Function Attrs: norecurse nounwind readonly 11define <4 x i32> @s2v_test1(i32* nocapture readonly %int32, <4 x i32> %vec) { 12; P8LE-LABEL: s2v_test1: 13; P8LE: # %bb.0: # %entry 14; P8LE-NEXT: lfiwzx f0, 0, r3 15; P8LE-NEXT: addis r4, r2, .LCPI0_0@toc@ha 16; P8LE-NEXT: addi r3, r4, .LCPI0_0@toc@l 17; P8LE-NEXT: lvx v4, 0, r3 18; P8LE-NEXT: xxpermdi v3, f0, f0, 2 19; P8LE-NEXT: vperm v2, v3, v2, v4 20; P8LE-NEXT: blr 21 22; P8BE-LABEL: s2v_test1: 23; P8BE: # %bb.0: # %entry 24; P8BE: lfiwzx f0, 0, r3 25; P8BE-NEXT: xxsldwi vs0, f0, f0, 1 26; P8BE: xxsldwi vs0, v2, vs0, 1 27; P8BE: xxsldwi v2, vs0, vs0, 3 28; P8BE-NEXT: blr 29entry: 30 %0 = load i32, i32* %int32, align 4 31 %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0 32 ret <4 x i32> %vecins 33} 34 35; Function Attrs: norecurse nounwind readonly 36define <4 x i32> @s2v_test2(i32* nocapture readonly %int32, <4 x i32> %vec) { 37; P8LE-LABEL: s2v_test2: 38; P8LE: # %bb.0: # %entry 39; P8LE-NEXT: addi r3, r3, 4 40; P8LE-NEXT: addis r4, r2, .LCPI1_0@toc@ha 41; P8LE-NEXT: lfiwzx f0, 0, r3 42; P8LE-NEXT: addi r3, r4, .LCPI1_0@toc@l 43; P8LE-NEXT: lvx v4, 0, r3 44; P8LE-NEXT: xxpermdi v3, f0, f0, 2 45; P8LE-NEXT: vperm v2, v3, v2, v4 46; P8LE-NEXT: blr 47 48; P8BE-LABEL: s2v_test2: 49; P8BE: # %bb.0: # %entry 50; P8BE: addi r3, r3, 4 51; P8BE: lfiwzx f0, 0, r3 52; P8BE-NEXT: xxsldwi vs0, f0, f0, 1 53; P8BE: xxsldwi vs0, v2, vs0, 1 54; P8BE: xxsldwi v2, vs0, vs0, 3 55; P8BE-NEXT: blr 56entry: 57 %arrayidx = getelementptr inbounds i32, i32* %int32, i64 1 58 %0 = load i32, i32* %arrayidx, align 4 59 %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0 60 ret <4 x i32> %vecins 61} 62 63; Function Attrs: norecurse nounwind readonly 64define <4 x i32> @s2v_test3(i32* nocapture readonly %int32, <4 x i32> %vec, i32 signext %Idx) { 65; P8LE-LABEL: s2v_test3: 66; P8LE: # %bb.0: # %entry 67; P8LE-NEXT: sldi r5, r7, 2 68; P8LE-NEXT: addis r4, r2, .LCPI2_0@toc@ha 69; P8LE-NEXT: lfiwzx f0, r3, r5 70; P8LE-NEXT: addi r3, r4, .LCPI2_0@toc@l 71; P8LE-NEXT: lvx v4, 0, r3 72; P8LE-NEXT: xxpermdi v3, f0, f0, 2 73; P8LE-NEXT: vperm v2, v3, v2, v4 74; P8LE-NEXT: blr 75 76; P8BE-LABEL: s2v_test3: 77; P8BE: # %bb.0: # %entry 78; P8BE: sldi r4, r7, 2 79; P8BE: lfiwzx f0, r3, r4 80; P8BE-NEXT: xxsldwi vs0, f0, f0, 1 81; P8BE: xxsldwi vs0, v2, vs0, 1 82; P8BE: xxsldwi v2, vs0, vs0, 3 83; P8BE-NEXT: blr 84entry: 85 %idxprom = sext i32 %Idx to i64 86 %arrayidx = getelementptr inbounds i32, i32* %int32, i64 %idxprom 87 %0 = load i32, i32* %arrayidx, align 4 88 %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0 89 ret <4 x i32> %vecins 90} 91 92; Function Attrs: norecurse nounwind readonly 93define <4 x i32> @s2v_test4(i32* nocapture readonly %int32, <4 x i32> %vec) { 94; P8LE-LABEL: s2v_test4: 95; P8LE: # %bb.0: # %entry 96; P8LE-NEXT: addi r3, r3, 4 97; P8LE-NEXT: addis r4, r2, .LCPI3_0@toc@ha 98; P8LE-NEXT: lfiwzx f0, 0, r3 99; P8LE-NEXT: addi r3, r4, .LCPI3_0@toc@l 100; P8LE-NEXT: lvx v4, 0, r3 101; P8LE-NEXT: xxpermdi v3, f0, f0, 2 102; P8LE-NEXT: vperm v2, v3, v2, v4 103; P8LE-NEXT: blr 104 105; P8BE-LABEL: s2v_test4: 106; P8BE: # %bb.0: # %entry 107; P8BE: addi r3, r3, 4 108; P8BE: lfiwzx f0, 0, r3 109; P8BE-NEXT: xxsldwi vs0, f0, f0, 1 110; P8BE: xxsldwi vs0, v2, vs0, 1 111; P8BE: xxsldwi v2, vs0, vs0, 3 112; P8BE-NEXT: blr 113entry: 114 %arrayidx = getelementptr inbounds i32, i32* %int32, i64 1 115 %0 = load i32, i32* %arrayidx, align 4 116 %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0 117 ret <4 x i32> %vecins 118} 119 120; Function Attrs: norecurse nounwind readonly 121define <4 x i32> @s2v_test5(<4 x i32> %vec, i32* nocapture readonly %ptr1) { 122; P8LE-LABEL: s2v_test5: 123; P8LE: # %bb.0: # %entry 124; P8LE-NEXT: lfiwzx f0, 0, r5 125; P8LE-NEXT: addis r3, r2, .LCPI4_0@toc@ha 126; P8LE-NEXT: addi r3, r3, .LCPI4_0@toc@l 127; P8LE-NEXT: lvx v4, 0, r3 128; P8LE-NEXT: xxpermdi v3, f0, f0, 2 129; P8LE-NEXT: vperm v2, v3, v2, v4 130; P8LE-NEXT: blr 131 132; P8BE-LABEL: s2v_test5: 133; P8BE: # %bb.0: # %entry 134; P8BE: lfiwzx f0, 0, r5 135; P8BE-NEXT: xxsldwi vs0, f0, f0, 1 136; P8BE: xxsldwi vs0, v2, vs0, 1 137; P8BE: xxsldwi v2, vs0, vs0, 3 138; P8BE-NEXT: blr 139entry: 140 %0 = load i32, i32* %ptr1, align 4 141 %vecins = insertelement <4 x i32> %vec, i32 %0, i32 0 142 ret <4 x i32> %vecins 143} 144 145; Function Attrs: norecurse nounwind readonly 146define <4 x float> @s2v_test_f1(float* nocapture readonly %f64, <4 x float> %vec) { 147; P8LE-LABEL: s2v_test_f1: 148; P8LE: # %bb.0: # %entry 149; P8LE-NEXT: lfiwzx f0, 0, r3 150; P8LE-NEXT: addis r4, r2, .LCPI5_0@toc@ha 151; P8LE-NEXT: addi r3, r4, .LCPI5_0@toc@l 152; P8LE-NEXT: lvx v4, 0, r3 153; P8LE-NEXT: xxpermdi v3, f0, f0, 2 154; P8LE-NEXT: vperm v2, v3, v2, v4 155; P8LE-NEXT: blr 156 157; P8BE-LABEL: s2v_test_f1: 158; P8BE: # %bb.0: # %entry 159; P8BE: lfiwzx f0, 0, r3 160; P8BE-NEXT: xxsldwi vs0, f0, f0, 1 161; P8BE: xxsldwi vs0, v2, vs0, 1 162; P8BE: xxsldwi v2, vs0, vs0, 3 163; P8BE-NEXT: blr 164entry: 165 %0 = load float, float* %f64, align 4 166 %vecins = insertelement <4 x float> %vec, float %0, i32 0 167 ret <4 x float> %vecins 168} 169 170; Function Attrs: norecurse nounwind readonly 171define <2 x float> @s2v_test_f2(float* nocapture readonly %f64, <2 x float> %vec) { 172; P9LE-LABEL: s2v_test_f2: 173; P9LE: # %bb.0: # %entry 174; P9LE-NEXT: addi r3, r3, 4 175; P9LE-DAG: xxspltw v2, v2, 2 176; P9LE-DAG: lfiwzx f0, 0, r3 177; P9LE-NEXT: xxpermdi v3, f0, f0, 2 178; P9LE-NEXT: vmrglw v2, v2, v3 179; P9LE-NEXT: blr 180 181; P9BE-LABEL: s2v_test_f2: 182; P9BE: # %bb.0: # %entry 183; P9BE: addi r3, r3, 4 184; P9BE-DAG: xxspltw v2, v2, 1 185; P9BE-DAG: lfiwzx f0, 0, r3 186; P9BE-NEXT: xxsldwi v3, f0, f0, 1 187; P9BE: vmrghw v2, v3, v2 188; P9BE-NEXT: blr 189 190; P8LE-LABEL: s2v_test_f2: 191; P8LE: # %bb.0: # %entry 192; P8LE-NEXT: addi r3, r3, 4 193; P8LE-NEXT: xxspltw v2, v2, 2 194; P8LE-NEXT: lfiwzx f0, 0, r3 195; P8LE-NEXT: xxpermdi v3, f0, f0, 2 196; P8LE-NEXT: vmrglw v2, v2, v3 197; P8LE-NEXT: blr 198 199; P8BE-LABEL: s2v_test_f2: 200; P8BE: # %bb.0: # %entry 201; P8BE-NEXT: addi r3, r3, 4 202; P8BE-NEXT: xxspltw v2, v2, 1 203; P8BE-NEXT: lfiwzx f0, 0, r3 204; P8BE-NEXT: xxsldwi v3, f0, f0, 1 205; P8BE-NEXT: vmrghw v2, v3, v2 206; P8BE-NEXT: blr 207entry: 208 %arrayidx = getelementptr inbounds float, float* %f64, i64 1 209 %0 = load float, float* %arrayidx, align 8 210 %vecins = insertelement <2 x float> %vec, float %0, i32 0 211 ret <2 x float> %vecins 212} 213 214; Function Attrs: norecurse nounwind readonly 215define <2 x float> @s2v_test_f3(float* nocapture readonly %f64, <2 x float> %vec, i32 signext %Idx) { 216; P9LE-LABEL: s2v_test_f3: 217; P9LE: # %bb.0: # %entry 218; P9LE-NEXT: sldi r4, r7, 2 219; P9LE-NEXT: lfiwzx f0, r3, r4 220; P9LE-DAG: xxspltw v2, v2, 2 221; P9LE-DAG: xxpermdi v3, f0, f0, 2 222; P9LE-NEXT: vmrglw v2, v2, v3 223; P9LE-NEXT: blr 224 225; P9BE-LABEL: s2v_test_f3: 226; P9BE: # %bb.0: # %entry 227; P9BE: sldi r4, r7, 2 228; P9BE: lfiwzx f0, r3, r4 229; P9BE-DAG: xxspltw v2, v2, 1 230; P9BE-DAG: xxsldwi v3, f0, f0, 1 231; P9BE: vmrghw v2, v3, v2 232; P9BE-NEXT: blr 233 234; P8LE-LABEL: s2v_test_f3: 235; P8LE: # %bb.0: # %entry 236; P8LE-NEXT: sldi r4, r7, 2 237; P8LE-NEXT: xxspltw v2, v2, 2 238; P8LE-NEXT: lfiwzx f0, r3, r4 239; P8LE-NEXT: xxpermdi v3, f0, f0, 2 240; P8LE-NEXT: vmrglw v2, v2, v3 241; P8LE-NEXT: blr 242 243; P8BE-LABEL: s2v_test_f3: 244; P8BE: # %bb.0: # %entry 245; P8BE-NEXT: sldi r4, r7, 2 246; P8BE-NEXT: xxspltw v2, v2, 1 247; P8BE-NEXT: lfiwzx f0, r3, r4 248; P8BE-NEXT: xxsldwi v3, f0, f0, 1 249; P8BE-NEXT: vmrghw v2, v3, v2 250; P8BE-NEXT: blr 251entry: 252 %idxprom = sext i32 %Idx to i64 253 %arrayidx = getelementptr inbounds float, float* %f64, i64 %idxprom 254 %0 = load float, float* %arrayidx, align 8 255 %vecins = insertelement <2 x float> %vec, float %0, i32 0 256 ret <2 x float> %vecins 257} 258 259; Function Attrs: norecurse nounwind readonly 260define <2 x float> @s2v_test_f4(float* nocapture readonly %f64, <2 x float> %vec) { 261; P9LE-LABEL: s2v_test_f4: 262; P9LE: # %bb.0: # %entry 263; P9LE-NEXT: addi r3, r3, 4 264; P9LE-NEXT: lfiwzx f0, 0, r3 265; P9LE-DAG: xxspltw v2, v2, 2 266; P9LE-DAG: xxpermdi v3, f0, f0, 2 267; P9LE-NEXT: vmrglw v2, v2, v3 268; P9LE-NEXT: blr 269 270; P9BE-LABEL: s2v_test_f4: 271; P9BE: # %bb.0: # %entry 272; P9BE: addi r3, r3, 4 273; P9BE: lfiwzx f0, 0, r3 274; P9BE-DAG: xxspltw v2, v2, 1 275; P9BE-DAG: xxsldwi v3, f0, f0, 1 276; P9BE: vmrghw v2, v3, v2 277; P9BE-NEXT: blr 278 279; P8LE-LABEL: s2v_test_f4: 280; P8LE: # %bb.0: # %entry 281; P8LE-NEXT: addi r3, r3, 4 282; P8LE-NEXT: xxspltw v2, v2, 2 283; P8LE-NEXT: lfiwzx f0, 0, r3 284; P8LE-NEXT: xxpermdi v3, f0, f0, 2 285; P8LE-NEXT: vmrglw v2, v2, v3 286; P8LE-NEXT: blr 287 288; P8BE-LABEL: s2v_test_f4: 289; P8BE: # %bb.0: # %entry 290; P8BE-NEXT: addi r3, r3, 4 291; P8BE-NEXT: xxspltw v2, v2, 1 292; P8BE-NEXT: lfiwzx f0, 0, r3 293; P8BE-NEXT: xxsldwi v3, f0, f0, 1 294; P8BE-NEXT: vmrghw v2, v3, v2 295; P8BE-NEXT: blr 296entry: 297 %arrayidx = getelementptr inbounds float, float* %f64, i64 1 298 %0 = load float, float* %arrayidx, align 8 299 %vecins = insertelement <2 x float> %vec, float %0, i32 0 300 ret <2 x float> %vecins 301} 302 303; Function Attrs: norecurse nounwind readonly 304define <2 x float> @s2v_test_f5(<2 x float> %vec, float* nocapture readonly %ptr1) { 305; P9LE-LABEL: s2v_test_f5: 306; P9LE: # %bb.0: # %entry 307; P9LE-NEXT: lfiwzx f0, 0, r5 308; P9LE-NEXT: xxspltw v2, v2, 2 309; P9LE-NEXT: xxpermdi v3, f0, f0, 2 310; P9LE-NEXT: vmrglw v2, v2, v3 311; P9LE-NEXT: blr 312 313; P9BE-LABEL: s2v_test_f5: 314; P9BE: # %bb.0: # %entry 315; P9BE: lfiwzx f0, 0, r5 316; P9BE: xxspltw v2, v2, 1 317; P9BE-NEXT: xxsldwi v3, f0, f0, 1 318; P9BE: vmrghw v2, v3, v2 319; P9BE-NEXT: blr 320 321; P8LE-LABEL: s2v_test_f5: 322; P8LE: # %bb.0: # %entry 323; P8LE-NEXT: lfiwzx f0, 0, r5 324; P8LE-NEXT: xxspltw v2, v2, 2 325; P8LE-NEXT: xxpermdi v3, f0, f0, 2 326; P8LE-NEXT: vmrglw v2, v2, v3 327; P8LE-NEXT: blr 328 329; P8BE-LABEL: s2v_test_f5: 330; P8BE: # %bb.0: # %entry 331; P8BE-NEXT: lfiwzx f0, 0, r5 332; P8BE-NEXT: xxspltw v2, v2, 1 333; P8BE-NEXT: xxsldwi v3, f0, f0, 1 334; P8BE-NEXT: vmrghw v2, v3, v2 335; P8BE-NEXT: blr 336entry: 337 %0 = load float, float* %ptr1, align 8 338 %vecins = insertelement <2 x float> %vec, float %0, i32 0 339 ret <2 x float> %vecins 340} 341 342