_sparc_div.s
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. !------------------------------------------------------------------------------
  2. ! assembler code for unsigned 32 bit multiplication
  3. ! taken from 
  4. !
  5. !            "The SPARC Architecture Manual"  (Appendix E.2)
  6. !
  7. !------------------------------------------------------------------------------
  8. !------------------------------------------------------------------------------
  9. ! extern "C" word Div_Inner_Loop(word *p, word *a, word* a_stop, word B)
  10. !------------------------------------------------------------------------------
  11. ! %o0 p
  12. ! %o1 a
  13. ! %o2 a_stop
  14. ! %o3 B
  15. !
  16. .global    _Div_Inner_Loop
  17. _Div_Inner_Loop:
  18. cmp        %o1,%o2       ! if a >= a_stop return 
  19. bge        IDIV_L1
  20. mov        0, %g5        ! carry = 0
  21. IDIV_L0:                 ! Loop: while (a < a_stop)
  22. mov        %o3, %y       ! load B to Y register
  23. andcc      %g0, %g0, %g3
  24. ld         [%o1], %g2    ! A = *a
  25. ld         [%o0], %g4    ! P = *p
  26. !
  27. ! compute 64 bit product A*B = (high,low)
  28. !
  29. mulscc     %g3, %g2, %g3 
  30. mulscc     %g3, %g2, %g3
  31. mulscc     %g3, %g2, %g3
  32. mulscc     %g3, %g2, %g3
  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, %g0, %g3
  62. tst        %g2            ! sign correction
  63. bge        IDIV_L2
  64. rd         %y, %g2        ! low
  65. add        %g3, %o3, %g3  ! sign correction
  66. IDIV_L2:
  67. subcc      %g4, %g5, %g4  ! P -= carry
  68. addx       %g0, %g0, %g5  ! new carry from subtraction
  69. subcc      %g4, %g2, %g4  ! P -= low
  70. addx       %g3, %g5, %g5  ! carry += high
  71. st         %g4, [%o0]     ! *p = P
  72. inc        4,   %o1       ! a++
  73. cmp        %o1, %o2       ! if (a < a_stop) goto IDIV_L0
  74. bl         IDIV_L0        ! loop
  75. inc        4,   %o0       ! p++
  76. IDIV_L1:
  77. ld         [%o0], %g4     ! P = *p
  78. subcc      %g4, %g5, %g4  ! P -= carry
  79. addx       %g0, %g0, %g5  ! new carry 
  80. retl
  81. mov        %g5, %o0       ! return carry