Skip to content

Commit 60ebf64

Browse files
committed
[RISCV] Add test cases for missed opportunities to use fcvt.*.w(u) instructions on RV64 when input is known to be extended from i8/i16.
1 parent e841bd5 commit 60ebf64

File tree

3 files changed

+192
-0
lines changed

3 files changed

+192
-0
lines changed

llvm/test/CodeGen/RISCV/double-convert.ll

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,83 @@ define double @fmv_d_x(i64 %a, i64 %b) nounwind {
267267
%3 = fadd double %1, %2
268268
ret double %3
269269
}
270+
271+
define double @fcvt_d_w_i8(i8 signext %a) nounwind {
272+
; RV32IFD-LABEL: fcvt_d_w_i8:
273+
; RV32IFD: # %bb.0:
274+
; RV32IFD-NEXT: addi sp, sp, -16
275+
; RV32IFD-NEXT: fcvt.d.w ft0, a0
276+
; RV32IFD-NEXT: fsd ft0, 8(sp)
277+
; RV32IFD-NEXT: lw a0, 8(sp)
278+
; RV32IFD-NEXT: lw a1, 12(sp)
279+
; RV32IFD-NEXT: addi sp, sp, 16
280+
; RV32IFD-NEXT: ret
281+
;
282+
; RV64IFD-LABEL: fcvt_d_w_i8:
283+
; RV64IFD: # %bb.0:
284+
; RV64IFD-NEXT: fcvt.d.l ft0, a0
285+
; RV64IFD-NEXT: fmv.x.d a0, ft0
286+
; RV64IFD-NEXT: ret
287+
%1 = sitofp i8 %a to double
288+
ret double %1
289+
}
290+
291+
define double @fcvt_d_wu_i8(i8 zeroext %a) nounwind {
292+
; RV32IFD-LABEL: fcvt_d_wu_i8:
293+
; RV32IFD: # %bb.0:
294+
; RV32IFD-NEXT: addi sp, sp, -16
295+
; RV32IFD-NEXT: fcvt.d.wu ft0, a0
296+
; RV32IFD-NEXT: fsd ft0, 8(sp)
297+
; RV32IFD-NEXT: lw a0, 8(sp)
298+
; RV32IFD-NEXT: lw a1, 12(sp)
299+
; RV32IFD-NEXT: addi sp, sp, 16
300+
; RV32IFD-NEXT: ret
301+
;
302+
; RV64IFD-LABEL: fcvt_d_wu_i8:
303+
; RV64IFD: # %bb.0:
304+
; RV64IFD-NEXT: fcvt.d.lu ft0, a0
305+
; RV64IFD-NEXT: fmv.x.d a0, ft0
306+
; RV64IFD-NEXT: ret
307+
%1 = uitofp i8 %a to double
308+
ret double %1
309+
}
310+
311+
define double @fcvt_d_w_i16(i16 signext %a) nounwind {
312+
; RV32IFD-LABEL: fcvt_d_w_i16:
313+
; RV32IFD: # %bb.0:
314+
; RV32IFD-NEXT: addi sp, sp, -16
315+
; RV32IFD-NEXT: fcvt.d.w ft0, a0
316+
; RV32IFD-NEXT: fsd ft0, 8(sp)
317+
; RV32IFD-NEXT: lw a0, 8(sp)
318+
; RV32IFD-NEXT: lw a1, 12(sp)
319+
; RV32IFD-NEXT: addi sp, sp, 16
320+
; RV32IFD-NEXT: ret
321+
;
322+
; RV64IFD-LABEL: fcvt_d_w_i16:
323+
; RV64IFD: # %bb.0:
324+
; RV64IFD-NEXT: fcvt.d.l ft0, a0
325+
; RV64IFD-NEXT: fmv.x.d a0, ft0
326+
; RV64IFD-NEXT: ret
327+
%1 = sitofp i16 %a to double
328+
ret double %1
329+
}
330+
331+
define double @fcvt_d_wu_i16(i16 zeroext %a) nounwind {
332+
; RV32IFD-LABEL: fcvt_d_wu_i16:
333+
; RV32IFD: # %bb.0:
334+
; RV32IFD-NEXT: addi sp, sp, -16
335+
; RV32IFD-NEXT: fcvt.d.wu ft0, a0
336+
; RV32IFD-NEXT: fsd ft0, 8(sp)
337+
; RV32IFD-NEXT: lw a0, 8(sp)
338+
; RV32IFD-NEXT: lw a1, 12(sp)
339+
; RV32IFD-NEXT: addi sp, sp, 16
340+
; RV32IFD-NEXT: ret
341+
;
342+
; RV64IFD-LABEL: fcvt_d_wu_i16:
343+
; RV64IFD: # %bb.0:
344+
; RV64IFD-NEXT: fcvt.d.lu ft0, a0
345+
; RV64IFD-NEXT: fmv.x.d a0, ft0
346+
; RV64IFD-NEXT: ret
347+
%1 = uitofp i16 %a to double
348+
ret double %1
349+
}

