c82af01654
From-SVN: r15205
1147 lines
25 KiB
NASM
1147 lines
25 KiB
NASM
; Low level integer divide, multiply, remainder, etc routines for the HPPA.
|
|
; Copyright (C) 1995 Free Software Foundation, Inc.
|
|
|
|
; This file is part of GNU CC.
|
|
|
|
; GNU CC is free software; you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation; either version 2, or (at your option)
|
|
; any later version.
|
|
|
|
; In addition to the permissions in the GNU General Public License, the
|
|
; Free Software Foundation gives you unlimited permission to link the
|
|
; compiled version of this file with other programs, and to distribute
|
|
; those programs without any restriction coming from the use of this
|
|
; file. (The General Public License restrictions do apply in other
|
|
; respects; for example, they cover modification of the file, and
|
|
; distribution when not linked into another program.)
|
|
|
|
; GNU CC is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with GNU CC; see the file COPYING. If not, write to
|
|
; the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
; Boston, MA 02111-1307, USA.
|
|
|
|
#ifdef L_dyncall
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.export $$dyncall
|
|
$$dyncall
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
bb,>=,n %r22,30,L$1 ; branch if not plabel address
|
|
depi 0,31,2,%r22 ; clear the two least significant bits
|
|
ldw 4(%sr0,%r22),%r19 ; load new LTP value
|
|
ldw 0(%sr0,%r22),%r22 ; load address of target
|
|
L$1 ldsid (%sr0,%r22),%r1 ; get the "space ident" selected by r22
|
|
mtsp %r1,%sr0 ; move that space identifier into sr0
|
|
be 0(%sr0,%r22) ; branch to the real target
|
|
stw %r2,-24(%sr0,%r30) ; save return address into frame marker
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#ifdef L_multiply
|
|
#define op0 %r26
|
|
#define op1 %r25
|
|
#define res %r29
|
|
#define ret %r31
|
|
#define tmp %r1
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$mulU
|
|
.export $$mulI
|
|
$$mulU
|
|
$$mulI
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
addi,tr 0,%r0,res ; clear out res, skip next insn
|
|
L$loop zdep op1,26,27,op1 ; shift up op1 by 5
|
|
L$lo zdep op0,30,5,tmp ; extract next 5 bits and shift up
|
|
blr tmp,%r0
|
|
extru op0,26,27,op0 ; shift down op0 by 5
|
|
L$0 comib,<> 0,op0,L$lo
|
|
zdep op1,26,27,op1 ; shift up op1 by 5
|
|
bv %r0(ret)
|
|
nop
|
|
L$1 b L$loop
|
|
addl op1,res,res
|
|
nop
|
|
nop
|
|
L$2 b L$loop
|
|
sh1addl op1,res,res
|
|
nop
|
|
nop
|
|
L$3 sh1addl op1,op1,tmp ; 3x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
nop
|
|
L$4 b L$loop
|
|
sh2addl op1,res,res
|
|
nop
|
|
nop
|
|
L$5 sh2addl op1,op1,tmp ; 5x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
nop
|
|
L$6 sh1addl op1,op1,tmp ; 3x
|
|
b L$loop
|
|
sh1addl tmp,res,res
|
|
nop
|
|
L$7 zdep op1,28,29,tmp ; 8x
|
|
sub tmp,op1,tmp ; 7x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$8 b L$loop
|
|
sh3addl op1,res,res
|
|
nop
|
|
nop
|
|
L$9 sh3addl op1,op1,tmp ; 9x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
nop
|
|
L$10 sh2addl op1,op1,tmp ; 5x
|
|
b L$loop
|
|
sh1addl tmp,res,res
|
|
nop
|
|
L$11 sh2addl op1,op1,tmp ; 5x
|
|
sh1addl tmp,op1,tmp ; 11x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$12 sh1addl op1,op1,tmp ; 3x
|
|
b L$loop
|
|
sh2addl tmp,res,res
|
|
nop
|
|
L$13 sh1addl op1,op1,tmp ; 3x
|
|
sh2addl tmp,op1,tmp ; 13x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$14 zdep op1,28,29,tmp ; 8x
|
|
sub tmp,op1,tmp ; 7x
|
|
b L$loop
|
|
sh1addl tmp,res,res
|
|
L$15 zdep op1,27,28,tmp ; 16x
|
|
sub tmp,op1,tmp ; 15x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$16 zdep op1,27,28,tmp ; 16x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
nop
|
|
L$17 zdep op1,27,28,tmp ; 16x
|
|
addl tmp,op1,tmp ; 17x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$18 sh3addl op1,op1,tmp ; 9x
|
|
b L$loop
|
|
sh1addl tmp,res,res
|
|
nop
|
|
L$19 sh3addl op1,op1,tmp ; 9x
|
|
sh1addl tmp,op1,tmp ; 19x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$20 sh2addl op1,op1,tmp ; 5x
|
|
b L$loop
|
|
sh2addl tmp,res,res
|
|
nop
|
|
L$21 sh2addl op1,op1,tmp ; 5x
|
|
sh2addl tmp,op1,tmp ; 21x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$22 sh2addl op1,op1,tmp ; 5x
|
|
sh1addl tmp,op1,tmp ; 11x
|
|
b L$loop
|
|
sh1addl tmp,res,res
|
|
L$23 sh1addl op1,op1,tmp ; 3x
|
|
sh3addl tmp,res,res ; += 8x3
|
|
b L$loop
|
|
sub res,op1,res ; -= x
|
|
L$24 sh1addl op1,op1,tmp ; 3x
|
|
b L$loop
|
|
sh3addl tmp,res,res ; += 8x3
|
|
nop
|
|
L$25 sh2addl op1,op1,tmp ; 5x
|
|
sh2addl tmp,tmp,tmp ; 25x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$26 sh1addl op1,op1,tmp ; 3x
|
|
sh2addl tmp,op1,tmp ; 13x
|
|
b L$loop
|
|
sh1addl tmp,res,res ; += 2x13
|
|
L$27 sh1addl op1,op1,tmp ; 3x
|
|
sh3addl tmp,tmp,tmp ; 27x
|
|
b L$loop
|
|
addl tmp,res,res
|
|
L$28 zdep op1,28,29,tmp ; 8x
|
|
sub tmp,op1,tmp ; 7x
|
|
b L$loop
|
|
sh2addl tmp,res,res ; += 4x7
|
|
L$29 sh1addl op1,op1,tmp ; 3x
|
|
sub res,tmp,res ; -= 3x
|
|
b L$foo
|
|
zdep op1,26,27,tmp ; 32x
|
|
L$30 zdep op1,27,28,tmp ; 16x
|
|
sub tmp,op1,tmp ; 15x
|
|
b L$loop
|
|
sh1addl tmp,res,res ; += 2x15
|
|
L$31 zdep op1,26,27,tmp ; 32x
|
|
sub tmp,op1,tmp ; 31x
|
|
L$foo b L$loop
|
|
addl tmp,res,res
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#ifdef L_divU
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define quotient %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU
|
|
$$divU
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
comb,< divisor,0,L$largedivisor
|
|
sub %r0,divisor,%r1 ; clear cy as side-effect
|
|
ds %r0,%r1,%r0
|
|
addc dividend,dividend,dividend
|
|
ds %r0,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,quotient
|
|
ds %r1,divisor,%r1
|
|
bv 0(ret)
|
|
addc quotient,quotient,quotient
|
|
L$largedivisor
|
|
comclr,<< dividend,divisor,quotient
|
|
ldi 1,quotient
|
|
bv,n 0(ret)
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#ifdef L_remU
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define quotient %r29
|
|
#define tmp %r1
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$remU
|
|
$$remU
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
comb,< divisor,0,L$largedivisor
|
|
sub %r0,divisor,%r1 ; clear cy as side-effect
|
|
ds %r0,%r1,%r0
|
|
addc dividend,dividend,dividend
|
|
ds %r0,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,quotient
|
|
ds %r1,divisor,%r1
|
|
comclr,>= %r1,%r0,%r0
|
|
addl %r1,divisor,%r1
|
|
bv 0(ret)
|
|
copy %r1,quotient
|
|
L$largedivisor
|
|
sub,>>= dividend,divisor,quotient
|
|
copy dividend,quotient
|
|
bv,n 0(ret)
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#ifdef L_divI
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define quotient %r29
|
|
#define tmp %r1
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI
|
|
$$divI
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
xor dividend,divisor,quotient ; result sign
|
|
comclr,>= divisor,%r0,%r0 ; get absolute values
|
|
sub %r0,divisor,divisor
|
|
comclr,>= dividend,%r0,%r0
|
|
sub %r0,dividend,dividend
|
|
|
|
comb,< divisor,0,L$largedivisor
|
|
sub %r0,divisor,%r1 ; clear cy as side-effect
|
|
ds %r0,%r1,%r0
|
|
addc dividend,dividend,dividend
|
|
ds %r0,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
comclr,>= %r1,%r0,%r0
|
|
addl %r1,divisor,%r1
|
|
comclr,>= quotient,%r0,%r0 ; skip of no need to negate
|
|
sub %r0,dividend,dividend
|
|
bv 0(ret)
|
|
copy dividend,quotient
|
|
L$largedivisor
|
|
comclr,<< dividend,divisor,quotient
|
|
ldi 1,quotient
|
|
bv,n 0(ret)
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#ifdef L_remI
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define quotient %r29
|
|
#define tmp %r1
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$remI
|
|
$$remI
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
xor dividend,%r0,quotient ; result sign
|
|
comclr,>= divisor,%r0,%r0 ; get absolute values
|
|
sub %r0,divisor,divisor
|
|
comclr,>= dividend,%r0,%r0
|
|
sub %r0,dividend,dividend
|
|
|
|
comb,< divisor,0,L$largedivisor
|
|
sub %r0,divisor,%r1 ; clear cy as side-effect
|
|
ds %r0,%r1,%r0
|
|
addc dividend,dividend,dividend
|
|
ds %r0,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
ds %r1,divisor,%r1
|
|
addc dividend,dividend,dividend
|
|
comclr,>= %r1,%r0,%r0
|
|
addl %r1,divisor,%r1
|
|
comclr,>= quotient,%r0,%r0 ; skip of no need to negate
|
|
sub %r0,%r1,%r1
|
|
bv 0(ret)
|
|
copy %r1,quotient
|
|
L$largedivisor
|
|
sub,>>= dividend,divisor,quotient
|
|
copy dividend,quotient
|
|
bv,n 0(ret)
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#if defined (L_divU_3) && !defined (SMALL_LIB)
|
|
#undef L_divU_3
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define result %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_3
|
|
$$divU_3
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
sh2add %r26,%r26,%r29 ; r29 = lo(101 x r)
|
|
shd %r0,%r26,30,%r1 ; r1 = hi(100 x r)
|
|
addc %r1,%r0,%r1 ; r1 = hi(101 x r)
|
|
; r in r1,,r29
|
|
zdep %r29,27,28,%r25 ; r25 = lo(10000 x r)
|
|
add %r25,%r29,%r25 ; r25 = lo(10001 x r)
|
|
shd %r1,%r29,28,%r29 ; r29 = hi(10000 x r)
|
|
addc %r29,%r1,%r29 ; r29 = hi(10001 x r)
|
|
; r in r29,,r25
|
|
zdep %r25,23,24,%r1 ; r1 = lo(100000000 x r)
|
|
add %r1,%r25,%r1 ; r1 = lo(100000001 x r)
|
|
shd %r29,%r25,24,%r25 ; r25 = hi(100000000 x r)
|
|
addc %r25,%r29,%r25 ; r25 = hi(100000001 x r)
|
|
; r in r25,,r1
|
|
zdep %r1,15,16,%r29
|
|
add %r29,%r1,%r29
|
|
shd %r25,%r1,16,%r1
|
|
addc %r1,%r25,%r1
|
|
; r in r1,,r29
|
|
sh1add %r29,%r26,%r0 ; r0 = lo(10 x r) + dividend
|
|
shd %r1,%r29,31,%r29 ; r29 = hi(10 x r)
|
|
addc %r29,%r0,%r29
|
|
bv 0(ret)
|
|
extru %r29,30,31,result
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#if defined (L_divU_5) && !defined (SMALL_LIB)
|
|
#undef L_divU_5
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define result %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_5
|
|
$$divU_5
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
sh1add %r26,%r26,%r29 ; r29 = lo(11 x r)
|
|
shd %r0,%r26,31,%r1 ; r1 = hi(10 x r)
|
|
addc %r1,%r0,%r1 ; r1 = hi(11 x r)
|
|
; r in r1,,r29
|
|
zdep %r29,27,28,%r25 ; r25 = lo(10000 x r)
|
|
add %r25,%r29,%r25 ; r25 = lo(10001 x r)
|
|
shd %r1,%r29,28,%r29 ; r29 = hi(10000 x r)
|
|
addc %r29,%r1,%r29 ; r29 = hi(10001 x r)
|
|
; r in r29,,r25
|
|
zdep %r25,23,24,%r1 ; r1 = lo(100000000 x r)
|
|
add %r1,%r25,%r1 ; r1 = lo(100000001 x r)
|
|
shd %r29,%r25,24,%r25 ; r25 = hi(100000000 x r)
|
|
addc %r25,%r29,%r25 ; r25 = hi(100000001 x r)
|
|
; r in r25,,r1
|
|
zdep %r1,15,16,%r29
|
|
add %r29,%r1,%r29
|
|
shd %r25,%r1,16,%r1
|
|
addc %r1,%r25,%r1
|
|
; r in r1,,r29
|
|
sh2add %r29,%r26,%r0 ; r0 = lo(1000 x r) + dividend
|
|
shd %r1,%r29,30,%r29 ; r29 = hi(1000 x r)
|
|
addc %r29,%r0,%r29
|
|
bv 0(ret)
|
|
extru %r29,29,30,result
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#if defined (L_divU_6) && !defined (SMALL_LIB)
|
|
#undef L_divU_6
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define result %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_6
|
|
$$divU_6
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
sh2add %r26,%r26,%r29 ; r29 = lo(101 x r)
|
|
shd %r0,%r26,30,%r1 ; r1 = hi(100 x r)
|
|
addc %r1,%r0,%r1 ; r1 = hi(101 x r)
|
|
; r in r1,,r29
|
|
zdep %r29,27,28,%r25 ; r25 = lo(10000 x r)
|
|
add %r25,%r29,%r25 ; r25 = lo(10001 x r)
|
|
shd %r1,%r29,28,%r29 ; r29 = hi(10000 x r)
|
|
addc %r29,%r1,%r29 ; r29 = hi(10001 x r)
|
|
; r in r29,,r25
|
|
zdep %r25,23,24,%r1 ; r1 = lo(100000000 x r)
|
|
add %r1,%r25,%r1 ; r1 = lo(100000001 x r)
|
|
shd %r29,%r25,24,%r25 ; r25 = hi(100000000 x r)
|
|
addc %r25,%r29,%r25 ; r25 = hi(100000001 x r)
|
|
; r in r25,,r1
|
|
zdep %r1,15,16,%r29
|
|
add %r29,%r1,%r29
|
|
shd %r25,%r1,16,%r1
|
|
addc %r1,%r25,%r1
|
|
; r in r1,,r29
|
|
sh1add %r29,%r26,%r0 ; r0 = lo(10 x r) + dividend
|
|
shd %r1,%r29,31,%r29 ; r29 = hi(10 x r)
|
|
addc %r29,%r0,%r29
|
|
bv 0(ret)
|
|
extru %r29,29,30,result
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#if defined (L_divU_9) && !defined (SMALL_LIB)
|
|
#undef L_divU_9
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define result %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_9
|
|
$$divU_9
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
zdep %r26,28,29,%r29
|
|
sub %r29,%r26,%r29
|
|
shd 0,%r26,29,%r1
|
|
subb %r1,0,%r1 /* 111 */
|
|
|
|
zdep %r29,25,26,%r25
|
|
add %r25,%r29,%r25
|
|
shd %r1,%r29,26,%r29
|
|
addc %r29,%r1,%r29 /* 111000111 */
|
|
|
|
sh3add %r25,%r26,%r1
|
|
shd %r29,%r25,29,%r25
|
|
addc %r25,0,%r25 /* 111000111001 */
|
|
|
|
zdep %r1,16,17,%r29
|
|
sub %r29,%r1,%r29
|
|
shd %r25,%r1,17,%r1
|
|
subb %r1,%r25,%r1 /* 111000111000111000111000111 */
|
|
|
|
sh3add %r29,%r26,%r0
|
|
shd %r1,%r29,29,%r29
|
|
addc %r29,0,%r29 /* 111000111000111000111000111001 */
|
|
bv 0(ret)
|
|
extru %r29,30,31,result
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#if defined (L_divU_10) && !defined (SMALL_LIB)
|
|
#undef L_divU_10
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define result %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_10
|
|
$$divU_10
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
sh1add %r26,%r26,%r29 ; r29 = lo(11 x r)
|
|
shd %r0,%r26,31,%r1 ; r1 = hi(10 x r)
|
|
addc %r1,%r0,%r1 ; r1 = hi(11 x r)
|
|
; r in r1,,r29
|
|
zdep %r29,27,28,%r25 ; r25 = lo(10000 x r)
|
|
add %r25,%r29,%r25 ; r25 = lo(10001 x r)
|
|
shd %r1,%r29,28,%r29 ; r29 = hi(10000 x r)
|
|
addc %r29,%r1,%r29 ; r29 = hi(10001 x r)
|
|
; r in r29,,r25
|
|
zdep %r25,23,24,%r1 ; r1 = lo(100000000 x r)
|
|
add %r1,%r25,%r1 ; r1 = lo(100000001 x r)
|
|
shd %r29,%r25,24,%r25 ; r25 = hi(100000000 x r)
|
|
addc %r25,%r29,%r25 ; r25 = hi(100000001 x r)
|
|
; r in r25,,r1
|
|
zdep %r1,15,16,%r29
|
|
add %r29,%r1,%r29
|
|
shd %r25,%r1,16,%r1
|
|
addc %r1,%r25,%r1
|
|
; r in r1,,r29
|
|
sh2add %r29,%r26,%r0 ; r0 = lo(1000 x r) + dividend
|
|
shd %r1,%r29,30,%r29 ; r29 = hi(1000 x r)
|
|
addc %r29,%r0,%r29
|
|
bv 0(ret)
|
|
extru %r29,28,29,result
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#if defined (L_divU_12) && !defined (SMALL_LIB)
|
|
#undef L_divU_12
|
|
#define dividend %r26
|
|
#define divisor %r25
|
|
#define tmp %r1
|
|
#define result %r29
|
|
#define ret %r31
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_12
|
|
$$divU_12
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
sh2add %r26,%r26,%r29 ; r29 = lo(101 x r)
|
|
shd %r0,%r26,30,%r1 ; r1 = hi(100 x r)
|
|
addc %r1,%r0,%r1 ; r1 = hi(101 x r)
|
|
; r in r1,,r29
|
|
zdep %r29,27,28,%r25 ; r25 = lo(10000 x r)
|
|
add %r25,%r29,%r25 ; r25 = lo(10001 x r)
|
|
shd %r1,%r29,28,%r29 ; r29 = hi(10000 x r)
|
|
addc %r29,%r1,%r29 ; r29 = hi(10001 x r)
|
|
; r in r29,,r25
|
|
zdep %r25,23,24,%r1 ; r1 = lo(100000000 x r)
|
|
add %r1,%r25,%r1 ; r1 = lo(100000001 x r)
|
|
shd %r29,%r25,24,%r25 ; r25 = hi(100000000 x r)
|
|
addc %r25,%r29,%r25 ; r25 = hi(100000001 x r)
|
|
; r in r25,,r1
|
|
zdep %r1,15,16,%r29
|
|
add %r29,%r1,%r29
|
|
shd %r25,%r1,16,%r1
|
|
addc %r1,%r25,%r1
|
|
; r in r1,,r29
|
|
sh1add %r29,%r26,%r0 ; r0 = lo(10 x r) + dividend
|
|
shd %r1,%r29,31,%r29 ; r29 = hi(10 x r)
|
|
addc %r29,%r0,%r29
|
|
bv 0(ret)
|
|
extru %r29,28,29,result
|
|
.exit
|
|
.procend
|
|
#endif
|
|
|
|
|
|
#ifdef L_divU_3
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_3
|
|
$$divU_3
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 3,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_5
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_5
|
|
$$divU_5
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 5,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_6
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_6
|
|
$$divU_6
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 6,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_7
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_7
|
|
$$divU_7
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 7,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_9
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_9
|
|
$$divU_9
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 9,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_10
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_10
|
|
$$divU_10
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 10,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_12
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_12
|
|
$$divU_12
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 12,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_14
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_14
|
|
$$divU_14
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 14,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divU_15
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divU_15
|
|
$$divU_15
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divU
|
|
ldi 15,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divU,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_3
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_3
|
|
$$divI_3
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 3,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_5
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_5
|
|
$$divI_5
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 5,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_6
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_6
|
|
$$divI_6
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 6,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_7
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_7
|
|
$$divI_7
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 7,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_9
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_9
|
|
$$divI_9
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 9,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_10
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_10
|
|
$$divI_10
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 10,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_12
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_12
|
|
$$divI_12
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 12,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_14
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_14
|
|
$$divI_14
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 14,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|
|
|
|
#ifdef L_divI_15
|
|
.space $TEXT$
|
|
.subspa $MILLICODE$,quad=0,align=8,access=0x2c,sort=8
|
|
.align 4
|
|
.export $$divI_15
|
|
$$divI_15
|
|
.proc
|
|
.callinfo frame=0,no_calls
|
|
.entry
|
|
b $$divI
|
|
ldi 15,%r25
|
|
.exit
|
|
.procend
|
|
.import $$divI,MILLICODE
|
|
#endif
|