Author: David Schneider <[email protected]>
Branch: emit-call-arm
Changeset: r64522:fee3b922df85
Date: 2013-05-22 12:49 -0500
http://bitbucket.org/pypy/pypy/changeset/fee3b922df85/
Log: call_assembler support
diff --git a/rpython/jit/backend/arm/assembler.py
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -19,7 +19,7 @@
from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
from rpython.jit.backend.model import CompiledLoopToken
from rpython.jit.codewriter.effectinfo import EffectInfo
-from rpython.jit.metainterp.history import AbstractFailDescr, FLOAT
+from rpython.jit.metainterp.history import AbstractFailDescr, FLOAT, INT
from rpython.jit.metainterp.resoperation import rop
from rpython.rlib.debug import debug_print, debug_start, debug_stop
from rpython.rlib.jit import AsmInfo
@@ -27,6 +27,7 @@
from rpython.rlib.rarithmetic import r_uint
from rpython.rtyper.annlowlevel import llhelper, cast_instance_to_gcref
from rpython.rtyper.lltypesystem import lltype, rffi
+from rpython.jit.backend.arm import callbuilder
class AssemblerARM(ResOpAssembler):
@@ -1417,6 +1418,21 @@
#
return shiftsize
+ def simple_call(self, fnloc, arglocs, result_loc=r.r0):
+ if result_loc.is_vfp_reg():
+ result_type = FLOAT
+ result_size = DOUBLE_WORD
+ elif result_loc is None:
+ result_type = VOID
+ result_size = 0
+ else:
+ result_type = INT
+ result_size = WORD
+ cb = callbuilder.get_callbuilder(self.cpu, self, fnloc, arglocs,
+ result_loc, result_type,
+ result_size)
+ cb.emit()
+
def not_implemented(msg):
os.write(2, '[ARM/asm] %s\n' % msg)
raise NotImplementedError(msg)
diff --git a/rpython/jit/backend/arm/opassembler.py
b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -942,14 +942,14 @@
vloc = imm(0)
self.call_assembler(op, guard_op, argloc, vloc, result_loc, tmploc)
self._emit_guard_may_force(guard_op,
- regalloc._prepare_guard(guard_op), guard_op.numargs())
+ regalloc._prepare_guard(guard_op))
return fcond
def _call_assembler_emit_call(self, addr, argloc, resloc):
- self.simple_call(addr, [argloc], resloc=resloc)
+ self.simple_call(addr, [argloc], result_loc=resloc)
def _call_assembler_emit_helper_call(self, addr, arglocs, resloc):
- self.simple_call(addr, arglocs, resloc=resloc)
+ self.simple_call(addr, arglocs, result_loc=resloc)
def _call_assembler_check_descr(self, value, tmploc):
ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
diff --git a/rpython/jit/backend/arm/regalloc.py
b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -560,18 +560,9 @@
calldescr = op.getdescr()
assert isinstance(calldescr, CallDescr)
assert len(calldescr.arg_classes) == op.numargs() - 1
+
for i in range(op.numargs()):
args[i + 3] = self.loc(op.getarg(i))
- # spill variables that need to be saved around calls
- self.vfprm.before_call(save_all_regs=save_all_regs)
- if not save_all_regs:
- gcrootmap = self.assembler.cpu.gc_ll_descr.gcrootmap
- if gcrootmap and gcrootmap.is_shadow_stack:
- save_all_regs = 2
- self.rm.before_call(save_all_regs=save_all_regs)
- if op.result:
- resloc = self.after_call(op.result)
- args[0] = resloc
size = calldescr.get_result_size()
sign = calldescr.is_result_signed()
@@ -581,8 +572,23 @@
sign_loc = imm(0)
args[1] = imm(size)
args[2] = sign_loc
+
+ args[0] = self._call(op, args, force_store, save_all_regs)
+ return args
+
+ def _call(self, op, arglocs, force_store=[], save_all_regs=False):
+ # spill variables that need to be saved around calls
+ self.vfprm.before_call(save_all_regs=save_all_regs)
+ if not save_all_regs:
+ gcrootmap = self.assembler.cpu.gc_ll_descr.gcrootmap
+ if gcrootmap and gcrootmap.is_shadow_stack:
+ save_all_regs = 2
+ self.rm.before_call(save_all_regs=save_all_regs)
self.before_call_called = True
- return args
+ resloc = None
+ if op.result:
+ resloc = self.after_call(op.result)
+ return resloc
def prepare_op_call_malloc_gc(self, op, fcond):
return self._prepare_call(op)
@@ -1164,12 +1170,11 @@
prepare_guard_call_release_gil = prepare_guard_call_may_force
def prepare_guard_call_assembler(self, op, guard_op, fcond):
- assert 0, 'xxx needs checking'
locs = self.locs_for_call_assembler(op, guard_op)
tmploc = self.get_scratch_reg(INT, selected_reg=r.r0)
- call_locs = self._prepare_call(op, save_all_regs=True)
+ resloc = self._call(op, locs + [tmploc], save_all_regs=True)
self.possibly_free_vars(guard_op.getfailargs())
- return locs + [call_locs[0], tmploc]
+ return locs + [resloc, tmploc]
def _prepare_args_for_new_op(self, new_args):
gc_ll_descr = self.cpu.gc_ll_descr
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit