105 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; Test stores of byte-swapped vector elements.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s5 6declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)7declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)8declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)9 10; Test v8i16 stores.11define void @f1(<8 x i16> %val, ptr %ptr) {12; CHECK-LABEL: f1:13; CHECK: # %bb.0:14; CHECK-NEXT: vstbrh %v24, 0(%r2)15; CHECK-NEXT: br %r1416 %swap = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %val)17 store <8 x i16> %swap, ptr %ptr18 ret void19}20 21; Test v4i32 stores.22define void @f2(<4 x i32> %val, ptr %ptr) {23; CHECK-LABEL: f2:24; CHECK: # %bb.0:25; CHECK-NEXT: vstbrf %v24, 0(%r2)26; CHECK-NEXT: br %r1427 %swap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val)28 store <4 x i32> %swap, ptr %ptr29 ret void30}31 32; Test v2i64 stores.33define void @f3(<2 x i64> %val, ptr %ptr) {34; CHECK-LABEL: f3:35; CHECK: # %bb.0:36; CHECK-NEXT: vstbrg %v24, 0(%r2)37; CHECK-NEXT: br %r1438 %swap = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %val)39 store <2 x i64> %swap, ptr %ptr40 ret void41}42 43; Test the highest aligned in-range offset.44define void @f4(<4 x i32> %val, ptr %base) {45; CHECK-LABEL: f4:46; CHECK: # %bb.0:47; CHECK-NEXT: vstbrf %v24, 4080(%r2)48; CHECK-NEXT: br %r1449 %ptr = getelementptr <4 x i32>, ptr %base, i64 25550 %swap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val)51 store <4 x i32> %swap, ptr %ptr52 ret void53}54 55; Test the highest unaligned in-range offset.56define void @f5(<4 x i32> %val, ptr %base) {57; CHECK-LABEL: f5:58; CHECK: # %bb.0:59; CHECK-NEXT: vstbrf %v24, 4095(%r2)60; CHECK-NEXT: br %r1461 %addr = getelementptr i8, ptr %base, i64 409562 %swap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val)63 store <4 x i32> %swap, ptr %addr, align 164 ret void65}66 67; Test the next offset up, which requires separate address logic,68define void @f6(<4 x i32> %val, ptr %base) {69; CHECK-LABEL: f6:70; CHECK: # %bb.0:71; CHECK-NEXT: aghi %r2, 409672; CHECK-NEXT: vstbrf %v24, 0(%r2)73; CHECK-NEXT: br %r1474 %ptr = getelementptr <4 x i32>, ptr %base, i64 25675 %swap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val)76 store <4 x i32> %swap, ptr %ptr77 ret void78}79 80; Test negative offsets, which also require separate address logic,81define void @f7(<4 x i32> %val, ptr %base) {82; CHECK-LABEL: f7:83; CHECK: # %bb.0:84; CHECK-NEXT: aghi %r2, -1685; CHECK-NEXT: vstbrf %v24, 0(%r2)86; CHECK-NEXT: br %r1487 %ptr = getelementptr <4 x i32>, ptr %base, i64 -188 %swap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val)89 store <4 x i32> %swap, ptr %ptr90 ret void91}92 93; Check that indexes are allowed.94define void @f8(<4 x i32> %val, ptr %base, i64 %index) {95; CHECK-LABEL: f8:96; CHECK: # %bb.0:97; CHECK-NEXT: vstbrf %v24, 0(%r3,%r2)98; CHECK-NEXT: br %r1499 %addr = getelementptr i8, ptr %base, i64 %index100 %swap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val)101 store <4 x i32> %swap, ptr %addr, align 1102 ret void103}104 105