bool
riscv_expand_block_move (rtx dest, rtx src, rtx length)
{
- if ((TARGET_VECTOR && !TARGET_XTHEADVECTOR)
+ if (TARGET_VECTOR
&& stringop_strategy & STRATEGY_VECTOR)
{
bool ok = riscv_vector::expand_block_move (dest, src, length, false);
rtx avl = length_in;
HOST_WIDE_INT potential_ew = max_ew;
- if (!TARGET_VECTOR || !(stringop_strategy & STRATEGY_VECTOR))
+ if (!TARGET_VECTOR
+ || !(stringop_strategy & STRATEGY_VECTOR))
return false;
+ if (TARGET_XTHEADVECTOR
+ && (!CONST_INT_P (length_in)
+ || known_lt (INTVAL (length_in), BYTES_PER_RISCV_VECTOR)))
+ return false;
+
int max_lmul = TARGET_MAX_LMUL;
if (rvv_max_lmul == RVV_CONV_DYNAMIC)
max_lmul = RVV_M1;
HOST_WIDE_INT length = INTVAL (length_in);
+ if (TARGET_XTHEADVECTOR
+ && known_lt (length, BYTES_PER_RISCV_VECTOR))
+ return false;
+
/* If it's tiny, default operation is likely better; maybe worth
considering fractional lmul in the future as well. */
if (length < (TARGET_MIN_VLEN / 8))
-/* { dg-do compile { target { { ! riscv_abi_e } && rv32 } } } */
-/* { dg-options "-march=rv32gc_xtheadvector -O2" } */
+/* { dg-do compile { target { ! riscv_abi_e } } } */
+/* { dg-options "-march=rv32gc_xtheadvector -O2 -mabi=ilp32d " } */
/* { dg-final { check-function-bodies "**" "" } } */
/*
}
/*
-** foo0_7:
+** foo0_7: { xfail *-*-* }
** li\t[a-x0-9]+,7
** th.vsetvli\tzero,[a-x0-9]+,e8,m1
** th\.vmv\.v\.i\tv[0-9],0
}
/*
-** foo1_5:
+** foo1_5: { xfail *-*-* }
** li\t[a-x0-9]+,5
** th.vsetvli\tzero,[a-x0-9]+,e8,m1
** th\.vmv\.v\.i\tv[0-9],1