}
*total = ix86_vec_cost (mode, cost->sse_op);
}
+ else if (TARGET_64BIT
+ && mode == TImode
+ && GET_CODE (XEXP (x, 0)) == ASHIFT
+ && GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
+ && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == DImode
+ && CONST_INT_P (XEXP (XEXP (x, 0), 1))
+ && INTVAL (XEXP (XEXP (x, 0), 1)) == 64
+ && GET_CODE (XEXP (x, 1)) == ZERO_EXTEND
+ && GET_MODE (XEXP (XEXP (x, 1), 0)) == DImode)
+ {
+ /* *concatditi3 is cheap. */
+ rtx op0 = XEXP (XEXP (XEXP (x, 0), 0), 0);
+ rtx op1 = XEXP (XEXP (x, 1), 0);
+ *total = (SUBREG_P (op0) && GET_MODE (SUBREG_REG (op0)) == DFmode)
+ ? COSTS_N_INSNS (1) /* movq. */
+ : set_src_cost (op0, DImode, speed);
+ *total += (SUBREG_P (op1) && GET_MODE (SUBREG_REG (op1)) == DFmode)
+ ? COSTS_N_INSNS (1) /* movq. */
+ : set_src_cost (op1, DImode, speed);
+ return true;
+ }
+ else if (TARGET_64BIT
+ && mode == TImode
+ && GET_CODE (XEXP (x, 0)) == AND
+ && REG_P (XEXP (XEXP (x, 0), 0))
+ && CONST_WIDE_INT_P (XEXP (XEXP (x, 0), 1))
+ && CONST_WIDE_INT_NUNITS (XEXP (XEXP (x, 0), 1)) == 2
+ && CONST_WIDE_INT_ELT (XEXP (XEXP (x, 0), 1), 0) == -1
+ && CONST_WIDE_INT_ELT (XEXP (XEXP (x, 0), 1), 1) == 0
+ && GET_CODE (XEXP (x, 1)) == ASHIFT
+ && GET_CODE (XEXP (XEXP (x, 1), 0)) == ZERO_EXTEND
+ && GET_MODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == DImode
+ && CONST_INT_P (XEXP (XEXP (x, 1), 1))
+ && INTVAL (XEXP (XEXP (x, 1), 1)) == 64)
+ {
+ /* *insvti_highpart is cheap. */
+ rtx op = XEXP (XEXP (XEXP (x, 1), 0), 0);
+ *total = COSTS_N_INSNS (1) + 1;
+ *total += (SUBREG_P (op) && GET_MODE (SUBREG_REG (op)) == DFmode)
+ ? COSTS_N_INSNS (1) /* movq. */
+ : set_src_cost (op, DImode, speed);
+ return true;
+ }
else if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
*total = cost->add * 2;
else