304 lines · plain
1; RUN: llc -mtriple=arm-ti-none-eabihf -mcpu=cortex-a15 -o - %s | FileCheck --check-prefix=CHECK-A %s2; RUN: llc -mtriple=thumb-ti-none-eabihf -mcpu=cortex-a15 -o - %s | FileCheck --check-prefix=CHECK-A-THUMB %s3; RUN: llc -mtriple=thumb-ti-none-eabihf -mcpu=cortex-m4 -o - %s | FileCheck --check-prefix=CHECK-M %s4; RUN: llc -mtriple=thumbv7em-ti-none-eabihf -mcpu=cortex-m4 -o - %s | FileCheck --check-prefix=CHECK-M %s5; RUN: llc -mtriple=thumbv7r5-ti-none-eabihf -mcpu=cortex-r5 -o - %s | FileCheck --check-prefix=CHECK-R-THUMB %s6; RUN: llc -mtriple=armv7r5-ti-none-eabihf -mcpu=cortex-r5 -o - %s | FileCheck --check-prefix=CHECK-R %s7 8declare arm_aapcscc void @bar()9 10@bigvar = global [16 x i32] zeroinitializer11 12define arm_aapcscc void @irq_fn() alignstack(8) "interrupt"="IRQ" "save-fp"{13 ; Must save all registers except banked sp and lr (we save lr anyway because14 ; we actually need it at the end to execute the return ourselves).15 16 ; Also need special function return setting pc and CPSR simultaneously.17 ; CHECK-A-LABEL: irq_fn:18 ; CHECK-A: push {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}19 ; CHECK-A: add r11, sp, #2820 ; CHECK-A: vpush {d0, d1, d2, d3, d4, d5, d6, d7}21 ; CHECK-A: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}22 ; [...]23 ; CHECK-A: sub sp, r11, #22824 ; CHECK-A: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}25 ; CHECK-A: vpop {d0, d1, d2, d3, d4, d5, d6, d7}26 ; CHECK-A: pop {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}27 ; CHECK-A-LABEL: .Lfunc_end028 29 ; CHECK-A-THUMB-LABEL: irq_fn:30 ; CHECK-A-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}31 ; CHECK-A-THUMB: add r7, sp, #2832 ; CHECK-A-THUMB: vpush {d0, d1, d2, d3, d4, d5, d6, d7}33 ; CHECK-A-THUMB: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}34 ; [...]35 ; CHECK-A-THUMB: sub.w r4, r7, #22836 ; CHECK-A-THUMB: mov sp, r437 ; CHECK-A-THUMB: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}38 ; CHECK-A-THUMB: vpop {d0, d1, d2, d3, d4, d5, d6, d7}39 ; CHECK-A-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}40 ; CHECK-A-THUMB-LABEL: .Lfunc_end041 42 ; CHECK-R-LABEL: irq_fn:43 ; CHECK-R: push {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}44 ; CHECK-R: add r11, sp, #2845 ; CHECK-R: vpush {d0, d1, d2, d3, d4, d5, d6, d7}46 ; [...]47 ; CHECK-R: sub sp, r11, #10048 ; CHECK-R: vpop {d0, d1, d2, d3, d4, d5, d6, d7}49 ; CHECK-R: pop {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}50 ; CHECK-R-LABEL: .Lfunc_end051 52 ; CHECK-R-THUMB-LABEL: irq_fn:53 ; CHECK-R-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}54 ; CHECK-R-THUMB: add r7, sp, #2855 ; CHECK-R-THUMB: vpush {d0, d1, d2, d3, d4, d5, d6, d7}56 ; [...]57 ; CHECK-R-THUMB: sub.w r4, r7, #10058 ; CHECK-R-THUMB: mov sp, r459 ; CHECK-R-THUMB: vpop {d0, d1, d2, d3, d4, d5, d6, d7}60 ; CHECK-R-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}61 ; CHECK-R-THUMB-LABEL: .Lfunc_end062 63 ; Normal AAPCS function (r0-r3 pushed onto stack by hardware, lr set to64 ; appropriate sentinel so no special return needed).65 ; CHECK-M-LABEL: irq_fn:66 ; CHECK-M: push {r4, r6, r7, lr}67 ; CHECK-M: add r7, sp, #868 ; CHECK-M: vpush {d0, d1, d2, d3, d4, d5, d6, d7}69 ; [...]70 ; CHECK-M: sub.w r4, r7, #8071 ; CHECK-M: mov sp, r472 ; CHECK-M: vpop {d0, d1, d2, d3, d4, d5, d6, d7}73 ; CHECK-M: pop {r4, r6, r7, pc}74 ; CHECK-M-LABEL: .Lfunc_end075 76 call arm_aapcscc void @bar()77 ret void78}79 80; We don't push/pop r12, as it is banked for FIQ81define arm_aapcscc void @fiq_fn() alignstack(8) "interrupt"="FIQ" "save-fp" {82 ; CHECK-A-LABEL: fiq_fn:83 ; CHECK-A: push {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}84 ; CHECK-A: add r11, sp, #3285 ; [...]86 ; CHECK-A: sub sp, r11, #4087 ; CHECK-A: pop {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}88 ; CHECK-A-LABEL: .Lfunc_end189 90 ; CHECK-A-THUMB-LABEL: fiq_fn:91 ; CHECK-A-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}92 ; CHECK-A-THUMB: add r7, sp, #2893 ; [...]94 ; CHECK-A-THUMB: sub.w r4, r7, #3695 ; CHECK-A-THUMB: mov sp, r496 ; CHECK-A-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}97 ; CHECK-A-THUMB-LABEL: .Lfunc_end198 99 ; CHECK-R-LABEL: fiq_fn:100 ; CHECK-R: push {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}101 ; CHECK-R: add r11, sp, #32102 ; [...]103 ; CHECK-R: sub sp, r11, #40104 ; CHECK-R: pop {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}105 ; CHECK-R-LABEL: .Lfunc_end1106 107 ; CHECK-R-THUMB-LABEL: fiq_fn:108 ; CHECK-R-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}109 ; CHECK-R-THUMB: add r7, sp, #28110 ; [...]111 ; CHECK-R-THUMB: sub.w r4, r7, #36112 ; CHECK-R-THUMB: mov sp, r4113 ; CHECK-R-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r11, lr}114 ; CHECK-R-THUMB-LABEL: .Lfunc_end1115 116 ; CHECK-M-LABEL: fiq_fn:117 ; CHECK-M: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}118 ; CHECK-M: add r7, sp, #12119 ; [...]120 ; CHECK-M: sub.w r4, r7, #16121 ; CHECK-M: mov sp, r4122 ; CHECK-M: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}123 ; CHECK-M-LABEL: .Lfunc_end1124 125 %val = load volatile [16 x i32], [16 x i32]* @bigvar126 store volatile [16 x i32] %val, [16 x i32]* @bigvar127 ret void128}129 130define arm_aapcscc void @swi_fn() alignstack(8) "interrupt"="SWI" "save-fp" {131 ; CHECK-A-LABEL: swi_fn:132 ; CHECK-A: push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}133 ; CHECK-A: add r11, sp, #44134 ; [...]135 ; CHECK-A: sub sp, r11, #52136 ; CHECK-A: pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}137 ; CHECK-A-LABEL: .Lfunc_end2138 139 ; CHECK-A-THUMB-LABEL: swi_fn:140 ; CHECK-A-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}141 ; CHECK-A-THUMB: add r7, sp, #28142 ; [...]143 ; CHECK-A-THUMB: sub.w r4, r7, #36144 ; CHECK-A-THUMB: mov sp, r4145 ; CHECK-A-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}146 ; CHECK-A-THUMB-LABEL: .Lfunc_end2147 148 ; CHECK-R-LABEL: swi_fn:149 ; CHECK-R: push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}150 ; CHECK-R: add r11, sp, #44151 ; [...]152 ; CHECK-R: sub sp, r11, #52153 ; CHECK-R: pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}154 ; CHECK-R-LABEL: .Lfunc_end2155 156 ; CHECK-R-THUMB-LABEL: swi_fn:157 ; CHECK-R-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}158 ; CHECK-R-THUMB: add r7, sp, #28159 ; [...]160 ; CHECK-R-THUMB: sub.w r4, r7, #36161 ; CHECK-R-THUMB: mov sp, r4162 ; CHECK-R-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}163 ; CHECK-R-THUMB-LABEL: .Lfunc_end2164 165 ; CHECK-M-LABEL: swi_fn:166 ; CHECK-M: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}167 ; CHECK-M: add r7, sp, #12168 ; [...]169 ; CHECK-M: sub.w r4, r7, #16170 ; CHECK-M: mov sp, r4171 ; CHECK-M: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}172 ; CHECK-M-LABEL: .Lfunc_end2173 174 %val = load volatile [16 x i32], [16 x i32]* @bigvar175 store volatile [16 x i32] %val, [16 x i32]* @bigvar176 ret void177}178 179define arm_aapcscc void @undef_fn() alignstack(8) "interrupt"="UNDEF" "save-fp" {180 ; CHECK-A-LABEL: undef_fn:181 ; CHECK-A: push {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}182 ; CHECK-A: add r11, sp, #28183 ; CHECK-A: vpush {d0, d1, d2, d3, d4, d5, d6, d7}184 ; CHECK-A: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}185 ; [...]186 ; CHECK-A: sub sp, r11, #228187 ; CHECK-A: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}188 ; CHECK-A: vpop {d0, d1, d2, d3, d4, d5, d6, d7}189 ; CHECK-A: pop {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}190 ; CHECK-A-LABEL: .Lfunc_end3191 192 ; CHECK-A-THUMB-LABEL: undef_fn:193 ; CHECK-A-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}194 ; CHECK-A-THUMB: add r7, sp, #28195 ; CHECK-A-THUMB: vpush {d0, d1, d2, d3, d4, d5, d6, d7}196 ; CHECK-A-THUMB: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}197 ; [...]198 ; CHECK-A-THUMB: sub.w r4, r7, #228199 ; CHECK-A-THUMB: mov sp, r4200 ; CHECK-A-THUMB: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}201 ; CHECK-A-THUMB: vpop {d0, d1, d2, d3, d4, d5, d6, d7}202 ; CHECK-A-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}203 ; CHECK-A-THUMB-LABEL: .Lfunc_end3204 205 ; CHECK-R-LABEL: undef_fn:206 ; CHECK-R: push {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}207 ; CHECK-R: add r11, sp, #28208 ; CHECK-R: vpush {d0, d1, d2, d3, d4, d5, d6, d7}209 ; [...]210 ; CHECK-R: sub sp, r11, #100211 ; CHECK-R: vpop {d0, d1, d2, d3, d4, d5, d6, d7}212 ; CHECK-R: pop {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}213 ; CHECK-R-LABEL: .Lfunc_end3214 215 ; CHECK-R-THUMB-LABEL: undef_fn:216 ; CHECK-R-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}217 ; CHECK-R-THUMB: add r7, sp, #28218 ; CHECK-R-THUMB: vpush {d0, d1, d2, d3, d4, d5, d6, d7}219 ; [...]220 ; CHECK-R-THUMB: sub.w r4, r7, #100221 ; CHECK-R-THUMB: mov sp, r4222 ; CHECK-R-THUMB: vpop {d0, d1, d2, d3, d4, d5, d6, d7}223 ; CHECK-R-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}224 ; CHECK-R-THUMB-LABEL: .Lfunc_end3225 226 ; CHECK-M-LABEL: undef_fn:227 ; CHECK-M: push {r4, r6, r7, lr}228 ; CHECK-M: add r7, sp, #8229 ; CHECK-M: vpush {d0, d1, d2, d3, d4, d5, d6, d7}230 ; [...]231 ; CHECK-M: sub.w r4, r7, #80232 ; CHECK-M: mov sp, r4233 ; CHECK-M: vpop {d0, d1, d2, d3, d4, d5, d6, d7}234 ; CHECK-M: pop {r4, r6, r7, pc}235 ; CHECK-M-LABEL: .Lfunc_end3236 237 call void @bar()238 ret void239}240 241define arm_aapcscc void @abort_fn() alignstack(8) "interrupt"="ABORT" "save-fp" {242 ; CHECK-A-LABEL: abort_fn:243 ; CHECK-A: push {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}244 ; CHECK-A: add r11, sp, #28245 ; CHECK-A: vpush {d0, d1, d2, d3, d4, d5, d6, d7}246 ; CHECK-A: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}247 ; [...]248 ; CHECK-A: sub sp, r11, #228249 ; CHECK-A: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}250 ; CHECK-A: vpop {d0, d1, d2, d3, d4, d5, d6, d7}251 ; CHECK-A: pop {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}252 ; CHECK-A-LABEL: .Lfunc_end4253 254 ; CHECK-A-THUMB-LABEL: abort_fn:255 ; CHECK-A-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}256 ; CHECK-A-THUMB: add r7, sp, #28257 ; CHECK-A-THUMB: vpush {d0, d1, d2, d3, d4, d5, d6, d7}258 ; CHECK-A-THUMB: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}259 ; [...]260 ; CHECK-A-THUMB: sub.w r4, r7, #228261 ; CHECK-A-THUMB: mov sp, r4262 ; CHECK-A-THUMB: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}263 ; CHECK-A-THUMB: vpop {d0, d1, d2, d3, d4, d5, d6, d7}264 ; CHECK-A-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}265 ; CHECK-A-THUMB-LABEL: .Lfunc_end4266 267 ; CHECK-R-LABEL: abort_fn:268 ; CHECK-R: push {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}269 ; CHECK-R: add r11, sp, #28270 ; CHECK-R: vpush {d0, d1, d2, d3, d4, d5, d6, d7}271 ; [...]272 ; CHECK-R: sub sp, r11, #100273 ; CHECK-R: vpop {d0, d1, d2, d3, d4, d5, d6, d7}274 ; CHECK-R: pop {r0, r1, r2, r3, r4, r5, r10, r11, r12, lr}275 ; CHECK-R-LABEL: .Lfunc_end4276 277 ; CHECK-R-THUMB-LABEL: abort_fn:278 ; CHECK-R-THUMB: push.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}279 ; CHECK-R-THUMB: add r7, sp, #28280 ; CHECK-R-THUMB: vpush {d0, d1, d2, d3, d4, d5, d6, d7}281 ; [...]282 ; CHECK-R-THUMB: sub.w r4, r7, #100283 ; CHECK-R-THUMB: mov sp, r4284 ; CHECK-R-THUMB: vpop {d0, d1, d2, d3, d4, d5, d6, d7}285 ; CHECK-R-THUMB: pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r12, lr}286 ; CHECK-R-THUMB-LABEL: .Lfunc_end4287 288 ; CHECK-M-LABEL: abort_fn:289 ; CHECK-M: push {r4, r6, r7, lr}290 ; CHECK-M: add r7, sp, #8291 ; CHECK-M: vpush {d0, d1, d2, d3, d4, d5, d6, d7}292 ; [...]293 ; CHECK-M: sub.w r4, r7, #80294 ; CHECK-M: mov sp, r4295 ; CHECK-M: vpop {d0, d1, d2, d3, d4, d5, d6, d7}296 ; CHECK-M: pop {r4, r6, r7, pc}297 ; CHECK-M-LABEL: .Lfunc_end4298 299 call void @bar()300 ret void301}302 303@var = global double 0.0304