diff mbox series

[16/17] target/hexagon: Use mulu64 for int128_mul_6464

Message ID 20241208224844.570491-17-richard.henderson@linaro.org (mailing list archive)
State New
Headers show
Series softfloat, hexagon: Cleanup fmaf | expand

Commit Message

Richard Henderson Dec. 8, 2024, 10:48 p.m. UTC
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(-)

Comments

Brian Cain Dec. 10, 2024, 2:06 a.m. UTC | #1
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 mbox series

Patch

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)