1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \
3 ; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \
4 ; RUN: --check-prefixes=CHECK,ZVFH
5 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \
6 ; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
7 ; RUN: --check-prefixes=CHECK,ZVFH
8 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
9 ; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \
10 ; RUN: --check-prefixes=CHECK,ZVFHMIN
11 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \
12 ; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \
13 ; RUN: --check-prefixes=CHECK,ZVFHMIN
15 define <vscale x 2 x i1> @isnan_nxv2bf16(<vscale x 2 x bfloat> %x) {
16 ; CHECK-LABEL: isnan_nxv2bf16:
18 ; CHECK-NEXT: lui a0, 8
19 ; CHECK-NEXT: addi a1, a0, -1
20 ; CHECK-NEXT: vsetvli a2, zero, e16, mf2, ta, ma
21 ; CHECK-NEXT: vand.vx v8, v8, a1
22 ; CHECK-NEXT: addi a0, a0, -128
23 ; CHECK-NEXT: vmsgt.vx v0, v8, a0
25 %1 = call <vscale x 2 x i1> @llvm.is.fpclass.nxv2bf16(<vscale x 2 x bfloat> %x, i32 3) ; nan
26 ret <vscale x 2 x i1> %1
29 define <vscale x 2 x i1> @isnan_nxv2f16(<vscale x 2 x half> %x) {
30 ; ZVFH-LABEL: isnan_nxv2f16:
32 ; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
33 ; ZVFH-NEXT: vfclass.v v8, v8
34 ; ZVFH-NEXT: li a0, 768
35 ; ZVFH-NEXT: vand.vx v8, v8, a0
36 ; ZVFH-NEXT: vmsne.vi v0, v8, 0
39 ; ZVFHMIN-LABEL: isnan_nxv2f16:
41 ; ZVFHMIN-NEXT: lui a0, 8
42 ; ZVFHMIN-NEXT: addi a0, a0, -1
43 ; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
44 ; ZVFHMIN-NEXT: vand.vx v8, v8, a0
45 ; ZVFHMIN-NEXT: li a0, 31
46 ; ZVFHMIN-NEXT: slli a0, a0, 10
47 ; ZVFHMIN-NEXT: vmsgt.vx v0, v8, a0
49 %1 = call <vscale x 2 x i1> @llvm.is.fpclass.nxv2f16(<vscale x 2 x half> %x, i32 3) ; nan
50 ret <vscale x 2 x i1> %1
53 define <vscale x 2 x i1> @isnan_nxv2f32(<vscale x 2 x float> %x) {
54 ; CHECK-LABEL: isnan_nxv2f32:
56 ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
57 ; CHECK-NEXT: vfclass.v v8, v8
58 ; CHECK-NEXT: li a0, 927
59 ; CHECK-NEXT: vand.vx v8, v8, a0
60 ; CHECK-NEXT: vmsne.vi v0, v8, 0
62 %1 = call <vscale x 2 x i1> @llvm.is.fpclass.nxv2f32(<vscale x 2 x float> %x, i32 639)
63 ret <vscale x 2 x i1> %1
67 define <vscale x 4 x i1> @isnan_nxv4f32(<vscale x 4 x float> %x) {
68 ; CHECK-LABEL: isnan_nxv4f32:
70 ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
71 ; CHECK-NEXT: vfclass.v v8, v8
72 ; CHECK-NEXT: li a0, 768
73 ; CHECK-NEXT: vand.vx v8, v8, a0
74 ; CHECK-NEXT: vmsne.vi v0, v8, 0
76 %1 = call <vscale x 4 x i1> @llvm.is.fpclass.nxv4f32(<vscale x 4 x float> %x, i32 3) ; nan
77 ret <vscale x 4 x i1> %1
80 define <vscale x 8 x i1> @isnan_nxv8f32(<vscale x 8 x float> %x) {
81 ; CHECK-LABEL: isnan_nxv8f32:
83 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
84 ; CHECK-NEXT: vfclass.v v8, v8
85 ; CHECK-NEXT: li a0, 512
86 ; CHECK-NEXT: vmseq.vx v0, v8, a0
88 %1 = call <vscale x 8 x i1> @llvm.is.fpclass.nxv8f32(<vscale x 8 x float> %x, i32 2)
89 ret <vscale x 8 x i1> %1
92 define <vscale x 16 x i1> @isnan_nxv16f32(<vscale x 16 x float> %x) {
93 ; CHECK-LABEL: isnan_nxv16f32:
95 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
96 ; CHECK-NEXT: vfclass.v v8, v8
97 ; CHECK-NEXT: li a0, 256
98 ; CHECK-NEXT: vmseq.vx v0, v8, a0
100 %1 = call <vscale x 16 x i1> @llvm.is.fpclass.nxv16f32(<vscale x 16 x float> %x, i32 1)
101 ret <vscale x 16 x i1> %1
104 define <vscale x 2 x i1> @isnormal_nxv2f64(<vscale x 2 x double> %x) {
105 ; CHECK-LABEL: isnormal_nxv2f64:
107 ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
108 ; CHECK-NEXT: vfclass.v v8, v8
109 ; CHECK-NEXT: li a0, 129
110 ; CHECK-NEXT: vand.vx v8, v8, a0
111 ; CHECK-NEXT: vmsne.vi v0, v8, 0
113 %1 = call <vscale x 2 x i1> @llvm.is.fpclass.nxv2f64(<vscale x 2 x double> %x, i32 516) ; 0x204 = "inf"
114 ret <vscale x 2 x i1> %1
117 define <vscale x 4 x i1> @isposinf_nxv4f64(<vscale x 4 x double> %x) {
118 ; CHECK-LABEL: isposinf_nxv4f64:
120 ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
121 ; CHECK-NEXT: vfclass.v v8, v8
122 ; CHECK-NEXT: li a0, 128
123 ; CHECK-NEXT: vmseq.vx v0, v8, a0
125 %1 = call <vscale x 4 x i1> @llvm.is.fpclass.nxv4f64(<vscale x 4 x double> %x, i32 512) ; 0x200 = "+inf"
126 ret <vscale x 4 x i1> %1
129 define <vscale x 8 x i1> @isneginf_nxv8f64(<vscale x 8 x double> %x) {
130 ; CHECK-LABEL: isneginf_nxv8f64:
132 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
133 ; CHECK-NEXT: vfclass.v v8, v8
134 ; CHECK-NEXT: vmseq.vi v0, v8, 1
136 %1 = call <vscale x 8 x i1> @llvm.is.fpclass.nxv8f64(<vscale x 8 x double> %x, i32 4) ; "-inf"
137 ret <vscale x 8 x i1> %1
140 define <vscale x 16 x i1> @isfinite_nxv16f32(<vscale x 16 x float> %x) {
141 ; CHECK-LABEL: isfinite_nxv16f32:
143 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
144 ; CHECK-NEXT: vfclass.v v8, v8
145 ; CHECK-NEXT: li a0, 126
146 ; CHECK-NEXT: vand.vx v8, v8, a0
147 ; CHECK-NEXT: vmsne.vi v0, v8, 0
149 %1 = call <vscale x 16 x i1> @llvm.is.fpclass.nxv16f32(<vscale x 16 x float> %x, i32 504) ; 0x1f8 = "finite"
150 ret <vscale x 16 x i1> %1
153 define <vscale x 16 x i1> @isposfinite_nxv16f32(<vscale x 16 x float> %x) {
154 ; CHECK-LABEL: isposfinite_nxv16f32:
156 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
157 ; CHECK-NEXT: vfclass.v v8, v8
158 ; CHECK-NEXT: li a0, 112
159 ; CHECK-NEXT: vand.vx v8, v8, a0
160 ; CHECK-NEXT: vmsne.vi v0, v8, 0
162 %1 = call <vscale x 16 x i1> @llvm.is.fpclass.nxv16f32(<vscale x 16 x float> %x, i32 448) ; 0x1c0 = "+finite"
163 ret <vscale x 16 x i1> %1
166 define <vscale x 16 x i1> @isnegfinite_nxv16f32(<vscale x 16 x float> %x) {
167 ; CHECK-LABEL: isnegfinite_nxv16f32:
169 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
170 ; CHECK-NEXT: vfclass.v v8, v8
171 ; CHECK-NEXT: vand.vi v8, v8, 14
172 ; CHECK-NEXT: vmsne.vi v0, v8, 0
174 %1 = call <vscale x 16 x i1> @llvm.is.fpclass.nxv16f32(<vscale x 16 x float> %x, i32 56) ; 0x38 = "-finite"
175 ret <vscale x 16 x i1> %1
178 define <vscale x 16 x i1> @isnotfinite_nxv16f32(<vscale x 16 x float> %x) {
179 ; CHECK-LABEL: isnotfinite_nxv16f32:
181 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
182 ; CHECK-NEXT: vfclass.v v8, v8
183 ; CHECK-NEXT: li a0, 897
184 ; CHECK-NEXT: vand.vx v8, v8, a0
185 ; CHECK-NEXT: vmsne.vi v0, v8, 0
187 %1 = call <vscale x 16 x i1> @llvm.is.fpclass.nxv16f32(<vscale x 16 x float> %x, i32 519) ; 0x207 = "inf|nan"
188 ret <vscale x 16 x i1> %1
191 declare <vscale x 2 x i1> @llvm.is.fpclass.nxv2f16(<vscale x 2 x half>, i32)
192 declare <vscale x 2 x i1> @llvm.is.fpclass.nxv2f32(<vscale x 2 x float>, i32)
193 declare <vscale x 4 x i1> @llvm.is.fpclass.nxv4f32(<vscale x 4 x float>, i32)
194 declare <vscale x 8 x i1> @llvm.is.fpclass.nxv8f32(<vscale x 8 x float>, i32)
195 declare <vscale x 16 x i1> @llvm.is.fpclass.nxv16f32(<vscale x 16 x float>, i32)
196 declare <vscale x 2 x i1> @llvm.is.fpclass.nxv2f64(<vscale x 2 x double>, i32)
197 declare <vscale x 4 x i1> @llvm.is.fpclass.nxv4f64(<vscale x 4 x double>, i32)
198 declare <vscale x 8 x i1> @llvm.is.fpclass.nxv8f64(<vscale x 8 x double>, i32)