! Integer Version 2.0, RD, 12.2.93, Sparc8	idigitvecmult.s
!	Differences to idigitvecmultadd.s

#include "lidia_elf.h"

	.global	USCORE(DigitVecMult)
USCORE(DigitVecMult):
    tst %o3
    ble Lvma1
    mov 0, %g1          	! carry
    ld [%o1], %o5   		! *a
    subcc %o3, 1, %o3   	! count--
!    ld [%o0], %o4   		! *paccu
    inc 4, %o1          	! a++
    ble Lvma3
    umul %o5, %o2, %g2   	! *a * m

Lvma2:
    ld  [%o1], %o5  		! *a
!    addcc %o4, %g1, %o4     	! pp+h -> l    			1
!    addx    %g0, %g0, %g1       ! new carry
!    addcc   %g2, %o4, %o4       ! carry + *paccu + prod(low)    1
    addcc   %g2, %g1, %o4       ! carry + *paccu + prod(low)    1

    st  %o4, [%o0]          	! *paccu =
    inc 4, %o1      		! a++                   	1
    rd  %y, %g3                 !   				1

!    addx    %g1, %g3, %g1       ! carry += prod(high)
    addx    %g0, %g3, %g1       ! carry += prod(high)

    inc 4, %o0      		! paccu++                   	1

!    ld  [%o0], %o4          	! *paccu

    subcc   %o3, 1, %o3     	! count--
    bg  Lvma2               	! loop          		1

    umul %o5, %o2, %g2      	! *a * m        		5

Lvma3:
!    addcc %o4, %g1, %o4     	! pp+h -> l
!    addx    %g0, %g0, %g1       ! new carry
    rd  %y, %o3
!    addcc   %g2, %o4, %o4       ! carry + *paccu + prod(low)
    addcc   %g2, %g1, %o4       ! carry + *paccu + prod(low)
!    addx    %g1, %o3, %g1       ! carry += prod(high)
    addx    %g0, %o3, %g1       ! carry += prod(high)
    st  %o4, [%o0]          	! *paccu =

Lvma1:
    retl
    mov %g1, %o0        	! return carry


