Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r46436:6d0b095f849a
Date: 2011-08-11 16:47 +0200
http://bitbucket.org/pypy/pypy/changeset/6d0b095f849a/
Log: Made add more flexible, added sub. Also support GUARD_FALSE.
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -8,6 +8,7 @@
from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.history import BoxInt, ConstInt
A = Form("frD", "frA", "frB", "XO3", "Rc")
A1 = Form("frD", "frB", "XO3", "Rc")
@@ -904,14 +905,20 @@
opnum = trace_op.getopnum()
if opnum == rop.INT_ADD:
self.emit_int_add(trace_op, cpu)
+ elif opnum == rop.INT_SUB:
+ self.emit_int_sub(trace_op, cpu)
elif opnum == rop.FINISH:
self.emit_finish(trace_op, cpu)
elif opnum == rop.INT_LE:
self.emit_int_le(trace_op, cpu)
+ elif opnum == rop.INT_EQ:
+ self.emit_int_eq(trace_op, cpu)
elif opnum == rop.JUMP:
self.emit_jump(trace_op, cpu)
elif opnum == rop.GUARD_TRUE:
- self.emit_guard_true(trace_op, cpu)
+ self.emit_guard(trace_op, cpu, 0)
+ elif opnum == rop.GUARD_FALSE:
+ self.emit_guard(trace_op, cpu, 1)
else:
assert 0, "Don't know this opcode"
@@ -922,36 +929,60 @@
def emit_int_add(self, op, cpu):
arg0 = op.getarg(0)
arg1 = op.getarg(1)
-
regnum = cpu.reg_map[arg0]
-
- self.addi(cpu.next_free_register, regnum, arg1.value)
-
+ if isinstance(arg1, ConstInt):
+ self.addi(cpu.next_free_register, regnum, arg1.value)
+ elif isinstance(arg1, BoxInt):
+ regnum2 = cpu.reg_map[arg1]
+ self.add(cpu.next_free_register, regnum, regnum2)
result = op.result
cpu.reg_map[result] = cpu.next_free_register
cpu.next_free_register += 1
+ def emit_int_sub(self, op, cpu):
+ arg0 = op.getarg(0)
+ arg1 = op.getarg(1)
+ regnum = cpu.reg_map[arg0]
+ if isinstance(arg1, ConstInt):
+ self.addi(cpu.next_free_register, regnum, -arg1.value)
+ elif isinstance(arg1, BoxInt):
+ regnum2 = cpu.reg_map[arg1]
+ self.sub(cpu.next_free_register, regnum, regnum2)
+ result = op.result
+ cpu.reg_map[result] = cpu.next_free_register
+ cpu.next_free_register += 1
+
+ def emit_int_eq(self, op, cpu):
+ arg0 = op.getarg(0)
+ arg1 = op.getarg(1)
+ free_reg = cpu.next_free_register
+ regnum = cpu.reg_map[arg0]
+ self.load_word(free_reg, arg1.value)
+ self.xor(free_reg, regnum, free_reg)
+ self.cntlzw(free_reg, free_reg)
+ self.srwi(free_reg, free_reg, 5)
+ result = op.result
+ cpu.reg_map[result] = free_reg
+ cpu.next_free_register += 1
+
def emit_int_le(self, op, cpu):
arg0 = op.getarg(0)
arg1 = op.getarg(1)
-
regnum = cpu.reg_map[arg0]
-
free_reg = cpu.next_free_register
self.load_word(free_reg, arg1.value)
self.cmp(7, 1, regnum, free_reg)
self.crnot(30, 29)
self.mfcr(free_reg)
self.rlwinm(free_reg, free_reg, 31, 31, 31)
-
result = op.result
cpu.reg_map[result] = cpu.next_free_register
cpu.next_free_register += 1
- def emit_guard_true(self, op, cpu):
+ def emit_guard(self, op, cpu, guard_type):
arg0 = op.getarg(0)
regnum = cpu.reg_map[arg0]
- self.cmpi(0, 1, regnum, 0) # result of comparison
+ self.cmpi(0, 1, regnum, guard_type) # result of comparison
fail_index = len(cpu.saved_descr)
fail_descr = op.getdescr()
@@ -972,7 +1003,6 @@
cpu.patch_list.append((numops, fail_index, op, reglist))
def emit_finish(self, op, cpu):
- from pypy.jit.metainterp.history import ConstInt, BoxInt
fail_index = len(cpu.saved_descr)
cpu.saved_descr[fail_index] = op.getdescr()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit