diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/optabs.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr101282.c | 18 |
2 files changed, 24 insertions, 5 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index ebed78f..019bbb6 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5488,20 +5488,21 @@ expand_fix (rtx to, rtx from, int unsignedp) if (icode != CODE_FOR_nothing) { rtx_insn *last = get_last_insn (); + rtx from1 = from; if (fmode != GET_MODE (from)) - from = convert_to_mode (fmode, from, 0); + from1 = convert_to_mode (fmode, from, 0); if (must_trunc) { - rtx temp = gen_reg_rtx (GET_MODE (from)); - from = expand_unop (GET_MODE (from), ftrunc_optab, from, - temp, 0); + rtx temp = gen_reg_rtx (GET_MODE (from1)); + from1 = expand_unop (GET_MODE (from1), ftrunc_optab, from1, + temp, 0); } if (imode != GET_MODE (to)) target = gen_reg_rtx (imode); - if (maybe_emit_unop_insn (icode, target, from, + if (maybe_emit_unop_insn (icode, target, from1, doing_unsigned ? UNSIGNED_FIX : FIX)) { if (target != to) diff --git a/gcc/testsuite/gcc.target/i386/pr101282.c b/gcc/testsuite/gcc.target/i386/pr101282.c new file mode 100644 index 0000000..2148b92 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr101282.c @@ -0,0 +1,18 @@ +/* { dg-do run { target { ia32 } } } */ +/* { dg-options "-Os -march=i686 -mfpmath=sse -msse2" } */ + +#include<stdlib.h> +int +main (void) +{ + static volatile unsigned int ivin, ivout; + static volatile _Float16 fv1, fv2; + ivin = ((unsigned int)1); + fv1 = ((unsigned int)1); + fv2 = ivin; + ivout = fv2; + if (ivout != ((unsigned int)1)) + abort (); + + exit (0); +} |