]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expr.c (force_operand): Use expand_fix and expand_float to implement integer <->...
authorRoger Sayle <roger@eyesopen.com>
Sat, 24 Dec 2005 18:35:02 +0000 (18:35 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 24 Dec 2005 18:35:02 +0000 (18:35 +0000)
* expr.c (force_operand): Use expand_fix and expand_float to
implement integer <-> FP conversions instead of convert_to_mode.

From-SVN: r109041

gcc/ChangeLog
gcc/expr.c

index 7a3fccff17500a38f1ef778ec49a15fd4ac4283e..6d23fdc1121a4a456f8dec5cec14c8f39bd81853 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-24  Roger Sayle  <roger@eyesopen.com>
+
+       * expr.c (force_operand): Use expand_fix and expand_float to
+       implement integer <-> FP conversions instead of convert_to_mode.
+
 2005-12-24  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/23171
index 322db4ff27380ab39c0d14fb2961016769a019f9..7a83b7e317f75656c2230d6799e95335e658639f 100644 (file)
@@ -5805,15 +5805,6 @@ force_operand (rtx value, rtx target)
       return subtarget;
     }
 
-  if (code == ZERO_EXTEND || code == SIGN_EXTEND)
-    {
-      if (!target)
-       target = gen_reg_rtx (GET_MODE (value));
-      convert_move (target, force_operand (XEXP (value, 0), NULL),
-                   code == ZERO_EXTEND);
-      return target;
-    }
-
   if (ARITHMETIC_P (value))
     {
       op2 = XEXP (value, 1);
@@ -5885,17 +5876,27 @@ force_operand (rtx value, rtx target)
     }
   if (UNARY_P (value))
     {
-      int unsignedp = 0;
-
+      if (!target)
+       target = gen_reg_rtx (GET_MODE (value));
       op1 = force_operand (XEXP (value, 0), NULL_RTX);
       switch (code)
        {
-       case ZERO_EXTEND: case UNSIGNED_FIX: case UNSIGNED_FLOAT:
-         unsignedp = 1;
-         /* fall through.  */
+       case ZERO_EXTEND:
+       case SIGN_EXTEND:
        case TRUNCATE:
-       case SIGN_EXTEND: case FIX: case FLOAT:
-         return convert_to_mode (GET_MODE (value), op1, unsignedp);
+         convert_move (target, op1, code == ZERO_EXTEND);
+         return target;
+
+       case FIX:
+       case UNSIGNED_FIX:
+         expand_fix (target, op1, code == UNSIGNED_FIX);
+         return target;
+
+       case FLOAT:
+       case UNSIGNED_FLOAT:
+         expand_float (target, op1, code == UNSIGNED_FLOAT);
+         return target;
+
        default:
          return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
        }