1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips < %s | FileCheck --check-prefixes=ALL,O32 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel < %s | FileCheck --check-prefixes=ALL,O32 %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips < %s | FileCheck --check-prefixes=ALL,O32-INV %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel < %s | FileCheck --check-prefixes=ALL,O32-INV %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s 7*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64el -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s 8*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32-INV %s 9*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64el -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32-INV %s 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32 %s 12*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32 %s 13*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32-INV %s 14*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32-INV %s 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64 %s 17*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64 %s 18*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64-INV %s 19*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64-INV %s 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Test the callee-saved registers are callee-saved as specified by section 22*9880d681SAndroid Build Coastguard Worker; 2 of the MIPSpro N32 Handbook and section 3 of the SYSV ABI spec. 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine void @gpr_clobber() nounwind { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker ; Clobbering the stack pointer is a bad idea so we'll skip that one 27*9880d681SAndroid Build Coastguard Worker call void asm "# Clobber", "~{$0},~{$1},~{$2},~{$3},~{$4},~{$5},~{$6},~{$7},~{$8},~{$9},~{$10},~{$11},~{$12},~{$13},~{$14},~{$15},~{$16},~{$17},~{$18},~{$19},~{$20},~{$21},~{$22},~{$23},~{$24},~{$25},~{$26},~{$27},~{$28},~{$30},~{$31}"() 28*9880d681SAndroid Build Coastguard Worker ret void 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: gpr_clobber: 32*9880d681SAndroid Build Coastguard Worker; O32: addiu $sp, $sp, -40 33*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $0, 34*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $1, 35*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $2, 36*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $3, 37*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $4, 38*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $5, 39*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $6, 40*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $7, 41*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $8, 42*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $9, 43*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $10, 44*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $11, 45*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $12, 46*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $13, 47*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $14, 48*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $15, 49*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G16:\$16]], [[OFF16:[0-9]+]]($sp) 50*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G17:\$17]], [[OFF17:[0-9]+]]($sp) 51*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G18:\$18]], [[OFF18:[0-9]+]]($sp) 52*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G19:\$19]], [[OFF19:[0-9]+]]($sp) 53*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G20:\$20]], [[OFF20:[0-9]+]]($sp) 54*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G21:\$21]], [[OFF21:[0-9]+]]($sp) 55*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G22:\$22]], [[OFF22:[0-9]+]]($sp) 56*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G23:\$23]], [[OFF23:[0-9]+]]($sp) 57*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $24, 58*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $25, 59*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $26, 60*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $27, 61*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $28, 62*9880d681SAndroid Build Coastguard Worker; O32-INV-NOT: sw $29, 63*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) 64*9880d681SAndroid Build Coastguard Worker; O32-DAG: sw [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) 65*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G16]], [[OFF16]]($sp) 66*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G17]], [[OFF17]]($sp) 67*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G18]], [[OFF18]]($sp) 68*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G19]], [[OFF19]]($sp) 69*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G20]], [[OFF20]]($sp) 70*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G21]], [[OFF21]]($sp) 71*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G22]], [[OFF22]]($sp) 72*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G23]], [[OFF23]]($sp) 73*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G30]], [[OFF30]]($sp) 74*9880d681SAndroid Build Coastguard Worker; O32-DAG: lw [[G31]], [[OFF31]]($sp) 75*9880d681SAndroid Build Coastguard Worker; O32: addiu $sp, $sp, 40 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; N32: addiu $sp, $sp, -96 78*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $0, 79*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $1, 80*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $2, 81*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $3, 82*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $4, 83*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $5, 84*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $6, 85*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $7, 86*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $8, 87*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $9, 88*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $10, 89*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $11, 90*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $12, 91*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $13, 92*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $14, 93*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $15, 94*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G16:\$16]], [[OFF16:[0-9]+]]($sp) 95*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G17:\$17]], [[OFF17:[0-9]+]]($sp) 96*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G18:\$18]], [[OFF18:[0-9]+]]($sp) 97*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G19:\$19]], [[OFF19:[0-9]+]]($sp) 98*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G20:\$20]], [[OFF20:[0-9]+]]($sp) 99*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G21:\$21]], [[OFF21:[0-9]+]]($sp) 100*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G22:\$22]], [[OFF22:[0-9]+]]($sp) 101*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G23:\$23]], [[OFF23:[0-9]+]]($sp) 102*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $24, 103*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $25, 104*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $26, 105*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $27, 106*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G28:\$gp]], [[OFF28:[0-9]+]]($sp) 107*9880d681SAndroid Build Coastguard Worker; N32-INV-NOT: sd $29, 108*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) 109*9880d681SAndroid Build Coastguard Worker; N32-DAG: sd [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) 110*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G16]], [[OFF16]]($sp) 111*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G17]], [[OFF17]]($sp) 112*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G18]], [[OFF18]]($sp) 113*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G19]], [[OFF19]]($sp) 114*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G20]], [[OFF20]]($sp) 115*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G21]], [[OFF21]]($sp) 116*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G22]], [[OFF22]]($sp) 117*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G23]], [[OFF23]]($sp) 118*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G28]], [[OFF28]]($sp) 119*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G30]], [[OFF30]]($sp) 120*9880d681SAndroid Build Coastguard Worker; N32-DAG: ld [[G31]], [[OFF31]]($sp) 121*9880d681SAndroid Build Coastguard Worker; N32: addiu $sp, $sp, 96 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; N64: daddiu $sp, $sp, -96 124*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $0, 125*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $1, 126*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $2, 127*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $3, 128*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $4, 129*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $5, 130*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $6, 131*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $7, 132*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $8, 133*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $9, 134*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $10, 135*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $11, 136*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $12, 137*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $13, 138*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $14, 139*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $15, 140*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G16:\$16]], [[OFF16:[0-9]+]]($sp) 141*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G17:\$17]], [[OFF17:[0-9]+]]($sp) 142*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G18:\$18]], [[OFF18:[0-9]+]]($sp) 143*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G19:\$19]], [[OFF19:[0-9]+]]($sp) 144*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G20:\$20]], [[OFF20:[0-9]+]]($sp) 145*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G21:\$21]], [[OFF21:[0-9]+]]($sp) 146*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G22:\$22]], [[OFF22:[0-9]+]]($sp) 147*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G23:\$23]], [[OFF23:[0-9]+]]($sp) 148*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G30:\$fp]], [[OFF30:[0-9]+]]($sp) 149*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G31:\$fp]], [[OFF31:[0-9]+]]($sp) 150*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $24, 151*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $25, 152*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $26, 153*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $27, 154*9880d681SAndroid Build Coastguard Worker; N64-DAG: sd [[G28:\$gp]], [[OFF28:[0-9]+]]($sp) 155*9880d681SAndroid Build Coastguard Worker; N64-INV-NOT: sd $29, 156*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G16]], [[OFF16]]($sp) 157*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G17]], [[OFF17]]($sp) 158*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G18]], [[OFF18]]($sp) 159*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G19]], [[OFF19]]($sp) 160*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G20]], [[OFF20]]($sp) 161*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G21]], [[OFF21]]($sp) 162*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G22]], [[OFF22]]($sp) 163*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G23]], [[OFF23]]($sp) 164*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G28]], [[OFF28]]($sp) 165*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G30]], [[OFF30]]($sp) 166*9880d681SAndroid Build Coastguard Worker; N64-DAG: ld [[G31]], [[OFF31]]($sp) 167*9880d681SAndroid Build Coastguard Worker; N64: daddiu $sp, $sp, 96 168