diff options
author | wkj <devnull@localhost> | 2004-04-21 04:45:31 +0000 |
---|---|---|
committer | wkj <devnull@localhost> | 2004-04-21 04:45:31 +0000 |
commit | ac0e2db600593d5b30550453b78874bfa0611751 (patch) | |
tree | b5532ae46d9dae89a4ba22e30fb7ff15e4aa173b /src/libmp/386/mpdigdiv.s | |
parent | f2a700e22af3cf792837935f8e8ed42d533d552e (diff) | |
download | plan9port-ac0e2db600593d5b30550453b78874bfa0611751.tar.gz plan9port-ac0e2db600593d5b30550453b78874bfa0611751.tar.bz2 plan9port-ac0e2db600593d5b30550453b78874bfa0611751.zip |
Add basic libmp support for the x86.
Diffstat (limited to 'src/libmp/386/mpdigdiv.s')
-rw-r--r-- | src/libmp/386/mpdigdiv.s | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/libmp/386/mpdigdiv.s b/src/libmp/386/mpdigdiv.s new file mode 100644 index 00000000..f02e1616 --- /dev/null +++ b/src/libmp/386/mpdigdiv.s @@ -0,0 +1,39 @@ +.text + +.p2align 2,0x90 +.globl mpdigdiv + .type mpdigdiv, @function +mpdigdiv: + /* Prelude */ + pushl %ebp + movl %ebx, -4(%esp) /* save on stack */ + + movl 8(%esp), %ebx + movl (%ebx), %eax + movl 4(%ebx), %edx + + movl 12(%esp), %ebx + movl 16(%esp), %ebp + xorl %ecx, %ecx + cmpl %ebx, %edx /* dividend >= 2^32 * divisor */ + jae divovfl + cmpl %ecx, %ebx /* divisor == 1 */ + je divovfl + divl %ebx /* AX = DX:AX/BX */ + movl %eax, (%ebp) + jmp done + + /* return all 1's */ +divovfl: + notl %ecx + movl %ecx, (%ebp) + +done: + /* Postlude */ + movl -4(%esp), %ebx /* restore from stack */ + movl %esp, %ebp + leave + ret + +.endmpdigdiv: + .size mpdigdiv,.endmpdigdiv-mpdigdiv |