OSDN Git Service

* jump.c (jump_optimize, follow_jumps, mark_jump_label): Disable some
[pf3gnuchains/gcc-fork.git] / gcc / recog.c
index 8d64cd9..3c7d14c 100644 (file)
@@ -1,5 +1,5 @@
 /* Subroutines used by or related to instruction recognition.
-   Copyright (C) 1987, 88, 91, 92, 93, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1987, 88, 91-5, 1996 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -871,7 +871,9 @@ register_operand (op, mode)
          && TEST_HARD_REG_BIT (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
                                REGNO (SUBREG_REG (op)))
          && (GET_MODE_SIZE (mode)
-             != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))))
+             != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
+         && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_INT
+         && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_FLOAT)
        return 0;
 #endif
 
@@ -1650,6 +1652,11 @@ constrain_operands (insn_code_num, strict)
 
          earlyclobber[opno] = 0;
 
+         /* A unary operator may be accepted by the predicate, but it
+            is irrelevant for matching contraints.  */
+         if (GET_RTX_CLASS (GET_CODE (op)) == '1')
+           op = XEXP (op, 0);
+
          if (GET_CODE (op) == SUBREG)
            {
              if (GET_CODE (SUBREG_REG (op)) == REG
@@ -1923,7 +1930,7 @@ constrain_operands (insn_code_num, strict)
                       || op_types[opno] != OP_OUT)
                      && opno != eopno
                      /* Ignore things like match_operator operands.  */
-                     && *constraints[opno] != 0
+                     && *insn_operand_constraint[insn_code_num][opno] != 0
                      && ! (matching_operands[opno] == eopno
                            && rtx_equal_p (recog_operand[opno],
                                            recog_operand[eopno]))