Initial revision
authorJeff Law <law@gcc.gnu.org>
Thu, 7 Mar 1996 17:34:53 +0000 (10:34 -0700)
committerJeff Law <law@gcc.gnu.org>
Thu, 7 Mar 1996 17:34:53 +0000 (10:34 -0700)
From-SVN: r11490

gcc/config/pa/ee.asm [new file with mode: 0644]
gcc/config/pa/ee_fp.asm [new file with mode: 0644]

diff --git a/gcc/config/pa/ee.asm b/gcc/config/pa/ee.asm
new file mode 100644 (file)
index 0000000..787bda7
--- /dev/null
@@ -0,0 +1,261 @@
+;  Subroutines for out of line prologues and epilogues on for the HPPA
+;  Copyright (C) 1994, 1995, 1996 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.
+
+       .SPACE $PRIVATE$
+       .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
+       .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
+       .SPACE $TEXT$
+       .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
+       .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
+       .SUBSPA $MILLICODE$,QUAD=0,ALIGN=8,ACCESS=44,SORT=8
+
+; This is an out-of-line prologue.
+;
+; It performs the following operations:
+;
+;      * Saves the return pointer at sp - 20
+;
+;      * Creates a new stack frame (sp'), size of the frame is passed in %r21
+;
+;      * The old stack pointer is saved at sp (frame pointer version only).
+;
+;      * Saves grs (passed in low 16 bits of %r22 into the stack frame
+;      at sp' + local_fsize (passed in %r19).
+;
+;      * Saves frs (passed in high 16 bits of %r22) into the stack
+;      frame at sp' + local_fsize (passed in %r19).
+;
+;      * Sets up a frame pointer (in %r3) (frame pointer version only).
+;
+;      * Returns to the instruction _immediately_ after the call to
+;      this function.
+
+       .SPACE $TEXT$
+       .SUBSPA $MILLICODE$
+       .EXPORT __outline_prologue,MILLICODE
+       .align 32
+__outline_prologue
+       .PROC
+       .CALLINFO FRAME=0,NO_CALLS
+       .ENTRY
+       copy %r30,%r20
+
+       ; Subtract 4 from our return pointer so that we return to
+       ; the right location.
+        ldo -4(%r31),%r31
+
+       ; Save off %r2
+       stw %r2,-20(0,%r30)
+
+       ; Make our new frame.
+       add %r21,%r30,%r30
+
+       ; Add in local_fsize to our frame pointer so we do register
+       ; saves into the right place
+       add %r20,%r19,%r20
+
+       ; %r22 tells us what registers we need to save.  The upper half
+       ; is for fp registers, the lower half for integer registers.
+       ; We put the lower half in %r1 and the upper half into %r22
+       ; for later use.
+       extru %r22,31,16,%r1
+       extrs %r22,15,16,%r22
+
+       ; %r1 now olds a value 0-18 which corresponds to the number
+       ; of grs we need to save.  We need to reverse that value so
+       ; we can just into the table and straight-line execute to the
+       ; end of the gr saves.
+       comb,= %r0,%r1,L$0000
+       subi 18,%r1,%r1
+       blr,n %r1,%r0
+       b,n L$0000
+       stws,ma %r18,4(0,%r20)
+       nop
+       stws,ma %r17,4(0,%r20)
+       nop
+       stws,ma %r16,4(0,%r20)
+       nop
+       stws,ma %r15,4(0,%r20)
+       nop
+       stws,ma %r14,4(0,%r20)
+       nop
+       stws,ma %r13,4(0,%r20)
+       nop
+       stws,ma %r12,4(0,%r20)
+       nop
+       stws,ma %r11,4(0,%r20)
+       nop
+       stws,ma %r10,4(0,%r20)
+       nop
+       stws,ma %r9,4(0,%r20)
+       nop
+       stws,ma %r8,4(0,%r20)
+       nop
+       stws,ma %r7,4(0,%r20)
+       nop
+       stws,ma %r6,4(0,%r20)
+       nop
+       stws,ma %r5,4(0,%r20)
+       nop
+       stws,ma %r4,4(0,%r20)
+       nop
+       stws,ma %r3,4(0,%r20)
+       nop
+L$0000
+       ; All gr saves are done.  Align the temporary frame pointer and
+       ; do the fr saves.
+       ldo 7(%r20),%r20
+       depi 0,31,3,%r20
+
+       comb,= %r0,%r22,L$0001
+       subi 21,%r22,%r22
+       blr,n %r22,%r0
+       b,n L$0001
+       fstws,ma %fr21,8(0,%r20)
+       nop
+       fstws,ma %fr20,8(0,%r20)
+       nop
+       fstws,ma %fr19,8(0,%r20)
+       nop
+       fstws,ma %fr18,8(0,%r20)
+       nop
+       fstws,ma %fr17,8(0,%r20)
+       nop
+       fstws,ma %fr16,8(0,%r20)
+       nop
+       fstws,ma %fr15,8(0,%r20)
+       nop
+       fstws,ma %fr14,8(0,%r20)
+       nop
+       fstws,ma %fr13,8(0,%r20)
+       nop
+       fstws,ma %fr12,8(0,%r20)
+       nop
+L$0001
+       ; Return
+       bv,n 0(%r31)
+       .EXIT
+       .PROCEND
+
+
+
+       .EXPORT __outline_epilogue,MILLICODE
+       .align 32
+__outline_epilogue
+       .PROC
+       .CALLINFO FRAME=0,NO_CALLS
+       .ENTRY
+       ; Get our original stack pointer and put it in %r20
+       sub %r30,%r21,%r20
+
+       ; Subtract 4 from our return pointer so that we return to
+       ; the right location.
+        ldo -4(%r31),%r31
+
+       ; Reload %r2
+       ldw -20(0,%r20),%r2
+
+       ; Add in local_fsize (%r19) to the frame pointer to find
+       ; the saved registers.
+       add %r20,%r19,%r20
+
+       ; %r22 tells us what registers we need to restore.  The upper half
+       ; is for fp registers, the lower half for integer registers.
+       ; We put the lower half in %r1 and the upper half into %r22
+       ; for later use.
+       extru %r22,31,16,%r1
+       extrs %r22,15,16,%r22
+
+       ; %r1 now olds a value 0-18 which corresponds to the number
+       ; of grs we need to restore.  We need to reverse that value so
+       ; we can just into the table and straight-line execute to the
+       ; end of the gr restore.
+       comb,= %r0,%r1,L$0004
+       subi 18,%r1,%r1
+       blr,n %r1,%r0
+       b,n L$0004
+       ldws,ma 4(0,%r20),%r18
+       nop
+       ldws,ma 4(0,%r20),%r17
+       nop
+       ldws,ma 4(0,%r20),%r16
+       nop
+       ldws,ma 4(0,%r20),%r15
+       nop
+       ldws,ma 4(0,%r20),%r14
+       nop
+       ldws,ma 4(0,%r20),%r13
+       nop
+       ldws,ma 4(0,%r20),%r12
+       nop
+       ldws,ma 4(0,%r20),%r11
+       nop
+       ldws,ma 4(0,%r20),%r10
+       nop
+       ldws,ma 4(0,%r20),%r9
+       nop
+       ldws,ma 4(0,%r20),%r8
+       nop
+       ldws,ma 4(0,%r20),%r7
+       nop
+       ldws,ma 4(0,%r20),%r6
+       nop
+       ldws,ma 4(0,%r20),%r5
+       nop
+       ldws,ma 4(0,%r20),%r4
+       nop
+       ldws,ma 4(0,%r20),%r3
+       nop
+L$0004
+       ; All gr restore are done.  Align the temporary frame pointer and
+       ; do the fr restore.
+       ldo 7(%r20),%r20
+       depi 0,31,3,%r20
+
+       comb,= %r0,%r22,L$0005
+       subi 21,%r22,%r22
+       blr,n %r22,%r0
+       b,n L$0005
+       fldws,ma 8(0,%r20),%fr21
+       nop
+       fldws,ma 8(0,%r20),%fr20
+       nop
+       fldws,ma 8(0,%r20),%fr19
+       nop
+       fldws,ma 8(0,%r20),%fr18
+       nop
+       fldws,ma 8(0,%r20),%fr17
+       nop
+       fldws,ma 8(0,%r20),%fr16
+       nop
+       fldws,ma 8(0,%r20),%fr15
+       nop
+       fldws,ma 8(0,%r20),%fr14
+       nop
+       fldws,ma 8(0,%r20),%fr13
+       nop
+       fldws,ma 8(0,%r20),%fr12
+       nop
+L$0005
+       ; Return and deallocate our frame.
+       bv 0(%r31)
+       sub %r30,%r21,%r30
+       .EXIT
+       .PROCEND
diff --git a/gcc/config/pa/ee_fp.asm b/gcc/config/pa/ee_fp.asm
new file mode 100644 (file)
index 0000000..ef040cf
--- /dev/null
@@ -0,0 +1,274 @@
+;  Subroutines for out of line prologues and epilogues on for the HPPA
+;  Copyright (C) 1994, 1995, 1996 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.
+
+       .SPACE $PRIVATE$
+       .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
+       .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
+       .SPACE $TEXT$
+       .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
+       .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
+       .SUBSPA $MILLICODE$,QUAD=0,ALIGN=8,ACCESS=44,SORT=8
+
+
+; This is an out-of-line prologue.
+;
+; It performs the following operations:
+;
+;      * Saves the return pointer at sp - 20
+;
+;      * Creates a new stack frame (sp'), size of the frame is passed in %r21
+;
+;      * The old stack pointer is saved at sp (frame pointer version only).
+;
+;      * Saves grs (passed in low 16 bits of %r22 into the stack frame
+;      at sp' + local_fsize (passed in %r19).
+;
+;      * Saves frs (passed in high 16 bits of %r22) into the stack
+;      frame at sp' + local_fsize (passed in %r19).
+;
+;      * Sets up a frame pointer (in %r3) (frame pointer version only).
+;
+;      * Returns to the instruction _immediately_ after the call to
+;      this function.
+
+       .SPACE $TEXT$
+       .SUBSPA $MILLICODE$
+       .EXPORT __outline_prologue_fp,MILLICODE
+       .align 32
+__outline_prologue_fp
+       .PROC
+       .CALLINFO FRAME=0,NO_CALLS
+       .ENTRY
+       copy %r30,%r20
+
+       ; Subtract 4 from our return pointer so that we return to
+       ; the right location.
+        ldo -4(%r31),%r31
+
+       ; Save off %r2
+       stw %r2,-20(0,%r30)
+
+       ; Make our new frame.
+       add %r21,%r30,%r30
+
+       ; Save our old stack pointer.
+       stw %r20,0(0,%r20)
+
+       ; Add in local_fsize to our frame pointer so we do register
+       ; saves into the right place
+       add %r20,%r19,%r20
+
+       ; %r22 tells us what registers we need to save.  The upper half
+       ; is for fp registers, the lower half for integer registers.
+       ; We put the lower half in %r1 and the upper half into %r22
+       ; for later use.
+       extru %r22,31,16,%r1
+       extrs %r22,15,16,%r22
+
+       ; %r1 now olds a value 0-18 which corresponds to the number
+       ; of grs we need to save.  We need to reverse that value so
+       ; we can just into the table and straight-line execute to the
+       ; end of the gr saves.
+       comb,= %r0,%r1,L$0002
+       subi 18,%r1,%r1
+       blr,n %r1,%r0
+       b,n L$0002
+       stws,ma %r18,4(0,%r20)
+       nop
+       stws,ma %r17,4(0,%r20)
+       nop
+       stws,ma %r16,4(0,%r20)
+       nop
+       stws,ma %r15,4(0,%r20)
+       nop
+       stws,ma %r14,4(0,%r20)
+       nop
+       stws,ma %r13,4(0,%r20)
+       nop
+       stws,ma %r12,4(0,%r20)
+       nop
+       stws,ma %r11,4(0,%r20)
+       nop
+       stws,ma %r10,4(0,%r20)
+       nop
+       stws,ma %r9,4(0,%r20)
+       nop
+       stws,ma %r8,4(0,%r20)
+       nop
+       stws,ma %r7,4(0,%r20)
+       nop
+       stws,ma %r6,4(0,%r20)
+       nop
+       stws,ma %r5,4(0,%r20)
+       nop
+       stws,ma %r4,4(0,%r20)
+       nop
+       stws,ma %r3,4(0,%r20)
+       nop
+L$0002
+       ; All gr saves are done.  Align the temporary frame pointer and
+       ; do the fr saves.
+       ldo 7(%r20),%r20
+       depi 0,31,3,%r20
+
+       comb,= %r0,%r22,L$0003
+       subi 21,%r22,%r22
+       blr,n %r22,%r0
+       b,n L$0003
+       fstws,ma %fr21,8(0,%r20)
+       nop
+       fstws,ma %fr20,8(0,%r20)
+       nop
+       fstws,ma %fr19,8(0,%r20)
+       nop
+       fstws,ma %fr18,8(0,%r20)
+       nop
+       fstws,ma %fr17,8(0,%r20)
+       nop
+       fstws,ma %fr16,8(0,%r20)
+       nop
+       fstws,ma %fr15,8(0,%r20)
+       nop
+       fstws,ma %fr14,8(0,%r20)
+       nop
+       fstws,ma %fr13,8(0,%r20)
+       nop
+       fstws,ma %fr12,8(0,%r20)
+       nop
+L$0003
+       ; Return, setting up a frame pointer in the delay slot
+       bv 0(%r31)
+       sub %r30,%r21,%r3
+       .EXIT
+       .PROCEND
+
+
+; This is an out-of-line epilogue.  It's operation is basically the reverse
+; of the out-of-line prologue.
+
+       .EXPORT __outline_epilogue_fp,MILLICODE
+       .align 32
+__outline_epilogue_fp
+       .PROC
+       .CALLINFO FRAME=0,NO_CALLS
+       .ENTRY
+       ; Make a copy of our frame pointer into %r20
+       copy %r3,%r20
+
+       ; Subtract 4 from our return pointer so that we return to
+       ; the right location.
+        ldo -4(%r31),%r31
+
+       ; Reload %r2
+       ; First save off %r2
+       ldw -20(0,%r20),%r2
+
+       ; Load our old stack pointer, save it in %r21.
+       ldw 0(0,%r20),%r21
+
+       ; Add in local_fsize (%r19) to the frame pointer to find
+       ; the saved registers.
+       add %r20,%r19,%r20
+
+       ; %r22 tells us what registers we need to restore.  The upper half
+       ; is for fp registers, the lower half for integer registers.
+       ; We put the lower half in %r1 and the upper half into %r22
+       ; for later use.
+       extru %r22,31,16,%r1
+       extrs %r22,15,16,%r22
+
+       ; %r1 now olds a value 0-18 which corresponds to the number
+       ; of grs we need to restore.  We need to reverse that value so
+       ; we can just into the table and straight-line execute to the
+       ; end of the gr restore.
+       comb,= %r0,%r1,L$0006
+       subi 18,%r1,%r1
+       blr,n %r1,%r0
+       b,n L$0006
+       ldws,ma 4(0,%r20),%r18
+       nop
+       ldws,ma 4(0,%r20),%r17
+       nop
+       ldws,ma 4(0,%r20),%r16
+       nop
+       ldws,ma 4(0,%r20),%r15
+       nop
+       ldws,ma 4(0,%r20),%r14
+       nop
+       ldws,ma 4(0,%r20),%r13
+       nop
+       ldws,ma 4(0,%r20),%r12
+       nop
+       ldws,ma 4(0,%r20),%r11
+       nop
+       ldws,ma 4(0,%r20),%r10
+       nop
+       ldws,ma 4(0,%r20),%r9
+       nop
+       ldws,ma 4(0,%r20),%r8
+       nop
+       ldws,ma 4(0,%r20),%r7
+       nop
+       ldws,ma 4(0,%r20),%r6
+       nop
+       ldws,ma 4(0,%r20),%r5
+       nop
+       ldws,ma 4(0,%r20),%r4
+       nop
+       ldws,ma 4(0,%r20),%r3
+       nop
+L$0006
+       ; All gr restore are done.  Align the temporary frame pointer and
+       ; do the fr restore.
+       ldo 7(%r20),%r20
+       depi 0,31,3,%r20
+
+       comb,= %r0,%r22,L$0007
+       subi 21,%r22,%r22
+       blr,n %r22,%r0
+       b,n L$0007
+       fldws,ma 8(0,%r20),%fr21
+       nop
+       fldws,ma 8(0,%r20),%fr20
+       nop
+       fldws,ma 8(0,%r20),%fr19
+       nop
+       fldws,ma 8(0,%r20),%fr18
+       nop
+       fldws,ma 8(0,%r20),%fr17
+       nop
+       fldws,ma 8(0,%r20),%fr16
+       nop
+       fldws,ma 8(0,%r20),%fr15
+       nop
+       fldws,ma 8(0,%r20),%fr14
+       nop
+       fldws,ma 8(0,%r20),%fr13
+       nop
+       fldws,ma 8(0,%r20),%fr12
+       nop
+L$0007
+       ; Return and deallocate our frame.
+       bv 0(%r31)
+       copy %r21,%r30
+       .EXIT
+       .PROCEND
+
+