[pypy-svn] r51384 - in pypy/dist/pypy/jit/codegen/cli: . test
antocuni at codespeak.net
antocuni at codespeak.net
Mon Feb 11 14:25:20 CET 2008
Author: antocuni
Date: Mon Feb 11 14:25:18 2008
New Revision: 51384
Modified:
pypy/dist/pypy/jit/codegen/cli/operation.py
pypy/dist/pypy/jit/codegen/cli/rgenop.py
pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py
Log:
delay the rendering of the return blocks until the end() of the code
generation; this is needed to make the CLI verifier happy; two more
tests pass
Modified: pypy/dist/pypy/jit/codegen/cli/operation.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/operation.py (original)
+++ pypy/dist/pypy/jit/codegen/cli/operation.py Mon Feb 11 14:25:18 2008
@@ -90,7 +90,7 @@
self.inputargs_gv[i].store(self.il)
self.il.Emit(OpCodes.Br, self.label)
-class BranchIf(Operation):
+class Branch(Operation):
def __init__(self, il, gv_cond, opcode, label):
self.il = il
@@ -102,7 +102,8 @@
return None
def emit(self):
- self.gv_cond.load(self.il)
+ if self.gv_cond is not None:
+ self.gv_cond.load(self.il)
self.il.Emit(self.opcode, self.label)
class Return(Operation):
Modified: pypy/dist/pypy/jit/codegen/cli/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/cli/rgenop.py Mon Feb 11 14:25:18 2008
@@ -219,8 +219,7 @@
self.isOpen = False
self.operations = []
self.branches = []
- self.retlabel = self.il.DefineLabel()
- self.gv_returnvar = None
+ self.returnblocks = []
@specialize.arg(1)
def genop1(self, opname, gv_arg):
@@ -269,12 +268,17 @@
def appendbranch(self, branch):
self.branches.append(branch)
+ def appendreturn(self, retlabel, gv_returnvar):
+ self.returnblocks.append((retlabel, gv_returnvar))
+
def start_writing(self):
self.isOpen = True
def finish_and_return(self, sigtoken, gv_returnvar):
- self.il.Emit(OpCodes.Br, self.retlabel)
- self.gv_returnvar = gv_returnvar
+ retlabel = self.il.DefineLabel()
+ op = ops.Branch(self.il, None, OpCodes.Br, retlabel)
+ self.emit(op)
+ self.appendreturn(retlabel, gv_returnvar)
self.isOpen = False
def finish_and_goto(self, outputargs_gv, target):
@@ -289,10 +293,11 @@
for branch in self.branches:
branch.replayops()
- # render the return block for last, else the verifier could complain
- self.il.MarkLabel(self.retlabel)
- op = ops.Return(self.il, self.gv_returnvar)
- self.emit(op)
+ # render the return blocks for last, else the verifier could complain
+ for retlabel, gv_returnvar in self.returnblocks:
+ self.il.MarkLabel(retlabel)
+ op = ops.Return(self.il, gv_returnvar)
+ self.emit(op)
# build the delegate
delegate_type = sigtoken2clitype(self.sigtoken)
@@ -310,7 +315,7 @@
def _jump_if(self, gv_condition, opcode):
label = self.il.DefineLabel()
- op = ops.BranchIf(self.il, gv_condition, opcode, label)
+ op = ops.Branch(self.il, gv_condition, opcode, label)
self.emit(op)
branch = BranchBuilder(self, label)
self.appendbranch(branch)
@@ -341,17 +346,15 @@
# test_goto_compile to see why it fails
return Builder.genop2(self, opname, gv_arg1, gv_arg2)
- def finish_and_return(self, sigtoken, gv_returnvar):
- op = ops.Return(self.parent.il, gv_returnvar)
- self.emit(op)
- self.isOpen = False
-
def emit(self, op):
self.operations.append(op)
def appendbranch(self, branch):
self.parent.appendbranch(branch)
+ def appendreturn(self, retlabel, gv_returnvar):
+ self.parent.appendreturn(retlabel, gv_returnvar)
+
def replayops(self):
assert not self.isOpen
assert not self.parent.isOpen
Modified: pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py Mon Feb 11 14:25:18 2008
@@ -21,6 +21,8 @@
'test_longwinded_and',
'test_condition_result_cross_link_direct',
'test_multiple_cmps',
+ 'test_flipped_cmp_with_immediate',
+ 'test_tight_loop',
]
for p in prefixes:
More information about the Pypy-commit
mailing list