home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MCD.DMS / in.adf / libsrc / math_fpu.asm < prev    next >
Encoding:
Assembly Source File  |  1995-07-05  |  3.0 KB  |  228 lines

  1.  
  2. *    Maxon C++ Library:
  3. *    Modul "math_fpu"
  4. *    Transzendete Math-Funktionen für FPU
  5. *    Jens Gelhar 02.03.95
  6.  
  7.     xdef    _sin__r,_cos__r,_tan__r,_sinh__r,_cosh__r,_tanh__r
  8.     xdef    _asin__r,_acos__r,_atan__r,_exp__r,_log__r,_log10__r
  9.     xdef    _sqrt__r,_pow__r,_atan2__r,_modf__r,_frexp__r,_ldexp__r,_fmod__r
  10.     xdef    _fabs__r,_floor__r,_ceil__r
  11.  
  12.     mc68881
  13.  
  14.     SECTION "Transcen",CODE
  15.  
  16. _sin__r:
  17.     fsin.d    4(a7),fp0
  18.     rts
  19.  
  20. _cos__r:
  21.     fcos.d    4(a7),fp0
  22.     rts
  23.  
  24. _tan__r:
  25.     ftan.d    4(a7),fp0
  26.     rts
  27.  
  28. _asin__r:
  29.     fasin.d    4(a7),fp0
  30.     rts
  31.  
  32. _acos__r:
  33.     facos.d    4(a7),fp0
  34.     rts
  35.  
  36. _atan__r:
  37.     fatan.d    4(a7),fp0
  38.     rts
  39.  
  40. _sinh__r:
  41.     fsinh.d    4(a7),fp0
  42.     rts
  43.  
  44. _cosh__r:
  45.     fcosh.d    4(a7),fp0
  46.     rts
  47.  
  48. _tanh__r:
  49.     ftanh.d    4(a7),fp0
  50.     rts
  51.  
  52. _exp__r:
  53.     fetox.d    4(a7),fp0
  54.     rts
  55.  
  56. _log__r:
  57.     flogn.d    4(a7),fp0
  58.     rts
  59.  
  60. _log10__r:
  61.     flog10.d 4(a7),fp0
  62.     rts
  63.  
  64. _sqrt__r:
  65.     fsqrt.d    4(a7),fp0
  66.     rts
  67.  
  68. _pow__r:
  69.     flogn.d    4(a7),fp0
  70.     fmul.d    12(a7),fp0
  71.     fetox.x    fp0
  72.     rts
  73.  
  74.     SECTION "Misc",CODE
  75.  
  76. _modf__r:
  77.     ; Stack-Parameter: double, double*
  78.     fmove.d    4(a7),fp0
  79.     fintrz.x fp0,fp1    ; Vorkommateil nach fp1
  80.     fsub.x    fp1,fp0        ; Nachkommateil...
  81.     move.l    12(a7),a0
  82.     cmp.w    #0,a0
  83.     beq.b    .0
  84.     fmove.d    fp1,(a0)
  85. .0    rts
  86.  
  87.  
  88. _atan2__r:
  89.     fmove.d    4(a7),fp0
  90.     fmove.d    12(a7),fp1
  91.     ftst.x    fp1
  92.     fbne    .0
  93.     ; Division durch Null umgehen:
  94.     fmove.d #1.570796327,fp0        ; = pi/2
  95.     bra.b    .1
  96. .0    fdiv.x    fp1,fp0
  97. .1    ftst.d    4(a7)                ; x < 0 ?
  98.     fboge    .3                ; dann Korrektur-Rechnung
  99.     fmove.d    #3.14159265435897932384626433827950288,fp1
  100.     ftst.x    fp0
  101.     fbolt    .2
  102.     fsub.x    fp1,fp0                ; x = x'-pi
  103.     bra.b    .3
  104. .2    fadd.x    fp1,fp0                ; x = x'+pi
  105. .3    fatan.x    fp0
  106.     rts
  107.  
  108.  
  109. _frexp__r:
  110.     ; Parameter: double, int*
  111.     fmove.d    4(a7),fp0
  112.     fgetexp.x fp0,fp1
  113.     fgetman.x fp0
  114.     move.l    12(a7),a0
  115.     cmp.w    #0,a0
  116.     beq.b    .0
  117.     fmove.d    fp1,(a0)
  118. .0    rts
  119.  
  120.  
  121. _ldexp__r:
  122.     ; Parameter: double, int
  123.     move.w    4(a7),d0
  124.     beq.b    .zero
  125.     move.l    12(a7),d1
  126.     bclr    #15,d0
  127.     lsr.w    #4,d0
  128.     ext.l    d0
  129.     add.l    d1,d0
  130.     cmp.l    #$7FF,d0
  131.     bhi.b    .overflow
  132.     swap    d0
  133.     asl.l    #4,d0
  134.     and.l    #$800FFFFF,4(a7)
  135.     or.l    4(a7),d0
  136.     fmove.d    4(a7),fp0
  137.     rts
  138. .overflow:
  139. .zero:    fmove.x    #0.0,fp0
  140.     rts
  141.  
  142.     SECTION "Round",CODE
  143.  
  144. _fmod__r:
  145.     fmove.d    4(a7),fp0
  146.     frem.d    12(a7),fp0
  147.     rts
  148.  
  149. _fabs__r:
  150.     fabs.d    4(a7),fp0
  151.     rts
  152.  
  153. _floor__r:
  154.     fmove.l    FPCR,d0
  155.     fmove.l #%10100000,FPCR
  156.     fint.d    4(a7),fp0
  157.     fmove.l    d0,FPCR
  158.     rts
  159.  
  160. _ceil__r:
  161.     fmove.l    FPCR,d0
  162.     fmove.l #%10110000,FPCR
  163.     fint.d    4(a7),fp0
  164.     fmove.l    d0,FPCR
  165.     rts
  166.  
  167.  
  168.     SECTION "atof",CODE
  169.  
  170.     xref    atof__PCc
  171.     xdef    _atof__r
  172.     xdef    atof__r_PCc
  173.  
  174. _atof__r:
  175. atof__r_PCc:
  176.     move.l    4(a7),-(a7)
  177.     jsr    atof__PCc
  178.     addq.l    #4,a7
  179.     movem.l    d0/d1,-(a7)
  180.     fmove.d    (a7)+,fp0
  181.     rts
  182.  
  183.  
  184.     SECTION "strtod",CODE
  185.  
  186.     xref    strtod__PCcPPc
  187.     xdef    _strtod__r
  188.     xdef    strtod__r_PCcPPc
  189. _strtod__r:
  190. strtod__r_PCcPPc:
  191.     move.l    8(a7),-(a7)
  192.     move.l    8(a7),-(a7)
  193.     jsr    strtod__PCcPPc
  194.     addq.l    #8,a7
  195.     movem.l    d0/d1,-(a7)
  196.     fmove.d    (a7)+,fp0
  197.     rts
  198.  
  199.  
  200.     SECTION "Random",CODE
  201.  
  202.     xref    Random_
  203.     xdef    Random__r
  204. Random__r:
  205.     jsr    Random_
  206.     movem.l    d0/d1,-(a7)
  207.     fmove.d    (a7)+,fp0
  208.     rts
  209.  
  210.  
  211.     SECTION "difftime",CODE
  212.  
  213.     xref    difftime__UiUi
  214.     xdef    _difftime__r
  215.     xdef    difftime__r_UiUi
  216. _difftime__r:
  217. difftime__r_UiUi:
  218.     move.l    8(a7),-(a7)
  219.     move.l    8(a7),-(a7)
  220.     jsr    difftime__UiUi
  221.     addq.l    #8,a7
  222.     movem.l    d0/d1,-(a7)
  223.     fmove.d    (a7)+,fp0
  224.     rts
  225.  
  226.     end
  227.  
  228.