------- Comment #7 from ubizjak at gmail dot com 2008-02-05 13:58 ------- This is the diff of expand_float() between gcc-4.2 and gcc-4.3. The relevant part is logic at the top of the diff that has changed substantially:
--- 222 2008-02-05 14:52:52.000000000 +0100 +++ 111 2008-02-05 14:52:32.000000000 +0100 @@ -52,11 +52,10 @@ } } - /* 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; @@ -147,7 +146,7 @@ 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); @@ -169,7 +168,7 @@ if (GET_MODE_SIZE (GET_MODE (from)) < GET_MODE_SIZE (SImode)) from = convert_to_mode (SImode, from, unsignedp); - libfunc = convert_optab_libfunc (tab, GET_MODE (to), GET_MODE (from)); + libfunc = tab->handlers[GET_MODE (to)][GET_MODE (from)].libfunc; gcc_assert (libfunc); start_sequence (); -- ubizjak at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|ubizjak at gmail dot com |unassigned at gcc dot gnu | |dot org Status|ASSIGNED |NEW http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35083