This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch to complete MIPS -mexplicit-relocs support


This patch adds explicit-reloc support for -mabi=64 -mno-abicalls.
It uses two new patterns:

    (set (reg:DI x) (high:DI y))
    (set (reg:DI x) y)

where Y is a 64-bit SYMBOL_GENERAL.  The first pattern uses a
5-insn single-register sequence, the second (which matches only
when cse_not_expected) uses the 6-insn two-register parallel sequence.

Both patterns expand into a series of individually-schedulable
instructions.  Rather than have special .md patterns for each
split instruction, I thought it would be cleaner to add three
new symbol types, SYMBOL_64_HIGH, SYMBOL_64_MID and SYMBOL_64_LOW.
This seems more consistent with the GOT support and allows us to
reuse existing patterns & code.

As a minor implementation detail: I've been trying to keep the symbol
classification local to mips.c, forcing mips.md to use the utility
functions mips_gotoff_page and mips_gotoff_global.  This seemed
worthwhile when there were only two such functions, but this patch
would have needed three more.  The patch therefore exposes
mips_unspec_address and the mips_symbol_type enum.

In terms of future work, we should really have a two-register
alternative for:

    (set (reg:DI x) (high:DI y))

perhaps based on a peephole2.  I'm still looking at this.

Patch tested by building an ELF64 linux kernel: it seemed to work fine.
However, since the kernel is using ckseg0, it's not really a very
strong test.

As a data-point, .text shrank by >64k compared to the no-explicit-reloc
version.  I guess that says more about the quality of our no-explicit-reloc
code than anything else though...

Bootstrapped & regression tested on mips-sgi-irix6.5.  Eric, is this
OK with you?

Richard


	* config/mips/mips-protos.h (enum mips_symbol_type): Move from mips.h.
	(NUM_SYMBOL_TYPES): Likewise.
	(SYMBOL_64_HIGH, SYMBOL_64_MID, SYMBOL_64_LOW): New symbol types.
	(mips_unspec_address): Declare.
	(mips_gotoff_page, mips_gotoff_global): Delete.
	* config/mips/mips.h (PREDICATE_CODES): Add general_symbolic_operand.
	* config/mips/mips.c (enum mips_symbol_type, NUM_SYMBOL_TYPES): Delete.
	(mips_symbolic_constant_p, mips_symbolic_address_p)
	(mips_symbol_insns): Handle new symbol types.
	(general_symbolic_operand): New predicate.
	(mips_unspec_address): Make extern.
	(mips_gotoff_page, mips_gotoff_global): Delete.
	(override_options): Allow -mabi=64 -mno-abicalls -mexplicit-relocs.
	Handle new symbol types.
	* config/mips/mips.md (*lea_high64, *lea64): New patterns.
	(*xgot_hi[sd]i, *xgot_lo[sd]i, *got_disp[sd]i, *got_disp[sd]i): Call
	mips_unspec_address directly.
	* doc/invoke.texi: Remove the -mabi=64 -mno-abicalls exception from
	the documentation of -mexplicit-relocs.

Index: config/mips/mips-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips-protos.h,v
retrieving revision 1.65
diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.65 mips-protos.h
--- config/mips/mips-protos.h	28 Feb 2004 19:59:18 -0000	1.65
+++ config/mips/mips-protos.h	29 Feb 2004 11:23:12 -0000
@@ -26,15 +26,76 @@ Boston, MA 02111-1307, USA.  */
 #ifndef GCC_MIPS_PROTOS_H
 #define GCC_MIPS_PROTOS_H
 
