TITLE DPMUL FOR RPGLIB %1 SUBTTL DOUBLE-PRECISION INTEGER MULTIPLICATION AL BLACKINGTON/CAM/RBC ;USED TO BE ;COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MA. ;BUT CONVERTED TO RPGII VERSION, 24-NOV-75, BOB CURRIER 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. SIGN=6 ;BIT 0 = 1 IF SIGNS OF A AND B DIFFER, 0 OTHERWISE. T=7 ;INTERMEDIATE PRODUCT (2 AC'S) TA=11 ;TEMPORARY TB=12 ;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. 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