! Integer Version 2.0, RD, 11.2.93	idigitaddsubmult.s
! Integer Version 2.1, RD, 13.7.93	idigitaddsubmult.s

#include "lidia_elf.h"

	.seg	"text"			! [internal]

	.global	USCORE(DigitAdd)
USCORE(DigitAdd):
	mov	%o0,%o4
	addcc	%o3,%o1,%o1
	addx	%g0, %g0, %o0
	addcc	%o1,%o2,%o1
	addx	%o0, %g0, %o0
	retl
	st	%o1,[%o4]

	.global	USCORE(DigitSub)
USCORE(DigitSub):
	mov	%o0,%o4
	subcc	%o1,%o2,%o2
	addx	%g0, %g0, %o0
	subcc	%o2,%o3,%o1
	addx	%o0, %g0, %o0
	retl
	st	%o1,[%o4]

	.global	USCORE(DigitMult)
USCORE(DigitMult):
	mov	%o2, %y
	sra	%o1, 31, %o5	! %o5 = (%o1 < 0 ? %o2 : 0)
	and	%o2, %o5, %o5

	andcc	%g0, %g0, %o4		! reset N and V
	mulscc	%o4, %o1, %o4	! first iteration of 33
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %g0, %o4

	rd	%y, %o1		! prod (low)
	st	%o1, [%o0]
	retl
	add	%o4, %o5, %o0 	! <high> = %o4 + %o5 (sign correction)


	.global	USCORE(DigitMultAdd)
USCORE(DigitMultAdd):
	mov	%o2, %y
	andcc	%g0, %g0, %o4		! reset N and V
	nop
	nop
	mulscc	%o4, %o1, %o4	! first iteration of 33
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4
	mulscc	%o4, %o1, %o4

	mulscc	%o4, %g0, %o4

	tst	%o1			! sign correction
	bge	Lpm1
	mov	%o0, %o5
	add	%o4, %o2, %o4		! sign correction
Lpm1:
	rd	%y, %o0			! prod (low)

	addcc	%o0, %o3, %o1		! prod + carry
	addx	%o4, %g0, %o0
	retl
	st      %o1,[%o5]

	.seg	"data"			! [internal]
