@@ -434,3 +434,6 @@ (define_address_constraint "jb"
(and (match_operand 0 "vsib_address_operand")
(not (and (match_test "TARGET_APX_EGPR")
(match_test "x86_extended_rex2reg_mentioned_p (op)")))))
+
+(define_register_constraint "jc"
+ "TARGET_APX_EGPR && !TARGET_AVX ? GENERAL_GPR16 : GENERAL_REGS")
@@ -2454,8 +2454,8 @@ (define_insn "*movoi_internal_avx"
(set_attr "mode" "OI")])
(define_insn "*movti_internal"
- [(set (match_operand:TI 0 "nonimmediate_operand" "=!r ,o ,v,v ,v ,m,?r,?Yd")
- (match_operand:TI 1 "general_operand" "riFo,re,C,BC,vm,v,Yd,r"))]
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=!r ,o ,v,v ,v ,m,?jc,?Yd")
+ (match_operand:TI 1 "general_operand" "riFo,re,C,BC,vm,v,Yd,jc"))]
"(TARGET_64BIT
&& !(MEM_P (operands[0]) && MEM_P (operands[1])))
|| (TARGET_SSE
@@ -2537,9 +2537,9 @@ (define_split
(define_insn "*movdi_internal"
[(set (match_operand:DI 0 "nonimmediate_operand"
- "=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r,?*y,?Yv,?v,?v,m ,m,?r ,?*Yd,?r,?v,?*y,?*x,*k,*k ,*r,*m,*k")
+ "=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r,?*y,?Yv,?v,?v,m ,m,?jc,?*Yd,?r,?v,?*y,?*x,*k,*k ,*r,*m,*k")
(match_operand:DI 1 "general_operand"
- "riFo,riF,Z,rem,i,re,C ,*y,Bk ,*y,*y,r ,C ,?v,Bk,?v,v,*Yd,r ,?v,r ,*x ,*y ,*r,*kBk,*k,*k,CBC"))]
+ "riFo,riF,Z,rem,i,re,C ,*y,Bk ,*y,*y,r ,C ,?v,Bk,?v,v,*Yd,jc ,?v,r ,*x ,*y ,*r,*kBk,*k,*k,CBC"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))
&& ix86_hardreg_mov_ok (operands[0], operands[1])"
{
new file mode 100644
@@ -0,0 +1,24 @@
+/* PR target/112394 */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-msse4.1 -m64 -O -mapxf" } */
+
+typedef int __attribute__((__vector_size__ (8))) A;
+typedef int __attribute__((__vector_size__ (16))) B;
+typedef char __attribute__((__vector_size__ (4))) C;
+typedef char __attribute__((__vector_size__ (32))) D;
+typedef _Complex __int128 CU;
+typedef _Float16 __attribute__((__vector_size__ (8))) F;
+D d;
+B b;
+CU gcu;
+
+int
+foo (char c, int, int, int, int, CU cu, int x)
+{
+ d /= c | d;
+ F f = __builtin_convertvector (b, F);
+ cu /= gcu;
+ A a = (A) f;
+ int i = cu + x;
+ return ((C) a[0])[1] + i + c;
+}