[pypy-svn] r34341 - pypy/dist/pypy/jit/codegen/ppc
mwh at codespeak.net
mwh at codespeak.net
Tue Nov 7 19:54:08 CET 2006
Author: mwh
Date: Tue Nov 7 19:54:06 2006
New Revision: 34341
Modified:
pypy/dist/pypy/jit/codegen/ppc/regalloc.py
pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
do the constant -> var promotion for register operands just before register
allocation. makes code in rgenop less tedious.
Modified: pypy/dist/pypy/jit/codegen/ppc/regalloc.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/regalloc.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/regalloc.py Tue Nov 7 19:54:06 2006
@@ -89,8 +89,21 @@
self.lru.append(arg)
def allocate_for_insns(self, insns):
- # Walk through instructions in forward order
+ from pypy.jit.codegen.ppc.rgenop import IntConst, Var
+
+ insns2 = []
+
for insn in insns:
+ for i in range(len(insn.reg_args)):
+ arg = insn.reg_args[i]
+ if not isinstance(arg, Var):
+ v = Var()
+ arg.load(insns2, v)
+ insn.reg_args[i] = v
+ insns2.append(insn)
+
+ # Walk through instructions in forward order
+ for insn in insns2:
#print "Processing instruction %r with args %r and result %r:" % (insn, insn.reg_args, insn.result)
Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py Tue Nov 7 19:54:06 2006
@@ -27,8 +27,6 @@
def __init__(self):
self.__magic_index = _var_index[0]
_var_index[0] += 1
- def load(self, builder):
- return self
def __repr__(self):
return "<Var %d>" % self.__magic_index
@@ -46,12 +44,10 @@
else:
return lltype.cast_primitive(T, self.value)
- def load(self, builder):
- var = builder.newvar()
- builder.insns.append(
+ def load(self, insns, var):
+ insns.append(
insn.Insn_GPR__IMM(RPPCAssembler.load_word,
- var, [self]))
- return var
+ var, [self]))
def load_now(self, asm, loc):
if loc.is_register:
@@ -163,7 +159,7 @@
numargs = sigtoken # for now
if not we_are_translated() and option.trap:
self.asm.trap()
- inputargs = [self.newvar() for i in range(numargs)]
+ inputargs = [Var() for i in range(numargs)]
assert self.initial_var2loc is None
self.initial_var2loc = {}
for arg in inputargs:
@@ -230,7 +226,6 @@
return allocator
def finish_and_return(self, sigtoken, gv_returnvar):
- gv_returnvar = gv_returnvar.load(self)
self.insns.append(insn.Return(gv_returnvar))
allocator = self.allocate_and_emit()
@@ -345,20 +340,8 @@
self.emit_stack_adjustment()
return Label(target_addr, arg_locations, min_stack_offset)
- def newvar(self):
- gv = Var()
- return gv
-
- def new_and_load_2(self, gv_x, gv_y):
- gv_result = self.newvar()
- return (gv_result, gv_x.load(self), gv_y.load(self))
-
- def new_and_load_1(self, gv_x):
- gv_result = self.newvar()
- return (gv_result, gv_x.load(self))
-
def op_int_mul(self, gv_x, gv_y):
- gv_result, gv_x, gv_y = self.new_and_load_2(gv_x, gv_y)
+ gv_result = Var()
self.insns.append(
insn.Insn_GPR__GPR_GPR(RPPCAssembler.mullw,
gv_result, [gv_x, gv_y]))
@@ -366,32 +349,32 @@
def op_int_add(self, gv_x, gv_y):
if isinstance(gv_y, IntConst) and abs(gv_y.value) < 2**16:
- gv_result = self.newvar()
+ gv_result = Var()
self.insns.append(
insn.Insn_GPR__GPR_IMM(RPPCAssembler.addi,
- gv_result, [gv_x.load(self), gv_y]))
+ gv_result, [gv_x, gv_y]))
return gv_result
elif isinstance(gv_x, IntConst):
return self.op_int_add(gv_y, gv_x)
else:
- gv_result = self.newvar()
+ gv_result = Var()
self.insns.append(
insn.Insn_GPR__GPR_GPR(RPPCAssembler.add,
- gv_result, [gv_x.load(self), gv_y.load(self)]))
+ gv_result, [gv_x, gv_y]))
return gv_result
def op_int_sub(self, gv_x, gv_y):
- gv_result, gv_x, gv_y = self.new_and_load_2(gv_x, gv_y)
+ gv_result = Var()
self.insns.append(
insn.Insn_GPR__GPR_GPR(RPPCAssembler.sub,
gv_result, [gv_x, gv_y]))
return gv_result
def op_int_floordiv(self, gv_x, gv_y):
- gv_result, gv_x, gv_y = self.new_and_load_2(gv_x, gv_y)
+ gv_result = Var()
self.insns.append(
insn.Insn_GPR__GPR_GPR(RPPCAssembler.divw,
- gv_result, [gv_x.load(self), gv_y.load(self)]))
+ gv_result, [gv_x, gv_y]))
return gv_result
def _compare(self, op, gv_x, gv_y):
@@ -413,22 +396,17 @@
'eq': ( 2, 0 ),
'ne': ( 2, 1 ),
}
- result = self.newvar()
+ gv_result = Var()
if isinstance(gv_y, IntConst) and abs(gv_y.value) < 2*16:
- gv_x = gv_x.load(self)
self.insns.append(
- insn.CMPWI(cmp2info[op], result,
- [gv_x, gv_y]))
+ insn.CMPWI(cmp2info[op], gv_result, [gv_x, gv_y]))
elif isinstance(gv_x, IntConst) and abs(gv_x.value) < 2*16:
- gv_y = gv_y.load(self)
self.insns.append(
- insn.CMPWI(cmp2info_flipped[op], result,
- [gv_y, gv_x]))
+ insn.CMPWI(cmp2info_flipped[op], gv_result, [gv_y, gv_x]))
else:
self.insns.append(
- insn.CMPW(cmp2info[op], result,
- [gv_x.load(self), gv_y.load(self)]))
- return result
+ insn.CMPW(cmp2info[op], gv_result, [gv_x, gv_y]))
+ return gv_result
def op_int_gt(self, gv_x, gv_y):
return self._compare('gt', gv_x, gv_y)
@@ -451,11 +429,11 @@
def _jump(self, gv_condition, if_true):
targetbuilder = self._fork()
- gv = self.newvar()
+ gv = Var()
self.insns.append(
insn.Insn_GPR__IMM(RPPCAssembler.load_word,
gv, [IntConst(targetbuilder.asm.mc.tell())]))
- gv2 = self.newvar()
+ gv2 = Var()
self.insns.append(
insn.MTCTR(gv2, [gv]))
self.insns.append(
More information about the Pypy-commit
mailing list