+/* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
+
+   SYMBOL_GENERAL
+       Used when none of the below apply.
+
+   SYMBOL_SMALL_DATA
+       The symbol refers to something in a small data section.
+
+   SYMBOL_CONSTANT_POOL
+       The symbol refers to something in the mips16 constant pool.
+
+   SYMBOL_GOT_LOCAL
+       The symbol refers to local data that will be found using
+       the global offset table.
+
+   SYMBOL_GOT_GLOBAL
+       Likewise non-local data.
+
+   SYMBOL_GOTOFF_PAGE
+       An UNSPEC wrapper around a SYMBOL_GOT_LOCAL.  It represents the
+       offset from _gp of a GOT page entry.
+
+   SYMBOL_GOTOFF_GLOBAL
+       An UNSPEC wrapper around a SYMBOL_GOT_GLOBAL.  It represents the
+       the offset from _gp of the symbol's GOT entry.
+
+   SYMBOL_GOTOFF_CALL
+       Like SYMBOL_GOTOFF_GLOBAL, but used when calling a global function.
+       The GOT entry is allowed to point to a stub rather than to the
+       function itself.
+
+   SYMBOL_GOTOFF_LOADGP
+       An UNSPEC wrapper around a function's address.  It represents the
+       offset of _gp from the start of the function.
+
+   SYMBOL_64_HIGH
+       For a 64-bit symbolic address X, this is the value of
+       (%highest(X) << 16) + %higher(X).
+
+   SYMBOL_64_MID
+       For a 64-bit symbolic address X, this is the value of
+       (%higher(X) << 16) + %hi(X).
+
+   SYMBOL_64_LOW
+       For a 64-bit symbolic address X, this is the value of
+       (%hi(X) << 16) + %lo(X).  */
+enum mips_symbol_type {
+  SYMBOL_GENERAL,
+  SYMBOL_SMALL_DATA,
+  SYMBOL_CONSTANT_POOL,
+  SYMBOL_GOT_LOCAL,
+  SYMBOL_GOT_GLOBAL,
+  SYMBOL_GOTOFF_PAGE,
+  SYMBOL_GOTOFF_GLOBAL,
+  SYMBOL_GOTOFF_CALL,
+  SYMBOL_GOTOFF_LOADGP,
+  SYMBOL_64_HIGH,
+  SYMBOL_64_MID,
+  SYMBOL_64_LOW
+};
+#define NUM_SYMBOL_TYPES (SYMBOL_64_LOW + 1)
+
 extern int mips_regno_mode_ok_for_base_p (int, enum machine_mode, int);
 extern int mips_address_insns (rtx, enum machine_mode);
 extern int mips_const_insns (rtx);
 extern int mips_fetch_insns (rtx);
 extern int mips_idiv_insns (void);
 extern bool mips_legitimate_address_p (enum machine_mode, rtx, int);
+extern rtx mips_unspec_address (rtx, enum mips_symbol_type);
 extern bool mips_legitimize_address (rtx *, enum machine_mode);
-extern rtx mips_gotoff_page (rtx);
-extern rtx mips_gotoff_global (rtx);
 extern bool mips_legitimize_move (enum machine_mode, rtx, rtx);
 
 extern int m16_uimm3_b (rtx, enum machine_mode);
Index: config/mips/mips.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.h,v
retrieving revision 1.323
diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.323 mips.h
--- config/mips/mips.h	28 Feb 2004 20:27:42 -0000	1.323
+++ config/mips/mips.h	29 Feb 2004 11:23:13 -0000
@@ -2698,6 +2698,7 @@ #define ADJUST_INSN_LENGTH(INSN, LENGTH)
 #define PREDICATE_CODES							\
   {"uns_arith_operand",		{ REG, CONST_INT, SUBREG, ADDRESSOF }},	\
   {"symbolic_operand",		{ CONST, SYMBOL_REF, LABEL_REF }},	\
+  {"general_symbolic_operand",	{ CONST, SYMBOL_REF, LABEL_REF }},	\
   {"global_got_operand",	{ CONST, SYMBOL_REF, LABEL_REF }},	\
   {"local_got_operand",		{ CONST, SYMBOL_REF, LABEL_REF }},	\
   {"const_arith_operand",	{ CONST_INT }},				\
Index: config/mips/mips.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.c,v
retrieving revision 1.388
diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.388 mips.c
--- config/mips/mips.c	28 Feb 2004 20:27:42 -0000	1.388
+++ config/mips/mips.c	29 Feb 2004 11:23:16 -0000
@@ -105,53 +105,6 @@ #define CONST_GP_P(X) \
    multi-instruction addu sequence.  Use 0x7fe0 to work around this.  */
 #define MIPS_MAX_FIRST_STACK_STEP (TARGET_MIPS16 ? 0x100 : 0x7fe0)
 
