@@ -119,6 +119,109 @@ entry:
119
119
ret bfloat %conv1
120
120
}
121
121
122
+ define i64 @testu_f64_multiuse(double %x) {
123
+ ; CHECK-LABEL: testu_f64_multiuse:
124
+ ; CHECK: // %bb.0: // %entry
125
+ ; CHECK-NEXT: fcvtzu d1, d0
126
+ ; CHECK-NEXT: fcvtzu x8, d0
127
+ ; CHECK-NEXT: ucvtf d1, d1
128
+ ; CHECK-NEXT: fcmp d0, d1
129
+ ; CHECK-NEXT: csel x0, x8, xzr, eq
130
+ ; CHECK-NEXT: ret
131
+ entry:
132
+ %conv = fptoui double %x to i64
133
+ %conv1 = uitofp i64 %conv to double
134
+ %cmp = fcmp oeq double %x, %conv1
135
+ %cond = select i1 %cmp, i64 %conv, i64 0
136
+ ret i64 %cond
137
+ }
138
+
139
+ define i32 @testu_f32_multiuse(float %x) {
140
+ ; CHECK-LABEL: testu_f32_multiuse:
141
+ ; CHECK: // %bb.0: // %entry
142
+ ; CHECK-NEXT: fcvtzu s1, s0
143
+ ; CHECK-NEXT: fcvtzu w8, s0
144
+ ; CHECK-NEXT: ucvtf s1, s1
145
+ ; CHECK-NEXT: fcmp s0, s1
146
+ ; CHECK-NEXT: csel w0, w8, wzr, eq
147
+ ; CHECK-NEXT: ret
148
+ entry:
149
+ %conv = fptoui float %x to i32
150
+ %conv1 = uitofp i32 %conv to float
151
+ %cmp = fcmp oeq float %x, %conv1
152
+ %cond = select i1 %cmp, i32 %conv, i32 0
153
+ ret i32 %cond
154
+ }
155
+
156
+ define i32 @testu_f16_multiuse(half %x) {
157
+ ; CHECK-LABEL: testu_f16_multiuse:
158
+ ; CHECK: // %bb.0: // %entry
159
+ ; CHECK-NEXT: fcvtzu h1, h0
160
+ ; CHECK-NEXT: fcvtzu w8, h0
161
+ ; CHECK-NEXT: ucvtf h1, h1
162
+ ; CHECK-NEXT: fcmp h0, h1
163
+ ; CHECK-NEXT: csel w0, w8, wzr, eq
164
+ ; CHECK-NEXT: ret
165
+ entry:
166
+ %conv = fptoui half %x to i32
167
+ %conv1 = uitofp i32 %conv to half
168
+ %cmp = fcmp oeq half %x, %conv1
169
+ %cond = select i1 %cmp, i32 %conv, i32 0
170
+ ret i32 %cond
171
+ }
172
+
173
+ define i64 @tests_f64_multiuse(double %x) {
174
+ ; CHECK-LABEL: tests_f64_multiuse:
175
+ ; CHECK: // %bb.0: // %entry
176
+ ; CHECK-NEXT: fcvtzs d1, d0
177
+ ; CHECK-NEXT: fcvtzs x8, d0
178
+ ; CHECK-NEXT: scvtf d1, d1
179
+ ; CHECK-NEXT: fcmp d0, d1
180
+ ; CHECK-NEXT: csel x0, x8, xzr, eq
181
+ ; CHECK-NEXT: ret
182
+ entry:
183
+ %conv = fptosi double %x to i64
184
+ %conv1 = sitofp i64 %conv to double
185
+ %cmp = fcmp oeq double %x, %conv1
186
+ %cond = select i1 %cmp, i64 %conv, i64 0
187
+ ret i64 %cond
188
+ }
189
+
190
+ define i32 @tests_f32_multiuse(float %x) {
191
+ ; CHECK-LABEL: tests_f32_multiuse:
192
+ ; CHECK: // %bb.0: // %entry
193
+ ; CHECK-NEXT: fcvtzs s1, s0
194
+ ; CHECK-NEXT: fcvtzs w8, s0
195
+ ; CHECK-NEXT: scvtf s1, s1
196
+ ; CHECK-NEXT: fcmp s0, s1
197
+ ; CHECK-NEXT: csel w0, w8, wzr, eq
198
+ ; CHECK-NEXT: ret
199
+ entry:
200
+ %conv = fptosi float %x to i32
201
+ %conv1 = sitofp i32 %conv to float
202
+ %cmp = fcmp oeq float %x, %conv1
203
+ %cond = select i1 %cmp, i32 %conv, i32 0
204
+ ret i32 %cond
205
+ }
206
+
207
+ define i32 @tests_f16_multiuse(half %x) {
208
+ ; CHECK-LABEL: tests_f16_multiuse:
209
+ ; CHECK: // %bb.0: // %entry
210
+ ; CHECK-NEXT: fcvtzs h1, h0
211
+ ; CHECK-NEXT: fcvtzs w8, h0
212
+ ; CHECK-NEXT: scvtf h1, h1
213
+ ; CHECK-NEXT: fcmp h0, h1
214
+ ; CHECK-NEXT: csel w0, w8, wzr, eq
215
+ ; CHECK-NEXT: ret
216
+ entry:
217
+ %conv = fptosi half %x to i32
218
+ %conv1 = sitofp i32 %conv to half
219
+ %cmp = fcmp oeq half %x, %conv1
220
+ %cond = select i1 %cmp, i32 %conv, i32 0
221
+ ret i32 %cond
222
+ }
223
+
224
+
122
225
define double @t1_strict(double %x) #0 {
123
226
; CHECK-LABEL: t1_strict:
124
227
; CHECK: // %bb.0: // %entry
0 commit comments