[mips] Add tests for the 'ret', 'call', and 'indirectbr' LLVM IR instruction.
[oota-llvm.git] / test / CodeGen / Mips / llvm-ir / ret.ll
1 ; Test all important variants of the 'ret' instruction.
2 ;
3 ; For non-void returns it is necessary to have something to return so we also
4 ; test constant generation here.
5 ;
6 ; We'll test pointer returns in a separate file since the relocation model
7 ; affects it.
8
9 ; RUN: llc -march=mips   -mcpu=mips32   < %s | FileCheck %s -check-prefix=ALL -check-prefix=GPR32 -check-prefix=NO-MTHC1
10 ; RUN: llc -march=mips   -mcpu=mips32r2 < %s | FileCheck %s -check-prefix=ALL -check-prefix=GPR32 -check-prefix=MTHC1
11 ; RUN: llc -march=mips64 -mcpu=mips4    < %s | FileCheck %s -check-prefix=ALL -check-prefix=GPR64 -check-prefix=DMTC1
12 ; RUN: llc -march=mips64 -mcpu=mips64   < %s | FileCheck %s -check-prefix=ALL -check-prefix=GPR64 -check-prefix=DMTC1
13 ; RUN: llc -march=mips64 -mcpu=mips64r2 < %s | FileCheck %s -check-prefix=ALL -check-prefix=GPR64 -check-prefix=DMTC1
14
15 define void @ret_void() {
16 ; ALL-LABEL: ret_void:
17 ; ALL:           jr $ra
18   ret void
19 }
20
21 define i8 @ret_i8() {
22 ; ALL-LABEL: ret_i8:
23 ; ALL-DAG:       jr $ra
24 ; ALL-DAG:       addiu $2, $zero, 3
25   ret i8 3
26 }
27
28 define i16 @ret_i16_3() {
29 ; ALL-LABEL: ret_i16_3:
30 ; ALL-DAG:       jr $ra
31 ; ALL-DAG:       addiu $2, $zero, 3
32   ret i16 3
33 }
34
35 define i16 @ret_i16_256() {
36 ; ALL-LABEL: ret_i16_256:
37 ; ALL-DAG:       jr $ra
38 ; ALL-DAG:       addiu $2, $zero, 256
39   ret i16 256
40 }
41
42 define i16 @ret_i16_257() {
43 ; ALL-LABEL: ret_i16_257:
44 ; ALL-DAG:       jr $ra
45 ; ALL-DAG:       addiu $2, $zero, 257
46   ret i16 257
47 }
48
49 define i32 @ret_i32_257() {
50 ; ALL-LABEL: ret_i32_257:
51 ; ALL-DAG:       jr $ra
52 ; ALL-DAG:       addiu $2, $zero, 257
53   ret i32 257
54 }
55
56 define i32 @ret_i32_65536() {
57 ; ALL-LABEL: ret_i32_65536:
58 ; ALL-DAG:       jr $ra
59 ; ALL-DAG:       lui $2, 1
60   ret i32 65536
61 }
62
63 define i32 @ret_i32_65537() {
64 ; ALL-LABEL: ret_i32_65537:
65 ; ALL:           lui $[[T0:[0-9]+]], 1
66 ; ALL-DAG:       jr $ra
67 ; ALL-DAG:       ori $2, $[[T0]], 1
68   ret i32 65537
69 }
70
71 define i64 @ret_i64_65537() {
72 ; ALL-LABEL: ret_i64_65537:
73 ; ALL:           lui $[[T0:[0-9]+]], 1
74
75 ; GPR32-DAG:     ori $3, $[[T0]], 1
76 ; GPR32-DAG:     addiu $2, $zero, 0
77
78 ; GPR64-DAG:     daddiu $2, $[[T0]], 1
79
80 ; ALL-DAG:       jr $ra
81   ret i64 65537
82 }
83
84 define i64 @ret_i64_281479271677952() {
85 ; ALL-LABEL: ret_i64_281479271677952:
86 ; ALL-DAG:       lui $[[T0:[0-9]+]], 1
87
88 ; GPR32-DAG:     ori $2, $[[T0]], 1
89 ; GPR32-DAG:     addiu $3, $zero, 0
90
91 ; GPR64-DAG:     daddiu $[[T1:[0-9]+]], $[[T0]], 1
92 ; GPR64-DAG:     dsll $2, $[[T1]], 32
93
94 ; ALL-DAG:       jr $ra
95   ret i64 281479271677952
96 }
97
98 define i64 @ret_i64_281479271809026() {
99 ; ALL-LABEL: ret_i64_281479271809026:
100 ; GPR32-DAG:     lui $[[T0:[0-9]+]], 1
101 ; GPR32-DAG:     lui $[[T1:[0-9]+]], 2
102 ; GPR32-DAG:     ori $2, $[[T0]], 1
103 ; GPR32-DAG:     ori $3, $[[T1]], 2
104
105 ; GPR64-DAG:     ori  $[[T0:[0-9]+]], $zero, 32769
106 ; GPR64-DAG:     dsll $[[T1:[0-9]+]], $[[T0]], 16
107 ; GPR64-DAG:     daddiu $[[T0:[0-9]+]], $[[T0]], -32767
108 ; GPR64-DAG:     dsll $[[T1:[0-9]+]], $[[T0]], 17
109 ; GPR64-DAG:     daddiu $2, $[[T1]], 2
110
111 ; ALL-DAG:       jr $ra
112   ret i64 281479271809026
113 }
114
115 ; TODO: f32
116 define float @ret_float_0x0() {
117 ; ALL-LABEL: ret_float_0x0:
118
119 ; NO-MTHC1-DAG:  mtc1 $zero, $f0
120
121 ; MTHC1-DAG:     mtc1 $zero, $f0
122
123 ; DMTC-DAG:      dmtc1 $zero, $f0
124
125 ; ALL-DAG:       jr $ra
126   ret float 0x0000000000000000
127 }
128
129 define float @ret_float_0x3() {
130 ; ALL-LABEL: ret_float_0x3:
131
132 ; Use a constant pool
133 ; O32-DAG:       lwc1 $f0, %lo($CPI
134 ; N64-DAG:       lwc1 $f0, %got_ofst($CPI
135
136 ; ALL-DAG:       jr $ra
137
138 ; float constants are written as double constants
139   ret float 0x36b8000000000000
140 }
141
142 define double @ret_double_0x0() {
143 ; ALL-LABEL: ret_double_0x0:
144
145 ; NO-MTHC1-DAG:  mtc1 $zero, $f0
146 ; NO-MTHC1-DAG:  mtc1 $zero, $f1
147
148 ; MTHC1-DAG:     mtc1 $zero, $f0
149 ; MTHC1-DAG:     mthc1 $zero, $f0
150
151 ; DMTC-DAG:      dmtc1 $zero, $f0
152
153 ; ALL-DAG:       jr $ra
154   ret double 0x0000000000000000
155 }
156
157 define double @ret_double_0x3() {
158 ; ALL-LABEL: ret_double_0x3:
159
160 ; Use a constant pool
161 ; O32-DAG:       ldc1 $f0, %lo($CPI
162 ; N64-DAG:       ldc1 $f0, %got_ofst($CPI
163
164 ; ALL-DAG:       jr $ra
165   ret double 0x0000000000000003
166 }