diff options
author | Richard Henderson <rth@redhat.com> | 2001-12-20 09:36:39 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-12-20 09:36:39 -0800 |
commit | 82af613ff3d8b809dc30ab61b1e6183039e36567 (patch) | |
tree | 556f131986cfdfc6d8a4c8cfee29362f8d9492b1 /gcc/varasm.c | |
parent | d1ee6d9bb7d3726a5c76f7d530962d4efeaa6e4d (diff) | |
download | gcc-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.c | 136 |
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. */ |