@@ -119,6 +119,109 @@ entry:
119119 ret bfloat %conv1
120120}
121121
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+
122225define double @t1_strict (double %x ) #0 {
123226; CHECK-LABEL: t1_strict:
124227; CHECK: // %bb.0: // %entry
0 commit comments