1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
; RUN: | FileCheck %s -check-prefix=RV64ID
; This file exhaustively checks double<->i32 conversions. In general,
; fcvt.l[u].d can be selected instead of fcvt.w[u].d because poison is
; generated for an fpto[s|u]i conversion if the result doesn't fit in the
; target type.
define i32 @aext_fptosi(double %a) nounwind {
; RV64ID-LABEL: aext_fptosi:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fmv.d.x ft0, a0
; RV64ID-NEXT: fcvt.l.d a0, ft0, rtz
; RV64ID-NEXT: ret
%1 = fptosi double %a to i32
ret i32 %1
}
define signext i32 @sext_fptosi(double %a) nounwind {
; RV64ID-LABEL: sext_fptosi:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fmv.d.x ft0, a0
; RV64ID-NEXT: fcvt.l.d a0, ft0, rtz
; RV64ID-NEXT: ret
%1 = fptosi double %a to i32
ret i32 %1
}
define zeroext i32 @zext_fptosi(double %a) nounwind {
; RV64ID-LABEL: zext_fptosi:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fmv.d.x ft0, a0
; RV64ID-NEXT: fcvt.l.d a0, ft0, rtz
; RV64ID-NEXT: slli a0, a0, 32
; RV64ID-NEXT: srli a0, a0, 32
; RV64ID-NEXT: ret
%1 = fptosi double %a to i32
ret i32 %1
}
define i32 @aext_fptoui(double %a) nounwind {
; RV64ID-LABEL: aext_fptoui:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fmv.d.x ft0, a0
; RV64ID-NEXT: fcvt.lu.d a0, ft0, rtz
; RV64ID-NEXT: ret
%1 = fptoui double %a to i32
ret i32 %1
}
define signext i32 @sext_fptoui(double %a) nounwind {
; RV64ID-LABEL: sext_fptoui:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fmv.d.x ft0, a0
; RV64ID-NEXT: fcvt.wu.d a0, ft0, rtz
; RV64ID-NEXT: ret
%1 = fptoui double %a to i32
ret i32 %1
}
define zeroext i32 @zext_fptoui(double %a) nounwind {
; RV64ID-LABEL: zext_fptoui:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fmv.d.x ft0, a0
; RV64ID-NEXT: fcvt.lu.d a0, ft0, rtz
; RV64ID-NEXT: ret
%1 = fptoui double %a to i32
ret i32 %1
}
define double @uitofp_aext_i32_to_f64(i32 %a) nounwind {
; RV64ID-LABEL: uitofp_aext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.wu ft0, a0
; RV64ID-NEXT: fmv.x.d a0, ft0
; RV64ID-NEXT: ret
%1 = uitofp i32 %a to double
ret double %1
}
define double @uitofp_sext_i32_to_f64(i32 signext %a) nounwind {
; RV64ID-LABEL: uitofp_sext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.wu ft0, a0
; RV64ID-NEXT: fmv.x.d a0, ft0
; RV64ID-NEXT: ret
%1 = uitofp i32 %a to double
ret double %1
}
define double @uitofp_zext_i32_to_f64(i32 zeroext %a) nounwind {
; RV64ID-LABEL: uitofp_zext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.wu ft0, a0
; RV64ID-NEXT: fmv.x.d a0, ft0
; RV64ID-NEXT: ret
%1 = uitofp i32 %a to double
ret double %1
}
define double @sitofp_aext_i32_to_f64(i32 %a) nounwind {
; RV64ID-LABEL: sitofp_aext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.w ft0, a0
; RV64ID-NEXT: fmv.x.d a0, ft0
; RV64ID-NEXT: ret
%1 = sitofp i32 %a to double
ret double %1
}
define double @sitofp_sext_i32_to_f64(i32 signext %a) nounwind {
; RV64ID-LABEL: sitofp_sext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.l ft0, a0
; RV64ID-NEXT: fmv.x.d a0, ft0
; RV64ID-NEXT: ret
%1 = sitofp i32 %a to double
ret double %1
}
define double @sitofp_zext_i32_to_f64(i32 zeroext %a) nounwind {
; RV64ID-LABEL: sitofp_zext_i32_to_f64:
; RV64ID: # %bb.0:
; RV64ID-NEXT: fcvt.d.w ft0, a0
; RV64ID-NEXT: fmv.x.d a0, ft0
; RV64ID-NEXT: ret
%1 = sitofp i32 %a to double
ret double %1
}
|