Commit f6ba6a91 by Richard Stallman

(LONG_DOUBLE_TYPE_SIZE): Set to 96, for XFmode support.

(ASM_OUTPUT_LONG_DOUBLE_OPERAND) New macro.
(ASM_OUTPUT_FLOAT, ASM_OUTPUT_DOUBLE): Use REAL_VALUE_... macros.
(ASM_OUTPUT_DOUBLE_OPERAND): Likewise.
(ASM_OUTPUT_FLOAT_OPERAND): Likewise.  Also, new argument CODE.
(ASM_OUTPUT_FLOAT): Delete special def for CROSS_COMPILE.
(ASM_OUTPUT_LONG_DOUBLE): New macro.
(PRINT_OPERAND_EXTRACT_FLOAT): Definitions deleted.
(PRINT_OPERAND_PRINT_FLOAT): Definitions deleted.

From-SVN: r3972
parent c1cfb2ae
/* Definitions of target machine for GNU compiler. Sun 68000/68020 version. /* Definitions of target machine for GNU compiler. Sun 68000/68020 version.
Copyright (C) 1987, 1988 Free Software Foundation, Inc. Copyright (C) 1987, 1988, 1993 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -141,6 +141,15 @@ extern int target_flags; ...@@ -141,6 +141,15 @@ extern int target_flags;
/* target machine storage layout */ /* target machine storage layout */
/* Define for XFmode extended real floating point support.
This will automatically cause REAL_ARITHMETIC to be defined. */
#define LONG_DOUBLE_TYPE_SIZE 96
/* Define if you don't want extended real, but do want to use the
software floating point emulator for REAL_ARITHMETIC and
decimal <-> binary conversion. */
/* #define REAL_ARITHMETIC */
/* Define this if most significant bit is lowest numbered /* Define this if most significant bit is lowest numbered
in instructions that operate on numbered bit-fields. in instructions that operate on numbered bit-fields.
This is true for 68020 insns such as bfins and bfexts. This is true for 68020 insns such as bfins and bfexts.
...@@ -1522,31 +1531,36 @@ __transfer_from_trampoline () \ ...@@ -1522,31 +1531,36 @@ __transfer_from_trampoline () \
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf (LABEL, "*%s%s%d", LOCAL_LABEL_PREFIX, PREFIX, NUM) sprintf (LABEL, "*%s%s%d", LOCAL_LABEL_PREFIX, PREFIX, NUM)
/* This is how to output a `long double' extended real constant. */
#define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
do { long l[3]; \
REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l); \
if (sizeof (int) == sizeof (long)) \
fprintf (FILE, "\t.long 0x%x,0x%x,0x%x\n", l[0], l[1], l[2]); \
else \
fprintf (FILE, "\t.long 0x%lx,0x%lx,0x%lx\n", l[0], l[1], l[2]); \
} while (0)
/* This is how to output an assembler line defining a `double' constant. */ /* This is how to output an assembler line defining a `double' constant. */
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
fprintf (FILE, "\t.double 0r%.20g\n", (VALUE)) do { char dstr[30]; \
REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
fprintf (FILE, "\t.double 0r%s\n", dstr); \
} while (0)
/* This is how to output an assembler line defining a `float' constant. */ /* This is how to output an assembler line defining a `float' constant. */
/* Sun's assembler can't handle floating constants written as floating.
However, when cross-compiling, always use that in case format differs. */
#ifdef CROSS_COMPILE
#define ASM_OUTPUT_FLOAT(FILE,VALUE) \ #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
fprintf (FILE, "\t.float 0r%.10g\n", (VALUE)) do { long l; \
REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
#else if (sizeof (int) == sizeof (long)) \
fprintf (FILE, "\t.long 0x%x\n", l); \
#define ASM_OUTPUT_FLOAT(FILE,VALUE) \ else \
do { union { float f; long l;} tem; \ fprintf (FILE, "\t.long 0x%lx\n", l); \
tem.f = (VALUE); \
fprintf (FILE, "\t.long 0x%x\n", tem.l); \
} while (0) } while (0)
#endif /* not CROSS_COMPILE */
/* This is how to output an assembler line defining an `int' constant. */ /* This is how to output an assembler line defining an `int' constant. */
#define ASM_OUTPUT_INT(FILE,VALUE) \ #define ASM_OUTPUT_INT(FILE,VALUE) \
...@@ -1649,13 +1663,41 @@ do { union { float f; long l;} tem; \ ...@@ -1649,13 +1663,41 @@ do { union { float f; long l;} tem; \
/* Output a float value (represented as a C double) as an immediate operand. /* Output a float value (represented as a C double) as an immediate operand.
This macro is a 68k-specific macro. */ This macro is a 68k-specific macro. */
#define ASM_OUTPUT_FLOAT_OPERAND(FILE,VALUE) \
asm_fprintf (FILE, "%I0r%.9g", (VALUE)) #define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \
do { \
if (CODE == 'f') \
{ \
char dstr[30]; \
REAL_VALUE_TO_DECIMAL (VALUE, "%.9g", dstr); \
asm_fprintf ((FILE), "%I0r%s", dstr); \
} \
else \
{ \
long l; \
REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
if (sizeof (int) == sizeof (long)) \
asm_fprintf ((FILE), "%I0x%x", l); \
else \
asm_fprintf ((FILE), "%I0x%lx", l); \
} \
} while (0)
/* Output a double value (represented as a C double) as an immediate operand. /* Output a double value (represented as a C double) as an immediate operand.
This macro is a 68k-specific macro. */ This macro is a 68k-specific macro. */
#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \ #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
asm_fprintf (FILE, "%I0r%.20g", (VALUE)) do { char dstr[30]; \
REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
asm_fprintf (FILE, "%I0r%s", dstr); \
} while (0)
/* Note, long double immediate operands are not actually
generated by m68k.md. */
#define ASM_OUTPUT_LONG_DOUBLE_OPERAND(FILE,VALUE) \
do { char dstr[30]; \
REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
asm_fprintf (FILE, "%I0r%s", dstr); \
} while (0)
/* Print operand X (an rtx) in assembler syntax to file FILE. /* Print operand X (an rtx) in assembler syntax to file FILE.
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
...@@ -1692,25 +1734,6 @@ do { union { float f; long l;} tem; \ ...@@ -1692,25 +1734,6 @@ do { union { float f; long l;} tem; \
|| (CODE) == '+' || (CODE) == '@' || (CODE) == '!' \ || (CODE) == '+' || (CODE) == '@' || (CODE) == '!' \
|| (CODE) == '$' || (CODE) == '&' || (CODE) == '/') || (CODE) == '$' || (CODE) == '&' || (CODE) == '/')
#ifdef HOST_WORDS_BIG_ENDIAN
#define PRINT_OPERAND_EXTRACT_FLOAT(X) \
u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X);
#else
#define PRINT_OPERAND_EXTRACT_FLOAT(X) \
u.i[0] = CONST_DOUBLE_HIGH (X); u.i[1] = CONST_DOUBLE_LOW (X);
#endif
#ifdef CROSS_COMPILE
#define PRINT_OPERAND_PRINT_FLOAT(CODE, FILE) \
ASM_OUTPUT_FLOAT_OPERAND (FILE, u1.f);
#else
#define PRINT_OPERAND_PRINT_FLOAT(CODE, FILE) \
{ if (CODE == 'f') \
ASM_OUTPUT_FLOAT_OPERAND (FILE, u1.f); \
else \
asm_fprintf (FILE, "%I0x%x", u1.i); }
#endif
/* A C compound statement to output to stdio stream STREAM the /* A C compound statement to output to stdio stream STREAM the
assembler syntax for an instruction operand X. X is an RTL assembler syntax for an instruction operand X. X is an RTL
expression. expression.
......
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