.TITLE MATB MATRIX TRANSPOSE MULTIPLY .IDENT /1.0/ ; 08/15/79 ;+ ++EXTSPC>> ;.NAME MATB ;.INDEX M3ATB ;.INDEX MPATB ;.INDEX MATBD ;.INDEX M3ATBD ;.INDEX MPATBD ;.TITLE SUBROUTINE MATB ; ; CALL MATB (C,A,B,L,M,N) ; ; CALL M3ATB (C,A,B,N) ; ; CALL MPATB (C,A,B,L,M,N,NRA,NRB,NRC) ; ; CALL MATBD (C,A,B,L,M,N) ; ; CALL M3ATBD (C,A,B,N) ; ; CALL MPATBD (C,A,B,L,M,N,NRA,NRB,NRC) ; ; VERSION: VECTOR / MATRIX ROUTINES SAM MILLER REL 1.0 ; ; FUNCTION: ; ; MATRIX TRANSPOSE MULTIPLY - TRANSPOSE LEFT HAND MATRIX ; ; C(L,N) = A(M,L)[TRANSPOSE] B(M,N) ; ; ; LANGUAGE: MACRO-11 ; ; ; ARGUMENTS: ; ; C = OUTPUT MATRIX (RESULT IS STORED IN UPPER L X N SUBMATRIX) ; A,B = INPUT MATRICES (C = A[TRANSPOSE] B) ; L,M,N = SUBMATRIX MULTIPLY SIZE ; C = A[T] B ; (LXM) = (MXL) (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 MPATB(C,A,B,L,M,N,NRA,NRB,NRC) ; ; C(L,N) = A(M,L)[TRANSPOSE] B(M,N) ; ; WHERE A, B, C ARE MATRICES ; THE M X L UPPER SUBMATRIX OF A (TRANSPOSE) 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 MATB(C,A,B,L,M,N) ; ; C(L,N) = A(M,L)[TRANSPOSE] B(M,N) ; ; ; 3. 3X3 MATRIX MULTIPLY ; ; CALL M3ATB(C,A,B,N) ; ; C(3,N) = A(3,3)[TRANSPOSE] 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 MATB,M3ATB,MPATB .ENABL LSB ; F0=R0 ;DEFINE FLOATING REGISTER 0 F1=R1 ;DEFINE FLOATING REGISTER 1 F2=R2 ;DEFINE FLOATING REGISTER 2 M3ATB: CMPB #4,(R5) ;ARE THERE 4 ARGUMENTS? BNE BOMB3 ;BOMB IF # OF ARGS. NE 4 ADD #8.,R5 ;R5=>END OF ARG LIST MOV #3,R1 ;R1=L=3 MOV R1,R2 ;R2=M=3 MOV @(R5),-(SP) ;PLACE N ON STACK BR 20$ MPATB: CMPB #9.,(R5) ;ARE THERE 9 ARGUMENTS? BNE BOMBP ;BOMB IF # OF ARGS. NE 9 ADD #18.,R5 ;R5=>END OF ARG LIST MOV @(R5),R4 ;NRC MOV @-(R5),R3 ;NRB MOV @-(R5),R0 ;NRA MOV @-(R5),-(SP) ;PLACE N ON STACK MOV @-(R5),R2 ;R2=M MOV @-(R5),R1 ;R1=L SUB R2,R0 ;NRA-M ASH #2,R0 ;4*(NRA-M) ASH #2,R3 ;4*NRB 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 BR 30$ MATB: CMPB #6,(R5) ;ARE THERE 6 ARGUMENTS? BNE BOMB ;BOMB IF # OF ARGS. NE 6 ADD #12.,R5 ;R5=>END OF ARG LIST MOV @(R5),-(SP) ;PLACE N ON STACK MOV @-(R5),R2 ;R2=M MOV @-(R5),R1 ;R1=L 20$: MOV R2,R3 ;R3=NRB=M ASH #2,R3 ;R3=4*NRB MOV R3,-(SP) ;PLACE 4*NRB ON STACK MOV #0,-(SP) ;PLACE 4*(NRC-L) ON STACK MOV #0,R0 ;4*(NRA-M)=0 30$: 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$: ADD R0,R4 ;SET A TO NEXT COLUMN 45$: MOV 6(SP),R3 ;RESTORE B 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 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 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 #76520,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #51701,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB3: MOV #76520,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #53151,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB: MOV #6200,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #50574,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