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