llvm/test/CodeGen/RISCV/float-convert.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,67 @@ define float @fcvt_s_lu(i64 %a) nounwind {
192192
%1 = uitofp i64 %a to float
193193
ret float %1
194194
}
195+
196+
define float @fcvt_s_w_i8(i8 signext %a) nounwind {
197+
; RV32IF-LABEL: fcvt_s_w_i8:
198+
; RV32IF: # %bb.0:
199+
; RV32IF-NEXT: fcvt.s.w ft0, a0
200+
; RV32IF-NEXT: fmv.x.w a0, ft0
201+
; RV32IF-NEXT: ret
202+
;
203+
; RV64IF-LABEL: fcvt_s_w_i8:
204+
; RV64IF: # %bb.0:
205+
; RV64IF-NEXT: fcvt.s.l ft0, a0
206+
; RV64IF-NEXT: fmv.x.w a0, ft0
207+
; RV64IF-NEXT: ret
208+
%1 = sitofp i8 %a to float
209+
ret float %1
210+
}
211+
212+
define float @fcvt_s_wu_i8(i8 zeroext %a) nounwind {
213+
; RV32IF-LABEL: fcvt_s_wu_i8:
214+
; RV32IF: # %bb.0:
215+
; RV32IF-NEXT: fcvt.s.wu ft0, a0
216+
; RV32IF-NEXT: fmv.x.w a0, ft0
217+
; RV32IF-NEXT: ret
218+
;
219+
; RV64IF-LABEL: fcvt_s_wu_i8:
220+
; RV64IF: # %bb.0:
221+
; RV64IF-NEXT: fcvt.s.lu ft0, a0
222+
; RV64IF-NEXT: fmv.x.w a0, ft0
223+
; RV64IF-NEXT: ret
224+
%1 = uitofp i8 %a to float
225+
ret float %1
226+
}
227+
228+
define float @fcvt_s_w_i16(i16 signext %a) nounwind {
229+
; RV32IF-LABEL: fcvt_s_w_i16:
230+
; RV32IF: # %bb.0:
231+
; RV32IF-NEXT: fcvt.s.w ft0, a0
232+
; RV32IF-NEXT: fmv.x.w a0, ft0
233+
; RV32IF-NEXT: ret
234+
;
235+
; RV64IF-LABEL: fcvt_s_w_i16:
236+
; RV64IF: # %bb.0:
237+
; RV64IF-NEXT: fcvt.s.l ft0, a0
238+
; RV64IF-NEXT: fmv.x.w a0, ft0
239+
; RV64IF-NEXT: ret
240+
%1 = sitofp i16 %a to float
241+
ret float %1
242+
}
243+
244+
define float @fcvt_s_wu_i16(i16 zeroext %a) nounwind {
245+
; RV32IF-LABEL: fcvt_s_wu_i16:
246+
; RV32IF: # %bb.0:
247+
; RV32IF-NEXT: fcvt.s.wu ft0, a0
248+
; RV32IF-NEXT: fmv.x.w a0, ft0
249+
; RV32IF-NEXT: ret
250+
;
251+
; RV64IF-LABEL: fcvt_s_wu_i16:
252+
; RV64IF: # %bb.0:
253+
; RV64IF-NEXT: fcvt.s.lu ft0, a0
254+
; RV64IF-NEXT: fmv.x.w a0, ft0
255+
; RV64IF-NEXT: ret
256+
%1 = uitofp i16 %a to float
257+
ret float %1
258+
}

