diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-03-30 12:38:21 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2016-03-30 12:38:21 +0000 |
commit | 373c27d73ef17d32be80325aeaeda8ff46aaccd6 (patch) | |
tree | 676cd56cd10dc8ca9b93578f17ec17969f0ad407 | |
parent | cc0ff3253e4adaa959b3f4f8a7ee8eafe7b28b2b (diff) |
Backported from mainline
2016-03-02 Jakub Jelinek <jakub@redhat.com>
PR target/70028
* config/i386/i386.md (kmovw): Move m constraint to 2nd alternative.
(*movhi_internal): Put mask moves from and to memory separately
from moves from/to GPRs.
* gcc.target/i386/pr70028.c: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@234558 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr70028.c | 19 |
4 files changed, 38 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b11e7ad2530..f234be8d382 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2016-03-30 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2016-03-02 Jakub Jelinek <jakub@redhat.com> + + PR target/70028 + * config/i386/i386.md (kmovw): Move m constraint to 2nd alternative. + (*movhi_internal): Put mask moves from and to memory separately + from moves from/to GPRs. + 2016-02-26 Jakub Jelinek <jakub@redhat.com> PR target/69969 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index fa0affab0a0..7553a70af90 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -2416,7 +2416,7 @@ (define_insn "kmovw" [(set (match_operand:HI 0 "nonimmediate_operand" "=k,k") (unspec:HI - [(match_operand:HI 1 "nonimmediate_operand" "rm,k")] + [(match_operand:HI 1 "nonimmediate_operand" "r,km")] UNSPEC_KMOV))] "!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512F" "@ @@ -2428,8 +2428,8 @@ (define_insn "*movhi_internal" - [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k,rm") - (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,rm,k,k"))] + [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k, r,m") + (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,r,km,k,k"))] "!(MEM_P (operands[0]) && MEM_P (operands[1]))" { switch (get_attr_type (insn)) @@ -2443,7 +2443,8 @@ switch (which_alternative) { case 4: return "kmovw\t{%k1, %0|%0, %k1}"; - case 5: return "kmovw\t{%1, %0|%0, %1}"; + case 5: /* FALLTHRU */ + case 7: return "kmovw\t{%1, %0|%0, %1}"; case 6: return "kmovw\t{%1, %k0|%k0, %1}"; default: gcc_unreachable (); } @@ -2456,7 +2457,7 @@ } } [(set (attr "type") - (cond [(eq_attr "alternative" "4,5,6") + (cond [(eq_attr "alternative" "4,5,6,7") (const_string "mskmov") (match_test "optimize_function_for_size_p (cfun)") (const_string "imov") @@ -2473,7 +2474,7 @@ ] (const_string "imov"))) (set (attr "prefix") - (if_then_else (eq_attr "alternative" "4,5,6") + (if_then_else (eq_attr "alternative" "4,5,6,7") (const_string "vex") (const_string "orig"))) (set (attr "mode") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 082f79f1cc7..8d78a3c3872 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2016-03-30 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2016-03-02 Jakub Jelinek <jakub@redhat.com> + + PR target/70028 + * gcc.target/i386/pr70028.c: New test. + 2016-02-26 Jakub Jelinek <jakub@redhat.com> PR target/69969 diff --git a/gcc/testsuite/gcc.target/i386/pr70028.c b/gcc/testsuite/gcc.target/i386/pr70028.c new file mode 100644 index 00000000000..c071aad7403 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr70028.c @@ -0,0 +1,19 @@ +/* PR target/70028 */ +/* { dg-do assemble { target avx512bw } } */ +/* { dg-require-effective-target int128 } */ +/* { dg-require-effective-target masm_intel } */ +/* { dg-options "-O2 -fno-forward-propagate -mavx512bw -masm=intel" } */ + +typedef unsigned short A; +typedef int B __attribute__ ((vector_size (32))); +typedef unsigned __int128 C; +typedef __int128 D __attribute__ ((vector_size (32))); + +C +foo (A a, int b, unsigned c, C d, A e, unsigned f, B g, D h) +{ + g[1] ^= (A) ~ a; + a ^= (unsigned) g[0]; + h %= (D) h | 1; + return a + b + c + d + e + g[0] + g[1] + h[1]; +} |