| Bill Allombert on Tue, 24 Sep 2002 18:28:17 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: gcc-3.1.1 on alpha |
On Mon, Sep 23, 2002 at 08:16:51PM +0200, Bill Allombert wrote:
> On Tue, Jul 30, 2002 at 06:00:55PM -0400, Igor Schein wrote:
> > Hi,
> >
> > gcc-3.1.1 miscompiles latest CVS pari code on alpha-linux:
> >
> > ? conjvec(Mod(x^2+x+1,x^3-x-1))
> > *** bug in GP (Floating Point Exception), please report
> >
> > That's with debugging binary + alpha kernel. With generic kernel it
> > works fine.
It looks like mulll is not specified correctly. It allowed gcc
to use the same register in input and ouput, clobbering it.
I have no knowledge of the alpha asm, so I do not really know
if I do something meaningful. Here a patch that fix all the asm macros.
Please test!!
Cheers,
Bill.
Index: src/kernel/alpha/asm0.h
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/kernel/alpha/asm0.h,v
retrieving revision 1.3
diff -u -r1.3 asm0.h
--- src/kernel/alpha/asm0.h 2001/10/12 20:27:09 1.3
+++ src/kernel/alpha/asm0.h 2002/09/24 15:53:57
@@ -38,8 +38,8 @@
#define addll(a, b)\
({ register ulong __value, __arg1 = (a), __arg2 = (b); \
- __asm__ volatile ("addq %2,%3,%0\n\tcmpult %4,%2,%1" \
- : "=r" (__value), "=r" (overflow) \
+ __asm__ ("addq %2,%3,%0\n\tcmpult %4,%2,%1" \
+ : "=&r" (__value), "=r" (overflow) \
: "r" (__arg1), "r" (__arg2), "0" ((ulong) 0)); \
__value; \
})
@@ -47,55 +47,55 @@
#define addllx(a, b)\
({ register ulong __value, __arg1 = (a), __arg2 = (b), __temp; \
__asm__ volatile ("addq %3,%4,%0\n\tcmpult %5,%3,%2\n\taddq %5,%6,%0\n\tcmpult %5,%6,%1\n\taddq %6,%7,%1\n\t" \
- : "=r" (__value), "=r" (overflow), "=r" (__temp) \
+ : "=&r" (__value), "=r" (overflow), "=r" (__temp) \
: "r" (__arg1), "r" (__arg2), "0" ((ulong) 0), "1" (overflow), "2" ((ulong) 0)); \
__value; \
})
#define subll(a, b)\
({ register ulong __value, __arg1 = (a), __arg2 = (b); \
- __asm__ volatile ("subq %2,%3,%0\n\tcmpult %2,%4,%1" \
- : "=r" (__value), "=r" (overflow) \
+ __asm__ ("subq %2,%3,%0\n\tcmpult %2,%4,%1" \
+ : "=&r" (__value), "=r" (overflow) \
: "r" (__arg1), "r" (__arg2), "0" ((ulong)0)); \
__value; \
})
#define subllx(a, b)\
({ register ulong __value, __arg1 = (a), __arg2 = (b), __temp1, __temp2; \
-__asm__ volatile ("subq %4,%5,%2\n\tcmpult %4,%8,%3\n\tsubq %8,%7,%0\n\tcmpult %8,%6,%1\n\taddq %7,%9,%1\n\t" \
- : "=r" (__value), "=r" (overflow), "=r" (__temp1), "=r" (__temp2) \
+__asm__ ("subq %4,%5,%2\n\tcmpult %4,%8,%3\n\tsubq %8,%7,%0\n\tcmpult %8,%6,%1\n\taddq %7,%9,%1\n\t" \
+ : "=r" (__value), "=r" (overflow), "=&r" (__temp1), "=r" (__temp2) \
: "r" (__arg1), "r" (__arg2), "0" ((ulong)0), "1" (overflow), "2" ((ulong)0), "3" ((ulong)0)); \
__value; \
})
#define shiftl(a, b) \
({ register ulong __value, __arg1 = (a), __arg2 = (b), __temp; \
- __asm__ volatile ("subq %5,%4,%2\n\tsll %3,%4,%0\n\tsrl %3,%6,%1\n\t" \
- : "=r" (__value), "=r" (hiremainder), "=r" (__temp) \
+ __asm__ ("subq %5,%4,%2\n\tsll %3,%4,%0\n\tsrl %3,%6,%1\n\t" \
+ : "=r" (__value), "=r" (hiremainder), "=&r" (__temp) \
: "r" (__arg1), "r" (__arg2), "n" ((ulong) 64), "2" ((ulong)0)); \
__value; \
})
#define shiftlr(a, b) \
({ register ulong __value, __arg1 = (a), __arg2 = (b), __temp; \
- __asm__ volatile ("subq %5,%4,%2\n\tsrl %3,%4,%0\n\tsll %3,%6,%1\n\t" \
- : "=r" (__value), "=r" (hiremainder), "=r" (__temp) \
+ __asm__ ("subq %5,%4,%2\n\tsrl %3,%4,%0\n\tsll %3,%6,%1\n\t" \
+ : "=r" (__value), "=r" (hiremainder), "=&r" (__temp) \
: "r" (__arg1), "r" (__arg2), "n" ((ulong) 64), "2" ((ulong)0)); \
__value; \
})
#define mulll(a, b) \
({ register ulong __value, __arg1 = (a), __arg2 = (b); \
- __asm__ volatile ("umulh %2,%3,%1\n\tmulq %2,%3,%0\n\t" \
- : "=r" (__value), "=r" (hiremainder) \
+ __asm__ ("umulh %2,%3,%1\n\tmulq %2,%3,%0\n\t" \
+ : "=r" (__value), "=&r" (hiremainder) \
: "r" (__arg1), "r" (__arg2)); \
__value; \
})
#define addmul(a, b) \
({ register ulong __value, __arg1 = (a), __arg2 = (b), __temp; \
- __asm__ volatile ("mulq %3,%4,%0\n\tumulh %3,%4,%2\n\taddq %5,%6,%0\n\tcmpult %5,%6,%1\n\taddq %7,%6,%1\n\t" \
- : "=r" (__value), "=r" (hiremainder), "=r" (__temp) \
+ __asm__ ("mulq %3,%4,%0\n\tumulh %3,%4,%2\n\taddq %5,%6,%0\n\tcmpult %5,%6,%1\n\taddq %7,%6,%1\n\t" \
+ : "=&r" (__value), "=r" (hiremainder), "=r" (__temp) \
: "r" (__arg1), "r" (__arg2), "0" ((ulong) 0), "1" (hiremainder), "2" ((ulong) 0)); \
__value; \
})