Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env python
  2.  
  3. # (C) Copyright IBM Corporation 2004
  4. # All Rights Reserved.
  5. #
  6. # Permission is hereby granted, free of charge, to any person obtaining a
  7. # copy of this software and associated documentation files (the "Software"),
  8. # to deal in the Software without restriction, including without limitation
  9. # on the rights to use, copy, modify, merge, publish, distribute, sub
  10. # license, and/or sell copies of the Software, and to permit persons to whom
  11. # the Software is furnished to do so, subject to the following conditions:
  12. #
  13. # The above copyright notice and this permission notice (including the next
  14. # paragraph) shall be included in all copies or substantial portions of the
  15. # Software.
  16. #
  17. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
  20. # IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  23. # IN THE SOFTWARE.
  24. #
  25. # Authors:
  26. #    Ian Romanick <idr@us.ibm.com>
  27.  
  28. import license
  29. import gl_XML, glX_XML
  30. import sys, getopt
  31.  
  32. class PrintGenericStubs(gl_XML.gl_print_base):
  33.     def __init__(self):
  34.         gl_XML.gl_print_base.__init__(self)
  35.         self.name = "gl_SPARC_asm.py (from Mesa)"
  36.         self.license = license.bsd_license_template % ( \
  37. """Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
  38. (C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
  39.  
  40.  
  41.     def printRealHeader(self):
  42.         print '#ifdef __arch64__'
  43.         print '#define GL_OFF(N)\t((N) * 8)'
  44.         print '#define GL_LL\t\tldx'
  45.         print '#define GL_TIE_LD(SYM)\t%tie_ldx(SYM)'
  46.         print '#define GL_STACK_SIZE\t128'
  47.         print '#else'
  48.         print '#define GL_OFF(N)\t((N) * 4)'
  49.         print '#define GL_LL\t\tld'
  50.         print '#define GL_TIE_LD(SYM)\t%tie_ld(SYM)'
  51.         print '#define GL_STACK_SIZE\t64'
  52.         print '#endif'
  53.         print ''
  54.         print '#define GLOBL_FN(x) .globl x ; .type x, @function'
  55.         print '#define HIDDEN(x) .hidden x'
  56.         print ''
  57.         print '\t.register %g2, #scratch'
  58.         print '\t.register %g3, #scratch'
  59.         print ''
  60.         print '\t.text'
  61.         print ''
  62.         print '\tGLOBL_FN(__glapi_sparc_icache_flush)'
  63.         print '\tHIDDEN(__glapi_sparc_icache_flush)'
  64.         print '\t.type\t__glapi_sparc_icache_flush, @function'
  65.         print '__glapi_sparc_icache_flush: /* %o0 = insn_addr */'
  66.         print '\tflush\t%o0'
  67.         print '\tretl'
  68.         print '\t nop'
  69.         print ''
  70.         print '\t.align\t32'
  71.         print ''
  72.         print '\t.type\t__glapi_sparc_get_pc, @function'
  73.         print '__glapi_sparc_get_pc:'
  74.         print '\tretl'
  75.         print '\t add\t%o7, %g2, %g2'
  76.         print '\t.size\t__glapi_sparc_get_pc, .-__glapi_sparc_get_pc'
  77.         print ''
  78.         print '#ifdef GLX_USE_TLS'
  79.         print ''
  80.         print '\tGLOBL_FN(__glapi_sparc_get_dispatch)'
  81.         print '\tHIDDEN(__glapi_sparc_get_dispatch)'
  82.         print '__glapi_sparc_get_dispatch:'
  83.         print '\tmov\t%o7, %g1'
  84.         print '\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2'
  85.         print '\tcall\t__glapi_sparc_get_pc'
  86.         print '\tadd\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2'
  87.         print '\tmov\t%g1, %o7'
  88.         print '\tsethi\t%tie_hi22(_glapi_tls_Dispatch), %g1'
  89.         print '\tadd\t%g1, %tie_lo10(_glapi_tls_Dispatch), %g1'
  90.         print '\tGL_LL\t[%g2 + %g1], %g2, GL_TIE_LD(_glapi_tls_Dispatch)'
  91.         print '\tretl'
  92.         print '\t mov\t%g2, %o0'
  93.         print ''
  94.         print '\t.data'
  95.         print '\t.align\t32'
  96.         print ''
  97.         print '\t/* --> sethi %hi(_glapi_tls_Dispatch), %g1 */'
  98.         print '\t/* --> or %g1, %lo(_glapi_tls_Dispatch), %g1 */'
  99.         print '\tGLOBL_FN(__glapi_sparc_tls_stub)'
  100.         print '\tHIDDEN(__glapi_sparc_tls_stub)'
  101.         print '__glapi_sparc_tls_stub: /* Call offset in %g3 */'
  102.         print '\tmov\t%o7, %g1'
  103.         print '\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2'
  104.         print '\tcall\t__glapi_sparc_get_pc'
  105.         print '\tadd\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2'
  106.         print '\tmov\t%g1, %o7'
  107.         print '\tsrl\t%g3, 10, %g3'
  108.         print '\tsethi\t%tie_hi22(_glapi_tls_Dispatch), %g1'
  109.         print '\tadd\t%g1, %tie_lo10(_glapi_tls_Dispatch), %g1'
  110.         print '\tGL_LL\t[%g2 + %g1], %g2, GL_TIE_LD(_glapi_tls_Dispatch)'
  111.         print '\tGL_LL\t[%g7+%g2], %g1'
  112.         print '\tGL_LL\t[%g1 + %g3], %g1'
  113.         print '\tjmp\t%g1'
  114.         print '\t nop'
  115.         print '\t.size\t__glapi_sparc_tls_stub, .-__glapi_sparc_tls_stub'
  116.         print ''
  117.         print '#define GL_STUB(fn, off)\t\t\t\t\\'
  118.         print '\tGLOBL_FN(fn);\t\t\t\t\t\\'
  119.         print 'fn:\tba\t__glapi_sparc_tls_stub;\t\t\t\\'
  120.         print '\t sethi\tGL_OFF(off), %g3;\t\t\t\\'
  121.         print '\t.size\tfn,.-fn;'
  122.         print ''
  123.         print '#elif defined(HAVE_PTHREAD)'
  124.         print ''
  125.         print '\t/* 64-bit 0x00 --> sethi %hh(_glapi_Dispatch), %g1 */'
  126.         print '\t/* 64-bit 0x04 --> sethi %lm(_glapi_Dispatch), %g2 */'
  127.         print '\t/* 64-bit 0x08 --> or %g1, %hm(_glapi_Dispatch), %g1 */'
  128.         print '\t/* 64-bit 0x0c --> sllx %g1, 32, %g1 */'
  129.         print '\t/* 64-bit 0x10 --> add %g1, %g2, %g1 */'
  130.         print '\t/* 64-bit 0x14 --> ldx [%g1 + %lo(_glapi_Dispatch)], %g1 */'
  131.         print ''
  132.         print '\t/* 32-bit 0x00 --> sethi %hi(_glapi_Dispatch), %g1 */'
  133.         print '\t/* 32-bit 0x04 --> ld [%g1 + %lo(_glapi_Dispatch)], %g1 */'
  134.         print ''
  135.         print '\t.data'
  136.         print '\t.align\t32'
  137.         print ''
  138.         print '\tGLOBL_FN(__glapi_sparc_pthread_stub)'
  139.         print '\tHIDDEN(__glapi_sparc_pthread_stub)'
  140.         print '__glapi_sparc_pthread_stub: /* Call offset in %g3 */'
  141.         print '\tmov\t%o7, %g1'
  142.         print '\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2'
  143.         print '\tcall\t__glapi_sparc_get_pc'
  144.         print '\t add\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2'
  145.         print '\tmov\t%g1, %o7'
  146.         print '\tsethi\t%hi(_glapi_Dispatch), %g1'
  147.         print '\tor\t%g1, %lo(_glapi_Dispatch), %g1'
  148.         print '\tsrl\t%g3, 10, %g3'
  149.         print '\tGL_LL\t[%g2+%g1], %g2'
  150.         print '\tGL_LL\t[%g2], %g1'
  151.         print '\tcmp\t%g1, 0'
  152.         print '\tbe\t2f'
  153.         print '\t nop'
  154.         print '1:\tGL_LL\t[%g1 + %g3], %g1'
  155.         print '\tjmp\t%g1'
  156.         print '\t nop'
  157.         print '2:\tsave\t%sp, GL_STACK_SIZE, %sp'
  158.         print '\tmov\t%g3, %l0'
  159.         print '\tcall\t_glapi_get_dispatch'
  160.         print '\t nop'
  161.         print '\tmov\t%o0, %g1'
  162.         print '\tmov\t%l0, %g3'
  163.         print '\tba\t1b'
  164.         print '\t restore %g0, %g0, %g0'
  165.         print '\t.size\t__glapi_sparc_pthread_stub, .-__glapi_sparc_pthread_stub'
  166.         print ''
  167.         print '#define GL_STUB(fn, off)\t\t\t\\'
  168.         print '\tGLOBL_FN(fn);\t\t\t\t\\'
  169.         print 'fn:\tba\t__glapi_sparc_pthread_stub;\t\\'
  170.         print '\t sethi\tGL_OFF(off), %g3;\t\t\\'
  171.         print '\t.size\tfn,.-fn;'
  172.         print ''
  173.         print '#else /* Non-threaded version. */'
  174.         print ''
  175.         print '\t.type  __glapi_sparc_nothread_stub, @function'
  176.         print '__glapi_sparc_nothread_stub: /* Call offset in %g3 */'
  177.         print '\tmov\t%o7, %g1'
  178.         print '\tsethi\t%hi(_GLOBAL_OFFSET_TABLE_-4), %g2'
  179.         print '\tcall\t__glapi_sparc_get_pc'
  180.         print '\t add\t%g2, %lo(_GLOBAL_OFFSET_TABLE_+4), %g2'
  181.         print '\tmov\t%g1, %o7'
  182.         print '\tsrl\t%g3, 10, %g3'
  183.         print '\tsethi\t%hi(_glapi_Dispatch), %g1'
  184.         print '\tor\t%g1, %lo(_glapi_Dispatch), %g1'
  185.         print '\tGL_LL\t[%g2+%g1], %g2'
  186.         print '\tGL_LL\t[%g2], %g1'
  187.         print '\tGL_LL\t[%g1 + %g3], %g1'
  188.         print '\tjmp\t%g1'
  189.         print '\t nop'
  190.         print '\t.size\t__glapi_sparc_nothread_stub, .-__glapi_sparc_nothread_stub'
  191.         print ''
  192.         print '#define GL_STUB(fn, off)\t\t\t\\'
  193.         print '\tGLOBL_FN(fn);\t\t\t\t\\'
  194.         print 'fn:\tba\t__glapi_sparc_nothread_stub;\t\\'
  195.         print '\t sethi\tGL_OFF(off), %g3;\t\t\\'
  196.         print '\t.size\tfn,.-fn;'
  197.         print ''
  198.         print '#endif'
  199.         print ''
  200.         print '#define GL_STUB_ALIAS(fn, alias)         \\'
  201.         print ' .globl  fn;                             \\'
  202.         print ' .set    fn, alias'
  203.         print ''
  204.         print '\t.text'
  205.         print '\t.align\t32'
  206.         print ''
  207.         print '\t.globl\tgl_dispatch_functions_start'
  208.         print '\tHIDDEN(gl_dispatch_functions_start)'
  209.         print 'gl_dispatch_functions_start:'
  210.         print ''
  211.         return
  212.  
  213.     def printRealFooter(self):
  214.         print ''
  215.         print '\t.globl\tgl_dispatch_functions_end'
  216.         print '\tHIDDEN(gl_dispatch_functions_end)'
  217.         print 'gl_dispatch_functions_end:'
  218.         return
  219.  
  220.     def printBody(self, api):
  221.         for f in api.functionIterateByOffset():
  222.             name = f.dispatch_name()
  223.  
  224.             print '\tGL_STUB(gl%s, %d)' % (name, f.offset)
  225.  
  226.             if not f.is_static_entry_point(f.name):
  227.                 print '\tHIDDEN(gl%s)' % (name)
  228.  
  229.         for f in api.functionIterateByOffset():
  230.             name = f.dispatch_name()
  231.  
  232.             if f.is_static_entry_point(f.name):
  233.                 for n in f.entry_points:
  234.                     if n != f.name:
  235.                         text = '\tGL_STUB_ALIAS(gl%s, gl%s)' % (n, f.name)
  236.  
  237.                         if f.has_different_protocol(n):
  238.                             print '#ifndef GLX_INDIRECT_RENDERING'
  239.                             print text
  240.                             print '#endif'
  241.                         else:
  242.                             print text
  243.  
  244.         return
  245.  
  246.  
  247. def show_usage():
  248.     print "Usage: %s [-f input_file_name] [-m output_mode]" % sys.argv[0]
  249.     sys.exit(1)
  250.  
  251. if __name__ == '__main__':
  252.     file_name = "gl_API.xml"
  253.     mode = "generic"
  254.  
  255.     try:
  256.         (args, trail) = getopt.getopt(sys.argv[1:], "m:f:")
  257.     except Exception,e:
  258.         show_usage()
  259.  
  260.     for (arg,val) in args:
  261.         if arg == '-m':
  262.             mode = val
  263.         elif arg == "-f":
  264.             file_name = val
  265.  
  266.     if mode == "generic":
  267.         printer = PrintGenericStubs()
  268.     else:
  269.         print "ERROR: Invalid mode \"%s\" specified." % mode
  270.         show_usage()
  271.  
  272.     api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
  273.     printer.Print(api)
  274.