1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; Test vector intrinsics added with z15. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s 5 6declare <16 x i8> @llvm.s390.vsld(<16 x i8>, <16 x i8>, i32) 7declare <16 x i8> @llvm.s390.vsrd(<16 x i8>, <16 x i8>, i32) 8 9declare {<16 x i8>, i32} @llvm.s390.vstrsb(<16 x i8>, <16 x i8>, <16 x i8>) 10declare {<16 x i8>, i32} @llvm.s390.vstrsh(<8 x i16>, <8 x i16>, <16 x i8>) 11declare {<16 x i8>, i32} @llvm.s390.vstrsf(<4 x i32>, <4 x i32>, <16 x i8>) 12declare {<16 x i8>, i32} @llvm.s390.vstrszb(<16 x i8>, <16 x i8>, <16 x i8>) 13declare {<16 x i8>, i32} @llvm.s390.vstrszh(<8 x i16>, <8 x i16>, <16 x i8>) 14declare {<16 x i8>, i32} @llvm.s390.vstrszf(<4 x i32>, <4 x i32>, <16 x i8>) 15 16 17; VSLD with the minimum useful value. 18define <16 x i8> @test_vsld_1(<16 x i8> %a, <16 x i8> %b) { 19; CHECK-LABEL: test_vsld_1: 20; CHECK: # %bb.0: 21; CHECK-NEXT: vsld %v24, %v24, %v26, 1 22; CHECK-NEXT: br %r14 23 %res = call <16 x i8> @llvm.s390.vsld(<16 x i8> %a, <16 x i8> %b, i32 1) 24 ret <16 x i8> %res 25} 26 27; VSLD with the maximum value. 28define <16 x i8> @test_vsld_7(<16 x i8> %a, <16 x i8> %b) { 29; CHECK-LABEL: test_vsld_7: 30; CHECK: # %bb.0: 31; CHECK-NEXT: vsld %v24, %v24, %v26, 7 32; CHECK-NEXT: br %r14 33 %res = call <16 x i8> @llvm.s390.vsld(<16 x i8> %a, <16 x i8> %b, i32 7) 34 ret <16 x i8> %res 35} 36 37; VSRD with the minimum useful value. 38define <16 x i8> @test_vsrd_1(<16 x i8> %a, <16 x i8> %b) { 39; CHECK-LABEL: test_vsrd_1: 40; CHECK: # %bb.0: 41; CHECK-NEXT: vsrd %v24, %v24, %v26, 1 42; CHECK-NEXT: br %r14 43 %res = call <16 x i8> @llvm.s390.vsrd(<16 x i8> %a, <16 x i8> %b, i32 1) 44 ret <16 x i8> %res 45} 46 47; VSRD with the maximum value. 48define <16 x i8> @test_vsrd_7(<16 x i8> %a, <16 x i8> %b) { 49; CHECK-LABEL: test_vsrd_7: 50; CHECK: # %bb.0: 51; CHECK-NEXT: vsrd %v24, %v24, %v26, 7 52; CHECK-NEXT: br %r14 53 %res = call <16 x i8> @llvm.s390.vsrd(<16 x i8> %a, <16 x i8> %b, i32 7) 54 ret <16 x i8> %res 55} 56 57 58; VSTRSB. 59define <16 x i8> @test_vstrsb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, 60; CHECK-LABEL: test_vstrsb: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vstrsb %v24, %v24, %v26, %v28, 0 63; CHECK-NEXT: ipm %r0 64; CHECK-NEXT: srl %r0, 28 65; CHECK-NEXT: st %r0, 0(%r2) 66; CHECK-NEXT: br %r14 67 ptr %ccptr) { 68 %call = call {<16 x i8>, i32} @llvm.s390.vstrsb(<16 x i8> %a, <16 x i8> %b, 69 <16 x i8> %c) 70 %res = extractvalue {<16 x i8>, i32} %call, 0 71 %cc = extractvalue {<16 x i8>, i32} %call, 1 72 store i32 %cc, ptr %ccptr 73 ret <16 x i8> %res 74} 75 76; VSTRSH. 77define <16 x i8> @test_vstrsh(<8 x i16> %a, <8 x i16> %b, <16 x i8> %c, 78; CHECK-LABEL: test_vstrsh: 79; CHECK: # %bb.0: 80; CHECK-NEXT: vstrsh %v24, %v24, %v26, %v28, 0 81; CHECK-NEXT: ipm %r0 82; CHECK-NEXT: srl %r0, 28 83; CHECK-NEXT: st %r0, 0(%r2) 84; CHECK-NEXT: br %r14 85 ptr %ccptr) { 86 %call = call {<16 x i8>, i32} @llvm.s390.vstrsh(<8 x i16> %a, <8 x i16> %b, 87 <16 x i8> %c) 88 %res = extractvalue {<16 x i8>, i32} %call, 0 89 %cc = extractvalue {<16 x i8>, i32} %call, 1 90 store i32 %cc, ptr %ccptr 91 ret <16 x i8> %res 92} 93 94; VSTRSFS. 95define <16 x i8> @test_vstrsf(<4 x i32> %a, <4 x i32> %b, <16 x i8> %c, 96; CHECK-LABEL: test_vstrsf: 97; CHECK: # %bb.0: 98; CHECK-NEXT: vstrsf %v24, %v24, %v26, %v28, 0 99; CHECK-NEXT: ipm %r0 100; CHECK-NEXT: srl %r0, 28 101; CHECK-NEXT: st %r0, 0(%r2) 102; CHECK-NEXT: br %r14 103 ptr %ccptr) { 104 %call = call {<16 x i8>, i32} @llvm.s390.vstrsf(<4 x i32> %a, <4 x i32> %b, 105 <16 x i8> %c) 106 %res = extractvalue {<16 x i8>, i32} %call, 0 107 %cc = extractvalue {<16 x i8>, i32} %call, 1 108 store i32 %cc, ptr %ccptr 109 ret <16 x i8> %res 110} 111 112; VSTRSZB. 113define <16 x i8> @test_vstrszb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, 114; CHECK-LABEL: test_vstrszb: 115; CHECK: # %bb.0: 116; CHECK-NEXT: vstrszb %v24, %v24, %v26, %v28 117; CHECK-NEXT: ipm %r0 118; CHECK-NEXT: srl %r0, 28 119; CHECK-NEXT: st %r0, 0(%r2) 120; CHECK-NEXT: br %r14 121 ptr %ccptr) { 122 %call = call {<16 x i8>, i32} @llvm.s390.vstrszb(<16 x i8> %a, <16 x i8> %b, 123 <16 x i8> %c) 124 %res = extractvalue {<16 x i8>, i32} %call, 0 125 %cc = extractvalue {<16 x i8>, i32} %call, 1 126 store i32 %cc, ptr %ccptr 127 ret <16 x i8> %res 128} 129 130; VSTRSZH. 131define <16 x i8> @test_vstrszh(<8 x i16> %a, <8 x i16> %b, <16 x i8> %c, 132; CHECK-LABEL: test_vstrszh: 133; CHECK: # %bb.0: 134; CHECK-NEXT: vstrszh %v24, %v24, %v26, %v28 135; CHECK-NEXT: ipm %r0 136; CHECK-NEXT: srl %r0, 28 137; CHECK-NEXT: st %r0, 0(%r2) 138; CHECK-NEXT: br %r14 139 ptr %ccptr) { 140 %call = call {<16 x i8>, i32} @llvm.s390.vstrszh(<8 x i16> %a, <8 x i16> %b, 141 <16 x i8> %c) 142 %res = extractvalue {<16 x i8>, i32} %call, 0 143 %cc = extractvalue {<16 x i8>, i32} %call, 1 144 store i32 %cc, ptr %ccptr 145 ret <16 x i8> %res 146} 147 148; VSTRSZF. 149define <16 x i8> @test_vstrszf(<4 x i32> %a, <4 x i32> %b, <16 x i8> %c, 150; CHECK-LABEL: test_vstrszf: 151; CHECK: # %bb.0: 152; CHECK-NEXT: vstrszf %v24, %v24, %v26, %v28 153; CHECK-NEXT: ipm %r0 154; CHECK-NEXT: srl %r0, 28 155; CHECK-NEXT: st %r0, 0(%r2) 156; CHECK-NEXT: br %r14 157 ptr %ccptr) { 158 %call = call {<16 x i8>, i32} @llvm.s390.vstrszf(<4 x i32> %a, <4 x i32> %b, 159 <16 x i8> %c) 160 %res = extractvalue {<16 x i8>, i32} %call, 0 161 %cc = extractvalue {<16 x i8>, i32} %call, 1 162 store i32 %cc, ptr %ccptr 163 ret <16 x i8> %res 164} 165 166