diff options
Diffstat (limited to 'gcc/config/mips/mips.c')
-rw-r--r-- | gcc/config/mips/mips.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 289f46e..1a2cc06 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -636,6 +636,9 @@ static GTY(()) int mips16_flipper; /* The -mtext-loads setting. */ enum mips_code_readable_setting mips_code_readable = CODE_READABLE_YES; +/* The -mllsc setting. */ +enum mips_llsc_setting mips_llsc = LLSC_DEFAULT; + /* The architecture selected by -mipsN. */ static const struct mips_cpu_info *mips_isa_info; @@ -5711,7 +5714,7 @@ mips_set_current_function (tree fndecl ATTRIBUTE_UNUSED) /* Implement TARGET_HANDLE_OPTION. */ static bool -mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED) +mips_handle_option (size_t code, const char *arg, int value) { switch (code) { @@ -5753,6 +5756,10 @@ mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED) return false; return true; + case OPT_mllsc: + mips_llsc = value ? LLSC_YES : LLSC_NO; + return true; + default: return true; } @@ -6015,6 +6022,8 @@ override_options (void) mips_print_operand_punct['$'] = 1; mips_print_operand_punct['+'] = 1; mips_print_operand_punct['~'] = 1; + mips_print_operand_punct['|'] = 1; + mips_print_operand_punct['-'] = 1; /* Set up array to map GCC register number to debug register number. Ignore the special purpose register numbers. */ @@ -6377,7 +6386,10 @@ mips_strip_unspec_address (rtx op) '^' Print the name of the pic call-through register (t9 or $25). '$' Print the name of the stack pointer register (sp or $29). '+' Print the name of the gp register (usually gp or $28). - '~' Output a branch alignment to LABEL_ALIGN(NULL). */ + '~' Output a branch alignment to LABEL_ALIGN(NULL). + '|' Print .set push; .set mips2 if mips_llsc == LLSC_YES + && !ISA_HAS_LL_SC. + '-' Print .set pop under the same conditions for '|'. */ void print_operand (FILE *file, rtx op, int letter) @@ -6507,6 +6519,16 @@ print_operand (FILE *file, rtx op, int letter) } break; + case '|': + if (!ISA_HAS_LL_SC) + fputs (".set\tpush\n\t.set\tmips2\n\t", file); + break; + + case '-': + if (!ISA_HAS_LL_SC) + fputs ("\n\t.set\tpop", file); + break; + default: error ("PRINT_OPERAND: unknown punctuation '%c'", letter); break; |