[pypy-svn] r35369 - in pypy/dist/pypy/jit/codegen/llvm: . test
ericvrp at codespeak.net
ericvrp at codespeak.net
Wed Dec 6 11:58:11 CET 2006
Author: ericvrp
Date: Wed Dec 6 11:58:08 2006
New Revision: 35369
Modified:
pypy/dist/pypy/jit/codegen/llvm/llvmjit.py
pypy/dist/pypy/jit/codegen/llvm/rgenop.py
pypy/dist/pypy/jit/codegen/llvm/test/test_llvmjit.py
pypy/dist/pypy/jit/codegen/llvm/test/test_rgenop.py
Log:
Another passing llvmjit rgenop test + quite a few opcodes implemented.
Modified: pypy/dist/pypy/jit/codegen/llvm/llvmjit.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/llvmjit.py (original)
+++ pypy/dist/pypy/jit/codegen/llvm/llvmjit.py Wed Dec 6 11:58:08 2006
@@ -67,9 +67,13 @@
getNamedGlobal.argtypes = [c_char_p]
getPointerToFunction = llvmjit.getPointerToFunction
-getPointerToFunction.restype = c_void_p
+getPointerToFunction.restype = c_void_p
getPointerToFunction.argtypes = [c_void_p]
+getPointerToFunctionAsInt = llvmjit.getPointerToFunction
+getPointerToFunctionAsInt.restype = c_int
+getPointerToFunctionAsInt.argtypes = [c_void_p]
+
freeMachineCodeForFunction = llvmjit.freeMachineCodeForFunction
freeMachineCodeForFunction.restype = c_int
freeMachineCodeForFunction.argtypes = [c_void_p]
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 Wed Dec 6 11:58:08 2006
@@ -10,14 +10,14 @@
pass
-n_vars = 0
+n_vars = [0]
class Var(GenVar):
def __init__(self):
global n_vars
- self.name = '%v' + str(n_vars)
- n_vars += 1
+ self.name = '%v' + str(n_vars[0])
+ n_vars[0] += 1
def operand(self):
return 'int ' + self.name
@@ -165,8 +165,14 @@
class Builder(object): #changed baseclass from (GenBuilder) for better error messages
+ _genop2_generics = {
+ 'int_add' : 'add' , 'int_sub' : 'sub' , 'int_mul' : 'mul' , 'int_floordiv' : 'div' ,
+ 'int_mod' : 'rem' , 'int_and' : 'and' , 'int_or' : 'or' , 'int_xor' : 'xor' ,
+ 'int_lt' : 'setlt', 'int_le' : 'setle', 'int_eq' : 'seteq', 'int_ne' : 'setne',
+ 'int_gt' : 'setgt', 'int_ge' : 'setge'
+ }
+
def __init__(self, rgenop):
- log('Builder.__init__')
self.rgenop = rgenop
self.asm = [] #list of llvm assembly source code lines
@@ -180,45 +186,45 @@
log(asm_string)
llvmjit.parse(asm_string)
function = llvmjit.getNamedFunction(self.rgenop.name)
- entrypoint = llvmjit.getPointerToFunction(function)
+ entrypoint = llvmjit.getPointerToFunctionAsInt(function) #how to cast a ctypes ptr to int?
self.rgenop.gv_entrypoint.value = entrypoint
- #print self.rgenop.name, 'entrypoint', entrypoint
- #print self.rgenop.gv_entrypoint, self.rgenop.gv_entrypoint.value
def _write_prologue(self, sigtoken):
- log('Builder._write_prologue')
numargs = sigtoken # for now
inputargs_gv = [Var() for i in range(numargs)]
self.asm.append('int %%%s(%s){' % (
self.rgenop.name, ','.join([v.operand() for v in inputargs_gv])))
return inputargs_gv
- def _close(self):
- log('Builder._close')
- #self.mc.done()
- #self.rgenop.close_mc(self.mc)
- #self.mc = None
-
@specialize.arg(1)
def genop1(self, opname, gv_arg):
- log('Builder.genop1')
+ #log('Builder.genop1')
genmethod = getattr(self, 'op_' + opname)
return genmethod(gv_arg)
@specialize.arg(1)
def genop2(self, opname, gv_arg1, gv_arg2):
- log('Builder.genop2')
- genmethod = getattr(self, 'op_' + opname)
- return genmethod(gv_arg1, gv_arg2)
+ #log('Builder.genop2')
+ if opname in self._genop2_generics:
+ return self._rgenop2_generic(self._genop2_generics[opname], gv_arg1, gv_arg2)
+ else:
+ genmethod = getattr(self, 'op_' + opname)
+ return genmethod(gv_arg1, gv_arg2)
- def op_int_add(self, gv_x, gv_y):
- log('Builder.op_int_add')
+ def _rgenop2_generic(self, llvm_opcode, gv_arg1, gv_arg2):
+ log('Builder._rgenop2_generic: ' + llvm_opcode)
gv_result = Var()
- self.asm.append(" %s=add %s,%s" % (gv_result.name, gv_x.operand(), gv_y.operand2()))
+ self.asm.append(" %s=%s %s,%s" % (
+ gv_result.name, llvm_opcode, gv_arg1.operand(), gv_arg2.operand2()))
return gv_result
- #self.mc.MOV(eax, gv_x.operand(self))
- #self.mc.ADD(eax, gv_y.operand(self))
- #return self.returnvar(eax)
+
+ #def op_int_neg(self, gv_x):
+ #def op_int_abs(self, gv_x):
+ #def op_int_invert(self, gv_x):
+ #def op_int_lshift(self, gv_x, gv_y):
+ #def op_int_rshift(self, gv_x, gv_y):
+ #def op_bool_not(self, gv_x):
+ #def op_cast_bool_to_int(self, gv_x):
def enter_next_block(self, kinds, args_gv):
log('Builder.enter_next_block TODO')
@@ -243,19 +249,19 @@
#self.mc.MOV(eax, gv_returnvar.operand(self))
#self.mc.ADD(esp, imm(WORD * (self.stackdepth - initialstackdepth)))
#self.mc.RET()
- self._close()
+ #self._close()
def finish_and_goto(self, outputargs_gv, target):
log('Builder.finish_and_goto TODO')
#remap_stack_layout(self, outputargs_gv, target)
#self.mc.JMP(rel32(target.startaddr))
- self._close()
+ #self._close()
def flexswitch(self, gv_exitswitch):
log('Builder.flexswitch TODO')
result = FlexSwitch(self.rgenop)
result.initialize(self, gv_exitswitch)
- self._close()
+ #self._close()
return result
def show_incremental_progress(self):
@@ -274,7 +280,7 @@
# the public RGenOp interface
def openbuilder(self):
- log('RLLVMGenOp.openbuilder')
+ #log('RLLVMGenOp.openbuilder')
return Builder(self)
def newgraph(self, sigtoken, name):
@@ -282,9 +288,8 @@
numargs = sigtoken # for now
self.name = name
builder = self.openbuilder()
- #entrypoint = builder.asm.mc.tell()
- self.gv_entrypoint = IntConst(0)
inputargs_gv = builder._write_prologue(sigtoken)
+ self.gv_entrypoint = IntConst(0) #note: updated by Builder.end() (i.e after compilation)
return builder, self.gv_entrypoint, inputargs_gv
@specialize.genconst(1)
Modified: pypy/dist/pypy/jit/codegen/llvm/test/test_llvmjit.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llvm/test/test_llvmjit.py (original)
+++ pypy/dist/pypy/jit/codegen/llvm/test/test_llvmjit.py Wed Dec 6 11:58:08 2006
@@ -1,7 +1,12 @@
import py
from sys import platform
from os.path import dirname, join
-from pypy.translator.c.test.test_genc import compile
+
+try:
+ from pypy.translator.c.test.test_genc import compile
+ import_error = False #XXX temporary HACK until problem solves itself.
+except AttributeError: #AttributeError: Values instance has no attribute 'gcpolicy'
+ import_error = True #pypy/translator/c/test/test_genc.py:289
from pypy.jit.codegen.llvm import llvmjit
@@ -243,8 +248,10 @@
pass
def test_execute_translation(): #put this one last because it takes the most time
+ if import_error:
+ py.test.skip("import error")
if platform == 'darwin':
- py.test.skip('dynamic vs. static library issue. see: http://www.cocoadev.com/index.pl?ApplicationLinkingIssues for more information (needs to be fixed)')
+ py.test.skip('dynamic vs. static library issue on Darwin. see: http://www.cocoadev.com/index.pl?ApplicationLinkingIssues for more information (FIXME)')
llvmjit.restart()
def f(x):
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 Wed Dec 6 11:58:08 2006
@@ -1,31 +1,23 @@
import py
from pypy.jit.codegen.llvm.rgenop import RLLVMGenOp
from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests
-from pypy.rpython.lltypesystem import lltype
-from ctypes import c_void_p, cast, CFUNCTYPE, c_int
+from sys import platform
-FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
+class TestRLLVMGenop(AbstractRGenOpTests):
+ RGenOp = RLLVMGenOp
-def make_adder(rgenop, n):
- # 'return x+n'
- sigtoken = rgenop.sigToken(FUNC)
- builder, gv_add_one, [gv_x] = rgenop.newgraph(sigtoken, "adder")
- #note: entrypoint (gv_add_one.value) gets updated by builder.end() (don't use before that!)
- gv_result = builder.genop2("int_add", gv_x, rgenop.genconst(n))
- builder.finish_and_return(sigtoken, gv_result)
- builder.end()
- return gv_add_one
-
-def test_adder_direct():
- rgenop = RLLVMGenOp()
- gv_add_5 = make_adder(rgenop, 5)
- fnptr = cast(c_void_p(gv_add_5.value), CFUNCTYPE(c_int, c_int))
- #fnptr = gv_add_5.revealconst(lltype.Ptr(FUNC))
- res = fnptr(37)
- assert res == 42
+ def compile(self, runner, argtypes):
+ if platform == 'darwin':
+ py.test.skip('Compilation for Darwin not fully support yet (static/dyn lib issue')
+ super(TestRLLVMGenop, self).compile(runner.argtypes)
-#class TestRLLVMGenop(AbstractRGenOpTests):
-# RGenOp = RLLVMGenOp
+ def test_branching_direct(self):
+ py.test.skip('WIP')
+ test_goto_direct = test_branching_direct
+ test_if_direct = test_branching_direct
+ test_switch_direct = test_branching_direct
+ test_large_switch_direct = test_branching_direct
+ test_fact_direct = test_branching_direct
More information about the Pypy-commit
mailing list