Commit b0c091ae authored by Nathan Chancellor's avatar Nathan Chancellor Committed by Herbert Xu

lib/mpi: Eliminate unused umul_ppmm definitions for MIPS

Clang errors out when building this macro:

lib/mpi/generic_mpih-mul1.c:37:24: error: invalid use of a cast in a
inline asm context requiring an l-value: remove the cast or build with
-fheinous-gnu-extensions
                umul_ppmm(prod_high, prod_low, s1_ptr[j], s2_limb);
                ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/mpi/longlong.h:652:20: note: expanded from macro 'umul_ppmm'
        : "=l" ((USItype)(w0)), \
                ~~~~~~~~~~^~~
lib/mpi/generic_mpih-mul1.c:37:3: error: invalid output constraint '=h'
in asm
                umul_ppmm(prod_high, prod_low, s1_ptr[j], s2_limb);
                ^
lib/mpi/longlong.h:653:7: note: expanded from macro 'umul_ppmm'
             "=h" ((USItype)(w1)) \
             ^
2 errors generated.

The C version that is used for GCC 4.4 and up works well with clang;
however, it is not currently being used because Clang masks itself
as GCC 4.2.1 for compatibility reasons. As Nick points out, we require
GCC 4.6 and newer in the kernel so we can eliminate all of the
versioning checks and just use the C version of umul_ppmm for all
supported compilers.

Link: https://github.com/ClangBuiltLinux/linux/issues/605Suggested-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Signed-off-by: default avatarNathan Chancellor <natechancellor@gmail.com>
Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent ff296293
...@@ -639,30 +639,12 @@ do { \ ...@@ -639,30 +639,12 @@ do { \
************** MIPS ***************** ************** MIPS *****************
***************************************/ ***************************************/
#if defined(__mips__) && W_TYPE_SIZE == 32 #if defined(__mips__) && W_TYPE_SIZE == 32
#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
do { \ do { \
UDItype __ll = (UDItype)(u) * (v); \ UDItype __ll = (UDItype)(u) * (v); \
w1 = __ll >> 32; \ w1 = __ll >> 32; \
w0 = __ll; \ w0 = __ll; \
} while (0) } while (0)
#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
#define umul_ppmm(w1, w0, u, v) \
__asm__ ("multu %2,%3" \
: "=l" ((USItype)(w0)), \
"=h" ((USItype)(w1)) \
: "d" ((USItype)(u)), \
"d" ((USItype)(v)))
#else
#define umul_ppmm(w1, w0, u, v) \
__asm__ ("multu %2,%3\n" \
"mflo %0\n" \
"mfhi %1" \
: "=d" ((USItype)(w0)), \
"=d" ((USItype)(w1)) \
: "d" ((USItype)(u)), \
"d" ((USItype)(v)))
#endif
#define UMUL_TIME 10 #define UMUL_TIME 10
#define UDIV_TIME 100 #define UDIV_TIME 100
#endif /* __mips__ */ #endif /* __mips__ */
...@@ -687,7 +669,7 @@ do { \ ...@@ -687,7 +669,7 @@ do { \
: "d" ((UDItype)(u)), \ : "d" ((UDItype)(u)), \
"d" ((UDItype)(v))); \ "d" ((UDItype)(v))); \
} while (0) } while (0)
#elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) #else
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
do { \ do { \
typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
...@@ -695,22 +677,6 @@ do { \ ...@@ -695,22 +677,6 @@ do { \
w1 = __ll >> 64; \ w1 = __ll >> 64; \
w0 = __ll; \ w0 = __ll; \
} while (0) } while (0)
#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
#define umul_ppmm(w1, w0, u, v) \
__asm__ ("dmultu %2,%3" \
: "=l" ((UDItype)(w0)), \
"=h" ((UDItype)(w1)) \
: "d" ((UDItype)(u)), \
"d" ((UDItype)(v)))
#else
#define umul_ppmm(w1, w0, u, v) \
__asm__ ("dmultu %2,%3\n" \
"mflo %0\n" \
"mfhi %1" \
: "=d" ((UDItype)(w0)), \
"=d" ((UDItype)(w1)) \
: "d" ((UDItype)(u)), \
"d" ((UDItype)(v)))
#endif #endif
#define UMUL_TIME 20 #define UMUL_TIME 20
#define UDIV_TIME 140 #define UDIV_TIME 140
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment