xref: /llvm-project/llvm/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll (revision 728490257ecc09ada707a0390303bd3c61027a53)
1;RUN: llc -mtriple=sparc -show-mc-encoding < %s | FileCheck %s -check-prefix=V8
2;RUN: llc -mtriple=sparc -mattr=v9 < %s | FileCheck %s -check-prefix=V9
3;RUN: llc -mtriple=sparc -show-mc-encoding -regalloc=basic < %s | FileCheck %s -check-prefix=V8
4;RUN: llc -mtriple=sparc -regalloc=basic -mattr=v9 < %s | FileCheck %s -check-prefix=V9
5;RUN: llc -mtriple=sparcv9 < %s | FileCheck %s -check-prefix=SPARC64
6
7
8define ptr @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:       ret
23;SPARC64:       restore %fp, 2047, %o0
24
25  %0 = tail call ptr @llvm.frameaddress(i32 0)
26  ret ptr %0
27}
28
29define ptr @frameaddr2() nounwind readnone {
30entry:
31;V8-LABEL: frameaddr2:
32;V8: ta 3 ! encoding: [0x91,0xd0,0x20,0x03]
33;V8: ld [%fp+56], {{.+}}
34;V8: ld [{{.+}}+56], {{.+}}
35;V8: ld [{{.+}}+56], {{.+}}
36
37;V9-LABEL: frameaddr2:
38;V9: flushw
39;V9: ld [%fp+56], {{.+}}
40;V9: ld [{{.+}}+56], {{.+}}
41;V9: ld [{{.+}}+56], {{.+}}
42
43;SPARC64-LABEL: frameaddr2
44;SPARC64: flushw
45;SPARC64: ldx [%fp+2159],     %[[R0:[goli][0-7]]]
46;SPARC64: ldx [%[[R0]]+2159], %[[R1:[goli][0-7]]]
47;SPARC64: ldx [%[[R1]]+2159], %[[R2:[goli][0-7]]]
48;SPARC64: ret
49;SPARC64: restore %[[R2]], 2047, %o0
50
51  %0 = tail call ptr @llvm.frameaddress(i32 3)
52  ret ptr %0
53}
54
55declare ptr @llvm.frameaddress(i32) nounwind readnone
56
57
58
59define ptr @retaddr() nounwind readnone {
60entry:
61;V8-LABEL: retaddr:
62;V8: mov %o7, {{.+}}
63
64;V9-LABEL: retaddr:
65;V9: mov %o7, {{.+}}
66
67;SPARC64-LABEL: retaddr
68;SPARC64:       mov %o7, {{.+}}
69
70  %0 = tail call ptr @llvm.returnaddress(i32 0)
71  ret ptr %0
72}
73
74define ptr @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 ptr @llvm.returnaddress(i32 3)
95  ret ptr %0
96}
97
98define ptr @retaddr3() nounwind readnone {
99entry:
100;V8-LABEL: retaddr3:
101;V8: ta 3
102;V8: ld [%fp+60], {{.+}}
103
104;V9-LABEL: retaddr3:
105;V9: flushw
106;V9: ld [%fp+60], {{.+}}
107
108;SPARC64-LABEL: retaddr3
109;SPARC64:       flushw
110;SPARC64: ldx [%fp+2167],     %[[R0:[goli][0-7]]]
111
112  %0 = tail call ptr @llvm.returnaddress(i32 1)
113  ret ptr %0
114}
115
116declare ptr @llvm.returnaddress(i32) nounwind readnone
117