-/* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
-
-   SYMBOL_GENERAL
-       Used when none of the below apply.
-
-   SYMBOL_SMALL_DATA
-       The symbol refers to something in a small data section.
-
-   SYMBOL_CONSTANT_POOL
-       The symbol refers to something in the mips16 constant pool.
-
-   SYMBOL_GOT_LOCAL
-       The symbol refers to local data that will be found using
-       the global offset table.
-
-   SYMBOL_GOT_GLOBAL
-       Likewise non-local data.
-
-   SYMBOL_GOTOFF_PAGE
-       An UNSPEC wrapper around a SYMBOL_GOT_LOCAL.  It represents the
-       offset from _gp of a GOT page entry.
-
-   SYMBOL_GOTOFF_GLOBAL
-       An UNSPEC wrapper around a SYMBOL_GOT_GLOBAL.  It represents the
-       the offset from _gp of the symbol's GOT entry.
-
-   SYMBOL_GOTOFF_CALL
-       Like SYMBOL_GOTOFF_GLOBAL, but used when calling a global function.
-       The GOT entry is allowed to point to a stub rather than to the
-       function itself.
-
-   SYMBOL_GOTOFF_LOADGP
-       An UNSPEC wrapper around a function's address.  It represents the
-       offset of _gp from the start of the function.  */
-enum mips_symbol_type {
-  SYMBOL_GENERAL,
-  SYMBOL_SMALL_DATA,
-  SYMBOL_CONSTANT_POOL,
-  SYMBOL_GOT_LOCAL,
-  SYMBOL_GOT_GLOBAL,
-  SYMBOL_GOTOFF_PAGE,
-  SYMBOL_GOTOFF_GLOBAL,
-  SYMBOL_GOTOFF_CALL,
-  SYMBOL_GOTOFF_LOADGP
-};
-#define NUM_SYMBOL_TYPES (SYMBOL_GOTOFF_LOADGP + 1)
-
 
 /* Classifies an address.
 
@@ -196,7 +149,6 @@ static int mips_symbol_insns (enum mips_
 static bool mips16_unextended_reference_p (enum machine_mode mode, rtx, rtx);
 static rtx mips_force_temporary (rtx, rtx);
 static rtx mips_split_symbol (rtx, rtx);
-static rtx mips_unspec_address (rtx, enum mips_symbol_type);
 static rtx mips_unspec_offset_high (rtx, rtx, rtx, enum mips_symbol_type);
 static rtx mips_add_offset (rtx, HOST_WIDE_INT);
 static unsigned int mips_build_shift (struct mips_integer_op *, HOST_WIDE_INT);
@@ -951,6 +903,9 @@ mips_symbolic_constant_p (rtx x, enum mi
   switch (*symbol_type)
     {
     case SYMBOL_GENERAL:
+    case SYMBOL_64_HIGH:
+    case SYMBOL_64_MID:
+    case SYMBOL_64_LOW:
       /* If the target has 64-bit pointers and the object file only
 	 supports 32-bit symbols, the values of those symbols will be
 	 sign-extended.  In this case we can't allow an arbitrary offset
@@ -1068,6 +1023,9 @@ mips_symbolic_address_p (enum mips_symbo
     case SYMBOL_GOTOFF_GLOBAL:
     case SYMBOL_GOTOFF_CALL:
     case SYMBOL_GOTOFF_LOADGP:
+    case SYMBOL_64_HIGH:
+    case SYMBOL_64_MID:
+    case SYMBOL_64_LOW:
       return true;
     }
   abort ();
@@ -1191,6 +1149,9 @@ mips_symbol_insns (enum mips_symbol_type
     case SYMBOL_GOTOFF_GLOBAL:
     case SYMBOL_GOTOFF_CALL:
     case SYMBOL_GOTOFF_LOADGP:
+    case SYMBOL_64_HIGH:
+    case SYMBOL_64_MID:
+    case SYMBOL_64_LOW:
       /* Check whether the offset is a 16- or 32-bit value.  */
       return mips_split_p[type] ? 2 : 1;
     }
@@ -1642,6 +1603,19 @@ symbolic_operand (rtx op, enum machine_m
 }
 
 
