mpmul2.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. *DECK MPMUL2
  2. SUBROUTINE MPMUL2 (X, IY, Z, TRUNC)
  3. C***BEGIN PROLOGUE MPMUL2
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DQDOTA and DQDOTI
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (MPMUL2-A)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C Multiplies 'mp' X by single-precision integer IY giving 'mp' Z.
  12. C Multiplication by 1 may be used to normalize a number even if some
  13. C digits are greater than B-1. Result is rounded if TRUNC.EQ.0,
  14. C otherwise truncated.
  15. C
  16. C The arguments X(*) and Z(*), and the variable R in COMMON are all
  17. C INTEGER arrays of size 30. See the comments in the routine MPBLAS
  18. C for the reason for this choice.
  19. C
  20. C***SEE ALSO DQDOTA, DQDOTI, MPBLAS
  21. C***ROUTINES CALLED MPCHK, MPERR, MPNZR, MPOVFL, MPSTR
  22. C***COMMON BLOCKS MPCOM
  23. C***REVISION HISTORY (YYMMDD)
  24. C 791001 DATE WRITTEN
  25. C ?????? Modified for use with BLAS. Blank COMMON changed to named
  26. C COMMON. R given dimension 12.
  27. C 890531 Changed all specific intrinsics to generic. (WRB)
  28. C 891214 Prologue converted to Version 4.0 format. (BAB)
  29. C 900402 Added TYPE section. (WRB)
  30. C 930124 Increased Array size in MPCON for SUN -r8. (RWC)
  31. C***END PROLOGUE MPMUL2
  32. COMMON /MPCOM/ B, T, M, LUN, MXR, R(30)
  33. INTEGER B, T, R, X(*), Z(*), TRUNC, RE, RS
  34. INTEGER C, C1, C2, RI, T1, T3, T4
  35. C***FIRST EXECUTABLE STATEMENT MPMUL2
  36. RS = X(1)
  37. IF (RS.EQ.0) GO TO 10
  38. J = IY
  39. IF (J) 20, 10, 50
  40. C RESULT ZERO
  41. 10 Z(1) = 0
  42. RETURN
  43. 20 J = -J
  44. RS = -RS
  45. C CHECK FOR MULTIPLICATION BY B
  46. IF (J.NE.B) GO TO 50
  47. IF (X(2).LT.M) GO TO 40
  48. CALL MPCHK (1, 4)
  49. WRITE (LUN, 30)
  50. 30 FORMAT (' *** OVERFLOW OCCURRED IN MPMUL2 ***')
  51. CALL MPOVFL (Z)
  52. RETURN
  53. 40 CALL MPSTR (X, Z)
  54. Z(1) = RS
  55. Z(2) = X(2) + 1
  56. RETURN
  57. C SET EXPONENT TO EXPONENT(X) + 4
  58. 50 RE = X(2) + 4
  59. C FORM PRODUCT IN ACCUMULATOR
  60. C = 0
  61. T1 = T + 1
  62. T3 = T + 3
  63. T4 = T + 4
  64. C IF J*B NOT REPRESENTABLE AS AN INTEGER WE HAVE TO SIMULATE
  65. C DOUBLE-PRECISION MULTIPLICATION.
  66. IF (J.GE.MAX(8*B, 32767/B)) GO TO 110
  67. DO 60 IJ = 1, T
  68. I = T1 - IJ
  69. RI = J*X(I+2) + C
  70. C = RI/B
  71. 60 R(I+4) = RI - B*C
  72. C CHECK FOR INTEGER OVERFLOW
  73. IF (RI.LT.0) GO TO 130
  74. C HAVE TO TREAT FIRST FOUR WORDS OF R SEPARATELY
  75. DO 70 IJ = 1, 4
  76. I = 5 - IJ
  77. RI = C
  78. C = RI/B
  79. 70 R(I) = RI - B*C
  80. IF (C.EQ.0) GO TO 100
  81. C HAVE TO SHIFT RIGHT HERE AS CARRY OFF END
  82. 80 DO 90 IJ = 1, T3
  83. I = T4 - IJ
  84. 90 R(I+1) = R(I)
  85. RI = C
  86. C = RI/B
  87. R(1) = RI - B*C
  88. RE = RE + 1
  89. IF (C) 130, 100, 80
  90. C NORMALIZE AND ROUND OR TRUNCATE RESULT
  91. 100 CALL MPNZR (RS, RE, Z, TRUNC)
  92. RETURN
  93. C HERE J IS TOO LARGE FOR SINGLE-PRECISION MULTIPLICATION
  94. 110 J1 = J/B
  95. J2 = J - J1*B
  96. C FORM PRODUCT
  97. DO 120 IJ = 1, T4
  98. C1 = C/B
  99. C2 = C - B*C1
  100. I = T1 - IJ
  101. IX = 0
  102. IF (I.GT.0) IX = X(I+2)
  103. RI = J2*IX + C2
  104. IS = RI/B
  105. C = J1*IX + C1 + IS
  106. 120 R(I+4) = RI - B*IS
  107. IF (C) 130, 100, 80
  108. C CAN ONLY GET HERE IF INTEGER OVERFLOW OCCURRED
  109. 130 CALL MPCHK (1, 4)
  110. WRITE (LUN, 140)
  111. 140 FORMAT (' *** INTEGER OVERFLOW IN MPMUL2, B TOO LARGE ***')
  112. CALL MPERR
  113. GO TO 10
  114. END