[pypy-svn] r35429 - pypy/dist/pypy/jit/codegen/llvm
ericvrp at codespeak.net
ericvrp at codespeak.net
Thu Dec 7 13:14:24 CET 2006
Author: ericvrp
Date: Thu Dec 7 13:14:22 2006
New Revision: 35429
Modified:
pypy/dist/pypy/jit/codegen/llvm/rgenop.py
Log:
llvmjit rgenop..
* some fixes for blocks that are still open before a label
* more/better debug output
* opcode fixes (cast->trunc and div->sdiv)
* added op_int_is_true
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 13:14:22 2006
@@ -175,7 +175,7 @@
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_add' : 'add' , 'int_sub' : 'sub' , 'int_mul' : 'mul' , 'int_floordiv' : 'sdiv' ,
'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'
@@ -191,7 +191,7 @@
# The public Builder interface
def end(self):
- log('Builder.end')
+ log('Builder.end ' + self.label.operand2())
self.asm.append('}')
asm_string = '\n'.join(self.asm)
#log(asm_string)
@@ -206,17 +206,30 @@
inputargs_gv = [Var() for i in range(numargs)]
self.asm.append('int %%%s(%s){' % (
self.rgenop.name, ','.join([str(v) for v in inputargs_gv])))
+ self.asm.append(Label().operand2())
return inputargs_gv
+ def _close(self):
+ #XXX should builder take the 'asm' list as a parameter (same function as 'mc' in ri386)?
+ log('Builder._close')
+ self._prev_block_closed = True
+ #self.mc.done()
+ #self.rgenop.close_mc(self.mc)
+ #self.mc = None
+
+ def _fork(self):
+ log('Builder._fork')
+ return self.rgenop.openbuilder()
+
@specialize.arg(1)
def genop1(self, opname, gv_arg):
- #log('Builder.genop1')
+ #log('Builder.genop1 ' + self.label.operand2())
genmethod = getattr(self, 'op_' + opname)
return genmethod(gv_arg)
@specialize.arg(1)
def genop2(self, opname, gv_arg1, gv_arg2):
- #log('Builder.genop2')
+ #log('Builder.genop2 ' + self.label.operand2())
if opname in self._genop2_generics:
return self._rgenop2_generic(self._genop2_generics[opname], gv_arg1, gv_arg2)
else:
@@ -224,7 +237,7 @@
return genmethod(gv_arg1, gv_arg2)
def _rgenop2_generic(self, llvm_opcode, gv_arg1, gv_arg2):
- log('Builder._rgenop2_generic: ' + llvm_opcode)
+ log('Builder._rgenop2_generic %s,%s' % (self.label.operand2(), llvm_opcode))
gv_result = Var()
self.asm.append(' %s=%s %s,%s' % (
gv_result.operand2(), llvm_opcode, gv_arg1, gv_arg2.operand2()))
@@ -260,60 +273,70 @@
# seen[gv.stackpos] = None
#return Label(self.mc.tell(), arg_positions, self.stackdepth)
+ def jump_if_false(self, gv_condition):
+ log('Builder.jump_if_false%s,%s' % (self.label.operand2(), gv_condition))
+ targetbuilder = self._fork()
+ no_branch = Label()
+ #XXX will need to keep type of Vars to get rid of the hardcoded 'bool' in the next line
+ self.asm.append(' br bool %s,%s,%s' % (
+ gv_condition.operand2(), no_branch, targetbuilder.label))
+ self.asm.append(no_branch.operand2())
+ #self.mc.CMP(gv_condition.operand(self), imm8(0))
+ #self.mc.JNE(rel32(targetbuilder.mc.tell()))
+ return targetbuilder
+
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
+ log('Builder.jump_if_true %s,%s' % (self.label.operand2(), gv_condition))
+ targetbuilder = self._fork()
no_branch = Label()
+ #XXX will need to keep type (bool/int/float/...) of Vars
self.asm.append(' br bool %s,%s,%s' % (
gv_condition.operand2(), targetbuilder.label, no_branch))
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 ' + str(gv_x))
self.asm.append( ' ;op_int_is_true ' + str(gv_x))
- return gv_x
+ gv_result = Var() #XXX need to mark it a 'bool' somehow
+ self.asm.append(' %s=trunc %s to bool' % (gv_result.operand2(), gv_x))
+ return gv_result
def genop_call(self, sigtoken, gv_fnptr, args_gv):
- log('Builder.genop_call')
+ log('Builder.genop_call ' + self.label.operand2())
gv_returnvar = Var()
self.asm.append(' ;genop_call %s,%s,%s' % (sigtoken, gv_fnptr, args_gv))
return gv_returnvar
def finish_and_return(self, sigtoken, gv_returnvar):
- log('Builder.finish_and_return %s,%s' % (sigtoken, gv_returnvar))
+ log('Builder.finish_and_return %s,%s,%s' % (self.label.operand2(), sigtoken, gv_returnvar))
self.asm.append(' ret ' + str(gv_returnvar))
#numargs = sigtoken # for now
#initialstackdepth = numargs + 1
#self.mc.MOV(eax, gv_returnvar.operand(self))
#self.mc.ADD(esp, imm(WORD * (self.stackdepth - initialstackdepth)))
#self.mc.RET()
- #self._close()
- self._prev_block_closed = True
+ self._close()
def finish_and_goto(self, outputargs_gv, target):
- log('Builder.finish_and_goto %s,%s' % (outputargs_gv, target))
+ log('Builder.finish_and_goto %s,%s,%s' % (self.label.operand2(), outputargs_gv, target))
self.asm.append(' ;finish_and_goto %s,%s' % (outputargs_gv, target))
#remap_stack_layout(self, outputargs_gv, target)
#self.mc.JMP(rel32(target.startaddr))
- #self._close()
- self._prev_block_closed = True
+ self._close()
def flexswitch(self, gv_exitswitch):
- log('Builder.flexswitch ' + str(gv_exitswitch))
+ log('Builder.flexswitch %s,%s' % (self.label.operand2(), gv_exitswitch))
self.asm.append(' ;flexswitch ' + str(gv_exitswitch))
result = FlexSwitch(self.rgenop)
result.initialize(self, gv_exitswitch)
- #self._close()
- self._prev_block_closed = True
+ self._close()
return result
def show_incremental_progress(self):
- log('Builder.show_incremental_progress')
+ log('Builder.show_incremental_progress %s' % self.label)
pass
More information about the Pypy-commit
mailing list