.TITLE QUADMATH .IDENT /1/ ; SUBROUTINE SUBQUAD.MAR ; ; FORTRAN CALLABLE ROUTINE TO SUBTRACT TWO QUAD WORD INTEGERS ; ; CALL SUBQUAD(A,B,C) ; ; RETURNS: A - B -> C ; .ENTRY SUBQUAD ^M ; ; A=4 B=8 C=12 MOVQ @A(AP),R0 MOVAQ @B(AP),R2 SUBL (R2)+,R0 SBWC (R2),R1 MOVQ R0,@C(AP) RET ;+ ; SUBROUTINE EDIV ; ; Fortran callable subroutine to divide two Quad-words ; producing a quad-word result. ; ; CALL EDIV (A,B,C) ; RETURNS A/B->C ; .ENTRY EDIV ^M ; MOVQ @A(AP),R0 MOVAL @B(AP),R2 EDIV (R2),R0,R0,R1 MOVL R0,@C(AP) RET ;+ ; SUBROUTINE ADDQUAD ; Fortran Callable subroutine to add two quadwords ; ; CALL ADDQUAD(A,B,C) ; ; RETURNS: A + B -> C ;- .ENTRY ADDQUAD ^M ; ; A=4 B=8 C=12 MOVQ @A(AP),R0 MOVAQ @B(AP),R2 ADDL (R2)+,R0 ADWC (R2),R1 MOVQ R0,@C(AP) RET ;+ ; SUBROUTINE EMUL ; ; Fortran callable subroutine to multiply two quad words ; producing a quadword result. ; ; CALL EMUL (A,B,C) -> A*B -> C ;- A=4 B=8 C=12 .ENTRY EMUL,^M MOVQ @A(AP),R0 ; Get A MOVQ @B(AP),R2 ; Get B EMUL R0,R2,#0,R4 ; Multiply low half MUlL3 R1,R2,R6 ; High half = a[high]*b[low] MULL3 R0,R3,R7 ; +A[low]*B[high] ADDL R7,R6 ; (combine) TSTL R0 ; If A[low] <0, need to compensate for BGEQ 10$ ; Unsigned bias of 2**32 ADDL R2,R6 ; 10$: TSTL R2 ; If B[low]<0, need to compensate for BGEQ 20$ ; unsigned bias of 2**32 ADDL R0,R6 ; 20$: ADDL R6,R5 ; Combine with right half of A[low]*B[low] MOVQ R4,@C(AP) ; Return value of C RET ; Done .END