+/* Return true if OP is a symbolic constant of type SYMBOL_GENERAL.  */
+
+int
+general_symbolic_operand (rtx op, enum machine_mode mode)
+{
+  enum mips_symbol_type symbol_type;
+
+  return ((mode == VOIDmode || mode == GET_MODE (op))
+	  && mips_symbolic_constant_p (op, &symbol_type)
+	  && symbol_type == SYMBOL_GENERAL);
+}
+
+
 /* Return true if we're generating PIC and OP is a global symbol.  */
 
 int
@@ -1733,7 +1707,7 @@ mips_split_symbol (rtx temp, rtx addr)
 /* Return an UNSPEC address with underlying address ADDRESS and symbol
    type SYMBOL_TYPE.  */
 
-static rtx
+rtx
 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
 {
   rtx base;
@@ -1766,25 +1740,6 @@ mips_unspec_offset_high (rtx temp, rtx b
 }
 
 
-/* Return the offset of a GOT page entry for local address ADDR.  */
-
-rtx
-mips_gotoff_page (rtx addr)
-{
-  return mips_unspec_address (addr, SYMBOL_GOTOFF_PAGE);
-}
-
-
-/* Return the offset of ADDR's GOT entry from _gp.  ADDR is a
-   global_got_operand.  */
-
-rtx
-mips_gotoff_global (rtx addr)
-{
-  return mips_unspec_address (addr, SYMBOL_GOTOFF_GLOBAL);
-}
-
-
 /* Return a legitimate address for REG + OFFSET.  This function will
    create a temporary register if OFFSET is not a SMALL_OPERAND.  */
 
@@ -4866,15 +4821,6 @@ override_options (void)
   else
     mips_split_addresses = 0;
 
-  /* -mexplicit-relocs doesn't yet support non-PIC n64.  We don't know
-     how to generate %highest/%higher/%hi/%lo sequences.  */
-  if (mips_abi == ABI_64 && !TARGET_ABICALLS)
-    {
-      if ((target_flags_explicit & target_flags & MASK_EXPLICIT_RELOCS) != 0)
-	sorry ("non-PIC n64 with explicit relocations");
-      target_flags &= ~MASK_EXPLICIT_RELOCS;
-    }
-
   /* Explicit relocations for "old" ABIs are a GNU extension.  Unless
      the user has said otherwise, assume that they are not available
      with assemblers other than gas.  */
@@ -5070,11 +5016,34 @@ override_options (void)
   /* Function to allocate machine-dependent function status.  */
   init_machine_status = &mips_init_machine_status;
 
-  if (TARGET_EXPLICIT_RELOCS || mips_split_addresses)
+  if (ABI_HAS_64BIT_SYMBOLS)
+    {
+      if (TARGET_EXPLICIT_RELOCS)
+	{
+	  mips_split_p[SYMBOL_64_HIGH] = true;
+	  mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
+	  mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
+
+	  mips_split_p[SYMBOL_64_MID] = true;
+	  mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
+	  mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
+
+	  mips_split_p[SYMBOL_64_LOW] = true;
+	  mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
+	  mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
+
+	  mips_split_p[SYMBOL_GENERAL] = true;
+	  mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
+	}
+    }
+  else
     {
-      mips_split_p[SYMBOL_GENERAL] = true;
-      mips_hi_relocs[SYMBOL_GENERAL] = "%hi(";
-      mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
+      if (TARGET_EXPLICIT_RELOCS || mips_split_addresses)
+	{
+	  mips_split_p[SYMBOL_GENERAL] = true;
+	  mips_hi_relocs[SYMBOL_GENERAL] = "%hi(";
+	  mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
+	}
     }
 
   if (TARGET_MIPS16)
Index: config/mips/mips.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.md,v
retrieving revision 1.221
diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.221 mips.md
--- config/mips/mips.md	28 Feb 2004 20:30:10 -0000	1.221
+++ config/mips/mips.md	29 Feb 2004 11:23:17 -0000
@@ -4233,6 +4233,67 @@ (define_insn "mov_sdr"
   [(set_attr "type" "store")
    (set_attr "mode" "DI")])
 
+;; An instruction to calculate the high part of a 64-bit SYMBOL_GENERAL.
+;; The required value is:
+;;
+;;	(%highest(op1) << 48) + (%higher(op1) << 32) + (%hi(op1) << 16)
+;;
+;; which translates to:
+;;
+;;	lui	op0,%highest(op1)
+;;	daddiu	op0,op0,%higher(op1)
+;;	dsll	op0,op0,16
+;;	daddiu	op0,op0,%hi(op1)
+;;	dsll	op0,op0,16
+(define_insn_and_split "*lea_high64"
+  [(set (match_operand:DI 0 "register_operand" "=d")
+	(high:DI (match_operand:DI 1 "general_symbolic_operand" "")))]
+  "TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS"
+  "#"
+  "&& reload_completed"
+  [(set (match_dup 0) (high:DI (match_dup 2)))
+   (set (match_dup 0) (lo_sum:DI (match_dup 0) (match_dup 2)))
+   (set (match_dup 0) (ashift:DI (match_dup 0) (const_int 16)))
+   (set (match_dup 0) (lo_sum:DI (match_dup 0) (match_dup 3)))
+   (set (match_dup 0) (ashift:DI (match_dup 0) (const_int 16)))]
+{
+  operands[2] = mips_unspec_address (operands[1], SYMBOL_64_HIGH);
+  operands[3] = mips_unspec_address (operands[1], SYMBOL_64_MID);
+}
+  [(set_attr "length" "20")])
+
+;; On most targets, the expansion of (lo_sum (high X) X) for a 64-bit
+;; SYMBOL_GENERAL X will take 6 cycles.  This next pattern allows combine
+;; to merge the HIGH and LO_SUM parts of a move if the HIGH part is only
+;; used once.  We can then use the sequence:
+;;
+;;	lui	op0,%highest(op1)
+;;	lui	op2,%hi(op1)
+;;	daddiu	op0,op0,%higher(op1)
+;;	daddiu	op2,op2,%lo(op1)
+;;	dsll32	op0,op0,0
+;;	daddu	op0,op0,op2
+;;
+;; which takes 4 cycles on most superscalar targets.
+(define_insn_and_split "*lea64"
+  [(set (match_operand:DI 0 "register_operand" "=d")
+	(match_operand:DI 1 "general_symbolic_operand" ""))
+   (clobber (match_scratch:DI 2 "=&d"))]
+  "TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS && cse_not_expected"
+  "#"
+  "&& reload_completed"
+  [(set (match_dup 0) (high:DI (match_dup 3)))
+   (set (match_dup 2) (high:DI (match_dup 4)))
+   (set (match_dup 0) (lo_sum:DI (match_dup 0) (match_dup 3)))
+   (set (match_dup 2) (lo_sum:DI (match_dup 2) (match_dup 4)))
+   (set (match_dup 0) (ashift:DI (match_dup 0) (const_int 32)))
+   (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))]
+{
+  operands[3] = mips_unspec_address (operands[1], SYMBOL_64_HIGH);
+  operands[4] = mips_unspec_address (operands[1], SYMBOL_64_LOW);
+}
+  [(set_attr "length" "24")])
+
 ;; Insns to fetch a global symbol from a big GOT.
 
 (define_insn_and_split "*xgot_hisi"
@@ -4244,7 +4305,7 @@ (define_insn_and_split "*xgot_hisi"
   [(set (match_dup 0) (high:SI (match_dup 2)))
    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 3)))]
 {
-  operands[2] = mips_gotoff_global (operands[1]);
+  operands[2] = mips_unspec_address (operands[1], SYMBOL_GOTOFF_GLOBAL);
   operands[3] = pic_offset_table_rtx;
 }
   [(set_attr "got" "xgot_high")])
