mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.0 KiB
73 lines
1.0 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
#include "libgcc.h" |
|
|
|
; numerator in A0/A1 |
|
; denominator in A2/A3 |
|
.global __modsi3 |
|
__modsi3: |
|
PUSHP S2P |
|
bsr modnorm |
|
bsr __divsi3 |
|
mov.l er3,er0 |
|
bra exitdiv |
|
|
|
.global __umodsi3 |
|
__umodsi3: |
|
bsr __udivsi3:16 |
|
mov.l er3,er0 |
|
rts |
|
|
|
.global __divsi3 |
|
__divsi3: |
|
PUSHP S2P |
|
bsr divnorm |
|
bsr __udivsi3:16 |
|
|
|
; examine what the sign should be |
|
exitdiv: |
|
btst #3,S2L |
|
beq reti |
|
|
|
; should be -ve |
|
neg.l A0P |
|
|
|
reti: |
|
POPP S2P |
|
rts |
|
|
|
divnorm: |
|
mov.l A0P,A0P ; is the numerator -ve |
|
stc ccr,S2L ; keep the sign in bit 3 of S2L |
|
bge postive |
|
|
|
neg.l A0P ; negate arg |
|
|
|
postive: |
|
mov.l A1P,A1P ; is the denominator -ve |
|
bge postive2 |
|
|
|
neg.l A1P ; negate arg |
|
xor.b #0x08,S2L ; toggle the result sign |
|
|
|
postive2: |
|
rts |
|
|
|
;; Basically the same, except that the sign of the divisor determines |
|
;; the sign. |
|
modnorm: |
|
mov.l A0P,A0P ; is the numerator -ve |
|
stc ccr,S2L ; keep the sign in bit 3 of S2L |
|
bge mpostive |
|
|
|
neg.l A0P ; negate arg |
|
|
|
mpostive: |
|
mov.l A1P,A1P ; is the denominator -ve |
|
bge mpostive2 |
|
|
|
neg.l A1P ; negate arg |
|
|
|
mpostive2: |
|
rts |
|
|
|
.end
|
|
|