aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorJanis Johnson <janis187@us.ibm.com>2007-09-06 17:15:55 +0000
committerJanis Johnson <janis@gcc.gnu.org>2007-09-06 17:15:55 +0000
commitfcde2932c1b74748508d6d229b556e53f8fa971a (patch)
tree4884c12a844106036e0f76542407dc878198058d /gcc/optabs.c
parent48492bdf79b6ccaa27f806d46c791a7a18529c16 (diff)
downloadgcc-fcde2932c1b74748508d6d229b556e53f8fa971a.zip
gcc-fcde2932c1b74748508d6d229b556e53f8fa971a.tar.gz
gcc-fcde2932c1b74748508d6d229b556e53f8fa971a.tar.bz2
Revert:
2007-09-06 Jan Hubicka <jh@suse.cz> * i386.c (ix86_expand_lround, ix86_expand_round): Update call of real_2expN. 2007-09-06 Richard Sandiford <richard@codesourcery.com> * config/mips/mips.md (fixuns_truncdfsi2, fixuns_truncdfdi2) (fixuns_truncsfsi2, fixuns_truncsfdi2): Update calls to real_2expN. 2007-09-05 Janis Johnson <janis187@us.ibm.com> * optabs.c (expand_float): Convert unsigned integer as signed only if it provides sufficient accuracy; add mode argument to real_2expN. (expand_fix): Fix comment typos; extend binary float into mode wider than destination for converion to unsigned integer; add mode argument to real_2expN. * real.c (real_2expN): Add mode argument to special-case decimal float values. * real.h (real_2expN): Ditto. * fixed-value.c (check_real_for_fixed_mode): Add mode argument to real_2expN. (fixed_from_string): Ditto. (fixed_to_decimal): Ditto. (fixed_convert_from_real): Ditto. (real_convert_from_fixed): Ditto. * config/rs6000/rs6000.md (FP): Include DD and TD modes. * config/rs6000/dfp.md (extendddtd2, adddd3, addtd3, subdd3, subtd3, muldd3, multd3, divdd3, divtd3, cmpdd_internal1, cmptd_internal1, floatditd2, ftruncdd2, fixdddi2, ftrunctd2, fixddi2): New. From-SVN: r128193
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 6a78fbc..ff4c3dd 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5121,11 +5121,10 @@ expand_float (rtx to, rtx from, int unsignedp)
}
}
- /* Unsigned integer, and no way to convert directly. Convert as signed,
- then unconditionally adjust the result. For decimal float values we
- do this only if we have already determined that a signed conversion
- provides sufficient accuracy. */
- if (unsignedp && (can_do_signed || !DECIMAL_FLOAT_MODE_P (GET_MODE (to))))
+ /* Unsigned integer, and no way to convert directly. For binary
+ floating point modes, convert as signed, then conditionally adjust
+ the result. */
+ if (unsignedp && can_do_signed && !DECIMAL_FLOAT_MODE_P (GET_MODE (to)))
{
rtx label = gen_label_rtx ();
rtx temp;
@@ -5216,7 +5215,7 @@ expand_float (rtx to, rtx from, int unsignedp)
0, label);
- real_2expN (&offset, GET_MODE_BITSIZE (GET_MODE (from)), fmode);
+ real_2expN (&offset, GET_MODE_BITSIZE (GET_MODE (from)));
temp = expand_binop (fmode, add_optab, target,
CONST_DOUBLE_FROM_REAL_VALUE (offset, fmode),
target, 0, OPTAB_LIB_WIDEN);
@@ -5327,16 +5326,14 @@ expand_fix (rtx to, rtx from, int unsignedp)
anything with a wider integer mode.
This code used to extend FP value into mode wider than the destination.
- This is needed for decimal float modes which cannot accurately
- represent one plus the highest signed number of the same size, but
- not for binary modes. Consider, for instance conversion from SFmode
+ This is not needed. Consider, for instance conversion from SFmode
into DImode.
The hot path through the code is dealing with inputs smaller than 2^63
and doing just the conversion, so there is no bits to lose.
In the other path we know the value is positive in the range 2^63..2^64-1
- inclusive. (as for other input overflow happens and result is undefined)
+ inclusive. (as for other imput overflow happens and result is undefined)
So we know that the most important bit set in mantissa corresponds to
2^63. The subtraction of 2^63 should not generate any rounding as it
simply clears out that bit. The rest is trivial. */
@@ -5344,16 +5341,15 @@ expand_fix (rtx to, rtx from, int unsignedp)
if (unsignedp && GET_MODE_BITSIZE (GET_MODE (to)) <= HOST_BITS_PER_WIDE_INT)
for (fmode = GET_MODE (from); fmode != VOIDmode;
fmode = GET_MODE_WIDER_MODE (fmode))
- if (CODE_FOR_nothing != can_fix_p (GET_MODE (to), fmode, 0, &must_trunc)
- && (!DECIMAL_FLOAT_MODE_P (fmode)
- || GET_MODE_BITSIZE (fmode) > GET_MODE_BITSIZE (GET_MODE (to))))
+ if (CODE_FOR_nothing != can_fix_p (GET_MODE (to), fmode, 0,
+ &must_trunc))
{
int bitsize;
REAL_VALUE_TYPE offset;
rtx limit, lab1, lab2, insn;
bitsize = GET_MODE_BITSIZE (GET_MODE (to));
- real_2expN (&offset, bitsize - 1, fmode);
+ real_2expN (&offset, bitsize - 1);
limit = CONST_DOUBLE_FROM_REAL_VALUE (offset, fmode);
lab1 = gen_label_rtx ();
lab2 = gen_label_rtx ();