1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; Test vector insertions of byte-swapped memory values into 0. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s 5 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 VLLEBRZH. 14define <8 x i16> @f1(ptr %ptr) { 15; CHECK-LABEL: f1: 16; CHECK: # %bb.0: 17; CHECK-NEXT: vllebrzh %v24, 0(%r2) 18; CHECK-NEXT: br %r14 19 %val = load i16, ptr %ptr 20 %swap = call i16 @llvm.bswap.i16(i16 %val) 21 %ret = insertelement <8 x i16> zeroinitializer, i16 %swap, i32 3 22 ret <8 x i16> %ret 23} 24 25; Test VLLEBRZH using a vector bswap. 26define <8 x i16> @f2(ptr %ptr) { 27; CHECK-LABEL: f2: 28; CHECK: # %bb.0: 29; CHECK-NEXT: vllebrzh %v24, 0(%r2) 30; CHECK-NEXT: br %r14 31 %val = load i16, ptr %ptr 32 %insert = insertelement <8 x i16> zeroinitializer, i16 %val, i32 3 33 %ret = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %insert) 34 ret <8 x i16> %ret 35} 36 37; Test VLLEBRZF. 38define <4 x i32> @f3(ptr %ptr) { 39; CHECK-LABEL: f3: 40; CHECK: # %bb.0: 41; CHECK-NEXT: vllebrzf %v24, 0(%r2) 42; CHECK-NEXT: br %r14 43 %val = load i32, ptr %ptr 44 %swap = call i32 @llvm.bswap.i32(i32 %val) 45 %ret = insertelement <4 x i32> zeroinitializer, i32 %swap, i32 1 46 ret <4 x i32> %ret 47} 48 49; Test VLLEBRZF using a vector bswap. 50define <4 x i32> @f4(ptr %ptr) { 51; CHECK-LABEL: f4: 52; CHECK: # %bb.0: 53; CHECK-NEXT: vllebrzf %v24, 0(%r2) 54; CHECK-NEXT: br %r14 55 %val = load i32, ptr %ptr 56 %insert = insertelement <4 x i32> zeroinitializer, i32 %val, i32 1 57 %ret = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %insert) 58 ret <4 x i32> %ret 59} 60 61; Test VLLEBRZG. 62define <2 x i64> @f5(ptr %ptr) { 63; CHECK-LABEL: f5: 64; CHECK: # %bb.0: 65; CHECK-NEXT: vllebrzg %v24, 0(%r2) 66; CHECK-NEXT: br %r14 67 %val = load i64, ptr %ptr 68 %swap = call i64 @llvm.bswap.i64(i64 %val) 69 %ret = insertelement <2 x i64> zeroinitializer, i64 %swap, i32 0 70 ret <2 x i64> %ret 71} 72 73; Test VLLEBRZG using a vector bswap. 74define <2 x i64> @f6(ptr %ptr) { 75; CHECK-LABEL: f6: 76; CHECK: # %bb.0: 77; CHECK-NEXT: vllebrzg %v24, 0(%r2) 78; CHECK-NEXT: br %r14 79 %val = load i64, ptr %ptr 80 %insert = insertelement <2 x i64> zeroinitializer, i64 %val, i32 0 81 %ret = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %insert) 82 ret <2 x i64> %ret 83} 84 85; Test VLLEBRZE. 86define <4 x i32> @f7(ptr %ptr) { 87; CHECK-LABEL: f7: 88; CHECK: # %bb.0: 89; CHECK-NEXT: vllebrze %v24, 0(%r2) 90; CHECK-NEXT: br %r14 91 %val = load i32, ptr %ptr 92 %swap = call i32 @llvm.bswap.i32(i32 %val) 93 %ret = insertelement <4 x i32> zeroinitializer, i32 %swap, i32 0 94 ret <4 x i32> %ret 95} 96 97; Test VLLEBRZE using a vector bswap. 98define <4 x i32> @f8(ptr %ptr) { 99; CHECK-LABEL: f8: 100; CHECK: # %bb.0: 101; CHECK-NEXT: vllebrze %v24, 0(%r2) 102; CHECK-NEXT: br %r14 103 %val = load i32, ptr %ptr 104 %insert = insertelement <4 x i32> zeroinitializer, i32 %val, i32 0 105 %ret = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %insert) 106 ret <4 x i32> %ret 107} 108 109; Test VLLEBRZH with the highest in-range offset. 110define <8 x i16> @f9(ptr %base) { 111; CHECK-LABEL: f9: 112; CHECK: # %bb.0: 113; CHECK-NEXT: vllebrzh %v24, 4094(%r2) 114; CHECK-NEXT: br %r14 115 %ptr = getelementptr i16, ptr %base, i64 2047 116 %val = load i16, ptr %ptr 117 %swap = call i16 @llvm.bswap.i16(i16 %val) 118 %ret = insertelement <8 x i16> zeroinitializer, i16 %swap, i32 3 119 ret <8 x i16> %ret 120} 121 122; Test VLLEBRZH with the next highest offset. 123define <8 x i16> @f10(ptr %base) { 124; CHECK-LABEL: f10: 125; CHECK: # %bb.0: 126; CHECK-NEXT: aghi %r2, 4096 127; CHECK-NEXT: vllebrzh %v24, 0(%r2) 128; CHECK-NEXT: br %r14 129 %ptr = getelementptr i16, ptr %base, i64 2048 130 %val = load i16, ptr %ptr 131 %swap = call i16 @llvm.bswap.i16(i16 %val) 132 %ret = insertelement <8 x i16> zeroinitializer, i16 %swap, i32 3 133 ret <8 x i16> %ret 134} 135 136; Test that VLLEBRZH allows an index. 137define <8 x i16> @f11(ptr %base, i64 %index) { 138; CHECK-LABEL: f11: 139; CHECK: # %bb.0: 140; CHECK-NEXT: sllg %r1, %r3, 1 141; CHECK-NEXT: vllebrzh %v24, 0(%r1,%r2) 142; CHECK-NEXT: br %r14 143 %ptr = getelementptr i16, ptr %base, i64 %index 144 %val = load i16, ptr %ptr 145 %swap = call i16 @llvm.bswap.i16(i16 %val) 146 %ret = insertelement <8 x i16> zeroinitializer, i16 %swap, i32 3 147 ret <8 x i16> %ret 148} 149 150