1 ; RUN: llc -march=mipsel -mcpu=mips32 < %s | FileCheck %s -check-prefix=ALL -check-prefix=32-NOFPXX
2 ; RUN: llc -march=mipsel -mcpu=mips32 -mattr=fpxx < %s | FileCheck %s -check-prefix=ALL -check-prefix=32-FPXX
4 ; RUN: llc -march=mipsel -mcpu=mips32r2 < %s | FileCheck %s -check-prefix=ALL -check-prefix=32R2-NOFPXX
5 ; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=fpxx < %s | FileCheck %s -check-prefix=ALL -check-prefix=32R2-FPXX
7 ; RUN: llc -march=mips64 -mcpu=mips4 < %s | FileCheck %s -check-prefix=ALL -check-prefix=4-NOFPXX
8 ; RUN: not llc -march=mips64 -mcpu=mips4 -mattr=fpxx < %s 2>&1 | FileCheck %s -check-prefix=4-FPXX
10 ; RUN: llc -march=mips64 -mcpu=mips64 < %s | FileCheck %s -check-prefix=ALL -check-prefix=64-NOFPXX
11 ; RUN: not llc -march=mips64 -mcpu=mips64 -mattr=fpxx < %s 2>&1 | FileCheck %s -check-prefix=64-FPXX
13 ; RUN-TODO: llc -march=mips64 -mcpu=mips4 -mattr=-n64,+o32 < %s | FileCheck %s -check-prefix=ALL -check-prefix=4-O32-NOFPXX
14 ; RUN-TOOD: llc -march=mips64 -mcpu=mips4 -mattr=-n64,+o32 -mattr=fpxx < %s | FileCheck %s -check-prefix=ALL -check-prefix=4-O32-FPXX
16 ; RUN-TODO: llc -march=mips64 -mcpu=mips64 -mattr=-n64,+o32 < %s | FileCheck %s -check-prefix=ALL -check-prefix=64-O32-NOFPXX
17 ; RUN-TOOD: llc -march=mips64 -mcpu=mips64 -mattr=-n64,+o32 -mattr=fpxx < %s | FileCheck %s -check-prefix=ALL -check-prefix=64-O32-FPXX
20 ; 4-FPXX: LLVM ERROR: FPXX is not permitted for the N32/N64 ABI's.
21 ; 64-FPXX: LLVM ERROR: FPXX is not permitted for the N32/N64 ABI's.
23 define double @test1(double %d, ...) {
28 ; 32-NOFPXX: mtc1 $4, $f0
29 ; 32-NOFPXX: mtc1 $5, $f1
31 ; 32-FPXX: addiu $sp, $sp, -8
32 ; 32-FPXX: sw $4, 0($sp)
33 ; 32-FPXX: sw $5, 4($sp)
34 ; 32-FPXX: ldc1 $f0, 0($sp)
36 ; 32R2-NOFPXX: mtc1 $4, $f0
37 ; 32R2-NOFPXX: mthc1 $5, $f0
39 ; 32R2-FPXX: mtc1 $4, $f0
40 ; 32R2-FPXX: mthc1 $5, $f0
42 ; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used.
43 ; 4-NOFPXX: mov.d $f0, $f12
45 ; 64-NOFPXX: mov.d $f0, $f12
48 define double @test2(i32 %i, double %d) {
53 ; 32-NOFPXX: mtc1 $6, $f0
54 ; 32-NOFPXX: mtc1 $7, $f1
56 ; 32-FPXX: addiu $sp, $sp, -8
57 ; 32-FPXX: sw $6, 0($sp)
58 ; 32-FPXX: sw $7, 4($sp)
59 ; 32-FPXX: ldc1 $f0, 0($sp)
61 ; 32R2-NOFPXX: mtc1 $6, $f0
62 ; 32R2-NOFPXX: mthc1 $7, $f0
64 ; 32R2-FPXX: mtc1 $6, $f0
65 ; 32R2-FPXX: mthc1 $7, $f0
67 ; 4-NOFPXX: mov.d $f0, $f13
69 ; 64-NOFPXX: mov.d $f0, $f13
72 define double @test3(float %f1, float %f2, double %d) {
77 ; 32-NOFPXX: mtc1 $6, $f0
78 ; 32-NOFPXX: mtc1 $7, $f1
80 ; 32-FPXX: addiu $sp, $sp, -8
81 ; 32-FPXX: sw $6, 0($sp)
82 ; 32-FPXX: sw $7, 4($sp)
83 ; 32-FPXX: ldc1 $f0, 0($sp)
85 ; 32R2-NOFPXX: mtc1 $6, $f0
86 ; 32R2-NOFPXX: mthc1 $7, $f0
88 ; 32R2-FPXX: mtc1 $6, $f0
89 ; 32R2-FPXX: mthc1 $7, $f0
91 ; 4-NOFPXX: mov.d $f0, $f14
93 ; 64-NOFPXX: mov.d $f0, $f14
96 define double @test4(float %f, double %d, ...) {
101 ; 32-NOFPXX: mtc1 $6, $f0
102 ; 32-NOFPXX: mtc1 $7, $f1
104 ; 32-FPXX: addiu $sp, $sp, -8
105 ; 32-FPXX: sw $6, 0($sp)
106 ; 32-FPXX: sw $7, 4($sp)
107 ; 32-FPXX: ldc1 $f0, 0($sp)
109 ; 32R2-NOFPXX: mtc1 $6, $f0
110 ; 32R2-NOFPXX: mthc1 $7, $f0
112 ; 32R2-FPXX: mtc1 $6, $f0
113 ; 32R2-FPXX: mthc1 $7, $f0
115 ; 4-NOFPXX: mov.d $f0, $f13
117 ; 64-NOFPXX: mov.d $f0, $f13
120 define double @test5() {
121 ret double 0.000000e+00
125 ; 32-NOFPXX: mtc1 $zero, $f0
126 ; 32-NOFPXX: mtc1 $zero, $f1
128 ; 32-FPXX: addiu $sp, $sp, -8
129 ; 32-FPXX: sw $zero, 0($sp)
130 ; 32-FPXX: sw $zero, 4($sp)
131 ; 32-FPXX: ldc1 $f0, 0($sp)
133 ; 32R2-NOFPXX: mtc1 $zero, $f0
134 ; 32R2-NOFPXX: mthc1 $zero, $f0
136 ; 32R2-FPXX: mtc1 $zero, $f0
137 ; 32R2-FPXX: mthc1 $zero, $f0
139 ; 4-NOFPXX: dmtc1 $zero, $f0
141 ; 64-NOFPXX: dmtc1 $zero, $f0