162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Special support for eabi and SVR4
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *   Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
562306a36Sopenharmony_ci *   Copyright 2008 Freescale Semiconductor, Inc.
662306a36Sopenharmony_ci *   Written By Michael Meissner
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Based on gcc/config/rs6000/crtsavres.asm from gcc
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * This file is free software; you can redistribute it and/or modify it
1162306a36Sopenharmony_ci * under the terms of the GNU General Public License as published by the
1262306a36Sopenharmony_ci * Free Software Foundation; either version 2, or (at your option) any
1362306a36Sopenharmony_ci * later version.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * In addition to the permissions in the GNU General Public License, the
1662306a36Sopenharmony_ci * Free Software Foundation gives you unlimited permission to link the
1762306a36Sopenharmony_ci * compiled version of this file with other programs, and to distribute
1862306a36Sopenharmony_ci * those programs without any restriction coming from the use of this
1962306a36Sopenharmony_ci * file.  (The General Public License restrictions do apply in other
2062306a36Sopenharmony_ci * respects; for example, they cover modification of the file, and
2162306a36Sopenharmony_ci * distribution when not linked into another program.)
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * This file is distributed in the hope that it will be useful, but
2462306a36Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of
2562306a36Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2662306a36Sopenharmony_ci * General Public License for more details.
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * You should have received a copy of the GNU General Public License
2962306a36Sopenharmony_ci * along with this program; see the file COPYING.  If not, write to
3062306a36Sopenharmony_ci * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
3162306a36Sopenharmony_ci * Boston, MA 02110-1301, USA.
3262306a36Sopenharmony_ci *
3362306a36Sopenharmony_ci *    As a special exception, if you link this library with files
3462306a36Sopenharmony_ci *    compiled with GCC to produce an executable, this does not cause
3562306a36Sopenharmony_ci *    the resulting executable to be covered by the GNU General Public License.
3662306a36Sopenharmony_ci *    This exception does not however invalidate any other reasons why
3762306a36Sopenharmony_ci *    the executable file might be covered by the GNU General Public License.
3862306a36Sopenharmony_ci */
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#ifdef __powerpc64__
4162306a36Sopenharmony_ci#error "On PPC64, FPR save/restore functions are provided by the linker."
4262306a36Sopenharmony_ci#endif
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	.file	"crtsavres.S"
4562306a36Sopenharmony_ci	.section ".text"
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define _GLOBAL(name) \
4862306a36Sopenharmony_ci	.type name,@function; \
4962306a36Sopenharmony_ci	.globl name; \
5062306a36Sopenharmony_ciname:
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* Routines for saving integer registers, called by the compiler.  */
5362306a36Sopenharmony_ci/* Called with r11 pointing to the stack header word of the caller of the */
5462306a36Sopenharmony_ci/* function, just beyond the end of the integer save area.  */
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci_GLOBAL(_savegpr_14)
5762306a36Sopenharmony_ci_GLOBAL(_save32gpr_14)
5862306a36Sopenharmony_ci	stw	14,-72(11)	/* save gp registers */
5962306a36Sopenharmony_ci_GLOBAL(_savegpr_15)
6062306a36Sopenharmony_ci_GLOBAL(_save32gpr_15)
6162306a36Sopenharmony_ci	stw	15,-68(11)
6262306a36Sopenharmony_ci_GLOBAL(_savegpr_16)
6362306a36Sopenharmony_ci_GLOBAL(_save32gpr_16)
6462306a36Sopenharmony_ci	stw	16,-64(11)
6562306a36Sopenharmony_ci_GLOBAL(_savegpr_17)
6662306a36Sopenharmony_ci_GLOBAL(_save32gpr_17)
6762306a36Sopenharmony_ci	stw	17,-60(11)
6862306a36Sopenharmony_ci_GLOBAL(_savegpr_18)
6962306a36Sopenharmony_ci_GLOBAL(_save32gpr_18)
7062306a36Sopenharmony_ci	stw	18,-56(11)
7162306a36Sopenharmony_ci_GLOBAL(_savegpr_19)
7262306a36Sopenharmony_ci_GLOBAL(_save32gpr_19)
7362306a36Sopenharmony_ci	stw	19,-52(11)
7462306a36Sopenharmony_ci_GLOBAL(_savegpr_20)
7562306a36Sopenharmony_ci_GLOBAL(_save32gpr_20)
7662306a36Sopenharmony_ci	stw	20,-48(11)
7762306a36Sopenharmony_ci_GLOBAL(_savegpr_21)
7862306a36Sopenharmony_ci_GLOBAL(_save32gpr_21)
7962306a36Sopenharmony_ci	stw	21,-44(11)
8062306a36Sopenharmony_ci_GLOBAL(_savegpr_22)
8162306a36Sopenharmony_ci_GLOBAL(_save32gpr_22)
8262306a36Sopenharmony_ci	stw	22,-40(11)
8362306a36Sopenharmony_ci_GLOBAL(_savegpr_23)
8462306a36Sopenharmony_ci_GLOBAL(_save32gpr_23)
8562306a36Sopenharmony_ci	stw	23,-36(11)
8662306a36Sopenharmony_ci_GLOBAL(_savegpr_24)
8762306a36Sopenharmony_ci_GLOBAL(_save32gpr_24)
8862306a36Sopenharmony_ci	stw	24,-32(11)
8962306a36Sopenharmony_ci_GLOBAL(_savegpr_25)
9062306a36Sopenharmony_ci_GLOBAL(_save32gpr_25)
9162306a36Sopenharmony_ci	stw	25,-28(11)
9262306a36Sopenharmony_ci_GLOBAL(_savegpr_26)
9362306a36Sopenharmony_ci_GLOBAL(_save32gpr_26)
9462306a36Sopenharmony_ci	stw	26,-24(11)
9562306a36Sopenharmony_ci_GLOBAL(_savegpr_27)
9662306a36Sopenharmony_ci_GLOBAL(_save32gpr_27)
9762306a36Sopenharmony_ci	stw	27,-20(11)
9862306a36Sopenharmony_ci_GLOBAL(_savegpr_28)
9962306a36Sopenharmony_ci_GLOBAL(_save32gpr_28)
10062306a36Sopenharmony_ci	stw	28,-16(11)
10162306a36Sopenharmony_ci_GLOBAL(_savegpr_29)
10262306a36Sopenharmony_ci_GLOBAL(_save32gpr_29)
10362306a36Sopenharmony_ci	stw	29,-12(11)
10462306a36Sopenharmony_ci_GLOBAL(_savegpr_30)
10562306a36Sopenharmony_ci_GLOBAL(_save32gpr_30)
10662306a36Sopenharmony_ci	stw	30,-8(11)
10762306a36Sopenharmony_ci_GLOBAL(_savegpr_31)
10862306a36Sopenharmony_ci_GLOBAL(_save32gpr_31)
10962306a36Sopenharmony_ci	stw	31,-4(11)
11062306a36Sopenharmony_ci	blr
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/* Routines for restoring integer registers, called by the compiler.  */
11362306a36Sopenharmony_ci/* Called with r11 pointing to the stack header word of the caller of the */
11462306a36Sopenharmony_ci/* function, just beyond the end of the integer restore area.  */
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci_GLOBAL(_restgpr_14)
11762306a36Sopenharmony_ci_GLOBAL(_rest32gpr_14)
11862306a36Sopenharmony_ci	lwz	14,-72(11)	/* restore gp registers */
11962306a36Sopenharmony_ci_GLOBAL(_restgpr_15)
12062306a36Sopenharmony_ci_GLOBAL(_rest32gpr_15)
12162306a36Sopenharmony_ci	lwz	15,-68(11)
12262306a36Sopenharmony_ci_GLOBAL(_restgpr_16)
12362306a36Sopenharmony_ci_GLOBAL(_rest32gpr_16)
12462306a36Sopenharmony_ci	lwz	16,-64(11)
12562306a36Sopenharmony_ci_GLOBAL(_restgpr_17)
12662306a36Sopenharmony_ci_GLOBAL(_rest32gpr_17)
12762306a36Sopenharmony_ci	lwz	17,-60(11)
12862306a36Sopenharmony_ci_GLOBAL(_restgpr_18)
12962306a36Sopenharmony_ci_GLOBAL(_rest32gpr_18)
13062306a36Sopenharmony_ci	lwz	18,-56(11)
13162306a36Sopenharmony_ci_GLOBAL(_restgpr_19)
13262306a36Sopenharmony_ci_GLOBAL(_rest32gpr_19)
13362306a36Sopenharmony_ci	lwz	19,-52(11)
13462306a36Sopenharmony_ci_GLOBAL(_restgpr_20)
13562306a36Sopenharmony_ci_GLOBAL(_rest32gpr_20)
13662306a36Sopenharmony_ci	lwz	20,-48(11)
13762306a36Sopenharmony_ci_GLOBAL(_restgpr_21)
13862306a36Sopenharmony_ci_GLOBAL(_rest32gpr_21)
13962306a36Sopenharmony_ci	lwz	21,-44(11)
14062306a36Sopenharmony_ci_GLOBAL(_restgpr_22)
14162306a36Sopenharmony_ci_GLOBAL(_rest32gpr_22)
14262306a36Sopenharmony_ci	lwz	22,-40(11)
14362306a36Sopenharmony_ci_GLOBAL(_restgpr_23)
14462306a36Sopenharmony_ci_GLOBAL(_rest32gpr_23)
14562306a36Sopenharmony_ci	lwz	23,-36(11)
14662306a36Sopenharmony_ci_GLOBAL(_restgpr_24)
14762306a36Sopenharmony_ci_GLOBAL(_rest32gpr_24)
14862306a36Sopenharmony_ci	lwz	24,-32(11)
14962306a36Sopenharmony_ci_GLOBAL(_restgpr_25)
15062306a36Sopenharmony_ci_GLOBAL(_rest32gpr_25)
15162306a36Sopenharmony_ci	lwz	25,-28(11)
15262306a36Sopenharmony_ci_GLOBAL(_restgpr_26)
15362306a36Sopenharmony_ci_GLOBAL(_rest32gpr_26)
15462306a36Sopenharmony_ci	lwz	26,-24(11)
15562306a36Sopenharmony_ci_GLOBAL(_restgpr_27)
15662306a36Sopenharmony_ci_GLOBAL(_rest32gpr_27)
15762306a36Sopenharmony_ci	lwz	27,-20(11)
15862306a36Sopenharmony_ci_GLOBAL(_restgpr_28)
15962306a36Sopenharmony_ci_GLOBAL(_rest32gpr_28)
16062306a36Sopenharmony_ci	lwz	28,-16(11)
16162306a36Sopenharmony_ci_GLOBAL(_restgpr_29)
16262306a36Sopenharmony_ci_GLOBAL(_rest32gpr_29)
16362306a36Sopenharmony_ci	lwz	29,-12(11)
16462306a36Sopenharmony_ci_GLOBAL(_restgpr_30)
16562306a36Sopenharmony_ci_GLOBAL(_rest32gpr_30)
16662306a36Sopenharmony_ci	lwz	30,-8(11)
16762306a36Sopenharmony_ci_GLOBAL(_restgpr_31)
16862306a36Sopenharmony_ci_GLOBAL(_rest32gpr_31)
16962306a36Sopenharmony_ci	lwz	31,-4(11)
17062306a36Sopenharmony_ci	blr
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/* Routines for restoring integer registers, called by the compiler.  */
17362306a36Sopenharmony_ci/* Called with r11 pointing to the stack header word of the caller of the */
17462306a36Sopenharmony_ci/* function, just beyond the end of the integer restore area.  */
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci_GLOBAL(_restgpr_14_x)
17762306a36Sopenharmony_ci_GLOBAL(_rest32gpr_14_x)
17862306a36Sopenharmony_ci	lwz	14,-72(11)	/* restore gp registers */
17962306a36Sopenharmony_ci_GLOBAL(_restgpr_15_x)
18062306a36Sopenharmony_ci_GLOBAL(_rest32gpr_15_x)
18162306a36Sopenharmony_ci	lwz	15,-68(11)
18262306a36Sopenharmony_ci_GLOBAL(_restgpr_16_x)
18362306a36Sopenharmony_ci_GLOBAL(_rest32gpr_16_x)
18462306a36Sopenharmony_ci	lwz	16,-64(11)
18562306a36Sopenharmony_ci_GLOBAL(_restgpr_17_x)
18662306a36Sopenharmony_ci_GLOBAL(_rest32gpr_17_x)
18762306a36Sopenharmony_ci	lwz	17,-60(11)
18862306a36Sopenharmony_ci_GLOBAL(_restgpr_18_x)
18962306a36Sopenharmony_ci_GLOBAL(_rest32gpr_18_x)
19062306a36Sopenharmony_ci	lwz	18,-56(11)
19162306a36Sopenharmony_ci_GLOBAL(_restgpr_19_x)
19262306a36Sopenharmony_ci_GLOBAL(_rest32gpr_19_x)
19362306a36Sopenharmony_ci	lwz	19,-52(11)
19462306a36Sopenharmony_ci_GLOBAL(_restgpr_20_x)
19562306a36Sopenharmony_ci_GLOBAL(_rest32gpr_20_x)
19662306a36Sopenharmony_ci	lwz	20,-48(11)
19762306a36Sopenharmony_ci_GLOBAL(_restgpr_21_x)
19862306a36Sopenharmony_ci_GLOBAL(_rest32gpr_21_x)
19962306a36Sopenharmony_ci	lwz	21,-44(11)
20062306a36Sopenharmony_ci_GLOBAL(_restgpr_22_x)
20162306a36Sopenharmony_ci_GLOBAL(_rest32gpr_22_x)
20262306a36Sopenharmony_ci	lwz	22,-40(11)
20362306a36Sopenharmony_ci_GLOBAL(_restgpr_23_x)
20462306a36Sopenharmony_ci_GLOBAL(_rest32gpr_23_x)
20562306a36Sopenharmony_ci	lwz	23,-36(11)
20662306a36Sopenharmony_ci_GLOBAL(_restgpr_24_x)
20762306a36Sopenharmony_ci_GLOBAL(_rest32gpr_24_x)
20862306a36Sopenharmony_ci	lwz	24,-32(11)
20962306a36Sopenharmony_ci_GLOBAL(_restgpr_25_x)
21062306a36Sopenharmony_ci_GLOBAL(_rest32gpr_25_x)
21162306a36Sopenharmony_ci	lwz	25,-28(11)
21262306a36Sopenharmony_ci_GLOBAL(_restgpr_26_x)
21362306a36Sopenharmony_ci_GLOBAL(_rest32gpr_26_x)
21462306a36Sopenharmony_ci	lwz	26,-24(11)
21562306a36Sopenharmony_ci_GLOBAL(_restgpr_27_x)
21662306a36Sopenharmony_ci_GLOBAL(_rest32gpr_27_x)
21762306a36Sopenharmony_ci	lwz	27,-20(11)
21862306a36Sopenharmony_ci_GLOBAL(_restgpr_28_x)
21962306a36Sopenharmony_ci_GLOBAL(_rest32gpr_28_x)
22062306a36Sopenharmony_ci	lwz	28,-16(11)
22162306a36Sopenharmony_ci_GLOBAL(_restgpr_29_x)
22262306a36Sopenharmony_ci_GLOBAL(_rest32gpr_29_x)
22362306a36Sopenharmony_ci	lwz	29,-12(11)
22462306a36Sopenharmony_ci_GLOBAL(_restgpr_30_x)
22562306a36Sopenharmony_ci_GLOBAL(_rest32gpr_30_x)
22662306a36Sopenharmony_ci	lwz	30,-8(11)
22762306a36Sopenharmony_ci_GLOBAL(_restgpr_31_x)
22862306a36Sopenharmony_ci_GLOBAL(_rest32gpr_31_x)
22962306a36Sopenharmony_ci	lwz	0,4(11)
23062306a36Sopenharmony_ci	lwz	31,-4(11)
23162306a36Sopenharmony_ci	mtlr	0
23262306a36Sopenharmony_ci	mr	1,11
23362306a36Sopenharmony_ci	blr
234