home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / g / gnu_c / pmlsrc23.zoo / pmlsrc / exp10.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-19  |  2.9 KB  |  154 lines

  1. /************************************************************************
  2.  *                                    *
  3.  * double exp10( double x )                        *
  4.  *                                    *
  5.  * computes 10^x                            *
  6.  *                                    *
  7.  * used by my atof.c,                            *
  8.  * at present, not declared in math.h                    *
  9.  *                                    *
  10.  * M. Ritzert                                *
  11.  * ritzert@dfg.dbp.de                            *
  12.  *                                    *
  13.  ************************************************************************/
  14.  
  15. #ifdef    sfp004
  16.  
  17. __asm("
  18.  
  19. | base =    0xfffa50
  20. |      the fpu addresses are taken relativ to "base":
  21. comm =     -6
  22. resp =    -16
  23. zahl =      0
  24.  
  25. ");    /* end asm    */
  26.  
  27. #endif    sfp004
  28. #if defined (__M68881__) || defined (sfp004)
  29.     __asm(".text; .even");
  30.  
  31. #ifdef    ERROR_CHECK
  32.  
  33.     __asm("
  34.  
  35. _Overflow:
  36.     .ascii \"OVERFLOW\\0\"
  37. _Domain:
  38.     .ascii \"DOMAIN\\0\"
  39. _Error_String:
  40.     .ascii \"exp10: %s error\\n\\0\"
  41. .even
  42.  
  43. | pml compatible exp10gent
  44. | m.ritzert 7.12.1991
  45. | ritzert@dfg.dbp.de
  46. |
  47. |    /* NAN  = {7fffffff,ffffffff}        */
  48. |    /* +Inf = {7ff00000,00000000}        */
  49. |    /* -Inf = {fff00000,00000000}        */
  50. |    /* MAX_D= {7fee42d1,30773b76}        */
  51. |    /* MIN_D= {ffee42d1,30773b76}        */
  52.  
  53. .even
  54. double_max:
  55.     .long    0x7fee42d1
  56.     .long    0x30273b76
  57. double_min:
  58.     .long    0xffee42d1
  59.     .long    0x30273b76
  60. NaN:
  61.     .long    0x7fffffff
  62.     .long    0xffffffff
  63. p_Inf:
  64.     .long    0x7ff00000
  65.     .long    0x00000000
  66. m_Inf:
  67.     .long    0xfff00000
  68.     .long    0x00000000
  69. ");
  70. # endif    ERROR_CHECK
  71.  
  72.     __asm(".even
  73.     .globl _exp10
  74. _exp10:
  75.     ");    /* end asm    */
  76.  
  77. #endif    /* __M68881__ || sfp004    */
  78. #ifdef    __M68881__
  79.  
  80.     __asm("
  81.     ftentoxd a7@(4), fp0    | ten_to_x
  82.     fmoved    fp0,a7@-    | push result
  83.     moveml    a7@+,d0-d1    | return_value
  84.     ");    /* end asm    */
  85.  
  86. #endif    __M68881__
  87. #ifdef    sfp004
  88.     __asm("
  89.     lea    0xfffa50,a0
  90.     movew    #0x5412,a0@(comm)    | specify function
  91.     cmpiw    #0x8900,a0@(resp)    | check
  92.     movel    a7@(4),a0@        | load arg_hi
  93.     movel    a7@(8),a0@        | load arg_low
  94.     movew    #0x7400,a0@(comm)    | result to d0
  95.     .long    0x0c688900, 0xfff067f8    | wait
  96.     movel    a0@,d0
  97.     movel    a0@,d1
  98.     ");    /* end asm    */
  99.  
  100. #endif    sfp004
  101. #if defined (__M68881__) || defined (sfp004)
  102. # ifdef    ERROR_CHECK
  103.     __asm("
  104.     lea    double_max,a0    |
  105.     swap    d0        | exponent into lower word
  106.     cmpw    a0@(16),d0    | == NaN ?
  107.     beq    error_nan    |
  108.     cmpw    a0@(24),d0    | == + Infinity ?
  109.     beq    error_plus    |
  110.     swap    d0        | result ok,
  111.     rts            | restore d0
  112. ");
  113. #ifndef    __MSHORT__
  114. __asm("
  115. error_plus:
  116.     swap    d0
  117.     moveml    d0-d1,a7@-
  118.     movel    #63,_errno    | NAN => errno = EDOM
  119.     pea    _Overflow    | for printf
  120.     bra    error_exit    |
  121. error_nan:
  122.     moveml    a0@(24),d0-d1    | result = +inf
  123.     moveml    d0-d1,a7@-
  124.     movel    #62,_errno    | NAN => errno = EDOM
  125.     pea    _Domain        | for printf
  126. ");
  127. #else    __MSHORT__
  128. __asm("
  129. error_plus:
  130.     swap    d0
  131.     moveml    d0-d1,a7@-
  132.     movew    #63,_errno    | NAN => errno = EDOM
  133.     pea    _Overflow    | for printf
  134.     bra    error_exit    |
  135. error_nan:
  136.     moveml    a0@(24),d0-d1    | result = +inf
  137.     moveml    d0-d1,a7@-
  138.     movew    #62,_errno    | NAN => errno = EDOM
  139.     pea    _Domain        | for printf
  140. ");
  141. #endif    __MSHORT__
  142. __asm("
  143. error_exit:
  144.     pea    _Error_String    |
  145.     pea    __iob+52    |
  146.     jbsr    _fprintf    |
  147.     addl    #12,a7        |
  148.     moveml    a7@+,d0-d1
  149.     rts
  150.     ");
  151. # else    ERROR_CHECK
  152. # endif    ERROR_CHECK
  153. #endif /* __M68881__ || sfp004    */
  154.