[pypy-svn] r36360 - pypy/dist/pypy/jit/codegen/llvm

arigo at codespeak.net arigo at codespeak.net
Tue Jan 9 16:00:11 CET 2007


Author: arigo
Date: Tue Jan  9 16:00:09 2007
New Revision: 36360

Added:
   pypy/dist/pypy/jit/codegen/llvm/conftest.py
      - copied unchanged from r36307, pypy/dist/pypy/jit/codegen/llvm/conftest.py
Modified:
   pypy/dist/pypy/jit/codegen/llvm/rgenop.py
Log:
Adapt jit/codegen/llvm to the new rgenop interface.


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	Tue Jan  9 16:00:09 2007
@@ -309,13 +309,15 @@
         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))
+        targetbuilder.start_writing()
         return targetbuilder
 
-    def add_default(self):
+    def _add_default(self):
         targetbuilder = self.builder._fork()
         self.default_label = targetbuilder.nextlabel
         log('%s FlexSwitch.add_default => %s' % (
             self.builder.block.label, targetbuilder.nextlabel))
+        targetbuilder.start_writing()
         return targetbuilder
 
     def writecode(self, lines):
@@ -324,7 +326,7 @@
                 self.gv_exitswitch.operand(), self.default_label, ' '.join(self.cases)))
 
 
-class Builder(object):  #changed baseclass from (GenBuilder) for better error messages
+class Builder(GenBuilder):
 
     def __init__(self, rgenop, coming_from):
         self.rgenop = rgenop
@@ -342,11 +344,24 @@
     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)
+    def pause_writing(self, args_gv):
+        log('%s Builder.pause_writing' % self.block.label)
+        assert self.asm is not None
+        self.nextlabel = count.newlabel()   # for the next block
+        self.asm.append(' br label %%%s' % (self.nextlabel,))
+        self.asm = None
+        return self
+
+    def start_writing(self):
+        log('%s Builder.start_writing' % self.nextlabel)
+        assert self.nextlabel is not None
+        coming_from = self.block
+        # prepare the next block
+        nextblock = BasicBlock(self.rgenop, self.nextlabel, [])
+        self.block     = nextblock
+        self.asm       = nextblock.asm
+        self.nextlabel = None
+        nextblock.add_incoming_link(coming_from, [])
 
     # ----------------------------------------------------------------
     # The public Builder interface
@@ -589,24 +604,19 @@
     #/XXX
 
     def enter_next_block(self, kinds, args_gv):
-        # 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,))
+        assert self.nextlabel is None
         coming_from = self.block
-        log('%s Builder leave block %s' % (
-            coming_from.label, [v.operand() for v in args_gv]))
-
+        newlabel = count.newlabel()
+        # 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
+        self.asm.append(' br label %%%s' % (newlabel,))
         # prepare the next block
-        nextblock = BasicBlock(self.rgenop, self.nextlabel, kinds)
+        nextblock = BasicBlock(self.rgenop, newlabel, kinds)
         log('%s Builder enter block %s' % (
             nextblock.label, [v.operand() for v in nextblock.inputargs]))
-        self.block     = nextblock
-        self.asm       = nextblock.asm
-        self.nextlabel = None
+        self.block = nextblock
+        self.asm   = nextblock.asm
 
         # link the two blocks together and update args_gv
         nextblock.add_incoming_link(coming_from, args_gv)
@@ -615,20 +625,22 @@
 
         return self.block
 
-    def jump_if_false(self, gv_condition):
+    def jump_if_false(self, gv_condition, args_for_jump_gv):
         log('%s Builder.jump_if_false %s' % (self.block.label, gv_condition.operand()))
         targetbuilder = self._fork()
         self.nextlabel = count.newlabel()
         self.asm.append(' br %s,label %%%s,label %%%s' % (
             gv_condition.operand(), self.nextlabel, targetbuilder.nextlabel))
+        self.start_writing()
         return targetbuilder
 
-    def jump_if_true(self, gv_condition):
+    def jump_if_true(self, gv_condition, args_for_jump_gv):
         log('%s Builder.jump_if_true %s' % (self.block.label, gv_condition.operand()))
         targetbuilder = self._fork()
         self.nextlabel = count.newlabel()
         self.asm.append(' br %s,label %%%s,label %%%s' % (
             gv_condition.operand(), targetbuilder.nextlabel, self.nextlabel))
+        self.start_writing()
         return targetbuilder
 
     def _is_false(self, gv_x, nullstr='0'):
@@ -857,9 +869,10 @@
         target.add_incoming_link(self.block, outputargs_gv)
         self._close()
 
-    def flexswitch(self, gv_exitswitch):
+    def flexswitch(self, gv_exitswitch, args_gv):
         log('%s Builder.flexswitch %s' % (self.block.label, gv_exitswitch.operand()))
-        return FlexSwitch(self.rgenop, self, gv_exitswitch)
+        flexswitch = FlexSwitch(self.rgenop, self, gv_exitswitch)
+        return flexswitch, flexswitch._add_default()
 
 
 class RLLVMGenOp(object):   #changed baseclass from (AbstractRGenOp) for better error messages
@@ -926,7 +939,7 @@
         self.funcsig[n] = '%s %%%s' % (restype, name)
         self.gv_entrypoint = IntConst(n)    #note: updated by Builder.end() (i.e after compilation)
         args = list(prologueblock.inputargs)
-        builder.enter_next_block(argtypes, args)
+        builder.start_writing()
         return builder, self.gv_entrypoint, args
 
     @specialize.genconst(1)



More information about the Pypy-commit mailing list