Author: David Schneider <david.schnei...@picle.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit