Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ac883c9 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Utilize __builtin functions to improve overflow handling" into main am: 2626db4b

parents a0f9f9bc 2626db4b
Loading
Loading
Loading
Loading
+22 −46
Original line number Diff line number Diff line
@@ -120,16 +120,12 @@ extern "C"
    {
        Word32 L_sum;

        L_sum = L_var1 + L_var2;

        if ((L_var1 ^ L_var2) >= 0)
        {
            if ((L_sum ^ L_var1) < 0)
        if (__builtin_add_overflow(L_var1, L_var2, &L_sum))
        {
            // saturating...
            L_sum = (L_var1 < 0) ? MIN_32 : MAX_32;
            *pOverflow = 1;
        }
        }

        return (L_sum);
    }
@@ -160,16 +156,12 @@ extern "C"
    {
        Word32 L_diff;

        L_diff = L_var1 - L_var2;

        if ((L_var1 ^ L_var2) < 0)
        {
            if ((L_diff ^ L_var1) & MIN_32)
        if (__builtin_sub_overflow(L_var1, L_var2, &L_diff))
        {
            // saturating...
            L_diff = (L_var1 < 0L) ? MIN_32 : MAX_32;
            *pOverflow = 1;
        }
        }

        return (L_diff);
    }
@@ -204,18 +196,14 @@ extern "C"
        result = (Word32) var1 * var2;
        if (result != (Word32) 0x40000000L)
        {
            L_sum = (result << 1) + L_var3;

            /* Check if L_sum and L_var_3 share the same sign */
            if ((L_var3 ^ result) > 0)
            {
                if ((L_sum ^ L_var3) < 0)
            if (__builtin_add_overflow((result << 1), L_var3, &L_sum))
            {
                // saturating...
                L_sum = (L_var3 < 0) ? MIN_32 : MAX_32;
                *pOverflow = 1;
            }
        }
        }
        else
        {
            *pOverflow = 1;
@@ -345,15 +333,11 @@ extern "C"
        product32 = ((Word32) L_var1_hi * L_var2_lo) >> 15;

        /* L_product = L_mac (L_product, result, 1, pOverflow); */
        L_sum = L_product + (product32 << 1);

        if ((L_product ^ product32) > 0)
        {
            if ((L_sum ^ L_product) < 0)
        if (__builtin_add_overflow(L_product, (product32 << 1), &L_sum))
        {
            // saturating...
            L_sum = (L_product < 0) ? MIN_32 : MAX_32;
        }
        }

        L_product = L_sum;

@@ -361,15 +345,11 @@ extern "C"
        product32 = ((Word32) L_var1_lo * L_var2_hi) >> 15;

        /* L_product = L_mac (L_product, result, 1, pOverflow); */
        L_sum = L_product + (product32 << 1);

        if ((L_product ^ product32) > 0)
        {
            if ((L_sum ^ L_product) < 0)
        if (__builtin_add_overflow(L_product, (product32 << 1), &L_sum))
        {
            // saturating...
            L_sum = (L_product < 0) ? MIN_32 : MAX_32;
        }
        }
        return (L_sum);
    }

@@ -416,16 +396,12 @@ extern "C"

        result = ((Word32)L_var1_lo * var2) >> 15;

        L_sum  =  L_product + (result << 1);

        if ((L_product ^ result) > 0)
        {
            if ((L_sum ^ L_product) < 0)
        if (__builtin_add_overflow(L_product, (result << 1), &L_sum))
        {
            // saturating...
            L_sum = (L_product < 0) ? MIN_32 : MAX_32;
            *pOverflow = 1;
        }
        }
        return (L_sum);

    }
+3 −7
Original line number Diff line number Diff line
@@ -376,17 +376,13 @@ Word16 G_pitch( /* o : Gain of pitch lag saturated to 1.2 */
    {
        L_temp = ((Word32) * (p_xn++) * *(p_y1++));
        s1 = s;
        s = s1 + L_temp;

        if ((s1 ^ L_temp) > 0)
        {
            if ((s1 ^ s) < 0)
        if (__builtin_add_overflow(s1, L_temp, &s))
        {
            *pOverflow = 1;
            break;
        }
    }
    }

    if (!(*pOverflow))
    {
+6 −12
Original line number Diff line number Diff line
@@ -569,14 +569,11 @@ __attribute__((no_sanitize("integer")))
static_vo Word32 L_add (Word32 L_var1, Word32 L_var2)
{
    Word32 L_var_out;
    L_var_out = L_var1 + L_var2;
    if (((L_var1 ^ L_var2) & MIN_32) == 0)
    {
        if ((L_var_out ^ L_var1) & MIN_32)
    if (__builtin_add_overflow(L_var1, L_var2, &L_var_out))
    {
        // saturating...
        L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
    }
    }
    return (L_var_out);
}

@@ -616,14 +613,11 @@ __attribute__((no_sanitize("integer")))
static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2)
{
    Word32 L_var_out;
    L_var_out = L_var1 - L_var2;
    if (((L_var1 ^ L_var2) & MIN_32) != 0)
    {
        if ((L_var_out ^ L_var1) & MIN_32)
    if (__builtin_sub_overflow(L_var1, L_var2, &L_var_out))
    {
        // saturating...
        L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
    }
    }
    return (L_var_out);
}