| 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 | } |