Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Mips / GlobalISel / irtranslator / float_args.ll
blob89367ddf9741858792703eebfc63259f3dace549
1 ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
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
6 define 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   ;
16   ; FP64-LABEL: name: float_in_fpr
17   ; FP64: bb.1.entry:
18   ; FP64-NEXT:   liveins: $f12, $f14
19   ; FP64-NEXT: {{  $}}
20   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
21   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
22   ; FP64-NEXT:   $f0 = COPY [[COPY1]](s32)
23   ; FP64-NEXT:   RetRA implicit $f0
24 entry:
25   ret float %b
28 define double @double_in_fpr(double %a, double %b) {
29   ; FP32-LABEL: name: double_in_fpr
30   ; FP32: bb.1.entry:
31   ; FP32-NEXT:   liveins: $d6, $d7
32   ; FP32-NEXT: {{  $}}
33   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d6
34   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d7
35   ; FP32-NEXT:   $d0 = COPY [[COPY1]](s64)
36   ; FP32-NEXT:   RetRA implicit $d0
37   ;
38   ; FP64-LABEL: name: double_in_fpr
39   ; FP64: bb.1.entry:
40   ; FP64-NEXT:   liveins: $d12_64, $d14_64
41   ; FP64-NEXT: {{  $}}
42   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64
43   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64
44   ; FP64-NEXT:   $d0_64 = COPY [[COPY1]](s64)
45   ; FP64-NEXT:   RetRA implicit $d0_64
46 entry:
47   ret double %b
50 define float @float_in_gpr(i32 %a, float %b) {
51   ; FP32-LABEL: name: float_in_gpr
52   ; FP32: bb.1.entry:
53   ; FP32-NEXT:   liveins: $a0, $a1
54   ; FP32-NEXT: {{  $}}
55   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
56   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
57   ; FP32-NEXT:   $f0 = COPY [[COPY1]](s32)
58   ; FP32-NEXT:   RetRA implicit $f0
59   ;
60   ; FP64-LABEL: name: float_in_gpr
61   ; FP64: bb.1.entry:
62   ; FP64-NEXT:   liveins: $a0, $a1
63   ; FP64-NEXT: {{  $}}
64   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
65   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
66   ; FP64-NEXT:   $f0 = COPY [[COPY1]](s32)
67   ; FP64-NEXT:   RetRA implicit $f0
68 entry:
69   ret float %b
72 define double @double_in_gpr(i32 %a, double %b) {
73   ; FP32-LABEL: name: double_in_gpr
74   ; FP32: bb.1.entry:
75   ; FP32-NEXT:   liveins: $a0, $a2, $a3
76   ; FP32-NEXT: {{  $}}
77   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
78   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
79   ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
80   ; FP32-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
81   ; FP32-NEXT:   $d0 = COPY [[MV]](s64)
82   ; FP32-NEXT:   RetRA implicit $d0
83   ;
84   ; FP64-LABEL: name: double_in_gpr
85   ; FP64: bb.1.entry:
86   ; FP64-NEXT:   liveins: $a0, $a2, $a3
87   ; FP64-NEXT: {{  $}}
88   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
89   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
90   ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
91   ; FP64-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
92   ; FP64-NEXT:   $d0_64 = COPY [[MV]](s64)
93   ; FP64-NEXT:   RetRA implicit $d0_64
94 entry:
95   ret double %b
98 define double @two_double_in_gpr(i32 %a, double %b, double %c) {
99   ; FP32-LABEL: name: two_double_in_gpr
100   ; FP32: bb.1.entry:
101   ; FP32-NEXT:   liveins: $a0, $a2, $a3
102   ; FP32-NEXT: {{  $}}
103   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
104   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
105   ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
106   ; FP32-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
107   ; FP32-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
108   ; FP32-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0)
109   ; FP32-NEXT:   $d0 = COPY [[LOAD]](s64)
110   ; FP32-NEXT:   RetRA implicit $d0
111   ;
112   ; FP64-LABEL: name: two_double_in_gpr
113   ; FP64: bb.1.entry:
114   ; FP64-NEXT:   liveins: $a0, $a2, $a3
115   ; FP64-NEXT: {{  $}}
116   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
117   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
118   ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
119   ; FP64-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
120   ; FP64-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
121   ; FP64-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0)
122   ; FP64-NEXT:   $d0_64 = COPY [[LOAD]](s64)
123   ; FP64-NEXT:   RetRA implicit $d0_64
124 entry:
125   ret double %c
128 define float @call_float_in_fpr(float %a, float %b) {
129   ; FP32-LABEL: name: call_float_in_fpr
130   ; FP32: bb.1.entry:
131   ; FP32-NEXT:   liveins: $f12, $f14
132   ; FP32-NEXT: {{  $}}
133   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
134   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
135   ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
136   ; FP32-NEXT:   $f12 = COPY [[COPY]](s32)
137   ; FP32-NEXT:   $f14 = COPY [[COPY1]](s32)
138   ; FP32-NEXT:   JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
139   ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
140   ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
141   ; FP32-NEXT:   $f0 = COPY [[COPY2]](s32)
142   ; FP32-NEXT:   RetRA implicit $f0
143   ;
144   ; FP64-LABEL: name: call_float_in_fpr
145   ; FP64: bb.1.entry:
146   ; FP64-NEXT:   liveins: $f12, $f14
147   ; FP64-NEXT: {{  $}}
148   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $f12
149   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $f14
150   ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
151   ; FP64-NEXT:   $f12 = COPY [[COPY]](s32)
152   ; FP64-NEXT:   $f14 = COPY [[COPY1]](s32)
153   ; FP64-NEXT:   JAL @float_in_fpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0
154   ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
155   ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
156   ; FP64-NEXT:   $f0 = COPY [[COPY2]](s32)
157   ; FP64-NEXT:   RetRA implicit $f0
158 entry:
159   %call = call float @float_in_fpr(float %a, float %b)
160   ret float %call
163 define double @call_double_in_fpr(double %a, double %b) {
164   ; FP32-LABEL: name: call_double_in_fpr
165   ; FP32: bb.1.entry:
166   ; FP32-NEXT:   liveins: $d6, $d7
167   ; FP32-NEXT: {{  $}}
168   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d6
169   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d7
170   ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
171   ; FP32-NEXT:   $d6 = COPY [[COPY]](s64)
172   ; FP32-NEXT:   $d7 = COPY [[COPY1]](s64)
173   ; FP32-NEXT:   JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0
174   ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $d0
175   ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
176   ; FP32-NEXT:   $d0 = COPY [[COPY2]](s64)
177   ; FP32-NEXT:   RetRA implicit $d0
178   ;
179   ; FP64-LABEL: name: call_double_in_fpr
180   ; FP64: bb.1.entry:
181   ; FP64-NEXT:   liveins: $d12_64, $d14_64
182   ; FP64-NEXT: {{  $}}
183   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64
184   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64
185   ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
186   ; FP64-NEXT:   $d12_64 = COPY [[COPY]](s64)
187   ; FP64-NEXT:   $d14_64 = COPY [[COPY1]](s64)
188   ; 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
189   ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $d0_64
190   ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
191   ; FP64-NEXT:   $d0_64 = COPY [[COPY2]](s64)
192   ; FP64-NEXT:   RetRA implicit $d0_64
193 entry:
194   %call = call double @double_in_fpr(double %a, double %b)
195   ret double %call
198 define float @call_float_in_gpr(i32 %a, float %b) {
199   ; FP32-LABEL: name: call_float_in_gpr
200   ; FP32: bb.1.entry:
201   ; FP32-NEXT:   liveins: $a0, $a1
202   ; FP32-NEXT: {{  $}}
203   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
204   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
205   ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
206   ; FP32-NEXT:   $a0 = COPY [[COPY]](s32)
207   ; FP32-NEXT:   $a1 = COPY [[COPY1]](s32)
208   ; FP32-NEXT:   JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0
209   ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
210   ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
211   ; FP32-NEXT:   $f0 = COPY [[COPY2]](s32)
212   ; FP32-NEXT:   RetRA implicit $f0
213   ;
214   ; FP64-LABEL: name: call_float_in_gpr
215   ; FP64: bb.1.entry:
216   ; FP64-NEXT:   liveins: $a0, $a1
217   ; FP64-NEXT: {{  $}}
218   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
219   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
220   ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
221   ; FP64-NEXT:   $a0 = COPY [[COPY]](s32)
222   ; FP64-NEXT:   $a1 = COPY [[COPY1]](s32)
223   ; FP64-NEXT:   JAL @float_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0
224   ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $f0
225   ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
226   ; FP64-NEXT:   $f0 = COPY [[COPY2]](s32)
227   ; FP64-NEXT:   RetRA implicit $f0
228 entry:
229   %call = call float @float_in_gpr(i32 %a, float %b)
230   ret float %call
234 define double @call_double_in_gpr(i32 %a, double %b) {
235   ; FP32-LABEL: name: call_double_in_gpr
236   ; FP32: bb.1.entry:
237   ; FP32-NEXT:   liveins: $a0, $a2, $a3
238   ; FP32-NEXT: {{  $}}
239   ; FP32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
240   ; FP32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
241   ; FP32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
242   ; FP32-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
243   ; FP32-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
244   ; FP32-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64)
245   ; FP32-NEXT:   $a0 = COPY [[COPY]](s32)
246   ; FP32-NEXT:   $a2 = COPY [[UV]](s32)
247   ; FP32-NEXT:   $a3 = COPY [[UV1]](s32)
248   ; FP32-NEXT:   JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0
249   ; FP32-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $d0
250   ; FP32-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
251   ; FP32-NEXT:   $d0 = COPY [[COPY3]](s64)
252   ; FP32-NEXT:   RetRA implicit $d0
253   ;
254   ; FP64-LABEL: name: call_double_in_gpr
255   ; FP64: bb.1.entry:
256   ; FP64-NEXT:   liveins: $a0, $a2, $a3
257   ; FP64-NEXT: {{  $}}
258   ; FP64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $a0
259   ; FP64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $a2
260   ; FP64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $a3
261   ; FP64-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
262   ; FP64-NEXT:   ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp
263   ; FP64-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64)
264   ; FP64-NEXT:   $a0 = COPY [[COPY]](s32)
265   ; FP64-NEXT:   $a2 = COPY [[UV]](s32)
266   ; FP64-NEXT:   $a3 = COPY [[UV1]](s32)
267   ; FP64-NEXT:   JAL @double_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0_64
268   ; FP64-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $d0_64
269   ; FP64-NEXT:   ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp
270   ; FP64-NEXT:   $d0_64 = COPY [[COPY3]](s64)
271   ; FP64-NEXT:   RetRA implicit $d0_64
272 entry:
273   %call = call double @double_in_gpr(i32 %a, double %b)
274   ret double %call