Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/softint/generic/multiplication.c

    ra35b458 r2467b41  
    5353        unsigned int b1 = b >> 16;
    5454        unsigned int b2 = b & UINT16_MAX;
    55 
     55       
    5656        unsigned long long t1 = a1 * b1;
    5757        unsigned long long t2 = a1 * b2;
    5858        t2 += a2 * b1;
    5959        unsigned long long t3 = a2 * b2;
    60 
     60       
    6161        t3 = (((t1 << 16) + t2) << 16) + t3;
    62 
     62       
    6363        return t3;
    6464}
     
    7070{
    7171        char neg = 0;
    72 
     72       
    7373        if (a < 0) {
    7474                neg = !neg;
    7575                a = -a;
    7676        }
    77 
     77       
    7878        if (b < 0) {
    7979                neg = !neg;
    8080                b = -b;
    8181        }
    82 
     82       
    8383        unsigned long long a1 = a >> 32;
    8484        unsigned long long b1 = b >> 32;
    85 
     85       
    8686        unsigned long long a2 = a & (UINT32_MAX);
    8787        unsigned long long b2 = b & (UINT32_MAX);
    88 
     88       
    8989        if (SOFTINT_CHECK_OF && (a1 != 0) && (b1 != 0)) {
    9090                /* Error (overflow) */
    9191                return (neg ? INT64_MIN : INT64_MAX);
    9292        }
    93 
     93       
    9494        /* (if OF checked) a1 or b1 is zero => result fits in 64 bits,
    9595         * no need to another overflow check
    9696         */
    9797        unsigned long long t1 = mul(a1, b2) + mul(b1, a2);
    98 
     98       
    9999        if ((SOFTINT_CHECK_OF) && (t1 > UINT32_MAX)) {
    100100                /* Error (overflow) */
    101101                return (neg ? INT64_MIN : INT64_MAX);
    102102        }
    103 
     103       
    104104        t1 = t1 << 32;
    105105        unsigned long long t2 = mul(a2, b2);
    106106        t2 += t1;
    107 
     107       
    108108        /* t2 & (1ull << 63) - if this bit is set in unsigned long long,
    109109         * result does not fit in signed one */
     
    112112                return (neg ? INT64_MIN : INT64_MAX);
    113113        }
    114 
     114       
    115115        long long result = t2;
    116116        if (neg)
    117117                result = -result;
    118 
     118       
    119119        return result;
    120120}
Note: See TracChangeset for help on using the changeset viewer.