* pa/quadlib.asm: New file for long double support.
authorMark Klein <mklein@dis.com>
Tue, 7 Sep 1999 10:23:53 +0000 (10:23 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 7 Sep 1999 10:23:53 +0000 (04:23 -0600)
From-SVN: r29165

gcc/ChangeLog
gcc/config/pa/quadlib.asm [new file with mode: 0644]

index caec40650634112a1b5dfdf7d1c7c0075c0fb54a..b65595a3423d0352b5220c42bad381d1a4af0db4 100644 (file)
@@ -1,5 +1,7 @@
 Tue Sep  7 03:42:45 1999  Mark Klein (mklein@dis.com)
 
+       * pa/quadlib.asm: New file for long double support.
+
        * configure.in: Add hppa1.0-*-mpeix for MPE port.
        * configure: Rebuilt.
 
diff --git a/gcc/config/pa/quadlib.asm b/gcc/config/pa/quadlib.asm
new file mode 100644 (file)
index 0000000..11c0b10
--- /dev/null
@@ -0,0 +1,359 @@
+;  Subroutines for long double support on the HPPA
+;  Copyright (C) 1999 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.
+
+; 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.)
+
+;  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.
+
+       .SPACE $TEXT$
+       .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
+       .compiler "quadlib.asm GNU_PA-RISC_Assembler 2.9.4"
+       .IMPORT _U_Qfcmp,CODE
+       .IMPORT _U_Qfsub,CODE
+
+       .align 4
+       .NSUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
+       ;
+       ; Check two long doubles for equality
+       ;
+       .EXPORT _U_Qfeq,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qfeq
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Load the additional argument and call the comparison routine.
+       ;
+       bl _U_Qfcmp,%r2
+         ldi 4,%r24
+
+       ;
+       ; The return from _U_Qfcmp is the masked C bit from the FP
+       ; status register. Convert that to a 0 or 1.
+       ;
+       comiclr,= 0,%r28,%r28
+         ldi 1,%r28
+
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30), %r30
+
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Check two long doubles for inequality
+       ;
+       .EXPORT _U_Qfne,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qfne
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Load the additional argument and call the comparison routine.
+       ;
+       bl _U_Qfcmp,%r2
+       ldi 4,%r24
+       
+       ;
+       ; The return from _U_Qfcmp is the masked C bit from the FP
+       ; status register. Convert that to a 0 or 1.
+       ;
+       comiclr,<> 0,%r28,%r28
+         ldi 1,%r28
+
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30),%r30
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Check if opnd1 > opnd0                
+       ;
+       .EXPORT _U_Qfgt,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qfgt
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Load the additional argument and call the comparison routine.
+       ;
+       bl _U_Qfcmp,%r2
+       ldi 23,%r24
+
+       ;
+       ; The return from _U_Qfcmp is the masked C bit from the FP
+       ; status register. Convert that to a 0 or 1.
+       ;
+       comiclr,= 0,%r28,%r28
+         ldi 1,%r28
+
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30), %r30
+
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Check if opnd1 >= opnd0                
+       ;
+       .EXPORT _U_Qfge,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qfge
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Load the additional argument and call the comparison routine.
+       ;
+       bl _U_Qfcmp,%r2
+       ldi 23,%r24
+
+       ;
+       ; The return from _U_Qfcmp is the masked C bit from the FP
+       ; status register. Convert that to a 0 or 1.
+       ;
+       comiclr,= 0,%r28,%r28
+         ldi 1,%r28
+
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30), %r30
+
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Check if opnd1 < opnd0                
+       ;
+       .EXPORT _U_Qflt,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qflt
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Load the additional argument and call the comparison routine.
+       ;
+       bl _U_Qfcmp,%r2
+       ldi 9,%r24
+
+       ;
+       ; The return from _U_Qfcmp is the masked C bit from the FP
+       ; status register. Convert that to a 0 or 1.
+       ;
+       comiclr,= 0,%r28,%r28
+         ldi 1,%r28
+
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30), %r30
+
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Check if opnd1 <= opnd0                
+       ;
+       .EXPORT _U_Qfle,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qfle
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Load the additional argument and call the comparison routine.
+       ;
+       bl _U_Qfcmp,%r2
+       ldi 13,%r24
+
+       ;
+       ; The return from _U_Qfcmp is the masked C bit from the FP
+       ; status register. Convert that to a 0 or 1.
+       ;
+       comiclr,= 0,%r28,%r28
+         ldi 1,%r28
+
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30), %r30
+
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Negate opnd0 and store in ret0                 
+       ;
+       .EXPORT _U_Qfneg,ENTRY,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
+_U_Qfneg
+       .PROC
+       .CALLINFO FRAME=128,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 128(%r30),%r30
+
+       ;
+       ; copy the value to be negated to the frame.
+       ;
+       ldw 0(0,%r26), %r25
+       ldw 4(0,%r26), %r24
+       ldw 8(0,%r26), %r23
+       ldw 12(0,%r26),%r1
+       stw %r25, -100(0,%r30)
+       stw %r24,  -96(0,%r30)
+       stw %r23,  -92(0,%r30)
+       stw %r1,   -88(0,%r30)
+       ldo -100(%r30), %r25
+
+       ;
+       ; ret0 contains a pointer to the location for the return
+       ; value. Initialize it to zero and pass it as arg0 to
+       ; _U_Qfsub.
+       ;
+       copy %r28,%r26
+       stw %r0,0(0,%r26)
+       stw %r0,4(0,%r26)
+       stw %r0,8(0,%r26)
+       bl _U_Qfsub,%r2
+         stw %r0,12(0,%r26)
+
+       ;
+       ; Return
+       ;
+       ldw -148(0,%r30),%r2
+       bv 0(%r2)
+         ldo -128(%r30), %r30
+
+       .EXIT
+       .PROCEND
+
+       ;
+       ; Compare opnd0 and opnd1. If opnd0 == opnd1, return 0.
+       ; If opnd0 is greater than opnd1, return 1.
+       ; Otherwise, return -1.
+       ;
+       .EXPORT _U_Qfcomp,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR
+_U_Qfcomp
+       .PROC
+       .CALLINFO FRAME=64,CALLS,SAVE_RP
+       .ENTRY
+       ;
+       ; Build the frame
+       ;
+       stw %r2,-20(0,%r30)
+       ldo 64(%r30),%r30
+
+       ;
+       ; Save arg0 and arg1.
+       ;
+       stw %r26, -60(0,%r30)
+       stw %r25, -56(0,%r30)
+       ;
+       ; Check for equality
+       ;
+       bl _U_Qfcmp,%r2
+         ldi 4, %r24
+
+       comib,<> 0,%r28,done
+         copy %r0, %r1
+
+       ;
+       ; Reset the parms and test for opnd0 > opnd1.
+       ;
+       ldw -60(0,%r30),%r26
+       ldw -56(0,%r30),%r25
+       bl _U_Qfcmp,%r2
+         ldi 22,%r24
+
+       ldi 1,%r1
+       comiclr,<> 0,%r28,0
+         ldi -1,%r1
+
+done
+       copy %r1,%r28
+       ;
+       ; Return
+       ;
+       ldw -84(0,%r30),%r2
+       bv 0(%r2)
+         ldo -64(%r30), %r30
+
+       .EXIT
+       .PROCEND