@@ -4258,7 +4319,7 @@ (define_insn_and_split "*xgot_losi"
   "&& reload_completed"
   [(set (match_dup 0)
 	(unspec:SI [(match_dup 1) (match_dup 3)] UNSPEC_LOAD_GOT))]
-  { operands[3] = mips_gotoff_global (operands[2]); }
+  { operands[3] = mips_unspec_address (operands[2], SYMBOL_GOTOFF_GLOBAL); }
   [(set_attr "got" "load")])
 
 (define_insn_and_split "*xgot_hidi"
@@ -4270,7 +4331,7 @@ (define_insn_and_split "*xgot_hidi"
   [(set (match_dup 0) (high:DI (match_dup 2)))
    (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 3)))]
 {
-  operands[2] = mips_gotoff_global (operands[1]);
+  operands[2] = mips_unspec_address (operands[1], SYMBOL_GOTOFF_GLOBAL);
   operands[3] = pic_offset_table_rtx;
 }
   [(set_attr "got" "xgot_high")])
@@ -4284,7 +4345,7 @@ (define_insn_and_split "*xgot_lodi"
   "&& reload_completed"
   [(set (match_dup 0)
 	(unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_LOAD_GOT))]
-  { operands[3] = mips_gotoff_global (operands[2]); }
+  { operands[3] = mips_unspec_address (operands[2], SYMBOL_GOTOFF_GLOBAL); }
   [(set_attr "got" "load")])
 
 ;; Insns to fetch a global symbol from a normal GOT.
