From 55933a587ac0590813abd4a6660e0f31d1e56275 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 9 Aug 1994 15:18:26 +0000 Subject: [PATCH] * config/tc-mips.c (md_parse_option): Accept -mcpu=4400, 4600, and orion. --- gas/ChangeLog | 11 ++++ gas/config/tc-mips.c | 123 +++++++++++++++++++++++++++---------------- 2 files changed, 88 insertions(+), 46 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index dc6863fe75..f4bdf24458 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +Tue Aug 9 11:12:13 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * config/tc-mips.c (md_parse_option): Accept -mcpu=4400, 4600, and + orion. + +Mon Aug 8 16:28:08 1994 Steve Chamberlain (sac@jonny.cygnus.com) + + * as.h: Remove FOPEN_WB patch of Aug 6. + * configure.in: Configure for ho-go32 correctly. + * config/ho-go32.h: Fix copyright. + Mon Aug 8 11:59:51 1994 Jeff Law (law@snake.cs.utah.edu) * gas/config/tc-hppa.c (md_pseudo_table): Delete redundant diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index c34cdf440a..73639017de 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -1726,6 +1726,7 @@ macro (ip) offsetT maxnum; bfd_reloc_code_real_type r; char *p; + int hold_mips_optimize; treg = (ip->insn_opcode >> 16) & 0x1f; dreg = (ip->insn_opcode >> 11) & 0x1f; @@ -2542,7 +2543,13 @@ macro (ip) off1 = -8; } + /* Set mips_optimize around the lui instruction to avoid + inserting an unnecessary nop after the lw. */ + hold_mips_optimize = mips_optimize; + mips_optimize = 2; macro_build_lui ((char *) NULL, &icnt, &expr1, AT); + mips_optimize = hold_mips_optimize; + macro_build ((char *) NULL, &icnt, &expr1, mips_isa < 3 ? "addiu" : "daddiu", "t,r,j", AT, AT, (int) BFD_RELOC_LO16); @@ -2989,21 +2996,8 @@ macro (ip) return; case M_LI_SS: - if (mips_pic == NO_PIC) + if (imm_expr.X_op == O_constant) { - assert (offset_expr.X_op == O_symbol - && strcmp (segment_name (S_GET_SEGMENT - (offset_expr.X_add_symbol)), - ".lit4") == 0 - && offset_expr.X_add_number == 0); - macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)", - treg, (int) BFD_RELOC_MIPS_LITERAL, GP); - return; - } - else if (mips_pic == SVR4_PIC - || mips_pic == EMBEDDED_PIC) - { - assert (imm_expr.X_op == O_constant); load_register (&icnt, AT, &imm_expr); macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mtc1", "t,G", AT, treg); @@ -3011,7 +3005,13 @@ macro (ip) } else { - abort (); + assert (offset_expr.X_op == O_symbol + && strcmp (segment_name (S_GET_SEGMENT + (offset_expr.X_add_symbol)), + ".lit4") == 0 + && offset_expr.X_add_number == 0); + macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)", + treg, (int) BFD_RELOC_MIPS_LITERAL, GP); return; } @@ -3068,15 +3068,11 @@ macro (ip) break; case M_LI_DD: - if (mips_pic == NO_PIC - || mips_pic == EMBEDDED_PIC) + assert (offset_expr.X_op == O_symbol + && offset_expr.X_add_number == 0); + s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol)); + if (strcmp (s, ".lit8") == 0) { - /* Load a floating point number from the .lit8 section. */ - assert (offset_expr.X_op == O_symbol - && strcmp (segment_name (S_GET_SEGMENT - (offset_expr.X_add_symbol)), - ".lit8") == 0 - && offset_expr.X_add_number == 0); if (mips_isa >= 2) { macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1", @@ -3087,24 +3083,29 @@ macro (ip) r = BFD_RELOC_MIPS_LITERAL; goto dob; } - else if (mips_pic == SVR4_PIC) + else { - /* Load the double from the .rdata section. */ - macro_build ((char *) NULL, &icnt, &offset_expr, - mips_isa < 3 ? "lw" : "ld", - "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); + assert (strcmp (s, RDATA_SECTION_NAME) == 0); + if (mips_pic == SVR4_PIC) + macro_build ((char *) NULL, &icnt, &offset_expr, + mips_isa < 3 ? "lw" : "ld", + "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP); + else + { + /* FIXME: This won't work for a 64 bit address. */ + macro_build_lui ((char *) NULL, &icnt, &offset_expr, AT); + } + if (mips_isa >= 2) { macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1", - "T,o(b)", treg, (int) BFD_RELOC_LO16, GP); + "T,o(b)", treg, (int) BFD_RELOC_LO16, AT); break; } breg = AT; r = BFD_RELOC_LO16; goto dob; } - else - abort (); case M_L_DOB: /* Even on a big endian machine $fn comes before $fn+1. We have @@ -3249,9 +3250,16 @@ macro (ip) coproc ? treg + 1 : treg, (int) BFD_RELOC_MIPS_GPREL, tempreg); offset_expr.X_add_number += 4; + + /* Set mips_optimize to 2 to avoid inserting an + undesired nop. */ + hold_mips_optimize = mips_optimize; + mips_optimize = 2; macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, coproc ? treg : treg + 1, (int) BFD_RELOC_MIPS_GPREL, tempreg); + mips_optimize = hold_mips_optimize; + p = frag_var (rs_machine_dependent, 12 + off, 0, RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1, used_at && mips_noat), @@ -3331,9 +3339,16 @@ macro (ip) coproc ? treg + 1 : treg, (int) BFD_RELOC_LO16, AT); expr1.X_add_number += 4; + + /* Set mips_optimize to 2 to avoid inserting an undesired + nop. */ + hold_mips_optimize = mips_optimize; + mips_optimize = 2; macro_build ((char *) NULL, &icnt, &expr1, s, fmt, coproc ? treg : treg + 1, (int) BFD_RELOC_LO16, AT); + mips_optimize = hold_mips_optimize; + (void) frag_var (rs_machine_dependent, 0, 0, RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0), offset_expr.X_add_symbol, (long) 0, @@ -4449,15 +4464,15 @@ mips_ip (str, ip) f -- immediate value l -- .lit4 - When generating SVR4 PIC code, we do not use the - .lit8 or .lit4 sections at all, in order to - reserve the entire global offset table. When - generating embedded PIC code, we use the .lit8 - section but not the .lit4 section (we can do .lit4 - inline easily; we need to put .lit8 somewhere in - the data segment, and using .lit8 permits the - linker to eventually combine identical .lit8 - entries). */ + The .lit4 and .lit8 sections are only used if + permitted by the -G argument. + + When generating embedded PIC code, we use the + .lit8 section but not the .lit4 section (we can do + .lit4 inline easily; we need to put .lit8 + somewhere in the data segment, and using .lit8 + permits the linker to eventually combine identical + .lit8 entries). */ f64 = *args == 'F' || *args == 'L'; @@ -4477,7 +4492,12 @@ mips_ip (str, ip) assert (length == (f64 ? 8 : 4)); if (*args == 'f' - || (mips_pic != NO_PIC && *args == 'l')) + || (*args == 'l' + && (mips_pic == EMBEDDED_PIC +#ifdef GPOPT + || g_switch_value < 4 +#endif + ))) { imm_expr.X_op = O_constant; if (byte_order == LITTLE_ENDIAN) @@ -4505,15 +4525,19 @@ mips_ip (str, ip) { default: /* unused default case avoids warnings. */ case 'L': - newname = (mips_pic != SVR4_PIC - ? ".lit8" - : RDATA_SECTION_NAME); + newname = ".lit8"; +#ifdef GPOPT + if (g_switch_value < 8) + newname = RDATA_SECTION_NAME; +#endif break; case 'F': newname = RDATA_SECTION_NAME; break; case 'l': - assert (mips_pic == NO_PIC); +#ifdef GPOPT + assert (g_switch_value >= 4); +#endif newname = ".lit4"; break; } @@ -5019,7 +5043,9 @@ md_parse_option (c, arg) case '4': if (strcmp (p, "4000") == 0 || strcmp (p, "4k") == 0 - || strcmp (p, "4K") == 0) + || strcmp (p, "4K") == 0 + || strcmp (p, "4400") == 0 + || strcmp (p, "4600") == 0) mips_isa = 3; break; @@ -5029,6 +5055,11 @@ md_parse_option (c, arg) || strcmp (p, "6K") == 0) mips_isa = 2; break; + + case 'o': + if (strcmp (p, "orion") == 0) + mips_isa = 3; + break; } if (mips_isa == -1) -- 2.34.1