diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc index 3955929..2c82256 100644 --- a/gcc/simplify-rtx.cc +++ b/gcc/simplify-rtx.cc @@ -1404,22 +1404,32 @@ simplify_context::simplify_unary_operation_1 (rtx_code code, machine_mode mode, break; case FFS: - /* (ffs (*_extend )) = (ffs ) */ + /* (ffs (*_extend )) = (*_extend (ffs )). */ if (GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND) - return simplify_gen_unary (FFS, mode, XEXP (op, 0), - GET_MODE (XEXP (op, 0))); + { + temp = simplify_gen_unary (FFS, GET_MODE (XEXP (op, 0)), + XEXP (op, 0), GET_MODE (XEXP (op, 0))); + return simplify_gen_unary (GET_CODE (op), mode, temp, + GET_MODE (temp)); + } break; case POPCOUNT: switch (GET_CODE (op)) { case BSWAP: - case ZERO_EXTEND: - /* (popcount (zero_extend )) = (popcount ) */ + /* (popcount (bswap )) = (popcount ). */ return simplify_gen_unary (POPCOUNT, mode, XEXP (op, 0), GET_MODE (XEXP (op, 0))); + case ZERO_EXTEND: + /* (popcount (zero_extend )) = (zero_extend (popcount )). */ + temp = simplify_gen_unary (POPCOUNT, GET_MODE (XEXP (op, 0)), + XEXP (op, 0), GET_MODE (XEXP (op, 0))); + return simplify_gen_unary (ZERO_EXTEND, mode, temp, + GET_MODE (temp)); + case ROTATE: case ROTATERT: /* Rotations don't affect popcount. */ @@ -1438,11 +1448,16 @@ simplify_context::simplify_unary_operation_1 (rtx_code code, machine_mode mode, { case NOT: case BSWAP: - case ZERO_EXTEND: - case SIGN_EXTEND: return simplify_gen_unary (PARITY, mode, XEXP (op, 0), GET_MODE (XEXP (op, 0))); + case ZERO_EXTEND: + case SIGN_EXTEND: + temp = simplify_gen_unary (PARITY, GET_MODE (XEXP (op, 0)), + XEXP (op, 0), GET_MODE (XEXP (op, 0))); + return simplify_gen_unary (GET_CODE (op), mode, temp, + GET_MODE (temp)); + case ROTATE: case ROTATERT: /* Rotations don't affect parity. */