home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ledar34.zip / leda-r-3_4_tar / LEDA-3.4 / src / sparc / _sparc_div.s < prev    next >
Text File  |  1996-09-03  |  2KB  |  87 lines

  1.  
  2. !------------------------------------------------------------------------------
  3. ! assembler code for unsigned 32 bit multiplication
  4. ! taken from 
  5. !
  6. !            "The SPARC Architecture Manual"  (Appendix E.2)
  7. !
  8. !------------------------------------------------------------------------------
  9.  
  10.  
  11. !------------------------------------------------------------------------------
  12. ! extern "C" word Div_Inner_Loop(word *p, word *a, word* a_stop, word B)
  13. !------------------------------------------------------------------------------
  14. ! %o0 p
  15. ! %o1 a
  16. ! %o2 a_stop
  17. ! %o3 B
  18. !
  19.  
  20. .global    _Div_Inner_Loop
  21. _Div_Inner_Loop:
  22. cmp        %o1,%o2       ! if a >= a_stop return 
  23. bge        IDIV_L1
  24. mov        0, %g5        ! carry = 0
  25. IDIV_L0:                 ! Loop: while (a < a_stop)
  26. mov        %o3, %y       ! load B to Y register
  27. andcc      %g0, %g0, %g3
  28. ld         [%o1], %g2    ! A = *a
  29. ld         [%o0], %g4    ! P = *p
  30. !
  31. ! compute 64 bit product A*B = (high,low)
  32. !
  33. mulscc     %g3, %g2, %g3 
  34. mulscc     %g3, %g2, %g3
  35. mulscc     %g3, %g2, %g3
  36. mulscc     %g3, %g2, %g3
  37. mulscc     %g3, %g2, %g3
  38. mulscc     %g3, %g2, %g3
  39. mulscc     %g3, %g2, %g3
  40. mulscc     %g3, %g2, %g3
  41. mulscc     %g3, %g2, %g3
  42. mulscc     %g3, %g2, %g3
  43. mulscc     %g3, %g2, %g3
  44. mulscc     %g3, %g2, %g3
  45. mulscc     %g3, %g2, %g3
  46. mulscc     %g3, %g2, %g3
  47. mulscc     %g3, %g2, %g3
  48. mulscc     %g3, %g2, %g3
  49. mulscc     %g3, %g2, %g3
  50. mulscc     %g3, %g2, %g3
  51. mulscc     %g3, %g2, %g3
  52. mulscc     %g3, %g2, %g3
  53. mulscc     %g3, %g2, %g3
  54. mulscc     %g3, %g2, %g3
  55. mulscc     %g3, %g2, %g3
  56. mulscc     %g3, %g2, %g3
  57. mulscc     %g3, %g2, %g3
  58. mulscc     %g3, %g2, %g3
  59. mulscc     %g3, %g2, %g3
  60. mulscc     %g3, %g2, %g3
  61. mulscc     %g3, %g2, %g3
  62. mulscc     %g3, %g2, %g3
  63. mulscc     %g3, %g2, %g3
  64. mulscc     %g3, %g2, %g3
  65. mulscc     %g3, %g0, %g3
  66. tst        %g2            ! sign correction
  67. bge        IDIV_L2
  68. rd         %y, %g2        ! low
  69. add        %g3, %o3, %g3  ! sign correction
  70. IDIV_L2:
  71. subcc      %g4, %g5, %g4  ! P -= carry
  72. addx       %g0, %g0, %g5  ! new carry from subtraction
  73. subcc      %g4, %g2, %g4  ! P -= low
  74. addx       %g3, %g5, %g5  ! carry += high
  75. st         %g4, [%o0]     ! *p = P
  76. inc        4,   %o1       ! a++
  77. cmp        %o1, %o2       ! if (a < a_stop) goto IDIV_L0
  78. bl         IDIV_L0        ! loop
  79. inc        4,   %o0       ! p++
  80. IDIV_L1:
  81. ld         [%o0], %g4     ! P = *p
  82. subcc      %g4, %g5, %g4  ! P -= carry
  83. addx       %g0, %g0, %g5  ! new carry 
  84. retl
  85. mov        %g5, %o0       ! return carry
  86.  
  87.