1 ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi ilp32d \
3 ; RUN: -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \
4 ; RUN: | FileCheck -check-prefix=RV32-ILP32D %s
6 ; This file contains tests that will have differing output for the ilp32/ilp32f
9 define i32 @callee_double_in_fpr(i32 %a, double %b) nounwind {
10 ; RV32-ILP32D-LABEL: name: callee_double_in_fpr
11 ; RV32-ILP32D: bb.1 (%ir-block.0):
12 ; RV32-ILP32D-NEXT: liveins: $x10, $f10_d
13 ; RV32-ILP32D-NEXT: {{ $}}
14 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
15 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f10_d
16 ; RV32-ILP32D-NEXT: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY1]](s64)
17 ; RV32-ILP32D-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[FPTOSI]]
18 ; RV32-ILP32D-NEXT: $x10 = COPY [[ADD]](s32)
19 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
20 %b_fptosi = fptosi double %b to i32
21 %1 = add i32 %a, %b_fptosi
25 define i32 @caller_double_in_fpr() nounwind {
26 ; RV32-ILP32D-LABEL: name: caller_double_in_fpr
27 ; RV32-ILP32D: bb.1 (%ir-block.0):
28 ; RV32-ILP32D-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
29 ; RV32-ILP32D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
30 ; RV32-ILP32D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
31 ; RV32-ILP32D-NEXT: $x10 = COPY [[C]](s32)
32 ; RV32-ILP32D-NEXT: $f10_d = COPY [[C1]](s64)
33 ; RV32-ILP32D-NEXT: PseudoCALL target-flags(riscv-call) @callee_double_in_fpr, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $f10_d, implicit-def $x10
34 ; RV32-ILP32D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
35 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
36 ; RV32-ILP32D-NEXT: $x10 = COPY [[COPY]](s32)
37 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
38 %1 = call i32 @callee_double_in_fpr(i32 1, double 2.0)
42 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
43 define i32 @callee_double_in_fpr_exhausted_gprs(i64 %a, i64 %b, i64 %c, i64 %d, i32 %e, double %f) nounwind {
44 ; RV32-ILP32D-LABEL: name: callee_double_in_fpr_exhausted_gprs
45 ; RV32-ILP32D: bb.1 (%ir-block.0):
46 ; RV32-ILP32D-NEXT: liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d
47 ; RV32-ILP32D-NEXT: {{ $}}
48 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
49 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
50 ; RV32-ILP32D-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
51 ; RV32-ILP32D-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12
52 ; RV32-ILP32D-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x13
53 ; RV32-ILP32D-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
54 ; RV32-ILP32D-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $x14
55 ; RV32-ILP32D-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY $x15
56 ; RV32-ILP32D-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY4]](s32), [[COPY5]](s32)
57 ; RV32-ILP32D-NEXT: [[COPY6:%[0-9]+]]:_(s32) = COPY $x16
58 ; RV32-ILP32D-NEXT: [[COPY7:%[0-9]+]]:_(s32) = COPY $x17
59 ; RV32-ILP32D-NEXT: [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY6]](s32), [[COPY7]](s32)
60 ; RV32-ILP32D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
61 ; RV32-ILP32D-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %fixed-stack.0, align 16)
62 ; RV32-ILP32D-NEXT: [[COPY8:%[0-9]+]]:_(s64) = COPY $f10_d
63 ; RV32-ILP32D-NEXT: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY8]](s64)
64 ; RV32-ILP32D-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[LOAD]], [[FPTOSI]]
65 ; RV32-ILP32D-NEXT: $x10 = COPY [[ADD]](s32)
66 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
67 %f_fptosi = fptosi double %f to i32
68 %1 = add i32 %e, %f_fptosi
72 define i32 @caller_double_in_fpr_exhausted_gprs() nounwind {
73 ; RV32-ILP32D-LABEL: name: caller_double_in_fpr_exhausted_gprs
74 ; RV32-ILP32D: bb.1 (%ir-block.0):
75 ; RV32-ILP32D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
76 ; RV32-ILP32D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2
77 ; RV32-ILP32D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
78 ; RV32-ILP32D-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
79 ; RV32-ILP32D-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 5
80 ; RV32-ILP32D-NEXT: [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
81 ; RV32-ILP32D-NEXT: ADJCALLSTACKDOWN 4, 0, implicit-def $x2, implicit $x2
82 ; RV32-ILP32D-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64)
83 ; RV32-ILP32D-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C1]](s64)
84 ; RV32-ILP32D-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C2]](s64)
85 ; RV32-ILP32D-NEXT: [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C3]](s64)
86 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2
87 ; RV32-ILP32D-NEXT: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
88 ; RV32-ILP32D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C6]](s32)
89 ; RV32-ILP32D-NEXT: G_STORE [[C4]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 16)
90 ; RV32-ILP32D-NEXT: $x10 = COPY [[UV]](s32)
91 ; RV32-ILP32D-NEXT: $x11 = COPY [[UV1]](s32)
92 ; RV32-ILP32D-NEXT: $x12 = COPY [[UV2]](s32)
93 ; RV32-ILP32D-NEXT: $x13 = COPY [[UV3]](s32)
94 ; RV32-ILP32D-NEXT: $x14 = COPY [[UV4]](s32)
95 ; RV32-ILP32D-NEXT: $x15 = COPY [[UV5]](s32)
96 ; RV32-ILP32D-NEXT: $x16 = COPY [[UV6]](s32)
97 ; RV32-ILP32D-NEXT: $x17 = COPY [[UV7]](s32)
98 ; RV32-ILP32D-NEXT: $f10_d = COPY [[C5]](s64)
99 ; RV32-ILP32D-NEXT: PseudoCALL target-flags(riscv-call) @callee_double_in_fpr_exhausted_gprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit $f10_d, implicit-def $x10
100 ; RV32-ILP32D-NEXT: ADJCALLSTACKUP 4, 0, implicit-def $x2, implicit $x2
101 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
102 ; RV32-ILP32D-NEXT: $x10 = COPY [[COPY1]](s32)
103 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
104 %1 = call i32 @callee_double_in_fpr_exhausted_gprs(
105 i64 1, i64 2, i64 3, i64 4, i32 5, double 6.0)
109 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
110 define i32 @callee_double_in_gpr_exhausted_fprs(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i) nounwind {
111 ; RV32-ILP32D-LABEL: name: callee_double_in_gpr_exhausted_fprs
112 ; RV32-ILP32D: bb.1 (%ir-block.0):
113 ; RV32-ILP32D-NEXT: liveins: $x10, $x11, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
114 ; RV32-ILP32D-NEXT: {{ $}}
115 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
116 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
117 ; RV32-ILP32D-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $f12_d
118 ; RV32-ILP32D-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $f13_d
119 ; RV32-ILP32D-NEXT: [[COPY4:%[0-9]+]]:_(s64) = COPY $f14_d
120 ; RV32-ILP32D-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $f15_d
121 ; RV32-ILP32D-NEXT: [[COPY6:%[0-9]+]]:_(s64) = COPY $f16_d
122 ; RV32-ILP32D-NEXT: [[COPY7:%[0-9]+]]:_(s64) = COPY $f17_d
123 ; RV32-ILP32D-NEXT: [[COPY8:%[0-9]+]]:_(s32) = COPY $x10
124 ; RV32-ILP32D-NEXT: [[COPY9:%[0-9]+]]:_(s32) = COPY $x11
125 ; RV32-ILP32D-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY8]](s32), [[COPY9]](s32)
126 ; RV32-ILP32D-NEXT: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY7]](s64)
127 ; RV32-ILP32D-NEXT: [[FPTOSI1:%[0-9]+]]:_(s32) = G_FPTOSI [[MV]](s64)
128 ; RV32-ILP32D-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[FPTOSI]], [[FPTOSI1]]
129 ; RV32-ILP32D-NEXT: $x10 = COPY [[ADD]](s32)
130 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
131 %h_fptosi = fptosi double %h to i32
132 %i_fptosi = fptosi double %i to i32
133 %1 = add i32 %h_fptosi, %i_fptosi
137 define i32 @caller_double_in_gpr_exhausted_fprs() nounwind {
138 ; RV32-ILP32D-LABEL: name: caller_double_in_gpr_exhausted_fprs
139 ; RV32-ILP32D: bb.1 (%ir-block.0):
140 ; RV32-ILP32D-NEXT: [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+00
141 ; RV32-ILP32D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
142 ; RV32-ILP32D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_FCONSTANT double 3.000000e+00
143 ; RV32-ILP32D-NEXT: [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
144 ; RV32-ILP32D-NEXT: [[C4:%[0-9]+]]:_(s64) = G_FCONSTANT double 5.000000e+00
145 ; RV32-ILP32D-NEXT: [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
146 ; RV32-ILP32D-NEXT: [[C6:%[0-9]+]]:_(s64) = G_FCONSTANT double 7.000000e+00
147 ; RV32-ILP32D-NEXT: [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
148 ; RV32-ILP32D-NEXT: [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
149 ; RV32-ILP32D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
150 ; RV32-ILP32D-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C8]](s64)
151 ; RV32-ILP32D-NEXT: $f10_d = COPY [[C]](s64)
152 ; RV32-ILP32D-NEXT: $f11_d = COPY [[C1]](s64)
153 ; RV32-ILP32D-NEXT: $f12_d = COPY [[C2]](s64)
154 ; RV32-ILP32D-NEXT: $f13_d = COPY [[C3]](s64)
155 ; RV32-ILP32D-NEXT: $f14_d = COPY [[C4]](s64)
156 ; RV32-ILP32D-NEXT: $f15_d = COPY [[C5]](s64)
157 ; RV32-ILP32D-NEXT: $f16_d = COPY [[C6]](s64)
158 ; RV32-ILP32D-NEXT: $f17_d = COPY [[C7]](s64)
159 ; RV32-ILP32D-NEXT: $x10 = COPY [[UV]](s32)
160 ; RV32-ILP32D-NEXT: $x11 = COPY [[UV1]](s32)
161 ; RV32-ILP32D-NEXT: PseudoCALL target-flags(riscv-call) @callee_double_in_gpr_exhausted_fprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $f10_d, implicit $f11_d, implicit $f12_d, implicit $f13_d, implicit $f14_d, implicit $f15_d, implicit $f16_d, implicit $f17_d, implicit $x10, implicit $x11, implicit-def $x10
162 ; RV32-ILP32D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
163 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
164 ; RV32-ILP32D-NEXT: $x10 = COPY [[COPY]](s32)
165 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
166 %1 = call i32 @callee_double_in_gpr_exhausted_fprs(
167 double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0,
168 double 7.0, double 8.0, double 9.0)
172 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
173 define i32 @callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs(i64 %a, double %b, i64 %c, double %d, i64 %e, double %f, i32 %g, double %h, double %i, double %j, double %k, double %l, double %m) nounwind {
174 ; RV32-ILP32D-LABEL: name: callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs
175 ; RV32-ILP32D: bb.1 (%ir-block.0):
176 ; RV32-ILP32D-NEXT: liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
177 ; RV32-ILP32D-NEXT: {{ $}}
178 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
179 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
180 ; RV32-ILP32D-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
181 ; RV32-ILP32D-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $f10_d
182 ; RV32-ILP32D-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x12
183 ; RV32-ILP32D-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $x13
184 ; RV32-ILP32D-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
185 ; RV32-ILP32D-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $f11_d
186 ; RV32-ILP32D-NEXT: [[COPY6:%[0-9]+]]:_(s32) = COPY $x14
187 ; RV32-ILP32D-NEXT: [[COPY7:%[0-9]+]]:_(s32) = COPY $x15
188 ; RV32-ILP32D-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY6]](s32), [[COPY7]](s32)
189 ; RV32-ILP32D-NEXT: [[COPY8:%[0-9]+]]:_(s64) = COPY $f12_d
190 ; RV32-ILP32D-NEXT: [[COPY9:%[0-9]+]]:_(s32) = COPY $x16
191 ; RV32-ILP32D-NEXT: [[COPY10:%[0-9]+]]:_(s64) = COPY $f13_d
192 ; RV32-ILP32D-NEXT: [[COPY11:%[0-9]+]]:_(s64) = COPY $f14_d
193 ; RV32-ILP32D-NEXT: [[COPY12:%[0-9]+]]:_(s64) = COPY $f15_d
194 ; RV32-ILP32D-NEXT: [[COPY13:%[0-9]+]]:_(s64) = COPY $f16_d
195 ; RV32-ILP32D-NEXT: [[COPY14:%[0-9]+]]:_(s64) = COPY $f17_d
196 ; RV32-ILP32D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
197 ; RV32-ILP32D-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %fixed-stack.0, align 16)
198 ; RV32-ILP32D-NEXT: [[COPY15:%[0-9]+]]:_(s32) = COPY $x17
199 ; RV32-ILP32D-NEXT: [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY15]](s32), [[LOAD]](s32)
200 ; RV32-ILP32D-NEXT: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[MV3]](s64)
201 ; RV32-ILP32D-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY9]], [[FPTOSI]]
202 ; RV32-ILP32D-NEXT: $x10 = COPY [[ADD]](s32)
203 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
204 %m_fptosi = fptosi double %m to i32
205 %1 = add i32 %g, %m_fptosi
209 define i32 @caller_double_in_gpr_and_stack_almost_exhausted_gprs_fprs() nounwind {
210 ; RV32-ILP32D-LABEL: name: caller_double_in_gpr_and_stack_almost_exhausted_gprs_fprs
211 ; RV32-ILP32D: bb.1 (%ir-block.0):
212 ; RV32-ILP32D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
213 ; RV32-ILP32D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
214 ; RV32-ILP32D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
215 ; RV32-ILP32D-NEXT: [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
216 ; RV32-ILP32D-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
217 ; RV32-ILP32D-NEXT: [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
218 ; RV32-ILP32D-NEXT: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
219 ; RV32-ILP32D-NEXT: [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
220 ; RV32-ILP32D-NEXT: [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
221 ; RV32-ILP32D-NEXT: [[C9:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+01
222 ; RV32-ILP32D-NEXT: [[C10:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.100000e+01
223 ; RV32-ILP32D-NEXT: [[C11:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.200000e+01
224 ; RV32-ILP32D-NEXT: [[C12:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.300000e+01
225 ; RV32-ILP32D-NEXT: ADJCALLSTACKDOWN 4, 0, implicit-def $x2, implicit $x2
226 ; RV32-ILP32D-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64)
227 ; RV32-ILP32D-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C2]](s64)
228 ; RV32-ILP32D-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C4]](s64)
229 ; RV32-ILP32D-NEXT: [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C12]](s64)
230 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2
231 ; RV32-ILP32D-NEXT: [[C13:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
232 ; RV32-ILP32D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C13]](s32)
233 ; RV32-ILP32D-NEXT: G_STORE [[UV7]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 16)
234 ; RV32-ILP32D-NEXT: $x10 = COPY [[UV]](s32)
235 ; RV32-ILP32D-NEXT: $x11 = COPY [[UV1]](s32)
236 ; RV32-ILP32D-NEXT: $f10_d = COPY [[C1]](s64)
237 ; RV32-ILP32D-NEXT: $x12 = COPY [[UV2]](s32)
238 ; RV32-ILP32D-NEXT: $x13 = COPY [[UV3]](s32)
239 ; RV32-ILP32D-NEXT: $f11_d = COPY [[C3]](s64)
240 ; RV32-ILP32D-NEXT: $x14 = COPY [[UV4]](s32)
241 ; RV32-ILP32D-NEXT: $x15 = COPY [[UV5]](s32)
242 ; RV32-ILP32D-NEXT: $f12_d = COPY [[C5]](s64)
243 ; RV32-ILP32D-NEXT: $x16 = COPY [[C6]](s32)
244 ; RV32-ILP32D-NEXT: $f13_d = COPY [[C7]](s64)
245 ; RV32-ILP32D-NEXT: $f14_d = COPY [[C8]](s64)
246 ; RV32-ILP32D-NEXT: $f15_d = COPY [[C9]](s64)
247 ; RV32-ILP32D-NEXT: $f16_d = COPY [[C10]](s64)
248 ; RV32-ILP32D-NEXT: $f17_d = COPY [[C11]](s64)
249 ; RV32-ILP32D-NEXT: $x17 = COPY [[UV6]](s32)
250 ; RV32-ILP32D-NEXT: PseudoCALL target-flags(riscv-call) @callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $f10_d, implicit $x12, implicit $x13, implicit $f11_d, implicit $x14, implicit $x15, implicit $f12_d, implicit $x16, implicit $f13_d, implicit $f14_d, implicit $f15_d, implicit $f16_d, implicit $f17_d, implicit $x17, implicit-def $x10
251 ; RV32-ILP32D-NEXT: ADJCALLSTACKUP 4, 0, implicit-def $x2, implicit $x2
252 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
253 ; RV32-ILP32D-NEXT: $x10 = COPY [[COPY1]](s32)
254 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
255 %1 = call i32 @callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs(
256 i64 1, double 2.0, i64 3, double 4.0, i64 5, double 6.0, i32 7, double 8.0,
257 double 9.0, double 10.0, double 11.0, double 12.0, double 13.0)
262 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
263 define i32 @callee_double_on_stack_exhausted_gprs_fprs(i64 %a, double %b, i64 %c, double %d, i64 %e, double %f, i64 %g, double %h, double %i, double %j, double %k, double %l, double %m) nounwind {
264 ; RV32-ILP32D-LABEL: name: callee_double_on_stack_exhausted_gprs_fprs
265 ; RV32-ILP32D: bb.1 (%ir-block.0):
266 ; RV32-ILP32D-NEXT: liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
267 ; RV32-ILP32D-NEXT: {{ $}}
268 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
269 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
270 ; RV32-ILP32D-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
271 ; RV32-ILP32D-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $f10_d
272 ; RV32-ILP32D-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $x12
273 ; RV32-ILP32D-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $x13
274 ; RV32-ILP32D-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
275 ; RV32-ILP32D-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $f11_d
276 ; RV32-ILP32D-NEXT: [[COPY6:%[0-9]+]]:_(s32) = COPY $x14
277 ; RV32-ILP32D-NEXT: [[COPY7:%[0-9]+]]:_(s32) = COPY $x15
278 ; RV32-ILP32D-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY6]](s32), [[COPY7]](s32)
279 ; RV32-ILP32D-NEXT: [[COPY8:%[0-9]+]]:_(s64) = COPY $f12_d
280 ; RV32-ILP32D-NEXT: [[COPY9:%[0-9]+]]:_(s32) = COPY $x16
281 ; RV32-ILP32D-NEXT: [[COPY10:%[0-9]+]]:_(s32) = COPY $x17
282 ; RV32-ILP32D-NEXT: [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY9]](s32), [[COPY10]](s32)
283 ; RV32-ILP32D-NEXT: [[COPY11:%[0-9]+]]:_(s64) = COPY $f13_d
284 ; RV32-ILP32D-NEXT: [[COPY12:%[0-9]+]]:_(s64) = COPY $f14_d
285 ; RV32-ILP32D-NEXT: [[COPY13:%[0-9]+]]:_(s64) = COPY $f15_d
286 ; RV32-ILP32D-NEXT: [[COPY14:%[0-9]+]]:_(s64) = COPY $f16_d
287 ; RV32-ILP32D-NEXT: [[COPY15:%[0-9]+]]:_(s64) = COPY $f17_d
288 ; RV32-ILP32D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
289 ; RV32-ILP32D-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0, align 16)
290 ; RV32-ILP32D-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[MV3]](s64)
291 ; RV32-ILP32D-NEXT: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[LOAD]](s64)
292 ; RV32-ILP32D-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[TRUNC]], [[FPTOSI]]
293 ; RV32-ILP32D-NEXT: $x10 = COPY [[ADD]](s32)
294 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
295 %g_trunc = trunc i64 %g to i32
296 %m_fptosi = fptosi double %m to i32
297 %1 = add i32 %g_trunc, %m_fptosi
301 define i32 @caller_double_on_stack_exhausted_gprs_fprs() nounwind {
302 ; RV32-ILP32D-LABEL: name: caller_double_on_stack_exhausted_gprs_fprs
303 ; RV32-ILP32D: bb.1 (%ir-block.0):
304 ; RV32-ILP32D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
305 ; RV32-ILP32D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
306 ; RV32-ILP32D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
307 ; RV32-ILP32D-NEXT: [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
308 ; RV32-ILP32D-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
309 ; RV32-ILP32D-NEXT: [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
310 ; RV32-ILP32D-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7
311 ; RV32-ILP32D-NEXT: [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
312 ; RV32-ILP32D-NEXT: [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
313 ; RV32-ILP32D-NEXT: [[C9:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+01
314 ; RV32-ILP32D-NEXT: [[C10:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.100000e+01
315 ; RV32-ILP32D-NEXT: [[C11:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.200000e+01
316 ; RV32-ILP32D-NEXT: [[C12:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.300000e+01
317 ; RV32-ILP32D-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def $x2, implicit $x2
318 ; RV32-ILP32D-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64)
319 ; RV32-ILP32D-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C2]](s64)
320 ; RV32-ILP32D-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C4]](s64)
321 ; RV32-ILP32D-NEXT: [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C6]](s64)
322 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2
323 ; RV32-ILP32D-NEXT: [[C13:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
324 ; RV32-ILP32D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C13]](s32)
325 ; RV32-ILP32D-NEXT: G_STORE [[C12]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)
326 ; RV32-ILP32D-NEXT: $x10 = COPY [[UV]](s32)
327 ; RV32-ILP32D-NEXT: $x11 = COPY [[UV1]](s32)
328 ; RV32-ILP32D-NEXT: $f10_d = COPY [[C1]](s64)
329 ; RV32-ILP32D-NEXT: $x12 = COPY [[UV2]](s32)
330 ; RV32-ILP32D-NEXT: $x13 = COPY [[UV3]](s32)
331 ; RV32-ILP32D-NEXT: $f11_d = COPY [[C3]](s64)
332 ; RV32-ILP32D-NEXT: $x14 = COPY [[UV4]](s32)
333 ; RV32-ILP32D-NEXT: $x15 = COPY [[UV5]](s32)
334 ; RV32-ILP32D-NEXT: $f12_d = COPY [[C5]](s64)
335 ; RV32-ILP32D-NEXT: $x16 = COPY [[UV6]](s32)
336 ; RV32-ILP32D-NEXT: $x17 = COPY [[UV7]](s32)
337 ; RV32-ILP32D-NEXT: $f13_d = COPY [[C7]](s64)
338 ; RV32-ILP32D-NEXT: $f14_d = COPY [[C8]](s64)
339 ; RV32-ILP32D-NEXT: $f15_d = COPY [[C9]](s64)
340 ; RV32-ILP32D-NEXT: $f16_d = COPY [[C10]](s64)
341 ; RV32-ILP32D-NEXT: $f17_d = COPY [[C11]](s64)
342 ; RV32-ILP32D-NEXT: PseudoCALL target-flags(riscv-call) @callee_double_on_stack_exhausted_gprs_fprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $f10_d, implicit $x12, implicit $x13, implicit $f11_d, implicit $x14, implicit $x15, implicit $f12_d, implicit $x16, implicit $x17, implicit $f13_d, implicit $f14_d, implicit $f15_d, implicit $f16_d, implicit $f17_d, implicit-def $x10
343 ; RV32-ILP32D-NEXT: ADJCALLSTACKUP 8, 0, implicit-def $x2, implicit $x2
344 ; RV32-ILP32D-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
345 ; RV32-ILP32D-NEXT: $x10 = COPY [[COPY1]](s32)
346 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
347 %1 = call i32 @callee_double_on_stack_exhausted_gprs_fprs(
348 i64 1, double 2.0, i64 3, double 4.0, i64 5, double 6.0, i64 7, double 8.0,
349 double 9.0, double 10.0, double 11.0, double 12.0, double 13.0)
353 define double @callee_double_ret() nounwind {
354 ; RV32-ILP32D-LABEL: name: callee_double_ret
355 ; RV32-ILP32D: bb.1 (%ir-block.0):
356 ; RV32-ILP32D-NEXT: [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+00
357 ; RV32-ILP32D-NEXT: $f10_d = COPY [[C]](s64)
358 ; RV32-ILP32D-NEXT: PseudoRET implicit $f10_d
362 define i32 @caller_double_ret() nounwind {
363 ; RV32-ILP32D-LABEL: name: caller_double_ret
364 ; RV32-ILP32D: bb.1 (%ir-block.0):
365 ; RV32-ILP32D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
366 ; RV32-ILP32D-NEXT: PseudoCALL target-flags(riscv-call) @callee_double_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit-def $f10_d
367 ; RV32-ILP32D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
368 ; RV32-ILP32D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
369 ; RV32-ILP32D-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
370 ; RV32-ILP32D-NEXT: $x10 = COPY [[TRUNC]](s32)
371 ; RV32-ILP32D-NEXT: PseudoRET implicit $x10
372 %1 = call double @callee_double_ret()
373 %2 = bitcast double %1 to i64
374 %3 = trunc i64 %2 to i32