Message ID | 20241208224844.570491-17-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | softfloat, hexagon: Cleanup fmaf | expand |
On 12/8/2024 4:48 PM, Richard Henderson wrote: > No need to open-code 64x64->128-bit multiplication. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/hexagon/fma_emu.c | 32 +++----------------------------- > 1 file changed, 3 insertions(+), 29 deletions(-) > > diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c > index 343c40a686..6749538c09 100644 > --- a/target/hexagon/fma_emu.c > +++ b/target/hexagon/fma_emu.c > @@ -82,38 +82,12 @@ int32_t float32_getexp(float32 f32) > return -1; > } > > -static uint32_t int128_getw0(Int128 x) > -{ > - return int128_getlo(x); > -} > - > -static uint32_t int128_getw1(Int128 x) > -{ > - return int128_getlo(x) >> 32; > -} > - > static Int128 int128_mul_6464(uint64_t ai, uint64_t bi) > { > - Int128 a, b; > - uint64_t pp0, pp1a, pp1b, pp1s, pp2; > + uint64_t l, h; > > - a = int128_make64(ai); > - b = int128_make64(bi); > - pp0 = (uint64_t)int128_getw0(a) * (uint64_t)int128_getw0(b); > - pp1a = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw0(b); > - pp1b = (uint64_t)int128_getw1(b) * (uint64_t)int128_getw0(a); > - pp2 = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw1(b); > - > - pp1s = pp1a + pp1b; > - if ((pp1s < pp1a) || (pp1s < pp1b)) { > - pp2 += (1ULL << 32); > - } > - uint64_t ret_low = pp0 + (pp1s << 32); > - if ((ret_low < pp0) || (ret_low < (pp1s << 32))) { > - pp2 += 1; > - } > - > - return int128_make128(ret_low, pp2 + (pp1s >> 32)); > + mulu64(&l, &h, ai, bi); > + return int128_make128(l, h); > } Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com> > > static Int128 int128_sub_borrow(Int128 a, Int128 b, int borrow)
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c index 343c40a686..6749538c09 100644 --- a/target/hexagon/fma_emu.c +++ b/target/hexagon/fma_emu.c @@ -82,38 +82,12 @@ int32_t float32_getexp(float32 f32) return -1; } -static uint32_t int128_getw0(Int128 x) -{ - return int128_getlo(x); -} - -static uint32_t int128_getw1(Int128 x) -{ - return int128_getlo(x) >> 32; -} - static Int128 int128_mul_6464(uint64_t ai, uint64_t bi) { - Int128 a, b; - uint64_t pp0, pp1a, pp1b, pp1s, pp2; + uint64_t l, h; - a = int128_make64(ai); - b = int128_make64(bi); - pp0 = (uint64_t)int128_getw0(a) * (uint64_t)int128_getw0(b); - pp1a = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw0(b); - pp1b = (uint64_t)int128_getw1(b) * (uint64_t)int128_getw0(a); - pp2 = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw1(b); - - pp1s = pp1a + pp1b; - if ((pp1s < pp1a) || (pp1s < pp1b)) { - pp2 += (1ULL << 32); - } - uint64_t ret_low = pp0 + (pp1s << 32); - if ((ret_low < pp0) || (ret_low < (pp1s << 32))) { - pp2 += 1; - } - - return int128_make128(ret_low, pp2 + (pp1s >> 32)); + mulu64(&l, &h, ai, bi); + return int128_make128(l, h); } static Int128 int128_sub_borrow(Int128 a, Int128 b, int borrow)
No need to open-code 64x64->128-bit multiplication. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/hexagon/fma_emu.c | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-)