diff options
Diffstat (limited to 'libkern/muldiv-68000.s')
| -rw-r--r-- | libkern/muldiv-68000.s | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/libkern/muldiv-68000.s b/libkern/muldiv-68000.s new file mode 100644 index 00000000..10ef6f46 --- /dev/null +++ b/libkern/muldiv-68000.s @@ -0,0 +1,172 @@ +/* + * calls _divul with + * absolute value arguments + */ +TEXT _divsl(SB), $0 + MOVL R0, TOS + + MOVL b+4(FP), R0 + BPL y1 + NEGL R0 + MOVL R0, TOS + + MOVL a+0(FP), R0 + BPL y3 + NEGL R0 + MOVL R0, TOS + + /* neg/neg */ + JSR _divul(SB) + MOVL TOS, R0 + MOVL R0, a+0(FP) + MOVL TOS, R0 + NEGL R0 + MOVL R0, b+4(FP) + MOVL TOS, R0 + RTS + +y1: MOVL R0, TOS + + MOVL a+0(FP), R0 + BPL y2 + NEGL R0 + MOVL R0, TOS + + /* neg/pos */ + JSR _divul(SB) + MOVL TOS, R0 + NEGL R0 + MOVL R0, a+0(FP) + MOVL TOS, R0 + NEGL R0 + MOVL R0, b+4(FP) + MOVL TOS, R0 + RTS + +y2: MOVL R0, TOS + + /* pos/pos */ + JSR _divul(SB) + MOVL TOS, R0 + MOVL R0, a+0(FP) + MOVL TOS, R0 + MOVL R0, b+4(FP) + MOVL TOS, R0 + RTS + +y3: MOVL R0, TOS + + /* pos/neg */ + JSR _divul(SB) + MOVL TOS, R0 + NEGL R0 + MOVL R0, a+0(FP) + MOVL TOS, R0 + MOVL R0, b+4(FP) + MOVL TOS, R0 + RTS + +/* + * for(i=1;; i++) { + * if(den & (1<<31)) + * break; + * den <<= 1; + * } + * + * for(; i; i--) { + * quo <<= 1; + * if(num >= den) { + * num -= den; + * quo |= 1; + * } + * den >>= 1; + * } + */ +TEXT _divul(SB), $0 + MOVL R0, TOS /* i */ + MOVL R1, TOS /* num */ + MOVL R2, TOS /* den */ + MOVL R3, TOS /* quo */ + + MOVL $0, R0 + MOVL $0, R3 + MOVL a+0(FP), R1 + MOVL b+4(FP), R2 + BEQ xout + BMI x1 + + ADDL $1, R0 + LSLL $1, R2 + BPL -2(PC) + +x1: LSLL $1, R3 + CMPL R1, R2 + BCS 3(PC) + SUBL R2, R1 + ORL $1, R3 + LSRL $1, R2 + DBMI R0, x1 + + MOVL R3, a+0(FP) + MOVL R1, b+4(FP) + +xout: + MOVL TOS, R3 + MOVL TOS, R2 + MOVL TOS, R1 + MOVL TOS, R0 + RTS + +/* + * x = 0; + * for(i=0; i<32; i++) { + * if(a & 1) + * x += b; + * a >>= 1; + * b <<= 1; + * } + * a = x; + */ +TEXT _mull(SB), $0 + MOVL R0, TOS /* i */ + MOVL R1, TOS /* a */ + MOVL R2, TOS /* b */ + MOVL R3, TOS /* x */ + + MOVL a+0(FP), R1 + MOVL b+4(FP), R2 + MOVL $32, R0 + CLRL R3 + +z1: ROTRL $1, R1 + BCC 2(PC) + ADDL R2, R3 + LSLL $1, R2 + DBEQ R0, z1 + + MOVL R3, b+4(FP) + MOVL TOS, R3 + MOVL TOS, R2 + MOVL TOS, R1 + MOVL TOS, R0 + RTS + +TEXT _ccr(SB), $0 + PEA (A0) + SUBL A0, A0 + + BCC 2(PC) + LEA 1(A0), A0 + + BVC 2(PC) + LEA 2(A0), A0 + + BNE 2(PC) + LEA 4(A0), A0 + + BPL 2(PC) + LEA 8(A0), A0 + + MOVW A0, a+0(FP) + MOVL TOS, A0 + RTS |
