@@ -4392,6 +4392,11 @@ (define_split
operands[4] = simplify_gen_subreg (V2DFmode, operands[1], DFmode, 0);
emit_insn (gen_vec_dupv2df (operands[4], operands[1]));
}
+ else if (EXT_REX_SSE_REG_P (operands[4]))
+ /* Emit *vec_concatv2df. */
+ emit_insn (gen_rtx_SET (operands[4],
+ gen_rtx_VEC_CONCAT (V2DFmode, operands[1],
+ CONST0_RTX (DFmode))));
else
emit_insn (gen_sse2_loadlpd (operands[4],
CONST0_RTX (V2DFmode), operands[1]));
@@ -0,0 +1,11 @@
+/* PR target/70086 */
+/* { dg-do compile } */
+/* { dg-options "-mtune=barcelona -mavx512vl -ffloat-store" } */
+
+float
+foo (float a, float b, double c, float d, double e, float f)
+{
+ e -= d;
+ d *= e;
+ return e + d;
+}
@@ -0,0 +1,12 @@
+/* PR target/70086 */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mtune=barcelona -mavx512vl" } */
+
+float
+foo (double *p)
+{
+ register float xmm16 __asm ("xmm16");
+ xmm16 = *p;
+ asm volatile ("" : "+v" (xmm16));
+ return xmm16;
+}