diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2011-04-18 21:48:09 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2011-04-18 21:48:09 +0200 |
commit | f60c25544c92d51515d6eb005a74498547612908 (patch) | |
tree | 7808b3601bef4427b90a5eb67e5725f71fc0343a /gcc/config | |
parent | d77c2e5b8639ab15c117f5d4763e451d313154e6 (diff) | |
download | gcc-f60c25544c92d51515d6eb005a74498547612908.zip gcc-f60c25544c92d51515d6eb005a74498547612908.tar.gz gcc-f60c25544c92d51515d6eb005a74498547612908.tar.bz2 |
i386.h (SSE_VEC_FLOAT_MODE_P): Remove.
* config/i386/i386.h (SSE_VEC_FLOAT_MODE_P): Remove.
(AVX_FLOAT_MODE_P): Ditto.
(AVX128_VEC_FLOAT_MODE_P): Ditto.
(AVX256_VEC_FLOAT_MODE_P): Ditto.
(AVX_VEC_FLOAT_MODE_P): Ditto.
* config/i386/i386.md (UNSPEC_MASKLOAD): Remove.
(UNSPEC_MASKSTORE): Ditto.
* config/i386/sse.md (<sse>_movmsk<ssemodesuffix><avxmodesuffix>):
Merge from <sse>_movmsk<ssemodesuffix> and
avx_movmsk<ssemodesuffix>256. Use VF mode iterator.
(*sse2_maskmovdqu): Merge with *sse2_maskmovdqu_rex64. Use P mode
iterator.
(avx_maskload<ssemodesuffix><avxmodesuffix>): New expander.
(avx_maskstore<ssemodesuffix><avxmodesuffix>): Ditto.
(*avx_maskmov<ssemodesuffix><avxmodesuffix>): New insn.
testsuite/ChangeLog:
* gcc.target/i386/sse2-maskmovdqu.c: New test.
* gcc.target/i386/avx-vmaskmovdqu.c: Ditto.
From-SVN: r172669
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/i386.h | 16 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 2 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 83 |
3 files changed, 30 insertions, 71 deletions
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 511429a..10fc126 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1328,22 +1328,6 @@ enum reg_class #define SSE_FLOAT_MODE_P(MODE) \ ((TARGET_SSE && (MODE) == SFmode) || (TARGET_SSE2 && (MODE) == DFmode)) -#define SSE_VEC_FLOAT_MODE_P(MODE) \ - ((TARGET_SSE && (MODE) == V4SFmode) || (TARGET_SSE2 && (MODE) == V2DFmode)) - -#define AVX_FLOAT_MODE_P(MODE) \ - (TARGET_AVX && ((MODE) == SFmode || (MODE) == DFmode)) - -#define AVX128_VEC_FLOAT_MODE_P(MODE) \ - (TARGET_AVX && ((MODE) == V4SFmode || (MODE) == V2DFmode)) - -#define AVX256_VEC_FLOAT_MODE_P(MODE) \ - (TARGET_AVX && ((MODE) == V8SFmode || (MODE) == V4DFmode)) - -#define AVX_VEC_FLOAT_MODE_P(MODE) \ - (TARGET_AVX && ((MODE) == V4SFmode || (MODE) == V2DFmode \ - || (MODE) == V8SFmode || (MODE) == V4DFmode)) - #define FMA4_VEC_FLOAT_MODE_P(MODE) \ (TARGET_FMA4 && ((MODE) == V4SFmode || (MODE) == V2DFmode \ || (MODE) == V8SFmode || (MODE) == V4DFmode)) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index f896bc9..0e0ceed 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -224,8 +224,6 @@ UNSPEC_VPERMIL UNSPEC_VPERMIL2 UNSPEC_VPERMIL2F128 - UNSPEC_MASKLOAD - UNSPEC_MASKSTORE UNSPEC_CAST UNSPEC_VTESTP UNSPEC_VCVTPH2PS diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 928bf78..63da5df 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -6893,23 +6893,12 @@ (set_attr "prefix" "orig,vex") (set_attr "mode" "TI")]) -(define_insn "avx_movmsk<ssemodesuffix>256" +(define_insn "<sse>_movmsk<ssemodesuffix><avxmodesuffix>" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI - [(match_operand:AVX256MODEF2P 1 "register_operand" "x")] + [(match_operand:VF 1 "register_operand" "x")] UNSPEC_MOVMSK))] - "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)" - "vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}" - [(set_attr "type" "ssecvt") - (set_attr "prefix" "vex") - (set_attr "mode" "<MODE>")]) - -(define_insn "<sse>_movmsk<ssemodesuffix>" - [(set (match_operand:SI 0 "register_operand" "=r") - (unspec:SI - [(match_operand:SSEMODEF2P 1 "register_operand" "x")] - UNSPEC_MOVMSK))] - "SSE_VEC_FLOAT_MODE_P (<MODE>mode)" + "" "%vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}" [(set_attr "type" "ssemov") (set_attr "prefix" "maybe_vex") @@ -6935,35 +6924,18 @@ "TARGET_SSE2") (define_insn "*sse2_maskmovdqu" - [(set (mem:V16QI (match_operand:SI 0 "register_operand" "D")) - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x") - (match_operand:V16QI 2 "register_operand" "x") - (mem:V16QI (match_dup 0))] - UNSPEC_MASKMOV))] - "TARGET_SSE2 && !TARGET_64BIT" - ;; @@@ check ordering of operands in intel/nonintel syntax - "%vmaskmovdqu\t{%2, %1|%1, %2}" - [(set_attr "type" "ssemov") - (set_attr "prefix_data16" "1") - ;; The implicit %rdi operand confuses default length_vex computation. - (set_attr "length_vex" "3") - (set_attr "prefix" "maybe_vex") - (set_attr "mode" "TI")]) - -(define_insn "*sse2_maskmovdqu_rex64" - [(set (mem:V16QI (match_operand:DI 0 "register_operand" "D")) + [(set (mem:V16QI (match_operand:P 0 "register_operand" "D")) (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x") (match_operand:V16QI 2 "register_operand" "x") (mem:V16QI (match_dup 0))] UNSPEC_MASKMOV))] - "TARGET_SSE2 && TARGET_64BIT" - ;; @@@ check ordering of operands in intel/nonintel syntax + "TARGET_SSE2" "%vmaskmovdqu\t{%2, %1|%1, %2}" [(set_attr "type" "ssemov") (set_attr "prefix_data16" "1") ;; The implicit %rdi operand confuses default length_vex computation. (set (attr "length_vex") - (symbol_ref ("REGNO (operands[2]) >= FIRST_REX_SSE_REG ? 3 + 1 : 2 + 1"))) + (symbol_ref ("3 + REX_SSE_REGNO_P (REGNO (operands[2]))"))) (set_attr "prefix" "maybe_vex") (set_attr "mode" "TI")]) @@ -10349,28 +10321,33 @@ (set_attr "prefix" "vex") (set_attr "mode" "V8SF")]) -(define_insn "avx_maskload<ssemodesuffix><avxmodesuffix>" - [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x") - (unspec:AVXMODEF2P - [(match_operand:AVXMODEF2P 1 "memory_operand" "m") - (match_operand:<avxpermvecmode> 2 "register_operand" "x") +(define_expand "avx_maskload<ssemodesuffix><avxmodesuffix>" + [(set (match_operand:VF 0 "register_operand" "") + (unspec:VF + [(match_operand:<avxpermvecmode> 2 "register_operand" "") + (match_operand:VF 1 "memory_operand" "") (match_dup 0)] - UNSPEC_MASKLOAD))] - "TARGET_AVX" - "vmaskmov<ssemodesuffix>\t{%1, %2, %0|%0, %2, %1}" - [(set_attr "type" "sselog1") - (set_attr "prefix_extra" "1") - (set_attr "prefix" "vex") - (set_attr "mode" "<MODE>")]) + UNSPEC_MASKMOV))] + "TARGET_AVX") -(define_insn "avx_maskstore<ssemodesuffix><avxmodesuffix>" - [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m") - (unspec:AVXMODEF2P - [(match_operand:<avxpermvecmode> 1 "register_operand" "x") - (match_operand:AVXMODEF2P 2 "register_operand" "x") +(define_expand "avx_maskstore<ssemodesuffix><avxmodesuffix>" + [(set (match_operand:VF 0 "memory_operand" "") + (unspec:VF + [(match_operand:<avxpermvecmode> 1 "register_operand" "") + (match_operand:VF 2 "register_operand" "") (match_dup 0)] - UNSPEC_MASKSTORE))] - "TARGET_AVX" + UNSPEC_MASKMOV))] + "TARGET_AVX") + +(define_insn "*avx_maskmov<ssemodesuffix><avxmodesuffix>" + [(set (match_operand:VF 0 "nonimmediate_operand" "=x,m") + (unspec:VF + [(match_operand:<avxpermvecmode> 1 "register_operand" "x,x") + (match_operand:VF 2 "nonimmediate_operand" "m,x") + (match_dup 0)] + UNSPEC_MASKMOV))] + "TARGET_AVX + && (REG_P (operands[0]) == MEM_P (operands[2]))" "vmaskmov<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "sselog1") (set_attr "prefix_extra" "1") |