1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -mtriple=mipsel-linux-gnu -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=FP32
3# RUN: llc -O0 -mtriple=mipsel-linux-gnu -mattr=+fp64,+mips32r2 -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=FP64
4
5--- |
6
7  define void @float_in_fpr() {entry: ret void}
8  define void @double_in_fpr() {entry: ret void}
9  define void @float_in_gpr() {entry: ret void}
10  define void @double_in_gpr() {entry: ret void}
11  define void @call_float_in_fpr() {entry: ret void}
12  define void @call_double_in_fpr() {entry: ret void}
13  define void @call_float_in_gpr() {entry: ret void}
14  define void @call_double_in_gpr() {entry: ret void}
15
16...
17---
18name:            float_in_fpr
19alignment:       2
20legalized:       true
21tracksRegLiveness: true
22body:             |
23  bb.1.entry:
24    liveins: $f12, $f14
25
26    ; FP32-LABEL: name: float_in_fpr
27    ; FP32: liveins: $f12, $f14
28    ; FP32: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f14
29    ; FP32: $f0 = COPY [[COPY]](s32)
30    ; FP32: RetRA implicit $f0
31    ; FP64-LABEL: name: float_in_fpr
32    ; FP64: liveins: $f12, $f14
33    ; FP64: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f14
34    ; FP64: $f0 = COPY [[COPY]](s32)
35    ; FP64: RetRA implicit $f0
36    %1:_(s32) = COPY $f14
37    $f0 = COPY %1(s32)
38    RetRA implicit $f0
39
40...
41---
42name:            double_in_fpr
43alignment:       2
44legalized:       true
45tracksRegLiveness: true
46body:             |
47  bb.1.entry:
48    liveins: $d6, $d7
49
50    ; FP32-LABEL: name: double_in_fpr
51    ; FP32: liveins: $d6, $d7
52    ; FP32: [[COPY:%[0-9]+]]:fprb(s64) = COPY $d7
53    ; FP32: $d0 = COPY [[COPY]](s64)
54    ; FP32: RetRA implicit $d0
55    ; FP64-LABEL: name: double_in_fpr
56    ; FP64: liveins: $d6, $d7
57    ; FP64: [[COPY:%[0-9]+]]:fprb(s64) = COPY $d7
58    ; FP64: $d0 = COPY [[COPY]](s64)
59    ; FP64: RetRA implicit $d0
60    %1:_(s64) = COPY $d7
61    $d0 = COPY %1(s64)
62    RetRA implicit $d0
63
64...
65---
66name:            float_in_gpr
67alignment:       2
68legalized:       true
69tracksRegLiveness: true
70body:             |
71  bb.1.entry:
72    liveins: $a0, $a1
73
74    ; FP32-LABEL: name: float_in_gpr
75    ; FP32: liveins: $a0, $a1
76    ; FP32: [[MTC1_:%[0-9]+]]:fgr32(s32) = MTC1 $a1
77    ; FP32: $f0 = COPY [[MTC1_]](s32)
78    ; FP32: RetRA implicit $f0
79    ; FP64-LABEL: name: float_in_gpr
80    ; FP64: liveins: $a0, $a1
81    ; FP64: [[MTC1_:%[0-9]+]]:fgr32(s32) = MTC1 $a1
82    ; FP64: $f0 = COPY [[MTC1_]](s32)
83    ; FP64: RetRA implicit $f0
84    %1:fgr32(s32) = MTC1 $a1
85    $f0 = COPY %1(s32)
86    RetRA implicit $f0
87
88...
89---
90name:            double_in_gpr
91alignment:       2
92legalized:       true
93tracksRegLiveness: true
94body:             |
95  bb.1.entry:
96    liveins: $a0, $a2, $a3
97
98    ; FP32-LABEL: name: double_in_gpr
99    ; FP32: liveins: $a0, $a2, $a3
100    ; FP32: [[BuildPairF64_:%[0-9]+]]:afgr64(s64) = BuildPairF64 $a2, $a3
101    ; FP32: $d0 = COPY [[BuildPairF64_]](s64)
102    ; FP32: RetRA implicit $d0
103    ; FP64-LABEL: name: double_in_gpr
104    ; FP64: liveins: $a0, $a2, $a3
105    ; FP64: [[BuildPairF64_:%[0-9]+]]:afgr64(s64) = BuildPairF64 $a2, $a3
106    ; FP64: $d0 = COPY [[BuildPairF64_]](s64)
107    ; FP64: RetRA implicit $d0
108    %1:afgr64(s64) = BuildPairF64 $a2, $a3
109    $d0 = COPY %1(s64)
110    RetRA implicit $d0
111
112...
113---
114name:            call_float_in_fpr
115alignment:       2
116legalized:       true
117tracksRegLiveness: true
118body:             |
119  bb.1.entry:
120    liveins: $f12, $f14
121
122    ; FP32-LABEL: name: call_float_in_fpr
123    ; FP32: liveins: $f12, $f14
124    ; FP32: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f12
125    ; FP32: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f14
126    ; FP32: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
127    ; FP32: $f12 = COPY [[COPY]](s32)
128    ; FP32: $f14 = COPY [[COPY1]](s32)
129    ; FP32: JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
130    ; FP32: [[COPY2:%[0-9]+]]:fprb(s32) = COPY $f0
131    ; FP32: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
132    ; FP32: $f0 = COPY [[COPY2]](s32)
133    ; FP32: RetRA implicit $f0
134    ; FP64-LABEL: name: call_float_in_fpr
135    ; FP64: liveins: $f12, $f14
136    ; FP64: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f12
137    ; FP64: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f14
138    ; FP64: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
139    ; FP64: $f12 = COPY [[COPY]](s32)
140    ; FP64: $f14 = COPY [[COPY1]](s32)
141    ; FP64: JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
142    ; FP64: [[COPY2:%[0-9]+]]:fprb(s32) = COPY $f0
143    ; FP64: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
144    ; FP64: $f0 = COPY [[COPY2]](s32)
145    ; FP64: RetRA implicit $f0
146    %0:_(s32) = COPY $f12
147    %1:_(s32) = COPY $f14
148    ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
149    $f12 = COPY %0(s32)
150    $f14 = COPY %1(s32)
151    JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
152    %2:_(s32) = COPY $f0
153    ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
154    $f0 = COPY %2(s32)
155    RetRA implicit $f0
156
157...
158---
159name:            call_double_in_fpr
160alignment:       2
161legalized:       true
162tracksRegLiveness: true
163body:             |
164  bb.1.entry:
165    liveins: $d6, $d7
166
167    ; FP32-LABEL: name: call_double_in_fpr
168    ; FP32: liveins: $d6, $d7
169    ; FP32: [[COPY:%[0-9]+]]:fprb(s64) = COPY $d6
170    ; FP32: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $d7
171    ; FP32: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
172    ; FP32: $d6 = COPY [[COPY]](s64)
173    ; FP32: $d7 = COPY [[COPY1]](s64)
174    ; FP32: JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0
175    ; FP32: [[COPY2:%[0-9]+]]:fprb(s64) = COPY $d0
176    ; FP32: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
177    ; FP32: $d0 = COPY [[COPY2]](s64)
178    ; FP32: RetRA implicit $d0
179    ; FP64-LABEL: name: call_double_in_fpr
180    ; FP64: liveins: $d6, $d7
181    ; FP64: [[COPY:%[0-9]+]]:fprb(s64) = COPY $d6
182    ; FP64: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $d7
183    ; FP64: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
184    ; FP64: $d6 = COPY [[COPY]](s64)
185    ; FP64: $d7 = COPY [[COPY1]](s64)
186    ; FP64: JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0
187    ; FP64: [[COPY2:%[0-9]+]]:fprb(s64) = COPY $d0
188    ; FP64: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
189    ; FP64: $d0 = COPY [[COPY2]](s64)
190    ; FP64: RetRA implicit $d0
191    %0:_(s64) = COPY $d6
192    %1:_(s64) = COPY $d7
193    ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
194    $d6 = COPY %0(s64)
195    $d7 = COPY %1(s64)
196    JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0
197    %2:_(s64) = COPY $d0
198    ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
199    $d0 = COPY %2(s64)
200    RetRA implicit $d0
201
202...
203---
204name:            call_float_in_gpr
205alignment:       2
206legalized:       true
207tracksRegLiveness: true
208body:             |
209  bb.1.entry:
210    liveins: $a0, $a1
211
212    ; FP32-LABEL: name: call_float_in_gpr
213    ; FP32: liveins: $a0, $a1
214    ; FP32: [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
215    ; FP32: [[MTC1_:%[0-9]+]]:fgr32(s32) = MTC1 $a1
216    ; FP32: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
217    ; FP32: $a0 = COPY [[COPY]](s32)
218    ; FP32: $a1 = MFC1 [[MTC1_]](s32)
219    ; FP32: JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $f0
220    ; FP32: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f0
221    ; FP32: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
222    ; FP32: $f0 = COPY [[COPY1]](s32)
223    ; FP32: RetRA implicit $f0
224    ; FP64-LABEL: name: call_float_in_gpr
225    ; FP64: liveins: $a0, $a1
226    ; FP64: [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
227    ; FP64: [[MTC1_:%[0-9]+]]:fgr32(s32) = MTC1 $a1
228    ; FP64: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
229    ; FP64: $a0 = COPY [[COPY]](s32)
230    ; FP64: $a1 = MFC1 [[MTC1_]](s32)
231    ; FP64: JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $f0
232    ; FP64: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f0
233    ; FP64: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
234    ; FP64: $f0 = COPY [[COPY1]](s32)
235    ; FP64: RetRA implicit $f0
236    %0:_(s32) = COPY $a0
237    %1:fgr32(s32) = MTC1 $a1
238    ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
239    $a0 = COPY %0(s32)
240    $a1 = MFC1 %1(s32)
241    JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $f0
242    %2:_(s32) = COPY $f0
243    ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
244    $f0 = COPY %2(s32)
245    RetRA implicit $f0
246
247...
248---
249name:            call_double_in_gpr
250alignment:       2
251legalized:       true
252tracksRegLiveness: true
253body:             |
254  bb.1.entry:
255    liveins: $a0, $a2, $a3
256
257    ; FP32-LABEL: name: call_double_in_gpr
258    ; FP32: liveins: $a0, $a2, $a3
259    ; FP32: [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
260    ; FP32: [[BuildPairF64_:%[0-9]+]]:afgr64(s64) = BuildPairF64 $a2, $a3
261    ; FP32: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
262    ; FP32: $a0 = COPY [[COPY]](s32)
263    ; FP32: $a3 = ExtractElementF64 [[BuildPairF64_]](s64), 1
264    ; FP32: $a2 = ExtractElementF64 [[BuildPairF64_]](s64), 0
265    ; FP32: JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0
266    ; FP32: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $d0
267    ; FP32: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
268    ; FP32: $d0 = COPY [[COPY1]](s64)
269    ; FP32: RetRA implicit $d0
270    ; FP64-LABEL: name: call_double_in_gpr
271    ; FP64: liveins: $a0, $a2, $a3
272    ; FP64: [[COPY:%[0-9]+]]:gprb(s32) = COPY $a0
273    ; FP64: [[BuildPairF64_:%[0-9]+]]:afgr64(s64) = BuildPairF64 $a2, $a3
274    ; FP64: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
275    ; FP64: $a0 = COPY [[COPY]](s32)
276    ; FP64: $a3 = ExtractElementF64 [[BuildPairF64_]](s64), 1
277    ; FP64: $a2 = ExtractElementF64 [[BuildPairF64_]](s64), 0
278    ; FP64: JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0
279    ; FP64: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $d0
280    ; FP64: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
281    ; FP64: $d0 = COPY [[COPY1]](s64)
282    ; FP64: RetRA implicit $d0
283    %0:_(s32) = COPY $a0
284    %1:afgr64(s64) = BuildPairF64 $a2, $a3
285    ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
286    $a0 = COPY %0(s32)
287    $a3 = ExtractElementF64 %1(s64), 1
288    $a2 = ExtractElementF64 %1(s64), 0
289    JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0
290    %2:_(s64) = COPY $d0
291    ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
292    $d0 = COPY %2(s64)
293    RetRA implicit $d0
294
295...
296
297