@@ -25608,7 +25608,7 @@ ix86_ternlog_idx (rtx op, rtx *args)
case VEC_DUPLICATE:
if (!bcst_mem_operand (op, GET_MODE (op)))
return -1;
- /* FALLTHRU */
+ goto do_mem_operand;
case MEM:
if (!memory_operand (op, GET_MODE (op)))
@@ -25620,23 +25620,52 @@ ix86_ternlog_idx (rtx op, rtx *args)
/* FALLTHRU */
case CONST_VECTOR:
+do_mem_operand:
if (!args[2])
{
args[2] = op;
return 0xaa;
}
/* Maximum of one volatile memory reference per expression. */
- if (side_effects_p (op) && side_effects_p (args[2]))
+ if (side_effects_p (op))
return -1;
if (rtx_equal_p (op, args[2]))
return 0xaa;
- /* Check if one CONST_VECTOR is the ones-complement of the other. */
+ /* Check if CONST_VECTOR is the ones-complement of args[2]. */
if (GET_CODE (op) == CONST_VECTOR
&& GET_CODE (args[2]) == CONST_VECTOR
&& rtx_equal_p (simplify_const_unary_operation (NOT, GET_MODE (op),
op, GET_MODE (op)),
args[2]))
return 0x55;
+ if (!args[0])
+ {
+ args[0] = op;
+ return 0xf0;
+ }
+ if (rtx_equal_p (op, args[0]))
+ return 0xf0;
+ /* Check if CONST_VECTOR is the ones-complement of args[0]. */
+ if (GET_CODE (op) == CONST_VECTOR
+ && GET_CODE (args[0]) == CONST_VECTOR
+ && rtx_equal_p (simplify_const_unary_operation (NOT, GET_MODE (op),
+ op, GET_MODE (op)),
+ args[0]))
+ return 0x0f;
+ if (!args[1])
+ {
+ args[1] = op;
+ return 0xcc;
+ }
+ if (rtx_equal_p (op, args[1]))
+ return 0xcc;
+ /* Check if CONST_VECTOR is the ones-complement of args[1]. */
+ if (GET_CODE (op) == CONST_VECTOR
+ && GET_CODE (args[1]) == CONST_VECTOR
+ && rtx_equal_p (simplify_const_unary_operation (NOT, GET_MODE (op),
+ op, GET_MODE (op)),
+ args[1]))
+ return 0x33;
return -1;
case NOT:
@@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-mavx512f -mno-avx512vl -mprefer-vector-width=512 -O2" } */
-/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\\\$0x44, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\\\$80, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
/* { dg-final { scan-assembler-not "vpbroadcast" } } */
#define type __m512i
@@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-mavx512f -O2" } */
-/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$0x44, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$80, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
/* { dg-final { scan-assembler-not "vpbroadcast" } } */
#define type __m512i
@@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-mavx512f -mno-avx512vl -mprefer-vector-width=512 -O2" } */
-/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$0xdd, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$245, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
/* { dg-final { scan-assembler-not "vpbroadcast" } } */
#define type __m512i
@@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-mavx512f -mno-avx512vl -mprefer-vector-width=512 -O2" } */
-/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$0xbb, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$175, \\(%(?:eax|rdi|edi)\\)\\\{1to\[1-8\]+\\\}, %zmm\[0-9\]+, %zmm0" 1 } } */
/* { dg-final { scan-assembler-not "vpbroadcast" } } */
#define type __m512i
@@ -39,4 +39,4 @@ v8di foo_v8di (long long a, v8di b)
/* { dg-final { scan-assembler-times "vpandn" 4 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "vpandn" 2 { target { ia32 } } } } */
-/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$0x44" 2 { target { ia32 } } } } */
+/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$80" 2 { target { ia32 } } } } */
@@ -39,4 +39,4 @@ v8di foo_v8di (long long a, v8di b)
/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$207" 4 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$207" 2 { target { ia32 } } } } */
-/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$0xdd" 2 { target { ia32 } } } } */
+/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$245" 2 { target { ia32 } } } } */
@@ -39,5 +39,5 @@ v8di foo_v8di (long long a, v8di b)
/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$195" 4 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\\\$195" 2 { target { ia32 } } } } */
-/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$0x99" 2 { target { ia32 } } } } */
+/* { dg-final { scan-assembler-times "vpternlog\[dq\]\[ \\t\]+\\\$165" 2 { target { ia32 } } } } */