252 lines · plain
1; Test replications of a scalar memory value, represented as splats.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s4 5; Test a v16i8 replicating load with no offset.6define <16 x i8> @f1(ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: vlrepb %v24, 0(%r2)9; CHECK: br %r1410 %scalar = load i8, ptr %ptr11 %val = insertelement <16 x i8> undef, i8 %scalar, i32 012 %ret = shufflevector <16 x i8> %val, <16 x i8> undef,13 <16 x i32> zeroinitializer14 ret <16 x i8> %ret15}16 17; Test a v16i8 replicating load with the maximum in-range offset.18define <16 x i8> @f2(ptr %base) {19; CHECK-LABEL: f2:20; CHECK: vlrepb %v24, 4095(%r2)21; CHECK: br %r1422 %ptr = getelementptr i8, ptr %base, i64 409523 %scalar = load i8, ptr %ptr24 %val = insertelement <16 x i8> undef, i8 %scalar, i32 025 %ret = shufflevector <16 x i8> %val, <16 x i8> undef,26 <16 x i32> zeroinitializer27 ret <16 x i8> %ret28}29 30; Test a v16i8 replicating load with the first out-of-range offset.31define <16 x i8> @f3(ptr %base) {32; CHECK-LABEL: f3:33; CHECK: aghi %r2, 409634; CHECK: vlrepb %v24, 0(%r2)35; CHECK: br %r1436 %ptr = getelementptr i8, ptr %base, i64 409637 %scalar = load i8, ptr %ptr38 %val = insertelement <16 x i8> undef, i8 %scalar, i32 039 %ret = shufflevector <16 x i8> %val, <16 x i8> undef,40 <16 x i32> zeroinitializer41 ret <16 x i8> %ret42}43 44; Test a v8i16 replicating load with no offset.45define <8 x i16> @f4(ptr %ptr) {46; CHECK-LABEL: f4:47; CHECK: vlreph %v24, 0(%r2)48; CHECK: br %r1449 %scalar = load i16, ptr %ptr50 %val = insertelement <8 x i16> undef, i16 %scalar, i32 051 %ret = shufflevector <8 x i16> %val, <8 x i16> undef,52 <8 x i32> zeroinitializer53 ret <8 x i16> %ret54}55 56; Test a v8i16 replicating load with the maximum in-range offset.57define <8 x i16> @f5(ptr %base) {58; CHECK-LABEL: f5:59; CHECK: vlreph %v24, 4094(%r2)60; CHECK: br %r1461 %ptr = getelementptr i16, ptr %base, i64 204762 %scalar = load i16, ptr %ptr63 %val = insertelement <8 x i16> undef, i16 %scalar, i32 064 %ret = shufflevector <8 x i16> %val, <8 x i16> undef,65 <8 x i32> zeroinitializer66 ret <8 x i16> %ret67}68 69; Test a v8i16 replicating load with the first out-of-range offset.70define <8 x i16> @f6(ptr %base) {71; CHECK-LABEL: f6:72; CHECK: aghi %r2, 409673; CHECK: vlreph %v24, 0(%r2)74; CHECK: br %r1475 %ptr = getelementptr i16, ptr %base, i64 204876 %scalar = load i16, ptr %ptr77 %val = insertelement <8 x i16> undef, i16 %scalar, i32 078 %ret = shufflevector <8 x i16> %val, <8 x i16> undef,79 <8 x i32> zeroinitializer80 ret <8 x i16> %ret81}82 83; Test a v4i32 replicating load with no offset.84define <4 x i32> @f7(ptr %ptr) {85; CHECK-LABEL: f7:86; CHECK: vlrepf %v24, 0(%r2)87; CHECK: br %r1488 %scalar = load i32, ptr %ptr89 %val = insertelement <4 x i32> undef, i32 %scalar, i32 090 %ret = shufflevector <4 x i32> %val, <4 x i32> undef,91 <4 x i32> zeroinitializer92 ret <4 x i32> %ret93}94 95; Test a v4i32 replicating load with the maximum in-range offset.96define <4 x i32> @f8(ptr %base) {97; CHECK-LABEL: f8:98; CHECK: vlrepf %v24, 4092(%r2)99; CHECK: br %r14100 %ptr = getelementptr i32, ptr %base, i64 1023101 %scalar = load i32, ptr %ptr102 %val = insertelement <4 x i32> undef, i32 %scalar, i32 0103 %ret = shufflevector <4 x i32> %val, <4 x i32> undef,104 <4 x i32> zeroinitializer105 ret <4 x i32> %ret106}107 108; Test a v4i32 replicating load with the first out-of-range offset.109define <4 x i32> @f9(ptr %base) {110; CHECK-LABEL: f9:111; CHECK: aghi %r2, 4096112; CHECK: vlrepf %v24, 0(%r2)113; CHECK: br %r14114 %ptr = getelementptr i32, ptr %base, i64 1024115 %scalar = load i32, ptr %ptr116 %val = insertelement <4 x i32> undef, i32 %scalar, i32 0117 %ret = shufflevector <4 x i32> %val, <4 x i32> undef,118 <4 x i32> zeroinitializer119 ret <4 x i32> %ret120}121 122; Test a v2i64 replicating load with no offset.123define <2 x i64> @f10(ptr %ptr) {124; CHECK-LABEL: f10:125; CHECK: vlrepg %v24, 0(%r2)126; CHECK: br %r14127 %scalar = load i64, ptr %ptr128 %val = insertelement <2 x i64> undef, i64 %scalar, i32 0129 %ret = shufflevector <2 x i64> %val, <2 x i64> undef,130 <2 x i32> zeroinitializer131 ret <2 x i64> %ret132}133 134; Test a v2i64 replicating load with the maximum in-range offset.135define <2 x i64> @f11(ptr %base) {136; CHECK-LABEL: f11:137; CHECK: vlrepg %v24, 4088(%r2)138; CHECK: br %r14139 %ptr = getelementptr i64, ptr %base, i32 511140 %scalar = load i64, ptr %ptr141 %val = insertelement <2 x i64> undef, i64 %scalar, i32 0142 %ret = shufflevector <2 x i64> %val, <2 x i64> undef,143 <2 x i32> zeroinitializer144 ret <2 x i64> %ret145}146 147; Test a v2i64 replicating load with the first out-of-range offset.148define <2 x i64> @f12(ptr %base) {149; CHECK-LABEL: f12:150; CHECK: aghi %r2, 4096151; CHECK: vlrepg %v24, 0(%r2)152; CHECK: br %r14153 %ptr = getelementptr i64, ptr %base, i32 512154 %scalar = load i64, ptr %ptr155 %val = insertelement <2 x i64> undef, i64 %scalar, i32 0156 %ret = shufflevector <2 x i64> %val, <2 x i64> undef,157 <2 x i32> zeroinitializer158 ret <2 x i64> %ret159}160 161; Test a v4f32 replicating load with no offset.162define <4 x float> @f13(ptr %ptr) {163; CHECK-LABEL: f13:164; CHECK: vlrepf %v24, 0(%r2)165; CHECK: br %r14166 %scalar = load float, ptr %ptr167 %val = insertelement <4 x float> undef, float %scalar, i32 0168 %ret = shufflevector <4 x float> %val, <4 x float> undef,169 <4 x i32> zeroinitializer170 ret <4 x float> %ret171}172 173; Test a v4f32 replicating load with the maximum in-range offset.174define <4 x float> @f14(ptr %base) {175; CHECK-LABEL: f14:176; CHECK: vlrepf %v24, 4092(%r2)177; CHECK: br %r14178 %ptr = getelementptr float, ptr %base, i64 1023179 %scalar = load float, ptr %ptr180 %val = insertelement <4 x float> undef, float %scalar, i32 0181 %ret = shufflevector <4 x float> %val, <4 x float> undef,182 <4 x i32> zeroinitializer183 ret <4 x float> %ret184}185 186; Test a v4f32 replicating load with the first out-of-range offset.187define <4 x float> @f15(ptr %base) {188; CHECK-LABEL: f15:189; CHECK: aghi %r2, 4096190; CHECK: vlrepf %v24, 0(%r2)191; CHECK: br %r14192 %ptr = getelementptr float, ptr %base, i64 1024193 %scalar = load float, ptr %ptr194 %val = insertelement <4 x float> undef, float %scalar, i32 0195 %ret = shufflevector <4 x float> %val, <4 x float> undef,196 <4 x i32> zeroinitializer197 ret <4 x float> %ret198}199 200; Test a v2f64 replicating load with no offset.201define <2 x double> @f16(ptr %ptr) {202; CHECK-LABEL: f16:203; CHECK: vlrepg %v24, 0(%r2)204; CHECK: br %r14205 %scalar = load double, ptr %ptr206 %val = insertelement <2 x double> undef, double %scalar, i32 0207 %ret = shufflevector <2 x double> %val, <2 x double> undef,208 <2 x i32> zeroinitializer209 ret <2 x double> %ret210}211 212; Test a v2f64 replicating load with the maximum in-range offset.213define <2 x double> @f17(ptr %base) {214; CHECK-LABEL: f17:215; CHECK: vlrepg %v24, 4088(%r2)216; CHECK: br %r14217 %ptr = getelementptr double, ptr %base, i32 511218 %scalar = load double, ptr %ptr219 %val = insertelement <2 x double> undef, double %scalar, i32 0220 %ret = shufflevector <2 x double> %val, <2 x double> undef,221 <2 x i32> zeroinitializer222 ret <2 x double> %ret223}224 225; Test a v2f64 replicating load with the first out-of-range offset.226define <2 x double> @f18(ptr %base) {227; CHECK-LABEL: f18:228; CHECK: aghi %r2, 4096229; CHECK: vlrepg %v24, 0(%r2)230; CHECK: br %r14231 %ptr = getelementptr double, ptr %base, i32 512232 %scalar = load double, ptr %ptr233 %val = insertelement <2 x double> undef, double %scalar, i32 0234 %ret = shufflevector <2 x double> %val, <2 x double> undef,235 <2 x i32> zeroinitializer236 ret <2 x double> %ret237}238 239; Test a v16i8 replicating load with an index.240define <16 x i8> @f19(ptr %base, i64 %index) {241; CHECK-LABEL: f19:242; CHECK: vlrepb %v24, 1023(%r3,%r2)243; CHECK: br %r14244 %ptr1 = getelementptr i8, ptr %base, i64 %index245 %ptr = getelementptr i8, ptr %ptr1, i64 1023246 %scalar = load i8, ptr %ptr247 %val = insertelement <16 x i8> undef, i8 %scalar, i32 0248 %ret = shufflevector <16 x i8> %val, <16 x i8> undef,249 <16 x i32> zeroinitializer250 ret <16 x i8> %ret251}252