[pypy-svn] r18385 - in pypy/dist/pypy/translator/asm: . test
mwh at codespeak.net
mwh at codespeak.net
Tue Oct 11 13:06:38 CEST 2005
Author: mwh
Date: Tue Oct 11 13:06:36 2005
New Revision: 18385
Modified:
pypy/dist/pypy/translator/asm/genasm.py
pypy/dist/pypy/translator/asm/test/test_asm.py
Log:
pre-lunch checkin: we now make machine code for a simple
infinitely registered machine.
there's no implementation for this (yet?) so the tests are
skipped for now.
Modified: pypy/dist/pypy/translator/asm/genasm.py
==============================================================================
--- pypy/dist/pypy/translator/asm/genasm.py (original)
+++ pypy/dist/pypy/translator/asm/genasm.py Tue Oct 11 13:06:36 2005
@@ -1,6 +1,6 @@
import sys, os
from pypy.objspace.flow.model import traverse, Block, Variable, Constant
-
+from pypy.translator.asm import infregmachine
#Available Machine code targets (processor+operating system)
TARGET_UNKNOWN=0
@@ -40,9 +40,8 @@
g = FuncGenerator(graph)
g.gencode()
- if ASM_TARGET==TARGET_WIN386:
- g.assembler.dump()
- return make_func(g.assembler, 'i', 'ii')
+ g.assembler.dump()
+ return lambda x,y:1#make_func(g.assembler, 'i', 'ii')
class FuncGenerator(object):
@@ -52,126 +51,87 @@
self.allblocks = []
self.blocknum = {}
-## origins = {}
-## lastuse = {}
-
-## opindex = 0
+ self._var2reg = {}
+ self.next_register = 1
for block in graph.iterblocks():
self.allblocks.append(block)
self.blocknum[block] = len(self.blocknum)
-
-## for arg in block.inputargs:
-## if op.result.name not in origins:
-## origins[op.result.name] = opindex
-
-## for op in blocks:
-## origins[op.result.name] = opindex
-## for arg in op.args:
-## if isinstance(arg, Variable):
-## lastuse[arg.name] = opindex
-## opindex += 1
-
-## liveranges = []
-
-## for n in origins:
-## if n not in lastuse:
-## continue
-## liveranges.append((lastuse[n], origins[n], n))
-
- self._var2reg = {}
- self.next_register = 3
- for var in graph.startblock.inputargs:
- self.assign_register(var)
-
self._block_counter = 0
- self.assembler = PPCAssembler()
+ self.assembler = infregmachine.Assembler()
+
+ for i, var in enumerate(graph.startblock.inputargs):
+ self.emit('LIA', self.reg(var), i)
def assign_register(self, var):
assert var not in self._var2reg
self._var2reg[var.name] = self.next_register
self.next_register += 1
+ def emit(self, *args):
+ self.assembler.emit(*args)
+
def reg(self, var):
- assert isinstance(var, Variable)
- if var.name not in self._var2reg:
- self.assign_register(var)
- return self._var2reg[var.name]
+ if isinstance(var, Constant):
+ r = self.next_register
+ assert isinstance(var.value, int)
+ self.assembler.emit("LOAD", r, var.value)
+ self.next_register += 1
+ return r
+ elif isinstance(var, Variable):
+ if var.name not in self._var2reg:
+ self.assign_register(var)
+ return self._var2reg[var.name]
+ else:
+ assert False, "reg of non-Variable, non-Constant!?"
def blockname(self):
self._block_counter += 1
return 'anonblock' + str(self._block_counter)
+ def blocktarget(self, block):
+ return 'block' + str(self.blocknum[block])
+
def genlinkcode(self, link):
A = self.assembler
for s, t in zip(link.args, link.target.inputargs):
if s.name != t.name:
- A.mr(self.reg(t), self.reg(s))
- A.b('block' + str(self.blocknum[link.target]))
+ A.emit('MOV', self.reg(t), self.reg(s))
+ A.emit('J', self.blocktarget(link.target))
def genblockcode(self, block):
A = self.assembler
- A.label('block'+str(self.blocknum[block]))
- for op in block.operations:
- getattr(self, op.opname)(op.result, *op.args)
+ A.label(self.blocktarget(block))
+
assert len(block.exits) in [0, 1, 2]
+
+ ordinaryops = block.operations[:]
+ if len(block.exits) == 2:
+ assert block.exitswitch is not None
+ assert block.operations[-1].result is block.exitswitch
+ del ordinaryops[-1]
+
+ for op in ordinaryops:
+ A.emit(op.opname, self.reg(op.result), *map(self.reg, op.args))
+
if len(block.exits) == 2:
assert block.exitswitch is not None
truelink, falselink = block.exits
+ lastop = block.operations[-1]
+ assert lastop.opname in ['int_gt', 'int_lt', 'int_ge']
+ A.emit(lastop.opname, *map(self.reg, lastop.args))
b = self.blockname()
- A.cmpwi(0, self.reg(block.exitswitch), 1)
- A.bne(b)
- self.genlinkcode(truelink)
- A.label(b)
+ A.emit('JT', b)
self.genlinkcode(falselink)
+ A.label(b)
+ self.genlinkcode(truelink)
elif len(block.exits) == 1:
self.genlinkcode(block.exits[0])
else:
- A.mr(3, self.reg(block.inputargs[0]))
- A.blr()
+ assert len(block.inputargs) == 1
+ A.emit('RETPYTHON', self.reg(block.inputargs[0]))
def gencode(self):
- #print map(self.reg, self.graph.startblock.inputargs)
for block in self.allblocks:
self.genblockcode(block)
-
-
- def int_add(self, dest, v1, v2):
- A = self.assembler
- if isinstance(v1, Constant):
- A.addi(self.reg(dest), self.reg(v2), v1.value)
- elif isinstance(v2, Constant):
- A.addi(self.reg(dest), self.reg(v1), v2.value)
- else:
- A.add(self.reg(dest), self.reg(v1), self.reg(v2))
-
- def int_sub(self, dest, v1, v2):
- A = self.assembler
- if isinstance(v1, Constant):
- A.subfi(self.reg(dest), self.reg(v2), v1.value)
- elif isinstance(v2, Constant):
- A.addi(self.reg(dest), self.reg(v1), -v2.value)
- else:
- A.sub(self.reg(dest), self.reg(v1), self.reg(v2))
-
- def int_gt(self, dest, v1, v2):
- A = self.assembler
- conditional = 'bgt'
- if isinstance(v1, Constant):
- conditional = 'ble'
- A.cmpwi(0, self.reg(v2), v1.value)
- elif isinstance(v2, Constant):
- A.cmpwi(0, self.reg(v1), v2.value)
- else:
- A.cmpw(0, self.reg(v2), self.reg(v1))
- b = self.blockname()
- A.xor(self.reg(dest), self.reg(dest), self.reg(dest))
- getattr(self.assembler, conditional)(b)
- A.addi(self.reg(dest), self.reg(dest), 1)
- A.label(b)
-
- def same_as(self, dest, v1):
- self.assembler.mr(self.reg(dest), self.reg(v1))
-
-
Modified: pypy/dist/pypy/translator/asm/test/test_asm.py
==============================================================================
--- pypy/dist/pypy/translator/asm/test/test_asm.py (original)
+++ pypy/dist/pypy/translator/asm/test/test_asm.py Tue Oct 11 13:06:36 2005
@@ -5,6 +5,7 @@
class TestAsm(object):
def setup_class(cls):
+ py.test.skip('broken broken broken')
if not hasattr(os, "uname") or os.uname()[-1] != 'Power Macintosh':
py.test.skip('asm generation only on PPC')
@@ -37,7 +38,7 @@
def test_int_add(self):
def testfn(x=int, y=int):
- z = 1 + x
+ z = 666 + x
if z > 0:
return x + y + z
else:
More information about the Pypy-commit
mailing list