Trailing-Edge
-
PDP-10 Archives
-
BB-H506D-SM_1983
-
cobol/source/dpmul.mac
There are 7 other files named dpmul.mac in the archive. Click here to see a list.
TITLE DPMUL FOR LIBOL
SUBTTL DOUBLE-PRECISION INTEGER MULTIPLICATION AL BLACKINGTON/CAM
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1974, 1981 BY DIGITAL EQUIPMENT CORPORATION
;V10******
; 5/10/75 /DBT ADD BIS
;**********
SEARCH LBLPRM
%%LBLP==:%%LBLP
BIS==:BIS
HISEG
;ENTER WITH FIRST OPERAND (OPERAND A) IN AC SPECIFIED BY AC-FIELD OF
; ACCUMULATOR 16 (TWO CONSECUTIVE AC'S IF DOUBLE PRECISION).
;SECOND OPERAND (OPERAND B) IS ACCESSED VIA ADDRESS-FIELD OF
; AC 16 (WHERE THE UUO IS).
; IF OPERAND B IS DOUBLE-PRECISION:
; 0(16) GETS HIGH-ORDER WORD, 1(16) REFERENCES LOW HALF.
; IF OPERAND B IS SINGLE-PRECISION:
; 0(16) REFERENCES THE SINGLE WORD.
;EXIT WITH DOUBLE-PRECISION (LOW-ORDER TWO WORDS) IN AC'S SPECIFIED BY
; AC-FIELD OF AC16.
ENTRY MUL.12 ;MULTIPLY 1 WORD IN AC BY 2 WORDS IN MEMORY.
ENTRY MUL.21 ;MULTIPLY 2 WORDS IN AC'S BY 1 WORD IN MEMORY.
ENTRY MUL.22 ;MULTIPLY 2 WORDS IN AC'S BY 2 WORDS IN MEMORY.
IFN BIS,<
;STORE 4 WORD RESULT IN AC'S SPECIFIED
ENTRY MUL.41 ;MULTIPLY 2 WORDS IN AC'S BY 1 WORD IN MEMORY.
ENTRY MUL.42 ;MULTIPLY 2 WORDS IN AC'S BY 2 WORDS IN MEMORY.
>
SIGN=5 ;BIT 0 = 1 IF SIGNS OF A AND B DIFFER, 0 OTHERWISE.
T=6 ;INTERMEDIATE PRODUCT (2 AC'S)
TA=10 ;TEMPORARY
TB=11 ;TEMPORARY
TC=13 ;HIGH-ORDER AND
TD=14 ; LOW-ORDER PARTS OF OPERAND B
AC=15 ;ADDRESS OF INPUT AND RESULT AC'S
PA=16 ;POINTER TO OPERAND B.
PP=17 ;PUSH-DOWN POINTER.
IFE BIS,<
MUL.21: SKIPL TD,0(PA) ;MULTIPLY DOUBLE BY SINGLE, SET UP
TDZA TC,TC ; SIGN OF HIGH-ORDER OPERAND B.
SETO TC, ; ..
JRST DPM22A ;THEN ENTER MAIN LINE.
MUL.12: LDB AC,[POINT 4,PA,12] ;GET AC-NUMBER
MOVE TB,0(AC) ;GET OPERAND A
CAIL TB,0 ;MULTIPLY SINGLE BY DOUBLE, SET UP
TDZA TA,TA ; SIGN OF HIGH-ORDER OPERAND A.
SETO TA, ; ..
MOVE TC,0(PA) ;GET OPERAND B
MOVE TD,1(PA)
JRST DPM22B
MUL.22: MOVE TC,0(PA) ;PICK UP HIGH AND
MOVE TD,1(PA) ; LOW PARTS OF B OPERAND.
DPM22A: LDB AC,[POINT 4,PA,12] ;GET
MOVE TA,0(AC) ; OPERAND
MOVE TB,1(AC) ; A
DPM22B: MOVE SIGN,TB ;GET SIGNS OF
XOR SIGN,TC ; BOTH OPERANDS.
JUMPGE TA,DPM22C
SETCA TA,
MOVMS TB
TLZ TB,1B18
SKIPN TB
ADDI TA,1
DPM22C: JUMPGE TC,MUL1
SETCA TC,
MOVMS TD
TLZ TD,1B18
SKIPN TD
ADDI TC,1
;MULTIPLY HIGH-B BY LOW-A, LEAVING A 1-WORD PRODUCT IN AC 13.
MUL1: IMUL TC,TB
;THEN MULTIPLY LOW-A BY LOW-B, LEAVING A 2-WORD PRODUCT IN AC'S T & T+1
MUL2: MOVE T,TB
MUL T,TD
;AND MULTIPLY HIGH-A BY LOW-B, LEAVING A 1-WORD PRODUCT IN TA.
IMUL TA,TD
;THE LOW-ORDER WORD OF THE FINAL PRODUCT NOW APPEARS IN AC 2. FIX UP
;HIGH-ORDER HALF (IN AC 0) .
ADD TA,T ;ADD HIGH HALF OF RESULT OF MUL2
ADD TA,TC ; AND RESULT OF MUL1 TO GIVE FINAL HIGH HALF.
TLZ TA,1B18 ;IGNORE OVERFLOW
JUMPGE SIGN,MUL4
SETCA TA,
MOVNS T+1
TLZ T+1,1B18
SKIPN T+1
ADDI TA,1
TLO T+1,1B18
MUL4: MOVEM TA,0(AC) ;STASH RESULT
MOVEM T+1,1(AC)
POPJ PP,
> ;END OF NON-BIS
IFN BIS,<
MUL.12: LDB AC,PACFL.## ;GET AC
MOVE T,(AC) ; AND CONTENTS
ASHC T,-^D35 ;EXTEND SIGN
DMUL T,(PA) ;MULTIPLY
DMOVEM T+2,(AC) ;STORE RESULT
POPJ PP,
MUL.21: LDB AC,PACFL.## ;GET AC
DMOVE T,(AC) ;AND CONTENTS
MOVE T+2,(PA) ;OP
ASHC T+2,-^D35 ;EXTEND SIGN
DMUL T,T+2
DMOVEM T+2,(AC) ;RESULT
POPJ PP,
MUL.22: LDB AC,PACFL.## ;GET AC
DMOVE T,(AC) ;GET OP 1
DMUL T,(PA) ;MULTIPLY
DMOVEM T+2,(AC)
POPJ PP,
MUL.41: LDB AC,PACFL.## ;GET AC
DMOVE T,(AC) ;AND CONTENTS
MOVE T+2,(PA) ;OP
ASHC T+2,-^D35 ;EXTEND SIGN
DMUL T,T+2
DMOVEM T,(AC) ;RESULT
DMOVEM T+2,2(AC)
POPJ PP,
MUL.42: LDB AC,PACFL.## ;GET AC
DMOVE T,(AC) ;GET OP 1
DMUL T,(PA) ;MULTIPLY
DMOVEM T,(AC) ;RESULT
DMOVEM T+2,2(AC)
POPJ PP,
> ;END OF BIS
END