1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v < %s | FileCheck %s
3 ; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s
5 declare <vscale x 2 x i16> @llvm.vp.sext.nxv2i16.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32)
7 define <vscale x 2 x i16> @vsext_nxv2i8_nxv2i16(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) {
8 ; CHECK-LABEL: vsext_nxv2i8_nxv2i16:
10 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
11 ; CHECK-NEXT: vsext.vf2 v9, v8, v0.t
12 ; CHECK-NEXT: vmv1r.v v8, v9
14 %v = call <vscale x 2 x i16> @llvm.vp.sext.nxv2i16.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 %vl)
15 ret <vscale x 2 x i16> %v
18 define <vscale x 2 x i16> @vsext_nxv2i8_nxv2i16_unmasked(<vscale x 2 x i8> %a, i32 zeroext %vl) {
19 ; CHECK-LABEL: vsext_nxv2i8_nxv2i16_unmasked:
21 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
22 ; CHECK-NEXT: vsext.vf2 v9, v8
23 ; CHECK-NEXT: vmv1r.v v8, v9
25 %v = call <vscale x 2 x i16> @llvm.vp.sext.nxv2i16.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl)
26 ret <vscale x 2 x i16> %v
29 declare <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32)
31 define <vscale x 2 x i32> @vsext_nxv2i8_nxv2i32(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) {
32 ; CHECK-LABEL: vsext_nxv2i8_nxv2i32:
34 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
35 ; CHECK-NEXT: vsext.vf4 v9, v8, v0.t
36 ; CHECK-NEXT: vmv.v.v v8, v9
38 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 %vl)
39 ret <vscale x 2 x i32> %v
42 define <vscale x 2 x i32> @vsext_nxv2i8_nxv2i32_unmasked(<vscale x 2 x i8> %a, i32 zeroext %vl) {
43 ; CHECK-LABEL: vsext_nxv2i8_nxv2i32_unmasked:
45 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
46 ; CHECK-NEXT: vsext.vf4 v9, v8
47 ; CHECK-NEXT: vmv.v.v v8, v9
49 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl)
50 ret <vscale x 2 x i32> %v
53 declare <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, i32)
55 define <vscale x 2 x i64> @vsext_nxv2i8_nxv2i64(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) {
56 ; CHECK-LABEL: vsext_nxv2i8_nxv2i64:
58 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
59 ; CHECK-NEXT: vsext.vf8 v10, v8, v0.t
60 ; CHECK-NEXT: vmv.v.v v8, v10
62 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> %m, i32 %vl)
63 ret <vscale x 2 x i64> %v
66 define <vscale x 2 x i64> @vsext_nxv2i8_nxv2i64_unmasked(<vscale x 2 x i8> %a, i32 zeroext %vl) {
67 ; CHECK-LABEL: vsext_nxv2i8_nxv2i64_unmasked:
69 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
70 ; CHECK-NEXT: vsext.vf8 v10, v8
71 ; CHECK-NEXT: vmv.v.v v8, v10
73 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i8(<vscale x 2 x i8> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl)
74 ret <vscale x 2 x i64> %v
77 declare <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i1>, i32)
79 define <vscale x 2 x i32> @vsext_nxv2i16_nxv2i32(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) {
80 ; CHECK-LABEL: vsext_nxv2i16_nxv2i32:
82 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
83 ; CHECK-NEXT: vsext.vf2 v9, v8, v0.t
84 ; CHECK-NEXT: vmv.v.v v8, v9
86 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 %vl)
87 ret <vscale x 2 x i32> %v
90 define <vscale x 2 x i32> @vsext_nxv2i16_nxv2i32_unmasked(<vscale x 2 x i16> %a, i32 zeroext %vl) {
91 ; CHECK-LABEL: vsext_nxv2i16_nxv2i32_unmasked:
93 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
94 ; CHECK-NEXT: vsext.vf2 v9, v8
95 ; CHECK-NEXT: vmv.v.v v8, v9
97 %v = call <vscale x 2 x i32> @llvm.vp.sext.nxv2i32.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl)
98 ret <vscale x 2 x i32> %v
101 declare <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i1>, i32)
103 define <vscale x 2 x i64> @vsext_nxv2i16_nxv2i64(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) {
104 ; CHECK-LABEL: vsext_nxv2i16_nxv2i64:
106 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
107 ; CHECK-NEXT: vsext.vf4 v10, v8, v0.t
108 ; CHECK-NEXT: vmv.v.v v8, v10
110 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> %m, i32 %vl)
111 ret <vscale x 2 x i64> %v
114 define <vscale x 2 x i64> @vsext_nxv2i16_nxv2i64_unmasked(<vscale x 2 x i16> %a, i32 zeroext %vl) {
115 ; CHECK-LABEL: vsext_nxv2i16_nxv2i64_unmasked:
117 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
118 ; CHECK-NEXT: vsext.vf4 v10, v8
119 ; CHECK-NEXT: vmv.v.v v8, v10
121 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl)
122 ret <vscale x 2 x i64> %v
125 declare <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i1>, i32)
127 define <vscale x 2 x i64> @vsext_nxv2i32_nxv2i64(<vscale x 2 x i32> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) {
128 ; CHECK-LABEL: vsext_nxv2i32_nxv2i64:
130 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
131 ; CHECK-NEXT: vsext.vf2 v10, v8, v0.t
132 ; CHECK-NEXT: vmv.v.v v8, v10
134 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i1> %m, i32 %vl)
135 ret <vscale x 2 x i64> %v
138 define <vscale x 2 x i64> @vsext_nxv2i32_nxv2i64_unmasked(<vscale x 2 x i32> %a, i32 zeroext %vl) {
139 ; CHECK-LABEL: vsext_nxv2i32_nxv2i64_unmasked:
141 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
142 ; CHECK-NEXT: vsext.vf2 v10, v8
143 ; CHECK-NEXT: vmv.v.v v8, v10
145 %v = call <vscale x 2 x i64> @llvm.vp.sext.nxv2i64.nxv2i32(<vscale x 2 x i32> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl)
146 ret <vscale x 2 x i64> %v
149 declare <vscale x 32 x i32> @llvm.vp.sext.nxv32i32.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i1>, i32)
151 define <vscale x 32 x i32> @vsext_nxv32i8_nxv32i32(<vscale x 32 x i8> %a, <vscale x 32 x i1> %m, i32 zeroext %vl) {
152 ; CHECK-LABEL: vsext_nxv32i8_nxv32i32:
154 ; CHECK-NEXT: vmv1r.v v12, v0
155 ; CHECK-NEXT: csrr a1, vlenb
156 ; CHECK-NEXT: srli a2, a1, 2
157 ; CHECK-NEXT: vsetvli a3, zero, e8, mf2, ta, ma
158 ; CHECK-NEXT: vslidedown.vx v0, v0, a2
159 ; CHECK-NEXT: slli a1, a1, 1
160 ; CHECK-NEXT: sub a2, a0, a1
161 ; CHECK-NEXT: sltu a3, a0, a2
162 ; CHECK-NEXT: addi a3, a3, -1
163 ; CHECK-NEXT: and a2, a3, a2
164 ; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma
165 ; CHECK-NEXT: vsext.vf4 v16, v10, v0.t
166 ; CHECK-NEXT: bltu a0, a1, .LBB12_2
167 ; CHECK-NEXT: # %bb.1:
168 ; CHECK-NEXT: mv a0, a1
169 ; CHECK-NEXT: .LBB12_2:
170 ; CHECK-NEXT: vmv1r.v v0, v12
171 ; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma
172 ; CHECK-NEXT: vsext.vf4 v24, v8, v0.t
173 ; CHECK-NEXT: vmv.v.v v8, v24
175 %v = call <vscale x 32 x i32> @llvm.vp.sext.nxv32i32.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i1> %m, i32 %vl)
176 ret <vscale x 32 x i32> %v
179 define <vscale x 32 x i32> @vsext_nxv32i8_nxv32i32_unmasked(<vscale x 32 x i8> %a, i32 zeroext %vl) {
180 ; CHECK-LABEL: vsext_nxv32i8_nxv32i32_unmasked:
182 ; CHECK-NEXT: csrr a1, vlenb
183 ; CHECK-NEXT: slli a1, a1, 1
184 ; CHECK-NEXT: sub a2, a0, a1
185 ; CHECK-NEXT: sltu a3, a0, a2
186 ; CHECK-NEXT: addi a3, a3, -1
187 ; CHECK-NEXT: and a2, a3, a2
188 ; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma
189 ; CHECK-NEXT: vsext.vf4 v16, v10
190 ; CHECK-NEXT: bltu a0, a1, .LBB13_2
191 ; CHECK-NEXT: # %bb.1:
192 ; CHECK-NEXT: mv a0, a1
193 ; CHECK-NEXT: .LBB13_2:
194 ; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma
195 ; CHECK-NEXT: vsext.vf4 v24, v8
196 ; CHECK-NEXT: vmv.v.v v8, v24
198 %v = call <vscale x 32 x i32> @llvm.vp.sext.nxv32i32.nxv32i8(<vscale x 32 x i8> %a, <vscale x 32 x i1> splat (i1 true), i32 %vl)
199 ret <vscale x 32 x i32> %v