On Mon, Aug 12, 2019 at 12:36 PM Nathan Chancellor <natechancellor@xxxxxxxxx> wrote: > > 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/605 > Suggested-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> > Signed-off-by: Nathan Chancellor <natechancellor@xxxxxxxxx> LGTM thanks Nathan. Reviewed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> > --- > > This supersedes the following two patches: > > https://lore.kernel.org/lkml/20190812033120.43013-4-natechancellor@xxxxxxxxx/ > > https://lore.kernel.org/lkml/20190812033120.43013-5-natechancellor@xxxxxxxxx/ > > I labelled this as a v2 so those don't get applied. > > lib/mpi/longlong.h | 36 +----------------------------------- > 1 file changed, 1 insertion(+), 35 deletions(-) > > diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h > index 3bb6260d8f42..2dceaca27489 100644 > --- a/lib/mpi/longlong.h > +++ b/lib/mpi/longlong.h > @@ -639,30 +639,12 @@ do { \ > ************** MIPS ***************** > ***************************************/ > #if defined(__mips__) && W_TYPE_SIZE == 32 > -#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) > #define umul_ppmm(w1, w0, u, v) \ > do { \ > UDItype __ll = (UDItype)(u) * (v); \ > w1 = __ll >> 32; \ > w0 = __ll; \ > } 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 UDIV_TIME 100 > #endif /* __mips__ */ > @@ -687,7 +669,7 @@ do { \ > : "d" ((UDItype)(u)), \ > "d" ((UDItype)(v))); \ > } while (0) > -#elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) > +#else > #define umul_ppmm(w1, w0, u, v) \ > do { \ > typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ > @@ -695,22 +677,6 @@ do { \ > w1 = __ll >> 64; \ > w0 = __ll; \ > } 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 > #define UMUL_TIME 20 > #define UDIV_TIME 140 > -- > 2.23.0.rc2 > -- Thanks, ~Nick Desaulniers