/* Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
   02110-1301 USA.  */

/*
    Floating Point Registers (FPRs) save routine
*/

#include <sysdep.h>

ENTRY(_savefpr_all)
                ASM_GLOBAL_DIRECTIVE C_TEXT(_savef14)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_14)
C_TEXT(_savef14):
C_TEXT(_savefpr_14):	stfd	fp14,-144(r1)
			cfi_offset(fp14,-144)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef15)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_15)
C_TEXT(_savef15):
C_TEXT(_savefpr_15):	stfd	fp15,-136(r1)
			cfi_offset(fp15,-136)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef16)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_16)
C_TEXT(_savef16):
C_TEXT(_savefpr_16):	stfd	fp16,-128(r1)
			cfi_offset(fp16,-128)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef17)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_17)
C_TEXT(_savef17):
C_TEXT(_savefpr_17):	stfd	fp17,-120(r1)
			cfi_offset(fp17,-120)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef18)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_18)
C_TEXT(_savef18):
C_TEXT(_savefpr_18):	stfd	fp18,-112(r1)
			cfi_offset(fp18,-112)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef19)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_19)
C_TEXT(_savef19):
C_TEXT(_savefpr_19):	stfd	fp19,-104(r1)
			cfi_offset(fp19,-104)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef20)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_20)
C_TEXT(_savef20):
C_TEXT(_savefpr_20):	stfd	fp20,-96(r1)
			cfi_offset(fp20,-96)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef21)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_21)
C_TEXT(_savef21):
C_TEXT(_savefpr_21):	stfd	fp21,-88(r1)
			cfi_offset(fp21,-88)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef22)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_22)
C_TEXT(_savef22):
C_TEXT(_savefpr_22):	stfd	fp22,-80(r1)
			cfi_offset(fp22,-80)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef23)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_23)
C_TEXT(_savef23):
C_TEXT(_savefpr_23):	stfd	fp23,-72(r1)
			cfi_offset(fp23,-72)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef24)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_24)
C_TEXT(_savef24):
C_TEXT(_savefpr_24):	stfd	fp24,-64(r1)
			cfi_offset(fp24,-64)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef25)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_25)
C_TEXT(_savef25):
C_TEXT(_savefpr_25):	stfd	fp25,-56(r1)
			cfi_offset(fp25,-56)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef26)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_26)
C_TEXT(_savef26):
C_TEXT(_savefpr_26):	stfd	fp26,-48(r1)
			cfi_offset(fp26,-48)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef27)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_27)
C_TEXT(_savef27):
C_TEXT(_savefpr_27):	stfd	fp27,-40(r1)
			cfi_offset(fp27,-40)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef28)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_28)
C_TEXT(_savef28):
C_TEXT(_savefpr_28):	stfd	fp28,-32(r1)
			cfi_offset(fp28,-32)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef29)
		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_29)
C_TEXT(_savef29):
C_TEXT(_savefpr_29):	stfd	fp29,-24(r1)	#save f29
			stfd	fp30,-16(r1)	#save f30
			stfd	fp31,-8(r1)	#save f31
			cfi_offset(fp29,-24)
			cfi_offset(fp30,-16)
			cfi_offset(fp31,-8)
			stw	r0,8(r1)	#save LR in callers frame
			blr			#return
END (_savefpr_all)
