1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=mips32r2 -march=mipsel -relocation-model=static -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @isr_sw0() #0 { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_sw0: 5*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 6*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, [[R1:[0-9]+]]($sp) 7*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 8*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, [[R2:[0-9]+]]($sp) 9*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 1 10*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 11*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 12*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 13*9880d681SAndroid Build Coastguard Worker ; Must save all registers 14*9880d681SAndroid Build Coastguard Worker; CHECK: sw $7, {{[0-9]+}}($sp) 15*9880d681SAndroid Build Coastguard Worker; CHECK: sw $6, {{[0-9]+}}($sp) 16*9880d681SAndroid Build Coastguard Worker; CHECK: sw $5, {{[0-9]+}}($sp) 17*9880d681SAndroid Build Coastguard Worker; CHECK: sw $4, {{[0-9]+}}($sp) 18*9880d681SAndroid Build Coastguard Worker; CHECK: sw $3, {{[0-9]+}}($sp) 19*9880d681SAndroid Build Coastguard Worker; CHECK: sw $2, {{[0-9]+}}($sp) 20*9880d681SAndroid Build Coastguard Worker; CHECK: sw $25, {{[0-9]+}}($sp) 21*9880d681SAndroid Build Coastguard Worker; CHECK: sw $24, {{[0-9]+}}($sp) 22*9880d681SAndroid Build Coastguard Worker; CHECK: sw $15, {{[0-9]+}}($sp) 23*9880d681SAndroid Build Coastguard Worker; CHECK: sw $14, {{[0-9]+}}($sp) 24*9880d681SAndroid Build Coastguard Worker; CHECK: sw $13, {{[0-9]+}}($sp) 25*9880d681SAndroid Build Coastguard Worker; CHECK: sw $12, {{[0-9]+}}($sp) 26*9880d681SAndroid Build Coastguard Worker; CHECK: sw $11, {{[0-9]+}}($sp) 27*9880d681SAndroid Build Coastguard Worker; CHECK: sw $10, {{[0-9]+}}($sp) 28*9880d681SAndroid Build Coastguard Worker; CHECK: sw $9, {{[0-9]+}}($sp) 29*9880d681SAndroid Build Coastguard Worker; CHECK: sw $8, {{[0-9]+}}($sp) 30*9880d681SAndroid Build Coastguard Worker; CHECK: sw $ra, [[R5:[0-9]+]]($sp) 31*9880d681SAndroid Build Coastguard Worker; CHECK: sw $gp, {{[0-9]+}}($sp) 32*9880d681SAndroid Build Coastguard Worker; CHECK: sw $1, {{[0-9]+}}($sp) 33*9880d681SAndroid Build Coastguard Worker; CHECK: mflo $26 34*9880d681SAndroid Build Coastguard Worker; CHECK: sw $26, [[R3:[0-9]+]]($sp) 35*9880d681SAndroid Build Coastguard Worker; CHECK: mfhi $26 36*9880d681SAndroid Build Coastguard Worker; CHECK: sw $26, [[R4:[0-9]+]]($sp) 37*9880d681SAndroid Build Coastguard Worker call void bitcast (void (...)* @write to void ()*)() 38*9880d681SAndroid Build Coastguard Worker; CHECK: lw $26, [[R4:[0-9]+]]($sp) 39*9880d681SAndroid Build Coastguard Worker; CHECK: mthi $26 40*9880d681SAndroid Build Coastguard Worker; CHECK: lw $26, [[R3:[0-9]+]]($sp) 41*9880d681SAndroid Build Coastguard Worker; CHECK: mtlo $26 42*9880d681SAndroid Build Coastguard Worker; CHECK: lw $1, {{[0-9]+}}($sp) 43*9880d681SAndroid Build Coastguard Worker; CHECK: lw $gp, {{[0-9]+}}($sp) 44*9880d681SAndroid Build Coastguard Worker; CHECK: lw $ra, [[R5:[0-9]+]]($sp) 45*9880d681SAndroid Build Coastguard Worker; CHECK: lw $8, {{[0-9]+}}($sp) 46*9880d681SAndroid Build Coastguard Worker; CHECK: lw $9, {{[0-9]+}}($sp) 47*9880d681SAndroid Build Coastguard Worker; CHECK: lw $10, {{[0-9]+}}($sp) 48*9880d681SAndroid Build Coastguard Worker; CHECK: lw $11, {{[0-9]+}}($sp) 49*9880d681SAndroid Build Coastguard Worker; CHECK: lw $12, {{[0-9]+}}($sp) 50*9880d681SAndroid Build Coastguard Worker; CHECK: lw $13, {{[0-9]+}}($sp) 51*9880d681SAndroid Build Coastguard Worker; CHECK: lw $14, {{[0-9]+}}($sp) 52*9880d681SAndroid Build Coastguard Worker; CHECK: lw $15, {{[0-9]+}}($sp) 53*9880d681SAndroid Build Coastguard Worker; CHECK: lw $24, {{[0-9]+}}($sp) 54*9880d681SAndroid Build Coastguard Worker; CHECK: lw $25, {{[0-9]+}}($sp) 55*9880d681SAndroid Build Coastguard Worker; CHECK: lw $2, {{[0-9]+}}($sp) 56*9880d681SAndroid Build Coastguard Worker; CHECK: lw $3, {{[0-9]+}}($sp) 57*9880d681SAndroid Build Coastguard Worker; CHECK: lw $4, {{[0-9]+}}($sp) 58*9880d681SAndroid Build Coastguard Worker; CHECK: lw $5, {{[0-9]+}}($sp) 59*9880d681SAndroid Build Coastguard Worker; CHECK: lw $6, {{[0-9]+}}($sp) 60*9880d681SAndroid Build Coastguard Worker; CHECK: lw $7, {{[0-9]+}}($sp) 61*9880d681SAndroid Build Coastguard Worker; CHECK: di 62*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 63*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, [[R2:[0-9]+]]($sp) 64*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 65*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, [[R1:[0-9]+]]($sp) 66*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 67*9880d681SAndroid Build Coastguard Worker; CHECK: eret 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdeclare void @write(...) 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine void @isr_sw1() #2 { 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_sw1: 75*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 76*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 77*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 78*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 79*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 2 80*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 81*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 82*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker; CHECK: di 85*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 86*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 87*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 88*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 89*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 90*9880d681SAndroid Build Coastguard Worker; CHECK: eret 91*9880d681SAndroid Build Coastguard Worker } 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine void @isr_hw0() #3 { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_hw0: 95*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 96*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 97*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 98*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 99*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 3 100*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 101*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 102*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker; CHECK: di 105*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 106*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 107*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 108*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 109*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 110*9880d681SAndroid Build Coastguard Worker; CHECK: eret 111*9880d681SAndroid Build Coastguard Worker } 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine void @isr_hw1() #4 { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_hw1: 115*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 116*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 117*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 118*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 119*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 4 120*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 121*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 122*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 123*9880d681SAndroid Build Coastguard Worker ret void 124*9880d681SAndroid Build Coastguard Worker; CHECK: di 125*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 126*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 127*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 128*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 129*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 130*9880d681SAndroid Build Coastguard Worker; CHECK: eret 131*9880d681SAndroid Build Coastguard Worker } 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine void @isr_hw2() #5 { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_hw2: 136*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 137*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 138*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 139*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 140*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 5 141*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 142*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 143*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 144*9880d681SAndroid Build Coastguard Worker ret void 145*9880d681SAndroid Build Coastguard Worker; CHECK: di 146*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 147*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 148*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 149*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 150*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 151*9880d681SAndroid Build Coastguard Worker; CHECK: eret 152*9880d681SAndroid Build Coastguard Worker } 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdefine void @isr_hw3() #6 { 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_hw3: 156*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 157*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 158*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 159*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 160*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 6 161*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 162*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 163*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 164*9880d681SAndroid Build Coastguard Worker ret void 165*9880d681SAndroid Build Coastguard Worker; CHECK: di 166*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 167*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 168*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 169*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 170*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 171*9880d681SAndroid Build Coastguard Worker; CHECK: eret 172*9880d681SAndroid Build Coastguard Worker } 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workerdefine void @isr_hw4() #7 { 175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_hw4: 176*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 177*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 178*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 179*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 180*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 7 181*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 182*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 183*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 184*9880d681SAndroid Build Coastguard Worker ret void 185*9880d681SAndroid Build Coastguard Worker; CHECK: di 186*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 187*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 188*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 189*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 190*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 191*9880d681SAndroid Build Coastguard Worker; CHECK: eret 192*9880d681SAndroid Build Coastguard Worker } 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine void @isr_hw5() #8 { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_hw5: 196*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 197*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 198*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 199*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 200*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 8, 8 201*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 202*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 203*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 204*9880d681SAndroid Build Coastguard Worker ret void 205*9880d681SAndroid Build Coastguard Worker; CHECK: di 206*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 207*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 208*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 209*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 210*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 211*9880d681SAndroid Build Coastguard Worker; CHECK: eret 212*9880d681SAndroid Build Coastguard Worker } 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdefine void @isr_eic() #9 { 215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: isr_eic: 216*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $26, $13, 0 217*9880d681SAndroid Build Coastguard Worker; CHECK: ext $26, $26, 10, 6 218*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $14, 0 219*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 220*9880d681SAndroid Build Coastguard Worker; CHECK: mfc0 $27, $12, 0 221*9880d681SAndroid Build Coastguard Worker; CHECK: sw $27, {{[0-9]+}}($sp) 222*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $26, 10, 6 223*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 1, 4 224*9880d681SAndroid Build Coastguard Worker; CHECK: ins $27, $zero, 29, 1 225*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 226*9880d681SAndroid Build Coastguard Worker ret void 227*9880d681SAndroid Build Coastguard Worker; CHECK: di 228*9880d681SAndroid Build Coastguard Worker; CHECK: ehb 229*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 230*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $14, 0 231*9880d681SAndroid Build Coastguard Worker; CHECK: lw $27, {{[0-9]+}}($sp) 232*9880d681SAndroid Build Coastguard Worker; CHECK: mtc0 $27, $12, 0 233*9880d681SAndroid Build Coastguard Worker; CHECK: eret 234*9880d681SAndroid Build Coastguard Worker } 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerattributes #0 = { "interrupt"="sw0" } 237*9880d681SAndroid Build Coastguard Workerattributes #2 = { "interrupt"="sw1" } 238*9880d681SAndroid Build Coastguard Workerattributes #3 = { "interrupt"="hw0" } 239*9880d681SAndroid Build Coastguard Workerattributes #4 = { "interrupt"="hw1" } 240*9880d681SAndroid Build Coastguard Workerattributes #5 = { "interrupt"="hw2" } 241*9880d681SAndroid Build Coastguard Workerattributes #6 = { "interrupt"="hw3" } 242*9880d681SAndroid Build Coastguard Workerattributes #7 = { "interrupt"="hw4" } 243*9880d681SAndroid Build Coastguard Workerattributes #8 = { "interrupt"="hw5" } 244*9880d681SAndroid Build Coastguard Workerattributes #9 = { "interrupt"="eic" } 245