Ilya Zakharevich on Mon, 8 Apr 2002 19:30:15 -0400


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: GP/PARI 2.1.3: ix86 assembler for divll


On Mon, Apr 01, 2002 at 04:54:45PM -0500, Ilya Zakharevich wrote:
> Try compiling this (e.g., append it to src/gp/gp.c)
> 
>   void
>   ddummyy(ulong a)
>   {
>     (void)divll(a, 1000000000);
>   }
> 
> On ix86, this produces the following assembler:
> 
>           .align 2
>   .globl _ddummyy
>   _ddummyy:
>           movl 4(%esp),%eax
>           movl _hiremainder,%edx
>   /APP
>           divl $1000000000
>   /NO_APP
>           movl %edx,_hiremainder
>           ret
> 
> which results in the following message from gas:
> 
>   {stdin}: Assembler messages:
>   {stdin}:9343: Error: operands given don't match any known 386 instruction

Per 386book, IDIV takes memory or register operand.  Per
  http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_16.html#SEC175
this should be denoted "mr", not "g" ("g" includes immediate-integer
operands).

--- ./src/kernel/ix86/level0.h-pre	Fri Nov  3 13:00:24 2000
+++ ./src/kernel/ix86/level0.h	Mon Apr  8 15:41:16 2002
@@ -173,7 +173,7 @@ extern ulong hiremainder;
 ({ ulong __value, __arg1 = (a), __arg2 = (b); \
    __asm__ ("divl %4" \
         : "=a" /* %eax */ (__value), "=d" /* %edx */ (hiremainder) \
-        : "0" /* %eax */ (__arg1), "1" /* %edx */ (hiremainder), "g" (__arg2)); \
+        : "0" /* %eax */ (__arg1), "1" /* %edx */ (hiremainder), "mr" /* memory or general register */ (__arg2)); \
    __value; \
 })
 
Enjoy,
Ilya