aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIlya Enkovich <enkovich.gnu@gmail.com>2016-01-18 10:35:56 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2016-01-18 10:35:56 +0000
commit3dd5f42e90fa6e296d233b0f05c3a760a45d1313 (patch)
treecc8cc97b2e96f6eb8cdb733c094748674ddca8c2 /gcc
parentae5a77fa960564c8a5b2a00c22b38d954aecddb8 (diff)
downloadgcc-3dd5f42e90fa6e296d233b0f05c3a760a45d1313.zip
gcc-3dd5f42e90fa6e296d233b0f05c3a760a45d1313.tar.gz
gcc-3dd5f42e90fa6e296d233b0f05c3a760a45d1313.tar.bz2
i386.c (scalar_to_vector_candidate_p): Support andnot instruction.
gcc/ * config/i386/i386.c (scalar_to_vector_candidate_p): Support andnot instruction. (scalar_chain::convert_op): Likewise. * config/i386/i386.md (*andndi3_doubleword): New. gcc/testsuite/ * gcc.target/i386/pr65105-5.c: Adjust to andn generation. From-SVN: r232500
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c13
-rw-r--r--gcc/config/i386/i386.md17
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/pr65105-5.c2
5 files changed, 40 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1cc9288..b2522c1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-01-18 Ilya Enkovich <enkovich.gnu@gmail.com>
+
+ * config/i386/i386.c (scalar_to_vector_candidate_p): Support
+ andnot instruction.
+ (scalar_chain::convert_op): Likewise.
+ * config/i386/i386.md (*andndi3_doubleword): New.
+
2016-01-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/69170
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index ff976dd..92d8ee1 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2815,7 +2815,11 @@ scalar_to_vector_candidate_p (rtx_insn *insn)
return false;
}
- if (!REG_P (XEXP (src, 0)) && !MEM_P (XEXP (src, 0)))
+ if (!REG_P (XEXP (src, 0)) && !MEM_P (XEXP (src, 0))
+ /* Check for andnot case. */
+ && (GET_CODE (src) != AND
+ || GET_CODE (XEXP (src, 0)) != NOT
+ || !REG_P (XEXP (XEXP (src, 0), 0))))
return false;
if (!REG_P (XEXP (src, 1)) && !MEM_P (XEXP (src, 1)))
@@ -3383,7 +3387,12 @@ scalar_chain::convert_op (rtx *op, rtx_insn *insn)
{
*op = copy_rtx_if_shared (*op);
- if (MEM_P (*op))
+ if (GET_CODE (*op) == NOT)
+ {
+ convert_op (&XEXP (*op, 0), insn);
+ PUT_MODE (*op, V2DImode);
+ }
+ else if (MEM_P (*op))
{
rtx tmp = gen_reg_rtx (DImode);
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 71941d0..f16b42a 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -8645,6 +8645,23 @@
(clobber (reg:CC FLAGS_REG))])]
"split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);")
+(define_insn_and_split "*andndi3_doubleword"
+ [(set (match_operand:DI 0 "register_operand" "=r,r")
+ (and:DI
+ (not:DI (match_operand:DI 1 "register_operand" "r,r"))
+ (match_operand:DI 2 "nonimmediate_operand" "r,m")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_BMI && !TARGET_64BIT && TARGET_STV && TARGET_SSE"
+ "#"
+ "&& reload_completed"
+ [(parallel [(set (match_dup 0)
+ (and:SI (not:SI (match_dup 1)) (match_dup 2)))
+ (clobber (reg:CC FLAGS_REG))])
+ (parallel [(set (match_dup 3)
+ (and:SI (not:SI (match_dup 4)) (match_dup 5)))
+ (clobber (reg:CC FLAGS_REG))])]
+ "split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);")
+
(define_insn "*<code>hi_1"
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,rm,!k")
(any_or:HI
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7d93a493..498632d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-01-18 Ilya Enkovich <enkovich.gnu@gmail.com>
+
+ * gcc.target/i386/pr65105-5.c: Adjust to andn generation.
+
2016-01-18 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/inline12.adb: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr65105-5.c b/gcc/testsuite/gcc.target/i386/pr65105-5.c
index 5818c1c..639bbe1 100644
--- a/gcc/testsuite/gcc.target/i386/pr65105-5.c
+++ b/gcc/testsuite/gcc.target/i386/pr65105-5.c
@@ -1,7 +1,7 @@
/* PR target/pr65105 */
/* { dg-do compile { target { ia32 } } } */
/* { dg-options "-O2 -march=core-avx2" } */
-/* { dg-final { scan-assembler "pand" } } */
+/* { dg-final { scan-assembler "pandn" } } */
/* { dg-final { scan-assembler "pxor" } } */
/* { dg-final { scan-assembler "ptest" } } */