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