aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-12-20 09:36:39 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-12-20 09:36:39 -0800
commit82af613ff3d8b809dc30ab61b1e6183039e36567 (patch)
tree556f131986cfdfc6d8a4c8cfee29362f8d9492b1 /gcc/varasm.c
parentd1ee6d9bb7d3726a5c76f7d530962d4efeaa6e4d (diff)
downloadgcc-82af613ff3d8b809dc30ab61b1e6183039e36567.zip
gcc-82af613ff3d8b809dc30ab61b1e6183039e36567.tar.gz
gcc-82af613ff3d8b809dc30ab61b1e6183039e36567.tar.bz2
varasm.c (assemble_real): Use REAL_VALUE_TO_x and assemble_integer to emit floating point values.
* varasm.c (assemble_real): Use REAL_VALUE_TO_x and assemble_integer to emit floating point values. (assemble_real_1): Remove. * 1750a/1750a.c (real_value_to_target_single): New. (real_value_to_target_double): New. * 1750a/1750a.h (TARGET_FLOAT_FORMAT): New. (REAL_VALUE_TO_TARGET_SINGLE): New. (REAL_VALUE_TO_TARGET_DOUBLE): New. * 1750a/1750a-protos.h: Update. * 1750a/1750a.h, a29k/a29k.h, alpha/alpha.h, alpha/unicosmk.h, alpha/vms.h, arc/arc.h, arm/aof.h, arm/aout.h, avr/avr.c, avr/avr.h, c4x/c4x.h, clipper/clix.h, convex/convex.h, cris/cris.h, d30v/d30v.h, dsp16xx/dsp16xx.c, dsp16xx/dsp16xx.h, elxsi/elxsi.h, fr30/fr30.h, h8300/h8300.h, i370/i370.h, i386/i386.h, i386/i386elf.h, i386/next.h, i386/ptx4-i.h, i386/sysv4.h, i860/fx2800.h, i860/i860.h, i860/paragon.h, i860/sysv4.h, i960/i960-protos.h, i960/i960.c, i960/i960.h, ia64/ia64.h, m32r/m32r.h, m68hc11/m68hc11.c, m68hc11/m68hc11.h, m68k/3b1.h, m68k/altos3068.h, m68k/crds.h, m68k/dpx2.h, m68k/hp320.h, m68k/m68k.h, m68k/mot3300.h, m68k/news.h, m68k/next.h, m68k/next21.h, m68k/sgs.h, m68k/sun2o4.h, m68k/sun3.h, m68k/tower-as.h, m88k/m88k.h, mcore/mcore.h, mips/mips-protos.h, mips/mips.c, mips/mips.h, mmix/mmix-protos.h, mmix/mmix.c, mmix/mmix.h, mn10200/mn10200.h, mn10300/mn10300.h, ns32k/encore.h, ns32k/ns32k.h, pa/long_double.h, pa/pa.h, pdp11/pdp11.h, pj/pj.h, romp/romp.c, romp/romp.h, rs6000/rs6000.h, s390/linux.h, sh/sh.h, sparc/sparc.h, stormy16/stormy16.h, v850/v850.h, vax/vax.h, vax/vaxv.h, we32k/we32k.h, doc/tm.texi: Remove ASM_OUTPUT_FLOAT, ASM_OUTPUT_DOUBLE, ASM_OUTPUT_LONG_DOUBLE, ASM_OUTPUT_BYTE_FLOAT, ASM_OUTPUT_SHORT_FLOAT, ASM_OUTPUT_THREE_QUARTER_FLOAT, and all associated support routines. From-SVN: r48207
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c136
1 files changed, 67 insertions, 69 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 87d81e3..3435f77 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -140,7 +140,6 @@ static HOST_WIDE_INT const_alias_set;
static const char *strip_reg_name PARAMS ((const char *));
static int contains_pointers_p PARAMS ((tree));
-static void assemble_real_1 PARAMS ((PTR));
static void decode_addr_const PARAMS ((tree, struct addr_const *));
static int const_hash PARAMS ((tree));
static int compare_constant PARAMS ((tree,
@@ -2038,87 +2037,86 @@ assemble_integer (x, size, align, force)
return false;
}
-/* Assemble the floating-point constant D into an object of size MODE. */
-struct assemble_real_args
-{
- REAL_VALUE_TYPE *d;
- enum machine_mode mode;
-};
-
-static void
-assemble_real_1 (p)
- PTR p;
+void
+assemble_real (d, mode, align)
+ REAL_VALUE_TYPE d;
+ enum machine_mode mode;
+ unsigned int align;
{
- struct assemble_real_args *args = (struct assemble_real_args *) p;
- REAL_VALUE_TYPE *d = args->d;
- enum machine_mode mode = args->mode;
+ long data[4];
+ long l;
+ unsigned int nalign = min_align (align, 32);
- switch (mode)
+ switch (BITS_PER_UNIT)
{
-#ifdef ASM_OUTPUT_BYTE_FLOAT
- case QFmode:
- ASM_OUTPUT_BYTE_FLOAT (asm_out_file, *d);
- break;
-#endif
-#ifdef ASM_OUTPUT_SHORT_FLOAT
- case HFmode:
- ASM_OUTPUT_SHORT_FLOAT (asm_out_file, *d);
- break;
-#endif
-#ifdef ASM_OUTPUT_THREE_QUARTER_FLOAT
- case TQFmode:
- ASM_OUTPUT_THREE_QUARTER_FLOAT (asm_out_file, *d);
- break;
-#endif
-#ifdef ASM_OUTPUT_FLOAT
- case SFmode:
- ASM_OUTPUT_FLOAT (asm_out_file, *d);
+ case 8:
+ switch (mode)
+ {
+ case SFmode:
+ REAL_VALUE_TO_TARGET_SINGLE (d, l);
+ assemble_integer (GEN_INT (l), 4, align, 1);
+ break;
+ case DFmode:
+ REAL_VALUE_TO_TARGET_DOUBLE (d, data);
+ assemble_integer (GEN_INT (data[0]), 4, align, 1);
+ assemble_integer (GEN_INT (data[1]), 4, nalign, 1);
+ break;
+ case XFmode:
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (d, data);
+ assemble_integer (GEN_INT (data[0]), 4, align, 1);
+ assemble_integer (GEN_INT (data[1]), 4, nalign, 1);
+ assemble_integer (GEN_INT (data[2]), 4, nalign, 1);
+ break;
+ case TFmode:
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (d, data);
+ assemble_integer (GEN_INT (data[0]), 4, align, 1);
+ assemble_integer (GEN_INT (data[1]), 4, nalign, 1);
+ assemble_integer (GEN_INT (data[2]), 4, nalign, 1);
+ assemble_integer (GEN_INT (data[3]), 4, nalign, 1);
+ break;
+ default:
+ abort ();
+ }
break;
-#endif
-#ifdef ASM_OUTPUT_DOUBLE
- case DFmode:
- ASM_OUTPUT_DOUBLE (asm_out_file, *d);
+ case 16:
+ switch (mode)
+ {
+ case HFmode:
+ REAL_VALUE_TO_TARGET_SINGLE (d, l);
+ assemble_integer (GEN_INT (l), 2, align, 1);
+ break;
+ case TQFmode:
+ REAL_VALUE_TO_TARGET_DOUBLE (d, data);
+ assemble_integer (GEN_INT (data[0]), 2, align, 1);
+ assemble_integer (GEN_INT (data[1]), 1, nalign, 1);
+ break;
+ default:
+ abort ();
+ }
break;
-#endif
-#ifdef ASM_OUTPUT_LONG_DOUBLE
- case XFmode:
- case TFmode:
- ASM_OUTPUT_LONG_DOUBLE (asm_out_file, *d);
+ case 32:
+ switch (mode)
+ {
+ case QFmode:
+ REAL_VALUE_TO_TARGET_SINGLE (d, l);
+ assemble_integer (GEN_INT (l), 1, align, 1);
+ break;
+ case HFmode:
+ REAL_VALUE_TO_TARGET_DOUBLE (d, data);
+ assemble_integer (GEN_INT (data[0]), 1, align, 1);
+ assemble_integer (GEN_INT (data[1]), 1, nalign, 1);
+ break;
+ default:
+ abort ();
+ }
break;
-#endif
default:
abort ();
}
}
-
-void
-assemble_real (d, mode, align)
- REAL_VALUE_TYPE d;
- enum machine_mode mode;
- unsigned int align;
-{
- struct assemble_real_args args;
- args.d = &d;
- args.mode = mode;
-
- /* We cannot emit unaligned floating point constants. This is slightly
- complicated in that we don't know what "unaligned" means exactly. */
-#ifdef BIGGEST_FIELD_ALIGNMENT
- if (align >= BIGGEST_FIELD_ALIGNMENT)
- ;
- else
-#endif
- if (align < GET_MODE_ALIGNMENT (mode))
- abort ();
-
- if (do_float_handler (assemble_real_1, (PTR) &args))
- return;
-
- internal_error ("floating point trap outputting a constant");
-}
/* Here we combine duplicate floating constants to make
CONST_DOUBLE rtx's, and force those out to memory when necessary. */