OSDN Git Service

* expr.c (force_operand): Use expand_fix and expand_float to
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Dec 2005 18:35:02 +0000 (18:35 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Dec 2005 18:35:02 +0000 (18:35 +0000)
implement integer <-> FP conversions instead of convert_to_mode.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109041 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c

index 7a3fccf..6d23fdc 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 322db4f..7a83b7e 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);
        }