1 .global privateSnippetExecutor
2 .type privateSnippetExecutor,2
3 privateSnippetExecutor:
4 		! save %sp, -96, %sp  already done in code snippet
5 		st %i0, [%fp+68]
6 		st %i1, [%fp+72]
7 		st %i2, [%fp+76]
8 		st %i3, [%fp+80]
9 		st %i4, [%fp+84]
10 		st %i5, [%fp+88]
11 		! %o0: functionIndex, stored by code snippet
12 		! %o1: vtableOffset, stored by code snippet
13 		call cpp_vtable_call
14 		add %fp, 68, %o2
15 .privateSnippetExecutorExceptionPosition:
16 		subcc %o0, 11, %g0
17 		be .double
18 		subcc %o0, 10, %g0
19 		be .float
20 		ld [%fp+72], %i0
21 		ld [%fp+76], %i1
22 		ret
23 		restore
24 .double:
25 		ldd [%fp+72], %f0
26 		ret
27 		restore
28 .float:
29 		ld [%fp+72], %f0
30 		ret
31 		restore
32 .size privateSnippetExecutor,(.-privateSnippetExecutor)
33 .align 8
34 
35 
36 .global callVirtualMethod
37 .type callVirtualMethod,2
38 callVirtualMethod:
39 		! allocate FIRST stack to have own local registers
40 		sethi		 %hi(-96), %g1
41 		or		 %g1, %lo(-96), %g1
42 		subcc		 %g1, %o5, %g1
43 		subcc		 %g1, %o5, %g1
44 		subcc		 %g1, %o5, %g1
45 		subcc		 %g1, %o5, %g1
46 		save		%sp, %g1, %sp
47 		! copy stack longs if necessary
48 		subcc		%i5, 6, %l5
49 		ble		.copyRegisters
50 		nop
51 
52 		! prepare source location
53 		add		%i4, 24, %l4
54 
55 		! prepare real stack
56 		add		%sp, 92, %l3
57 
58 .copyLong:
59 		ld		[%l4+0], %l0
60 		st		%l0, [%l3]
61 		add		%l4, 4, %l4
62 		add		%l3, 4, %l3
63 		deccc		%l5
64 		bne		.copyLong
65 		nop
66 .copyRegisters:
67 		mov		%i5, %l5
68 		mov		%i4, %l4
69 
70 		ld		[%l4], %o0
71 		add		%l4, 4, %l4
72 		deccc		%l5
73 		ble		.doCall
74 
75 		ld		[%l4], %o1
76 		add		%l4, 4, %l4
77 		deccc		%l5
78 		ble		.doCall
79 
80 		ld		[%l4], %o2
81 		add		%l4, 4, %l4
82 		deccc		%l5
83 		ble		.doCall
84 
85 		ld			[%l4], %o3
86 		add		%l4, 4, %l4
87 		deccc		%l5
88 		ble		.doCall
89 
90 		ld			[%l4], %o4
91 		add		%l4, 4, %l4
92 		deccc		%l5
93 		ble		.doCall
94 
95 		ld			[%l4], %o5
96 		add		%l4, 4, %l4
97 
98 		! prepare complex return pointer
99 		st			%i2, [%sp+64]
100 .doCall:
101 		! get virtual table entry
102 		mov		%i1, %l1
103 		add		%l1, 2, %l1
104 		sll		%l1, 2, %l1
105 		ld			[%i0], %l3
106 		add		%l3, %l1, %l1
107 		ld			[%l1], %l0
108 		jmpl		%l0,%o7
109 		nop
110 .callVirtualMethodExceptionPosition:
111 		! handle returns
112 
113 		!byte types
114 		subcc %i3, 2, %l3		! typelib_TypeClass_BOOLEAN
115 		be .handleByte
116 		subcc %i3, 3, %l3		! typelib_TypeClass_BYTE
117 		be .handleByte
118 
119 		! half word types
120 		subcc %i3, 4, %l3		! typelib_TypeClass_SHORT
121 		be .handleShort
122 		subcc %i3, 5, %l3		! typelib_TypeClass_UNSIGNED_SHORT
123 		be .handleShort
124 		subcc %i3, 1, %l3		! typelib_TypeClass_CHAR (sal_Unicode==sal_uInt16)
125 		be .handleShort
126 
127 		! word types
128 		subcc %i3, 6, %l3		! typelib_TypeClass_LONG
129 		be .handleWord
130 		subcc %i3, 7, %l3		! typelib_TypeClass_UNSIGNED_LONG
131 		be .handleWord
132 		subcc %i3, 15, %l3	! typelib_TypeClass_ENUM
133 		be .handleWord
134 
135 		! double word types
136 		subcc %i3, 8, %l3		! typelib_TypeClass_HYPER
137 		be .handleDoubleWord
138 		subcc %i3, 9, %l3		! typelib_TypeClass_UNSIGNED_HYPER
139 		be .handleDoubleWord
140 
141 		! float
142 		subcc %i3, 10, %l3	! typelib_TypeClass_FLOAT
143 		be .handleFloat
144 
145 		! double
146 		subcc %i3, 11, %l3	! typelib_TypeClass_DOUBLE
147 		be .handleDouble
148 
149 		! default: return void
150 		nop					! empty prefetch
151 		ba .doRestore
152 		nop
153 .handleByte:
154 		stb %o0, [%i2]
155 		ba .doRestore
156 		nop
157 .handleShort:
158 		sth %o0, [%i2]
159 		ba .doRestore
160 		nop
161 .handleWord:
162 		st %o0, [%i2]
163 		ba .doRestore
164 		nop
165 .handleDoubleWord:
166 		st %o0, [%i2]
167 		st %o1, [%i2+4]
168 		ba .doRestore
169 		nop
170 .handleFloat:
171 		st %f0, [%i2]
172 		ba .doRestore
173 		nop
174 .handleDouble:
175 		std %f0, [%fp-8]
176 		ldd [%fp-8], %o0
177 		st %o0, [%i2]
178 		st %o1, [%i2+4]
179 		ba .doRestore
180 		nop
181 .doRestore:
182 		ret
183 		restore	! stack frame for own locals
184 .size callVirtualMethod,(.-callVirtualMethod)
185 .align 8
186 
187 .rethrow_handler:
188 		call	__1cG__CrunMex_rethrow_q6F_v_
189 		nop
190 
191 .section	".exception_ranges",#alloc
192 .word		%r_disp32(.privateSnippetExecutorExceptionPosition)
193 .word		0
194 .word		.rethrow_handler-.privateSnippetExecutorExceptionPosition
195 .word		0,0
196 .word		%r_disp32(.callVirtualMethodExceptionPosition)
197 .word		0
198 .word		.rethrow_handler-.callVirtualMethodExceptionPosition
199 .word		0,0
200