|
@@ -641,7 +641,14 @@ do { \
|
|
************** MIPS *****************
|
|
************** MIPS *****************
|
|
***************************************/
|
|
***************************************/
|
|
#if defined(__mips__) && W_TYPE_SIZE == 32
|
|
#if defined(__mips__) && W_TYPE_SIZE == 32
|
|
-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
|
|
|
|
|
|
+#if __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) \
|
|
#define umul_ppmm(w1, w0, u, v) \
|
|
__asm__ ("multu %2,%3" \
|
|
__asm__ ("multu %2,%3" \
|
|
: "=l" ((USItype)(w0)), \
|
|
: "=l" ((USItype)(w0)), \
|
|
@@ -666,7 +673,15 @@ do { \
|
|
************** MIPS/64 **************
|
|
************** MIPS/64 **************
|
|
***************************************/
|
|
***************************************/
|
|
#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
|
|
#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
|
|
-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
|
|
|
|
|
|
+#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4
|
|
|
|
+#define umul_ppmm(w1, w0, u, v) \
|
|
|
|
+do { \
|
|
|
|
+ typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
|
|
|
|
+ __ll_UTItype __ll = (__ll_UTItype)(u) * (v); \
|
|
|
|
+ w1 = __ll >> 64; \
|
|
|
|
+ w0 = __ll; \
|
|
|
|
+} while (0)
|
|
|
|
+#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
|
|
#define umul_ppmm(w1, w0, u, v) \
|
|
#define umul_ppmm(w1, w0, u, v) \
|
|
__asm__ ("dmultu %2,%3" \
|
|
__asm__ ("dmultu %2,%3" \
|
|
: "=l" ((UDItype)(w0)), \
|
|
: "=l" ((UDItype)(w0)), \
|