xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/llvm-ir/ret.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test all important variants of the 'ret' instruction.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; For non-void returns it is necessary to have something to return so we also
4*9880d681SAndroid Build Coastguard Worker; test constant generation here.
5*9880d681SAndroid Build Coastguard Worker;
6*9880d681SAndroid Build Coastguard Worker; We'll test pointer returns in a separate file since the relocation model
7*9880d681SAndroid Build Coastguard Worker; affects it and it's undesirable to repeat the non-pointer returns for each
8*9880d681SAndroid Build Coastguard Worker; relocation model.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips   -mcpu=mips32   -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR32,NO-MTHC1,NOT-R6
11*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips   -mcpu=mips32r2 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR32,MTHC1,NOT-R6
12*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips   -mcpu=mips32r3 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR32,MTHC1,NOT-R6
13*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips   -mcpu=mips32r5 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR32,MTHC1,NOT-R6
14*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips   -mcpu=mips32r6 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR32,MTHC1,R6C
15*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips4    -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR64,DMTC1,NOT-R6
16*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips64   -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR64,DMTC1,NOT-R6
17*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips64r2 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR64,DMTC1,NOT-R6
18*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips64r3 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR64,DMTC1,NOT-R6
19*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips64r5 -asm-show-inst < %s | FileCheck %s -check-prefixes=ALL,GPR64,DMTC1,NOT-R6
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; FIXME: for the test ret_double_0x0, the delay slot of jr cannot be filled
22*9880d681SAndroid Build Coastguard Worker;        as mthc1 has unmodeled side effects. This is an artifact of our backend.
23*9880d681SAndroid Build Coastguard Worker;        Force the delay slot filler off to check that the sequence jr $ra; nop is
24*9880d681SAndroid Build Coastguard Worker;        turned into jic 0, $ra.
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips64r6 -asm-show-inst -disable-mips-delay-filler < %s | FileCheck %s -check-prefixes=ALL,GPR64,DMTC1,R6C
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine void @ret_void() {
29*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_void:
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
32*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
33*9880d681SAndroid Build Coastguard Worker; R6C-DAG:       jrc $ra # <MCInst #{{[0-9]+}} JIC
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker  ret void
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine i8 @ret_i8() {
39*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i8:
40*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       addiu $2, $zero, 3
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
43*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker  ret i8 3
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i16 @ret_i16_3() {
49*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i16_3:
50*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       addiu $2, $zero, 3
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
53*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker  ret i16 3
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workerdefine i16 @ret_i16_256() {
59*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i16_256:
60*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       addiu $2, $zero, 256
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
63*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker  ret i16 256
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i16 @ret_i16_257() {
69*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i16_257:
70*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       addiu $2, $zero, 257
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
73*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker  ret i16 257
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine i32 @ret_i32_257() {
79*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i32_257:
80*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       addiu $2, $zero, 257
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
83*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker  ret i32 257
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine i32 @ret_i32_65536() {
89*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i32_65536:
90*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       lui $2, 1
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
93*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker  ret i32 65536
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine i32 @ret_i32_65537() {
99*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i32_65537:
100*9880d681SAndroid Build Coastguard Worker; ALL:           lui $[[T0:[0-9]+]], 1
101*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ori $2, $[[T0]], 1
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
104*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker  ret i32 65537
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine i64 @ret_i64_65537() {
110*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i64_65537:
111*9880d681SAndroid Build Coastguard Worker; ALL:           lui $[[T0:[0-9]+]], 1
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     ori $3, $[[T0]], 1
114*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     addiu $2, $zero, 0
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     daddiu $2, $[[T0]], 1
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
119*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  ret i64 65537
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerdefine i64 @ret_i64_281479271677952() {
125*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i64_281479271677952:
126*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       lui $[[T0:[0-9]+]], 1
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     ori $2, $[[T0]], 1
129*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     addiu $3, $zero, 0
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     daddiu $[[T1:[0-9]+]], $[[T0]], 1
132*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     dsll $2, $[[T1]], 32
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
135*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker  ret i64 281479271677952
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine i64 @ret_i64_281479271809026() {
141*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_i64_281479271809026:
142*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     lui $[[T0:[0-9]+]], 1
143*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     lui $[[T1:[0-9]+]], 2
144*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     ori $2, $[[T0]], 1
145*9880d681SAndroid Build Coastguard Worker; GPR32-DAG:     ori $3, $[[T1]], 2
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     ori  $[[T0:[0-9]+]], $zero, 32769
148*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     dsll $[[T1:[0-9]+]], $[[T0]], 16
149*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     daddiu $[[T0:[0-9]+]], $[[T0]], -32767
150*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     dsll $[[T1:[0-9]+]], $[[T0]], 17
151*9880d681SAndroid Build Coastguard Worker; GPR64-DAG:     daddiu $2, $[[T1]], 2
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
154*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker  ret i64 281479271809026
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefine float @ret_float_0x0() {
160*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_float_0x0:
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; NO-MTHC1-DAG:  mtc1 $zero, $f0
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; MTHC1-DAG:     mtc1 $zero, $f0
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; DMTC-DAG:      dmtc1 $zero, $f0
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
169*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker  ret float 0x0000000000000000
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerdefine float @ret_float_0x3() {
175*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_float_0x3:
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; Use a constant pool
178*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lwc1 $f0, %lo($CPI
179*9880d681SAndroid Build Coastguard Worker; N64-DAG:       lwc1 $f0, %got_ofst($CPI
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
182*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
183*9880d681SAndroid Build Coastguard Worker; R6C-DAG:       jrc $ra # <MCInst #{{[0-9]+}} JIC
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker; float constants are written as double constants
186*9880d681SAndroid Build Coastguard Worker  ret float 0x36b8000000000000
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdefine double @ret_double_0x0() {
190*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_double_0x0:
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; NO-MTHC1-DAG:  mtc1 $zero, $f0
193*9880d681SAndroid Build Coastguard Worker; NO-MTHC1-DAG:  mtc1 $zero, $f1
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; MTHC1-DAG:     mtc1 $zero, $f0
196*9880d681SAndroid Build Coastguard Worker; MTHC1-DAG:     mthc1 $zero, $f0
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker; DMTC-DAG:      dmtc1 $zero, $f0
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
201*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
202*9880d681SAndroid Build Coastguard Worker; R6C-DAG:       jrc $ra # <MCInst #{{[0-9]+}} JIC
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker  ret double 0x0000000000000000
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine double @ret_double_0x3() {
208*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: ret_double_0x3:
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; Use a constant pool
211*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ldc1 $f0, %lo($CPI
212*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ldc1 $f0, %got_ofst($CPI
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker; NOT-R6-DAG:    jr $ra # <MCInst #{{[0-9]+}} JR
215*9880d681SAndroid Build Coastguard Worker; R6-DAG:        jr $ra # <MCInst #{{[0-9]+}} JALR
216*9880d681SAndroid Build Coastguard Worker; R6C-DAG:       jrc $ra # <MCInst #{{[0-9]+}} JIC
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker  ret double 0x0000000000000003
219*9880d681SAndroid Build Coastguard Worker}
220