.
[glibc-ports.git] / sysdeps / mips / machine-gmon.h
blobf23a4c3008254136f8b8d0f21adc6430a8b0928c
1 /* Machine-specific calling sequence for `mcount' profiling function. MIPS
2 Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA. */
21 #include <sgidefs.h>
23 #define _MCOUNT_DECL(frompc,selfpc) \
24 static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
26 /* Call __mcount with the return PC for our caller,
27 and the return PC our caller will return to. */
29 #if _MIPS_SIM == _MIPS_SIM_ABI32
31 #ifdef __PIC__
32 # define CPLOAD ".cpload $25;"
33 # define CPRESTORE ".cprestore 44\n\t"
34 #else
35 # define CPLOAD
36 # define CPRESTORE
37 #endif
39 #define MCOUNT asm(\
40 ".globl _mcount;\n\t" \
41 ".align 2;\n\t" \
42 ".type _mcount,@function;\n\t" \
43 ".ent _mcount\n\t" \
44 "_mcount:\n\t" \
45 ".frame $sp,44,$31\n\t" \
46 ".set noreorder;\n\t" \
47 ".set noat;\n\t" \
48 CPLOAD \
49 "subu $29,$29,48;\n\t" \
50 CPRESTORE \
51 "sw $4,24($29);\n\t" \
52 "sw $5,28($29);\n\t" \
53 "sw $6,32($29);\n\t" \
54 "sw $7,36($29);\n\t" \
55 "sw $2,40($29);\n\t" \
56 "sw $1,16($29);\n\t" \
57 "sw $31,20($29);\n\t" \
58 "move $5,$31;\n\t" \
59 "move $4,$1;\n\t" \
60 "jal __mcount;\n\t" \
61 "nop;\n\t" \
62 "lw $4,24($29);\n\t" \
63 "lw $5,28($29);\n\t" \
64 "lw $6,32($29);\n\t" \
65 "lw $7,36($29);\n\t" \
66 "lw $2,40($29);\n\t" \
67 "lw $31,20($29);\n\t" \
68 "lw $1,16($29);\n\t" \
69 "addu $29,$29,56;\n\t" \
70 "j $31;\n\t" \
71 "move $31,$1;\n\t" \
72 ".set reorder;\n\t" \
73 ".set at\n\t" \
74 ".end _mcount");
76 #else
78 #ifdef __PIC__
79 # define CPSETUP ".cpsetup $25, 88, _mcount;"
80 # define CPRETURN ".cpreturn;"
81 #else
82 # define CPSETUP
83 # define CPRETURN
84 #endif
86 #if _MIPS_SIM == _MIPS_SIM_NABI32
87 # define PTR_ADDU_STRING "add" /* no u */
88 # define PTR_SUBU_STRING "sub" /* no u */
89 #elif _MIPS_SIM == _MIPS_SIM_ABI64
90 # define PTR_ADDU_STRING "daddu"
91 # define PTR_SUBU_STRING "dsubu"
92 #else
93 # error "Unknown ABI"
94 #endif
96 #define MCOUNT asm(\
97 ".globl _mcount;\n\t" \
98 ".align 3;\n\t" \
99 ".type _mcount,@function;\n\t" \
100 ".ent _mcount\n\t" \
101 "_mcount:\n\t" \
102 ".frame $sp,88,$31\n\t" \
103 ".set noreorder;\n\t" \
104 ".set noat;\n\t" \
105 PTR_SUBU_STRING " $29,$29,96;\n\t" \
106 CPSETUP \
107 "sd $4,24($29);\n\t" \
108 "sd $5,32($29);\n\t" \
109 "sd $6,40($29);\n\t" \
110 "sd $7,48($29);\n\t" \
111 "sd $8,56($29);\n\t" \
112 "sd $9,64($29);\n\t" \
113 "sd $10,72($29);\n\t" \
114 "sd $11,80($29);\n\t" \
115 "sd $2,16($29);\n\t" \
116 "sd $1,0($29);\n\t" \
117 "sd $31,8($29);\n\t" \
118 "move $5,$31;\n\t" \
119 "move $4,$1;\n\t" \
120 "jal __mcount;\n\t" \
121 "nop;\n\t" \
122 "ld $4,24($29);\n\t" \
123 "ld $5,32($29);\n\t" \
124 "ld $6,40($29);\n\t" \
125 "ld $7,48($29);\n\t" \
126 "ld $8,56($29);\n\t" \
127 "ld $9,64($29);\n\t" \
128 "ld $10,72($29);\n\t" \
129 "ld $11,80($29);\n\t" \
130 "ld $2,16($29);\n\t" \
131 "ld $31,8($29);\n\t" \
132 "ld $1,0($29);\n\t" \
133 CPRETURN \
134 PTR_ADDU_STRING " $29,$29,96;\n\t" \
135 "j $31;\n\t" \
136 "move $31,$1;\n\t" \
137 ".set reorder;\n\t" \
138 ".set at\n\t" \
139 ".end _mcount");
141 #endif