.TITLE MMUL MATRIX MULTIPLY .IDENT /1.0/ ; 08/15/79 ;+ ++EXTSPC>> ;.NAME MMUL ;INDEX M3MUL ;INDEX MPMUL ;INDEX MMULD ;INDEX M3MULD ;INDEX MPMULD ;.TITLE SUBROUTINE MMUL ; ; CALL MMUL (C,A,B,L,M,N) ; ; CALL M3MUL (C,A,B,N) ; ; CALL MPMUL (C,A,B,L,M,N,NRA,NRB,NRC) ; ; CALL MMULD (C,A,B,L,M,N) ; ; CALL M3MULD (C,A,B,N) ; ; CALL MPMULD (C,A,B,L,M,N,NRA,NRB,NRC) ; ; VERSION: VECTOR / MATRIX ROUTINES SAM MILLER REL 1.0 ; ; FUNCTION: ; ; MATRIX MULTIPLY ; ; C(L,N) = A(L,M) B(M,N) ; ; ; LANGUAGE: MACRO-11 ; ; ; ARGUMENTS: ; ; C = OUTPUT MATRIX (RESULT IS STORED IN UPPER L X N SUBMATRIX) ; A,B = INPUT MATRICES (C = AB) ; L,M,N = MATRIX MULTIPLY SIZE ; C = A B ; (LXN) = (LXM) (MXN) ; NRA = NUMBER OF ROWS IN A ; NRB = NUMBER OF ROWS IN B ; NRC = NUMBER OF ROWS IN C ; ; ; COMMONS: ; ; (NONE) ; ; ; GENERAL DESCRIPTION: ; ; REAL ARGUMENTS: C,A,B ; INTEGER ARGUMENTS: L,M,N,NRA,NRB,NRC ; ; ; THERE ARE 3 CALLING SEQUENCES: ; ; 1. PARTIAL MATRIX MULTIPLY ; ; CALL MPMUL(C,A,B,L,M,N,NRA,NRB,NRC) ; ; C(L,N) = A(L,M) B(M,N) ; ; WHERE A, B, C ARE MATRICES ; THE L X M UPPER SUBMATRIX OF A IS MULTIPLIED BY THE ; UPPER M X N SUBMATRIX OF B AND STORED IN THE UPPER L X N ; SUBMATRIX OF C ; ; ; 2. FULL MATRIX MULTIPLY ; ; CALL MMUL(C,A,B,L,M,N) ; ; C(L,N) = A(L,M) B(M,N) ; ; ; 3. 3X3 MATRIX MULTIPLY ; ; CALL M3MUL(C,A,B,N) ; ; C(3,N) = A(3,3) B(3,N) ; ; 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 MPMUL, MMUL, M3MUL .ENABL LSB F0=R0 ;DEFINE FLOATING REGISTER 0 F1=R1 ;DEFINE FLOATING REGISTER 1 F2=R2 ;DEFINE FLOATING REGISTER 2 M3MUL: CMP #4,(R5) ;ARE THERE 4 ARGUMENTS? BNE BOMB3 ;BOMB IF # OF ARGS. NE 4 ADD #10,R5 ;R5=END OF LIST=N MOV @(R5),-(SP) ;(N) TO STACK MOV #3,R1 ;R1=(L)=3 MOV R1,R2 ;R2=(M)=3 MOV R1,R3 ;R3=(NRB)=3 MOV R1,R4 ;R4=(NRC)=3 MOV R1,R0 ;R0=(NRA)=3 BR 10$ MPMUL: CMP #11,(R5) ;ARE THERE 9 ARGUMENTS? BNE BOMBP ;BOMB IF # OF ARGS. NE 9 ADD #22,R5 ;R5=END OF LIST=NRC MOV @(R5),R4 ;(NRC) MOV @-(R5),R3 ;(NRB) MOV @-(R5),R0 ;(NRA) MOV @-(R5),-(SP) ;(N) TO STACK MOV @-(R5),R2 ;(M) MOV @-(R5),R1 ;(L) BR 10$ MMUL: CMP #6,(R5) ;ARE THERE 6 ARGUMENTS? BNE BOMB ;BOMB IF # OF ARGS. NE 6 ADD #14,R5 ;R5=END OF LIST=N MOV @(R5),-(SP) ;PLACE (N) ON STACK MOV @-(R5),R2 ;(M) MOV @-(R5),R1 ;(L) MOV R2,R3 ;(NRB)=(M) MOV R1,R4 ;(NRC)=(L) MOV R1,R0 ;(NRA)=(L) 10$: ASH #2,R3 ;4*(NRB) ASH #2,R0 ;4*(NRA) MOV R3,-(SP) ;PLACE 4*(NRB) ON STACK SUB R1,R4 ;(NRC)-(L) ASH #2,R4 ;4*((NRC)-(L)) MOV R4,-(SP) ;PLACE 4*((NRC)-(L)) ON STACK MOV -(R5),R3 ;R3=B MOV -(R5),R4 ;R4=A MOV -(R5),R5 ;R5=C MOV R4,-(SP) ;PLACE A ON STACK MOV R3,-(SP) ;PLACE B ON STACK MOV R4,-(SP) ;PLACE NEXT A ON STACK ADD #4,(SP) ;NEXT A MOV R1,-(SP) ;PLACE (L) ON STACK MOV R2,-(SP) ;PLACE (M) ON STACK SETD ;SET FLOATING DOUBLE MODE CLRD F2 ;F2=0 BR 50$ 40$: MOV 4(SP),R4 ;SET A TO NEXT ROW 45$: MOV 6(SP),R3 ;RESTORE B ADD #4,4(SP) ;SET NEXT A ON STACK MOV (SP),R2 ;RESET (M) ;MULTIPLICATION LOOP 50$: LDCFD (R4),F0 ;F0=A LDCFD (R3)+,F1 ;F1=B MULD F0,F1 ;A*B ADDD F1,F2 ;F2=SUM ADD R0,R4 ;NEXT ELEMENT OF A SOB R2,50$ ;DONE FORMING ELEMENT OF C? STCDF F2,(R5)+ ;STORE IN C CLRD F2 ;F2=0 SOB R1,40$ ;GO TO NEXT COLUMN OF C? DEC 16(SP) ;DONE? BEQ 60$ ;YES MOV 10(SP),R4 ;RESTORE A MOV R4,4(SP) ;NEXT A ON STACK ADD 14(SP),6(SP) ;NEXT COLUMN OF B ADD 12(SP),R5 ;NEXT COLUMN OF C MOV 2(SP),R1 ;RESET (L) BR 45$ 60$: ADD #20,SP ;RESTORE STACK RTS PC ;RETURN BOMBP: MOV #102440,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #51715,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB3: MOV #102440,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #53165,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB: MOV #45400,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #51535,R4 ;MOVE 1ST HALF OF NAME TO R4 70$: JSR R4,NAM$ ;SUBR TO PUT NAME IN WALKBACK JMP $BOMB ;ABORT, $BOMB DOES NOT EXIST .END