Commit 67da85da by Richard Sandiford Committed by Richard Sandiford

mips-protos.h (SYMBOL_GENERAL): Rename to...

gcc/
	* config/mips/mips-protos.h (SYMBOL_GENERAL): Rename to...
	(SYMBOL_ABSOLUTE): ...this.
	(SYMBOL_SMALL_DATA): Rename to...
	(SYMBOL_GP_RELATIVE): ...this.
	(SYMBOL_CONSTANT_POOL): Rename to...
	(SYMBOL_PC_RELATIVE): ...this.
	* config/mips/mips.c (mips_classify_symbol, mips_symbolic_constant_p)
	(mips_symbolic_address_p, mips_symbol_insns, override_options)
	(mips_rewrite_small_data_p, mips_use_anchors_for_symbol_p): Update
	after above changes.
	* config/mips/predicates.md (const_call_insn_operand): Likewise.
	(general_symbolic_operand): Rename to...
	(absolute_symbolic_operand): ...this.
	* config/mips/mips.md: Update after above changes.

From-SVN: r127294
parent 76b4f0f7
2007-08-08 Richard Sandiford <richard@codesourcery.com>
* config/mips/mips-protos.h (SYMBOL_GENERAL): Rename to...
(SYMBOL_ABSOLUTE): ...this.
(SYMBOL_SMALL_DATA): Rename to...
(SYMBOL_GP_RELATIVE): ...this.
(SYMBOL_CONSTANT_POOL): Rename to...
(SYMBOL_PC_RELATIVE): ...this.
* config/mips/mips.c (mips_classify_symbol, mips_symbolic_constant_p)
(mips_symbolic_address_p, mips_symbol_insns, override_options)
(mips_rewrite_small_data_p, mips_use_anchors_for_symbol_p): Update
after above changes.
* config/mips/predicates.md (const_call_insn_operand): Likewise.
(general_symbolic_operand): Rename to...
(absolute_symbolic_operand): ...this.
* config/mips/mips.md: Update after above changes.
2007-08-08 Vladimir Yanovsky <yanov@il.ibm.com> 2007-08-08 Vladimir Yanovsky <yanov@il.ibm.com>
Revital Eres <eres@il.ibm.com> Revital Eres <eres@il.ibm.com>
......
...@@ -27,14 +27,17 @@ along with GCC; see the file COPYING3. If not see ...@@ -27,14 +27,17 @@ along with GCC; see the file COPYING3. If not see
/* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address. /* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
SYMBOL_GENERAL SYMBOL_ABSOLUTE
Used when none of the below apply. The symbol's value will be calculated using absolute relocations,
such as %hi and %lo.
SYMBOL_SMALL_DATA SYMBOL_GP_RELATIVE
The symbol refers to something in a small data section. The symbol's value will be calculated by adding a 16-bit offset
from $gp.
SYMBOL_CONSTANT_POOL SYMBOL_PC_RELATIVE
The symbol refers to something in the mips16 constant pool. The symbol's value will be calculated using a MIPS16 PC-relative
calculation.
SYMBOL_GOT_PAGE_OFST SYMBOL_GOT_PAGE_OFST
The symbol's value will be calculated by loading an address The symbol's value will be calculated by loading an address
...@@ -87,9 +90,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -87,9 +90,9 @@ along with GCC; see the file COPYING3. If not see
An UNSPEC wrapper around any kind of address. It represents the An UNSPEC wrapper around any kind of address. It represents the
low 16 bits of that address. */ low 16 bits of that address. */
enum mips_symbol_type { enum mips_symbol_type {
SYMBOL_GENERAL, SYMBOL_ABSOLUTE,
SYMBOL_SMALL_DATA, SYMBOL_GP_RELATIVE,
SYMBOL_CONSTANT_POOL, SYMBOL_PC_RELATIVE,
SYMBOL_GOT_PAGE_OFST, SYMBOL_GOT_PAGE_OFST,
SYMBOL_GOT_DISP, SYMBOL_GOT_DISP,
SYMBOL_GOTOFF_PAGE, SYMBOL_GOTOFF_PAGE,
......
...@@ -1446,10 +1446,10 @@ mips_classify_symbol (rtx x) ...@@ -1446,10 +1446,10 @@ mips_classify_symbol (rtx x)
if (GET_CODE (x) == LABEL_REF) if (GET_CODE (x) == LABEL_REF)
{ {
if (TARGET_MIPS16) if (TARGET_MIPS16)
return SYMBOL_CONSTANT_POOL; return SYMBOL_PC_RELATIVE;
if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS) if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
return SYMBOL_GOT_PAGE_OFST; return SYMBOL_GOT_PAGE_OFST;
return SYMBOL_GENERAL; return SYMBOL_ABSOLUTE;
} }
gcc_assert (GET_CODE (x) == SYMBOL_REF); gcc_assert (GET_CODE (x) == SYMBOL_REF);
...@@ -1460,25 +1460,25 @@ mips_classify_symbol (rtx x) ...@@ -1460,25 +1460,25 @@ mips_classify_symbol (rtx x)
if (CONSTANT_POOL_ADDRESS_P (x)) if (CONSTANT_POOL_ADDRESS_P (x))
{ {
if (TARGET_MIPS16) if (TARGET_MIPS16)
return SYMBOL_CONSTANT_POOL; return SYMBOL_PC_RELATIVE;
if (!TARGET_EMBEDDED_DATA if (!TARGET_EMBEDDED_DATA
&& GET_MODE_SIZE (get_pool_mode (x)) <= mips_section_threshold) && GET_MODE_SIZE (get_pool_mode (x)) <= mips_section_threshold)
return SYMBOL_SMALL_DATA; return SYMBOL_GP_RELATIVE;
} }
/* Do not use small-data accesses for weak symbols; they may end up /* Do not use small-data accesses for weak symbols; they may end up
being zero. */ being zero. */
if (SYMBOL_REF_SMALL_P (x) if (SYMBOL_REF_SMALL_P (x)
&& !SYMBOL_REF_WEAK (x)) && !SYMBOL_REF_WEAK (x))
return SYMBOL_SMALL_DATA; return SYMBOL_GP_RELATIVE;
if (TARGET_ABICALLS) if (TARGET_ABICALLS)
{ {
/* Don't use GOT accesses for locally-binding symbols; we can use /* Don't use GOT accesses for locally-binding symbols; we can use
%hi and %lo instead. */ %hi and %lo instead. */
if (TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)) if (TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x))
return SYMBOL_GENERAL; return SYMBOL_ABSOLUTE;
/* There are three cases to consider: /* There are three cases to consider:
...@@ -1505,7 +1505,7 @@ mips_classify_symbol (rtx x) ...@@ -1505,7 +1505,7 @@ mips_classify_symbol (rtx x)
return SYMBOL_GOT_PAGE_OFST; return SYMBOL_GOT_PAGE_OFST;
} }
return SYMBOL_GENERAL; return SYMBOL_ABSOLUTE;
} }
/* Return true if OFFSET is within the range [0, ALIGN), where ALIGN /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
...@@ -1559,7 +1559,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type) ...@@ -1559,7 +1559,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
relocations. */ relocations. */
switch (*symbol_type) switch (*symbol_type)
{ {
case SYMBOL_GENERAL: case SYMBOL_ABSOLUTE:
case SYMBOL_64_HIGH: case SYMBOL_64_HIGH:
case SYMBOL_64_MID: case SYMBOL_64_MID:
case SYMBOL_64_LOW: case SYMBOL_64_LOW:
...@@ -1573,7 +1573,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type) ...@@ -1573,7 +1573,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
/* In other cases the relocations can handle any offset. */ /* In other cases the relocations can handle any offset. */
return true; return true;
case SYMBOL_CONSTANT_POOL: case SYMBOL_PC_RELATIVE:
/* Allow constant pool references to be converted to LABEL+CONSTANT. /* Allow constant pool references to be converted to LABEL+CONSTANT.
In this case, we no longer have access to the underlying constant, In this case, we no longer have access to the underlying constant,
but the original symbol-based access was known to be valid. */ but the original symbol-based access was known to be valid. */
...@@ -1582,7 +1582,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type) ...@@ -1582,7 +1582,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
/* Fall through. */ /* Fall through. */
case SYMBOL_SMALL_DATA: case SYMBOL_GP_RELATIVE:
/* Make sure that the offset refers to something within the /* Make sure that the offset refers to something within the
same object block. This should guarantee that the final same object block. This should guarantee that the final
PC- or GP-relative offset is within the 16-bit limit. */ PC- or GP-relative offset is within the 16-bit limit. */
...@@ -1681,13 +1681,13 @@ mips_symbolic_address_p (enum mips_symbol_type symbol_type, ...@@ -1681,13 +1681,13 @@ mips_symbolic_address_p (enum mips_symbol_type symbol_type,
{ {
switch (symbol_type) switch (symbol_type)
{ {
case SYMBOL_GENERAL: case SYMBOL_ABSOLUTE:
return !TARGET_MIPS16; return !TARGET_MIPS16;
case SYMBOL_SMALL_DATA: case SYMBOL_GP_RELATIVE:
return true; return true;
case SYMBOL_CONSTANT_POOL: case SYMBOL_PC_RELATIVE:
/* PC-relative addressing is only available for lw and ld. */ /* PC-relative addressing is only available for lw and ld. */
return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8; return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
...@@ -1838,7 +1838,7 @@ mips_symbol_insns (enum mips_symbol_type type) ...@@ -1838,7 +1838,7 @@ mips_symbol_insns (enum mips_symbol_type type)
{ {
switch (type) switch (type)
{ {
case SYMBOL_GENERAL: case SYMBOL_ABSOLUTE:
/* In mips16 code, general symbols must be fetched from the /* In mips16 code, general symbols must be fetched from the
constant pool. */ constant pool. */
if (TARGET_MIPS16) if (TARGET_MIPS16)
...@@ -1857,11 +1857,11 @@ mips_symbol_insns (enum mips_symbol_type type) ...@@ -1857,11 +1857,11 @@ mips_symbol_insns (enum mips_symbol_type type)
symbols we just need a preparatory lui. */ symbols we just need a preparatory lui. */
return (ABI_HAS_64BIT_SYMBOLS ? 6 : 2); return (ABI_HAS_64BIT_SYMBOLS ? 6 : 2);
case SYMBOL_SMALL_DATA: case SYMBOL_GP_RELATIVE:
case SYMBOL_HALF: case SYMBOL_HALF:
return 1; return 1;
case SYMBOL_CONSTANT_POOL: case SYMBOL_PC_RELATIVE:
/* This case is for mips16 only. Assume we'll need an /* This case is for mips16 only. Assume we'll need an
extended instruction. */ extended instruction. */
return 2; return 2;
...@@ -5429,32 +5429,32 @@ override_options (void) ...@@ -5429,32 +5429,32 @@ override_options (void)
mips_hi_relocs[SYMBOL_64_LOW] = "%hi("; mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
mips_lo_relocs[SYMBOL_64_LOW] = "%lo("; mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
mips_split_p[SYMBOL_GENERAL] = true; mips_split_p[SYMBOL_ABSOLUTE] = true;
mips_lo_relocs[SYMBOL_GENERAL] = "%lo("; mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
} }
} }
else else
{ {
if (TARGET_EXPLICIT_RELOCS || mips_split_addresses) if (TARGET_EXPLICIT_RELOCS || mips_split_addresses)
{ {
mips_split_p[SYMBOL_GENERAL] = true; mips_split_p[SYMBOL_ABSOLUTE] = true;
mips_hi_relocs[SYMBOL_GENERAL] = "%hi("; mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
mips_lo_relocs[SYMBOL_GENERAL] = "%lo("; mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
} }
} }
if (TARGET_MIPS16) if (TARGET_MIPS16)
{ {
/* The high part is provided by a pseudo copy of $gp. */ /* The high part is provided by a pseudo copy of $gp. */
mips_split_p[SYMBOL_SMALL_DATA] = true; mips_split_p[SYMBOL_GP_RELATIVE] = true;
mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gprel("; mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
} }
if (TARGET_EXPLICIT_RELOCS) if (TARGET_EXPLICIT_RELOCS)
{ {
/* Small data constants are kept whole until after reload, /* Small data constants are kept whole until after reload,
then lowered by mips_rewrite_small_data. */ then lowered by mips_rewrite_small_data. */
mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gp_rel("; mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
mips_split_p[SYMBOL_GOT_PAGE_OFST] = true; mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
if (TARGET_NEWABI) if (TARGET_NEWABI)
...@@ -6439,7 +6439,7 @@ mips_rewrite_small_data_p (rtx x) ...@@ -6439,7 +6439,7 @@ mips_rewrite_small_data_p (rtx x)
return (TARGET_EXPLICIT_RELOCS return (TARGET_EXPLICIT_RELOCS
&& mips_symbolic_constant_p (x, &symbol_type) && mips_symbolic_constant_p (x, &symbol_type)
&& symbol_type == SYMBOL_SMALL_DATA); && symbol_type == SYMBOL_GP_RELATIVE);
} }
...@@ -8309,8 +8309,8 @@ mips_use_anchors_for_symbol_p (rtx symbol) ...@@ -8309,8 +8309,8 @@ mips_use_anchors_for_symbol_p (rtx symbol)
{ {
switch (mips_classify_symbol (symbol)) switch (mips_classify_symbol (symbol))
{ {
case SYMBOL_CONSTANT_POOL: case SYMBOL_PC_RELATIVE:
case SYMBOL_SMALL_DATA: case SYMBOL_GP_RELATIVE:
return false; return false;
default: default:
......
...@@ -3094,7 +3094,7 @@ ...@@ -3094,7 +3094,7 @@
[(set_attr "type" "store") [(set_attr "type" "store")
(set_attr "mode" "<MODE>")]) (set_attr "mode" "<MODE>")])
;; An instruction to calculate the high part of a 64-bit SYMBOL_GENERAL. ;; An instruction to calculate the high part of a 64-bit SYMBOL_ABSOLUTE.
;; The required value is: ;; The required value is:
;; ;;
;; (%highest(op1) << 48) + (%higher(op1) << 32) + (%hi(op1) << 16) ;; (%highest(op1) << 48) + (%higher(op1) << 32) + (%hi(op1) << 16)
...@@ -3111,7 +3111,7 @@ ...@@ -3111,7 +3111,7 @@
;; to take effect. ;; to take effect.
(define_insn_and_split "*lea_high64" (define_insn_and_split "*lea_high64"
[(set (match_operand:DI 0 "register_operand" "=d") [(set (match_operand:DI 0 "register_operand" "=d")
(high:DI (match_operand:DI 1 "general_symbolic_operand" "")))] (high:DI (match_operand:DI 1 "absolute_symbolic_operand" "")))]
"TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS" "TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS"
"#" "#"
"&& epilogue_completed" "&& epilogue_completed"
...@@ -3136,7 +3136,7 @@ ...@@ -3136,7 +3136,7 @@
;; daddu op1,op1,op0 ;; daddu op1,op1,op0
(define_peephole2 (define_peephole2
[(set (match_operand:DI 1 "register_operand") [(set (match_operand:DI 1 "register_operand")
(high:DI (match_operand:DI 2 "general_symbolic_operand"))) (high:DI (match_operand:DI 2 "absolute_symbolic_operand")))
(match_scratch:DI 0 "d")] (match_scratch:DI 0 "d")]
"TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS" "TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS"
[(set (match_dup 1) (high:DI (match_dup 3))) [(set (match_dup 1) (high:DI (match_dup 3)))
...@@ -3150,7 +3150,7 @@ ...@@ -3150,7 +3150,7 @@
}) })
;; On most targets, the expansion of (lo_sum (high X) X) for a 64-bit ;; 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 ;; SYMBOL_ABSOLUTE 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 ;; 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: ;; used once. We can then use the sequence:
;; ;;
...@@ -3164,7 +3164,7 @@ ...@@ -3164,7 +3164,7 @@
;; which takes 4 cycles on most superscalar targets. ;; which takes 4 cycles on most superscalar targets.
(define_insn_and_split "*lea64" (define_insn_and_split "*lea64"
[(set (match_operand:DI 0 "register_operand" "=d") [(set (match_operand:DI 0 "register_operand" "=d")
(match_operand:DI 1 "general_symbolic_operand" "")) (match_operand:DI 1 "absolute_symbolic_operand" ""))
(clobber (match_scratch:DI 2 "=&d"))] (clobber (match_scratch:DI 2 "=&d"))]
"TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS && cse_not_expected" "TARGET_EXPLICIT_RELOCS && ABI_HAS_64BIT_SYMBOLS && cse_not_expected"
"#" "#"
...@@ -4182,7 +4182,7 @@ ...@@ -4182,7 +4182,7 @@
(match_dup 4)] UNSPEC_LOAD_GOT))] (match_dup 4)] UNSPEC_LOAD_GOT))]
{ {
operands[2] = pic_offset_table_rtx; operands[2] = pic_offset_table_rtx;
operands[3] = mips_unspec_address (operands[0], SYMBOL_GENERAL); operands[3] = mips_unspec_address (operands[0], SYMBOL_ABSOLUTE);
operands[4] = mips_unspec_address (operands[1], SYMBOL_HALF); operands[4] = mips_unspec_address (operands[1], SYMBOL_HALF);
}) })
......
...@@ -101,7 +101,7 @@ ...@@ -101,7 +101,7 @@
switch (symbol_type) switch (symbol_type)
{ {
case SYMBOL_GENERAL: case SYMBOL_ABSOLUTE:
/* We can only use direct calls for TARGET_ABSOLUTE_ABICALLS if we /* We can only use direct calls for TARGET_ABSOLUTE_ABICALLS if we
are sure that the target function does not need $25 to be live are sure that the target function does not need $25 to be live
on entry. This is true for any locally-defined function because on entry. This is true for any locally-defined function because
...@@ -229,11 +229,11 @@ ...@@ -229,11 +229,11 @@
return mips_symbolic_constant_p (op, &type); return mips_symbolic_constant_p (op, &type);
}) })
(define_predicate "general_symbolic_operand" (define_predicate "absolute_symbolic_operand"
(match_code "const,symbol_ref,label_ref") (match_code "const,symbol_ref,label_ref")
{ {
enum mips_symbol_type type; enum mips_symbol_type type;
return mips_symbolic_constant_p (op, &type) && type == SYMBOL_GENERAL; return mips_symbolic_constant_p (op, &type) && type == SYMBOL_ABSOLUTE;
}) })
(define_predicate "got_disp_operand" (define_predicate "got_disp_operand"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment