brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 8123de1 Raw
207 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; Test replications of a byte-swapped scalar memory value.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s5 6declare i16 @llvm.bswap.i16(i16)7declare i32 @llvm.bswap.i32(i32)8declare i64 @llvm.bswap.i64(i64)9declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)10declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)11declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)12 13; Test a v8i16 replicating load with no offset.14define <8 x i16> @f1(ptr %ptr) {15; CHECK-LABEL: f1:16; CHECK:       # %bb.0:17; CHECK-NEXT:    vlbrreph %v24, 0(%r2)18; CHECK-NEXT:    br %r1419  %scalar = load i16, ptr %ptr20  %swap = call i16 @llvm.bswap.i16(i16 %scalar)21  %val = insertelement <8 x i16> undef, i16 %swap, i32 022  %ret = shufflevector <8 x i16> %val, <8 x i16> undef,23                       <8 x i32> zeroinitializer24  ret <8 x i16> %ret25}26 27; Test a v8i16 replicating load with the maximum in-range offset.28define <8 x i16> @f2(ptr %base) {29; CHECK-LABEL: f2:30; CHECK:       # %bb.0:31; CHECK-NEXT:    vlbrreph %v24, 4094(%r2)32; CHECK-NEXT:    br %r1433  %ptr = getelementptr i16, ptr %base, i64 204734  %scalar = load i16, ptr %ptr35  %swap = call i16 @llvm.bswap.i16(i16 %scalar)36  %val = insertelement <8 x i16> undef, i16 %swap, i32 037  %ret = shufflevector <8 x i16> %val, <8 x i16> undef,38                       <8 x i32> zeroinitializer39  ret <8 x i16> %ret40}41 42; Test a v8i16 replicating load with the first out-of-range offset.43define <8 x i16> @f3(ptr %base) {44; CHECK-LABEL: f3:45; CHECK:       # %bb.0:46; CHECK-NEXT:    aghi %r2, 409647; CHECK-NEXT:    vlbrreph %v24, 0(%r2)48; CHECK-NEXT:    br %r1449  %ptr = getelementptr i16, ptr %base, i64 204850  %scalar = load i16, ptr %ptr51  %swap = call i16 @llvm.bswap.i16(i16 %scalar)52  %val = insertelement <8 x i16> undef, i16 %swap, i32 053  %ret = shufflevector <8 x i16> %val, <8 x i16> undef,54                       <8 x i32> zeroinitializer55  ret <8 x i16> %ret56}57 58; Test a v8i16 replicating load using a vector bswap.59define <8 x i16> @f4(ptr %ptr) {60; CHECK-LABEL: f4:61; CHECK:       # %bb.0:62; CHECK-NEXT:    vlbrreph %v24, 0(%r2)63; CHECK-NEXT:    br %r1464  %scalar = load i16, ptr %ptr65  %val = insertelement <8 x i16> undef, i16 %scalar, i32 066  %rep = shufflevector <8 x i16> %val, <8 x i16> undef,67                       <8 x i32> zeroinitializer68  %ret = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %rep)69  ret <8 x i16> %ret70}71 72; Test a v4i32 replicating load with no offset.73define <4 x i32> @f5(ptr %ptr) {74; CHECK-LABEL: f5:75; CHECK:       # %bb.0:76; CHECK-NEXT:    vlbrrepf %v24, 0(%r2)77; CHECK-NEXT:    br %r1478  %scalar = load i32, ptr %ptr79  %swap = call i32 @llvm.bswap.i32(i32 %scalar)80  %val = insertelement <4 x i32> undef, i32 %swap, i32 081  %ret = shufflevector <4 x i32> %val, <4 x i32> undef,82                       <4 x i32> zeroinitializer83  ret <4 x i32> %ret84}85 86; Test a v4i32 replicating load with the maximum in-range offset.87define <4 x i32> @f6(ptr %base) {88; CHECK-LABEL: f6:89; CHECK:       # %bb.0:90; CHECK-NEXT:    vlbrrepf %v24, 4092(%r2)91; CHECK-NEXT:    br %r1492  %ptr = getelementptr i32, ptr %base, i64 102393  %scalar = load i32, ptr %ptr94  %swap = call i32 @llvm.bswap.i32(i32 %scalar)95  %val = insertelement <4 x i32> undef, i32 %swap, i32 096  %ret = shufflevector <4 x i32> %val, <4 x i32> undef,97                       <4 x i32> zeroinitializer98  ret <4 x i32> %ret99}100 101; Test a v4i32 replicating load with the first out-of-range offset.102define <4 x i32> @f7(ptr %base) {103; CHECK-LABEL: f7:104; CHECK:       # %bb.0:105; CHECK-NEXT:    aghi %r2, 4096106; CHECK-NEXT:    vlbrrepf %v24, 0(%r2)107; CHECK-NEXT:    br %r14108  %ptr = getelementptr i32, ptr %base, i64 1024109  %scalar = load i32, ptr %ptr110  %swap = call i32 @llvm.bswap.i32(i32 %scalar)111  %val = insertelement <4 x i32> undef, i32 %swap, i32 0112  %ret = shufflevector <4 x i32> %val, <4 x i32> undef,113                       <4 x i32> zeroinitializer114  ret <4 x i32> %ret115}116 117; Test a v4i32 replicating load using a vector bswap.118define <4 x i32> @f8(ptr %ptr) {119; CHECK-LABEL: f8:120; CHECK:       # %bb.0:121; CHECK-NEXT:    vlbrrepf %v24, 0(%r2)122; CHECK-NEXT:    br %r14123  %scalar = load i32, ptr %ptr124  %val = insertelement <4 x i32> undef, i32 %scalar, i32 0125  %rep = shufflevector <4 x i32> %val, <4 x i32> undef,126                       <4 x i32> zeroinitializer127  %ret = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %rep)128  ret <4 x i32> %ret129}130 131; Test a v2i64 replicating load with no offset.132define <2 x i64> @f9(ptr %ptr) {133; CHECK-LABEL: f9:134; CHECK:       # %bb.0:135; CHECK-NEXT:    vlbrrepg %v24, 0(%r2)136; CHECK-NEXT:    br %r14137  %scalar = load i64, ptr %ptr138  %swap = call i64 @llvm.bswap.i64(i64 %scalar)139  %val = insertelement <2 x i64> undef, i64 %swap, i32 0140  %ret = shufflevector <2 x i64> %val, <2 x i64> undef,141                       <2 x i32> zeroinitializer142  ret <2 x i64> %ret143}144 145; Test a v2i64 replicating load with the maximum in-range offset.146define <2 x i64> @f10(ptr %base) {147; CHECK-LABEL: f10:148; CHECK:       # %bb.0:149; CHECK-NEXT:    vlbrrepg %v24, 4088(%r2)150; CHECK-NEXT:    br %r14151  %ptr = getelementptr i64, ptr %base, i32 511152  %scalar = load i64, ptr %ptr153  %swap = call i64 @llvm.bswap.i64(i64 %scalar)154  %val = insertelement <2 x i64> undef, i64 %swap, i32 0155  %ret = shufflevector <2 x i64> %val, <2 x i64> undef,156                       <2 x i32> zeroinitializer157  ret <2 x i64> %ret158}159 160; Test a v2i64 replicating load with the first out-of-range offset.161define <2 x i64> @f11(ptr %base) {162; CHECK-LABEL: f11:163; CHECK:       # %bb.0:164; CHECK-NEXT:    aghi %r2, 4096165; CHECK-NEXT:    vlbrrepg %v24, 0(%r2)166; CHECK-NEXT:    br %r14167  %ptr = getelementptr i64, ptr %base, i32 512168  %scalar = load i64, ptr %ptr169  %swap = call i64 @llvm.bswap.i64(i64 %scalar)170  %val = insertelement <2 x i64> undef, i64 %swap, i32 0171  %ret = shufflevector <2 x i64> %val, <2 x i64> undef,172                       <2 x i32> zeroinitializer173  ret <2 x i64> %ret174}175 176; Test a v2i64 replicating load using a vector bswap.177define <2 x i64> @f12(ptr %ptr) {178; CHECK-LABEL: f12:179; CHECK:       # %bb.0:180; CHECK-NEXT:    vlbrrepg %v24, 0(%r2)181; CHECK-NEXT:    br %r14182  %scalar = load i64, ptr %ptr183  %val = insertelement <2 x i64> undef, i64 %scalar, i32 0184  %rep = shufflevector <2 x i64> %val, <2 x i64> undef,185                       <2 x i32> zeroinitializer186  %ret = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %rep)187  ret <2 x i64> %ret188}189 190; Test a v8i16 replicating load with an index.191define <8 x i16> @f13(ptr %base, i64 %index) {192; CHECK-LABEL: f13:193; CHECK:       # %bb.0:194; CHECK-NEXT:    sllg %r1, %r3, 1195; CHECK-NEXT:    vlbrreph %v24, 2046(%r1,%r2)196; CHECK-NEXT:    br %r14197  %ptr1 = getelementptr i16, ptr %base, i64 %index198  %ptr = getelementptr i16, ptr %ptr1, i64 1023199  %scalar = load i16, ptr %ptr200  %swap = call i16 @llvm.bswap.i16(i16 %scalar)201  %val = insertelement <8 x i16> undef, i16 %swap, i32 0202  %ret = shufflevector <8 x i16> %val, <8 x i16> undef,203                       <8 x i32> zeroinitializer204  ret <8 x i16> %ret205}206 207