[mips] Expand BuildPairF64 to a spill and reload when the O32 FPXX ABI is
[oota-llvm.git] / test / CodeGen / Mips / fpxx.ll
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
3
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
6
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
9
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
12
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
15
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
18
19
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.
22
23 define double @test1(double %d, ...) {
24   ret double %d
25
26 ; ALL-LABEL: test1:
27
28 ; 32-NOFPXX:    mtc1    $4, $f0
29 ; 32-NOFPXX:    mtc1    $5, $f1
30
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)
35
36 ; 32R2-NOFPXX:    mtc1    $4, $f0
37 ; 32R2-NOFPXX:    mthc1   $5, $f0
38
39 ; 32R2-FPXX:    mtc1    $4, $f0
40 ; 32R2-FPXX:    mthc1   $5, $f0
41
42 ; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used.
43 ; 4-NOFPXX:    mov.d   $f0, $f12
44
45 ; 64-NOFPXX:    mov.d   $f0, $f12
46 }
47
48 define double @test2(i32 %i, double %d) {
49   ret double %d
50
51 ; ALL-LABEL: test2:
52
53 ; 32-NOFPXX:    mtc1    $6, $f0
54 ; 32-NOFPXX:    mtc1    $7, $f1
55
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)
60
61 ; 32R2-NOFPXX:    mtc1    $6, $f0
62 ; 32R2-NOFPXX:    mthc1   $7, $f0
63
64 ; 32R2-FPXX:    mtc1    $6, $f0
65 ; 32R2-FPXX:    mthc1   $7, $f0
66
67 ; 4-NOFPXX:    mov.d   $f0, $f13
68
69 ; 64-NOFPXX:    mov.d   $f0, $f13
70 }
71
72 define double @test3(float %f1, float %f2, double %d) {
73   ret double %d
74
75 ; ALL-LABEL: test3:
76
77 ; 32-NOFPXX:    mtc1    $6, $f0
78 ; 32-NOFPXX:    mtc1    $7, $f1
79
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)
84
85 ; 32R2-NOFPXX:    mtc1    $6, $f0
86 ; 32R2-NOFPXX:    mthc1   $7, $f0
87
88 ; 32R2-FPXX:    mtc1    $6, $f0
89 ; 32R2-FPXX:    mthc1   $7, $f0
90
91 ; 4-NOFPXX:    mov.d   $f0, $f14
92
93 ; 64-NOFPXX:    mov.d   $f0, $f14
94 }
95
96 define double @test4(float %f, double %d, ...) {
97   ret double %d
98
99 ; ALL-LABEL: test4:
100
101 ; 32-NOFPXX:    mtc1    $6, $f0
102 ; 32-NOFPXX:    mtc1    $7, $f1
103
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)
108
109 ; 32R2-NOFPXX:    mtc1    $6, $f0
110 ; 32R2-NOFPXX:    mthc1   $7, $f0
111
112 ; 32R2-FPXX:    mtc1    $6, $f0
113 ; 32R2-FPXX:    mthc1   $7, $f0
114
115 ; 4-NOFPXX:    mov.d   $f0, $f13
116
117 ; 64-NOFPXX:    mov.d   $f0, $f13
118 }
119
120 define double @test5() {
121   ret double 0.000000e+00
122
123 ; ALL-LABEL: test5:
124
125 ; 32-NOFPXX:    mtc1    $zero, $f0
126 ; 32-NOFPXX:    mtc1    $zero, $f1
127
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)
132
133 ; 32R2-NOFPXX:    mtc1    $zero, $f0
134 ; 32R2-NOFPXX:    mthc1   $zero, $f0
135
136 ; 32R2-FPXX:    mtc1    $zero, $f0
137 ; 32R2-FPXX:    mthc1   $zero, $f0
138
139 ; 4-NOFPXX:    dmtc1 $zero, $f0
140
141 ; 64-NOFPXX:    dmtc1 $zero, $f0
142 }