Home | History | Annotate | Download | only in Thumb
      1 ; RUN: llc < %s -mtriple=thumb-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
      2 ; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux
      3 ; RUN: llc < %s -mtriple=thumb-linux-androideabi -filetype=obj
      4 ; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -filetype=obj
      5 
      6 
      7 ; Just to prevent the alloca from being optimized away
      8 declare void @dummy_use(i32*, i32)
      9 
     10 define void @test_basic() #0 {
     11         %mem = alloca i32, i32 10
     12         call void @dummy_use (i32* %mem, i32 10)
     13 	ret void
     14 
     15 ; Thumb-android:      test_basic:
     16 
     17 ; Thumb-android:      push    {r4, r5}
     18 ; Thumb-android-NEXT: mov     r5, sp
     19 ; Thumb-android-NEXT: ldr     r4, .LCPI0_0
     20 ; Thumb-android-NEXT: ldr     r4, [r4]
     21 ; Thumb-android-NEXT: cmp     r4, r5
     22 ; Thumb-android-NEXT: blo     .LBB0_2
     23 
     24 ; Thumb-android:      mov     r4, #48
     25 ; Thumb-android-NEXT: mov     r5, #0
     26 ; Thumb-android-NEXT: push    {lr}
     27 ; Thumb-android-NEXT: bl      __morestack
     28 ; Thumb-android-NEXT: pop     {r4}
     29 ; Thumb-android-NEXT: mov     lr, r4
     30 ; Thumb-android-NEXT: pop     {r4, r5}
     31 ; Thumb-android-NEXT: bx      lr
     32 
     33 ; Thumb-android:      pop     {r4, r5}
     34 
     35 ; Thumb-linux:      test_basic:
     36 
     37 ; Thumb-linux:      push    {r4, r5}
     38 ; Thumb-linux-NEXT: mov     r5, sp
     39 ; Thumb-linux-NEXT: ldr     r4, .LCPI0_0
     40 ; Thumb-linux-NEXT: ldr     r4, [r4]
     41 ; Thumb-linux-NEXT: cmp     r4, r5
     42 ; Thumb-linux-NEXT: blo     .LBB0_2
     43 
     44 ; Thumb-linux:      mov     r4, #48
     45 ; Thumb-linux-NEXT: mov     r5, #0
     46 ; Thumb-linux-NEXT: push    {lr}
     47 ; Thumb-linux-NEXT: bl      __morestack
     48 ; Thumb-linux-NEXT: pop     {r4}
     49 ; Thumb-linux-NEXT: mov     lr, r4
     50 ; Thumb-linux-NEXT: pop     {r4, r5}
     51 ; Thumb-linux-NEXT: bx      lr
     52 
     53 ; Thumb-linux:      pop     {r4, r5}
     54 
     55 }
     56 
     57 define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
     58        %addend = load i32 * %closure
     59        %result = add i32 %other, %addend
     60        %mem = alloca i32, i32 10
     61        call void @dummy_use (i32* %mem, i32 10)
     62        ret i32 %result
     63 
     64 ; Thumb-android:      test_nested:
     65 
     66 ; Thumb-android:      push  {r4, r5}
     67 ; Thumb-android-NEXT: mov     r5, sp
     68 ; Thumb-android-NEXT: ldr     r4, .LCPI1_0
     69 ; Thumb-android-NEXT: ldr     r4, [r4]
     70 ; Thumb-android-NEXT: cmp     r4, r5
     71 ; Thumb-android-NEXT: blo     .LBB1_2
     72 
     73 ; Thumb-android:      mov     r4, #56
     74 ; Thumb-android-NEXT: mov     r5, #0
     75 ; Thumb-android-NEXT: push    {lr}
     76 ; Thumb-android-NEXT: bl      __morestack
     77 ; Thumb-android-NEXT: pop     {r4}
     78 ; Thumb-android-NEXT: mov     lr, r4
     79 ; Thumb-android-NEXT: pop     {r4, r5}
     80 ; Thumb-android-NEXT: bx      lr
     81 
     82 ; Thumb-android:      pop     {r4, r5}
     83 
     84 ; Thumb-linux:      test_nested:
     85 
     86 ; Thumb-linux:      push    {r4, r5}
     87 ; Thumb-linux-NEXT: mov     r5, sp
     88 ; Thumb-linux-NEXT: ldr     r4, .LCPI1_0
     89 ; Thumb-linux-NEXT: ldr     r4, [r4]
     90 ; Thumb-linux-NEXT: cmp     r4, r5
     91 ; Thumb-linux-NEXT: blo     .LBB1_2
     92 
     93 ; Thumb-linux:      mov     r4, #56
     94 ; Thumb-linux-NEXT: mov     r5, #0
     95 ; Thumb-linux-NEXT: push    {lr}
     96 ; Thumb-linux-NEXT: bl      __morestack
     97 ; Thumb-linux-NEXT: pop     {r4}
     98 ; Thumb-linux-NEXT: mov     lr, r4
     99 ; Thumb-linux-NEXT: pop     {r4, r5}
    100 ; Thumb-linux-NEXT: bx      lr
    101 
    102 ; Thumb-linux:      pop     {r4, r5}
    103 
    104 }
    105 
    106 define void @test_large() #0 {
    107         %mem = alloca i32, i32 10000
    108         call void @dummy_use (i32* %mem, i32 0)
    109         ret void
    110 
    111 ; Thumb-android:      test_large:
    112 
    113 ; Thumb-android:      push    {r4, r5}
    114 ; Thumb-android-NEXT: mov     r5, sp
    115 ; Thumb-android-NEXT: sub     r5, #40192
    116 ; Thumb-android-NEXT: ldr     r4, .LCPI2_2
    117 ; Thumb-android-NEXT: ldr     r4, [r4]
    118 ; Thumb-android-NEXT: cmp     r4, r5
    119 ; Thumb-android-NEXT: blo     .LBB2_2
    120 
    121 ; Thumb-android:      mov     r4, #40192
    122 ; Thumb-android-NEXT: mov     r5, #0
    123 ; Thumb-android-NEXT: push    {lr}
    124 ; Thumb-android-NEXT: bl      __morestack
    125 ; Thumb-android-NEXT: pop     {r4}
    126 ; Thumb-android-NEXT: mov     lr, r4
    127 ; Thumb-android-NEXT: pop     {r4, r5}
    128 ; Thumb-android-NEXT: bx      lr
    129 
    130 ; Thumb-android:      pop     {r4, r5}
    131 
    132 ; Thumb-linux:      test_large:
    133 
    134 ; Thumb-linux:      push    {r4, r5}
    135 ; Thumb-linux-NEXT: mov     r5, sp
    136 ; Thumb-linux-NEXT: sub     r5, #40192
    137 ; Thumb-linux-NEXT: ldr     r4, .LCPI2_2
    138 ; Thumb-linux-NEXT: ldr     r4, [r4]
    139 ; Thumb-linux-NEXT: cmp     r4, r5
    140 ; Thumb-linux-NEXT: blo     .LBB2_2
    141 
    142 ; Thumb-linux:      mov     r4, #40192
    143 ; Thumb-linux-NEXT: mov     r5, #0
    144 ; Thumb-linux-NEXT: push    {lr}
    145 ; Thumb-linux-NEXT: bl      __morestack
    146 ; Thumb-linux-NEXT: pop     {r4}
    147 ; Thumb-linux-NEXT: mov     lr, r4
    148 ; Thumb-linux-NEXT: pop     {r4, r5}
    149 ; Thumb-linux-NEXT: bx      lr
    150 
    151 ; Thumb-linux:      pop     {r4, r5}
    152 
    153 }
    154 
    155 define fastcc void @test_fastcc() #0 {
    156         %mem = alloca i32, i32 10
    157         call void @dummy_use (i32* %mem, i32 10)
    158         ret void
    159 
    160 ; Thumb-android:      test_fastcc:
    161 
    162 ; Thumb-android:      push    {r4, r5}
    163 ; Thumb-android-NEXT: mov     r5, sp
    164 ; Thumb-android-NEXT: ldr     r4, .LCPI3_0
    165 ; Thumb-android-NEXT: ldr     r4, [r4]
    166 ; Thumb-android-NEXT: cmp     r4, r5
    167 ; Thumb-android-NEXT: blo     .LBB3_2
    168 
    169 ; Thumb-android:      mov     r4, #48
    170 ; Thumb-android-NEXT: mov     r5, #0
    171 ; Thumb-android-NEXT: push    {lr}
    172 ; Thumb-android-NEXT: bl      __morestack
    173 ; Thumb-android-NEXT: pop     {r4}
    174 ; Thumb-android-NEXT: mov     lr, r4
    175 ; Thumb-android-NEXT: pop     {r4, r5}
    176 ; Thumb-android-NEXT: bx      lr
    177 
    178 ; Thumb-android:      pop     {r4, r5}
    179 
    180 ; Thumb-linux:      test_fastcc:
    181 
    182 ; Thumb-linux:      push    {r4, r5}
    183 ; Thumb-linux-NEXT: mov     r5, sp
    184 ; Thumb-linux-NEXT: ldr     r4, .LCPI3_0
    185 ; Thumb-linux-NEXT: ldr     r4, [r4]
    186 ; Thumb-linux-NEXT: cmp     r4, r5
    187 ; Thumb-linux-NEXT: blo     .LBB3_2
    188 
    189 ; Thumb-linux:      mov     r4, #48
    190 ; Thumb-linux-NEXT: mov     r5, #0
    191 ; Thumb-linux-NEXT: push    {lr}
    192 ; Thumb-linux-NEXT: bl      __morestack
    193 ; Thumb-linux-NEXT: pop     {r4}
    194 ; Thumb-linux-NEXT: mov     lr, r4
    195 ; Thumb-linux-NEXT: pop     {r4, r5}
    196 ; Thumb-linux-NEXT: bx      lr
    197 
    198 ; Thumb-linux:      pop     {r4, r5}
    199 
    200 }
    201 
    202 define fastcc void @test_fastcc_large() #0 {
    203         %mem = alloca i32, i32 10000
    204         call void @dummy_use (i32* %mem, i32 0)
    205         ret void
    206 
    207 ; Thumb-android:      test_fastcc_large:
    208 
    209 ; Thumb-android:      push    {r4, r5}
    210 ; Thumb-android-NEXT: mov     r5, sp
    211 ; Thumb-android-NEXT: sub     r5, #40192
    212 ; Thumb-android-NEXT: ldr     r4, .LCPI4_2
    213 ; Thumb-android-NEXT: ldr     r4, [r4]
    214 ; Thumb-android-NEXT: cmp     r4, r5
    215 ; Thumb-android-NEXT: blo     .LBB4_2
    216 
    217 ; Thumb-android:      mov     r4, #40192
    218 ; Thumb-android-NEXT: mov     r5, #0
    219 ; Thumb-android-NEXT: push    {lr}
    220 ; Thumb-android-NEXT: bl      __morestack
    221 ; Thumb-android-NEXT: pop     {r4}
    222 ; Thumb-android-NEXT: mov     lr, r4
    223 ; Thumb-android-NEXT: pop     {r4, r5}
    224 ; Thumb-android-NEXT: bx      lr
    225 
    226 ; Thumb-android:      pop     {r4, r5}
    227 
    228 ; Thumb-linux:      test_fastcc_large:
    229 
    230 ; Thumb-linux:      push    {r4, r5}
    231 ; Thumb-linux-NEXT: mov     r5, sp
    232 ; Thumb-linux-NEXT: sub     r5, #40192
    233 ; Thumb-linux-NEXT: ldr     r4, .LCPI4_2
    234 ; Thumb-linux-NEXT: ldr     r4, [r4]
    235 ; Thumb-linux-NEXT: cmp     r4, r5
    236 ; Thumb-linux-NEXT: blo     .LBB4_2
    237 
    238 ; Thumb-linux:      mov     r4, #40192
    239 ; Thumb-linux-NEXT: mov     r5, #0
    240 ; Thumb-linux-NEXT: push    {lr}
    241 ; Thumb-linux-NEXT: bl      __morestack
    242 ; Thumb-linux-NEXT: pop     {r4}
    243 ; Thumb-linux-NEXT: mov     lr, r4
    244 ; Thumb-linux-NEXT: pop     {r4, r5}
    245 ; Thumb-linux-NEXT: bx      lr
    246 
    247 ; Thumb-linux:      pop     {r4, r5}
    248 
    249 }
    250 
    251 define void @test_nostack() #0 {
    252 	ret void
    253 
    254 ; Thumb-android-LABEL: test_nostack:
    255 ; Thumb-android-NOT:   bl __morestack
    256 
    257 ; Thumb-linux-LABEL: test_nostack:
    258 ; Thumb-linux-NOT:   bl __morestack
    259 }
    260 
    261 attributes #0 = { "split-stack" }
    262