llvm/test/CodeGen/RISCV/half-convert.ll

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,30 @@ define half @fcvt_h_si(i16 %a) nounwind {
200200
ret half %1
201201
}
202202

203+
define half @fcvt_h_si_signext(i16 signext %a) nounwind {
204+
; RV32IZFH-LABEL: fcvt_h_si_signext:
205+
; RV32IZFH: # %bb.0:
206+
; RV32IZFH-NEXT: fcvt.h.w fa0, a0
207+
; RV32IZFH-NEXT: ret
208+
;
209+
; RV32IDZFH-LABEL: fcvt_h_si_signext:
210+
; RV32IDZFH: # %bb.0:
211+
; RV32IDZFH-NEXT: fcvt.h.w fa0, a0
212+
; RV32IDZFH-NEXT: ret
213+
;
214+
; RV64IZFH-LABEL: fcvt_h_si_signext:
215+
; RV64IZFH: # %bb.0:
216+
; RV64IZFH-NEXT: fcvt.h.l fa0, a0
217+
; RV64IZFH-NEXT: ret
218+
;
219+
; RV64IDZFH-LABEL: fcvt_h_si_signext:
220+
; RV64IDZFH: # %bb.0:
221+
; RV64IDZFH-NEXT: fcvt.h.l fa0, a0
222+
; RV64IDZFH-NEXT: ret
223+
%1 = sitofp i16 %a to half
224+
ret half %1
225+
}
226+
203227
define half @fcvt_h_ui(i16 %a) nounwind {
204228
; RV32IZFH-LABEL: fcvt_h_ui:
205229
; RV32IZFH: # %bb.0:
@@ -236,6 +260,30 @@ define half @fcvt_h_ui(i16 %a) nounwind {
236260
ret half %1
237261
}
238262

263+
define half @fcvt_h_ui_zeroext(i16 zeroext %a) nounwind {
264+
; RV32IZFH-LABEL: fcvt_h_ui_zeroext:
265+
; RV32IZFH: # %bb.0:
266+
; RV32IZFH-NEXT: fcvt.h.wu fa0, a0
267+
; RV32IZFH-NEXT: ret
268+
;
269+
; RV32IDZFH-LABEL: fcvt_h_ui_zeroext:
270+
; RV32IDZFH: # %bb.0:
271+
; RV32IDZFH-NEXT: fcvt.h.wu fa0, a0
272+
; RV32IDZFH-NEXT: ret
273+
;
274+
; RV64IZFH-LABEL: fcvt_h_ui_zeroext:
275+
; RV64IZFH: # %bb.0:
276+
; RV64IZFH-NEXT: fcvt.h.lu fa0, a0
277+
; RV64IZFH-NEXT: ret
278+
;
279+
; RV64IDZFH-LABEL: fcvt_h_ui_zeroext:
280+
; RV64IDZFH: # %bb.0:
281+
; RV64IDZFH-NEXT: fcvt.h.lu fa0, a0
282+
; RV64IDZFH-NEXT: ret
283+
%1 = uitofp i16 %a to half
284+
ret half %1
285+
}
286+
239287
define half @fcvt_h_w(i32 %a) nounwind {
240288
; RV32IZFH-LABEL: fcvt_h_w:
241289
; RV32IZFH: # %bb.0:

0 commit comments

Comments
 (0)