home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / shareware / share_42 / penrose / !penrose / a / MulScale
Text File  |  1991-05-31  |  1KB  |  51 lines

  1. ; > MulScale
  2.  
  3. ; int MulScale(int m1, int m2, int rsh)
  4. ; = (m1*m2) >> rsh
  5. ; Multiplication done in double precision
  6. ; used for fixed point multiplication
  7.  
  8. ip    = 12
  9. sp    = 13
  10. lr    = 14
  11. pc    = 15
  12.  
  13. lhs   = 0
  14. rhs   = 1
  15. shift = 2
  16. dest0 = 3
  17. dest1 = 4
  18. sign  = lr
  19. tmp   = ip
  20.  
  21. .AREA           WA$$code, .code, .readonly
  22.  
  23. MulScale::  STMFD sp!, {dest1, lr}
  24.  
  25.             EOR   sign, lhs, rhs
  26.             MOVS  lhs, lhs
  27.             RSBMI lhs, lhs, #0
  28.             MOVS  rhs, rhs
  29.             RSBMI rhs, rhs, #0
  30.             MOV   tmp, lhs, LSR #16
  31.             MOV   dest1, rhs, LSR #16
  32.             BIC   lhs, lhs, tmp, LSL #16 
  33.             BIC   rhs, rhs, dest1, LSL #16
  34.             MUL   dest0, lhs, rhs
  35.             MUL   rhs, tmp, rhs
  36.             MUL   lhs, dest1, lhs
  37.             MUL   dest1, tmp, dest1
  38.             ADDS  lhs, rhs, lhs
  39.             ADDCS dest1, dest1, #0x10000
  40.             ADDS  dest0, dest0, lhs, LSL #16
  41.             ADC   dest1, dest1, lhs, LSR #16
  42.  
  43.             RSB   rhs, shift, #32
  44.             MOV   lhs, dest1, ASL rhs
  45.             ADD   lhs, lhs, dest0, LSR shift
  46.  
  47.             MOVS  sign, sign
  48.             RSBMI lhs, lhs, #0
  49.  
  50.             LDMFD sp!, {dest1, pc}^
  51.