lightning
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] ppc: Fix extr_d() on 32-bit PPC


From: Paul Cercueil
Subject: Re: [PATCH] ppc: Fix extr_d() on 32-bit PPC
Date: Mon, 29 Aug 2022 20:46:34 +0100

Hi Paulo,

Le lun., août 29 2022 at 16:44:35 -0300, Paulo César Pereira de Andrade <paulo.cesar.pereira.de.andrade@gmail.com> a écrit :
Em sáb., 27 de ago. de 2022 às 20:30, Paul Cercueil
<paul@crapouillou.net> escreveu:

 Note that with your recent SQRT patches and this one, the checks all
 pass on PowerPC 32-bit now.

  That is great news.
  Thanks for letting me know!

No problem.

One thing bothers me though - extr_f() and extr_d() are defined to the same thing; but doubles and floats are different, how does this work?

-Paul



 Le sam., août 27 2022 at 16:17:30 +0100, Paul Cercueil
 <paul@crapouillou.net> a écrit :
> The FCFID instruction is only available on 64-bit PowerPC. Therefore
 > it
 > is necesary to use a software mechanism to convert integers to
 > floating-point on 32-bit PowerPC.
 >
 > Tested and working on PowerPC-32 big-endian and little-endian.
 >
 > Signed-off-by: Paul Cercueil <paul@crapouillou.net>
 > ---
 >  lib/jit_ppc-fpu.c | 31 ++++++++++++++++++++++++-------
 >  1 file changed, 24 insertions(+), 7 deletions(-)
 >
 > diff --git a/lib/jit_ppc-fpu.c b/lib/jit_ppc-fpu.c
 > index 387cc6f..dd66d03 100644
 > --- a/lib/jit_ppc-fpu.c
 > +++ b/lib/jit_ppc-fpu.c
 > @@ -484,23 +484,40 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0,
 > jit_float64_t *i0)
 >       ldi_d(r0, (jit_word_t)i0);
 >  }
 >
> -/* should only work on newer ppc (fcfid is a ppc64 instruction) */
 >  static void
 >  _extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 >  {
 >  #  if __WORDSIZE == 32
 > -    jit_int32_t              reg;
 > +    jit_int32_t              reg, freg, off1, off2;
 > +
 > +#  if __BYTE_ORDER == __BIG_ENDIAN
 > +    off1 = alloca_offset - 8;
 > +    off2 = alloca_offset - 4;
 > +#  else
 > +    off1 = alloca_offset - 4;
 > +    off2 = alloca_offset - 8;
 > +#  endif
 > +
 >      reg = jit_get_reg(jit_class_gpr);
 > -    rshi(rn(reg), r1, 31);
 > -    /* use reserved 8 bytes area */
 > -    stxi(alloca_offset - 4, _FP_REGNO, r1);
 > -    stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
 > +    freg = jit_get_reg(jit_class_fpr);
 > +
 > +    movi(rn(reg), 0x43300000);
 > +    stxi_i(off1, _FP_REGNO, rn(reg));
 > +    movi(rn(reg), 0x80000000);
 > +    stxi_i(off2, _FP_REGNO, rn(reg));
 > +    ldxi_d(rn(freg), _FP_REGNO, alloca_offset - 8);
 > +    xorr(rn(reg), r1, rn(reg));
 > +    stxi_i(off2, _FP_REGNO, rn(reg));
 > +    ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
 > +    subr_d(r0, r0, rn(freg));
 > +
 >      jit_unget_reg(reg);
 > +    jit_unget_reg(freg);
 >  #  else
 >      stxi(alloca_offset - 8, _FP_REGNO, r1);
 > -#  endif
 >      ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
 >      FCFID(r0, r0);
 > +#  endif
 >  }
 >
 >  static void
 > --
 > 2.35.1
 >







reply via email to

[Prev in Thread] Current Thread [Next in Thread]