0152958a8b9e63225f5334b89a86a335a6fb3637
2 # (C) Copyright IBM Corporation 2004
5 # Permission is hereby granted, free of charge, to any person obtaining a
6 # copy of this software and associated documentation files (the "Software"),
7 # to deal in the Software without restriction, including without limitation
8 # on the rights to use, copy, modify, merge, publish, distribute, sub
9 # license, and/or sell copies of the Software, and to permit persons to whom
10 # the Software is furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice (including the next
13 # paragraph) shall be included in all copies or substantial portions of the
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 # IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 # Ian Romanick <idr@us.ibm.com>
27 from __future__
import print_function
32 import gl_XML
, glX_XML
34 class PrintGenericStubs(gl_XML
.gl_print_base
):
36 gl_XML
.gl_print_base
.__init
__(self
)
37 self
.name
= "gl_SPARC_asm.py (from Mesa)"
38 self
.license
= license
.bsd_license_template
% ( \
39 """Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
40 (C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
43 def printRealHeader(self
):
44 print('#ifdef __arch64__')
45 print('#define GL_OFF(N)\t((N) * 8)')
46 print('#define GL_LL\t\tldx')
47 print('#define GL_TIE_LD(SYM)\t%tie_ldx(SYM)')
48 print('#define GL_STACK_SIZE\t128')
50 print('#define GL_OFF(N)\t((N) * 4)')
51 print('#define GL_LL\t\tld')
52 print('#define GL_TIE_LD(SYM)\t%tie_ld(SYM)')
53 print('#define GL_STACK_SIZE\t64')
56 print('#define GLOBL_FN(x) .globl x ; .type x, @function')
57 print('#define HIDDEN(x) .hidden x')
59 print('\t.register %g2, #scratch')
60 print('\t.register %g3, #scratch')
64 print('\tGLOBL_FN(__glapi_sparc_icache_flush)')
65 print('\tHIDDEN(__glapi_sparc_icache_flush)')
66 print('\t.type\t__glapi_sparc_icache_flush, @function')
67 print('__glapi_sparc_icache_flush: /* %o0 = insn_addr */')
74 print('\t.type\t__glapi_sparc_get_pc, @function')
75 print('__glapi_sparc_get_pc:')
77 print('\t add\t%o7, %g2, %g2')
78 print('\t.size\t__glapi_sparc_get_pc, .-__glapi_sparc_get_pc')
80 print('#ifdef GLX_USE_TLS')
82 print('\tGLOBL_FN(__glapi_sparc_get_dispatch)')
83 print('\tHIDDEN(__glapi_sparc_get_dispatch)')
84 print('__glapi_sparc_get_dispatch:')
85 print('\tmov\t%o7, %g1')
86 print('\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2')
87 print('\tcall\t__glapi_sparc_get_pc')
88 print('\tadd\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2')
89 print('\tmov\t%g1, %o7')
90 print('\tsethi\t%tie_hi22(_glapi_tls_Dispatch), %g1')
91 print('\tadd\t%g1, %tie_lo10(_glapi_tls_Dispatch), %g1')
92 print('\tGL_LL\t[%g2 + %g1], %g2, GL_TIE_LD(_glapi_tls_Dispatch)')
94 print('\t mov\t%g2, %o0')
99 print('\t/* --> sethi %hi(_glapi_tls_Dispatch), %g1 */')
100 print('\t/* --> or %g1, %lo(_glapi_tls_Dispatch), %g1 */')
101 print('\tGLOBL_FN(__glapi_sparc_tls_stub)')
102 print('\tHIDDEN(__glapi_sparc_tls_stub)')
103 print('__glapi_sparc_tls_stub: /* Call offset in %g3 */')
104 print('\tmov\t%o7, %g1')
105 print('\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2')
106 print('\tcall\t__glapi_sparc_get_pc')
107 print('\tadd\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2')
108 print('\tmov\t%g1, %o7')
109 print('\tsrl\t%g3, 10, %g3')
110 print('\tsethi\t%tie_hi22(_glapi_tls_Dispatch), %g1')
111 print('\tadd\t%g1, %tie_lo10(_glapi_tls_Dispatch), %g1')
112 print('\tGL_LL\t[%g2 + %g1], %g2, GL_TIE_LD(_glapi_tls_Dispatch)')
113 print('\tGL_LL\t[%g7+%g2], %g1')
114 print('\tGL_LL\t[%g1 + %g3], %g1')
117 print('\t.size\t__glapi_sparc_tls_stub, .-__glapi_sparc_tls_stub')
119 print('#define GL_STUB(fn, off)\t\t\t\t\\')
120 print('\tGLOBL_FN(fn);\t\t\t\t\t\\')
121 print('fn:\tba\t__glapi_sparc_tls_stub;\t\t\t\\')
122 print('\t sethi\tGL_OFF(off), %g3;\t\t\t\\')
123 print('\t.size\tfn,.-fn;')
125 print('#elif defined(HAVE_PTHREAD)')
127 print('\t/* 64-bit 0x00 --> sethi %hh(_glapi_Dispatch), %g1 */')
128 print('\t/* 64-bit 0x04 --> sethi %lm(_glapi_Dispatch), %g2 */')
129 print('\t/* 64-bit 0x08 --> or %g1, %hm(_glapi_Dispatch), %g1 */')
130 print('\t/* 64-bit 0x0c --> sllx %g1, 32, %g1 */')
131 print('\t/* 64-bit 0x10 --> add %g1, %g2, %g1 */')
132 print('\t/* 64-bit 0x14 --> ldx [%g1 + %lo(_glapi_Dispatch)], %g1 */')
134 print('\t/* 32-bit 0x00 --> sethi %hi(_glapi_Dispatch), %g1 */')
135 print('\t/* 32-bit 0x04 --> ld [%g1 + %lo(_glapi_Dispatch)], %g1 */')
138 print('\t.align\t32')
140 print('\tGLOBL_FN(__glapi_sparc_pthread_stub)')
141 print('\tHIDDEN(__glapi_sparc_pthread_stub)')
142 print('__glapi_sparc_pthread_stub: /* Call offset in %g3 */')
143 print('\tmov\t%o7, %g1')
144 print('\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2')
145 print('\tcall\t__glapi_sparc_get_pc')
146 print('\t add\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2')
147 print('\tmov\t%g1, %o7')
148 print('\tsethi\t%hi(_glapi_Dispatch), %g1')
149 print('\tor\t%g1, %lo(_glapi_Dispatch), %g1')
150 print('\tsrl\t%g3, 10, %g3')
151 print('\tGL_LL\t[%g2+%g1], %g2')
152 print('\tGL_LL\t[%g2], %g1')
153 print('\tcmp\t%g1, 0')
156 print('1:\tGL_LL\t[%g1 + %g3], %g1')
159 print('2:\tsave\t%sp, GL_STACK_SIZE, %sp')
160 print('\tmov\t%g3, %l0')
161 print('\tcall\t_glapi_get_dispatch')
163 print('\tmov\t%o0, %g1')
164 print('\tmov\t%l0, %g3')
166 print('\t restore %g0, %g0, %g0')
167 print('\t.size\t__glapi_sparc_pthread_stub, .-__glapi_sparc_pthread_stub')
169 print('#define GL_STUB(fn, off)\t\t\t\\')
170 print('\tGLOBL_FN(fn);\t\t\t\t\\')
171 print('fn:\tba\t__glapi_sparc_pthread_stub;\t\\')
172 print('\t sethi\tGL_OFF(off), %g3;\t\t\\')
173 print('\t.size\tfn,.-fn;')
175 print('#else /* Non-threaded version. */')
177 print('\t.type __glapi_sparc_nothread_stub, @function')
178 print('__glapi_sparc_nothread_stub: /* Call offset in %g3 */')
179 print('\tmov\t%o7, %g1')
180 print('\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2')
181 print('\tcall\t__glapi_sparc_get_pc')
182 print('\t add\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2')
183 print('\tmov\t%g1, %o7')
184 print('\tsrl\t%g3, 10, %g3')
185 print('\tsethi\t%hi(_glapi_Dispatch), %g1')
186 print('\tor\t%g1, %lo(_glapi_Dispatch), %g1')
187 print('\tGL_LL\t[%g2+%g1], %g2')
188 print('\tGL_LL\t[%g2], %g1')
189 print('\tGL_LL\t[%g1 + %g3], %g1')
192 print('\t.size\t__glapi_sparc_nothread_stub, .-__glapi_sparc_nothread_stub')
194 print('#define GL_STUB(fn, off)\t\t\t\\')
195 print('\tGLOBL_FN(fn);\t\t\t\t\\')
196 print('fn:\tba\t__glapi_sparc_nothread_stub;\t\\')
197 print('\t sethi\tGL_OFF(off), %g3;\t\t\\')
198 print('\t.size\tfn,.-fn;')
202 print('#define GL_STUB_ALIAS(fn, alias) \\')
203 print(' .globl fn; \\')
204 print(' .set fn, alias')
207 print('\t.align\t32')
209 print('\t.globl\tgl_dispatch_functions_start')
210 print('\tHIDDEN(gl_dispatch_functions_start)')
211 print('gl_dispatch_functions_start:')
215 def printRealFooter(self
):
217 print('\t.globl\tgl_dispatch_functions_end')
218 print('\tHIDDEN(gl_dispatch_functions_end)')
219 print('gl_dispatch_functions_end:')
222 def printBody(self
, api
):
223 for f
in api
.functionIterateByOffset():
224 name
= f
.dispatch_name()
226 print('\tGL_STUB(gl%s, %d)' % (name
, f
.offset
))
228 if not f
.is_static_entry_point(f
.name
):
229 print('\tHIDDEN(gl%s)' % (name
))
231 for f
in api
.functionIterateByOffset():
232 name
= f
.dispatch_name()
234 if f
.is_static_entry_point(f
.name
):
235 for n
in f
.entry_points
:
237 text
= '\tGL_STUB_ALIAS(gl%s, gl%s)' % (n
, f
.name
)
239 if f
.has_different_protocol(n
):
240 print('#ifndef GLX_INDIRECT_RENDERING')
250 """Parse arguments and return a namespace."""
251 parser
= argparse
.ArgumentParser()
252 parser
.add_argument('-f',
254 default
='gl_API.xml',
255 help='An XML description of an API.')
256 return parser
.parse_args()
262 printer
= PrintGenericStubs()
264 api
= gl_XML
.parse_GL_API(args
.filename
, glX_XML
.glx_item_factory())
268 if __name__
== '__main__':