[BACK]Return to divu.S CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / spmath

Annotation of sys/arch/hppa/spmath/divu.S, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: divu.S,v 1.10 2005/01/23 18:01:30 mickey Exp $        */
                      2: /*
                      3:   (c) Copyright 1986 HEWLETT-PACKARD COMPANY
                      4:   To anyone who acknowledges that this file is provided "AS IS"
                      5:   without any express or implied warranty:
                      6:       permission to use, copy, modify, and distribute this file
                      7:   for any purpose is hereby granted without fee, provided that
                      8:   the above copyright notice and this notice appears in all
                      9:   copies, and that the name of Hewlett-Packard Company not be
                     10:   used in advertising or publicity pertaining to distribution
                     11:   of the software without specific, written prior permission.
                     12:   Hewlett-Packard Company makes no representations about the
                     13:   suitability of this software for any purpose.
                     14: */
                     15: /* @(#)divu.s: Revision: 1.11.88.1 Date: 93/12/07 15:06:01 */
                     16:
                     17: #include <machine/asm.h>
                     18: #define _LOCORE
                     19: #include <machine/frame.h>
                     20:
                     21: ;************************************************************************
                     22: ; Implement an integer divide routine for 32-bit operands and 32-bit quotient
                     23: ; and remainder with operand values of zero (divisor only) treated specially.
                     24: ;
                     25: ;****************************************************************************
                     26: ; Definitions
                     27: ;****************************************************************************
                     28: ;
                     29: ;      General registers
                     30: ;
                     31: gr0    .reg            %r0             ; General register zero
                     32: rem    .reg            %r3             ; remainder and upper part of dividend
                     33: quo    .reg            %r4             ; quotient and lower part of dividend
                     34: dvr    .reg            %r5             ; divisor
                     35: tp     .reg            %r6             ; temp. reg.
                     36:
                     37: ;******************************************************************************
                     38:        .text
                     39: LEAF_ENTRY(divu)
                     40:        stws,ma         rem,4(sp)               ; save registers on stack
                     41:        stws,ma         quo,4(sp)               ; save registers on stack
                     42:        stws,ma         dvr,4(sp)               ; save registers on stack
                     43:        stws,ma         tp,4(sp)                ; save registers on stack
                     44:
                     45:        addi            0,arg2,dvr              ; get divisor
                     46:        addi            0,arg1,quo              ; get lower dividend
                     47:        addi            0,arg0,rem              ; get upper dividend
                     48:
                     49:        comib,>,n       0,dvr,hibit             ; check for dvr >= 2**31
                     50:        addi            -1,gr0,tp               ; set V-bit to 1
                     51:        ds              0,tp,0
                     52:        add             quo,quo,quo             ; shift msb bit into carry
                     53:        ds              rem,dvr,rem             ; 1st divide step, if carry
                     54:                                                ;   out, msb of quotient = 0
                     55:        addc            quo,quo,quo             ; shift quo with/into carry
                     56:        ds              rem,dvr,rem             ; 2nd divide step
                     57:        addc            quo,quo,quo             ; shift quo with/into carry
                     58:        ds              rem,dvr,rem             ; 3rd divide step
                     59:        addc            quo,quo,quo             ; shift quo with/into carry
                     60:        ds              rem,dvr,rem             ; 4th divide step
                     61:        addc            quo,quo,quo             ; shift quo with/into carry
                     62:        ds              rem,dvr,rem             ; 5th divide step
                     63:        addc            quo,quo,quo             ; shift quo with/into carry
                     64:        ds              rem,dvr,rem             ; 6th divide step
                     65:        addc            quo,quo,quo             ; shift quo with/into carry
                     66:        ds              rem,dvr,rem             ; 7th divide step
                     67:        addc            quo,quo,quo             ; shift quo with/into carry
                     68:        ds              rem,dvr,rem             ; 8th divide step
                     69:        addc            quo,quo,quo             ; shift quo with/into carry
                     70:        ds              rem,dvr,rem             ; 9th divide step
                     71:        addc            quo,quo,quo             ; shift quo with/into carry
                     72:        ds              rem,dvr,rem             ; 10th divide step
                     73:        addc            quo,quo,quo             ; shift quo with/into carry
                     74:        ds              rem,dvr,rem             ; 11th divide step
                     75:        addc            quo,quo,quo             ; shift quo with/into carry
                     76:        ds              rem,dvr,rem             ; 12th divide step
                     77:        addc            quo,quo,quo             ; shift quo with/into carry
                     78:        ds              rem,dvr,rem             ; 13th divide step
                     79:        addc            quo,quo,quo             ; shift quo with/into carry
                     80:        ds              rem,dvr,rem             ; 14th divide step
                     81:        addc            quo,quo,quo             ; shift quo with/into carry
                     82:        ds              rem,dvr,rem             ; 15th divide step
                     83:        addc            quo,quo,quo             ; shift quo with/into carry
                     84:        ds              rem,dvr,rem             ; 16th divide step
                     85:        addc            quo,quo,quo             ; shift quo with/into carry
                     86:        ds              rem,dvr,rem             ; 17th divide step
                     87:        addc            quo,quo,quo             ; shift quo with/into carry
                     88:        ds              rem,dvr,rem             ; 18th divide step
                     89:        addc            quo,quo,quo             ; shift quo with/into carry
                     90:        ds              rem,dvr,rem             ; 19th divide step
                     91:        addc            quo,quo,quo             ; shift quo with/into carry
                     92:        ds              rem,dvr,rem             ; 20th divide step
                     93:        addc            quo,quo,quo             ; shift quo with/into carry
                     94:        ds              rem,dvr,rem             ; 21st divide step
                     95:        addc            quo,quo,quo             ; shift quo with/into carry
                     96:        ds              rem,dvr,rem             ; 22nd divide step
                     97:        addc            quo,quo,quo             ; shift quo with/into carry
                     98:        ds              rem,dvr,rem             ; 23rd divide step
                     99:        addc            quo,quo,quo             ; shift quo with/into carry
                    100:        ds              rem,dvr,rem             ; 24th divide step
                    101:        addc            quo,quo,quo             ; shift quo with/into carry
                    102:        ds              rem,dvr,rem             ; 25th divide step
                    103:        addc            quo,quo,quo             ; shift quo with/into carry
                    104:        ds              rem,dvr,rem             ; 26th divide step
                    105:        addc            quo,quo,quo             ; shift quo with/into carry
                    106:        ds              rem,dvr,rem             ; 27th divide step
                    107:        addc            quo,quo,quo             ; shift quo with/into carry
                    108:        ds              rem,dvr,rem             ; 28th divide step
                    109:        addc            quo,quo,quo             ; shift quo with/into carry
                    110:        ds              rem,dvr,rem             ; 29th divide step
                    111:        addc            quo,quo,quo             ; shift quo with/into carry
                    112:        ds              rem,dvr,rem             ; 30th divide step
                    113:        addc            quo,quo,quo             ; shift quo with/into carry
                    114:        ds              rem,dvr,rem             ; 31st divide step
                    115:        addc            quo,quo,quo             ; shift quo with/into carry
                    116:        ds              rem,dvr,rem             ; 32nd divide step,
                    117:        addc            quo,quo,quo             ; shift last quo bit into quo
                    118:        addb,>=,n       rem,0,finish            ; branch if pos. rem
                    119:        add,<           dvr,0,0                 ; if dvr > 0, add dvr
                    120:        add,tr          rem,dvr,rem             ;   for correcting rem.
                    121:        sub             rem,dvr,rem             ; else subtract dvr
                    122: ;
                    123: ;      end of divide routine
                    124: ;
                    125: finish stws            rem,0(arg3)             ; save remainder in high part
                    126:                                                ;   of result
                    127:        stws            quo,4(arg3)             ; save quotient in low part
                    128:                                                ;   of result
                    129:        ldws,mb         -4(sp),tp               ; restore registers
                    130:        ldws,mb         -4(sp),dvr              ; restore registers
                    131:        ldws,mb         -4(sp),quo              ; restore registers
                    132:        bv              0(rp)                   ; return
                    133:        ldws,mb         -4(sp),rem              ; restore registers
                    134: ;
                    135: hibit  ldo             32(0),tp                ; initialize loop counter
                    136:        add             quo,quo,quo             ; shift high bit into carry
                    137: loop   addc            rem,rem,rem             ; shift in high bit of dvdl
                    138:        addc,<>         0,0,0                   ; if bit shifted out of dvdu,
                    139:                                                ;   want to do subtract
                    140:        comb,<<,n       rem,dvr,nosub           ; if upper dividend > dvr,
                    141:        sub             rem,dvr,rem             ;   subtract and
                    142:        add,tr          dvr,dvr,0               ;   set carry
                    143: nosub  addi            0,0,0                   ; otherwise clear carry
                    144:        addib,>         -1,tp,loop              ; inc. counter; finished?
                    145:        addc            quo,quo,quo             ; shift bit of result into dvdl
                    146:        b               finish+4                ; finish up
                    147:        stws            rem,0(arg3)             ; save remainder in high part
                    148:                                                ;   of result
                    149: EXIT(divu)
                    150:
                    151:        .end

CVSweb