Oliver Stannard | d55e115 | 2014-03-05 15:25:27 +0000 | [diff] [blame^] | 1 | ; RUN: llc -mtriple=arm-linux-gnueabihf < %s | FileCheck %s |
| 2 | |
| 3 | %struct4bytes = type { i32 } |
| 4 | %struct8bytes8align = type { i64 } |
| 5 | %struct12bytes = type { i32, i32, i32 } |
| 6 | |
| 7 | declare void @useIntPtr(%struct4bytes*) |
| 8 | declare void @useLong(i64) |
| 9 | declare void @usePtr(%struct8bytes8align*) |
| 10 | |
| 11 | ; a -> r0 |
| 12 | ; b -> r1..r3 |
| 13 | ; c -> sp+0..sp+7 |
| 14 | define void @foo1(i32 %a, %struct12bytes* byval %b, i64 %c) { |
| 15 | ; CHECK-LABEL: foo1 |
| 16 | ; CHECK: sub sp, sp, #16 |
| 17 | ; CHECK: push {r11, lr} |
| 18 | ; CHECK: add [[SCRATCH:r[0-9]+]], sp, #12 |
| 19 | ; CHECK: stm [[SCRATCH]], {r1, r2, r3} |
| 20 | ; CHECK: ldr r0, [sp, #24] |
| 21 | ; CHECK: ldr r1, [sp, #28] |
| 22 | ; CHECK: bl useLong |
| 23 | ; CHECK: pop {r11, lr} |
| 24 | ; CHECK: add sp, sp, #16 |
| 25 | |
| 26 | tail call void @useLong(i64 %c) |
| 27 | ret void |
| 28 | } |
| 29 | |
| 30 | ; a -> r0 |
| 31 | ; b -> r2..r3 |
| 32 | define void @foo2(i32 %a, %struct8bytes8align* byval %b) { |
| 33 | ; CHECK-LABEL: foo2 |
| 34 | ; CHECK: sub sp, sp, #8 |
| 35 | ; CHECK: push {r11, lr} |
| 36 | ; CHECK: add r0, sp, #8 |
| 37 | ; CHECK: str r3, [sp, #12] |
| 38 | ; CHECK: str r2, [sp, #8] |
| 39 | ; CHECK: bl usePtr |
| 40 | ; CHECK: pop {r11, lr} |
| 41 | ; CHECK: add sp, sp, #8 |
| 42 | |
| 43 | tail call void @usePtr(%struct8bytes8align* %b) |
| 44 | ret void |
| 45 | } |
| 46 | |
| 47 | ; a -> r0..r1 |
| 48 | ; b -> r2 |
| 49 | define void @foo3(%struct8bytes8align* byval %a, %struct4bytes* byval %b) { |
| 50 | ; CHECK-LABEL: foo3 |
| 51 | ; CHECK: sub sp, sp, #16 |
| 52 | ; CHECK: push {r11, lr} |
| 53 | ; CHECK: add [[SCRATCH:r[0-9]+]], sp, #8 |
| 54 | ; CHECK: stm [[SCRATCH]], {r0, r1, r2} |
| 55 | ; CHECK: add r0, sp, #8 |
| 56 | ; CHECK: bl usePtr |
| 57 | ; CHECK: pop {r11, lr} |
| 58 | ; CHECK: add sp, sp, #16 |
| 59 | |
| 60 | tail call void @usePtr(%struct8bytes8align* %a) |
| 61 | ret void |
| 62 | } |
| 63 | |
| 64 | ; a -> r0 |
| 65 | ; b -> r2..r3 |
| 66 | define void @foo4(%struct4bytes* byval %a, %struct8bytes8align* byval %b) { |
| 67 | ; CHECK-LABEL: foo4 |
| 68 | ; CHECK: sub sp, sp, #16 |
| 69 | ; CHECK: push {r11, lr} |
| 70 | ; CHECK: str r0, [sp, #8] |
| 71 | ; CHECK: add r0, sp, #16 |
| 72 | ; CHECK: str r3, [sp, #20] |
| 73 | ; CHECK: str r2, [sp, #16] |
| 74 | ; CHECK: bl usePtr |
| 75 | ; CHECK: pop {r11, lr} |
| 76 | ; CHECK: add sp, sp, #16 |
| 77 | ; CHECK: mov pc, lr |
| 78 | |
| 79 | tail call void @usePtr(%struct8bytes8align* %b) |
| 80 | ret void |
| 81 | } |
| 82 | |
| 83 | ; a -> r0..r1 |
| 84 | ; b -> r2 |
| 85 | ; c -> r3 |
| 86 | define void @foo5(%struct8bytes8align* byval %a, %struct4bytes* byval %b, %struct4bytes* byval %c) { |
| 87 | ; CHECK-LABEL: foo5 |
| 88 | ; CHECK: sub sp, sp, #16 |
| 89 | ; CHECK: push {r11, lr} |
| 90 | ; CHECK: add [[SCRATCH:r[0-9]+]], sp, #8 |
| 91 | ; CHECK: stm [[SCRATCH]], {r0, r1, r2, r3} |
| 92 | ; CHECK: add r0, sp, #8 |
| 93 | ; CHECK: bl usePtr |
| 94 | ; CHECK: pop {r11, lr} |
| 95 | ; CHECK: add sp, sp, #16 |
| 96 | ; CHECK: mov pc, lr |
| 97 | |
| 98 | tail call void @usePtr(%struct8bytes8align* %a) |
| 99 | ret void |
| 100 | } |
| 101 | |
| 102 | ; a..c -> r0..r2 |
| 103 | ; d -> sp+0..sp+7 |
| 104 | define void @foo6(i32 %a, i32 %b, i32 %c, %struct8bytes8align* byval %d) { |
| 105 | ; CHECK-LABEL: foo6 |
| 106 | ; CHECK: push {r11, lr} |
| 107 | ; CHECK: add r0, sp, #8 |
| 108 | ; CHECK: bl usePtr |
| 109 | ; CHECK: pop {r11, lr} |
| 110 | ; CHECK: mov pc, lr |
| 111 | |
| 112 | tail call void @usePtr(%struct8bytes8align* %d) |
| 113 | ret void |
| 114 | } |