1234567891011121314151617181920212223242526272829303132333435363738394041 |
- /*
- * This only works on R[45]000 chips that allow 64 bit
- * integer arithmetic even when uding 32 bit addresses
- *
- * R1 = dividend*
- * R2 = dividend[low]
- * R3 = dividend[high]
- * R4 = 32 bit divisor
- * R5 = quotient*
- */
- TEXT mpdigdiv(SB),$0
- MOVW 0(R1),R2
- MOVW 4(R1),R3
- MOVW divisor+4(FP),R4
- MOVW quotient+8(FP),R5
- /* divisor == 0 */
- BEQ R4,_digovfl
- /* dividend >= 2^32 * divisor */
- SGTU R4,R3,R7
- BEQ R7,_digovfl
- _digdiv1:
- SLLV $32,R2
- SLLV $32,R3
- SRLV $32,R2
- ADDVU R2,R3
- SLLV $32,R4
- SRLV $32,R4
- DIVVU R4,R3
- MOVW LO,R1
- MOVW R1,0(R5)
- RET
- _digovfl:
- MOVW $-1,R1
- MOVW R1,0(R5)
- RET
|