[pypy-svn] r78303 - pypy/branch/arm-backend/pypy/jit/backend/arm
david at codespeak.net
david at codespeak.net
Tue Oct 26 17:12:27 CEST 2010
Author: david
Date: Tue Oct 26 17:12:25 2010
New Revision: 78303
Added:
pypy/branch/arm-backend/pypy/jit/backend/arm/locations.py
Modified:
pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
Log:
Implemente guard_false, int_sub, int_eq
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py Tue Oct 26 17:12:25 2010
@@ -47,9 +47,10 @@
Registers are saved on the stack
XXX Rest to follow"""
i = -1
- fail_index = 0
+ fail_index = -1
while(True):
i += 1
+ fail_index += 1
r = enc[i]
if r == '\xFE':
continue
@@ -64,7 +65,6 @@
value = self.decode32(stack, reg*WORD)
self.fail_boxes_int.setitem(fail_index, value)
- fail_index += 1
assert enc[i] == '\xFF'
descr = self.decode32(enc, i+1)
@@ -116,16 +116,15 @@
if not isinstance(args[i], ConstInt):
curreg = regalloc.try_allocate_reg(args[i])
mem[j] = chr(curreg.value)
- j+=1
+ j += 1
else:
mem[j] = '\xFD'
- j+=1
- self.encode32(mem, j, args[i].getint())
- j+=4
+ self.encode32(mem, j+1, args[i].getint())
+ j += 5
else:
mem[j] = '\xFE'
- j+=1
- i+=1
+ j += 1
+ i += 1
mem[j] = chr(0xFF)
memaddr = rffi.cast(lltype.Signed, mem)
@@ -241,31 +240,70 @@
self.mc.CMP(reg.value, op.getarg(1).getint())
return c.GT
+ def emit_op_int_eq(self, op, regalloc, fcond):
+ reg = regalloc.try_allocate_reg(op.getarg(0))
+ assert isinstance(op.getarg(1), ConstInt)
+ self.mc.CMP(reg.value, op.getarg(1).getint())
+ return c.EQ
+
def emit_op_int_add(self, op, regalloc, fcond):
- if isinstance(op.getarg(0), BoxInt) and isinstance(op.getarg(1), BoxInt):
- explode
+ # assuming only one argument is constant
res = regalloc.try_allocate_reg(op.result)
if isinstance(op.getarg(1), ConstInt):
reg = regalloc.try_allocate_reg(op.getarg(0))
arg1 = op.getarg(1)
+ self.mc.ADD_ri(res.value, reg.value, arg1.getint())
+ elif isinstance(op.getarg(0), ConstInt):
+ reg = regalloc.try_allocate_reg(op.getarg(1))
+ arg1 = op.getarg(0)
+ self.mc.ADD_ri(res.value, reg.value, arg1.getint())
else:
+ r1 = regalloc.try_allocate_reg(op.getarg(0))
+ r2 = regalloc.try_allocate_reg(op.getarg(1))
+ self.mc.ADD_rr(res.value, r1.value, r2.value)
+
+ regalloc.possibly_free_vars_for_op(op)
+ return fcond
+
+ def emit_op_int_sub(self, op, regalloc, fcond):
+ # assuming only one argument is constant
+ res = regalloc.try_allocate_reg(op.result)
+ if isinstance(op.getarg(1), ConstInt):
+ reg = regalloc.try_allocate_reg(op.getarg(0))
+ arg1 = op.getarg(1)
+ self.mc.SUB_ri(res.value, reg.value, arg1.getint())
+ elif isinstance(op.getarg(0), ConstInt):
reg = regalloc.try_allocate_reg(op.getarg(1))
arg1 = op.getarg(0)
+ self.mc.SUB_ri(res.value, reg.value, arg1.getint())
+ else:
+ r1 = regalloc.try_allocate_reg(op.getarg(0))
+ r2 = regalloc.try_allocate_reg(op.getarg(1))
+ self.mc.SUB_rr(res.value, r1.value, r2.value)
- self.mc.ADD_ri(res.value, reg.value, arg1.getint())
regalloc.possibly_free_vars_for_op(op)
return fcond
- def emit_op_guard_true(self, op, regalloc, fcond):
- assert fcond == c.GT
+ # Guards
+ def _emit_guard(self, op, regalloc, fcond):
descr = op.getdescr()
assert isinstance(descr, BasicFailDescr)
descr._arm_guard_code = self.mc.curraddr()
memaddr = self._gen_path_to_exit_path(op, op.getfailargs(), regalloc, fcond)
descr._failure_recovery_code = memaddr
descr._arm_guard_cond = fcond
+
+ def emit_op_guard_true(self, op, regalloc, fcond):
+ assert fcond == c.GT
+ self._emit_guard(op, regalloc, fcond)
return c.AL
+ def emit_op_guard_false(self, op, regalloc, fcond):
+ assert fcond == c.EQ
+ self._emit_guard(op, regalloc, fcond)
+ return c.AL
+
+
def make_operation_list():
def notimplemented(self, op, regalloc, fcond):
raise NotImplementedError
Added: pypy/branch/arm-backend/pypy/jit/backend/arm/locations.py
==============================================================================
--- (empty file)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/locations.py Tue Oct 26 17:12:25 2010
@@ -0,0 +1,7 @@
+class AssemblerLocation(object):
+ pass
+
+class RegisterLocation(AssemblerLocation):
+
+ def __init__(self, value):
+ self.value = value
More information about the Pypy-commit
mailing list