For what is worth I'm happy with making "rething regalloc API" a sprint topic. So far I failed to come up with something more reasonable.
Cheers, fijal On Mon, Jan 10, 2011 at 12:33 AM, arigo <[email protected]> wrote: > Author: Armin Rigo <[email protected]> > Branch: jit-longlong > Changeset: r40545:9a472ddf9893 > Date: 2011-01-09 23:33 +0100 > http://bitbucket.org/pypy/pypy/changeset/9a472ddf9893/ > > Log: Intermediate check-in, breaks everything by exposing cases of > constant arguments that are not correctly handled so far. /me is > again annoyed by the API of regalloc.py, which seems to be very > reasonable, until we hit these cases. > > diff --git a/pypy/jit/backend/x86/assembler.py > b/pypy/jit/backend/x86/assembler.py > --- a/pypy/jit/backend/x86/assembler.py > +++ b/pypy/jit/backend/x86/assembler.py > @@ -1174,6 +1174,13 @@ > self.mc.SBB_rr(resloc.value, resloc.value) > self.mc.NEG_r(resloc.value) > > + def genop_llong_lt(self, op, arglocs, resloc): > + # XXX just a special case for now: "x < 0" > + loc1, = arglocs > + self.mc.PMOVMSKB_rx(resloc.value, loc1.value) > + self.mc.SHR_ri(resloc.value, 7) > + self.mc.AND_ri(resloc.value, 1) > + > def genop_new_with_vtable(self, op, arglocs, result_loc): > assert result_loc is eax > loc_vtable = arglocs[-1] > @@ -1784,6 +1791,7 @@ > if isinstance(op.getdescr(), LongLongCallDescr): > self.mc.MOV_br(resloc.value, eax.value) # long long > self.mc.MOV_br(resloc.value + 4, edx.value) > + # XXX should ideally not move the result on the stack > else: > self.mc.FSTP_b(resloc.value) # float return > elif size == WORD: > > diff --git a/pypy/jit/codewriter/jtransform.py > b/pypy/jit/codewriter/jtransform.py > --- a/pypy/jit/codewriter/jtransform.py > +++ b/pypy/jit/codewriter/jtransform.py > @@ -894,7 +894,8 @@ > args = op.args > op1 = self.prepare_builtin_call(op, "llong_%s", args) > op2 = self._handle_oopspec_call(op1, args, > - EffectInfo.OS_LLONG_%s) > + EffectInfo.OS_LLONG_%s, > + EffectInfo.EF_PURE) > return op2 > ''' % (_op, _oopspec.lower(), _oopspec)).compile() > > @@ -1273,7 +1274,7 @@ > > def _handle_oopspec_call(self, op, args, oopspecindex, extraeffect=None): > calldescr = self.callcontrol.getcalldescr(op, oopspecindex) > - if extraeffect: > + if extraeffect is not None: > calldescr.get_extra_info().extraeffect = extraeffect > if isinstance(op.args[0].value, str): > pass # for tests only > > diff --git a/pypy/jit/backend/x86/regalloc.py > b/pypy/jit/backend/x86/regalloc.py > --- a/pypy/jit/backend/x86/regalloc.py > +++ b/pypy/jit/backend/x86/regalloc.py > @@ -653,6 +653,22 @@ > self.PerformLLong(op, [loc1, loc2, loc3], loc0) > self.xrm.possibly_free_vars(args) > > + def _maybe_consider_llong_lt(self, op): > + # XXX just a special case for now > + from pypy.rlib.longlong2float import longlong2float > + box = op.getarg(2) > + if not isinstance(box, ConstFloat): > + return False > + if not (box.value == longlong2float(r_longlong(0))): > + return False > + # "x < 0" > + box = op.getarg(1) > + loc1 = self.xrm.make_sure_var_in_reg(box, imm_fine=False) > + loc0 = self.rm.force_allocate_reg(op.result) > + self.PerformLLong(op, [loc1], loc0) > + self.xrm.possibly_free_var(box) > + return True > + > def _consider_llong_to_int(self, op): > # accept an argument in a xmm register or in the stack > loc1 = self.xrm.loc(op.getarg(1)) > @@ -769,6 +785,9 @@ > if (oopspecindex == EffectInfo.OS_LLONG_EQ or > oopspecindex == EffectInfo.OS_LLONG_NE): > return self._consider_llong_cmp_xx(op) > + if oopspecindex == EffectInfo.OS_LLONG_LT: > + if self._maybe_consider_llong_lt(op): > + return > # > self._consider_call(op) > > _______________________________________________ > pypy-svn mailing list > [email protected] > http://codespeak.net/mailman/listinfo/pypy-svn > _______________________________________________ [email protected] http://codespeak.net/mailman/listinfo/pypy-dev
