1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2
4 ; RUN: llc -mtriple=riscv32 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1-RV32
5 ; RUN: llc -mtriple=riscv64 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1-RV64
7 define void @abs_v16i8(ptr %x) {
8 ; CHECK-LABEL: abs_v16i8:
10 ; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
11 ; CHECK-NEXT: vle8.v v8, (a0)
12 ; CHECK-NEXT: vrsub.vi v9, v8, 0
13 ; CHECK-NEXT: vmax.vv v8, v8, v9
14 ; CHECK-NEXT: vse8.v v8, (a0)
16 %a = load <16 x i8>, ptr %x
17 %b = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %a, i1 false)
18 store <16 x i8> %b, ptr %x
21 declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
23 define void @abs_v8i16(ptr %x) {
24 ; CHECK-LABEL: abs_v8i16:
26 ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
27 ; CHECK-NEXT: vle16.v v8, (a0)
28 ; CHECK-NEXT: vrsub.vi v9, v8, 0
29 ; CHECK-NEXT: vmax.vv v8, v8, v9
30 ; CHECK-NEXT: vse16.v v8, (a0)
32 %a = load <8 x i16>, ptr %x
33 %b = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %a, i1 false)
34 store <8 x i16> %b, ptr %x
37 declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)
39 define void @abs_v6i16(ptr %x) {
40 ; CHECK-LABEL: abs_v6i16:
42 ; CHECK-NEXT: vsetivli zero, 6, e16, m1, ta, ma
43 ; CHECK-NEXT: vle16.v v8, (a0)
44 ; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
45 ; CHECK-NEXT: vrsub.vi v9, v8, 0
46 ; CHECK-NEXT: vmax.vv v8, v8, v9
47 ; CHECK-NEXT: vsetivli zero, 6, e16, m1, ta, ma
48 ; CHECK-NEXT: vse16.v v8, (a0)
50 %a = load <6 x i16>, ptr %x
51 %b = call <6 x i16> @llvm.abs.v6i16(<6 x i16> %a, i1 false)
52 store <6 x i16> %b, ptr %x
55 declare <6 x i16> @llvm.abs.v6i16(<6 x i16>, i1)
57 define void @abs_v4i32(ptr %x) {
58 ; CHECK-LABEL: abs_v4i32:
60 ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
61 ; CHECK-NEXT: vle32.v v8, (a0)
62 ; CHECK-NEXT: vrsub.vi v9, v8, 0
63 ; CHECK-NEXT: vmax.vv v8, v8, v9
64 ; CHECK-NEXT: vse32.v v8, (a0)
66 %a = load <4 x i32>, ptr %x
67 %b = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a, i1 false)
68 store <4 x i32> %b, ptr %x
71 declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)
73 define void @abs_v2i64(ptr %x) {
74 ; CHECK-LABEL: abs_v2i64:
76 ; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma
77 ; CHECK-NEXT: vle64.v v8, (a0)
78 ; CHECK-NEXT: vrsub.vi v9, v8, 0
79 ; CHECK-NEXT: vmax.vv v8, v8, v9
80 ; CHECK-NEXT: vse64.v v8, (a0)
82 %a = load <2 x i64>, ptr %x
83 %b = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %a, i1 false)
84 store <2 x i64> %b, ptr %x
87 declare <2 x i64> @llvm.abs.v2i64(<2 x i64>, i1)
89 define void @abs_v32i8(ptr %x) {
90 ; LMULMAX2-LABEL: abs_v32i8:
92 ; LMULMAX2-NEXT: li a1, 32
93 ; LMULMAX2-NEXT: vsetvli zero, a1, e8, m2, ta, ma
94 ; LMULMAX2-NEXT: vle8.v v8, (a0)
95 ; LMULMAX2-NEXT: vrsub.vi v10, v8, 0
96 ; LMULMAX2-NEXT: vmax.vv v8, v8, v10
97 ; LMULMAX2-NEXT: vse8.v v8, (a0)
100 ; LMULMAX1-RV32-LABEL: abs_v32i8:
101 ; LMULMAX1-RV32: # %bb.0:
102 ; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, ma
103 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
104 ; LMULMAX1-RV32-NEXT: vle8.v v8, (a1)
105 ; LMULMAX1-RV32-NEXT: vle8.v v9, (a0)
106 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v8, 0
107 ; LMULMAX1-RV32-NEXT: vmax.vv v8, v8, v10
108 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v9, 0
109 ; LMULMAX1-RV32-NEXT: vmax.vv v9, v9, v10
110 ; LMULMAX1-RV32-NEXT: vse8.v v9, (a0)
111 ; LMULMAX1-RV32-NEXT: vse8.v v8, (a1)
112 ; LMULMAX1-RV32-NEXT: ret
114 ; LMULMAX1-RV64-LABEL: abs_v32i8:
115 ; LMULMAX1-RV64: # %bb.0:
116 ; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma
117 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
118 ; LMULMAX1-RV64-NEXT: vle8.v v8, (a1)
119 ; LMULMAX1-RV64-NEXT: vle8.v v9, (a0)
120 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v8, 0
121 ; LMULMAX1-RV64-NEXT: vmax.vv v8, v8, v10
122 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v9, 0
123 ; LMULMAX1-RV64-NEXT: vmax.vv v9, v9, v10
124 ; LMULMAX1-RV64-NEXT: vse8.v v9, (a0)
125 ; LMULMAX1-RV64-NEXT: vse8.v v8, (a1)
126 ; LMULMAX1-RV64-NEXT: ret
127 %a = load <32 x i8>, ptr %x
128 %b = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %a, i1 false)
129 store <32 x i8> %b, ptr %x
132 declare <32 x i8> @llvm.abs.v32i8(<32 x i8>, i1)
134 define void @abs_v16i16(ptr %x) {
135 ; LMULMAX2-LABEL: abs_v16i16:
137 ; LMULMAX2-NEXT: vsetivli zero, 16, e16, m2, ta, ma
138 ; LMULMAX2-NEXT: vle16.v v8, (a0)
139 ; LMULMAX2-NEXT: vrsub.vi v10, v8, 0
140 ; LMULMAX2-NEXT: vmax.vv v8, v8, v10
141 ; LMULMAX2-NEXT: vse16.v v8, (a0)
144 ; LMULMAX1-RV32-LABEL: abs_v16i16:
145 ; LMULMAX1-RV32: # %bb.0:
146 ; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, ma
147 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
148 ; LMULMAX1-RV32-NEXT: vle16.v v8, (a1)
149 ; LMULMAX1-RV32-NEXT: vle16.v v9, (a0)
150 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v8, 0
151 ; LMULMAX1-RV32-NEXT: vmax.vv v8, v8, v10
152 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v9, 0
153 ; LMULMAX1-RV32-NEXT: vmax.vv v9, v9, v10
154 ; LMULMAX1-RV32-NEXT: vse16.v v9, (a0)
155 ; LMULMAX1-RV32-NEXT: vse16.v v8, (a1)
156 ; LMULMAX1-RV32-NEXT: ret
158 ; LMULMAX1-RV64-LABEL: abs_v16i16:
159 ; LMULMAX1-RV64: # %bb.0:
160 ; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, ma
161 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
162 ; LMULMAX1-RV64-NEXT: vle16.v v8, (a1)
163 ; LMULMAX1-RV64-NEXT: vle16.v v9, (a0)
164 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v8, 0
165 ; LMULMAX1-RV64-NEXT: vmax.vv v8, v8, v10
166 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v9, 0
167 ; LMULMAX1-RV64-NEXT: vmax.vv v9, v9, v10
168 ; LMULMAX1-RV64-NEXT: vse16.v v9, (a0)
169 ; LMULMAX1-RV64-NEXT: vse16.v v8, (a1)
170 ; LMULMAX1-RV64-NEXT: ret
171 %a = load <16 x i16>, ptr %x
172 %b = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %a, i1 false)
173 store <16 x i16> %b, ptr %x
176 declare <16 x i16> @llvm.abs.v16i16(<16 x i16>, i1)
178 define void @abs_v8i32(ptr %x) {
179 ; LMULMAX2-LABEL: abs_v8i32:
181 ; LMULMAX2-NEXT: vsetivli zero, 8, e32, m2, ta, ma
182 ; LMULMAX2-NEXT: vle32.v v8, (a0)
183 ; LMULMAX2-NEXT: vrsub.vi v10, v8, 0
184 ; LMULMAX2-NEXT: vmax.vv v8, v8, v10
185 ; LMULMAX2-NEXT: vse32.v v8, (a0)
188 ; LMULMAX1-RV32-LABEL: abs_v8i32:
189 ; LMULMAX1-RV32: # %bb.0:
190 ; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
191 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
192 ; LMULMAX1-RV32-NEXT: vle32.v v8, (a1)
193 ; LMULMAX1-RV32-NEXT: vle32.v v9, (a0)
194 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v8, 0
195 ; LMULMAX1-RV32-NEXT: vmax.vv v8, v8, v10
196 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v9, 0
197 ; LMULMAX1-RV32-NEXT: vmax.vv v9, v9, v10
198 ; LMULMAX1-RV32-NEXT: vse32.v v9, (a0)
199 ; LMULMAX1-RV32-NEXT: vse32.v v8, (a1)
200 ; LMULMAX1-RV32-NEXT: ret
202 ; LMULMAX1-RV64-LABEL: abs_v8i32:
203 ; LMULMAX1-RV64: # %bb.0:
204 ; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, ma
205 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
206 ; LMULMAX1-RV64-NEXT: vle32.v v8, (a1)
207 ; LMULMAX1-RV64-NEXT: vle32.v v9, (a0)
208 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v8, 0
209 ; LMULMAX1-RV64-NEXT: vmax.vv v8, v8, v10
210 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v9, 0
211 ; LMULMAX1-RV64-NEXT: vmax.vv v9, v9, v10
212 ; LMULMAX1-RV64-NEXT: vse32.v v9, (a0)
213 ; LMULMAX1-RV64-NEXT: vse32.v v8, (a1)
214 ; LMULMAX1-RV64-NEXT: ret
215 %a = load <8 x i32>, ptr %x
216 %b = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %a, i1 false)
217 store <8 x i32> %b, ptr %x
220 declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)
222 define void @abs_v4i64(ptr %x) {
223 ; LMULMAX2-LABEL: abs_v4i64:
225 ; LMULMAX2-NEXT: vsetivli zero, 4, e64, m2, ta, ma
226 ; LMULMAX2-NEXT: vle64.v v8, (a0)
227 ; LMULMAX2-NEXT: vrsub.vi v10, v8, 0
228 ; LMULMAX2-NEXT: vmax.vv v8, v8, v10
229 ; LMULMAX2-NEXT: vse64.v v8, (a0)
232 ; LMULMAX1-RV32-LABEL: abs_v4i64:
233 ; LMULMAX1-RV32: # %bb.0:
234 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
235 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
236 ; LMULMAX1-RV32-NEXT: vle64.v v8, (a1)
237 ; LMULMAX1-RV32-NEXT: vle64.v v9, (a0)
238 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v8, 0
239 ; LMULMAX1-RV32-NEXT: vmax.vv v8, v8, v10
240 ; LMULMAX1-RV32-NEXT: vrsub.vi v10, v9, 0
241 ; LMULMAX1-RV32-NEXT: vmax.vv v9, v9, v10
242 ; LMULMAX1-RV32-NEXT: vse64.v v9, (a0)
243 ; LMULMAX1-RV32-NEXT: vse64.v v8, (a1)
244 ; LMULMAX1-RV32-NEXT: ret
246 ; LMULMAX1-RV64-LABEL: abs_v4i64:
247 ; LMULMAX1-RV64: # %bb.0:
248 ; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
249 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
250 ; LMULMAX1-RV64-NEXT: vle64.v v8, (a1)
251 ; LMULMAX1-RV64-NEXT: vle64.v v9, (a0)
252 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v8, 0
253 ; LMULMAX1-RV64-NEXT: vmax.vv v8, v8, v10
254 ; LMULMAX1-RV64-NEXT: vrsub.vi v10, v9, 0
255 ; LMULMAX1-RV64-NEXT: vmax.vv v9, v9, v10
256 ; LMULMAX1-RV64-NEXT: vse64.v v9, (a0)
257 ; LMULMAX1-RV64-NEXT: vse64.v v8, (a1)
258 ; LMULMAX1-RV64-NEXT: ret
259 %a = load <4 x i64>, ptr %x
260 %b = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %a, i1 false)
261 store <4 x i64> %b, ptr %x
264 declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)