Author: David Schneider <[email protected]>
Branch: arm-backed-float
Changeset: r44287:fe00e30abd05
Date: 2011-05-18 17:18 +0200
http://bitbucket.org/pypy/pypy/changeset/fe00e30abd05/

Log:    (bivab, arigo) implement the malloc slowpath

diff --git a/pypy/jit/backend/arm/assembler.py 
b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -4,7 +4,7 @@
 from pypy.jit.backend.arm import registers as r
 from pypy.jit.backend.arm.arch import WORD, FUNC_ALIGN, PC_OFFSET, 
N_REGISTERS_SAVED_BY_MALLOC
 from pypy.jit.backend.arm.codebuilder import ARMv7Builder, OverwritingBuilder
-from pypy.jit.backend.arm.regalloc import (Regalloc, ARMFrameManager,
+from pypy.jit.backend.arm.regalloc import (Regalloc, ARMFrameManager, 
ARMv7RegisterMananger,
                                                     _check_imm_arg, TempInt, 
TempPtr)
 from pypy.jit.backend.llsupport.regalloc import compute_vars_longevity, TempBox
 from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
@@ -112,6 +112,8 @@
             ll_new_unicode = gc_ll_descr.get_funcptr_for_newunicode()
             self.malloc_unicode_func_addr = rffi.cast(lltype.Signed,
                                                       ll_new_unicode)
+        if gc_ll_descr.get_malloc_slowpath_addr is not None:
+            self._build_malloc_slowpath()
         self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
         self._exit_code_addr = self._gen_exit_path()
         self._leave_jitted_jook_save_exc = 
self._gen_leave_jitted_hook_code(True)
@@ -258,27 +260,25 @@
     def _build_malloc_slowpath(self):
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         mc = ARMv7Builder()
-        assert gcrootmap is not None and gcrootmap.is_shadow_stack
-        # ---- shadowstack ----
-        for reg, ofs in gpr_reg_mgr_cls.REGLOC_TO_COPY_AREA_OFS.items():
-            mc.MOV_br(ofs, reg.value)
-        mc.SUB_ri(esp.value, 16 - WORD)      # stack alignment of 16 bytes
-        if IS_X86_32:
-            mc.MOV_sr(0, edx.value)          # push argument
-        elif IS_X86_64:
-            mc.MOV_rr(edi.value, edx.value)
-        mc.CALL(imm(addr))
-        mc.ADD_ri(esp.value, 16 - WORD)
-        for reg, ofs in gpr_reg_mgr_cls.REGLOC_TO_COPY_AREA_OFS.items():
-            mc.MOV_rb(reg.value, ofs)
-        if self.cpu.supports_floats:          # restore the XMM registers
-            for i in range(self.cpu.NUM_REGS):# from where they were saved
-                mc.MOVSD_xs(i, (WORD*2)+8*i)
+        assert self.cpu.supports_floats
+        mc.PUSH([r.lr.value])
+        with saved_registers(mc, [], r.caller_vfp_resp):
+            # At this point we know that the values we need to compute the size
+            # are stored in r0 and IP.
+            mc.SUB_rr(r.r0.value, r.ip.value, r.r0.value)
+            addr = self.cpu.gc_ll_descr.get_malloc_slowpath_addr()
+            # XXX replace with an STMxx operation
+            for reg, ofs in 
ARMv7RegisterMananger.REGLOC_TO_COPY_AREA_OFS.items():
+                mc.STR_ri(reg.value, r.fp.value, imm=ofs)
+            mc.BL(addr)
+            for reg, ofs in 
ARMv7RegisterMananger.REGLOC_TO_COPY_AREA_OFS.items():
+                mc.LDR_ri(reg.value, r.fp.value, imm=ofs)
         nursery_free_adr = self.cpu.gc_ll_descr.get_nursery_free_addr()
-        mc.MOV(edx, heap(nursery_free_adr))   # load this in EDX
-        mc.RET()
+        mc.gen_load_int(r.ip.value, nursery_free_adr)
+        mc.LDR_ri(r.ip.value, r.ip.value)
+        mc.POP([r.pc.value])
         rawstart = mc.materialize(self.cpu.asmmemmgr, [])
-        self.malloc_slowpath2 = rawstart
+        self.malloc_slowpath = rawstart
 
     def _gen_leave_jitted_hook_code(self, save_exc=False):
         mc = ARMv7Builder()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to