(ASM_OUTPUT_DOUBLE, ASM_OUTPUT_FLOAT): Use
authorRichard Stallman <rms@gnu.org>
Fri, 5 Nov 1993 20:27:25 +0000 (20:27 +0000)
committerRichard Stallman <rms@gnu.org>
Fri, 5 Nov 1993 20:27:25 +0000 (20:27 +0000)
REAL_ARITHMETIC macros including hex for special values.

From-SVN: r6012

gcc/config/rs6000/rs6000.h

index 77fb7d23d998cb9c8a09bf1b4674fc5eac3cdb3b..979a644cde370d39e012f75fd41bd1fd46a76508 100644 (file)
@@ -1890,13 +1890,44 @@ toc_section ()                                          \
 
 /* This is how to output an assembler line defining a `double' constant.  */
 
-#define ASM_OUTPUT_DOUBLE(FILE,VALUE)          \
-  fprintf (FILE, "\t.double 0d%.20e\n", (VALUE))
+#define ASM_OUTPUT_DOUBLE(FILE, VALUE)                                 \
+  {                                                                    \
+    if (REAL_VALUE_ISINF (VALUE)                                       \
+        || REAL_VALUE_ISNAN (VALUE)                                    \
+       || REAL_VALUE_MINUS_ZERO (VALUE))                               \
+      {                                                                        \
+       long t[2];                                                      \
+       REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t);                       \
+       fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n",                \
+               t[0] & 0xffffffff, t[1] & 0xffffffff);                  \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       char str[30];                                                   \
+       REAL_VALUE_TO_DECIMAL (VALUE, "%.20e", str);                    \
+       fprintf (FILE, "\t.double 0d%s\n", str);                        \
+      }                                                                        \
+  }
 
 /* This is how to output an assembler line defining a `float' constant.  */
 
-#define ASM_OUTPUT_FLOAT(FILE,VALUE)           \
-  fprintf (FILE, "\t.float 0d%.20e\n", (VALUE))
+#define ASM_OUTPUT_FLOAT(FILE, VALUE)                                  \
+  {                                                                    \
+    if (REAL_VALUE_ISINF (VALUE)                                       \
+        || REAL_VALUE_ISNAN (VALUE)                                    \
+       || REAL_VALUE_MINUS_ZERO (VALUE))                               \
+      {                                                                        \
+       long t;                                                         \
+       REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t);                       \
+       fprintf (FILE, "\t.long 0x%lx\n", t & 0xffffffff);              \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       char str[30];                                                   \
+       REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str);                  \
+       fprintf (FILE, "\t.float 0d%s\n", str);                         \
+      }                                                                        \
+  }
 
 /* This is how to output an assembler line defining an `int' constant.  */