Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
5251caf2
Commit
5251caf2
authored
Dec 06, 1992
by
Michael Meissner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix bug when large stack frames (> 32k) are used, and saving both GP and FP registers.
From-SVN: r2840
parent
2649b2ee
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
15 additions
and
15 deletions
+15
-15
gcc/config/mips/mips.c
+15
-15
No files found.
gcc/config/mips/mips.c
View file @
5251caf2
...
@@ -3914,7 +3914,7 @@ save_restore (file, gp_op, gp_2word_op, fp_op)
...
@@ -3914,7 +3914,7 @@ save_restore (file, gp_op, gp_2word_op, fp_op)
unsigned
long
fmask
=
current_frame_info
.
fmask
;
unsigned
long
fmask
=
current_frame_info
.
fmask
;
unsigned
long
gp_offset
;
unsigned
long
gp_offset
;
unsigned
long
fp_offset
;
unsigned
long
fp_offset
;
unsigned
long
m
ax
_offset
;
unsigned
long
m
in
_offset
;
char
*
base_reg
;
char
*
base_reg
;
if
(
mask
==
0
&&
fmask
==
0
)
if
(
mask
==
0
&&
fmask
==
0
)
...
@@ -3923,17 +3923,17 @@ save_restore (file, gp_op, gp_2word_op, fp_op)
...
@@ -3923,17 +3923,17 @@ save_restore (file, gp_op, gp_2word_op, fp_op)
base_reg
=
reg_names
[
STACK_POINTER_REGNUM
];
base_reg
=
reg_names
[
STACK_POINTER_REGNUM
];
gp_offset
=
current_frame_info
.
gp_sp_offset
;
gp_offset
=
current_frame_info
.
gp_sp_offset
;
fp_offset
=
current_frame_info
.
fp_sp_offset
;
fp_offset
=
current_frame_info
.
fp_sp_offset
;
m
ax_offset
=
(
gp_offset
>
fp_offset
)
?
gp_offset
:
fp_offset
;
m
in_offset
=
(
gp_offset
<
fp_offset
&&
mask
!=
0
)
?
gp_offset
:
fp_offset
;
/* Deal with calling functions with a large structure. */
/* Deal with calling functions with a large structure. */
if
(
m
ax
_offset
>=
32768
)
if
(
m
in
_offset
>=
32768
)
{
{
char
*
temp
=
reg_names
[
MIPS_TEMP2_REGNUM
];
char
*
temp
=
reg_names
[
MIPS_TEMP2_REGNUM
];
fprintf
(
file
,
"
\t
li
\t
%s,%ld
\n
"
,
temp
,
m
ax
_offset
);
fprintf
(
file
,
"
\t
li
\t
%s,%ld
\n
"
,
temp
,
m
in
_offset
);
fprintf
(
file
,
"
\t
addu
\t
%s,%s,%s
\n
"
,
temp
,
temp
,
base_reg
);
fprintf
(
file
,
"
\t
addu
\t
%s,%s,%s
\n
"
,
temp
,
temp
,
base_reg
);
base_reg
=
temp
;
base_reg
=
temp
;
gp_offset
=
m
ax
_offset
-
gp_offset
;
gp_offset
=
m
in
_offset
-
gp_offset
;
fp_offset
=
m
ax
_offset
-
fp_offset
;
fp_offset
=
m
in
_offset
-
fp_offset
;
}
}
/* Save registers starting from high to low. The debuggers prefer
/* Save registers starting from high to low. The debuggers prefer
...
@@ -3982,28 +3982,28 @@ save_restore_insns (store_p)
...
@@ -3982,28 +3982,28 @@ save_restore_insns (store_p)
int
store_p
;
/* true if this is prologue */
int
store_p
;
/* true if this is prologue */
{
{
int
regno
;
int
regno
;
rtx
base_reg_rtx
=
stack_pointer_rtx
;
rtx
base_reg_rtx
=
stack_pointer_rtx
;
unsigned
long
mask
=
current_frame_info
.
mask
;
unsigned
long
mask
=
current_frame_info
.
mask
;
unsigned
long
fmask
=
current_frame_info
.
fmask
;
unsigned
long
fmask
=
current_frame_info
.
fmask
;
unsigned
long
gp_offset
;
unsigned
long
gp_offset
;
unsigned
long
fp_offset
;
unsigned
long
fp_offset
;
unsigned
long
m
ax
_offset
;
unsigned
long
m
in
_offset
;
if
(
mask
==
0
&&
fmask
==
0
)
if
(
mask
==
0
&&
fmask
==
0
)
return
;
return
;
gp_offset
=
current_frame_info
.
gp_sp_offset
;
gp_offset
=
current_frame_info
.
gp_sp_offset
;
fp_offset
=
current_frame_info
.
fp_sp_offset
;
fp_offset
=
current_frame_info
.
fp_sp_offset
;
m
ax_offset
=
(
gp_offset
>
fp_offset
)
?
gp_offset
:
fp_offset
;
m
in_offset
=
(
gp_offset
<
fp_offset
&&
mask
!=
0
)
?
gp_offset
:
fp_offset
;
/* Deal with calling functions with a large structure. */
/* Deal with calling functions with a large structure. */
if
(
m
ax
_offset
>=
32768
)
if
(
m
in
_offset
>=
32768
)
{
{
base_reg_rtx
=
gen_rtx
(
REG
,
Pmode
,
MIPS_TEMP2_REGNUM
);
base_reg_rtx
=
gen_rtx
(
REG
,
Pmode
,
MIPS_TEMP2_REGNUM
);
emit_move_insn
(
base_reg_rtx
,
GEN_INT
(
m
ax
_offset
));
emit_move_insn
(
base_reg_rtx
,
GEN_INT
(
m
in
_offset
));
emit_insn
(
gen_addsi3
(
base_reg_rtx
,
base_reg_rtx
,
stack_pointer_rtx
));
emit_insn
(
gen_addsi3
(
base_reg_rtx
,
base_reg_rtx
,
stack_pointer_rtx
));
gp_offset
=
m
ax
_offset
-
gp_offset
;
gp_offset
=
m
in
_offset
-
gp_offset
;
fp_offset
=
m
ax
_offset
-
fp_offset
;
fp_offset
=
m
in
_offset
-
fp_offset
;
}
}
/* Save registers starting from high to low. The debuggers prefer
/* Save registers starting from high to low. The debuggers prefer
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment