[PATCH] New MIPS interrupt handler patch
Richard Sandiford
rdsandiford@googlemail.com
Fri Apr 10 08:07:00 GMT 2009
Ian Lance Taylor <iant@google.com> writes:
> "Fu, Chao-Ying" <fu@mips.com> writes:
>
>> gcc/ChangeLog
>> 2009-04-09 Chao-ying Fu <fu@mips.com>
>>
>> * doc/tm.texi (Instruction Output): Document
>> TARGET_ASM_FINAL_POSTSCAN_INSN.
>> * target.h (final_postscan_insn): New field in asm_out.
>> * target-def.h (TARGET_ASM_FINAL_POSTSCAN_INSN): New define.
>> (TARGET_ASM_OUT): Add TARGET_ASM_FINAL_POSTSCAN_INSN.
>> * final.c (final_scan_insn): Call
>> targetm.asm_out.final_postscan_insn after outputting
>> an asm macro and a normal instruction.
>>
>> * config/mips/mips.h (FINAL_PRESCAN_INSN): New define.
>> * config/mips/mips-protos.h (mips_final_prescan_insn):
>> Declare.
>> * config/mips/mips.c (mips_at_reg_p): New for_each_rtx callback.
>> (mips_final_prescan_insn, mips_final_postscan_insn): New
>> functions.
>> (TARGET_ASM_FINAL_POSTSCAN_INSN): New define.
>>
>> gcc/testsuite/ChangeLog
>> 2009-04-09 Chao-ying Fu <fu@mips.com>
>>
>> * gcc.target/mips/interrupt_handler.c: Change from compile to
>> assemble.
>
> The changes to the middle-end and the documentation are OK.
>
> I did not look at the changes to the MIPS backend or at the test case; I
> will leave those to the MIPS backend maintainers.
The MIPS parts are OK too, except:
> /* Implement FINAL_POSTSCAN_INSN. */
should now be:
/* Implement TARGET_ASM_FINAL_POSTSCAN_INSN. */
> /* For an instruction that accesses $1 (AT), we need to output ".set noat"
> before the instruction, and output ".set at" after the instruction. */
> #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
> mips_final_prescan_insn (INSN, OPVEC, NOPERANDS);
No ";". I don't think the comment belongs here; it should go in the
code instead. How about:
void
mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
{
int i;
/* We need to emit ".set noat" before an instruction that accesses
$1 (AT). */
if (recog_memoized (insn) >= 0)
for (i = 0; i < noperands; i++)
if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
if (set_noat++ == 0)
fprintf (asm_out_file, "\t.set\tnoat\n");
}
and:
void
mips_final_postscan_insn (FILE *file, rtx insn, rtx *opvec, int noperands)
{
int i;
/* Close any ".set noat" block opened by mips_final_prescan_insn. */
if (recog_memoized (insn) >= 0)
for (i = 0; i < noperands; i++)
if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
if (--set_noat == 0)
fprintf (file, "\t.set\tat\n");
}
OK with those changes, thanks.
Richard
More information about the Gcc-patches
mailing list