andy@CSVAX.CALTECH.EDU (Andy Fyfe) (02/09/90)
I wrote the following code to implement the asni ldiv function:
typedef struct {
long quot;
long rem;
} ldiv_t;
ldiv_t
ldiv(long a, long b)
{
ldiv_t r;
__asm__("divsl%.l %3,%0:%1"
: "=r" (r.rem), "=r" (r.quot) : "1" (a), "g" (b));
return r;
}
The code produced by "gcc -O" is correct, but the "divsl" instruction
is followed by 4 redundant moves (and hence an unnecessary save and
restore of a register). Here is the assembler output of gcc:
#NO_APP
gcc_compiled.:
.text
.even
.globl _ldiv
_ldiv:
link a6,#0
movel d2,sp@-
movel a6@(8),d0
#APP
divsll a6@(12),d1:d0
#NO_APP
movel d1,d2
movel d0,d1
movel d1,d0
movel d2,d1
movel a6@(-4),d2
unlk a6
rts
[Aside: The sun optimizer, /lib/c2, removes the 4 moves.]