home *** CD-ROM | disk | FTP | other *** search
- ; > MulScale
-
- ; int MulScale(int m1, int m2, int rsh)
- ; = (m1*m2) >> rsh
- ; Multiplication done in double precision
- ; used for fixed point multiplication
-
- ip = 12
- sp = 13
- lr = 14
- pc = 15
-
- lhs = 0
- rhs = 1
- shift = 2
- dest0 = 3
- dest1 = 4
- sign = lr
- tmp = ip
-
- .AREA WA$$code, .code, .readonly
-
- MulScale:: STMFD sp!, {dest1, lr}
-
- EOR sign, lhs, rhs
- MOVS lhs, lhs
- RSBMI lhs, lhs, #0
- MOVS rhs, rhs
- RSBMI rhs, rhs, #0
- MOV tmp, lhs, LSR #16
- MOV dest1, rhs, LSR #16
- BIC lhs, lhs, tmp, LSL #16
- BIC rhs, rhs, dest1, LSL #16
- MUL dest0, lhs, rhs
- MUL rhs, tmp, rhs
- MUL lhs, dest1, lhs
- MUL dest1, tmp, dest1
- ADDS lhs, rhs, lhs
- ADDCS dest1, dest1, #0x10000
- ADDS dest0, dest0, lhs, LSL #16
- ADC dest1, dest1, lhs, LSR #16
-
- RSB rhs, shift, #32
- MOV lhs, dest1, ASL rhs
- ADD lhs, lhs, dest0, LSR shift
-
- MOVS sign, sign
- RSBMI lhs, lhs, #0
-
- LDMFD sp!, {dest1, pc}^
-