[pypy-svn] r63964 - in pypy/branch/pyjitpl5-simplify/pypy/jit/backend: test x86
arigo at codespeak.net
arigo at codespeak.net
Fri Apr 10 20:09:30 CEST 2009
Author: arigo
Date: Fri Apr 10 20:09:29 2009
New Revision: 63964
Modified:
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
Log:
In-progress: pass some of ovf tests.
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py Fri Apr 10 20:09:29 2009
@@ -132,7 +132,8 @@
(rop.INT_LSHIFT_OVF, [(0x1f87611, 6, 0x7e1d8440),
(-0x1f87611, 6, -0x7e1d8440),
(sys.maxint//8+1, 3, boom),
- (minint//2-1, 1, boom)]),
+ (minint//2-1, 1, boom),
+ (0, 345, 0)]),
(rop.INT_FLOORDIV_OVF, [(110, 3, 36),
(-110, 3, -36),
(110, -3, -36),
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py Fri Apr 10 20:09:29 2009
@@ -345,13 +345,9 @@
getattr(self.mc, asmop)(arglocs[0], arglocs[1])
return genop_binary
- def _binaryop_ovf(asmop, can_swap=False, is_mod=False):
+ def _binaryop_ovf(asmop, can_swap=False):
def genop_binary_ovf(self, op, guard_op, addr, arglocs, result_loc):
- if is_mod:
- self.mc.CDQ()
- self.mc.IDIV(ecx)
- else:
- getattr(self.mc, asmop)(arglocs[0], arglocs[1])
+ getattr(self.mc, asmop)(arglocs[0], arglocs[1])
self.mc.JO(rel32(addr))
return genop_binary_ovf
@@ -413,7 +409,10 @@
genop_guard_int_mul_ovf = _binaryop_ovf("IMUL", True)
genop_guard_int_sub_ovf = _binaryop_ovf("SUB")
genop_guard_int_add_ovf = _binaryop_ovf("ADD", True)
- genop_guard_int_mod_ovf = _binaryop_ovf("IDIV", is_mod=True)
+
+ def genop_guard_int_neg_ovf(self, op, guard_op, addr, arglocs, result_loc):
+ self.mc.NEG(result_loc)
+ self.mc.JO(rel32(addr))
genop_int_lt = _cmpop("L", "G")
genop_int_le = _cmpop("LE", "GE")
@@ -525,10 +524,17 @@
self.mc.CDQ()
self.mc.IDIV(ecx)
- def genop_int_floordiv(self, op, arglocs, resloc):
+ def genop_guard_int_mod_ovf(self, op, guard_op, addr, arglocs, result_loc):
+ self.mc.CMP(eax, imm(-sys.maxint-1))
+ self.mc.JE(rel32(addr))
+ self.mc.CMP(ecx, imm(-1))
+ self.mc.JE(rel32(addr))
self.mc.CDQ()
self.mc.IDIV(ecx)
+ genop_int_floordiv = genop_int_mod
+ genop_guard_int_floordiv_ovf = genop_guard_int_mod_ovf
+
def genop_new_with_vtable(self, op, arglocs, result_loc):
assert result_loc is eax
loc_size, loc_vtable = arglocs
@@ -780,10 +786,10 @@
if exc or ovf:
box = TempBox()
regalloc.position = -1
- loc = regalloc.force_allocate_reg(box, [])
if ovf:
- self.generate_ovf_set(loc)
+ self.generate_ovf_set()
else:
+ loc = regalloc.force_allocate_reg(box, [])
self.generate_exception_handling(loc)
regalloc.eventually_free_var(box)
regalloc.walk_guard_ops(guard_op.inputargs, guard_op.suboperations)
@@ -813,13 +819,13 @@
self.mc.MOV(eax, imm(guard_index))
self.mc.RET()
- def generate_ovf_set(self, loc):
+ def generate_ovf_set(self):
ovf_error_vtable = self.cpu.cast_adr_to_int(self._ovf_error_vtable)
- self.mc.MOV(loc, imm(ovf_error_vtable))
- self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(0)), loc)
+ self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(0)),
+ imm(ovf_error_vtable))
ovf_error_instance = self.cpu.cast_adr_to_int(self._ovf_error_inst)
- self.mc.MOV(loc, imm(ovf_error_instance))
- self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)), loc)
+ self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)),
+ imm(ovf_error_instance))
def generate_exception_handling(self, loc):
self.mc.MOV(loc, heap(self._exception_addr))
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py Fri Apr 10 20:09:29 2009
@@ -738,7 +738,6 @@
consider_int_mul_ovf = _consider_binop_ovf
consider_int_sub_ovf = _consider_binop_ovf
consider_int_add_ovf = _consider_binop_ovf
- # XXX ovf_neg op
def consider_int_neg(self, op, ignored):
res = self.force_result_in_reg(op.result, op.args[0], [])
@@ -746,6 +745,15 @@
consider_bool_not = consider_int_neg
+ def consider_int_neg_ovf(self, op, guard_op):
+ res = self.force_result_in_reg(op.result, op.args[0], [])
+ self.position += 1
+ regalloc = self.regalloc_for_guard(guard_op)
+ self.perform_with_guard(op, guard_op, regalloc, [res], res,
+ overflow=True)
+ self.eventually_free_vars(guard_op.inputargs)
+ self.eventually_free_var(guard_op.result)
+
def consider_int_rshift(self, op, ignored):
tmpvar = TempBox()
reg = self.force_allocate_reg(tmpvar, [], ecx)
@@ -774,25 +782,23 @@
self.eventually_free_vars(guard_op.inputargs)
self.eventually_free_var(guard_op.result)
- def consider_int_mod(self, op, ignored):
+ def _consider_int_div_or_mod(self, op, trashreg):
l0 = self.make_sure_var_in_reg(op.args[0], [], eax)
l1 = self.make_sure_var_in_reg(op.args[1], [], ecx)
l2 = self.force_allocate_reg(op.result, [], edx)
- # eax is trashed after that operation
+ # the register (eax or edx) not holding what we are looking for
+ # will be just trash after that operation
tmpvar = TempBox()
- self.force_allocate_reg(tmpvar, [], eax)
+ self.force_allocate_reg(tmpvar, [], trashreg)
assert (l0, l1, l2) == (eax, ecx, edx)
self.eventually_free_vars(op.args + [tmpvar])
+
+ def consider_int_mod(self, op, ignored):
+ self._consider_int_div_or_mod(op, eax)
self.Perform(op, [eax, ecx], edx)
def consider_int_mod_ovf(self, op, guard_op):
- l0 = self.make_sure_var_in_reg(op.args[0], [], eax)
- l1 = self.make_sure_var_in_reg(op.args[1], [], ecx)
- l2 = self.force_allocate_reg(op.result, [], edx)
- tmpvar = TempBox()
- self.force_allocate_reg(tmpvar, [], eax)
- assert (l0, l1, l2) == (eax, ecx, edx)
- self.eventually_free_vars(op.args + [tmpvar])
+ self._consider_int_div_or_mod(op, eax)
self.position += 1
regalloc = self.regalloc_for_guard(guard_op)
self.perform_with_guard(op, guard_op, regalloc, [eax, ecx], edx,
@@ -800,15 +806,17 @@
self.eventually_free_vars(guard_op.inputargs)
def consider_int_floordiv(self, op, ignored):
- tmpvar = TempBox()
- l0 = self.force_result_in_reg(op.result, op.args[0], [], eax)
- l1 = self.make_sure_var_in_reg(op.args[1], [], ecx)
- # we need to make sure edx is empty, since we're going to use it
- l2 = self.force_allocate_reg(tmpvar, [], edx)
- assert (l0, l1, l2) == (eax, ecx, edx)
- self.eventually_free_vars(op.args + [tmpvar])
+ self._consider_int_div_or_mod(op, edx)
self.Perform(op, [eax, ecx], eax)
+ def consider_int_floordiv_ovf(self, op, guard_op):
+ self._consider_int_div_or_mod(op, edx)
+ self.position += 1
+ regalloc = self.regalloc_for_guard(guard_op)
+ self.perform_with_guard(op, guard_op, regalloc, [eax, ecx], eax,
+ overflow=True)
+ self.eventually_free_vars(guard_op.inputargs)
+
def _consider_compop(self, op, guard_op):
vx = op.args[0]
vy = op.args[1]
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py Fri Apr 10 20:09:29 2009
@@ -93,15 +93,21 @@
self.caught_exception = None
if rtyper is not None: # for tests
self.lltype2vtable = rtyper.lltype_to_vtable_mapping()
- self._setup_ovf_error()
+ self._setup_ovf_error()
self.generated_mps = {}
def _setup_ovf_error(self):
- bk = self.rtyper.annotator.bookkeeper
- clsdef = bk.getuniqueclassdef(OverflowError)
- ovferror_repr = rclass.getclassrepr(self.rtyper, clsdef)
- ll_inst = self.rtyper.exceptiondata.get_standard_ll_exc_instance(
- self.rtyper, clsdef)
+ if self.rtyper is not None: # normal case
+ bk = self.rtyper.annotator.bookkeeper
+ clsdef = bk.getuniqueclassdef(OverflowError)
+ ovferror_repr = rclass.getclassrepr(self.rtyper, clsdef)
+ ll_inst = self.rtyper.exceptiondata.get_standard_ll_exc_instance(
+ self.rtyper, clsdef)
+ else:
+ # for tests, a random emulated ll_inst will do
+ ll_inst = lltype.malloc(rclass.OBJECT)
+ ll_inst.typeptr = lltype.malloc(rclass.OBJECT_VTABLE,
+ immortal=True)
self.assembler._ovf_error_vtable = llmemory.cast_ptr_to_adr(ll_inst.typeptr)
self.assembler._ovf_error_inst = llmemory.cast_ptr_to_adr(ll_inst)
More information about the Pypy-commit
mailing list