(set_attr "prefix" "orig,maybe_evex,orig,maybe_evex")
(set_attr "mode" "V4SF,V4SF,V2SF,V2SF")])
+(define_insn "*vec_concatv4sf_0"
+ [(set (match_operand:V4SF 0 "register_operand" "=v")
+ (vec_concat:V4SF
+ (match_operand:V2SF 1 "nonimmediate_operand" "xm")
+ (match_operand:V2SF 2 "const0_operand" " C")))]
+ "TARGET_SSE2"
+ "%vmovq\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssemov")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "DF")])
+
;; Avoid combining registers from different units in a single alternative,
;; see comment above inline_secondary_memory_needed function in i386.c
(define_insn "vec_set<mode>_0"
(set_attr "prefix" "orig,maybe_evex,orig,orig,maybe_evex")
(set_attr "mode" "TI,TI,V4SF,V2SF,V2SF")])
+(define_insn "*vec_concatv4si_0"
+ [(set (match_operand:V4SI 0 "register_operand" "=v,x")
+ (vec_concat:V4SI
+ (match_operand:V2SI 1 "nonimmediate_operand" "xm,?!*y")
+ (match_operand:V2SI 2 "const0_operand" " C,C")))]
+ "TARGET_SSE2"
+ "@
+ %vmovq\t{%1, %0|%0, %1}
+ movq2dq\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssemov")
+ (set_attr "prefix" "maybe_vex,orig")
+ (set_attr "mode" "TI")
+ (set (attr "preferred_for_speed")
+ (if_then_else (eq_attr "alternative" "1")
+ (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
+ (symbol_ref "true")))])
+
;; movd instead of movq is required to handle broken assemblers.
(define_insn "vec_concatv2di"
[(set (match_operand:V2DI 0 "register_operand"
--- /dev/null
+/* PR target/53759 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx" } */
+
+#include <xmmintrin.h>
+
+void
+foo (__m128 *x, __m64 *y)
+{
+ __m128 a = _mm_add_ps (x[1], x[2]);
+ __m128 b = _mm_loadl_pi (a, y);
+ *x = _mm_add_ps (b, b);
+}
+
+/* { dg-final { scan-assembler "vmovlps\[ \\t\]" } } */
+/* { dg-final { scan-assembler-not "vshufps\[ \\t\]" } } */
--- /dev/null
+/* PR target/88278 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse2 -mno-sse3 -fgimple -masm=att" } */
+/* { dg-final { scan-assembler-times "movq\[ \t]+\\(" 2 } } */
+/* { dg-final { scan-assembler-not "punpcklqdq\[ \t]+" } } */
+/* { dg-final { scan-assembler-not "pxor\[ \t]+" } } */
+
+typedef unsigned char v16qi __attribute__((vector_size(16)));
+typedef unsigned char v8qi __attribute__((vector_size(8)));
+typedef unsigned int v4si __attribute__((vector_size(16)));
+typedef unsigned int v2si __attribute__((vector_size(8)));
+
+v16qi __GIMPLE foo (unsigned char *p)
+{
+ v8qi _2;
+ v16qi _3;
+
+bb_2:
+ _2 = __MEM <v8qi, 8> (p_1(D));
+ _3 = _Literal (v16qi) { _2, _Literal (v8qi) { _Literal (unsigned char) 0, _Literal (unsigned char) 0, _Literal (unsigned char) 0, _Literal (unsigned char) 0, _Literal (unsigned char) 0, _Literal (unsigned char) 0, _Literal (unsigned char) 0 } };
+ return _3;
+}
+
+
+v4si __GIMPLE bar (unsigned int *p)
+{
+ v2si _2;
+ v4si _3;
+
+bb_2:
+ _2 = __MEM <v2si, 32> (p_1(D));
+ _3 = _Literal (v4si) { _2, _Literal (v2si) { 0u, 0u } };
+ return _3;
+}