Author: David Schneider <[email protected]>
Branch: emit-call-arm
Changeset: r64530:940f2722fec6
Date: 2013-05-23 14:03 -0500
http://bitbucket.org/pypy/pypy/changeset/940f2722fec6/
Log: use raw stacklocations to put arguments on the stack instead of
doing a push for each
diff --git a/rpython/jit/backend/arm/callbuilder.py
b/rpython/jit/backend/arm/callbuilder.py
--- a/rpython/jit/backend/arm/callbuilder.py
+++ b/rpython/jit/backend/arm/callbuilder.py
@@ -3,6 +3,8 @@
from rpython.jit.metainterp.history import INT, FLOAT, REF
from rpython.jit.backend.arm.arch import WORD
from rpython.jit.backend.arm import registers as r
+from rpython.jit.backend.arm import conditions as c
+from rpython.jit.backend.arm.locations import RawSPStackLocation
from rpython.jit.backend.arm.jump import remap_frame_layout
from rpython.jit.backend.llsupport.callbuilder import AbstractCallBuilder
from rpython.jit.backend.arm.helper.assembler import count_reg_args
@@ -50,24 +52,32 @@
def _push_stack_args(self, stack_args, on_stack):
assert on_stack % 8 == 0
- #then we push every thing on the stack
- for i in range(len(stack_args) - 1, -1, -1):
- arg = stack_args[i]
- if arg is None:
- self.mc.PUSH([r.ip.value])
- else:
- self.asm.regalloc_push(arg)
- self.current_sp -= on_stack
+ self._adjust_sp(-on_stack)
+ self.current_sp = on_stack
+ ofs = 0
+ for i, arg in enumerate(stack_args):
+ if arg is not None:
+ sp_loc = RawSPStackLocation(ofs, arg.type)
+ self.asm.regalloc_mov(arg, sp_loc)
+ ofs += sp_loc.width
+ else: # alignment word
+ ofs += WORD
def _adjust_sp(self, n):
- assert n < 0
- n = abs(n)
-
- if check_imm_arg(n):
- self.mc.ADD_ri(r.sp.value, r.sp.value, n)
+ # adjust the current stack pointer by n bytes
+ if n > 0:
+ if check_imm_arg(n):
+ self.mc.ADD_ri(r.sp.value, r.sp.value, n)
+ else:
+ self.mc.gen_load_int(r.ip.value, n)
+ self.mc.ADD_rr(r.sp.value, r.sp.value, r.ip.value)
else:
- self.mc.gen_load_int(r.ip.value, n, cond=fcond)
- self.mc.ADD_rr(r.sp.value, r.sp.value, r.ip.value, cond=fcond)
+ n = abs(n)
+ if check_imm_arg(n):
+ self.mc.SUB_ri(r.sp.value, r.sp.value, n)
+ else:
+ self.mc.gen_load_int(r.ip.value, n)
+ self.mc.SUB_rr(r.sp.value, r.sp.value, r.ip.value)
def select_call_release_gil_mode(self):
AbstractCallBuilder.select_call_release_gil_mode(self)
@@ -75,12 +85,12 @@
def call_releasegil_addr_and_move_real_arguments(self):
assert not self.asm._is_asmgcc()
from rpython.jit.backend.arm.regalloc import CoreRegisterManager
- with saved_registers(self.mc,
CoreRegisterManager.save_around_call_regs):
+ with saved_registers(self.mc,
+ CoreRegisterManager.save_around_call_regs):
self.mc.BL(self.asm.releasegil_addr)
- #
+
if not we_are_translated(): # for testing: we
should not access
self.mc.ADD_ri(r.fp.value, r.fp.value, 1) # fp any more
- #
def move_real_result_and_call_reacqgil_addr(self):
# save the result we just got
@@ -88,10 +98,10 @@
gpr_to_save, vfp_to_save = self.get_result_locs()
with saved_registers(self.mc, gpr_to_save, vfp_to_save):
self.mc.BL(self.asm.reacqgil_addr)
- #
+
if not we_are_translated(): # for testing: now we
can accesss
self.mc.SUB_ri(r.fp.value, r.fp.value, 1) # fp again
- #
+
# for shadowstack, done for us by _reload_frame_if_necessary()
def get_result_locs(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit