diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2008-05-06 10:39:51 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2008-05-06 10:39:51 +0200 |
commit | 333d8f61a21edd364b966ab8aa70e232ccdc4810 (patch) | |
tree | d33cda152c74ac93f5325c2f2b1f38a9750ad184 /gcc | |
parent | 3716f2332cfeaddc5fb8998a7045bb56b0af9dc6 (diff) | |
download | gcc-333d8f61a21edd364b966ab8aa70e232ccdc4810.zip gcc-333d8f61a21edd364b966ab8aa70e232ccdc4810.tar.gz gcc-333d8f61a21edd364b966ab8aa70e232ccdc4810.tar.bz2 |
mmx.md: Remove double backslashes from asm templates.
* config/i386/mmx.md: Remove double backslashes from asm templates.
(*addv2sf3): Rename from mmx_addv2sf3 insn pattern.
(mmx_addv2sf3): New expander. Use ix86_fixup_binary_operands_no_copy
to handle nonimmediate operands.
(*mulv2sf3): Rename from mmx_mulv2sf3 insn pattern.
(mmx_mulv2sf3): New expander. Use ix86_fixup_binary_operands_no_copy
to handle nonimmediate operands.
(*<code>v2sf3_finite): New insn pattern.
(*<code>v2sf3): Rename from mmx_<code>v2sf3 insn pattern.
(mmx_<code>v2sf3): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
(mmx_<plusminus_insn><mode>3): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
(*<plusminus_insn><mode>3): New insn pattern.
(mmx_add<mode>3): Removed.
(mmx_ssadd<mode>3): Ditto.
(mmx_usadd<mode>3): Ditto.
(mmx_sub<mode>3): Ditto.
(mmx_sssub<mode>3): Ditto.
(mmx_ussub<mode>3): Ditto.
(*mulv4hi3): Rename from mmx_mulv4hi3 insn pattern.
(mmx_mulv4hi3): New expander. Use ix86_fixup_binary_operands_no_copy
to handle nonimmediate operands.
(*smulv4hi3_highpart): Rename from mmx_smulv4hi3_highpart
insn pattern.
(mmx_smulv4hi3_highpart): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
(*umulv4hi3_highpart): Rename from mmx_umulv4hi3_highpart
insn pattern.
(mmx_umulv4hi3_highpart): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
(*<code>v4hi3): Rename from mmx_<code>v4hi3 insn pattern.
(mmx_<code>v4hi3): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
(*<code>v8qi3): Rename from mmx_<code>v8qi3 insn pattern.
(mmx_<code>v8qi3): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
(*<code><mode>3): Rename from mmx_<code><mode>3 insn pattern.
(mmx_<code><mode>3): New expander. Use
ix86_fixup_binary_operands_no_copy to handle nonimmediate operands.
From-SVN: r134976
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 51 | ||||
-rw-r--r-- | gcc/config/i386/mmx.md | 265 |
2 files changed, 218 insertions, 98 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 448a895..930772c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,46 @@ +2008-05-06 Uros Bizjak <ubizjak@gmail.com> + + * config/i386/mmx.md: Remove double backslashes from asm templates. + (*addv2sf3): Rename from mmx_addv2sf3 insn pattern. + (mmx_addv2sf3): New expander. Use ix86_fixup_binary_operands_no_copy + to handle nonimmediate operands. + (*mulv2sf3): Rename from mmx_mulv2sf3 insn pattern. + (mmx_mulv2sf3): New expander. Use ix86_fixup_binary_operands_no_copy + to handle nonimmediate operands. + (*<code>v2sf3_finite): New insn pattern. + (*<code>v2sf3): Rename from mmx_<code>v2sf3 insn pattern. + (mmx_<code>v2sf3): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + (mmx_<plusminus_insn><mode>3): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + (*<plusminus_insn><mode>3): New insn pattern. + (mmx_add<mode>3): Removed. + (mmx_ssadd<mode>3): Ditto. + (mmx_usadd<mode>3): Ditto. + (mmx_sub<mode>3): Ditto. + (mmx_sssub<mode>3): Ditto. + (mmx_ussub<mode>3): Ditto. + (*mulv4hi3): Rename from mmx_mulv4hi3 insn pattern. + (mmx_mulv4hi3): New expander. Use ix86_fixup_binary_operands_no_copy + to handle nonimmediate operands. + (*smulv4hi3_highpart): Rename from mmx_smulv4hi3_highpart + insn pattern. + (mmx_smulv4hi3_highpart): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + (*umulv4hi3_highpart): Rename from mmx_umulv4hi3_highpart + insn pattern. + (mmx_umulv4hi3_highpart): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + (*<code>v4hi3): Rename from mmx_<code>v4hi3 insn pattern. + (mmx_<code>v4hi3): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + (*<code>v8qi3): Rename from mmx_<code>v8qi3 insn pattern. + (mmx_<code>v8qi3): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + (*<code><mode>3): Rename from mmx_<code><mode>3 insn pattern. + (mmx_<code><mode>3): New expander. Use + ix86_fixup_binary_operands_no_copy to handle nonimmediate operands. + 2008-05-05 Jan Hubicka <jh@suse.cz> PR tree-optimization/36118 @@ -6,8 +49,8 @@ 2008-05-05 Andrew Pinski <andrew_pinski@playstation.sony.com> PR middle-end/36141 - * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't create VCE - for function decls. + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't create + VCE for function decls. 2008-05-05 H.J. Lu <hongjiu.lu@intel.com> @@ -55,9 +98,9 @@ Generalize UNUSED macro. (__gthread_once): Add. (__gthread_key_create): Add. - (__gthread_key_delete): Add. + (__gthread_key_delete): Add. (__gthread_getspecific): Add. - (__gthread_setspecific): Add. + (__gthread_setspecific): Add. 2008-05-05 Andrew Pinski <Andrew.Pinski@playstation.sony.com> diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index bfcddc6..32cec06 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -1,5 +1,5 @@ ;; GCC machine description for MMX and 3dNOW! instructions -;; Copyright (C) 2005, 2007 +;; Copyright (C) 2005, 2007, 2008 ;; Free Software Foundation, Inc. ;; ;; This file is part of GCC. @@ -212,12 +212,20 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define_insn "mmx_addv2sf3" +(define_expand "mmx_addv2sf3" + [(set (match_operand:V2SF 0 "register_operand" "") + (plus:V2SF + (match_operand:V2SF 1 "nonimmediate_operand" "") + (match_operand:V2SF 2 "nonimmediate_operand" "")))] + "TARGET_3DNOW" + "ix86_fixup_binary_operands_no_copy (PLUS, V2SFmode, operands);") + +(define_insn "*addv2sf3" [(set (match_operand:V2SF 0 "register_operand" "=y") (plus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] "TARGET_3DNOW && ix86_binary_operator_ok (PLUS, V2SFmode, operands)" - "pfadd\\t{%2, %0|%0, %2}" + "pfadd\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) @@ -227,8 +235,8 @@ (match_operand:V2SF 2 "nonimmediate_operand" "ym,0")))] "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))" "@ - pfsub\\t{%2, %0|%0, %2} - pfsubr\\t{%2, %0|%0, %2}" + pfsub\t{%2, %0|%0, %2} + pfsubr\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) @@ -239,22 +247,56 @@ "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))" "") -(define_insn "mmx_mulv2sf3" +(define_expand "mmx_mulv2sf3" + [(set (match_operand:V2SF 0 "register_operand" "") + (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "") + (match_operand:V2SF 2 "nonimmediate_operand" "")))] + "TARGET_3DNOW" + "ix86_fixup_binary_operands_no_copy (MULT, V2SFmode, operands);") + +(define_insn "*mulv2sf3" [(set (match_operand:V2SF 0 "register_operand" "=y") (mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V2SFmode, operands)" - "pfmul\\t{%2, %0|%0, %2}" + "pfmul\t{%2, %0|%0, %2}" [(set_attr "type" "mmxmul") (set_attr "mode" "V2SF")]) -(define_insn "mmx_<code>v2sf3" +;; ??? For !flag_finite_math_only, the representation with SMIN/SMAX +;; isn't really correct, as those rtl operators aren't defined when +;; applied to NaNs. Hopefully the optimizers won't get too smart on us. + +(define_expand "mmx_<code>v2sf3" + [(set (match_operand:V2SF 0 "register_operand" "") + (smaxmin:V2SF + (match_operand:V2SF 1 "nonimmediate_operand" "") + (match_operand:V2SF 2 "nonimmediate_operand" "")))] + "TARGET_3DNOW" +{ + if (!flag_finite_math_only) + operands[1] = force_reg (V2SFmode, operands[1]); + ix86_fixup_binary_operands_no_copy (<CODE>, V2SFmode, operands); +}) + +(define_insn "*<code>v2sf3_finite" [(set (match_operand:V2SF 0 "register_operand" "=y") (smaxmin:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0") (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] - "TARGET_3DNOW && ix86_binary_operator_ok (SMAX, V2SFmode, operands)" - "pf<maxminfprefix>\\t{%2, %0|%0, %2}" + "TARGET_3DNOW && flag_finite_math_only + && ix86_binary_operator_ok (<CODE>, V2SFmode, operands)" + "pf<maxminfprefix>\t{%2, %0|%0, %2}" + [(set_attr "type" "mmxadd") + (set_attr "mode" "V2SF")]) + +(define_insn "*<code>v2sf3" + [(set (match_operand:V2SF 0 "register_operand" "=y") + (smaxmin:V2SF + (match_operand:V2SF 1 "register_operand" "0") + (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] + "TARGET_3DNOW" + "pf<maxminfprefix>\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) @@ -263,7 +305,7 @@ (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")] UNSPEC_PFRCP))] "TARGET_3DNOW" - "pfrcp\\t{%1, %0|%0, %1}" + "pfrcp\t{%1, %0|%0, %1}" [(set_attr "type" "mmx") (set_attr "mode" "V2SF")]) @@ -273,7 +315,7 @@ (match_operand:V2SF 2 "nonimmediate_operand" "ym")] UNSPEC_PFRCPIT1))] "TARGET_3DNOW" - "pfrcpit1\\t{%2, %0|%0, %2}" + "pfrcpit1\t{%2, %0|%0, %2}" [(set_attr "type" "mmx") (set_attr "mode" "V2SF")]) @@ -283,7 +325,7 @@ (match_operand:V2SF 2 "nonimmediate_operand" "ym")] UNSPEC_PFRCPIT2))] "TARGET_3DNOW" - "pfrcpit2\\t{%2, %0|%0, %2}" + "pfrcpit2\t{%2, %0|%0, %2}" [(set_attr "type" "mmx") (set_attr "mode" "V2SF")]) @@ -292,7 +334,7 @@ (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")] UNSPEC_PFRSQRT))] "TARGET_3DNOW" - "pfrsqrt\\t{%1, %0|%0, %1}" + "pfrsqrt\t{%1, %0|%0, %1}" [(set_attr "type" "mmx") (set_attr "mode" "V2SF")]) @@ -302,7 +344,7 @@ (match_operand:V2SF 2 "nonimmediate_operand" "ym")] UNSPEC_PFRSQIT1))] "TARGET_3DNOW" - "pfrsqit1\\t{%2, %0|%0, %2}" + "pfrsqit1\t{%2, %0|%0, %2}" [(set_attr "type" "mmx") (set_attr "mode" "V2SF")]) @@ -320,7 +362,7 @@ (parallel [(const_int 0)])) (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))] "TARGET_3DNOW" - "pfacc\\t{%2, %0|%0, %2}" + "pfacc\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) @@ -338,7 +380,7 @@ (parallel [(const_int 0)])) (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))] "TARGET_3DNOW_A" - "pfnacc\\t{%2, %0|%0, %2}" + "pfnacc\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) @@ -351,7 +393,7 @@ (minus:V2SF (match_dup 1) (match_dup 2)) (const_int 1)))] "TARGET_3DNOW_A" - "pfpnacc\\t{%2, %0|%0, %2}" + "pfpnacc\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) @@ -366,7 +408,7 @@ (gt:V2SI (match_operand:V2SF 1 "register_operand" "0") (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] "TARGET_3DNOW" - "pfcmpgt\\t{%2, %0|%0, %2}" + "pfcmpgt\t{%2, %0|%0, %2}" [(set_attr "type" "mmxcmp") (set_attr "mode" "V2SF")]) @@ -375,7 +417,7 @@ (ge:V2SI (match_operand:V2SF 1 "register_operand" "0") (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] "TARGET_3DNOW" - "pfcmpge\\t{%2, %0|%0, %2}" + "pfcmpge\t{%2, %0|%0, %2}" [(set_attr "type" "mmxcmp") (set_attr "mode" "V2SF")]) @@ -384,7 +426,7 @@ (eq:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "%0") (match_operand:V2SF 2 "nonimmediate_operand" "ym")))] "TARGET_3DNOW && ix86_binary_operator_ok (EQ, V2SFmode, operands)" - "pfcmpeq\\t{%2, %0|%0, %2}" + "pfcmpeq\t{%2, %0|%0, %2}" [(set_attr "type" "mmxcmp") (set_attr "mode" "V2SF")]) @@ -398,7 +440,7 @@ [(set (match_operand:V2SI 0 "register_operand" "=y") (fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "ym")))] "TARGET_3DNOW" - "pf2id\\t{%1, %0|%0, %1}" + "pf2id\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "V2SF")]) @@ -409,7 +451,7 @@ (fix:V2SI (match_operand:V2SF 1 "nonimmediate_operand" "ym")))))] "TARGET_3DNOW_A" - "pf2iw\\t{%1, %0|%0, %1}" + "pf2iw\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "V2SF")]) @@ -420,7 +462,7 @@ (truncate:V2HI (match_operand:V2SI 1 "nonimmediate_operand" "ym")))))] "TARGET_3DNOW_A" - "pi2fw\\t{%1, %0|%0, %1}" + "pi2fw\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "V2SF")]) @@ -428,7 +470,7 @@ [(set (match_operand:V2SF 0 "register_operand" "=y") (float:V2SF (match_operand:V2SI 1 "nonimmediate_operand" "ym")))] "TARGET_3DNOW" - "pi2fd\\t{%1, %0|%0, %1}" + "pi2fd\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "V2SF")]) @@ -443,7 +485,7 @@ (vec_select:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "ym") (parallel [(const_int 1) (const_int 0)])))] "TARGET_3DNOW_A" - "pswapd\\t{%1, %0|%0, %1}" + "pswapd\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "V2SF")]) @@ -550,68 +592,51 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define_insn "mmx_add<mode>3" +(define_expand "mmx_<plusminus_insn><mode>3" + [(set (match_operand:MMXMODEI8 0 "register_operand" "") + (plusminus:MMXMODEI8 + (match_operand:MMXMODEI8 1 "nonimmediate_operand" "") + (match_operand:MMXMODEI8 2 "nonimmediate_operand" "")))] + "TARGET_MMX || (TARGET_SSE2 && <MODE>mode == V1DImode)" + "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") + +(define_insn "*<plusminus_insn><mode>3" [(set (match_operand:MMXMODEI8 0 "register_operand" "=y") - (plus:MMXMODEI8 - (match_operand:MMXMODEI8 1 "nonimmediate_operand" "%0") + (plusminus:MMXMODEI8 + (match_operand:MMXMODEI8 1 "nonimmediate_operand" "<comm>0") (match_operand:MMXMODEI8 2 "nonimmediate_operand" "ym")))] "(TARGET_MMX || (TARGET_SSE2 && <MODE>mode == V1DImode)) - && ix86_binary_operator_ok (PLUS, <MODE>mode, operands)" - "padd<mmxvecsize>\t{%2, %0|%0, %2}" + && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" + "p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "DI")]) -(define_insn "mmx_ssadd<mode>3" - [(set (match_operand:MMXMODE12 0 "register_operand" "=y") - (ss_plus:MMXMODE12 - (match_operand:MMXMODE12 1 "nonimmediate_operand" "%0") - (match_operand:MMXMODE12 2 "nonimmediate_operand" "ym")))] +(define_expand "mmx_<plusminus_insn><mode>3" + [(set (match_operand:MMXMODE12 0 "register_operand" "") + (sat_plusminus:MMXMODE12 + (match_operand:MMXMODE12 1 "nonimmediate_operand" "") + (match_operand:MMXMODE12 2 "nonimmediate_operand" "")))] "TARGET_MMX" - "padds<mmxvecsize>\t{%2, %0|%0, %2}" - [(set_attr "type" "mmxadd") - (set_attr "mode" "DI")]) - -(define_insn "mmx_usadd<mode>3" - [(set (match_operand:MMXMODE12 0 "register_operand" "=y") - (us_plus:MMXMODE12 - (match_operand:MMXMODE12 1 "nonimmediate_operand" "%0") - (match_operand:MMXMODE12 2 "nonimmediate_operand" "ym")))] - "TARGET_MMX" - "paddus<mmxvecsize>\t{%2, %0|%0, %2}" - [(set_attr "type" "mmxadd") - (set_attr "mode" "DI")]) - -(define_insn "mmx_sub<mode>3" - [(set (match_operand:MMXMODEI8 0 "register_operand" "=y") - (minus:MMXMODEI8 - (match_operand:MMXMODEI8 1 "register_operand" "0") - (match_operand:MMXMODEI8 2 "nonimmediate_operand" "ym")))] - "(TARGET_MMX || (TARGET_SSE2 && <MODE>mode == V1DImode))" - "psub<mmxvecsize>\t{%2, %0|%0, %2}" - [(set_attr "type" "mmxadd") - (set_attr "mode" "DI")]) + "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") -(define_insn "mmx_sssub<mode>3" +(define_insn "*<plusminus_insn><mode>3" [(set (match_operand:MMXMODE12 0 "register_operand" "=y") - (ss_minus:MMXMODE12 - (match_operand:MMXMODE12 1 "register_operand" "0") + (sat_plusminus:MMXMODE12 + (match_operand:MMXMODE12 1 "nonimmediate_operand" "<comm>0") (match_operand:MMXMODE12 2 "nonimmediate_operand" "ym")))] - "TARGET_MMX" - "psubs<mmxvecsize>\t{%2, %0|%0, %2}" + "TARGET_MMX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" + "p<plusminus_mnemonic><mmxvecsize>\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "DI")]) -(define_insn "mmx_ussub<mode>3" - [(set (match_operand:MMXMODE12 0 "register_operand" "=y") - (us_minus:MMXMODE12 - (match_operand:MMXMODE12 1 "register_operand" "0") - (match_operand:MMXMODE12 2 "nonimmediate_operand" "ym")))] +(define_expand "mmx_mulv4hi3" + [(set (match_operand:V4HI 0 "register_operand" "") + (mult:V4HI (match_operand:V4HI 1 "nonimmediate_operand" "") + (match_operand:V4HI 2 "nonimmediate_operand" "")))] "TARGET_MMX" - "psubus<mmxvecsize>\t{%2, %0|%0, %2}" - [(set_attr "type" "mmxadd") - (set_attr "mode" "DI")]) + "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);") -(define_insn "mmx_mulv4hi3" +(define_insn "*mulv4hi3" [(set (match_operand:V4HI 0 "register_operand" "=y") (mult:V4HI (match_operand:V4HI 1 "nonimmediate_operand" "%0") (match_operand:V4HI 2 "nonimmediate_operand" "ym")))] @@ -620,28 +645,56 @@ [(set_attr "type" "mmxmul") (set_attr "mode" "DI")]) -(define_insn "mmx_smulv4hi3_highpart" +(define_expand "mmx_smulv4hi3_highpart" + [(set (match_operand:V4HI 0 "register_operand" "") + (truncate:V4HI + (lshiftrt:V4SI + (mult:V4SI + (sign_extend:V4SI + (match_operand:V4HI 1 "nonimmediate_operand" "")) + (sign_extend:V4SI + (match_operand:V4HI 2 "nonimmediate_operand" ""))) + (const_int 16))))] + "TARGET_MMX" + "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);") + +(define_insn "*smulv4hi3_highpart" [(set (match_operand:V4HI 0 "register_operand" "=y") (truncate:V4HI - (lshiftrt:V4SI - (mult:V4SI (sign_extend:V4SI - (match_operand:V4HI 1 "nonimmediate_operand" "%0")) - (sign_extend:V4SI - (match_operand:V4HI 2 "nonimmediate_operand" "ym"))) - (const_int 16))))] + (lshiftrt:V4SI + (mult:V4SI + (sign_extend:V4SI + (match_operand:V4HI 1 "nonimmediate_operand" "%0")) + (sign_extend:V4SI + (match_operand:V4HI 2 "nonimmediate_operand" "ym"))) + (const_int 16))))] "TARGET_MMX && ix86_binary_operator_ok (MULT, V4HImode, operands)" "pmulhw\t{%2, %0|%0, %2}" [(set_attr "type" "mmxmul") (set_attr "mode" "DI")]) -(define_insn "mmx_umulv4hi3_highpart" +(define_expand "mmx_umulv4hi3_highpart" + [(set (match_operand:V4HI 0 "register_operand" "") + (truncate:V4HI + (lshiftrt:V4SI + (mult:V4SI + (zero_extend:V4SI + (match_operand:V4HI 1 "nonimmediate_operand" "")) + (zero_extend:V4SI + (match_operand:V4HI 2 "nonimmediate_operand" ""))) + (const_int 16))))] + "TARGET_SSE || TARGET_3DNOW_A" + "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);") + +(define_insn "*umulv4hi3_highpart" [(set (match_operand:V4HI 0 "register_operand" "=y") (truncate:V4HI - (lshiftrt:V4SI - (mult:V4SI (zero_extend:V4SI - (match_operand:V4HI 1 "nonimmediate_operand" "%0")) - (zero_extend:V4SI - (match_operand:V4HI 2 "nonimmediate_operand" "ym"))) + (lshiftrt:V4SI + (mult:V4SI + (zero_extend:V4SI + (match_operand:V4HI 1 "nonimmediate_operand" "%0")) + (zero_extend:V4SI + (match_operand:V4HI 2 "nonimmediate_operand" "ym"))) (const_int 16))))] "(TARGET_SSE || TARGET_3DNOW_A) && ix86_binary_operator_ok (MULT, V4HImode, operands)" @@ -687,7 +740,7 @@ (const_int 32768) (const_int 32768)])) (const_int 16))))] "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V4HImode, operands)" - "pmulhrw\\t{%2, %0|%0, %2}" + "pmulhrw\t{%2, %0|%0, %2}" [(set_attr "type" "mmxmul") (set_attr "mode" "DI")]) @@ -707,24 +760,40 @@ [(set_attr "type" "mmxmul") (set_attr "mode" "DI")]) -(define_insn "mmx_<code>v4hi3" +(define_expand "mmx_<code>v4hi3" + [(set (match_operand:V4HI 0 "register_operand" "") + (smaxmin:V4HI + (match_operand:V4HI 1 "nonimmediate_operand" "") + (match_operand:V4HI 2 "nonimmediate_operand" "")))] + "TARGET_SSE || TARGET_3DNOW_A" + "ix86_fixup_binary_operands_no_copy (<CODE>, V4HImode, operands);") + +(define_insn "*<code>v4hi3" [(set (match_operand:V4HI 0 "register_operand" "=y") (smaxmin:V4HI (match_operand:V4HI 1 "nonimmediate_operand" "%0") (match_operand:V4HI 2 "nonimmediate_operand" "ym")))] "(TARGET_SSE || TARGET_3DNOW_A) - && ix86_binary_operator_ok (SMAX, V4HImode, operands)" + && ix86_binary_operator_ok (<CODE>, V4HImode, operands)" "p<maxminiprefix>w\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "DI")]) -(define_insn "mmx_<code>v8qi3" +(define_expand "mmx_<code>v8qi3" + [(set (match_operand:V8QI 0 "register_operand" "") + (umaxmin:V8QI + (match_operand:V8QI 1 "nonimmediate_operand" "") + (match_operand:V8QI 2 "nonimmediate_operand" "")))] + "TARGET_SSE || TARGET_3DNOW_A" + "ix86_fixup_binary_operands_no_copy (<CODE>, V8QImode, operands);") + +(define_insn "*<code>v8qi3" [(set (match_operand:V8QI 0 "register_operand" "=y") (umaxmin:V8QI (match_operand:V8QI 1 "nonimmediate_operand" "%0") (match_operand:V8QI 2 "nonimmediate_operand" "ym")))] "(TARGET_SSE || TARGET_3DNOW_A) - && ix86_binary_operator_ok (UMIN, V8QImode, operands)" + && ix86_binary_operator_ok (<CODE>, V8QImode, operands)" "p<maxminiprefix>b\t{%2, %0|%0, %2}" [(set_attr "type" "mmxadd") (set_attr "mode" "DI")]) @@ -801,7 +870,15 @@ [(set_attr "type" "mmxadd") (set_attr "mode" "DI")]) -(define_insn "mmx_<code><mode>3" +(define_expand "mmx_<code><mode>3" + [(set (match_operand:MMXMODEI 0 "register_operand" "") + (plogic:MMXMODEI + (match_operand:MMXMODEI 1 "nonimmediate_operand" "") + (match_operand:MMXMODEI 2 "nonimmediate_operand" "")))] + "TARGET_MMX" + "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);") + +(define_insn "*<code><mode>3" [(set (match_operand:MMXMODEI 0 "register_operand" "=y") (plogic:MMXMODEI (match_operand:MMXMODEI 1 "nonimmediate_operand" "%0") @@ -1017,7 +1094,7 @@ (match_operand:V2SI 1 "nonimmediate_operand" "ym") (parallel [(const_int 1) (const_int 0)])))] "TARGET_3DNOW_A" - "pswapd\\t{%1, %0|%0, %1}" + "pswapd\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")]) @@ -1221,7 +1298,7 @@ if (TARGET_SSE || TARGET_3DNOW_A) return "pavgb\t{%2, %0|%0, %2}"; else - return "pavgusb\\t{%2, %0|%0, %2}"; + return "pavgusb\t{%2, %0|%0, %2}"; } [(set_attr "type" "mmxshft") (set_attr "mode" "DI")]) |