[pypy-svn] r18491 - in pypy/dist/pypy/translator/asm: . ppc test
mwh at codespeak.net
mwh at codespeak.net
Wed Oct 12 17:47:22 CEST 2005
Author: mwh
Date: Wed Oct 12 17:47:18 2005
New Revision: 18491
Modified:
pypy/dist/pypy/translator/asm/genasm.py
pypy/dist/pypy/translator/asm/ppc/codegen.py
pypy/dist/pypy/translator/asm/simulator.py
pypy/dist/pypy/translator/asm/test/test_asm.py
Log:
test all integer comparisons.
Modified: pypy/dist/pypy/translator/asm/genasm.py
==============================================================================
--- pypy/dist/pypy/translator/asm/genasm.py (original)
+++ pypy/dist/pypy/translator/asm/genasm.py Wed Oct 12 17:47:18 2005
@@ -138,7 +138,7 @@
falselink, truelink = block.exits
lastop = block.operations[-1]
assert lastop.opname in ['int_gt', 'int_lt', 'int_ge',
- 'int_eq', 'int_le']
+ 'int_eq', 'int_le', 'int_ne']
A.emit(lastop.opname, *map(self.reg, lastop.args))
b = self.blockname()
A.emit('JT', b)
Modified: pypy/dist/pypy/translator/asm/ppc/codegen.py
==============================================================================
--- pypy/dist/pypy/translator/asm/ppc/codegen.py (original)
+++ pypy/dist/pypy/translator/asm/ppc/codegen.py Wed Oct 12 17:47:18 2005
@@ -96,10 +96,18 @@
def int_lt(self, A, a, b):
A.cmpw(a + 2, b + 2)
- def int_eq(self, A, a, b):
+ def int_ge(self, A, a, b):
A.cmpw(a + 2, b + 2)
- A.crmove(0, 2)
+ A.cror(0, 1, 2)
def int_le(self, A, a, b):
A.cmpw(a + 2, b + 2)
A.cror(0, 0, 2)
+
+ def int_eq(self, A, a, b):
+ A.cmpw(a + 2, b + 2)
+ A.crmove(0, 2)
+
+ def int_ne(self, A, a, b):
+ A.cmpw(a + 2, b + 2)
+ A.cror(0, 0, 1)
Modified: pypy/dist/pypy/translator/asm/simulator.py
==============================================================================
--- pypy/dist/pypy/translator/asm/simulator.py (original)
+++ pypy/dist/pypy/translator/asm/simulator.py Wed Oct 12 17:47:18 2005
@@ -89,18 +89,26 @@
def EXCH(self,destination,source):
self._registers[destination],self._registers[source]=self.register(source),self.register(destination)
+
def int_gt(self,rega,regb):
self._creg = self.register(rega) > self.register(regb)
def int_lt(self,rega,regb):
self._creg = self.register(rega) < self.register(regb)
- def int_eq(self,rega,regb):
- self._creg = self.register(rega) == self.register(regb)
+ def int_ge(self,rega,regb):
+ self._creg = self.register(rega) >= self.register(regb)
def int_le(self,rega,regb):
self._creg = self.register(rega) <= self.register(regb)
+ def int_eq(self,rega,regb):
+ self._creg = self.register(rega) == self.register(regb)
+
+ def int_ne(self,rega,regb):
+ self._creg = self.register(rega) != self.register(regb)
+
+
def llop(self, opcode, destination, *sources):
sourcevalues = []
for r in sources:
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 Wed Oct 12 17:47:18 2005
@@ -89,7 +89,25 @@
f = self.getcompiled(f1)
assert f(10) == f1(10)
-
+ def test_comparisons(self):
+ def f(x=int):
+ if x == 0:
+ return 0
+ elif x > 10:
+ return 10
+ elif x >= 5:
+ return 5
+ elif x < -10:
+ return -10
+ elif x <= -5:
+ return -5
+ elif x != 1:
+ return 1
+ else:
+ return x
+ g = self.getcompiled(f)
+ for i in range(-20, 20):
+ assert g(i) == f(i)
class TestAsmPPC(TestAsm):
More information about the Pypy-commit
mailing list