annotate dyncall/dyncall_call_sparc64.S @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_call_sparc64.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Call kernel for sparc64 v9 ABI.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 /* ---------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 call kernel for sparc64 v9 abi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 tested on sparc64/linux/debian [gcc54.fsffrance.org - thanx to the farm!]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 new C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 void dcCall_sparc (DCCallVM* callvm, DCpointer target);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 %i0 %1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 see dyncall_call_sparc.S for details.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 old C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 void dcCall_sparc (DCpointer target, DCsize size, DCpointer data);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 %i0 , %i1 , %i2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 Input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 i0 target
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 i1 size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 i2 data
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 #define REGSIZE 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 #define BIAS 2047
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 #define ALIGN 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 #define IREGS 6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 #define FREGS 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 #define SREGS 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 #define IBASE 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 #define FBASE (IREGS*8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 #define SHEAD ((16+6)*8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 #define DHEAD ((IREGS+FREGS)*8)+SREGS*4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 CALLVM_singleUseFlags = 24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 CALLVM_size = 40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 CALLVM_dataoff = 48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 .global dcCall_sparc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 dcCall_sparc64:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 /* Basic Prolog: supports up to 6 arguments. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 /* new C interface */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 /* o0-1: callvm,target */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 or %o0, %g0, %o3 /* %o3: callvm */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 or %o1, %g0, %o0 /* %o0: target */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 ldx [%o3+CALLVM_size], %o1 /* %o1: size */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 add %o3, CALLVM_dataoff, %o2 /* %o2: data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 ld [%o3+CALLVM_singleUseFlags], %o4 /* %o4: flags */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 /*leaf functions: may use the first six output registers.*/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 /*o0-2:target,size,data*/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 /*o3-5:free to use */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 /* Arguments: */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 /* %o0 = ptr to target. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 /* %o1 = size of data. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 /* %o2 = data pointer. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 /* %o4 = use flags. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 /* Compute a matching stack size (approximate): o3 = align(o1+136,16) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 add %o1, SHEAD+ALIGN-1, %o3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 and %o3, -ALIGN, %o3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 neg %o3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 /* Prolog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 save %sp, %o3, %sp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 /* Arguments: */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 /* %i0 = ptr to target. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 /* %i1 = size of data. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 /* %i2 = data pointer. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 /* %i3 = stack size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 /* Load output registers. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 ldx [%i2+IBASE+REGSIZE*0 ],%o0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 ldx [%i2+IBASE+REGSIZE*1 ],%o1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 ldx [%i2+IBASE+REGSIZE*2 ],%o2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 ldx [%i2+IBASE+REGSIZE*3 ],%o3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 ldx [%i2+IBASE+REGSIZE*4 ],%o4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 ldx [%i2+IBASE+REGSIZE*5 ],%o5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 /* Load double-precision float registers. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 ldd [%i2+FBASE+REGSIZE*0 ],%f0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 ldd [%i2+FBASE+REGSIZE*1 ],%f2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 ldd [%i2+FBASE+REGSIZE*2 ],%f4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 ldd [%i2+FBASE+REGSIZE*3 ],%f6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 ldd [%i2+FBASE+REGSIZE*4 ],%f8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 ldd [%i2+FBASE+REGSIZE*5 ],%f10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 ldd [%i2+FBASE+REGSIZE*6 ],%f12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 ldd [%i2+FBASE+REGSIZE*7 ],%f14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 ldd [%i2+FBASE+REGSIZE*8 ],%f16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 ldd [%i2+FBASE+REGSIZE*9 ],%f18
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 ldd [%i2+FBASE+REGSIZE*10],%f20
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 ldd [%i2+FBASE+REGSIZE*11],%f22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 ldd [%i2+FBASE+REGSIZE*12],%f24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 ldd [%i2+FBASE+REGSIZE*13],%f26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 ldd [%i2+FBASE+REGSIZE*14],%f28
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 ldd [%i2+FBASE+REGSIZE*15],%f30
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 /* load single-precision float registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 or %g0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 .f0:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 beq .f1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 ld [%i2+FBASE+REGSIZE*16+4*0 ], %f1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 .f1:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 beq .f2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 ld [%i2+FBASE+REGSIZE*16+4*1 ], %f3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 .f2:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 beq .f3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 ld [%i2+FBASE+REGSIZE*16+4*2 ], %f5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 .f3:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 beq .f4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 ld [%i2+FBASE+REGSIZE*16+4*3 ], %f7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 .f4:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 beq .f5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 ld [%i2+FBASE+REGSIZE*16+4*4 ], %f9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 .f5:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 beq .f6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 ld [%i2+FBASE+REGSIZE*16+4*5 ], %f11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 .f6:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 beq .f7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 ld [%i2+FBASE+REGSIZE*16+4*6 ], %f13
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 .f7:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 beq .f8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 ld [%i2+FBASE+REGSIZE*16+4*7 ], %f15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 .f8:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 beq .f9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 ld [%i2+FBASE+REGSIZE*16+4*8 ], %f17
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 .f9:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 beq .f10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 ld [%i2+FBASE+REGSIZE*16+4*9 ], %f19
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 .f10:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 beq .f11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 ld [%i2+FBASE+REGSIZE*16+4*10], %f21
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 .f11:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 beq .f12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 ld [%i2+FBASE+REGSIZE*16+4*11], %f23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 .f12:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 beq .f13
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 ld [%i2+FBASE+REGSIZE*16+4*12], %f25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 .f13:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 beq .f14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 ld [%i2+FBASE+REGSIZE*16+4*13], %f27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 .f14:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 beq .f15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 ld [%i2+FBASE+REGSIZE*16+4*14], %f29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 .f15:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 sll %l0, 1, %l0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 andcc %i4, %l0, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 beq .f_end
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 ld [%i2+FBASE+REGSIZE*16+4*15], %f31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 .f_end:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 /* Skip Register Data, do we nee to copy on stack at all? */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 sub %i1, DHEAD, %i1 /* skip data header. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236 cmp %i1, 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 ble .do_call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 /* Copy loop: */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 add %i2, DHEAD, %i2 /* i2 = skip data header. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 or %g0, %g0, %l0 /* l0 = offset initialized to 0. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243 add %sp, BIAS+SHEAD, %l2 /* l2 = argument area on stack space (7th word). (64+4+6*4 = byte offset 92). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
245 .next:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 ldx [%i2+%l0],%l1 /* Read from arg buffer(%i2) to %l1. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247 stx %l1, [%l2+%l0] /* Write %l1 to stack space(%l2). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 add %l0, REGSIZE, %l0 /* Increment offset. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249 sub %i1, REGSIZE, %i1 /* Decrement copy size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 cmp %i1, 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251 bgt .next
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253 .do_call:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 call %i0 /* Call target. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256 or %o0, %g0, %i0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 jmpl %i7 + 8, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258 restore
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260 return %i7 + 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 jmpl %i7 + 8, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 jmpl %i7 + 8, %g0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
266 restore
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
267 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
268 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
269
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
270 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
271 or %o0, %g0, %i0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272 or %o1, %g0, %i1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273 or %o2, %g0, %i2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 or %o3, %g0, %i3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275 return %i7 + 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276 nop
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278 Changes from v8:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279 - fundamental data types
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 - (un)signed int: 8,16,32,64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281 - float: 32,64,128
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 - float: IEEE 754 compilant
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283 32 32-bit float registers f0,f1,..,f31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 32 64-bit float registers f0,f2,..,f62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 16 128-bit float registers f0,f4,..,f60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
286
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287 Description:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288 We need to raise up a dynamic stack frame.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289 Therefore we need to compute the stack size. We do this first,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290 in the context of the caller as a leaf function (using o3 as scratch for addition).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 Then we raise the frame, ending up in o0-o3 is then i0-i3.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
293
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
294 Stack Layout:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
295 BIAS = 2047
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
296
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
297 BIAS+XX: should be 16 byte aligned.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
298 ...
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
299 136: argument overflow area
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
300 128: 1 extended word for struct/union poiner return value
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
301 BIAS+ 0: 16 extended words for registers (in/local) save area [register window]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
302
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
303
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
304 Function Argument Passing:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
305 - integer %o0..%o5 (caller view).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
306 - floating-point %f0 .. %f15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
307 - continuous memory starting at %sp+BIAS+136 (caller view).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
308
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
309 Register Usage:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
310 %fp0..%fp31 : floating-point arguments.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
311 %sp or %o6 : stack pointer, always 8 (or 16?)-byte aligned.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
312 %fp or %i6 : frame pointer.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
313 %i0 and %o0 : integer and pointer return values.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
314 %i7 and %o7 : return address. (caller puts return address to %o7, callee uses %i7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
315 %fp0 and %fp1: return value (float).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
316 %i0..%i5 : input argument registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
317 %o0..%o5 : output argument registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
318 %g0 : always zero, writes to it have no effect.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
319
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
320 Register Mappings:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
321 r0-7 -> globals
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
322 r8-15 -> outs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
323 r16-r23 -> locals
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
324 r24-r31 -> ins
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
325
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
326 Integer Register Overview Table:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
327 ID Class Name Description
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
328 ------------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
329 0 globals g0 always zero, writes to it have no effect
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
330 1 g1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
331 2 g2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
332 3 g3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
333 4 g4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
334 5 g5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
335 6 g6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
336 7 g7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
337 8 out o0 [int/ptr] arg 0 and return
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
338 9 o1 arg 1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
339 10 o2 arg 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
340 11 o3 arg 3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
341 12 o4 arg 4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
342 13 o5 arg 5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
343 14 o6 stack pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
344 15 o7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
345 16 local l0 scratch
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
346 17 l1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
347 18 l2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
348 19 l3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
349 20 l4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
350 21 l5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
351 22 l6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
352 23 l7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
353 24 in i0 [int/pt] arg 0 and return
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
354 25 i1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
355 26 i2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
356 27 i3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
357 28 i4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
358 29 i5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
359 30 i6 frame pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
360 31 i7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
361 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
362