mpadd3.f 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. *DECK MPADD3
  2. SUBROUTINE MPADD3 (X, Y, S, MED, RE)
  3. C***BEGIN PROLOGUE MPADD3
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DQDOTA and DQDOTI
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (MPADD3-A)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C Called by MPADD2; does inner loops of addition
  12. C
  13. C The arguments X(*) and Y(*) and the variable R in COMMON are all
  14. C INTEGER arrays of size 30. See the comments in the routine MPBLAS
  15. C for the reason for this choice.
  16. C
  17. C***SEE ALSO DQDOTA, DQDOTI, MPBLAS
  18. C***ROUTINES CALLED (NONE)
  19. C***COMMON BLOCKS MPCOM
  20. C***REVISION HISTORY (YYMMDD)
  21. C 791001 DATE WRITTEN
  22. C ?????? Modified for use with BLAS. Blank COMMON changed to named
  23. C COMMON. R given dimension 12.
  24. C 890831 Modified array declarations. (WRB)
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900402 Added TYPE section. (WRB)
  27. C 930124 Increased Array size in MPCON for SUN -r8. (RWC)
  28. C***END PROLOGUE MPADD3
  29. COMMON /MPCOM/ B, T, M, LUN, MXR, R(30)
  30. INTEGER B, T, R, X(*), Y(*), S, RE, C, TED
  31. C***FIRST EXECUTABLE STATEMENT MPADD3
  32. TED = T + MED
  33. I2 = T + 4
  34. I = I2
  35. C = 0
  36. C CLEAR GUARD DIGITS TO RIGHT OF X DIGITS
  37. 10 IF (I.LE.TED) GO TO 20
  38. R(I) = 0
  39. I = I - 1
  40. GO TO 10
  41. 20 IF (S.LT.0) GO TO 130
  42. C HERE DO ADDITION, EXPONENT(Y) .GE. EXPONENT(X)
  43. IF (I.LT.T) GO TO 40
  44. 30 J = I - MED
  45. R(I) = X(J+2)
  46. I = I - 1
  47. IF (I.GT.T) GO TO 30
  48. 40 IF (I.LE.MED) GO TO 60
  49. J = I - MED
  50. C = Y(I+2) + X(J+2) + C
  51. IF (C.LT.B) GO TO 50
  52. C CARRY GENERATED HERE
  53. R(I) = C - B
  54. C = 1
  55. I = I - 1
  56. GO TO 40
  57. C NO CARRY GENERATED HERE
  58. 50 R(I) = C
  59. C = 0
  60. I = I - 1
  61. GO TO 40
  62. 60 IF (I.LE.0) GO TO 90
  63. C = Y(I+2) + C
  64. IF (C.LT.B) GO TO 70
  65. R(I) = 0
  66. C = 1
  67. I = I - 1
  68. GO TO 60
  69. 70 R(I) = C
  70. I = I - 1
  71. C NO CARRY POSSIBLE HERE
  72. 80 IF (I.LE.0) RETURN
  73. R(I) = Y(I+2)
  74. I = I - 1
  75. GO TO 80
  76. 90 IF (C.EQ.0) RETURN
  77. C MUST SHIFT RIGHT HERE AS CARRY OFF END
  78. I2P = I2 + 1
  79. DO 100 J = 2, I2
  80. I = I2P - J
  81. 100 R(I+1) = R(I)
  82. R(1) = 1
  83. RE = RE + 1
  84. RETURN
  85. C HERE DO SUBTRACTION, ABS(Y) .GT. ABS(X)
  86. 110 J = I - MED
  87. R(I) = C - X(J+2)
  88. C = 0
  89. IF (R(I).GE.0) GO TO 120
  90. C BORROW GENERATED HERE
  91. C = -1
  92. R(I) = R(I) + B
  93. 120 I = I - 1
  94. 130 IF (I.GT.T) GO TO 110
  95. 140 IF (I.LE.MED) GO TO 160
  96. J = I - MED
  97. C = Y(I+2) + C - X(J+2)
  98. IF (C.GE.0) GO TO 150
  99. C BORROW GENERATED HERE
  100. R(I) = C + B
  101. C = -1
  102. I = I - 1
  103. GO TO 140
  104. C NO BORROW GENERATED HERE
  105. 150 R(I) = C
  106. C = 0
  107. I = I - 1
  108. GO TO 140
  109. 160 IF (I.LE.0) RETURN
  110. C = Y(I+2) + C
  111. IF (C.GE.0) GO TO 70
  112. R(I) = C + B
  113. C = -1
  114. I = I - 1
  115. GO TO 160
  116. END