[pypy-svn] r63884 - pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86

fijal at codespeak.net fijal at codespeak.net
Thu Apr 9 01:41:06 CEST 2009


Author: fijal
Date: Thu Apr  9 01:41:05 2009
New Revision: 63884

Modified:
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
Log:
make exception handling less hackish


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	Thu Apr  9 01:41:05 2009
@@ -8,7 +8,7 @@
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.annotation import model as annmodel
 from pypy.tool.uid import fixid
-from pypy.jit.backend.x86.regalloc import (RegAlloc, WORD, REGS,
+from pypy.jit.backend.x86.regalloc import (RegAlloc, WORD, REGS, TempBox,
                                       arg_pos, lower_byte, stack_pos)
 from pypy.rlib.objectmodel import we_are_translated, specialize, compute_unique_id
 from pypy.jit.backend.x86 import codebuf
@@ -770,15 +770,20 @@
         self.mc = self.mc2
         self.mc2 = self.mcstack.next_mc()
         addr = self.mc.tell()
-        guard_op.suboperations[-1].ovf = ovf
         if (guard_op.opnum == rop.GUARD_EXCEPTION or
             guard_op.opnum == rop.GUARD_NO_EXCEPTION):
             exc = True
         else:
             exc = False
-        guard_op.suboperations[-1].exc = exc
-        if ovf or exc: # we need to think what to do otherwise
-            assert guard_op.suboperations[-1].opnum == rop.FAIL
+        if exc or ovf:
+            box = TempBox()
+            regalloc.position = -1
+            loc = regalloc.force_allocate_reg(box, [])
+            if ovf:
+                self.generate_ovf_set(loc)
+            else:
+                self.generate_exception_handling(loc)
+            regalloc.eventually_free_var(box)
         regalloc.walk_guard_ops(guard_op.inputargs, guard_op.suboperations)
         self.mcstack.give_mc_back(self.mc2)
         self.mc2 = self.mc
@@ -801,27 +806,28 @@
             self.mc.MOV(addr_add(imm(self.fail_box_addr),
                                  imm(len(locs) * WORD)),
                                  eax)
-        if op.ovf:
-            ovf_error_vtable = self.cpu.cast_adr_to_int(self._ovf_error_vtable)
-            self.mc.MOV(eax, imm(ovf_error_vtable))
-            self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(0)), eax)
-            ovf_error_instance = self.cpu.cast_adr_to_int(self._ovf_error_inst)
-            self.mc.MOV(eax, imm(ovf_error_instance))
-            self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)),eax)
-        elif op.exc:
-            self.mc.MOV(eax, heap(self._exception_addr))
-            self.mc.MOV(heap(self._exception_bck_addr), eax)
-            self.mc.MOV(eax, addr_add(imm(self._exception_addr), imm(WORD)))
-            self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)),
-                         eax)
-            # clean up the original exception, we don't want
-            # to enter more rpython code with exc set
-            self.mc.MOV(heap(self._exception_addr), imm(0))
         self.places_to_patch_framesize.append(self.mc.tell())
         self.mc.ADD(esp, imm32(0))
         self.mc.MOV(eax, imm(guard_index))
         self.mc.RET()
 
+    def generate_ovf_set(self, loc):
+        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)
+        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)
+
+    def generate_exception_handling(self, loc):
+        self.mc.MOV(loc, heap(self._exception_addr))
+        self.mc.MOV(heap(self._exception_bck_addr), loc)
+        self.mc.MOV(loc, addr_add(imm(self._exception_addr), imm(WORD)))
+        self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)), loc)
+        # clean up the original exception, we don't want
+        # to enter more rpython code with exc set
+        self.mc.MOV(heap(self._exception_addr), imm(0))
+
     @specialize.arg(3)
     def implement_guard(self, addr, guard_op, emit_jump):
         emit_jump(rel32(addr))

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	Thu Apr  9 01:41:05 2009
@@ -254,9 +254,9 @@
         result = self._new_box(ptr)
         operations = [
             ResOperation(rop.CALL, args, result, calldescr),
+            ResOperation(rop.GUARD_NO_EXCEPTION, [], None),
             ResOperation(rop.FAIL, [result], None)]
-        operations[-1].ovf = False
-        operations[-1].exc = True
+        operations[1].suboperations = [ResOperation(rop.FAIL, [result], None)]
         loop = history.TreeLoop('call')
         loop.inputargs = args
         loop.operations = operations



More information about the Pypy-commit mailing list