Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • boot/genarch/src/multiplication.c

    r9539be6 r4872160  
    3333
    3434#include <genarch/multiplication.h>
    35 #include <typedefs.h>
    3635
    37 /** Set 1 to return INT64_MAX or INT64_MIN on overflow */
     36/** Set 1 to return MAX_INT64 or MIN_INT64 on overflow */
    3837#ifndef SOFTINT_CHECK_OF
    39         #define SOFTINT_CHECK_OF  0
     38        #define SOFTINT_CHECK_OF 0
    4039#endif
     40
     41#define MAX_UINT16  (0xFFFFu)
     42#define MAX_UINT32  (0xFFFFFFFFu)
     43#define MAX_INT64   (0x7FFFFFFFFFFFFFFFll)
     44#define MIN_INT64   (0x8000000000000000ll)
    4145
    4246/** Multiply two integers and return long long as result.
     
    4751static unsigned long long mul(unsigned int a, unsigned int b) {
    4852        unsigned int a1 = a >> 16;
    49         unsigned int a2 = a & UINT16_MAX;
     53        unsigned int a2 = a & MAX_UINT16;
    5054        unsigned int b1 = b >> 16;
    51         unsigned int b2 = b & UINT16_MAX;
     55        unsigned int b2 = b & MAX_UINT16;
    5256       
    5357        unsigned long long t1 = a1 * b1;
     
    8185        unsigned long long b1 = b >> 32;
    8286       
    83         unsigned long long a2 = a & (UINT32_MAX);
    84         unsigned long long b2 = b & (UINT32_MAX);
     87        unsigned long long a2 = a & (MAX_UINT32);
     88        unsigned long long b2 = b & (MAX_UINT32);
    8589       
    8690        if (SOFTINT_CHECK_OF && (a1 != 0) && (b1 != 0)) {
    8791                /* Error (overflow) */
    88                 return (neg ? INT64_MIN : INT64_MAX);
     92                return (neg ? MIN_INT64 : MAX_INT64);
    8993        }
    9094       
     
    9498        unsigned long long t1 = mul(a1, b2) + mul(b1, a2);
    9599       
    96         if ((SOFTINT_CHECK_OF) && (t1 > UINT32_MAX)) {
     100        if ((SOFTINT_CHECK_OF) && (t1 > MAX_UINT32)) {
    97101                /* Error (overflow) */
    98                 return (neg ? INT64_MIN : INT64_MAX);
     102                return (neg ? MIN_INT64 : MAX_INT64);
    99103        }
    100104       
     
    108112        if ((SOFTINT_CHECK_OF) && ((t2 < t1) || (t2 & (1ull << 63)))) {
    109113                /* Error (overflow) */
    110                 return (neg ? INT64_MIN : INT64_MAX);
     114                return (neg ? MIN_INT64 : MAX_INT64);
    111115        }
    112116       
Note: See TracChangeset for help on using the changeset viewer.