OSDN Git Service

* optabs.c (expand_binop): Minor cleanup.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Sep 2002 01:29:21 +0000 (01:29 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Sep 2002 01:29:21 +0000 (01:29 +0000)
        (expand_twoval_binop): Convert CONST_INTs like in expand_binop.

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

gcc/ChangeLog
gcc/optabs.c

index 07a8622..200f20f 100644 (file)
@@ -1,3 +1,8 @@
+2002-09-09  Eric Botcazou  ebotcazou@libertysurf.fr
+  
+       * optabs.c (expand_binop): Minor cleanup.
+       (expand_twoval_binop): Convert CONST_INTs like in expand_binop.
+
 2002-09-11  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * print-tree.c (print_node): Print the restrict qualifier.
index a7dae46..f098aa6 100644 (file)
@@ -783,24 +783,20 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
         seem that we don't need to convert CONST_INTs, but we do, so
         that they're properly zero-extended or sign-extended for their
         modes; shift operations are an exception, because the second
-        operand needs not be extended to the mode of the result.  */
+        operand need not be extended to the mode of the result.  */
 
-      if (GET_MODE (op0) != mode0
-         && mode0 != VOIDmode)
+      if (GET_MODE (op0) != mode0 && mode0 != VOIDmode)
        xop0 = convert_modes (mode0,
                              GET_MODE (op0) != VOIDmode
                              ? GET_MODE (op0)
                              : mode,
                              xop0, unsignedp);
 
-      if (GET_MODE (xop1) != mode1
-         && mode1 != VOIDmode)
+      if (GET_MODE (op1) != mode1 && mode1 != VOIDmode)
        xop1 = convert_modes (mode1,
                              GET_MODE (op1) != VOIDmode
                              ? GET_MODE (op1)
-                             : ! shift_op
-                             ? mode
-                             : mode1,
+                             : (shift_op ? mode1 : mode),
                              xop1, unsignedp);
 
       /* Now, if insn's predicates don't allow our operands, put them into
@@ -2235,13 +2231,25 @@ expand_twoval_binop (binoptab, op0, op1, targ0, targ1, unsignedp)
       rtx pat;
       rtx xop0 = op0, xop1 = op1;
 
-      /* In case this insn wants input operands in modes different from the
-        result, convert the operands.  */
-      if (GET_MODE (op0) != VOIDmode && GET_MODE (op0) != mode0)
-       xop0 = convert_to_mode (mode0, xop0, unsignedp);
+      /* In case the insn wants input operands in modes different from
+        those of the actual operands, convert the operands.  It would
+        seem that we don't need to convert CONST_INTs, but we do, so
+        that they're properly zero-extended or sign-extended for their
+        modes.  */
+
+      if (GET_MODE (op0) != mode0 && mode0 != VOIDmode)
+       xop0 = convert_modes (mode0,
+                             GET_MODE (op0) != VOIDmode
+                             ? GET_MODE (op0)
+                             : mode,
+                             xop0, unsignedp);
 
-      if (GET_MODE (op1) != VOIDmode && GET_MODE (op1) != mode1)
-       xop1 = convert_to_mode (mode1, xop1, unsignedp);
+      if (GET_MODE (op1) != mode1 && mode1 != VOIDmode)
+       xop1 = convert_modes (mode1,
+                             GET_MODE (op1) != VOIDmode
+                             ? GET_MODE (op1)
+                             : mode,
+                             xop1, unsignedp);
 
       /* Now, if insn doesn't accept these operands, put them into pseudos.  */
       if (! (*insn_data[icode].operand[1].predicate) (xop0, mode0))