diff --git a/gcc/config/pa/lib1funcs.asm b/gcc/config/pa/lib1funcs.asm new file mode 100644 index 00000000000..a3e4995f929 --- /dev/null +++ b/gcc/config/pa/lib1funcs.asm @@ -0,0 +1,1138 @@ +; 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. + +; 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 diff --git a/gcc/config/pa/pa-pro.h b/gcc/config/pa/pa-pro.h new file mode 100644 index 00000000000..e618cbf5881 --- /dev/null +++ b/gcc/config/pa/pa-pro.h @@ -0,0 +1,105 @@ +/* Definitions of target machine for GNU compiler, for PRO. + Copyright (C) 1994, 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. + +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, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef TARGET_DEFAULT +/* JUMP_IN_DELAY + PORTABLE_RUNTIME + GAS + NO_SPAEC_REGS */ +#define TARGET_DEFAULT (4 + 8 + 64 + 128) +#endif + +/* Global constructor and destructor support. */ +/* Define the pseudo-ops used to switch to the .ctors and .dtors sections. + + Note that we want to give these sections the SHF_WRITE attribute + because these sections will actually contain data (i.e. tables of + addresses of functions in the current root executable or shared library + file) and, in the case of a shared library, the relocatable addresses + will have to be properly resolved/relocated (and then written into) by + the dynamic linker when it actually attaches the given shared library + to the executing process. */ + +#define CTORS_SECTION_ASM_OP "\t.section\t\".ctors\",#alloc,#write" +#define DTORS_SECTION_ASM_OP "\t.section\t\".dtors\",#alloc,#write" + +#define CTORS_SECTION_FUNCTION \ +void \ +ctors_section () \ +{ \ + if (in_section != in_ctors) \ + { \ + fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \ + in_section = in_ctors; \ + } \ +} + +#define DTORS_SECTION_FUNCTION \ +void \ +dtors_section () \ +{ \ + if (in_section != in_dtors) \ + { \ + fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \ + in_section = in_dtors; \ + } \ +} + + +/* A C statement (sans semicolon) to output an element in the table of + global destructors. */ +#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ + do { \ + dtors_section (); \ + fprintf (FILE, "\t.word\t "); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, "\n"); \ + } while (0) + +/* A C statement (sans semicolon) to output an element in the table of + global constructors. */ +#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ + do { \ + ctors_section (); \ + fprintf (FILE, "\t.word\t "); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, "\n"); \ + } while (0) + +#include "pa/pa.h" + +/* Make GCC agree with types.h. */ +#undef SIZE_TYPE +#undef PTRDIFF_TYPE + +#define SIZE_TYPE "unsigned int" +#define PTRDIFF_TYPE "int" + +/* Like the default, except no -lg. */ +#undef LIB_SPEC +#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p: -L/lib/libp/ -lc}%{pg: -L/lib/libp/ -lc}" + +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "-Dhppa -DPWB -Acpu(hppa) -Amachine(hppa)" + +/* hpux8 and later have C++ compatable include files, so do not + pretend they are `extern "C"'. */ +#define NO_IMPLICIT_EXTERN_C + +/* We don't want a crt0.o to get linked in automatically, we want the + linker script to pull it in. + */ +#define STARTFILE_SPEC "" diff --git a/gcc/config/pa/t-pro b/gcc/config/pa/t-pro new file mode 100644 index 00000000000..5541e4b3611 --- /dev/null +++ b/gcc/config/pa/t-pro @@ -0,0 +1,30 @@ +LIBGCC1=libgcc1.null +CROSS_LIBGCC1 = libgcc1.null +LIB1ASMSRC = +LIB1ASMFUNCS = + +LIBGCC1_TEST = + +ADA_CFLAGS=-mdisable-indexing + +LIB2FUNCS_EXTRA=fp-bit.c dp-bit.c lib2funcs.asm + +dp-bit.c: $(srcdir)/config/fp-bit.c + cat $(srcdir)/config/fp-bit.c >> dp-bit.c + +fp-bit.c: $(srcdir)/config/fp-bit.c + echo '#define FLOAT' > fp-bit.c + cat $(srcdir)/config/fp-bit.c >> fp-bit.c + +lib2funcs.asm: $(srcdir)/config/pa/lib2funcs.asm + rm -f lib2funcs.asm + cp $(srcdir)/config/pa/lib2funcs.asm . + +# Build the libraries for both hard and soft floating point + +MULTILIB_OPTIONS=msoft-float +MULTILIB_DIRNAMES=soft-float +MULTILIB_MATCHES= + +LIBGCC = stmp-multilib +INSTALL_LIBGCC = install-multilib diff --git a/gcc/config/pa/xm-papro.h b/gcc/config/pa/xm-papro.h new file mode 100644 index 00000000000..66ec811b4ac --- /dev/null +++ b/gcc/config/pa/xm-papro.h @@ -0,0 +1,61 @@ +/* Configuration for GNU C-compiler for PA-RISC. + Copyright (C) 1994, 1995 Free Software Foundation, Inc. + Contributed by Michael Tiemann (tiemann@cygnus.com). + +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. + +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. */ + +extern int errno; + +/* #defines that need visibility everywhere. */ +#define FALSE 0 +#define TRUE 1 + +/* This describes the machine the compiler is hosted on. */ +#define HOST_BITS_PER_CHAR 8 +#define HOST_BITS_PER_SHORT 16 +#define HOST_BITS_PER_INT 32 +#define HOST_BITS_PER_LONG 32 +#define HOST_BITS_PER_LONGLONG 64 + +/* Doubles are stored in memory with the high order word first. This + matters when cross-compiling. */ +#define HOST_WORDS_BIG_ENDIAN 1 + +/* Place any machine-dependent include files here, in case we + are bootstrapping. */ + +/* target machine dependencies. + tm.h is a symbolic link to the actual target specific file. */ +#include "tm.h" + +/* Arguments to use with `exit'. */ +#define SUCCESS_EXIT_CODE 0 +#define FATAL_EXIT_CODE 33 + +/* Don't try to use sys_siglist. */ +#define NO_SYS_SIGLIST + +/* We have strerror, don't try to use sys_errlist. */ +#define HAVE_STRERROR + +/* HP's compiler has problems with enum bitfields. */ +#define ONLY_INT_FIELDS + +/* Always claim to use C alloca; this prevents losing if building with + gcc -fno-builtin ... */ +#define USE_C_ALLOCA