xref: /llvm-project/llvm/test/CodeGen/ARM/sponentry.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
1668bb963SMartin Storsjö; RUN: llc -mtriple=thumbv7-windows-msvc -frame-pointer=all %s -o - | FileCheck %s
2668bb963SMartin Storsjö; RUN: llc -mtriple=thumbv7-windows-msvc -fast-isel -frame-pointer=all %s -o - | FileCheck %s
3668bb963SMartin Storsjö; RUN: llc -mtriple=thumbv7-windows-msvc %s -o - | FileCheck %s --check-prefix=NOFP
4668bb963SMartin Storsjö; RUN: llc -mtriple=thumbv7-windows-msvc -fast-isel %s -o - | FileCheck %s --check-prefix=NOFP
5668bb963SMartin Storsjö
6*bed1c7f0SNikita Popov@env2 = common dso_local global ptr null, align 8
7668bb963SMartin Storsjö
8668bb963SMartin Storsjödefine dso_local void @bar() {
9*bed1c7f0SNikita Popov  %1 = call ptr @llvm.sponentry()
10*bed1c7f0SNikita Popov  %2 = load ptr, ptr @env2, align 8
11*bed1c7f0SNikita Popov  %3 = call i32 @_setjmpex(ptr %2, ptr %1) #2
12668bb963SMartin Storsjö  ret void
13668bb963SMartin Storsjö}
14668bb963SMartin Storsjö
15668bb963SMartin Storsjö; CHECK: bar:
16668bb963SMartin Storsjö; CHECK: push.w  {r11, lr}
17668bb963SMartin Storsjö; CHECK: mov     r11, sp
18668bb963SMartin Storsjö; CHECK: add.w   r1, r11, #8
19668bb963SMartin Storsjö; CHECK: bl      _setjmpex
20668bb963SMartin Storsjö
21668bb963SMartin Storsjö; NOFP: bar:
22668bb963SMartin Storsjö; NOFP: push.w  {r11, lr}
23668bb963SMartin Storsjö; NOFP: add     r1, sp, #8
24668bb963SMartin Storsjö; NOFP: bl      _setjmpex
25668bb963SMartin Storsjö
26*bed1c7f0SNikita Popovdefine dso_local void @foo(ptr) {
27*bed1c7f0SNikita Popov  %2 = alloca ptr, align 8
28668bb963SMartin Storsjö  %3 = alloca i32, align 4
29668bb963SMartin Storsjö  %4 = alloca [100 x i32], align 4
30*bed1c7f0SNikita Popov  store ptr %0, ptr %2, align 8
31*bed1c7f0SNikita Popov  %5 = call ptr @llvm.sponentry()
32*bed1c7f0SNikita Popov  %6 = load ptr, ptr %2, align 8
33*bed1c7f0SNikita Popov  %7 = call i32 @_setjmpex(ptr %6, ptr %5)
34*bed1c7f0SNikita Popov  store i32 %7, ptr %3, align 4
35668bb963SMartin Storsjö  ret void
36668bb963SMartin Storsjö}
37668bb963SMartin Storsjö
38668bb963SMartin Storsjö; CHECK: foo:
39668bb963SMartin Storsjö; CHECK: push.w  {r11, lr}
40668bb963SMartin Storsjö; CHECK: mov     r11, sp
41668bb963SMartin Storsjö; CHECK: sub     sp, #416
42668bb963SMartin Storsjö; CHECK: add.w   r1, r11, #8
43668bb963SMartin Storsjö; CHECK: bl      _setjmpex
44668bb963SMartin Storsjö
45668bb963SMartin Storsjö; NOFP: foo:
46668bb963SMartin Storsjö; NOFP: push.w  {r11, lr}
47668bb963SMartin Storsjö; NOFP: sub     sp, #416
48668bb963SMartin Storsjö; NOFP: add     r1, sp, #424
49668bb963SMartin Storsjö; NOFP: bl      _setjmpex
50668bb963SMartin Storsjö
51*bed1c7f0SNikita Popovdefine dso_local void @var_args(ptr, ...) {
52*bed1c7f0SNikita Popov  %2 = alloca ptr, align 8
53*bed1c7f0SNikita Popov  %3 = alloca ptr, align 8
54*bed1c7f0SNikita Popov  store ptr %0, ptr %2, align 8
55*bed1c7f0SNikita Popov  call void @llvm.va_start(ptr %3)
56*bed1c7f0SNikita Popov  %4 = load ptr, ptr %3, align 8
57*bed1c7f0SNikita Popov  %5 = getelementptr inbounds i8, ptr %4, i64 8
58*bed1c7f0SNikita Popov  store ptr %5, ptr %3, align 8
59*bed1c7f0SNikita Popov  %6 = load i32, ptr %4, align 8
60*bed1c7f0SNikita Popov  call void @llvm.va_end(ptr %3)
61*bed1c7f0SNikita Popov  %7 = call ptr @llvm.sponentry()
62*bed1c7f0SNikita Popov  %8 = load ptr, ptr @env2, align 8
63*bed1c7f0SNikita Popov  %9 = call i32 @_setjmpex(ptr %8, ptr %7) #3
64668bb963SMartin Storsjö  ret void
65668bb963SMartin Storsjö}
66668bb963SMartin Storsjö
67668bb963SMartin Storsjö; CHECK: var_args:
68668bb963SMartin Storsjö; CHECK: sub     sp, #12
69668bb963SMartin Storsjö; CHECK: push.w  {r11, lr}
70668bb963SMartin Storsjö; CHECK: mov     r11, sp
71668bb963SMartin Storsjö; CHECK: add.w   r1, r11, #20
72668bb963SMartin Storsjö; CHECK: bl      _setjmpex
73668bb963SMartin Storsjö
74668bb963SMartin Storsjö; NOFP: var_args:
75668bb963SMartin Storsjö; NOFP: sub     sp, #12
76668bb963SMartin Storsjö; NOFP: push.w  {r11, lr}
77668bb963SMartin Storsjö; NOFP: sub     sp, #12
78668bb963SMartin Storsjö; NOFP: add     r1, sp, #32
79668bb963SMartin Storsjö; NOFP: bl      _setjmpex
80668bb963SMartin Storsjö
81668bb963SMartin Storsjödefine dso_local void @manyargs(i64 %x1, i64 %x2, i64 %x3, i64 %x4, i64 %x5, i64 %x6, i64 %x7, i64 %x8, i64 %x9, i64 %x10) {
82*bed1c7f0SNikita Popov  %1 = call ptr @llvm.sponentry()
83*bed1c7f0SNikita Popov  %2 = load ptr, ptr @env2, align 8
84*bed1c7f0SNikita Popov  %3 = call i32 @_setjmpex(ptr %2, ptr %1) #2
85668bb963SMartin Storsjö  ret void
86668bb963SMartin Storsjö}
87668bb963SMartin Storsjö
88668bb963SMartin Storsjö; CHECK: manyargs:
89668bb963SMartin Storsjö; CHECK: push.w  {r11, lr}
90668bb963SMartin Storsjö; CHECK: mov     r11, sp
91668bb963SMartin Storsjö; CHECK: add.w   r1, r11, #8
92668bb963SMartin Storsjö; CHECK: bl      _setjmpex
93668bb963SMartin Storsjö
94668bb963SMartin Storsjö; NOFP: manyargs:
95668bb963SMartin Storsjö; NOFP: push.w  {r11, lr}
96668bb963SMartin Storsjö; NOFP: add     r1, sp, #8
97668bb963SMartin Storsjö; NOFP: bl      _setjmpex
98668bb963SMartin Storsjö
99668bb963SMartin Storsjö; Function Attrs: nounwind readnone
100*bed1c7f0SNikita Popovdeclare ptr @llvm.sponentry()
101668bb963SMartin Storsjö
102668bb963SMartin Storsjö; Function Attrs: returns_twice
103*bed1c7f0SNikita Popovdeclare dso_local i32 @_setjmpex(ptr, ptr)
104668bb963SMartin Storsjö
105668bb963SMartin Storsjö; Function Attrs: nounwind
106*bed1c7f0SNikita Popovdeclare void @llvm.va_start(ptr) #1
107668bb963SMartin Storsjö
108668bb963SMartin Storsjö; Function Attrs: nounwind
109*bed1c7f0SNikita Popovdeclare void @llvm.va_end(ptr) #1
110