1; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=DARWIN-ARM
2; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=armv7-linux-gnueabi | FileCheck %s --check-prefix=LINUX-ARM
3; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=DARWIN-THUMB2
4; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=thumbv7-linux-gnueabi | FileCheck %s --check-prefix=LINUX-THUMB2
5
6define i8* @frameaddr_index0() nounwind {
7entry:
8; DARWIN-ARM: frameaddr_index0:
9; DARWIN-ARM: push {r7}
10; DARWIN-ARM: mov r7, sp
11; DARWIN-ARM: mov r0, r7
12
13; DARWIN-THUMB2: frameaddr_index0:
14; DARWIN-THUMB2: str r7, [sp, #-4]!
15; DARWIN-THUMB2: mov r7, sp
16; DARWIN-THUMB2: mov r0, r7
17
18; LINUX-ARM: frameaddr_index0:
19; LINUX-ARM: push {r11}
20; LINUX-ARM: mov r11, sp
21; LINUX-ARM: mov r0, r11
22
23; LINUX-THUMB2: frameaddr_index0:
24; LINUX-THUMB2: str r7, [sp, #-4]!
25; LINUX-THUMB2: mov r7, sp
26; LINUX-THUMB2: mov r0, r7
27
28  %0 = call i8* @llvm.frameaddress(i32 0)
29  ret i8* %0
30}
31
32define i8* @frameaddr_index1() nounwind {
33entry:
34; DARWIN-ARM: frameaddr_index1:
35; DARWIN-ARM: push {r7}
36; DARWIN-ARM: mov r7, sp
37; DARWIN-ARM: mov r0, r7
38; DARWIN-ARM: ldr r0, [r0]
39
40; DARWIN-THUMB2: frameaddr_index1:
41; DARWIN-THUMB2: str r7, [sp, #-4]!
42; DARWIN-THUMB2: mov r7, sp
43; DARWIN-THUMB2: mov r0, r7
44; DARWIN-THUMB2: ldr r0, [r0]
45
46; LINUX-ARM: frameaddr_index1:
47; LINUX-ARM: push {r11}
48; LINUX-ARM: mov r11, sp
49; LINUX-ARM: ldr r0, [r11]
50
51; LINUX-THUMB2: frameaddr_index1:
52; LINUX-THUMB2: str r7, [sp, #-4]!
53; LINUX-THUMB2: mov r7, sp
54; LINUX-THUMB2: mov r0, r7
55; LINUX-THUMB2: ldr r0, [r0]
56
57  %0 = call i8* @llvm.frameaddress(i32 1)
58  ret i8* %0
59}
60
61define i8* @frameaddr_index3() nounwind {
62entry:
63; DARWIN-ARM: frameaddr_index3:
64; DARWIN-ARM: push {r7}
65; DARWIN-ARM: mov r7, sp
66; DARWIN-ARM: mov r0, r7
67; DARWIN-ARM: ldr r0, [r0]
68; DARWIN-ARM: ldr r0, [r0]
69; DARWIN-ARM: ldr r0, [r0]
70
71; DARWIN-THUMB2: frameaddr_index3:
72; DARWIN-THUMB2: str r7, [sp, #-4]!
73; DARWIN-THUMB2: mov r7, sp
74; DARWIN-THUMB2: mov r0, r7
75; DARWIN-THUMB2: ldr r0, [r0]
76; DARWIN-THUMB2: ldr r0, [r0]
77; DARWIN-THUMB2: ldr r0, [r0]
78
79; LINUX-ARM: frameaddr_index3:
80; LINUX-ARM: push {r11}
81; LINUX-ARM: mov r11, sp
82; LINUX-ARM: ldr r0, [r11]
83; LINUX-ARM: ldr r0, [r0]
84; LINUX-ARM: ldr r0, [r0]
85
86; LINUX-THUMB2: frameaddr_index3:
87; LINUX-THUMB2: str r7, [sp, #-4]!
88; LINUX-THUMB2: mov r7, sp
89; LINUX-THUMB2: mov r0, r7
90; LINUX-THUMB2: ldr r0, [r0]
91; LINUX-THUMB2: ldr r0, [r0]
92; LINUX-THUMB2: ldr r0, [r0]
93
94  %0 = call i8* @llvm.frameaddress(i32 3)
95  ret i8* %0
96}
97
98declare i8* @llvm.frameaddress(i32) nounwind readnone
99