.TITLE DOT DOT PRODUCT OF TWO VECTORS .IDENT /1.0/ ; 08/15/79 ;+ ++EXTSPC>> ;.NAME DOT ;INDEX DOTD ;.TITLE SUBROUTINE DOT ; ; CALL DOT (C,A,B,N) ; ; CALL DOTD (C,A,B,N) ; ; VERSION: VECTOR / MATRIX ROUTINES SAM MILLER REL 1.0 ; ; FUNCTION: ; ; DOT PRODUCT OF 2 VECTORS ; ; C = SUM OF [A(I)*B(I)] FOR 1<=I<=N ; ; ; LANGUAGE: MACRO-11 ; ; ; ARGUMENTS: ; ; C = OUTPUT ; A,B = INPUT N-VECTORS ; N = VECTOR DIMENSION ; ; ; COMMONS: ; ; (NONE) ; ; ; GENERAL DESCRIPTION: ; ; ALL REAL ARGUMENTS EXCEPT INTEGER N. ; ; ; SINGLE PRECISION - DOT FOR N-VECTORS ; ; DOUBLE PRECISION - DOTD FOR N-VECTORS ; ; ; NOTE -- SINGLE PRECISION ROUTINE MAINTAINS ACCURACY BY ; ACCUMULATING INTERMEDIATE QUANTITIES AS DOUBLE PRECISION ; ; ; PERIPHERAL INPUT/OUTPUT: ; ; (NONE) ; ; ; LOGICAL UNIT USAGE: ; ; (NONE) ; ; ; EXTERNAL ROUTINES CALLED: ; ; NAM$ ; $BOMB ; ;- --EXTSPC>> ; ; WRITTEN BY: ; ; DENIS MAHONY AND SAM MILLER 08/15/79 ; ; ; MODIFIED BY: ; ; ********** **DATE** ; **DETAIL** ; ;- --EXTSPC>> .PAGE .GLOBL DOT .ENABL LSB F0=R0 ;DEFINE FLOATING REGISTER 0 F1=R1 ;DEFINE FLOATING REGISTER 1 F2=R2 ;DEFINE FLOATING REGISTER 2 DOT: CMP #4,(R5)+ ;CHECK NUMBER OF ARGUMENTS BNE BOMB ;BOMB IF # OF ARGS. IS INCORRECT MOV (R5)+,R3 ;R3=ADDRESS OF C MOV (R5)+,R4 ;R4=ADDRESS OF A MOV (R5)+,R1 ;R1=ADDRESS OF B MOVB @(R5),R2 ;R2=N (LOOP COUNT) SETD CLRD F2 ;F2=0=SUM REGISTER 10$: LDCFD (R4)+,F0 ;GET A(I) LDCFD (R1)+,F1 ;GET B(I) MULD F1,F0 ;F0=A(I)*B(I) ADDD F0,F2 ;ADD CURRENT PRODUCT INTO SUM REGISTER SOB R2,10$ ;DONE? STCDF F2,(R3) ;STORE SUM INTO C RTS PC ;DONE. SO RETURN. BOMB: MOV #0,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #15554,R4 ;MOVE 1ST HALF OF NAME TO R4 JSR R4,NAM$ ;SUBR TO PUT NAME IN WALKBACK JMP $BOMB ;ABORT, $BOMB DOES NOT EXIST .END