def _emit_call(self, op, arglocs): is_call_release_gil = rop.is_call_release_gil(op.getopnum()) # args = [resloc, size, sign, args...] from rpython.jit.backend.llsupport.descr import CallDescr func_index = 3 + is_call_release_gil cb = Aarch64CallBuilder(self, arglocs[func_index], arglocs[func_index+1:], arglocs[0]) descr = op.getdescr() assert isinstance(descr, CallDescr) cb.callconv = descr.get_call_conv() cb.argtypes = descr.get_arg_types() cb.restype = descr.get_result_type() sizeloc = arglocs[1] assert sizeloc.is_imm() cb.ressize = sizeloc.value signloc = arglocs[2] assert signloc.is_imm() cb.ressign = signloc.value if is_call_release_gil: saveerrloc = arglocs[3] assert saveerrloc.is_imm() cb.emit_call_release_gil(saveerrloc.value) else: effectinfo = descr.get_extra_info() if effectinfo is None or effectinfo.check_can_collect(): cb.emit() else: cb.emit_no_collect()
def prepare_guard_op_guard_not_forced(self, op, prev_op): if rop.is_call_release_gil(prev_op.getopnum()): arglocs = self._prepare_call(prev_op, save_all_regs=True, first_arg_index=2) elif rop.is_call_assembler(prev_op.getopnum()): locs = self.locs_for_call_assembler(prev_op) tmploc = self.get_scratch_reg(INT, selected_reg=r.x0) resloc = self._call(prev_op, locs + [tmploc], gc_level=2) arglocs = locs + [resloc, tmploc] else: assert rop.is_call_may_force(prev_op.getopnum()) arglocs = self._prepare_call(prev_op, save_all_regs=True) guard_locs = self._guard_impl(op) return arglocs + guard_locs, len(arglocs)