@@ -4299,7 +4360,7 @@ (define_insn_and_split "*got_dispsi"
 	(unspec:SI [(match_dup 2) (match_dup 3)] UNSPEC_LOAD_GOT))]
 {
   operands[2] = pic_offset_table_rtx;
-  operands[3] = mips_gotoff_global (operands[1]);
+  operands[3] = mips_unspec_address (operands[1], SYMBOL_GOTOFF_GLOBAL);
 }
   [(set_attr "got" "load")])
 
@@ -4313,7 +4374,7 @@ (define_insn_and_split "*got_dispdi"
 	(unspec:DI [(match_dup 2) (match_dup 3)] UNSPEC_LOAD_GOT))]
 {
   operands[2] = pic_offset_table_rtx;
-  operands[3] = mips_gotoff_global (operands[1]);
+  operands[3] = mips_unspec_address (operands[1], SYMBOL_GOTOFF_GLOBAL);
 }
   [(set_attr "got" "load")])
 
@@ -4329,7 +4390,7 @@ (define_insn_and_split "*got_pagesi"
 	(unspec:SI [(match_dup 2) (match_dup 3)] UNSPEC_LOAD_GOT))]
 {
   operands[2] = pic_offset_table_rtx;
-  operands[3] = mips_gotoff_page (operands[1]);
+  operands[3] = mips_unspec_address (operands[1], SYMBOL_GOTOFF_PAGE);
 }
   [(set_attr "got" "load")])
 
@@ -4343,7 +4404,7 @@ (define_insn_and_split "*got_pagedi"
 	(unspec:DI [(match_dup 2) (match_dup 3)] UNSPEC_LOAD_GOT))]
 {
   operands[2] = pic_offset_table_rtx;
-  operands[3] = mips_gotoff_page (operands[1]);
+  operands[3] = mips_unspec_address (operands[1], SYMBOL_GOTOFF_PAGE);
 }
   [(set_attr "got" "load")])
 
Index: doc/invoke.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/invoke.texi,v
retrieving revision 1.418
diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.418 invoke.texi
--- doc/invoke.texi	28 Feb 2004 20:06:01 -0000	1.418
+++ doc/invoke.texi	29 Feb 2004 11:23:21 -0000
@@ -7966,24 +7966,14 @@ Use (do not use) assembler relocation op
 addresses.  The alternative, selected by @option{-mno-explicit-relocs},
 is to use assembler macros instead.
 
-@option{-mexplicit-relocs} is usually the default if GCC was
-configured to use an assembler that supports relocation operators.
-However, there are two exceptions:
-
-@itemize @bullet
-@item
-GCC is not yet able to generate explicit relocations for the combination
-of @option{-mabi=64} and @option{-mno-abicalls}.  This will be addressed
-in a future release.
-
-@item
-The combination of @option{-mabicalls} and @option{-fno-unit-at-a-time}
+@option{-mexplicit-relocs} is usually the default if GCC was configured
+to use an assembler that supports relocation operators.  However, the
+combination of @option{-mabicalls} and @option{-fno-unit-at-a-time}
 implies @option{-mno-explicit-relocs} unless explicitly overridden.
 This is because, when generating abicalls, the choice of relocation
 depends on whether a symbol is local or global.  In some rare cases,
 GCC will not be able to decide this until the whole compilation unit
 has been read.
-@end itemize
 
 @item -mrnames
 @itemx -mno-rnames


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]