From b409761a1f5f5363a16d46df667508440c8dfd4b Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Mon, 29 Sep 2003 21:29:11 +0000 Subject: [PATCH] varasm.c (assemble_real): Use real_to_target directly... * varasm.c (assemble_real): Use real_to_target directly, calculate the number of significant elements of the result array and write them out in a loop, instead of using a giant switch statement to pick the correct REAL_VALUE_TO_TARGET_* macro. From-SVN: r71917 --- gcc/ChangeLog | 32 ++++++++++++-------- gcc/varasm.c | 97 +++++++++++++++++------------------------------------------ 2 files changed, 47 insertions(+), 82 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78365cd..5e7f10b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2003-09-29 Zack Weinberg + + * varasm.c (assemble_real): Use real_to_target directly, + calculate the number of significant elements of the result + array and write them out in a loop, instead of using a giant + switch statement to pick the correct REAL_VALUE_TO_TARGET_* + macro. + Mon Sep 29 22:59:05 CEST 2003 Jan Hubicka PR c++/12175 @@ -397,7 +405,7 @@ Mon Sep 29 19:05:46 CEST 2003 Jan Hubicka PR pch/12112 * gcc/cppfiles.c (pch_open_file): Return based on combined - result of all files. + result of all files. (validate_pch): Return validate flag for current file. 2003-09-24 Roger Sayle @@ -1007,7 +1015,7 @@ Mon Sep 29 19:05:46 CEST 2003 Jan Hubicka * cgraph.c: Fix typo in debugging output. 2003-09-19 T. Papadopoulo - Eric Botcazou + Eric Botcazou PR target/12166 * config/sparc/sol2-c1.asm (start): Set __Argv if GCRT1. @@ -1265,10 +1273,10 @@ Mon Sep 29 19:05:46 CEST 2003 Jan Hubicka 2003-09-16 Volker Reichelt - * doc/invoke.texi (Warning Options): Add missing hyphen before - "Wimport". Change "-Wno-endif-labels" to "-Wendif-labels". - Move "-Wold-style-definition" to the C-only section. - Fix the ordering of the warning options. + * doc/invoke.texi (Warning Options): Add missing hyphen before + "Wimport". Change "-Wno-endif-labels" to "-Wendif-labels". + Move "-Wold-style-definition" to the C-only section. + Fix the ordering of the warning options. 2003-09-15 Zdenek Dvorak Jeff Law @@ -1301,7 +1309,7 @@ Mon Sep 29 19:05:46 CEST 2003 Jan Hubicka of choose_ready for non-dfa insn scheduling. 2003-09-15 Andreas Jaeger - Kaveh R. Ghazi + Kaveh R. Ghazi * doc/invoke.texi (Warning Options): Describe -Wold-style-definition. * c-opts.c (c_common_handle_option): Handle OPT_Wold_style_definition. @@ -1630,7 +1638,7 @@ Mon Sep 29 19:05:46 CEST 2003 Jan Hubicka * Makefile.in: Revert yesterday's change. 2003-09-08 Bernardo Innocenti - Peter Barada + Peter Barada * config/m68k/coff.h (REGISTER_NAMES): Add fake register `argptr' * config/m68k/hp320.h (REGISTER_NAMES): Likewise. @@ -1990,10 +1998,10 @@ Mon Sep 29 19:05:46 CEST 2003 Jan Hubicka 2003-09-04 Nick Clifton * config.gcc (v850e-*-*): Use t-v850e makefile fragment. - * config/v850/t-v850: Only produce one extra multilib - for - the v850e. - * config/v850/t-v850e: New file: Only produce one extra - multilib - for the v850. + * config/v850/t-v850: Only produce one extra multilib - for + the v850e. + * config/v850/t-v850e: New file: Only produce one extra + multilib - for the v850. 2003-09-04 Jakub Jelinek diff --git a/gcc/varasm.c b/gcc/varasm.c index e6d0189..47db821 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1890,77 +1890,34 @@ void assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align) { long data[4]; - long l; - unsigned int nalign = min_align (align, 32); - - switch (BITS_PER_UNIT) + int i; + int bitsize, nelts, nunits, units_per; + + /* This is hairy. We have a quantity of known bitsize. real_to_target + will put it into an array of *host* longs, 32 bits per element + (even if long is more than 32 bits). We need to determine the + number of array elements that are occupied (nelts) and the number + of *target* min-addressable units that will be occupied in the + object file (nunits). We can assume that BITS_PER_UNIT divides + the mode's bitsize evenly, but we can not assume that 32 does. */ + bitsize = GET_MODE_BITSIZE (mode); + nunits = bitsize / BITS_PER_UNIT; + nelts = CEIL (bitsize, 32); + units_per = 32 / BITS_PER_UNIT; + + real_to_target (data, &d, mode); + + /* Put out the first word with the specified alignment. */ + assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1); + nunits -= units_per; + + /* Subsequent words need only 32-bit alignment. */ + align = min_align (align, 32); + + for (i = 1; i < nelts; i++) { - 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; - - 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; - - 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; - - default: - abort (); + assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1); + nunits -= units_per; } } -- 2.7.4