rtl.h (mem_for_const_double): New declaration.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Tue, 6 Nov 2001 14:47:43 +0000 (14:47 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Tue, 6 Nov 2001 14:47:43 +0000 (09:47 -0500)
* rtl.h (mem_for_const_double): New declaration.
* varasm.c (mem_for_const_double): New function.
* config/convex/convex.md (movdf): Use it.
* config/m68k/hp320.h (LEGITIMATE_PIC_OPERAND_P): Likewise.
* config/m68k/linux.h, config/m68k/m68k.h: Likewise.
* config/m68k/m68kv4.h: Likewise.

From-SVN: r46808

gcc/ChangeLog
gcc/config/convex/convex.md
gcc/config/m68k/hp320.h
gcc/config/m68k/linux.h
gcc/config/m68k/m68k.h
gcc/config/m68k/m68kv4.h
gcc/rtl.h
gcc/varasm.c

index 98708ec930a5d04655b0a1190d0e71a2448f5ab3..c62be21ecab1d82e07bd82c0fd2474d9a08c15f4 100644 (file)
@@ -1,5 +1,12 @@
 Tue Nov  6 09:21:34 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * rtl.h (mem_for_const_double): New declaration.
+       * varasm.c (mem_for_const_double): New function.
+       * config/convex/convex.md (movdf): Use it.
+       * config/m68k/hp320.h (LEGITIMATE_PIC_OPERAND_P): Likewise.
+       * config/m68k/linux.h, config/m68k/m68k.h: Likewise.
+       * config/m68k/m68kv4.h: Likewise.
+
        * config/alpha/alpha.h (SECONDARY_MEMORY_NEEDED): Adjust for addition
        of new GP reg classes.
 
index 31ee5eec4c055865143752da2c13a65e56461f0d..3ff36edcd33b053fdba7dc1fef1d27d9f390fe88 100644 (file)
 (define_insn ""
   [(set (match_operand:DF 0 "register_operand" "=d")
        (match_operand:DF 1 "const_double_operand" "F"))]
-  "CONST_DOUBLE_MEM (operands[1]) == const0_rtx"
+  "mem_for_const_double (operands[1]) == 0"
   "ld.u %u1,%0\;ld.w %v1,%0"
   [(set_attr "type" "xalu")])
 
index ac87eddbe27c427ff380b2494a067f4a4eb5473c..6bb86d3c559a1da06cdc6a7ece2166c5c85dc60e 100644 (file)
@@ -625,10 +625,11 @@ do { register int i;                      \
 #undef LEGITIMATE_PIC_OPERAND_P
 #define LEGITIMATE_PIC_OPERAND_P(X) \
   ((! symbolic_operand (X, VOIDmode) \
-    && ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X) \
-         && GET_CODE (CONST_DOUBLE_MEM (X)) == MEM             \
-         && symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0), VOIDmode))) \
-   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))       \
+    && ! (GET_CODE (X) == CONST_DOUBLE && mem_for_const_double (X) != 0        \
+         && GET_CODE (mem_for_const_double (X)) == MEM                 \
+         && symbolic_operand (XEXP (mem_for_const_double (X), 0),      \
+                              VOIDmode)))                              \
+   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))              \
    || PCREL_GENERAL_OPERAND_OK)
 
 /* hpux8 and later have C++ compatible include files, so do not
index 6c3c8f0ddd06a80e3c5440661e39aa9cdcf53673..256d790ccf9fdff6ed921c3a74aad07f4b0c876f 100644 (file)
@@ -310,10 +310,11 @@ do {                                                                      \
 #undef LEGITIMATE_PIC_OPERAND_P
 #define LEGITIMATE_PIC_OPERAND_P(X) \
   ((! symbolic_operand (X, VOIDmode) \
-    && ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X) \
-         && GET_CODE (CONST_DOUBLE_MEM (X)) == MEM             \
-         && symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0), VOIDmode))) \
-   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))       \
+    && ! (GET_CODE (X) == CONST_DOUBLE && mem_for_const_double (X) != 0        \
+         && GET_CODE (mem_for_const_double (X)) == MEM                 \
+         && symbolic_operand (XEXP (mem_for_const_double (X), 0),      \
+                              VOIDmode)))                              \
+   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))              \
    || PCREL_GENERAL_OPERAND_OK)
 
 /* Turn off function cse if we are doing PIC. We always want function
index 914b9b41a49e256d569ab11234d475ced503604c..fad64082b57dbd43ba6f26642825c49ac3172ccd 100644 (file)
@@ -1459,11 +1459,11 @@ __transfer_from_trampoline ()                                   \
 
 #define LEGITIMATE_PIC_OPERAND_P(X)    \
   ((! symbolic_operand (X, VOIDmode)                           \
-    && ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X) \
-         && GET_CODE (CONST_DOUBLE_MEM (X)) == MEM             \
-         && symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0),  \
-                              VOIDmode)))                      \
-   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))      \
+    && ! (GET_CODE (X) == CONST_DOUBLE && mem_for_const_double (X) != 0        \
+         && GET_CODE (mem_for_const_double (X)) == MEM                 \
+         && symbolic_operand (XEXP (mem_for_const_double (X), 0),      \
+                              VOIDmode)))                              \
+   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))              \
    || PCREL_GENERAL_OPERAND_OK)
 
 /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
index 4914cf47eadd9f0e44c6934568fbb6264bf0ec3e..e10b6e5e506fd1f35d3e4e049d755a99174e484d 100644 (file)
@@ -278,10 +278,11 @@ int switch_table_difference_label_flag;
 #undef LEGITIMATE_PIC_OPERAND_P
 #define LEGITIMATE_PIC_OPERAND_P(X) \
   ((! symbolic_operand (X, VOIDmode) \
-    && ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X) \
-         && GET_CODE (CONST_DOUBLE_MEM (X)) == MEM             \
-         && symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0), VOIDmode))) \
-   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))       \
+    && ! (GET_CODE (X) == CONST_DOUBLE && mem_for_const_double (X) != 0        \
+         && GET_CODE (mem_for_const_double (X)) == MEM                 \
+         && symbolic_operand (XEXP (mem_for_const_double (X), 0),      \
+                              VOIDmode)))                              \
+   || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X))              \
    || PCREL_GENERAL_OPERAND_OK)
 
 /* Turn off function cse if we are doing PIC. We always want function call
index 6260f57feea91291c3f6d92a55483d749fb354d7..872d70dbf776f16718967569a88bf4a4ff0d5db6 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1273,6 +1273,7 @@ extern rtx gen_sequence                   PARAMS ((void));
 
 /* In varasm.c  */
 extern rtx immed_double_const          PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
+extern rtx mem_for_const_double                PARAMS ((rtx));
 extern rtx force_const_mem             PARAMS ((enum machine_mode, rtx));
 
 /* In varasm.c  */
index ebdac3bced3bac1e6fb262eeca658138fd26480d..064a6caa3f10128afe0a5369155c8853a61b23d7 100644 (file)
@@ -3756,6 +3756,24 @@ record_constant_rtx (mode, x)
   return ptr;
 }
 \f
+/* Given a constant rtx X, return a MEM for the location in memory at which
+   this constant has been placed.  Return 0 if it not has been placed yet.  */
+
+rtx
+mem_for_const_double (x)
+     rtx x;
+{
+  enum machine_mode mode = GET_MODE (x);
+  struct constant_descriptor *desc;
+
+  for (desc = const_rtx_hash_table[const_hash_rtx (mode, x)]; desc;
+       desc = desc->next)
+    if (compare_constant_rtx (mode, x, desc))
+      return desc->rtl;
+
+  return 0;
+}
+  
 /* Given a constant rtx X, make (or find) a memory constant for its value
    and return a MEM rtx to refer to it in memory.  */