[pypy-svn] r35844 - in pypy/dist/pypy/jit/codegen/llvm: . test

ericvrp at codespeak.net ericvrp at codespeak.net
Mon Dec 18 11:55:14 CET 2006


Author: ericvrp
Date: Mon Dec 18 11:55:12 2006
New Revision: 35844

Modified:
   pypy/dist/pypy/jit/codegen/llvm/rgenop.py
   pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py
Log:
Switch support for jit/codegen/llvm


Modified: pypy/dist/pypy/jit/codegen/llvm/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/llvm/rgenop.py	Mon Dec 18 11:55:12 2006
@@ -201,83 +201,37 @@
         lines.append('}')
 
 
-class FlexSwitch(CodeGenSwitch):
+class FlexSwitch(Block):
 
-    def __init__(self, rgenop):
-        log('FlexSwitch.__init__')
+    def __init__(self, rgenop, builder, gv_exitswitch):
+        log('%s FlexSwitch.__init__ %s' % (builder.block.label, gv_exitswitch.operand()))
         self.rgenop = rgenop
-        #self.default_case_addr = 0
+        self.builder = builder
+        self.gv_exitswitch = gv_exitswitch
 
-    def initialize(self, builder, gv_exitswitch):
-        log('FlexSwitch.initialize TODO')
-        #mc = builder.mc
-        #mc.MOV(eax, gv_exitswitch.operand(builder))
-        #self.saved_state = builder._save_state()
-        #self._reserve(mc)
-
-    def _reserve(self, mc):
-        log('FlexSwitch._reserve TODO')
-        #RESERVED = 11*4+5      # XXX quite a lot for now :-/
-        #pos = mc.tell()
-        #mc.UD2()
-        #mc.write('\x00' * (RESERVED-1))
-        #self.nextfreepos = pos
-        #self.endfreepos = pos + RESERVED
-
-    def _reserve_more(self):
-        log('FlexSwitch._reserve_more TODO')
-        #start = self.nextfreepos
-        #end   = self.endfreepos
-        #newmc = self.rgenop.open_mc()
-        #self._reserve(newmc)
-        #self.rgenop.close_mc(newmc)
-        #fullmc = InMemoryCodeBuilder(start, end)
-        #fullmc.JMP(rel32(self.nextfreepos))
-        #fullmc.done()
+        self.default_label = None
+        self.cases = []
+
+        self.rgenop.blocklist.append(self)
 
     def add_case(self, gv_case):
-        log('FlexSwitch.add_case TODO')
-        #rgenop = self.rgenop
-        #targetbuilder = Builder._new_from_state(rgenop, self.saved_state)
-        #target_addr = targetbuilder.mc.tell()
-        #try:
-        #    self._add_case(gv_case, target_addr)
-        #except CodeBlockOverflow:
-        #    self._reserve_more()
-        #    self._add_case(gv_case, target_addr)
-        #return targetbuilder
-
-    def _add_case(self, gv_case, target_addr):
-        log('FlexSwitch._add_case TODO')
-        #start = self.nextfreepos
-        #end   = self.endfreepos
-        #mc = InMemoryCodeBuilder(start, end)
-        #mc.CMP(eax, gv_case.operand(None))
-        #mc.JE(rel32(target_addr))
-        #pos = mc.tell()
-        #if self.default_case_addr:
-        #    mc.JMP(rel32(self.default_case_addr))
-        #else:
-        #    illegal_start = mc.tell()
-        #    mc.JMP(rel32(0))
-        #    ud2_addr = mc.tell()
-        #    mc.UD2()
-        #    illegal_mc = InMemoryCodeBuilder(illegal_start, end)
-        #    illegal_mc.JMP(rel32(ud2_addr))
-        #mc.done()
-        #self.nextfreepos = pos
+        targetbuilder = self.builder._fork()
+        self.cases.append('%s,label %%%s' % (gv_case.operand(), targetbuilder.nextlabel))
+        log('%s FlexSwitch.add_case %s => %s' % (
+            self.builder.block.label, gv_case.operand(), targetbuilder.nextlabel))
+        return targetbuilder
 
     def add_default(self):
-        log('FlexSwitch.add_default TODO')
-        #rgenop = self.rgenop
-        #targetbuilder = Builder._new_from_state(rgenop, self.saved_state)
-        #self.default_case_addr = targetbuilder.mc.tell()
-        #start = self.nextfreepos
-        #end   = self.endfreepos
-        #mc = InMemoryCodeBuilder(start, end)
-        #mc.JMP(rel32(self.default_case_addr))
-        #mc.done()
-        #return targetbuilder
+        targetbuilder = self.builder._fork()
+        self.default_label = targetbuilder.nextlabel
+        log('%s FlexSwitch.add_default => %s' % (
+            self.builder.block.label, targetbuilder.nextlabel))
+        return targetbuilder
+
+    def writecode(self, lines):
+        #note: gv_exitswitch should be an integer! (cast might be required here)
+        lines.append(' switch %s,label %%%s [%s]' % (
+                self.gv_exitswitch.operand(), self.default_label, ' '.join(self.cases)))
 
 
 class Builder(object):  #changed baseclass from (GenBuilder) for better error messages
@@ -298,6 +252,12 @@
     def end(self):
         self.rgenop.end()      # XXX Hack to be removed!
 
+    def pause(self):
+        log('%s Builder.pause' % self.block.label)
+
+    def resume(self):
+        log('%s Builder.resume' % self.block.label)
+
     # ----------------------------------------------------------------
     # The public Builder interface
 
@@ -489,9 +449,10 @@
     #/XXX
 
     def enter_next_block(self, kinds, args_gv):
-        # if nextlabel is None, it means that we are currently
-        # generating a block; in this case we need to put a br
-        # to go to the next block
+        # if nextlabel is None, it means that we still need to
+        # properly terminate the current block (with a br to go
+        # to the next block)
+        # see: http://llvm.org/docs/LangRef.html#terminators
         if self.nextlabel is None:
             self.nextlabel = count.newlabel()
             self.asm.append(' br label %%%s' % (self.nextlabel,))
@@ -675,15 +636,7 @@
 
     def flexswitch(self, gv_exitswitch):
         log('%s Builder.flexswitch %s' % (self.block.label, gv_exitswitch.operand()))
-        self.asm.append(' ;flexswitch ' + gv_exitswitch.operand())
-        result = FlexSwitch(self.rgenop)
-        result.initialize(self, gv_exitswitch)
-        self._close()
-        return result
-
-    def show_incremental_progress(self):
-        log('%s Builder.show_incremental_progress' % self.label.operand())
-        pass
+        return FlexSwitch(self.rgenop, self, gv_exitswitch)
 
 
 class RLLVMGenOp(object):   #changed baseclass from (AbstractRGenOp) for better error messages

Modified: pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py	Mon Dec 18 11:55:12 2006
@@ -15,9 +15,3 @@
         py.test.skip('WIP')
 
     test_fact_compile = skip #XXX Blocked block, introducted by this checkin (I don't understand)
-
-    test_switch_direct  = skip
-    test_switch_compile = skip
-
-    test_large_switch_direct  = skip
-    test_large_switch_compile = skip



More information about the Pypy-commit mailing list