1;RUN: llc -march=sparc < %s | FileCheck %s -check-prefix=V8
2;RUN: llc -march=sparc -mattr=v9 < %s | FileCheck %s -check-prefix=V9
3;RUN: llc -march=sparc -regalloc=basic < %s | FileCheck %s -check-prefix=V8
4;RUN: llc -march=sparc -regalloc=basic -mattr=v9 < %s | FileCheck %s -check-prefix=V9
5;RUN: llc -march=sparcv9  < %s | FileCheck %s -check-prefix=SPARC64
6
7
8define i8* @frameaddr() nounwind readnone {
9entry:
10;V8-LABEL: frameaddr:
11;V8: save %sp, -96, %sp
12;V8: ret
13;V8: restore %g0, %fp, %o0
14
15;V9-LABEL: frameaddr:
16;V9: save %sp, -96, %sp
17;V9: ret
18;V9: restore %g0, %fp, %o0
19
20;SPARC64-LABEL: frameaddr
21;SPARC64:       save %sp, -128, %sp
22;SPARC64:       add  %fp, 2047, %i0
23;SPARC64:       ret
24;SPARC64:       restore %g0, %g0, %g0
25
26  %0 = tail call i8* @llvm.frameaddress(i32 0)
27  ret i8* %0
28}
29
30define i8* @frameaddr2() nounwind readnone {
31entry:
32;V8-LABEL: frameaddr2:
33;V8: ta 3
34;V8: ld [%fp+56], {{.+}}
35;V8: ld [{{.+}}+56], {{.+}}
36;V8: ld [{{.+}}+56], {{.+}}
37
38;V9-LABEL: frameaddr2:
39;V9: flushw
40;V9: ld [%fp+56], {{.+}}
41;V9: ld [{{.+}}+56], {{.+}}
42;V9: ld [{{.+}}+56], {{.+}}
43
44;SPARC64-LABEL: frameaddr2
45;SPARC64: flushw
46;SPARC64: ldx [%fp+2159],     %[[R0:[goli][0-7]]]
47;SPARC64: ldx [%[[R0]]+2159], %[[R1:[goli][0-7]]]
48;SPARC64: ldx [%[[R1]]+2159], %[[R2:[goli][0-7]]]
49;SPARC64: add %[[R2]], 2047, {{.+}}
50
51  %0 = tail call i8* @llvm.frameaddress(i32 3)
52  ret i8* %0
53}
54
55declare i8* @llvm.frameaddress(i32) nounwind readnone
56
57
58
59define i8* @retaddr() nounwind readnone {
60entry:
61;V8-LABEL: retaddr:
62;V8: or %g0, %o7, {{.+}}
63
64;V9-LABEL: retaddr:
65;V9: or %g0, %o7, {{.+}}
66
67;SPARC64-LABEL: retaddr
68;SPARC64:       or %g0, %o7, {{.+}}
69
70  %0 = tail call i8* @llvm.returnaddress(i32 0)
71  ret i8* %0
72}
73
74define i8* @retaddr2() nounwind readnone {
75entry:
76;V8-LABEL: retaddr2:
77;V8: ta 3
78;V8: ld [%fp+56], {{.+}}
79;V8: ld [{{.+}}+56], {{.+}}
80;V8: ld [{{.+}}+60], {{.+}}
81
82;V9-LABEL: retaddr2:
83;V9: flushw
84;V9: ld [%fp+56], {{.+}}
85;V9: ld [{{.+}}+56], {{.+}}
86;V9: ld [{{.+}}+60], {{.+}}
87
88;SPARC64-LABEL: retaddr2
89;SPARC64:       flushw
90;SPARC64: ldx [%fp+2159],     %[[R0:[goli][0-7]]]
91;SPARC64: ldx [%[[R0]]+2159], %[[R1:[goli][0-7]]]
92;SPARC64: ldx [%[[R1]]+2167], {{.+}}
93
94  %0 = tail call i8* @llvm.returnaddress(i32 3)
95  ret i8* %0
96}
97
98declare i8* @llvm.returnaddress(i32) nounwind readnone
99