1 ; Test all important variants of the 'ret' instruction.
3 ; For non-void returns it is necessary to have something to return so we also
4 ; test constant generation here.
6 ; We'll test pointer returns in a separate file since the relocation model
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
15 define void @ret_void() {
16 ; ALL-LABEL: ret_void:
24 ; ALL-DAG: addiu $2, $zero, 3
28 define i16 @ret_i16_3() {
29 ; ALL-LABEL: ret_i16_3:
31 ; ALL-DAG: addiu $2, $zero, 3
35 define i16 @ret_i16_256() {
36 ; ALL-LABEL: ret_i16_256:
38 ; ALL-DAG: addiu $2, $zero, 256
42 define i16 @ret_i16_257() {
43 ; ALL-LABEL: ret_i16_257:
45 ; ALL-DAG: addiu $2, $zero, 257
49 define i32 @ret_i32_257() {
50 ; ALL-LABEL: ret_i32_257:
52 ; ALL-DAG: addiu $2, $zero, 257
56 define i32 @ret_i32_65536() {
57 ; ALL-LABEL: ret_i32_65536:
63 define i32 @ret_i32_65537() {
64 ; ALL-LABEL: ret_i32_65537:
65 ; ALL: lui $[[T0:[0-9]+]], 1
67 ; ALL-DAG: ori $2, $[[T0]], 1
71 define i64 @ret_i64_65537() {
72 ; ALL-LABEL: ret_i64_65537:
73 ; ALL: lui $[[T0:[0-9]+]], 1
75 ; GPR32-DAG: ori $3, $[[T0]], 1
76 ; GPR32-DAG: addiu $2, $zero, 0
78 ; GPR64-DAG: daddiu $2, $[[T0]], 1
84 define i64 @ret_i64_281479271677952() {
85 ; ALL-LABEL: ret_i64_281479271677952:
86 ; ALL-DAG: lui $[[T0:[0-9]+]], 1
88 ; GPR32-DAG: ori $2, $[[T0]], 1
89 ; GPR32-DAG: addiu $3, $zero, 0
91 ; GPR64-DAG: daddiu $[[T1:[0-9]+]], $[[T0]], 1
92 ; GPR64-DAG: dsll $2, $[[T1]], 32
95 ret i64 281479271677952
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
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
112 ret i64 281479271809026
116 define float @ret_float_0x0() {
117 ; ALL-LABEL: ret_float_0x0:
119 ; NO-MTHC1-DAG: mtc1 $zero, $f0
121 ; MTHC1-DAG: mtc1 $zero, $f0
123 ; DMTC-DAG: dmtc1 $zero, $f0
126 ret float 0x0000000000000000
129 define float @ret_float_0x3() {
130 ; ALL-LABEL: ret_float_0x3:
132 ; Use a constant pool
133 ; O32-DAG: lwc1 $f0, %lo($CPI
134 ; N64-DAG: lwc1 $f0, %got_ofst($CPI
138 ; float constants are written as double constants
139 ret float 0x36b8000000000000
142 define double @ret_double_0x0() {
143 ; ALL-LABEL: ret_double_0x0:
145 ; NO-MTHC1-DAG: mtc1 $zero, $f0
146 ; NO-MTHC1-DAG: mtc1 $zero, $f1
148 ; MTHC1-DAG: mtc1 $zero, $f0
149 ; MTHC1-DAG: mthc1 $zero, $f0
151 ; DMTC-DAG: dmtc1 $zero, $f0
154 ret double 0x0000000000000000
157 define double @ret_double_0x3() {
158 ; ALL-LABEL: ret_double_0x3:
160 ; Use a constant pool
161 ; O32-DAG: ldc1 $f0, %lo($CPI
162 ; N64-DAG: ldc1 $f0, %got_ofst($CPI
165 ret double 0x0000000000000003