Example #1
0
    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()
Example #2
0
 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)