! Integer Version 2.1, RD, 3.5.93, Sparc7	idigitvecmultsub.s
!		new specification
! Integer Version 2.0, RD, 11.2.93	idigitvecmultsub.s	*/

#include "lidia_elf.h"

	.global	USCORE(DigitVecMultSub)
USCORE(DigitVecMultSub):
	tst	%o3
	ble	Lvma1
	mov	0, %g5		! carry
Lvma2:
	mov	%o2, %y
	andcc	%g0, %g0, %g3
	ld	[%o1], %g2	! *a
	ld	[%o0], %g4	! *res

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3
	mulscc	%g3, %g2, %g3

	mulscc	%g3, %g0, %g3		! 33rd iteration, prod high

	tst	%g2			! sign correction
	bge	Lvma3
	rd	%y, %g2			! prod low
	add	%g3, %o2, %g3		! sign correction
Lvma3:
	addcc	%g5, %g2, %g2		! carry + prod(low)
	addx	%g3, %g0, %g3		! prod(high) + ..
	subcc	%g4, %g2, %g2		! *res - (low)
	addx	%g3, %g0, %g5		! new carry
	st	%g2, [%o0]		! *res
	inc	4, %o1			! a++
	subcc	%o3, 1, %o3		! count--
	bg	Lvma2			! loop
	inc	4, %o0
Lvma1:
	retl
	mov	%g5, %o0		! return carry
