*DECK S$GNSMK 
          IDENT S$GNSMK 
          TITLE  S$GNSMK-GENERATE SUMMING AND OVERFLOW CODE 
          COMMENT  GENERATE SUMMING AND OVERFLOW CODE 
          SPACE  5
*CALL LBLPTR
  
  
**        S$GNSMK - GENERATE SUMMING AND OVERFLOW CODE
* 
*         CALLING SEQUENCE- 
*         S$GNSMK(SUMLEN,SIGNED,OVFIELD,DISPLAY (MAX,MIN);
* 
*         GIVEN-
*          SUMLEN - LENGTH OF SUM FIELD ( LE 60 BITS )
*          SIGNED - TRUE IF SUM FIELD IS SIGNED, FALSE OTHERWISE
*          OVFIELD - STRING CONTAINING ORDINAL OF SUM FIELD 
*          DISPLAY - TRUE IF SUM FIELD MUST BE REVERTED 
*               ------ MAX AND MIN ARE ONLY PROVIDED IF 
*                      PARAMETER 'DISPLAY' IS TRUE
*          MAX - MAXIMUM DISPLAY VALUE FOR THIS SUM FIELD 
*          MIN - MINIMUM DISPLAY VALUE FOR THIS SUM FIELD 
* 
*         DOES- 
*           GENERATES CODE. 
* 
*         GENERATED CODE DOES-
*          INSPECTS INTEGER SUM FIELDS IN *X3 AND *X5 
*          ADDS THEM TOGETHER 
*          LEAVES RESULT IN *X5 
*          SETS *X3 TO ZERO 
*          ISSUES DAYFILE DIAGNOSTIC FOR SUMMING OVERFLOW 
* 
*          GENERATED CODE EXPECTS REGISTERS AS IN S$GNSMI 
  
  
          ENTRY  S$GNSMK
S$GNSMK   SUBR
          SB1    1           CONSTANT 1 
          SA4    X1          X4 = SUMLEN
          SA3    A1+B1       ADDRESS OF SIGNED
          SA3    X3          X3 = SIGNED
          SA5    A1+2        ADDRESS OF OVFIELD 
          SA5    X5          X5 = OVFIELD 
          SA2    A1+3        ADDRESS OF DISPLAY 
          SA2    X2          VALUE OF DISPLAY 
          SA0    A1          HOLD ON TO A1
  
  
          NEWLBL SUMNOFL
  
*         JUMP TABLE
  
          IFTHEN X2"0        IF DISPLAY FIELD SPECIFIED 
            EQ     SMK1      HANDLE SUMMING, CASE 1 
          ELSE-              IF NO REVERSION NECESSARY
            IFTHEN X3"0      IF SIGNED BINARY FIELD 
              EQ   SMK2      HANDLE SUMMING, CASE 2 
            ELSE- 
              EQ   SMK3      HANDLE SUMMING, CASE 3 
              ENDIF.
            ENDIF.
  
          EJECT 
SMK1      BSS    0           HANDLE SUMMING, CASE 1 
  
*         CASE 1 IS DISPLAY FIELDS WHICH MUST BE INVERTED AND 
*         REVERTED. IN THIS CASE, WE HAVE BEEN PASSED TWO EXTRA 
*         PARAMETERS CALLED MAX AND MIN WHICH ENABLE US TO
*         DETECT OVERFLOW. SO LETS PUT THESE PARAMETERS INTO
*         THE GENERATED CODE. 
  
          NEWLBL NEXT 
          GEN    (EQ "NEXT")         JUMP AROUND DATA AREA
          NEWLBL GNSMK1 
          GENLBL GNSMK1 
          SA5    A0+4        ADDRESS OF MAX 
          SA5    X5          VALUE OF MAX 
          GENWD  X5 
          NEWLBL GNSMK2 
          GENLBL GNSMK2 
          SA5    A0+5        ADDRESS OF MIN 
          SA5    X5          VALUE OF MIN 
          GENWD  X5 
          GENLBL NEXT 
          SA2    A0          RETRIEVE SUMLEN (SUMFIELD LENGTH)
          SA2    X2 
  
*         SET UP OPERANDS AS 60-BIT SIGNED INTEGERS 
  
          SX2    X2-60       SUMFIELD LENGTH - 60 
          BX2    -X2         60 - SUMFIELD LENGTH 
          SB5    X2          B5 := 60 - SUMFIELD LENGTH 
          IFTHEN B5>0        IF WE NEED TO SHIFT
            GEN    (LX3 0),B5 
            GEN    (AX3 0),B5 
            GEN    (LX5 0),B5 
            GEN    (AX5 0),B5 
            ENDIF.
  
*         PERFORM SUMMING 
  
          GEN    (IX5 X3+X5)
          GEN    (MX3 0)
          GEN    (SA2 "GNSMK1")     *X2 := MAX
          GEN    (IX2 X2-X5)        *X2 := MAX-RESULT 
          NEWLBL GNSMK3 
          GEN    (NG X2,"GNSMK3")   PUT OUT ERROR MESSAGE 
          GEN    (SA2 "GNSMK2")     *X2 := MIN
          GEN    (IX2 X5-X2)        *X2 := RESULT-MIN 
          GEN    (NG X2,"GNSMK3")   PUT OUT ERROR MESSAGE 
          GEN    (EQ "SUMNOFL") 
          GENLBL GNSMK3 
          EQ     SMK4        END OF CASE ONE, GO TO END 
  
          EJECT 
SMK2      BSS    0           HANDLE SUMMING, CASE 2 
  
*         CASE 2 IS SIGNED BINARY FIELDS WHICH
*         DO NOT NEED THE MIN AND MAX PARAMETERS. 
*         SET UP OPERANDS AS 60-BIT INTEGERS WITH SIGN EXTENSIONS.
  
          SA2    A0          RETRIEVE SUMLEN (SUMFIELD LENGTH)
          SA2    X2 
          SX2    X2-60       SUMFIELD LENGTH - 60 
          BX2    -X2         60 - SUMFIELD LENGTH 
          SB5    X2          B5 := 60 - SUMFIELD LENGTH 
  
          IFTHEN B5>0 
            GEN    (LX3 0),B5 
            GEN    (AX3 0),B5 
            GEN    (LX5 0),B5 
            GEN    (AX5 0),B5 
            ENDIF.
  
*         SAVE SIGN OF CR, AND (SIGN(CR) XOR SIGN(LL))
  
          GEN    (MX0 1)
          GEN    (BX7 X5*X0)
          GEN    (LX7 1)
          GEN    (SB3 X7)              *B3 = SIGN OF CR 
  
          GEN    (BX2 -X3*X5) 
          GEN    (BX7 -X5*X3) 
          GEN    (BX7 X2+X7)
          GEN    (BX7 X7*X0)
          GEN    (LX7 1)
          GEN    (SB5 X7)              (B5 = SIGN(CR) XOR SIGN(LL)) 
  
*         ADD INTO CR, SET LL TO ZERO 
  
          GEN    (IX5 X3+X5)
          GEN    (MX3 0)
  
*         IF OPERANDS DIFFERENT SIGNS, NO OVERFLOW POSSIBLE 
  
          GEN    (NE B5,B0,"SUMNOFL") 
  
*         IF SAME SIGN AND RESULT MATCHES, NO OVERFLOW
  
          GEN    (LX0 0),X4 
          GEN    (BX0 X5*X0)           (X0 = SIGN BIT OF SUM RESULT)
          GEN    (LX0 1),B5 
          GEN    (SB5 X0) 
          GEN    (EQ B3,B5,"SUMNOFL")   *IF NO OVERFLOW 
  
  
          EQ     SMK4        END OF CASE TWO, GO TO END 
  
          EJECT 
SMK3      BSS    0           HANDLE SUMMING, CASE 3 
  
*         CASE 3 IS UNSIGNED BINARY SUM FIELDS. 
  
          SA2    A0          RETRIEVE SUMFIELD LENGTH 
          SA2    X2 
          SB6    60 
          SB5    X2 
          IFTHEN B5=B6       IF SUMFIELD LENGTH EQ 60 
  
*           THEORY OF OPERATION FOR 60-BIT SUM FIELDS 
*           -EXAMINE THE SIGN BITS OF *X3 AND *X5 
*               IF THEY ARE THE SAME -
*                   THEN - IF THEY ARE BOTH 1, WE WILL HAVE OVERFLOW
*                        - IF THEY ARE BOTH 0, NO OVERFLOW EVER 
*               ELSE (IF THEY ARE DIFFERENT)
*                   THEN - IF SIGN OF RESULT = 0, NO OVERFLOW 
*                          IF SIGN OF RESULT = 1, OVERFLOW
* 
*           THE MOST COMMON CASE IS *BOTH ZERO AND NO OVERFLOW* 
  
              NEWLBL    GNSMK1
              NEWLBL    GNSMK2
              NEWLBL    GNSMK3
  
              GEN    (BX7 X3-X5)        LOOKING FOR XOR OF SIGN BITS
              GEN    (NG X7,"GNSMK1")   JUMP IF SIGNS ARE DIFFERENT 
              GEN    (NG X3,"GNSMK2")   IF BOTH SIGNS ARE NEGATIVE
* 
*           IF WE GET HERE, THEY ARE BOTH POSITIVE AND THERE IS NO
*           RISK OF OVERFLOW
* 
              GEN    (IX5 X5+X3)         ADD THEM TOGETHER
              GEN    (MX3 0)             ZERO RECORD TO BE DELETED
              GEN    (EQ "SUMNOFL")      ALL DONE 
* 
              GENLBL GNSMK1 
* 
*           WE GET HERE IF THE SIGN BITS ARE DIFFERENT. THIS RESULT 
*           -MAY- OVERFLOW
* 
              GEN    (IX5 X5+X3)
              GEN    (MX3 0)
              GEN    (NG X5,"SUMNOFL")         SIGN RESULT IS 1 
              GEN    (EQ "GNSMK3")             IF SIGN RESULT IS 0
* 
*           WE GET HERE IF BOTH SIGN BITS ARE 1, I.E. NEGATIVE. 
*           THIS WILL ALWAYS CAUSE AN OVERFLOW
* 
              GENLBL GNSMK2 
              GEN    (IX5 X5+X3)          MEANINGLESS ADDITION
              GEN    (MX3 0)
  
*           AND WE FALL THROUGH TO ERROR MESSAGE
  
              GENLBL GNSMK3 
  
            ELSE- 
  
*           CODE FOR FIELDS < 60 BITS LONG
  
              GEN    (IX5 X3+X5)      ADD THEM TOGETHER 
              GEN    (MX3 0)
              GEN    (BX7 X5) 
          SB6    59 
          SB7    B6-B5       B7 := 59-SUMLEN
              GEN    (LX7 0),B7         SHIFT CARRY BIT TO SIGN BIT 
              GEN    (PL X7,"SUMNOFL")
              ENDIF.
  
*         NOW WE FALL THROUGH TO THE COMMON CODE FOR
*         ALL THREE ADDRESSES IN THE JUMP TABLE. NOTE 
*         THE IMPLIED "EQ SMK4" HERE
  
  
          EJECT 
SMK4      BSS    0           HANDLE ERROR MESSAGE FOR OVERFLOW
  
  
* OVERFLOW, OUTPUT MESSAGE IF NOT DONE FOR THIS FIELD YET.
  
          NEWLBL SUMOFLG
          GEN    (SA2 "SUMOFLG")
          GEN    (NZ X2,"SUMNOFL")   *IF ALREADY OUTPUT MSG 
  
          GEN    (MX7 1)
          GEN    (SA7 =XS$SMERR)
          GEN    (SA7 "SUMOFLG")     *NOTE ALREADY OUTPUT MSG 
  
          GEN    (BX7 X6)            *SAVE X6 FROM DESTRUCTION
          GEN    (SA7 A7+B1)         *BY MSG
          GEN    (BX7 X1)        *SAVE X1 FROM DESTRUCTION
          GEN    (SA7 A7+B1)     *MSG 
  
          NEWLBL NEXT                  *START OF MESSAGE
          GEN    (SA2 "NEXT") 
          GENMAC (MESSAGE A2,3,RECALL)
  
          GEN    (SA2 "SUMOFLG")
          GEN    (SA2 A2+B1)
          GEN    (SA1 A2+B1)     *RESTORE X1
          GEN    (BX6 X2)              *RESTORE X6
  
          GEN    (EQ "SUMNOFL") 
  
          GENLBL NEXT 
          SA5    A0+2        ADDRESS OF OVFIELD 
          SA5    X5          VALUE OF OVFIELD 
          GENWD  X5                  *** OVERFL 
          SA5    A5+B1
          GENWD  X5                  OW ON SUMF 
          SA5    A5+B1
          GENWD  X5                  IELD 
          SA5    A5+B1
          GENWD  X5                  REP
  
          GENLBL SUMOFLG
          GENMAC (DATA 0)            *0 IF NO OVERFLOW MSG YET
          GENMAC (DATA 0)            *FOR SAVING X6 FROM MSG
          GENMAC (DATA 0)        *FOR SAVING X1 FROM MSG
  
  
          GENLBL SUMNOFL
  
*         MASK VALUES BACK TO SUMLEN BITS 
          EXIT
          END 
