1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2
3; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=FP32
4; RUN: llc -O0 -mtriple=mipsel-linux-gnu -mattr=+fp64,+mips32r2 -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=FP64
5
6define float @float_in_fpr(float %a, float %b) {
7  ; FP32-LABEL: name: float_in_fpr
8  ; FP32: bb.1.entry:
9  ; FP32-NEXT:   liveins: $f12, $f14
10  ; FP32-NEXT: {{  $}}
11  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
12  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
13  ; FP32-NEXT:   $f0 = COPY [[COPY1]](s32)
14  ; FP32-NEXT:   RetRA implicit $f0
15  ; FP64-LABEL: name: float_in_fpr
16  ; FP64: bb.1.entry:
17  ; FP64-NEXT:   liveins: $f12, $f14
18  ; FP64-NEXT: {{  $}}
19  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
20  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
21  ; FP64-NEXT:   $f0 = COPY [[COPY1]](s32)
22  ; FP64-NEXT:   RetRA implicit $f0
23entry:
24  ret float %b
25}
26
27define double @double_in_fpr(double %a, double %b) {
28  ; FP32-LABEL: name: double_in_fpr
29  ; FP32: bb.1.entry:
30  ; FP32-NEXT:   liveins: $d6, $d7
31  ; FP32-NEXT: {{  $}}
32  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d6
33  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d7
34  ; FP32-NEXT:   $d0 = COPY [[COPY1]](s64)
35  ; FP32-NEXT:   RetRA implicit $d0
36  ; FP64-LABEL: name: double_in_fpr
37  ; FP64: bb.1.entry:
38  ; FP64-NEXT:   liveins: $d12_64, $d14_64
39  ; FP64-NEXT: {{  $}}
40  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64
41  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64
42  ; FP64-NEXT:   $d0_64 = COPY [[COPY1]](s64)
43  ; FP64-NEXT:   RetRA implicit $d0_64
44entry:
45  ret double %b
46}
47
48define float @float_in_gpr(i32 %a, float %b) {
49  ; FP32-LABEL: name: float_in_gpr
50  ; FP32: bb.1.entry:
51  ; FP32-NEXT:   liveins: $a0, $a1
52  ; FP32-NEXT: {{  $}}
53  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
54  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
55  ; FP32-NEXT:   $f0 = COPY [[COPY1]](s32)
56  ; FP32-NEXT:   RetRA implicit $f0
57  ; FP64-LABEL: name: float_in_gpr
58  ; FP64: bb.1.entry:
59  ; FP64-NEXT:   liveins: $a0, $a1
60  ; FP64-NEXT: {{  $}}
61  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
62  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
63  ; FP64-NEXT:   $f0 = COPY [[COPY1]](s32)
64  ; FP64-NEXT:   RetRA implicit $f0
65entry:
66  ret float %b
67}
68
69define double @double_in_gpr(i32 %a, double %b) {
70  ; FP32-LABEL: name: double_in_gpr
71  ; FP32: bb.1.entry:
72  ; FP32-NEXT:   liveins: $a0, $a2, $a3
73  ; FP32-NEXT: {{  $}}
74  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
75  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
76  ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
77  ; FP32-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
78  ; FP32-NEXT:   $d0 = COPY [[MV]](s64)
79  ; FP32-NEXT:   RetRA implicit $d0
80  ; FP64-LABEL: name: double_in_gpr
81  ; FP64: bb.1.entry:
82  ; FP64-NEXT:   liveins: $a0, $a2, $a3
83  ; FP64-NEXT: {{  $}}
84  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
85  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
86  ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
87  ; FP64-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
88  ; FP64-NEXT:   $d0_64 = COPY [[MV]](s64)
89  ; FP64-NEXT:   RetRA implicit $d0_64
90entry:
91  ret double %b
92}
93
94define float @call_float_in_fpr(float %a, float %b) {
95  ; FP32-LABEL: name: call_float_in_fpr
96  ; FP32: bb.1.entry:
97  ; FP32-NEXT:   liveins: $f12, $f14
98  ; FP32-NEXT: {{  $}}
99  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
100  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
101  ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
102  ; FP32-NEXT:   $f12 = COPY [[COPY]](s32)
103  ; FP32-NEXT:   $f14 = COPY [[COPY1]](s32)
104  ; FP32-NEXT:   JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
105  ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
106  ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
107  ; FP32-NEXT:   $f0 = COPY [[COPY2]](s32)
108  ; FP32-NEXT:   RetRA implicit $f0
109  ; FP64-LABEL: name: call_float_in_fpr
110  ; FP64: bb.1.entry:
111  ; FP64-NEXT:   liveins: $f12, $f14
112  ; FP64-NEXT: {{  $}}
113  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
114  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
115  ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
116  ; FP64-NEXT:   $f12 = COPY [[COPY]](s32)
117  ; FP64-NEXT:   $f14 = COPY [[COPY1]](s32)
118  ; FP64-NEXT:   JAL @float_in_fpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
119  ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
120  ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
121  ; FP64-NEXT:   $f0 = COPY [[COPY2]](s32)
122  ; FP64-NEXT:   RetRA implicit $f0
123entry:
124  %call = call float @float_in_fpr(float %a, float %b)
125  ret float %call
126}
127
128define double @call_double_in_fpr(double %a, double %b) {
129  ; FP32-LABEL: name: call_double_in_fpr
130  ; FP32: bb.1.entry:
131  ; FP32-NEXT:   liveins: $d6, $d7
132  ; FP32-NEXT: {{  $}}
133  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d6
134  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d7
135  ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
136  ; FP32-NEXT:   $d6 = COPY [[COPY]](s64)
137  ; FP32-NEXT:   $d7 = COPY [[COPY1]](s64)
138  ; FP32-NEXT:   JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0
139  ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $d0
140  ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
141  ; FP32-NEXT:   $d0 = COPY [[COPY2]](s64)
142  ; FP32-NEXT:   RetRA implicit $d0
143  ; FP64-LABEL: name: call_double_in_fpr
144  ; FP64: bb.1.entry:
145  ; FP64-NEXT:   liveins: $d12_64, $d14_64
146  ; FP64-NEXT: {{  $}}
147  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64
148  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64
149  ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
150  ; FP64-NEXT:   $d12_64 = COPY [[COPY]](s64)
151  ; FP64-NEXT:   $d14_64 = COPY [[COPY1]](s64)
152  ; FP64-NEXT:   JAL @double_in_fpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $d12_64, implicit $d14_64, implicit-def $d0_64
153  ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $d0_64
154  ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
155  ; FP64-NEXT:   $d0_64 = COPY [[COPY2]](s64)
156  ; FP64-NEXT:   RetRA implicit $d0_64
157entry:
158  %call = call double @double_in_fpr(double %a, double %b)
159  ret double %call
160}
161
162define float @call_float_in_gpr(i32 %a, float %b) {
163  ; FP32-LABEL: name: call_float_in_gpr
164  ; FP32: bb.1.entry:
165  ; FP32-NEXT:   liveins: $a0, $a1
166  ; FP32-NEXT: {{  $}}
167  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
168  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
169  ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
170  ; FP32-NEXT:   $a0 = COPY [[COPY]](s32)
171  ; FP32-NEXT:   $a1 = COPY [[COPY1]](s32)
172  ; FP32-NEXT:   JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0
173  ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
174  ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
175  ; FP32-NEXT:   $f0 = COPY [[COPY2]](s32)
176  ; FP32-NEXT:   RetRA implicit $f0
177  ; FP64-LABEL: name: call_float_in_gpr
178  ; FP64: bb.1.entry:
179  ; FP64-NEXT:   liveins: $a0, $a1
180  ; FP64-NEXT: {{  $}}
181  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
182  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
183  ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
184  ; FP64-NEXT:   $a0 = COPY [[COPY]](s32)
185  ; FP64-NEXT:   $a1 = COPY [[COPY1]](s32)
186  ; FP64-NEXT:   JAL @float_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0
187  ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
188  ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
189  ; FP64-NEXT:   $f0 = COPY [[COPY2]](s32)
190  ; FP64-NEXT:   RetRA implicit $f0
191entry:
192  %call = call float @float_in_gpr(i32 %a, float %b)
193  ret float %call
194}
195
196
197define double @call_double_in_gpr(i32 %a, double %b) {
198  ; FP32-LABEL: name: call_double_in_gpr
199  ; FP32: bb.1.entry:
200  ; FP32-NEXT:   liveins: $a0, $a2, $a3
201  ; FP32-NEXT: {{  $}}
202  ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
203  ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
204  ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
205  ; FP32-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
206  ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
207  ; FP32-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64)
208  ; FP32-NEXT:   $a0 = COPY [[COPY]](s32)
209  ; FP32-NEXT:   $a2 = COPY [[UV]](s32)
210  ; FP32-NEXT:   $a3 = COPY [[UV1]](s32)
211  ; FP32-NEXT:   JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0
212  ; FP32-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $d0
213  ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
214  ; FP32-NEXT:   $d0 = COPY [[COPY3]](s64)
215  ; FP32-NEXT:   RetRA implicit $d0
216  ; FP64-LABEL: name: call_double_in_gpr
217  ; FP64: bb.1.entry:
218  ; FP64-NEXT:   liveins: $a0, $a2, $a3
219  ; FP64-NEXT: {{  $}}
220  ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
221  ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
222  ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
223  ; FP64-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
224  ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
225  ; FP64-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64)
226  ; FP64-NEXT:   $a0 = COPY [[COPY]](s32)
227  ; FP64-NEXT:   $a2 = COPY [[UV]](s32)
228  ; FP64-NEXT:   $a3 = COPY [[UV1]](s32)
229  ; FP64-NEXT:   JAL @double_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0_64
230  ; FP64-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $d0_64
231  ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
232  ; FP64-NEXT:   $d0_64 = COPY [[COPY3]](s64)
233  ; FP64-NEXT:   RetRA implicit $d0_64
234entry:
235  %call = call double @double_in_gpr(i32 %a, double %b)
236  ret double %call
237}
238