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

ericvrp at codespeak.net ericvrp at codespeak.net
Thu Dec 7 11:58:31 CET 2006


Author: ericvrp
Date: Thu Dec  7 11:58:29 2006
New Revision: 35421

Modified:
   pypy/dist/pypy/jit/codegen/llvm/lib/libllvmjit.cpp
   pypy/dist/pypy/jit/codegen/llvm/rgenop.py
   pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py
Log:
llvmjit rgenop intermediate checkin


Modified: pypy/dist/pypy/jit/codegen/llvm/lib/libllvmjit.cpp
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/lib/libllvmjit.cpp	(original)
+++ pypy/dist/pypy/jit/codegen/llvm/lib/libllvmjit.cpp	Thu Dec  7 11:58:29 2006
@@ -146,7 +146,7 @@
     if (!module) {
         int line, col;
         parse_error.getErrorLocation(line, col);
-        std::cerr << "Parse error:\n" << llsource << "\n" << "Error: " << parse_error.getRawMessage() << ":" << line << "," << col << "\n" << std::flush;
+        std::cerr << "\n" << llsource << "\n" << "Error: " << parse_error.getRawMessage() << ":" << line << "," << col << "\n" << std::flush;
         return false;
     }
 

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	Thu Dec  7 11:58:29 2006
@@ -76,12 +76,19 @@
     #repr?
 
 
+n_labels = [0]
+
 class Label(GenLabel):
 
-    def __init__(self, startaddr, arg_positions, stackdepth):
-        self.startaddr = startaddr
-        self.arg_positions = arg_positions
-        self.stackdepth = stackdepth
+    def __init__(self):
+        self.label = n_labels[0]
+        n_labels[0] += 1
+
+    def operand(self):
+        return 'label %%L%d' % self.label
+
+    def operand2(self):
+        return 'L%d:' % self.label
 
 
 class FlexSwitch(CodeGenSwitch):
@@ -175,6 +182,8 @@
     def __init__(self, rgenop):
         self.rgenop = rgenop
         self.asm = [] #list of llvm assembly source code lines
+        self.label = Label()
+        self._prev_block_closed = False #XXX might be a problem with empty blocks
 
     # ----------------------------------------------------------------
     # The public Builder interface
@@ -183,8 +192,9 @@
         log('Builder.end')
         self.asm.append('}')
         asm_string = '\n'.join(self.asm)
-        log(asm_string)
+        #log(asm_string)
         llvmjit.parse(asm_string)
+        llvmjit.transform(3) #optimize module (should be on functions actually)
         function   = llvmjit.getNamedFunction(self.rgenop.name)
         entrypoint = llvmjit.getPointerToFunctionAsInt(function) #how to cast a ctypes ptr to int?
         self.rgenop.gv_entrypoint.value = entrypoint
@@ -214,8 +224,8 @@
     def _rgenop2_generic(self, llvm_opcode, gv_arg1, gv_arg2):
         log('Builder._rgenop2_generic: ' + llvm_opcode)
         gv_result = Var()
-        self.asm.append(" %s=%s %s,%s" % (
-            gv_result.name, llvm_opcode, gv_arg1.operand(), gv_arg2.operand2()))
+        self.asm.append(' %s=%s %s,%s' % (
+            gv_result.operand2(), llvm_opcode, gv_arg1.operand(), gv_arg2.operand2()))
         return gv_result
 
     #def op_int_neg(self, gv_x):
@@ -227,7 +237,14 @@
     #def op_cast_bool_to_int(self, gv_x):
 
     def enter_next_block(self, kinds, args_gv):
-        log('Builder.enter_next_block TODO')
+        self.label = Label()
+        log('Builder.enter_next_block %s' % self.label.operand2())
+        if not self._prev_block_closed: #there are not always explicit branches to blocks
+            self.asm.append(' br ' + self.label.operand())
+        self.asm.append(self.label.operand2())
+        self.asm.append(' ;phi %s,%s' % (kinds, [a.operand() for a in args_gv]))
+        self._prev_block_closed = False #easiest, but might be a problem with empty blocks
+        return self.label
         #arg_positions = []
         #seen = {}
         #for i in range(len(args_gv)):
@@ -241,8 +258,33 @@
         #    seen[gv.stackpos] = None
         #return Label(self.mc.tell(), arg_positions, self.stackdepth)
 
+    def jump_if_true(self, gv_condition):
+        log('Builder.jump_if_true')
+        targetbuilder = self.rgenop.openbuilder() #self._fork()
+        #XXX will need to keep type (bool/int/float/...) of Vars
+        no_branch = Label()
+        self.asm.append(' br bool %s,%s,%s' % (
+            gv_condition.operand2(), targetbuilder.label.operand(), no_branch.operand()))
+        self.asm.append(no_branch.operand2())
+        #self.mc.CMP(gv_condition.operand(self), imm8(0))
+        #self.mc.JNE(rel32(targetbuilder.mc.tell()))
+        self._prev_block_closed = True
+        return targetbuilder
+
+    def op_int_is_true(self, gv_x):
+        log('Build.op_int_is_true ' + gv_x.operand())
+        self.asm.append( ' ;op_int_is_true ' + gv_x.operand())
+        return gv_x
+
+    def genop_call(self, sigtoken, gv_fnptr, args_gv):
+        log('Builder.genop_call')
+        gv_returnvar = Var()
+        self.asm.append(' ;genop_call %s,%s,%s' % (
+            sigtoken, gv_fnptr, [a.operand() for a in args_gv]))
+        return gv_returnvar
+    
     def finish_and_return(self, sigtoken, gv_returnvar):
-        log('Builder.finish_and_return')
+        log('Builder.finish_and_return %s,%s' % (sigtoken, gv_returnvar.operand()))
         self.asm.append(' ret ' + gv_returnvar.operand())
         #numargs = sigtoken      # for now
         #initialstackdepth = numargs + 1
@@ -250,18 +292,23 @@
         #self.mc.ADD(esp, imm(WORD * (self.stackdepth - initialstackdepth)))
         #self.mc.RET()
         #self._close()
+        self._prev_block_closed = True
 
     def finish_and_goto(self, outputargs_gv, target):
-        log('Builder.finish_and_goto TODO')
+        log('Builder.finish_and_goto %s,%s' % ([a.operand() for a in outputargs_gv], target))
+        self.asm.append(' ;finish_and_goto %s,%s' % ([a.operand() for a in outputargs_gv], target))
         #remap_stack_layout(self, outputargs_gv, target)
         #self.mc.JMP(rel32(target.startaddr))
         #self._close()
+        self._prev_block_closed = True
 
     def flexswitch(self, gv_exitswitch):
-        log('Builder.flexswitch TODO')
+        log('Builder.flexswitch ' + gv_exitswitch.operand())
+        self.asm.append(' ;flexswitch ' + gv_exitswitch.operand())
         result = FlexSwitch(self.rgenop)
         result.initialize(self, gv_exitswitch)
         #self._close()
+        self._prev_block_closed = True
         return result
 
     def show_incremental_progress(self):

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	Thu Dec  7 11:58:29 2006
@@ -11,7 +11,7 @@
         if platform == 'darwin':
             py.test.skip('Compilation for Darwin not fully support yet (static/dyn lib issue')
 
-        super(TestRLLVMGenop, self).compile(runner.argtypes)
+        return super(TestRLLVMGenop, self).compile(runner, argtypes)
 
     def test_branching_direct(self):
         py.test.skip('WIP')



More information about the Pypy-commit mailing list