3
3
; RUN: | FileCheck %s
4
4
; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa,+zfh < %s \
5
5
; RUN: | FileCheck %s
6
+ ; RUN: llc -mtriple=riscv32 -target-abi ilp32f -mattr=+zfa,+zfhmin < %s \
7
+ ; RUN: | FileCheck %s --check-prefix=ZFHMIN
8
+ ; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa,+zfhmin < %s \
9
+ ; RUN: | FileCheck %s --check-prefix=ZFHMIN
6
10
7
11
declare half @llvm.minimum.f16 (half , half )
8
12
@@ -11,6 +15,14 @@ define half @fminm_h(half %a, half %b) nounwind {
11
15
; CHECK: # %bb.0:
12
16
; CHECK-NEXT: fminm.h fa0, fa0, fa1
13
17
; CHECK-NEXT: ret
18
+ ;
19
+ ; ZFHMIN-LABEL: fminm_h:
20
+ ; ZFHMIN: # %bb.0:
21
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa1
22
+ ; ZFHMIN-NEXT: fcvt.s.h fa4, fa0
23
+ ; ZFHMIN-NEXT: fminm.s fa5, fa4, fa5
24
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
25
+ ; ZFHMIN-NEXT: ret
14
26
%1 = call half @llvm.minimum.f16 (half %a , half %b )
15
27
ret half %1
16
28
}
@@ -22,6 +34,14 @@ define half @fmaxm_h(half %a, half %b) nounwind {
22
34
; CHECK: # %bb.0:
23
35
; CHECK-NEXT: fmaxm.h fa0, fa0, fa1
24
36
; CHECK-NEXT: ret
37
+ ;
38
+ ; ZFHMIN-LABEL: fmaxm_h:
39
+ ; ZFHMIN: # %bb.0:
40
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa1
41
+ ; ZFHMIN-NEXT: fcvt.s.h fa4, fa0
42
+ ; ZFHMIN-NEXT: fmaxm.s fa5, fa4, fa5
43
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
44
+ ; ZFHMIN-NEXT: ret
25
45
%1 = tail call half @llvm.maximum.f16 (half %a , half %b )
26
46
ret half %1
27
47
}
@@ -31,6 +51,13 @@ define half @fround_h_1(half %a) nounwind {
31
51
; CHECK: # %bb.0:
32
52
; CHECK-NEXT: fround.h fa0, fa0, rmm
33
53
; CHECK-NEXT: ret
54
+ ;
55
+ ; ZFHMIN-LABEL: fround_h_1:
56
+ ; ZFHMIN: # %bb.0:
57
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
58
+ ; ZFHMIN-NEXT: fround.s fa5, fa5, rmm
59
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
60
+ ; ZFHMIN-NEXT: ret
34
61
%call = tail call half @llvm.round.f16 (half %a ) nounwind readnone
35
62
ret half %call
36
63
}
@@ -43,6 +70,13 @@ define half @fround_h_2(half %a) nounwind {
43
70
; CHECK: # %bb.0:
44
71
; CHECK-NEXT: fround.h fa0, fa0, rdn
45
72
; CHECK-NEXT: ret
73
+ ;
74
+ ; ZFHMIN-LABEL: fround_h_2:
75
+ ; ZFHMIN: # %bb.0:
76
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
77
+ ; ZFHMIN-NEXT: fround.s fa5, fa5, rdn
78
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
79
+ ; ZFHMIN-NEXT: ret
46
80
%call = tail call half @llvm.floor.f16 (half %a ) nounwind readnone
47
81
ret half %call
48
82
}
@@ -55,6 +89,13 @@ define half @fround_h_3(half %a) nounwind {
55
89
; CHECK: # %bb.0:
56
90
; CHECK-NEXT: fround.h fa0, fa0, rup
57
91
; CHECK-NEXT: ret
92
+ ;
93
+ ; ZFHMIN-LABEL: fround_h_3:
94
+ ; ZFHMIN: # %bb.0:
95
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
96
+ ; ZFHMIN-NEXT: fround.s fa5, fa5, rup
97
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
98
+ ; ZFHMIN-NEXT: ret
58
99
%call = tail call half @llvm.ceil.f16 (half %a ) nounwind readnone
59
100
ret half %call
60
101
}
@@ -67,6 +108,13 @@ define half @fround_h_4(half %a) nounwind {
67
108
; CHECK: # %bb.0:
68
109
; CHECK-NEXT: fround.h fa0, fa0, rtz
69
110
; CHECK-NEXT: ret
111
+ ;
112
+ ; ZFHMIN-LABEL: fround_h_4:
113
+ ; ZFHMIN: # %bb.0:
114
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
115
+ ; ZFHMIN-NEXT: fround.s fa5, fa5, rtz
116
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
117
+ ; ZFHMIN-NEXT: ret
70
118
%call = tail call half @llvm.trunc.f16 (half %a ) nounwind readnone
71
119
ret half %call
72
120
}
@@ -79,6 +127,13 @@ define half @fround_h_5(half %a) nounwind {
79
127
; CHECK: # %bb.0:
80
128
; CHECK-NEXT: fround.h fa0, fa0
81
129
; CHECK-NEXT: ret
130
+ ;
131
+ ; ZFHMIN-LABEL: fround_h_5:
132
+ ; ZFHMIN: # %bb.0:
133
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
134
+ ; ZFHMIN-NEXT: fround.s fa5, fa5
135
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
136
+ ; ZFHMIN-NEXT: ret
82
137
%call = tail call half @llvm.nearbyint.f16 (half %a ) nounwind readnone
83
138
ret half %call
84
139
}
@@ -91,6 +146,13 @@ define half @froundnx_h(half %a) nounwind {
91
146
; CHECK: # %bb.0:
92
147
; CHECK-NEXT: froundnx.h fa0, fa0
93
148
; CHECK-NEXT: ret
149
+ ;
150
+ ; ZFHMIN-LABEL: froundnx_h:
151
+ ; ZFHMIN: # %bb.0:
152
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
153
+ ; ZFHMIN-NEXT: froundnx.s fa5, fa5
154
+ ; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
155
+ ; ZFHMIN-NEXT: ret
94
156
%call = tail call half @llvm.rint.f16 (half %a ) nounwind readnone
95
157
ret half %call
96
158
}
@@ -104,6 +166,13 @@ define i32 @fcmp_olt_q(half %a, half %b) nounwind strictfp {
104
166
; CHECK: # %bb.0:
105
167
; CHECK-NEXT: fltq.h a0, fa0, fa1
106
168
; CHECK-NEXT: ret
169
+ ;
170
+ ; ZFHMIN-LABEL: fcmp_olt_q:
171
+ ; ZFHMIN: # %bb.0:
172
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa1
173
+ ; ZFHMIN-NEXT: fcvt.s.h fa4, fa0
174
+ ; ZFHMIN-NEXT: fltq.s a0, fa4, fa5
175
+ ; ZFHMIN-NEXT: ret
107
176
%1 = call i1 @llvm.experimental.constrained.fcmp.f16 (half %a , half %b , metadata !"olt" , metadata !"fpexcept.strict" ) strictfp
108
177
%2 = zext i1 %1 to i32
109
178
ret i32 %2
@@ -114,6 +183,13 @@ define i32 @fcmp_ole_q(half %a, half %b) nounwind strictfp {
114
183
; CHECK: # %bb.0:
115
184
; CHECK-NEXT: fleq.h a0, fa0, fa1
116
185
; CHECK-NEXT: ret
186
+ ;
187
+ ; ZFHMIN-LABEL: fcmp_ole_q:
188
+ ; ZFHMIN: # %bb.0:
189
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa1
190
+ ; ZFHMIN-NEXT: fcvt.s.h fa4, fa0
191
+ ; ZFHMIN-NEXT: fleq.s a0, fa4, fa5
192
+ ; ZFHMIN-NEXT: ret
117
193
%1 = call i1 @llvm.experimental.constrained.fcmp.f16 (half %a , half %b , metadata !"ole" , metadata !"fpexcept.strict" ) strictfp
118
194
%2 = zext i1 %1 to i32
119
195
ret i32 %2
@@ -126,6 +202,15 @@ define i32 @fcmp_one_q(half %a, half %b) nounwind strictfp {
126
202
; CHECK-NEXT: fltq.h a1, fa1, fa0
127
203
; CHECK-NEXT: or a0, a1, a0
128
204
; CHECK-NEXT: ret
205
+ ;
206
+ ; ZFHMIN-LABEL: fcmp_one_q:
207
+ ; ZFHMIN: # %bb.0:
208
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa1
209
+ ; ZFHMIN-NEXT: fcvt.s.h fa4, fa0
210
+ ; ZFHMIN-NEXT: fltq.s a0, fa4, fa5
211
+ ; ZFHMIN-NEXT: fltq.s a1, fa5, fa4
212
+ ; ZFHMIN-NEXT: or a0, a1, a0
213
+ ; ZFHMIN-NEXT: ret
129
214
%1 = call i1 @llvm.experimental.constrained.fcmp.f16 (half %a , half %b , metadata !"one" , metadata !"fpexcept.strict" ) strictfp
130
215
%2 = zext i1 %1 to i32
131
216
ret i32 %2
@@ -139,6 +224,16 @@ define i32 @fcmp_ueq_q(half %a, half %b) nounwind strictfp {
139
224
; CHECK-NEXT: or a0, a1, a0
140
225
; CHECK-NEXT: xori a0, a0, 1
141
226
; CHECK-NEXT: ret
227
+ ;
228
+ ; ZFHMIN-LABEL: fcmp_ueq_q:
229
+ ; ZFHMIN: # %bb.0:
230
+ ; ZFHMIN-NEXT: fcvt.s.h fa5, fa1
231
+ ; ZFHMIN-NEXT: fcvt.s.h fa4, fa0
232
+ ; ZFHMIN-NEXT: fltq.s a0, fa4, fa5
233
+ ; ZFHMIN-NEXT: fltq.s a1, fa5, fa4
234
+ ; ZFHMIN-NEXT: or a0, a1, a0
235
+ ; ZFHMIN-NEXT: xori a0, a0, 1
236
+ ; ZFHMIN-NEXT: ret
142
237
%1 = call i1 @llvm.experimental.constrained.fcmp.f16 (half %a , half %b , metadata !"ueq" , metadata !"fpexcept.strict" ) strictfp
143
238
%2 = zext i1 %1 to i32
144
239
ret i32 %2
0 commit comments