blob: 6fdb95efe8ecf4c1d0bdda30e6099d224c085300 [file] [log] [blame]
Daniel Sanders0d972702016-06-24 12:23:17 +00001; RUN: llc -march=mipsel -mcpu=mips32 < %s | FileCheck %s -check-prefixes=ALL,32-NOFPXX
2; RUN: llc -march=mipsel -mcpu=mips32 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,32-FPXX
Sasa Stankovicb976fee2014-07-14 09:40:29 +00003
Daniel Sanders0d972702016-06-24 12:23:17 +00004; RUN: llc -march=mipsel -mcpu=mips32r2 < %s | FileCheck %s -check-prefixes=ALL,32R2-NOFPXX
5; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,32R2-FPXX
Sasa Stankovicb976fee2014-07-14 09:40:29 +00006
Daniel Sanders0d972702016-06-24 12:23:17 +00007; RUN: llc -march=mips64 -mcpu=mips4 < %s | FileCheck %s -check-prefixes=ALL,4-NOFPXX
Sasa Stankovicb976fee2014-07-14 09:40:29 +00008; RUN: not llc -march=mips64 -mcpu=mips4 -mattr=fpxx < %s 2>&1 | FileCheck %s -check-prefix=4-FPXX
9
Daniel Sanders0d972702016-06-24 12:23:17 +000010; RUN: llc -march=mips64 -mcpu=mips64 < %s | FileCheck %s -check-prefixes=ALL,64-NOFPXX
Sasa Stankovicb976fee2014-07-14 09:40:29 +000011; RUN: not llc -march=mips64 -mcpu=mips64 -mattr=fpxx < %s 2>&1 | FileCheck %s -check-prefix=64-FPXX
12
Daniel Sanders0d972702016-06-24 12:23:17 +000013; RUN-TODO: llc -march=mips64 -mcpu=mips4 -target-abi o32 < %s | FileCheck %s -check-prefixes=ALL,4-O32-NOFPXX
14; RUN-TODO: llc -march=mips64 -mcpu=mips4 -target-abi o32 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,4-O32-FPXX
Sasa Stankovicb976fee2014-07-14 09:40:29 +000015
Daniel Sanders0d972702016-06-24 12:23:17 +000016; RUN-TODO: llc -march=mips64 -mcpu=mips64 -target-abi o32 < %s | FileCheck %s -check-prefixes=ALL,64-O32-NOFPXX
17; RUN-TODO: llc -march=mips64 -mcpu=mips64 -target-abi o32 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,64-O32-FPXX
Sasa Stankovicb976fee2014-07-14 09:40:29 +000018
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000019declare double @dbl();
Sasa Stankovicb976fee2014-07-14 09:40:29 +000020
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000021; 4-FPXX: LLVM ERROR: FPXX is not permitted for the N32/N64 ABI's.
22; 64-FPXX: LLVM ERROR: FPXX is not permitted for the N32/N64 ABI's.
Sasa Stankovicb976fee2014-07-14 09:40:29 +000023
24define double @test1(double %d, ...) {
25 ret double %d
26
27; ALL-LABEL: test1:
28
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000029; 32-NOFPXX: mtc1 $4, $f0
30; 32-NOFPXX: mtc1 $5, $f1
Sasa Stankovicb976fee2014-07-14 09:40:29 +000031
32; 32-FPXX: addiu $sp, $sp, -8
33; 32-FPXX: sw $4, 0($sp)
34; 32-FPXX: sw $5, 4($sp)
35; 32-FPXX: ldc1 $f0, 0($sp)
36
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000037; 32R2-NOFPXX: mtc1 $4, $f0
38; 32R2-NOFPXX: mthc1 $5, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +000039
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000040; 32R2-FPXX: mtc1 $4, $f0
41; 32R2-FPXX: mthc1 $5, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +000042
43; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used.
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000044; 4-NOFPXX: mov.d $f0, $f12
Sasa Stankovicb976fee2014-07-14 09:40:29 +000045
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000046; 64-NOFPXX: mov.d $f0, $f12
Sasa Stankovicb976fee2014-07-14 09:40:29 +000047}
48
49define double @test2(i32 %i, double %d) {
50 ret double %d
51
52; ALL-LABEL: test2:
53
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000054; 32-NOFPXX: mtc1 $6, $f0
55; 32-NOFPXX: mtc1 $7, $f1
Sasa Stankovicb976fee2014-07-14 09:40:29 +000056
57; 32-FPXX: addiu $sp, $sp, -8
58; 32-FPXX: sw $6, 0($sp)
59; 32-FPXX: sw $7, 4($sp)
60; 32-FPXX: ldc1 $f0, 0($sp)
61
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000062; 32R2-NOFPXX: mtc1 $6, $f0
63; 32R2-NOFPXX: mthc1 $7, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +000064
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000065; 32R2-FPXX: mtc1 $6, $f0
66; 32R2-FPXX: mthc1 $7, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +000067
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000068; 4-NOFPXX: mov.d $f0, $f13
Sasa Stankovicb976fee2014-07-14 09:40:29 +000069
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000070; 64-NOFPXX: mov.d $f0, $f13
Sasa Stankovicb976fee2014-07-14 09:40:29 +000071}
72
73define double @test3(float %f1, float %f2, double %d) {
74 ret double %d
75
76; ALL-LABEL: test3:
77
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000078; 32-NOFPXX: mtc1 $6, $f0
79; 32-NOFPXX: mtc1 $7, $f1
Sasa Stankovicb976fee2014-07-14 09:40:29 +000080
81; 32-FPXX: addiu $sp, $sp, -8
82; 32-FPXX: sw $6, 0($sp)
83; 32-FPXX: sw $7, 4($sp)
84; 32-FPXX: ldc1 $f0, 0($sp)
85
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000086; 32R2-NOFPXX: mtc1 $6, $f0
87; 32R2-NOFPXX: mthc1 $7, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +000088
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000089; 32R2-FPXX: mtc1 $6, $f0
90; 32R2-FPXX: mthc1 $7, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +000091
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000092; 4-NOFPXX: mov.d $f0, $f14
Sasa Stankovicb976fee2014-07-14 09:40:29 +000093
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +000094; 64-NOFPXX: mov.d $f0, $f14
Sasa Stankovicb976fee2014-07-14 09:40:29 +000095}
96
97define double @test4(float %f, double %d, ...) {
98 ret double %d
99
100; ALL-LABEL: test4:
101
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000102; 32-NOFPXX: mtc1 $6, $f0
103; 32-NOFPXX: mtc1 $7, $f1
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000104
105; 32-FPXX: addiu $sp, $sp, -8
106; 32-FPXX: sw $6, 0($sp)
107; 32-FPXX: sw $7, 4($sp)
108; 32-FPXX: ldc1 $f0, 0($sp)
109
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000110; 32R2-NOFPXX: mtc1 $6, $f0
111; 32R2-NOFPXX: mthc1 $7, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000112
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000113; 32R2-FPXX: mtc1 $6, $f0
114; 32R2-FPXX: mthc1 $7, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000115
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000116; 4-NOFPXX: mov.d $f0, $f13
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000117
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000118; 64-NOFPXX: mov.d $f0, $f13
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000119}
120
121define double @test5() {
122 ret double 0.000000e+00
123
124; ALL-LABEL: test5:
125
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000126; 32-NOFPXX: mtc1 $zero, $f0
127; 32-NOFPXX: mtc1 $zero, $f1
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000128
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000129; 32-FPXX: addiu $sp, $sp, -8
130; 32-FPXX: sw $zero, 0($sp)
131; 32-FPXX: sw $zero, 4($sp)
132; 32-FPXX: ldc1 $f0, 0($sp)
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000133
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000134; 32R2-NOFPXX: mtc1 $zero, $f0
135; 32R2-NOFPXX: mthc1 $zero, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000136
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000137; 32R2-FPXX: mtc1 $zero, $f0
138; 32R2-FPXX: mthc1 $zero, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000139
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000140; 4-NOFPXX: dmtc1 $zero, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000141
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000142; 64-NOFPXX: dmtc1 $zero, $f0
143}
144
145define double @test6(double %a, double %b, ...) {
146 %1 = fsub double %a, %b
147 ret double %1
148
149; ALL-LABEL: test6:
150
151; 32-NOFPXX-DAG: mtc1 $4, $[[T0:f[0-9]+]]
152; 32-NOFPXX-DAG: mtc1 $5, ${{f[0-9]*[13579]}}
153; 32-NOFPXX-DAG: mtc1 $6, $[[T1:f[0-9]+]]
154; 32-NOFPXX-DAG: mtc1 $7, ${{f[0-9]*[13579]}}
155; 32-NOFPXX: sub.d $f0, $[[T0]], $[[T1]]
156
157; 32-FPXX: addiu $sp, $sp, -8
158; 32-FPXX: sw $6, 0($sp)
159; 32-FPXX: sw $7, 4($sp)
160; 32-FPXX: ldc1 $[[T1:f[0-9]+]], 0($sp)
161; 32-FPXX: sw $4, 0($sp)
162; 32-FPXX: sw $5, 4($sp)
163; 32-FPXX: ldc1 $[[T0:f[0-9]+]], 0($sp)
164; 32-FPXX: sub.d $f0, $[[T0]], $[[T1]]
165
166; 32R2-NOFPXX-DAG: mtc1 $4, $[[T0:f[0-9]+]]
167; 32R2-NOFPXX-DAG: mthc1 $5, $[[T0]]
168; 32R2-NOFPXX-DAG: mtc1 $6, $[[T1:f[0-9]+]]
169; 32R2-NOFPXX-DAG: mthc1 $7, $[[T1]]
170; 32R2-NOFPXX: sub.d $f0, $[[T0]], $[[T1]]
171
172; 32R2-FPXX-DAG: mtc1 $4, $[[T0:f[0-9]+]]
173; 32R2-FPXX-DAG: mthc1 $5, $[[T0]]
174; 32R2-FPXX-DAG: mtc1 $6, $[[T1:f[0-9]+]]
175; 32R2-FPXX-DAG: mthc1 $7, $[[T1]]
176; 32R2-FPXX: sub.d $f0, $[[T0]], $[[T1]]
177
178; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used.
179; 4-NOFPXX: sub.d $f0, $f12, $f13
180
181; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used.
182; 64-NOFPXX: sub.d $f0, $f12, $f13
183}
184
185define double @move_from1(double %d) {
186 %1 = call double @dbl()
187 %2 = call double @test2(i32 0, double %1)
188 ret double %2
189
190; ALL-LABEL: move_from1:
191
192; 32-NOFPXX-DAG: mfc1 $6, $f0
193; 32-NOFPXX-DAG: mfc1 $7, $f1
194
195; 32-FPXX: addiu $sp, $sp, -32
196; 32-FPXX: sdc1 $f0, 16($sp)
197; 32-FPXX: lw $6, 16($sp)
198; FIXME: This store is redundant
199; 32-FPXX: sdc1 $f0, 16($sp)
200; 32-FPXX: lw $7, 20($sp)
201
202; 32R2-NOFPXX-DAG: mfc1 $6, $f0
203; 32R2-NOFPXX-DAG: mfhc1 $7, $f0
204
205; 32R2-FPXX-DAG: mfc1 $6, $f0
206; 32R2-FPXX-DAG: mfhc1 $7, $f0
207
208; floats/doubles are not passed in integer registers for n64, so dmfc1 is not used.
209; We can't use inline assembly to force a copy either because trying to force
210; a copy to a GPR this way fails with ; "couldn't allocate input reg for
211; constraint 'r'". It therefore seems impossible to test the generation of dmfc1
212; in a simple test.
213; 4-NOFPXX: mov.d $f13, $f0
214
215; floats/doubles are not passed in integer registers for n64, so dmfc1 is not used.
216; We can't use inline assembly to force a copy either because trying to force
217; a copy to a GPR this way fails with ; "couldn't allocate input reg for
218; constraint 'r'". It therefore seems impossible to test the generation of dmfc1
219; in a simple test.
220; 64-NOFPXX: mov.d $f13, $f0
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000221}