[RISCV] Support postRA vsetvl insertion pass (#70549)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vfabs-sdnode.ll
blob95a410ea56b74aec28aa23e11666842342e45f32
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v -target-abi=ilp32d \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v -target-abi=lp64d \
5 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
6 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+v -target-abi=ilp32d \
7 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
8 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+v -target-abi=lp64d \
9 ; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
11 declare <vscale x 1 x half> @llvm.fabs.nxv1f16(<vscale x 1 x half>)
13 define <vscale x 1 x half> @vfabs_nxv1f16(<vscale x 1 x half> %v) {
14 ; ZVFH-LABEL: vfabs_nxv1f16:
15 ; ZVFH:       # %bb.0:
16 ; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
17 ; ZVFH-NEXT:    vfabs.v v8, v8
18 ; ZVFH-NEXT:    ret
20 ; ZVFHMIN-LABEL: vfabs_nxv1f16:
21 ; ZVFHMIN:       # %bb.0:
22 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
23 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
24 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
25 ; ZVFHMIN-NEXT:    vfabs.v v9, v9
26 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
27 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
28 ; ZVFHMIN-NEXT:    ret
29   %r = call <vscale x 1 x half> @llvm.fabs.nxv1f16(<vscale x 1 x half> %v)
30   ret <vscale x 1 x half> %r
33 declare <vscale x 2 x half> @llvm.fabs.nxv2f16(<vscale x 2 x half>)
35 define <vscale x 2 x half> @vfabs_nxv2f16(<vscale x 2 x half> %v) {
36 ; ZVFH-LABEL: vfabs_nxv2f16:
37 ; ZVFH:       # %bb.0:
38 ; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
39 ; ZVFH-NEXT:    vfabs.v v8, v8
40 ; ZVFH-NEXT:    ret
42 ; ZVFHMIN-LABEL: vfabs_nxv2f16:
43 ; ZVFHMIN:       # %bb.0:
44 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
45 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8
46 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
47 ; ZVFHMIN-NEXT:    vfabs.v v9, v9
48 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
49 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v9
50 ; ZVFHMIN-NEXT:    ret
51   %r = call <vscale x 2 x half> @llvm.fabs.nxv2f16(<vscale x 2 x half> %v)
52   ret <vscale x 2 x half> %r
55 declare <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half>)
57 define <vscale x 4 x half> @vfabs_nxv4f16(<vscale x 4 x half> %v) {
58 ; ZVFH-LABEL: vfabs_nxv4f16:
59 ; ZVFH:       # %bb.0:
60 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
61 ; ZVFH-NEXT:    vfabs.v v8, v8
62 ; ZVFH-NEXT:    ret
64 ; ZVFHMIN-LABEL: vfabs_nxv4f16:
65 ; ZVFHMIN:       # %bb.0:
66 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
67 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8
68 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
69 ; ZVFHMIN-NEXT:    vfabs.v v10, v10
70 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
71 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v10
72 ; ZVFHMIN-NEXT:    ret
73   %r = call <vscale x 4 x half> @llvm.fabs.nxv4f16(<vscale x 4 x half> %v)
74   ret <vscale x 4 x half> %r
77 declare <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half>)
79 define <vscale x 8 x half> @vfabs_nxv8f16(<vscale x 8 x half> %v) {
80 ; ZVFH-LABEL: vfabs_nxv8f16:
81 ; ZVFH:       # %bb.0:
82 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
83 ; ZVFH-NEXT:    vfabs.v v8, v8
84 ; ZVFH-NEXT:    ret
86 ; ZVFHMIN-LABEL: vfabs_nxv8f16:
87 ; ZVFHMIN:       # %bb.0:
88 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
89 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8
90 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma
91 ; ZVFHMIN-NEXT:    vfabs.v v12, v12
92 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
93 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12
94 ; ZVFHMIN-NEXT:    ret
95   %r = call <vscale x 8 x half> @llvm.fabs.nxv8f16(<vscale x 8 x half> %v)
96   ret <vscale x 8 x half> %r
99 declare <vscale x 16 x half> @llvm.fabs.nxv16f16(<vscale x 16 x half>)
101 define <vscale x 16 x half> @vfabs_nxv16f16(<vscale x 16 x half> %v) {
102 ; ZVFH-LABEL: vfabs_nxv16f16:
103 ; ZVFH:       # %bb.0:
104 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
105 ; ZVFH-NEXT:    vfabs.v v8, v8
106 ; ZVFH-NEXT:    ret
108 ; ZVFHMIN-LABEL: vfabs_nxv16f16:
109 ; ZVFHMIN:       # %bb.0:
110 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
111 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
112 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
113 ; ZVFHMIN-NEXT:    vfabs.v v16, v16
114 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
115 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
116 ; ZVFHMIN-NEXT:    ret
117   %r = call <vscale x 16 x half> @llvm.fabs.nxv16f16(<vscale x 16 x half> %v)
118   ret <vscale x 16 x half> %r
121 declare <vscale x 32 x half> @llvm.fabs.nxv32f16(<vscale x 32 x half>)
123 define <vscale x 32 x half> @vfabs_nxv32f16(<vscale x 32 x half> %v) {
124 ; ZVFH-LABEL: vfabs_nxv32f16:
125 ; ZVFH:       # %bb.0:
126 ; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
127 ; ZVFH-NEXT:    vfabs.v v8, v8
128 ; ZVFH-NEXT:    ret
130 ; ZVFHMIN-LABEL: vfabs_nxv32f16:
131 ; ZVFHMIN:       # %bb.0:
132 ; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
133 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8
134 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
135 ; ZVFHMIN-NEXT:    vfabs.v v16, v16
136 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
137 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16
138 ; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12
139 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma
140 ; ZVFHMIN-NEXT:    vfabs.v v16, v16
141 ; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma
142 ; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16
143 ; ZVFHMIN-NEXT:    ret
144   %r = call <vscale x 32 x half> @llvm.fabs.nxv32f16(<vscale x 32 x half> %v)
145   ret <vscale x 32 x half> %r
148 declare <vscale x 1 x float> @llvm.fabs.nxv1f32(<vscale x 1 x float>)
150 define <vscale x 1 x float> @vfabs_nxv1f32(<vscale x 1 x float> %v) {
151 ; CHECK-LABEL: vfabs_nxv1f32:
152 ; CHECK:       # %bb.0:
153 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
154 ; CHECK-NEXT:    vfabs.v v8, v8
155 ; CHECK-NEXT:    ret
156   %r = call <vscale x 1 x float> @llvm.fabs.nxv1f32(<vscale x 1 x float> %v)
157   ret <vscale x 1 x float> %r
160 declare <vscale x 2 x float> @llvm.fabs.nxv2f32(<vscale x 2 x float>)
162 define <vscale x 2 x float> @vfabs_nxv2f32(<vscale x 2 x float> %v) {
163 ; CHECK-LABEL: vfabs_nxv2f32:
164 ; CHECK:       # %bb.0:
165 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
166 ; CHECK-NEXT:    vfabs.v v8, v8
167 ; CHECK-NEXT:    ret
168   %r = call <vscale x 2 x float> @llvm.fabs.nxv2f32(<vscale x 2 x float> %v)
169   ret <vscale x 2 x float> %r
172 declare <vscale x 4 x float> @llvm.fabs.nxv4f32(<vscale x 4 x float>)
174 define <vscale x 4 x float> @vfabs_nxv4f32(<vscale x 4 x float> %v) {
175 ; CHECK-LABEL: vfabs_nxv4f32:
176 ; CHECK:       # %bb.0:
177 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
178 ; CHECK-NEXT:    vfabs.v v8, v8
179 ; CHECK-NEXT:    ret
180   %r = call <vscale x 4 x float> @llvm.fabs.nxv4f32(<vscale x 4 x float> %v)
181   ret <vscale x 4 x float> %r
184 declare <vscale x 8 x float> @llvm.fabs.nxv8f32(<vscale x 8 x float>)
186 define <vscale x 8 x float> @vfabs_nxv8f32(<vscale x 8 x float> %v) {
187 ; CHECK-LABEL: vfabs_nxv8f32:
188 ; CHECK:       # %bb.0:
189 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
190 ; CHECK-NEXT:    vfabs.v v8, v8
191 ; CHECK-NEXT:    ret
192   %r = call <vscale x 8 x float> @llvm.fabs.nxv8f32(<vscale x 8 x float> %v)
193   ret <vscale x 8 x float> %r
196 declare <vscale x 16 x float> @llvm.fabs.nxv16f32(<vscale x 16 x float>)
198 define <vscale x 16 x float> @vfabs_nxv16f32(<vscale x 16 x float> %v) {
199 ; CHECK-LABEL: vfabs_nxv16f32:
200 ; CHECK:       # %bb.0:
201 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
202 ; CHECK-NEXT:    vfabs.v v8, v8
203 ; CHECK-NEXT:    ret
204   %r = call <vscale x 16 x float> @llvm.fabs.nxv16f32(<vscale x 16 x float> %v)
205   ret <vscale x 16 x float> %r
208 declare <vscale x 1 x double> @llvm.fabs.nxv1f64(<vscale x 1 x double>)
210 define <vscale x 1 x double> @vfabs_nxv1f64(<vscale x 1 x double> %v) {
211 ; CHECK-LABEL: vfabs_nxv1f64:
212 ; CHECK:       # %bb.0:
213 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
214 ; CHECK-NEXT:    vfabs.v v8, v8
215 ; CHECK-NEXT:    ret
216   %r = call <vscale x 1 x double> @llvm.fabs.nxv1f64(<vscale x 1 x double> %v)
217   ret <vscale x 1 x double> %r
220 declare <vscale x 2 x double> @llvm.fabs.nxv2f64(<vscale x 2 x double>)
222 define <vscale x 2 x double> @vfabs_nxv2f64(<vscale x 2 x double> %v) {
223 ; CHECK-LABEL: vfabs_nxv2f64:
224 ; CHECK:       # %bb.0:
225 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
226 ; CHECK-NEXT:    vfabs.v v8, v8
227 ; CHECK-NEXT:    ret
228   %r = call <vscale x 2 x double> @llvm.fabs.nxv2f64(<vscale x 2 x double> %v)
229   ret <vscale x 2 x double> %r
232 declare <vscale x 4 x double> @llvm.fabs.nxv4f64(<vscale x 4 x double>)
234 define <vscale x 4 x double> @vfabs_nxv4f64(<vscale x 4 x double> %v) {
235 ; CHECK-LABEL: vfabs_nxv4f64:
236 ; CHECK:       # %bb.0:
237 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
238 ; CHECK-NEXT:    vfabs.v v8, v8
239 ; CHECK-NEXT:    ret
240   %r = call <vscale x 4 x double> @llvm.fabs.nxv4f64(<vscale x 4 x double> %v)
241   ret <vscale x 4 x double> %r
244 declare <vscale x 8 x double> @llvm.fabs.nxv8f64(<vscale x 8 x double>)
246 define <vscale x 8 x double> @vfabs_nxv8f64(<vscale x 8 x double> %v) {
247 ; CHECK-LABEL: vfabs_nxv8f64:
248 ; CHECK:       # %bb.0:
249 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
250 ; CHECK-NEXT:    vfabs.v v8, v8
251 ; CHECK-NEXT:    ret
252   %r = call <vscale x 8 x double> @llvm.fabs.nxv8f64(<vscale x 8 x double> %v)
253   ret <vscale x 8 x double> %r