> > - In gcc/config/mips/mips.c:mips_compute_frame_info() you do
> >
> > /* Move above the GPR save area. */
> > if (frame->num_gp > 0)
> > {
> > offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
> > frame->gp_sp_offset = offset - UNITS_PER_WORD;
> > }
> >
> > So what is "- UNITS_PER_WORD" for?
>
> Well, the fields are defined as follows:
>
> /* The offset of the topmost GPR and FPR save slots from the top of
> the frame, or zero if no such slots are needed. */
> HOST_WIDE_INT gp_save_offset;
> HOST_WIDE_INT fp_save_offset;
>
> /* Likewise, but giving offsets from the bottom of the frame. */
> HOST_WIDE_INT gp_sp_offset;
> HOST_WIDE_INT fp_sp_offset;
>
> so the "- UNITS_PER_WORD" converts the offset of the end/top of the save
> slot area to the offset of the topmost save slot.
Understood, thanks.
And now I look at the Figure 7-2 in [1], it's clearly explained there.
I should have read carefully.
> > - Why do you put MIPS_STACK_ALIGN in many places?
>
> TBH, I just blindly kept these when doing the rewrite. Some of them
> aren't needed, as you say; I'll try to fix that sometime.
>
> It isn't just the bottom of the stack that needs to be aligned though.
> Addressable regions like the local variables and the varargs save area
> must also be aligned, so that the alignment attributes work correctly.
Understood too.
(If it's the only reason, GPR and FPR save don't need alignment - but
who cares? :)
Masao