[pypy-svn] r36593 - pypy/branch/i386-regalloc/pypy/jit/codegen/i386
arigo at codespeak.net
arigo at codespeak.net
Fri Jan 12 17:33:11 CET 2007
Author: arigo
Date: Fri Jan 12 17:33:10 2007
New Revision: 36593
Modified:
pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py
pypy/branch/i386-regalloc/pypy/jit/codegen/i386/ri386.py
Log:
Started support for labels. Don't force code generation at each enter_next_block().
Modified: pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py (original)
+++ pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py Fri Jan 12 17:33:10 2007
@@ -14,6 +14,8 @@
RK_WORD = 1
RK_CC = 2
+DEBUG_TRAP = conftest.option.trap
+
class Operation(GenVar):
clobbers_cc = True
@@ -46,14 +48,14 @@
dstop = allocator.get_operand(self)
except KeyError:
return # result not used
- srcop = self.get_operand(self.x)
+ srcop = allocator.get_operand(self.x)
if srcop != dstop:
+ mc = allocator.mc
try:
- self.mc.MOV(dstop, srcop)
+ mc.MOV(dstop, srcop)
except FailedToImplement:
- self.mc.MOV(ecx, srcop)
- self.mc.MOV(dstop, ecx)
- return dstop
+ mc.MOV(ecx, srcop)
+ mc.MOV(dstop, ecx)
class OpCompare1(Op1):
result_kind = RK_CC
@@ -117,23 +119,44 @@
opname = 'int_gt'
cc_result = Conditions['G']
-class JumpIfFalse(Operation):
+class JumpIf(Operation):
clobbers_cc = False
result_kind = RK_NO_RESULT
- def __init__(self, gv_condition, targetbuilder):
+ def __init__(self, gv_condition, targetbuilder, negate):
assert 0 <= gv_condition.cc_result < INSN_JMP
self.gv_condition = gv_condition
self.targetbuilder = targetbuilder
+ self.negate = negate
def allocate(self, allocator):
allocator.using_cc(self.gv_condition)
def generate(self, allocator):
- cc = cond_negate(self.gv_condition.cc_result)
+ cc = self.gv_condition.cc_result
+ if self.negate:
+ cc = cond_negate(cc)
mc = allocator.mc
targetbuilder = self.targetbuilder
targetbuilder.set_coming_from(mc, insncond=cc)
targetbuilder.inputoperands = [allocator.get_operand(gv)
for gv in targetbuilder.inputargs_gv]
+class OpLabel(Operation):
+ clobbers_cc = False
+ result_kind = RK_NO_RESULT
+ def __init__(self, lbl, args_gv):
+ self.lbl = lbl
+ self.args_gv = args_gv
+ def allocate(self, allocator):
+ for v in self.args_gv:
+ allocator.using(v)
+ def generate(self, allocator):
+ lbl = self.lbl
+ lbl.targetaddr = allocator.mc.tell()
+ lbl.inputoperands = [allocator.get_operand(v) for v in self.args_gv]
+
+class Label(GenLabel):
+ targetaddr = 0
+ inputoperands = None
+
# ____________________________________________________________
class IntConst(GenConst):
@@ -449,11 +472,20 @@
return mc
def enter_next_block(self, kinds, args_gv):
- mc = self.generate_block_code(args_gv)
- args_gv[:] = self.inputargs_gv
- self.set_coming_from(mc)
- self.rgenop.close_mc(mc)
- self.start_writing()
+## mc = self.generate_block_code(args_gv)
+## assert len(self.inputargs_gv) == len(args_gv)
+## args_gv[:len(args_gv)] = self.inputargs_gv
+## self.set_coming_from(mc)
+## self.rgenop.close_mc(mc)
+## self.start_writing()
+ for i in range(len(args_gv)):
+ op = OpSameAs(args_gv[i])
+ args_gv[i] = op
+ self.operations.append(op)
+ lbl = Label()
+ lblop = OpLabel(lbl, args_gv)
+ self.operations.append(lblop)
+ return lbl
def set_coming_from(self, mc, insncond=INSN_JMP):
self.coming_from_cond = insncond
@@ -480,7 +512,15 @@
if gv_condition.cc_result < 0:
gv_condition = OpIntIsTrue(gv_condition)
self.operations.append(gv_condition)
- self.operations.append(JumpIfFalse(gv_condition, newbuilder))
+ self.operations.append(JumpIf(gv_condition, newbuilder, negate=True))
+ return newbuilder
+
+ def jump_if_true(self, gv_condition, args_for_jump_gv):
+ newbuilder = Builder(self.rgenop, list(args_for_jump_gv), None)
+ if gv_condition.cc_result < 0:
+ gv_condition = OpIntIsTrue(gv_condition)
+ self.operations.append(gv_condition)
+ self.operations.append(JumpIf(gv_condition, newbuilder, negate=False))
return newbuilder
def finish_and_return(self, sigtoken, gv_returnvar):
@@ -548,7 +588,7 @@
# --- prologue ---
mc = self.open_mc()
entrypoint = mc.tell()
- if conftest.option.trap:
+ if DEBUG_TRAP:
mc.BREAKPOINT()
mc.PUSH(ebp)
mc.MOV(ebp, esp)
Modified: pypy/branch/i386-regalloc/pypy/jit/codegen/i386/ri386.py
==============================================================================
--- pypy/branch/i386-regalloc/pypy/jit/codegen/i386/ri386.py (original)
+++ pypy/branch/i386-regalloc/pypy/jit/codegen/i386/ri386.py Fri Jan 12 17:33:10 2007
@@ -251,6 +251,7 @@
assert len(s) in (1, 2, 4)
result = 0
shift = 0
+ char = '\x00' # flow space workaround
for char in s:
result |= ord(char) << shift
shift += 8
More information about the Pypy-commit
mailing list