[PATCH] Optimize 32-bit sparc T1 multiply routines.

Niels Möller nisse at lysator.liu.se
Sun Jan 6 08:40:20 CET 2013


David Miller <davem at davemloft.net> writes:

> I must be dense, but the implementation below doesn't work:

In which way does it fail? I suspect handling of input and output carry
is wrong (but it's long time since I tried any sparc assembly, so I have
forgotten most details).

> PROLOGUE(mpn_sub_nc)
> 	b,a	L(ent)
> EPILOGUE()
> PROLOGUE(mpn_sub_n)
> 	mov	0, cy
> L(ent):	cmp	%g0, cy

Does this subtract cy from zero, setting carry flag when cy > 0? That's
not correct, you should set the carry flag iff cy == 0.

> L(top):	ldx	[up+0], %o4
> 	add	up, 8, up
> 	ldx	[vp+0], %o5
> 	add	vp, 8, vp
> 	add	rp, 8, rp
> 	add	n, -1, n
> 	xnor	%o5, %g0, %o5
> 	addxccc	%o4, %o5, %g3
> 	brgz	n, L(top)
> 	 stx	%g3, [rp-8]
>
> 	retl
> 	addc	%g0, %g0, %o0
> EPILOGUE()
>
> Isn't it the case that this won't generate the correct
> overflow condition?  We need the inverse of the overflow
> bit this addxccc generates.

You should return one iff the carry flag is clear at the end of the
loop, so I agree the output carry handling is wrong too.

If you believe in the equation in a previous mail,

u - v = u + (B^n - 1 - v) + 1 - B^n
            Complement    cin   adjust cout

Regards,
/Niels

-- 
Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.


More information about the gmp-devel mailing list