+++ /dev/null
-;; Patterns for the Intel Wireless MMX technology architecture.
-;; Copyright (C) 2003-2025 Free Software Foundation, Inc.
-;; Contributed by Red Hat.
-
-;; This file is part of GCC.
-
-;; GCC is free software; you can redistribute it and/or modify it under
-;; the terms of the GNU General Public License as published by the Free
-;; Software Foundation; either version 3, or (at your option) any later
-;; version.
-
-;; GCC is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-;; License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GCC; see the file COPYING3. If not see
-;; <http://www.gnu.org/licenses/>.
-
-;; Register numbers. Need to sync with FIRST_IWMMXT_GR_REGNUM in arm.h
-(define_constants
- [(WCGR0 96)
- (WCGR1 97)
- (WCGR2 98)
- (WCGR3 99)
- ]
-)
-
-(define_insn "tbcstv8qi"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_duplicate:V8QI (match_operand:QI 1 "s_register_operand" "r")))]
- "TARGET_REALLY_IWMMXT"
- "tbcstb%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tbcst")]
-)
-
-(define_insn "tbcstv4hi"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_duplicate:V4HI (match_operand:HI 1 "s_register_operand" "r")))]
- "TARGET_REALLY_IWMMXT"
- "tbcsth%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tbcst")]
-)
-
-(define_insn "tbcstv2si"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_duplicate:V2SI (match_operand:SI 1 "s_register_operand" "r")))]
- "TARGET_REALLY_IWMMXT"
- "tbcstw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tbcst")]
-)
-
-(define_insn "iwmmxt_iordi3"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (ior:DI (match_operand:DI 1 "register_operand" "%y")
- (match_operand:DI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wor%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "length" "4")
- (set_attr "type" "wmmx_wor")]
-)
-
-(define_insn "iwmmxt_xordi3"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (xor:DI (match_operand:DI 1 "register_operand" "%y")
- (match_operand:DI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wxor%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "length" "4")
- (set_attr "type" "wmmx_wxor")]
-)
-
-(define_insn "iwmmxt_anddi3"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (and:DI (match_operand:DI 1 "register_operand" "%y")
- (match_operand:DI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wand%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "length" "4")
- (set_attr "type" "wmmx_wand")]
-)
-
-(define_insn "iwmmxt_nanddi3"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (and:DI (match_operand:DI 1 "register_operand" "y")
- (not:DI (match_operand:DI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wandn%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wandn")]
-)
-
-(define_insn "*iwmmxt_arm_movdi"
- [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, r, m,y,y,r, y,Uy,*w, r,*w,*w, *Uv")
- (match_operand:DI 1 "di_operand" "rDa,Db,Dc,mi,r,y,r,y,Uy,y, r,*w,*w,*Uvi,*w"))]
- "TARGET_REALLY_IWMMXT
- && ( register_operand (operands[0], DImode)
- || register_operand (operands[1], DImode))"
- "*
- switch (which_alternative)
- {
- case 0:
- case 1:
- case 2:
- return \"#\";
- case 3: case 4:
- return output_move_double (operands, true, NULL);
- case 5:
- return \"wmov%?\\t%0,%1\";
- case 6:
- return \"tmcrr%?\\t%0,%Q1,%R1\";
- case 7:
- return \"tmrrc%?\\t%Q0,%R0,%1\";
- case 8:
- return \"wldrd%?\\t%0,%1\";
- case 9:
- return \"wstrd%?\\t%1,%0\";
- case 10:
- return \"fmdrr%?\\t%P0, %Q1, %R1\\t%@ int\";
- case 11:
- return \"fmrrd%?\\t%Q0, %R0, %P1\\t%@ int\";
- case 12:
- if (TARGET_VFP_SINGLE)
- return \"fcpys%?\\t%0, %1\\t%@ int\;fcpys%?\\t%p0, %p1\\t%@ int\";
- else
- return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
- case 13: case 14:
- return output_move_vfp (operands);
- default:
- gcc_unreachable ();
- }
- "
- [(set (attr "length") (cond [(eq_attr "alternative" "0,3,4") (const_int 8)
- (eq_attr "alternative" "1") (const_int 12)
- (eq_attr "alternative" "2") (const_int 16)
- (eq_attr "alternative" "12")
- (if_then_else
- (eq (symbol_ref "TARGET_VFP_SINGLE") (const_int 1))
- (const_int 8)
- (const_int 4))]
- (const_int 4)))
- (set_attr "type" "*,*,*,load_8,store_8,*,*,*,*,*,f_mcrr,f_mrrc,\
- ffarithd,f_loadd,f_stored")
- (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,*,*,*,*,*,*,1020,*")
- (set_attr "arm_neg_pool_range" "*,*,*,1008,*,*,*,*,*,*,*,*,*,1008,*")]
-)
-
-(define_insn "*iwmmxt_movsi_insn"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk, m,z,r,?z,?Uy,*t, r,*t,*t ,*Uv")
- (match_operand:SI 1 "general_operand" " rk,I,K,j,mi,rk,r,z,Uy, z, r,*t,*t,*Uvi, *t"))]
- "TARGET_REALLY_IWMMXT
- && ( register_operand (operands[0], SImode)
- || register_operand (operands[1], SImode))"
- "*
- switch (which_alternative)
- {
- case 0: return \"mov\\t%0, %1\";
- case 1: return \"mov\\t%0, %1\";
- case 2: return \"mvn\\t%0, #%B1\";
- case 3: return \"movw\\t%0, %1\";
- case 4: return \"ldr\\t%0, %1\";
- case 5: return \"str\\t%1, %0\";
- case 6: return \"tmcr\\t%0, %1\";
- case 7: return \"tmrc\\t%0, %1\";
- case 8: return arm_output_load_gr (operands);
- case 9: return \"wstrw\\t%1, %0\";
- case 10:return \"fmsr\\t%0, %1\";
- case 11:return \"fmrs\\t%0, %1\";
- case 12:return \"fcpys\\t%0, %1\\t%@ int\";
- case 13: case 14:
- return output_move_vfp (operands);
- default:
- gcc_unreachable ();
- }"
- [(set_attr "type" "*,*,*,*,load_4,store_4,*,*,*,*,f_mcr,f_mrc,\
- fmov,f_loads,f_stores")
- (set_attr "length" "*,*,*,*,*, *,*,*, 16, *,*,*,*,*,*")
- (set_attr "pool_range" "*,*,*,*,4096, *,*,*,1024, *,*,*,*,1020,*")
- (set_attr "neg_pool_range" "*,*,*,*,4084, *,*,*, *, 1012,*,*,*,1008,*")
- ;; Note - the "predicable" attribute is not allowed to have alternatives.
- ;; Since the wSTRw wCx instruction is not predicable, we cannot support
- ;; predicating any of the alternatives in this template. Instead,
- ;; we do the predication ourselves, in cond_iwmmxt_movsi_insn.
- (set_attr "predicable" "no")
- ;; Also - we have to pretend that these insns clobber the condition code
- ;; bits as otherwise arm_final_prescan_insn() will try to conditionalize
- ;; them.
- (set_attr "conds" "clob")]
-)
-
-;; Because iwmmxt_movsi_insn is not predicable, we provide the
-;; cond_exec version explicitly, with appropriate constraints.
-
-(define_insn "*cond_iwmmxt_movsi_insn"
- [(cond_exec
- (match_operator 2 "arm_comparison_operator"
- [(match_operand 3 "cc_register" "")
- (const_int 0)])
- (set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r, m,z,r")
- (match_operand:SI 1 "general_operand" "rI,K,mi,r,r,z")))]
- "TARGET_REALLY_IWMMXT
- && ( register_operand (operands[0], SImode)
- || register_operand (operands[1], SImode))"
- "*
- switch (which_alternative)
- {
- case 0: return \"mov%?\\t%0, %1\";
- case 1: return \"mvn%?\\t%0, #%B1\";
- case 2: return \"ldr%?\\t%0, %1\";
- case 3: return \"str%?\\t%1, %0\";
- case 4: return \"tmcr%?\\t%0, %1\";
- default: return \"tmrc%?\\t%0, %1\";
- }"
- [(set_attr "type" "*,*,load_4,store_4,*,*")
- (set_attr "pool_range" "*,*,4096, *,*,*")
- (set_attr "neg_pool_range" "*,*,4084, *,*,*")]
-)
-
-(define_insn "mov<mode>_internal"
- [(set (match_operand:VMMX 0 "nonimmediate_operand" "=y,m,y,?r,?y,?r,?r,?m")
- (match_operand:VMMX 1 "general_operand" "y,y,mi,y,r,r,mi,r"))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0: return \"wmov%?\\t%0, %1\";
- case 1: return \"wstrd%?\\t%1, %0\";
- case 2: return \"wldrd%?\\t%0, %1\";
- case 3: return \"tmrrc%?\\t%Q0, %R0, %1\";
- case 4: return \"tmcrr%?\\t%0, %Q1, %R1\";
- case 5: return \"#\";
- default: return output_move_double (operands, true, NULL);
- }"
- [(set_attr "predicable" "yes")
- (set_attr "length" "4, 4, 4,4,4,8, 8,8")
- (set_attr "type" "wmmx_wmov,wmmx_wstr,wmmx_wldr,wmmx_tmrrc,wmmx_tmcrr,*,load_4,store_4")
- (set_attr "pool_range" "*, *, 256,*,*,*, 256,*")
- (set_attr "neg_pool_range" "*, *, 244,*,*,*, 244,*")]
-)
-
-(define_expand "iwmmxt_setwcgr0"
- [(set (reg:SI WCGR0)
- (match_operand:SI 0 "register_operand"))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_setwcgr1"
- [(set (reg:SI WCGR1)
- (match_operand:SI 0 "register_operand"))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_setwcgr2"
- [(set (reg:SI WCGR2)
- (match_operand:SI 0 "register_operand"))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_setwcgr3"
- [(set (reg:SI WCGR3)
- (match_operand:SI 0 "register_operand"))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_getwcgr0"
- [(set (match_operand:SI 0 "register_operand")
- (reg:SI WCGR0))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_getwcgr1"
- [(set (match_operand:SI 0 "register_operand")
- (reg:SI WCGR1))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_getwcgr2"
- [(set (match_operand:SI 0 "register_operand")
- (reg:SI WCGR2))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_expand "iwmmxt_getwcgr3"
- [(set (match_operand:SI 0 "register_operand")
- (reg:SI WCGR3))]
- "TARGET_REALLY_IWMMXT"
- {}
-)
-
-(define_insn "*and<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (and:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wand\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wand")]
-)
-
-(define_insn "*ior<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (ior:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wor\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wor")]
-)
-
-(define_insn "*xor<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (xor:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wxor\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wxor")]
-)
-
-
-;; Vector add/subtract
-
-(define_insn "*add<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (plus:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wadd<MMX_char>%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "ssaddv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (ss_plus:V8QI (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "waddbss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "ssaddv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (ss_plus:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "waddhss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "ssaddv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (ss_plus:V2SI (match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "waddwss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "usaddv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (us_plus:V8QI (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "waddbus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "usaddv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (us_plus:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "waddhus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "usaddv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (us_plus:V2SI (match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "waddwus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "*sub<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (minus:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsub<MMX_char>%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "sssubv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (ss_minus:V8QI (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsubbss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "sssubv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (ss_minus:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsubhss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "sssubv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (ss_minus:V2SI (match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsubwss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "ussubv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (us_minus:V8QI (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsubbus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "ussubv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (us_minus:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsubhus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "ussubv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (us_minus:V2SI (match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wsubwus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsub")]
-)
-
-(define_insn "*mulv4hi3_iwmmxt"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (mult:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wmulul%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmul")]
-)
-
-(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 "register_operand" "y"))
- (sign_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
- (const_int 16))))]
- "TARGET_REALLY_IWMMXT"
- "wmulsm%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmul")]
-)
-
-(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 "register_operand" "y"))
- (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
- (const_int 16))))]
- "TARGET_REALLY_IWMMXT"
- "wmulum%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmul")]
-)
-
-(define_insn "iwmmxt_wmacs"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:DI 1 "register_operand" "0")
- (match_operand:V4HI 2 "register_operand" "y")
- (match_operand:V4HI 3 "register_operand" "y")] UNSPEC_WMACS))]
- "TARGET_REALLY_IWMMXT"
- "wmacs%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmac")]
-)
-
-(define_insn "iwmmxt_wmacsz"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WMACSZ))]
- "TARGET_REALLY_IWMMXT"
- "wmacsz%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmac")]
-)
-
-(define_insn "iwmmxt_wmacu"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:DI 1 "register_operand" "0")
- (match_operand:V4HI 2 "register_operand" "y")
- (match_operand:V4HI 3 "register_operand" "y")] UNSPEC_WMACU))]
- "TARGET_REALLY_IWMMXT"
- "wmacu%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmac")]
-)
-
-(define_insn "iwmmxt_wmacuz"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WMACUZ))]
- "TARGET_REALLY_IWMMXT"
- "wmacuz%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmac")]
-)
-
-;; Same as xordi3, but don't show input operands so that we don't think
-;; they are live.
-(define_insn "iwmmxt_clrdi"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(const_int 0)] UNSPEC_CLRDI))]
- "TARGET_REALLY_IWMMXT"
- "wxor%?\\t%0, %0, %0"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wxor")]
-)
-
-;; Seems like cse likes to generate these, so we have to support them.
-
-(define_insn "iwmmxt_clrv8qi"
- [(set (match_operand:V8QI 0 "s_register_operand" "=y")
- (const_vector:V8QI [(const_int 0) (const_int 0)
- (const_int 0) (const_int 0)
- (const_int 0) (const_int 0)
- (const_int 0) (const_int 0)]))]
- "TARGET_REALLY_IWMMXT"
- "wxor%?\\t%0, %0, %0"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wxor")]
-)
-
-(define_insn "iwmmxt_clrv4hi"
- [(set (match_operand:V4HI 0 "s_register_operand" "=y")
- (const_vector:V4HI [(const_int 0) (const_int 0)
- (const_int 0) (const_int 0)]))]
- "TARGET_REALLY_IWMMXT"
- "wxor%?\\t%0, %0, %0"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wxor")]
-)
-
-(define_insn "iwmmxt_clrv2si"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (const_vector:V2SI [(const_int 0) (const_int 0)]))]
- "TARGET_REALLY_IWMMXT"
- "wxor%?\\t%0, %0, %0"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wxor")]
-)
-
-;; Unsigned averages/sum of absolute differences
-
-(define_insn "iwmmxt_uavgrndv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (truncate:V8QI
- (lshiftrt:V8HI
- (plus:V8HI
- (plus:V8HI (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (zero_extend:V8HI (match_operand:V8QI 2 "register_operand" "y")))
- (const_vector:V8HI [(const_int 1)
- (const_int 1)
- (const_int 1)
- (const_int 1)
- (const_int 1)
- (const_int 1)
- (const_int 1)
- (const_int 1)]))
- (const_int 1))))]
- "TARGET_REALLY_IWMMXT"
- "wavg2br%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wavg2")]
-)
-
-(define_insn "iwmmxt_uavgrndv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (truncate:V4HI
- (lshiftrt:V4SI
- (plus:V4SI
- (plus:V4SI (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
- (const_vector:V4SI [(const_int 1)
- (const_int 1)
- (const_int 1)
- (const_int 1)]))
- (const_int 1))))]
- "TARGET_REALLY_IWMMXT"
- "wavg2hr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wavg2")]
-)
-
-(define_insn "iwmmxt_uavgv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (truncate:V8QI
- (lshiftrt:V8HI
- (plus:V8HI (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (zero_extend:V8HI (match_operand:V8QI 2 "register_operand" "y")))
- (const_int 1))))]
- "TARGET_REALLY_IWMMXT"
- "wavg2b%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wavg2")]
-)
-
-(define_insn "iwmmxt_uavgv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (truncate:V4HI
- (lshiftrt:V4SI
- (plus:V4SI (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
- (const_int 1))))]
- "TARGET_REALLY_IWMMXT"
- "wavg2h%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wavg2")]
-)
-
-;; Insert/extract/shuffle
-
-(define_insn "iwmmxt_tinsrb"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_merge:V8QI
- (vec_duplicate:V8QI
- (truncate:QI (match_operand:SI 2 "nonimmediate_operand" "r")))
- (match_operand:V8QI 1 "register_operand" "0")
- (match_operand:SI 3 "immediate_operand" "i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- {
- return arm_output_iwmmxt_tinsr (operands);
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tinsr")]
-)
-
-(define_insn "iwmmxt_tinsrh"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_merge:V4HI
- (vec_duplicate:V4HI
- (truncate:HI (match_operand:SI 2 "nonimmediate_operand" "r")))
- (match_operand:V4HI 1 "register_operand" "0")
- (match_operand:SI 3 "immediate_operand" "i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- {
- return arm_output_iwmmxt_tinsr (operands);
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tinsr")]
-)
-
-(define_insn "iwmmxt_tinsrw"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_merge:V2SI
- (vec_duplicate:V2SI
- (match_operand:SI 2 "nonimmediate_operand" "r"))
- (match_operand:V2SI 1 "register_operand" "0")
- (match_operand:SI 3 "immediate_operand" "i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- {
- return arm_output_iwmmxt_tinsr (operands);
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tinsr")]
-)
-
-(define_insn "iwmmxt_textrmub"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (vec_select:QI (match_operand:V8QI 1 "register_operand" "y")
- (parallel
- [(match_operand:SI 2 "immediate_operand" "i")]))))]
- "TARGET_REALLY_IWMMXT"
- "textrmub%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_textrm")]
-)
-
-(define_insn "iwmmxt_textrmsb"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI (vec_select:QI (match_operand:V8QI 1 "register_operand" "y")
- (parallel
- [(match_operand:SI 2 "immediate_operand" "i")]))))]
- "TARGET_REALLY_IWMMXT"
- "textrmsb%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_textrm")]
-)
-
-(define_insn "iwmmxt_textrmuh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (vec_select:HI (match_operand:V4HI 1 "register_operand" "y")
- (parallel
- [(match_operand:SI 2 "immediate_operand" "i")]))))]
- "TARGET_REALLY_IWMMXT"
- "textrmuh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_textrm")]
-)
-
-(define_insn "iwmmxt_textrmsh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI (vec_select:HI (match_operand:V4HI 1 "register_operand" "y")
- (parallel
- [(match_operand:SI 2 "immediate_operand" "i")]))))]
- "TARGET_REALLY_IWMMXT"
- "textrmsh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_textrm")]
-)
-
-;; There are signed/unsigned variants of this instruction, but they are
-;; pointless.
-(define_insn "iwmmxt_textrmw"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (vec_select:SI (match_operand:V2SI 1 "register_operand" "y")
- (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
- "TARGET_REALLY_IWMMXT"
- "textrmsw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_textrm")]
-)
-
-(define_insn "iwmmxt_wshufh"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:SI 2 "immediate_operand" "i")] UNSPEC_WSHUFH))]
- "TARGET_REALLY_IWMMXT"
- "wshufh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wshufh")]
-)
-
-;; Mask-generating comparisons
-;;
-;; Note - you cannot use patterns like these here:
-;;
-;; (set (match:<vector>) (<comparator>:<vector> (match:<vector>) (match:<vector>)))
-;;
-;; Because GCC will assume that the truth value (1 or 0) is installed
-;; into the entire destination vector, (with the '1' going into the least
-;; significant element of the vector). This is not how these instructions
-;; behave.
-
-(define_insn "eqv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (unspec_volatile:V8QI [(match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")]
- VUNSPEC_WCMP_EQ))]
- "TARGET_REALLY_IWMMXT"
- "wcmpeqb%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpeq")]
-)
-
-(define_insn "eqv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (unspec_volatile:V4HI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")]
- VUNSPEC_WCMP_EQ))]
- "TARGET_REALLY_IWMMXT"
- "wcmpeqh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpeq")]
-)
-
-(define_insn "eqv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec_volatile:V2SI
- [(match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")]
- VUNSPEC_WCMP_EQ))]
- "TARGET_REALLY_IWMMXT"
- "wcmpeqw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpeq")]
-)
-
-(define_insn "gtuv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (unspec_volatile:V8QI [(match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")]
- VUNSPEC_WCMP_GTU))]
- "TARGET_REALLY_IWMMXT"
- "wcmpgtub%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpgt")]
-)
-
-(define_insn "gtuv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (unspec_volatile:V4HI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")]
- VUNSPEC_WCMP_GTU))]
- "TARGET_REALLY_IWMMXT"
- "wcmpgtuh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpgt")]
-)
-
-(define_insn "gtuv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec_volatile:V2SI [(match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")]
- VUNSPEC_WCMP_GTU))]
- "TARGET_REALLY_IWMMXT"
- "wcmpgtuw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpgt")]
-)
-
-(define_insn "gtv8qi3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (unspec_volatile:V8QI [(match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")]
- VUNSPEC_WCMP_GT))]
- "TARGET_REALLY_IWMMXT"
- "wcmpgtsb%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpgt")]
-)
-
-(define_insn "gtv4hi3"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (unspec_volatile:V4HI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")]
- VUNSPEC_WCMP_GT))]
- "TARGET_REALLY_IWMMXT"
- "wcmpgtsh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpgt")]
-)
-
-(define_insn "gtv2si3"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec_volatile:V2SI [(match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")]
- VUNSPEC_WCMP_GT))]
- "TARGET_REALLY_IWMMXT"
- "wcmpgtsw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wcmpgt")]
-)
-
-;; Max/min insns
-
-(define_insn "*smax<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (smax:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wmaxs<MMX_char>%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmax")]
-)
-
-(define_insn "*umax<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (umax:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wmaxu<MMX_char>%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmax")]
-)
-
-(define_insn "*smin<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (smin:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wmins<MMX_char>%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmin")]
-)
-
-(define_insn "*umin<mode>3_iwmmxt"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (umin:VMMX (match_operand:VMMX 1 "register_operand" "y")
- (match_operand:VMMX 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wminu<MMX_char>%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmin")]
-)
-
-;; Pack/unpack insns.
-
-(define_insn "iwmmxt_wpackhss"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_concat:V8QI
- (ss_truncate:V4QI (match_operand:V4HI 1 "register_operand" "y"))
- (ss_truncate:V4QI (match_operand:V4HI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wpackhss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wpack")]
-)
-
-(define_insn "iwmmxt_wpackwss"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_concat:V4HI
- (ss_truncate:V2HI (match_operand:V2SI 1 "register_operand" "y"))
- (ss_truncate:V2HI (match_operand:V2SI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wpackwss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wpack")]
-)
-
-(define_insn "iwmmxt_wpackdss"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_concat:V2SI
- (ss_truncate:SI (match_operand:DI 1 "register_operand" "y"))
- (ss_truncate:SI (match_operand:DI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wpackdss%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wpack")]
-)
-
-(define_insn "iwmmxt_wpackhus"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_concat:V8QI
- (us_truncate:V4QI (match_operand:V4HI 1 "register_operand" "y"))
- (us_truncate:V4QI (match_operand:V4HI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wpackhus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wpack")]
-)
-
-(define_insn "iwmmxt_wpackwus"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_concat:V4HI
- (us_truncate:V2HI (match_operand:V2SI 1 "register_operand" "y"))
- (us_truncate:V2HI (match_operand:V2SI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wpackwus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wpack")]
-)
-
-(define_insn "iwmmxt_wpackdus"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_concat:V2SI
- (us_truncate:SI (match_operand:DI 1 "register_operand" "y"))
- (us_truncate:SI (match_operand:DI 2 "register_operand" "y"))))]
- "TARGET_REALLY_IWMMXT"
- "wpackdus%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wpack")]
-)
-
-(define_insn "iwmmxt_wunpckihb"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_merge:V8QI
- (vec_select:V8QI (match_operand:V8QI 1 "register_operand" "y")
- (parallel [(const_int 4)
- (const_int 0)
- (const_int 5)
- (const_int 1)
- (const_int 6)
- (const_int 2)
- (const_int 7)
- (const_int 3)]))
- (vec_select:V8QI (match_operand:V8QI 2 "register_operand" "y")
- (parallel [(const_int 0)
- (const_int 4)
- (const_int 1)
- (const_int 5)
- (const_int 2)
- (const_int 6)
- (const_int 3)
- (const_int 7)]))
- (const_int 85)))]
- "TARGET_REALLY_IWMMXT"
- "wunpckihb%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckih")]
-)
-
-(define_insn "iwmmxt_wunpckihh"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_merge:V4HI
- (vec_select:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (parallel [(const_int 2)
- (const_int 0)
- (const_int 3)
- (const_int 1)]))
- (vec_select:V4HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 0)
- (const_int 2)
- (const_int 1)
- (const_int 3)]))
- (const_int 5)))]
- "TARGET_REALLY_IWMMXT"
- "wunpckihh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckih")]
-)
-
-(define_insn "iwmmxt_wunpckihw"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_merge:V2SI
- (vec_select:V2SI (match_operand:V2SI 1 "register_operand" "y")
- (parallel [(const_int 1)
- (const_int 0)]))
- (vec_select:V2SI (match_operand:V2SI 2 "register_operand" "y")
- (parallel [(const_int 0)
- (const_int 1)]))
- (const_int 1)))]
- "TARGET_REALLY_IWMMXT"
- "wunpckihw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckih")]
-)
-
-(define_insn "iwmmxt_wunpckilb"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_merge:V8QI
- (vec_select:V8QI (match_operand:V8QI 1 "register_operand" "y")
- (parallel [(const_int 0)
- (const_int 4)
- (const_int 1)
- (const_int 5)
- (const_int 2)
- (const_int 6)
- (const_int 3)
- (const_int 7)]))
- (vec_select:V8QI (match_operand:V8QI 2 "register_operand" "y")
- (parallel [(const_int 4)
- (const_int 0)
- (const_int 5)
- (const_int 1)
- (const_int 6)
- (const_int 2)
- (const_int 7)
- (const_int 3)]))
- (const_int 85)))]
- "TARGET_REALLY_IWMMXT"
- "wunpckilb%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckil")]
-)
-
-(define_insn "iwmmxt_wunpckilh"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_merge:V4HI
- (vec_select:V4HI (match_operand:V4HI 1 "register_operand" "y")
- (parallel [(const_int 0)
- (const_int 2)
- (const_int 1)
- (const_int 3)]))
- (vec_select:V4HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 2)
- (const_int 0)
- (const_int 3)
- (const_int 1)]))
- (const_int 5)))]
- "TARGET_REALLY_IWMMXT"
- "wunpckilh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckil")]
-)
-
-(define_insn "iwmmxt_wunpckilw"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_merge:V2SI
- (vec_select:V2SI (match_operand:V2SI 1 "register_operand" "y")
- (parallel [(const_int 0)
- (const_int 1)]))
- (vec_select:V2SI (match_operand:V2SI 2 "register_operand" "y")
- (parallel [(const_int 1)
- (const_int 0)]))
- (const_int 1)))]
- "TARGET_REALLY_IWMMXT"
- "wunpckilw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckil")]
-)
-
-(define_insn "iwmmxt_wunpckehub"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_select:V4HI
- (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (parallel [(const_int 4) (const_int 5)
- (const_int 6) (const_int 7)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckehub%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckeh")]
-)
-
-(define_insn "iwmmxt_wunpckehuh"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_select:V2SI
- (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 2) (const_int 3)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckehuh%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckeh")]
-)
-
-(define_insn "iwmmxt_wunpckehuw"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (vec_select:DI
- (zero_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (parallel [(const_int 1)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckehuw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckeh")]
-)
-
-(define_insn "iwmmxt_wunpckehsb"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_select:V4HI
- (sign_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (parallel [(const_int 4) (const_int 5)
- (const_int 6) (const_int 7)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckehsb%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckeh")]
-)
-
-(define_insn "iwmmxt_wunpckehsh"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_select:V2SI
- (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 2) (const_int 3)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckehsh%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckeh")]
-)
-
-(define_insn "iwmmxt_wunpckehsw"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (vec_select:DI
- (sign_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (parallel [(const_int 1)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckehsw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckeh")]
-)
-
-(define_insn "iwmmxt_wunpckelub"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_select:V4HI
- (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 1)
- (const_int 2) (const_int 3)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckelub%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckel")]
-)
-
-(define_insn "iwmmxt_wunpckeluh"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_select:V2SI
- (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 1)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckeluh%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckel")]
-)
-
-(define_insn "iwmmxt_wunpckeluw"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (vec_select:DI
- (zero_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (parallel [(const_int 0)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckeluw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckel")]
-)
-
-(define_insn "iwmmxt_wunpckelsb"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_select:V4HI
- (sign_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 1)
- (const_int 2) (const_int 3)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckelsb%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckel")]
-)
-
-(define_insn "iwmmxt_wunpckelsh"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (vec_select:V2SI
- (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 1)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckelsh%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckel")]
-)
-
-(define_insn "iwmmxt_wunpckelsw"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (vec_select:DI
- (sign_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (parallel [(const_int 0)])))]
- "TARGET_REALLY_IWMMXT"
- "wunpckelsw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wunpckel")]
-)
-
-;; Shifts
-
-(define_insn "ror<mode>3"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (rotatert:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:SI 2 "imm_or_reg_operand" "z,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wror<MMX_char>g%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wror<MMX_char>\", operands, true);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wror, wmmx_wror")]
-)
-
-(define_insn "ashr<mode>3_iwmmxt"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (ashiftrt:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:SI 2 "imm_or_reg_operand" "z,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wsra<MMX_char>g%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wsra<MMX_char>\", operands, true);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wsra, wmmx_wsra")]
-)
-
-(define_insn "lshr<mode>3_iwmmxt"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (lshiftrt:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:SI 2 "imm_or_reg_operand" "z,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wsrl<MMX_char>g%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wsrl<MMX_char>\", operands, false);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wsrl, wmmx_wsrl")]
-)
-
-(define_insn "ashl<mode>3_iwmmxt"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (ashift:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:SI 2 "imm_or_reg_operand" "z,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wsll<MMX_char>g%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wsll<MMX_char>\", operands, false);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wsll, wmmx_wsll")]
-)
-
-(define_insn "ror<mode>3_di"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (rotatert:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:DI 2 "imm_or_reg_operand" "y,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wror<MMX_char>%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wror<MMX_char>\", operands, true);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wror, wmmx_wror")]
-)
-
-(define_insn "ashr<mode>3_di"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (ashiftrt:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:DI 2 "imm_or_reg_operand" "y,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wsra<MMX_char>%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wsra<MMX_char>\", operands, true);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wsra, wmmx_wsra")]
-)
-
-(define_insn "lshr<mode>3_di"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (lshiftrt:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:DI 2 "register_operand" "y,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wsrl<MMX_char>%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wsrl<MMX_char>\", operands, false);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wsrl, wmmx_wsrl")]
-)
-
-(define_insn "ashl<mode>3_di"
- [(set (match_operand:VSHFT 0 "register_operand" "=y,y")
- (ashift:VSHFT (match_operand:VSHFT 1 "register_operand" "y,y")
- (match_operand:DI 2 "imm_or_reg_operand" "y,i")))]
- "TARGET_REALLY_IWMMXT"
- "*
- switch (which_alternative)
- {
- case 0:
- return \"wsll<MMX_char>%?\\t%0, %1, %2\";
- case 1:
- return arm_output_iwmmxt_shift_immediate (\"wsll<MMX_char>\", operands, false);
- default:
- gcc_unreachable ();
- }
- "
- [(set_attr "predicable" "yes")
- (set_attr "arch" "*, iwmmxt2")
- (set_attr "type" "wmmx_wsll, wmmx_wsll")]
-)
-
-(define_insn "iwmmxt_wmadds"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (plus:V2SI
- (mult:V2SI
- (vec_select:V2SI (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 1) (const_int 3)]))
- (vec_select:V2SI (sign_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))
- (parallel [(const_int 1) (const_int 3)])))
- (mult:V2SI
- (vec_select:V2SI (sign_extend:V4SI (match_dup 1))
- (parallel [(const_int 0) (const_int 2)]))
- (vec_select:V2SI (sign_extend:V4SI (match_dup 2))
- (parallel [(const_int 0) (const_int 2)])))))]
- "TARGET_REALLY_IWMMXT"
- "wmadds%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmadd")]
-)
-
-(define_insn "iwmmxt_wmaddu"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (plus:V2SI
- (mult:V2SI
- (vec_select:V2SI (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 1) (const_int 3)]))
- (vec_select:V2SI (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))
- (parallel [(const_int 1) (const_int 3)])))
- (mult:V2SI
- (vec_select:V2SI (zero_extend:V4SI (match_dup 1))
- (parallel [(const_int 0) (const_int 2)]))
- (vec_select:V2SI (zero_extend:V4SI (match_dup 2))
- (parallel [(const_int 0) (const_int 2)])))))]
- "TARGET_REALLY_IWMMXT"
- "wmaddu%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmadd")]
-)
-
-(define_insn "iwmmxt_tmia"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (mult:DI (sign_extend:DI
- (match_operand:SI 2 "register_operand" "r"))
- (sign_extend:DI
- (match_operand:SI 3 "register_operand" "r")))))]
- "TARGET_REALLY_IWMMXT"
- "tmia%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmia")]
-)
-
-(define_insn "iwmmxt_tmiaph"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI (sign_extend:DI
- (truncate:HI (match_operand:SI 2 "register_operand" "r")))
- (sign_extend:DI
- (truncate:HI (match_operand:SI 3 "register_operand" "r"))))
- (mult:DI (sign_extend:DI
- (truncate:HI (ashiftrt:SI (match_dup 2) (const_int 16))))
- (sign_extend:DI
- (truncate:HI (ashiftrt:SI (match_dup 3) (const_int 16))))))))]
- "TARGET_REALLY_IWMMXT"
- "tmiaph%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmiaph")]
-)
-
-(define_insn "iwmmxt_tmiabb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (mult:DI (sign_extend:DI
- (truncate:HI (match_operand:SI 2 "register_operand" "r")))
- (sign_extend:DI
- (truncate:HI (match_operand:SI 3 "register_operand" "r"))))))]
- "TARGET_REALLY_IWMMXT"
- "tmiabb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmiaxy")]
-)
-
-(define_insn "iwmmxt_tmiatb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (mult:DI (sign_extend:DI
- (truncate:HI
- (ashiftrt:SI
- (match_operand:SI 2 "register_operand" "r")
- (const_int 16))))
- (sign_extend:DI
- (truncate:HI
- (match_operand:SI 3 "register_operand" "r"))))))]
- "TARGET_REALLY_IWMMXT"
- "tmiatb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmiaxy")]
-)
-
-(define_insn "iwmmxt_tmiabt"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (mult:DI (sign_extend:DI
- (truncate:HI
- (match_operand:SI 2 "register_operand" "r")))
- (sign_extend:DI
- (truncate:HI
- (ashiftrt:SI
- (match_operand:SI 3 "register_operand" "r")
- (const_int 16)))))))]
- "TARGET_REALLY_IWMMXT"
- "tmiabt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmiaxy")]
-)
-
-(define_insn "iwmmxt_tmiatt"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (mult:DI (sign_extend:DI
- (truncate:HI
- (ashiftrt:SI
- (match_operand:SI 2 "register_operand" "r")
- (const_int 16))))
- (sign_extend:DI
- (truncate:HI
- (ashiftrt:SI
- (match_operand:SI 3 "register_operand" "r")
- (const_int 16)))))))]
- "TARGET_REALLY_IWMMXT"
- "tmiatt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmiaxy")]
-)
-
-(define_insn "iwmmxt_tmovmskb"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:V8QI 1 "register_operand" "y")] UNSPEC_TMOVMSK))]
- "TARGET_REALLY_IWMMXT"
- "tmovmskb%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmovmsk")]
-)
-
-(define_insn "iwmmxt_tmovmskh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:V4HI 1 "register_operand" "y")] UNSPEC_TMOVMSK))]
- "TARGET_REALLY_IWMMXT"
- "tmovmskh%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmovmsk")]
-)
-
-(define_insn "iwmmxt_tmovmskw"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:V2SI 1 "register_operand" "y")] UNSPEC_TMOVMSK))]
- "TARGET_REALLY_IWMMXT"
- "tmovmskw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tmovmsk")]
-)
-
-(define_insn "iwmmxt_waccb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:V8QI 1 "register_operand" "y")] UNSPEC_WACC))]
- "TARGET_REALLY_IWMMXT"
- "waccb%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wacc")]
-)
-
-(define_insn "iwmmxt_wacch"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:V4HI 1 "register_operand" "y")] UNSPEC_WACC))]
- "TARGET_REALLY_IWMMXT"
- "wacch%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wacc")]
-)
-
-(define_insn "iwmmxt_waccw"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (unspec:DI [(match_operand:V2SI 1 "register_operand" "y")] UNSPEC_WACC))]
- "TARGET_REALLY_IWMMXT"
- "waccw%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wacc")]
-)
-
-;; use unspec here to prevent 8 * imm to be optimized by cse
-(define_insn "iwmmxt_waligni"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (unspec:V8QI [(subreg:V8QI
- (ashiftrt:TI
- (subreg:TI (vec_concat:V16QI
- (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")) 0)
- (mult:SI
- (match_operand:SI 3 "immediate_operand" "i")
- (const_int 8))) 0)] UNSPEC_WALIGNI))]
- "TARGET_REALLY_IWMMXT"
- "waligni%?\\t%0, %1, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_waligni")]
-)
-
-(define_insn "iwmmxt_walignr"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (subreg:V8QI (ashiftrt:TI
- (subreg:TI (vec_concat:V16QI
- (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")) 0)
- (mult:SI
- (zero_extract:SI (match_operand:SI 3 "register_operand" "z") (const_int 3) (const_int 0))
- (const_int 8))) 0))]
- "TARGET_REALLY_IWMMXT"
- "walignr%U3%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_walignr")]
-)
-
-(define_insn "iwmmxt_walignr0"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (subreg:V8QI (ashiftrt:TI
- (subreg:TI (vec_concat:V16QI
- (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")) 0)
- (mult:SI
- (zero_extract:SI (reg:SI WCGR0) (const_int 3) (const_int 0))
- (const_int 8))) 0))]
- "TARGET_REALLY_IWMMXT"
- "walignr0%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_walignr")]
-)
-
-(define_insn "iwmmxt_walignr1"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (subreg:V8QI (ashiftrt:TI
- (subreg:TI (vec_concat:V16QI
- (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")) 0)
- (mult:SI
- (zero_extract:SI (reg:SI WCGR1) (const_int 3) (const_int 0))
- (const_int 8))) 0))]
- "TARGET_REALLY_IWMMXT"
- "walignr1%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_walignr")]
-)
-
-(define_insn "iwmmxt_walignr2"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (subreg:V8QI (ashiftrt:TI
- (subreg:TI (vec_concat:V16QI
- (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")) 0)
- (mult:SI
- (zero_extract:SI (reg:SI WCGR2) (const_int 3) (const_int 0))
- (const_int 8))) 0))]
- "TARGET_REALLY_IWMMXT"
- "walignr2%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_walignr")]
-)
-
-(define_insn "iwmmxt_walignr3"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (subreg:V8QI (ashiftrt:TI
- (subreg:TI (vec_concat:V16QI
- (match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")) 0)
- (mult:SI
- (zero_extract:SI (reg:SI WCGR3) (const_int 3) (const_int 0))
- (const_int 8))) 0))]
- "TARGET_REALLY_IWMMXT"
- "walignr3%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_walignr")]
-)
-
-(define_insn "iwmmxt_wsadb"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [
- (match_operand:V2SI 1 "register_operand" "0")
- (match_operand:V8QI 2 "register_operand" "y")
- (match_operand:V8QI 3 "register_operand" "y")] UNSPEC_WSAD))]
- "TARGET_REALLY_IWMMXT"
- "wsadb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsad")]
-)
-
-(define_insn "iwmmxt_wsadh"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [
- (match_operand:V2SI 1 "register_operand" "0")
- (match_operand:V4HI 2 "register_operand" "y")
- (match_operand:V4HI 3 "register_operand" "y")] UNSPEC_WSAD))]
- "TARGET_REALLY_IWMMXT"
- "wsadh%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsad")]
-)
-
-(define_insn "iwmmxt_wsadbz"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V8QI 1 "register_operand" "y")
- (match_operand:V8QI 2 "register_operand" "y")] UNSPEC_WSADZ))]
- "TARGET_REALLY_IWMMXT"
- "wsadbz%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsad")]
-)
-
-(define_insn "iwmmxt_wsadhz"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WSADZ))]
- "TARGET_REALLY_IWMMXT"
- "wsadhz%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsad")]
-)
-
-(include "iwmmxt2.md")
+++ /dev/null
-;; Patterns for the Intel Wireless MMX technology architecture.
-;; Copyright (C) 2011-2025 Free Software Foundation, Inc.
-;; Written by Marvell, Inc.
-;;
-;; This file is part of GCC.
-;;
-;; GCC is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published
-;; by the Free Software Foundation; either version 3, or (at your
-;; option) any later version.
-
-;; GCC is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-;; License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GCC; see the file COPYING3. If not see
-;; <http://www.gnu.org/licenses/>.
-
-(define_insn "iwmmxt_wabs<mode>3"
- [(set (match_operand:VMMX 0 "register_operand" "=y")
- (unspec:VMMX [(match_operand:VMMX 1 "register_operand" "y")] UNSPEC_WABS))]
- "TARGET_REALLY_IWMMXT"
- "wabs<MMX_char>%?\\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wabs")]
-)
-
-(define_insn "iwmmxt_wabsdiffb"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (truncate:V8QI
- (abs:V8HI
- (minus:V8HI
- (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (zero_extend:V8HI (match_operand:V8QI 2 "register_operand" "y"))))))]
- "TARGET_REALLY_IWMMXT"
- "wabsdiffb%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wabsdiff")]
-)
-
-(define_insn "iwmmxt_wabsdiffh"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (truncate: V4HI
- (abs:V4SI
- (minus:V4SI
- (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))))))]
- "TARGET_REALLY_IWMMXT"
- "wabsdiffh%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wabsdiff")]
-)
-
-(define_insn "iwmmxt_wabsdiffw"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (truncate: V2SI
- (abs:V2DI
- (minus:V2DI
- (zero_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (zero_extend:V2DI (match_operand:V2SI 2 "register_operand" "y"))))))]
- "TARGET_REALLY_IWMMXT"
- "wabsdiffw%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wabsdiff")]
-)
-
-(define_insn "iwmmxt_waddsubhx"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_merge:V4HI
- (ss_minus:V4HI
- (match_operand:V4HI 1 "register_operand" "y")
- (vec_select:V4HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 1) (const_int 0) (const_int 3) (const_int 2)])))
- (ss_plus:V4HI
- (match_dup 1)
- (vec_select:V4HI (match_dup 2)
- (parallel [(const_int 1) (const_int 0) (const_int 3) (const_int 2)])))
- (const_int 10)))]
- "TARGET_REALLY_IWMMXT"
- "waddsubhx%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_waddsubhx")]
-)
-
-(define_insn "iwmmxt_wsubaddhx"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (vec_merge:V4HI
- (ss_plus:V4HI
- (match_operand:V4HI 1 "register_operand" "y")
- (vec_select:V4HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 1) (const_int 0) (const_int 3) (const_int 2)])))
- (ss_minus:V4HI
- (match_dup 1)
- (vec_select:V4HI (match_dup 2)
- (parallel [(const_int 1) (const_int 0) (const_int 3) (const_int 2)])))
- (const_int 10)))]
- "TARGET_REALLY_IWMMXT"
- "wsubaddhx%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wsubaddhx")]
-)
-
-(define_insn "addc<mode>3"
- [(set (match_operand:VMMX2 0 "register_operand" "=y")
- (unspec:VMMX2
- [(plus:VMMX2
- (match_operand:VMMX2 1 "register_operand" "y")
- (match_operand:VMMX2 2 "register_operand" "y"))] UNSPEC_WADDC))]
- "TARGET_REALLY_IWMMXT"
- "wadd<MMX_char>c%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wadd")]
-)
-
-(define_insn "iwmmxt_avg4"
-[(set (match_operand:V8QI 0 "register_operand" "=y")
- (truncate:V8QI
- (vec_select:V8HI
- (vec_merge:V8HI
- (lshiftrt:V8HI
- (plus:V8HI
- (plus:V8HI
- (plus:V8HI
- (plus:V8HI
- (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (zero_extend:V8HI (match_operand:V8QI 2 "register_operand" "y")))
- (vec_select:V8HI (zero_extend:V8HI (match_dup 1))
- (parallel [(const_int 7) (const_int 0) (const_int 1) (const_int 2)
- (const_int 3) (const_int 4) (const_int 5) (const_int 6)])))
- (vec_select:V8HI (zero_extend:V8HI (match_dup 2))
- (parallel [(const_int 7) (const_int 0) (const_int 1) (const_int 2)
- (const_int 3) (const_int 4) (const_int 5) (const_int 6)])))
- (const_vector:V8HI [(const_int 1) (const_int 1) (const_int 1) (const_int 1)
- (const_int 1) (const_int 1) (const_int 1) (const_int 1)]))
- (const_int 2))
- (const_vector:V8HI [(const_int 0) (const_int 0) (const_int 0) (const_int 0)
- (const_int 0) (const_int 0) (const_int 0) (const_int 0)])
- (const_int 254))
- (parallel [(const_int 1) (const_int 2) (const_int 3) (const_int 4)
- (const_int 5) (const_int 6) (const_int 7) (const_int 0)]))))]
- "TARGET_REALLY_IWMMXT"
- "wavg4%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wavg4")]
-)
-
-(define_insn "iwmmxt_avg4r"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (truncate:V8QI
- (vec_select:V8HI
- (vec_merge:V8HI
- (lshiftrt:V8HI
- (plus:V8HI
- (plus:V8HI
- (plus:V8HI
- (plus:V8HI
- (zero_extend:V8HI (match_operand:V8QI 1 "register_operand" "y"))
- (zero_extend:V8HI (match_operand:V8QI 2 "register_operand" "y")))
- (vec_select:V8HI (zero_extend:V8HI (match_dup 1))
- (parallel [(const_int 7) (const_int 0) (const_int 1) (const_int 2)
- (const_int 3) (const_int 4) (const_int 5) (const_int 6)])))
- (vec_select:V8HI (zero_extend:V8HI (match_dup 2))
- (parallel [(const_int 7) (const_int 0) (const_int 1) (const_int 2)
- (const_int 3) (const_int 4) (const_int 5) (const_int 6)])))
- (const_vector:V8HI [(const_int 2) (const_int 2) (const_int 2) (const_int 2)
- (const_int 2) (const_int 2) (const_int 2) (const_int 2)]))
- (const_int 2))
- (const_vector:V8HI [(const_int 0) (const_int 0) (const_int 0) (const_int 0)
- (const_int 0) (const_int 0) (const_int 0) (const_int 0)])
- (const_int 254))
- (parallel [(const_int 1) (const_int 2) (const_int 3) (const_int 4)
- (const_int 5) (const_int 6) (const_int 7) (const_int 0)]))))]
- "TARGET_REALLY_IWMMXT"
- "wavg4r%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wavg4")]
-)
-
-(define_insn "iwmmxt_wmaddsx"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (plus:V2SI
- (mult:V2SI
- (vec_select:V2SI (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 1) (const_int 3)]))
- (vec_select:V2SI (sign_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 2)])))
- (mult:V2SI
- (vec_select:V2SI (sign_extend:V4SI (match_dup 1))
- (parallel [(const_int 0) (const_int 2)]))
- (vec_select:V2SI (sign_extend:V4SI (match_dup 2))
- (parallel [(const_int 1) (const_int 3)])))))]
- "TARGET_REALLY_IWMMXT"
- "wmaddsx%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmadd")]
-)
-
-(define_insn "iwmmxt_wmaddux"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (plus:V2SI
- (mult:V2SI
- (vec_select:V2SI (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 1) (const_int 3)]))
- (vec_select:V2SI (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 2)])))
- (mult:V2SI
- (vec_select:V2SI (zero_extend:V4SI (match_dup 1))
- (parallel [(const_int 0) (const_int 2)]))
- (vec_select:V2SI (zero_extend:V4SI (match_dup 2))
- (parallel [(const_int 1) (const_int 3)])))))]
- "TARGET_REALLY_IWMMXT"
- "wmaddux%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmadd")]
-)
-
-(define_insn "iwmmxt_wmaddsn"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (minus:V2SI
- (mult:V2SI
- (vec_select:V2SI (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 2)]))
- (vec_select:V2SI (sign_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 2)])))
- (mult:V2SI
- (vec_select:V2SI (sign_extend:V4SI (match_dup 1))
- (parallel [(const_int 1) (const_int 3)]))
- (vec_select:V2SI (sign_extend:V4SI (match_dup 2))
- (parallel [(const_int 1) (const_int 3)])))))]
- "TARGET_REALLY_IWMMXT"
- "wmaddsn%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmadd")]
-)
-
-(define_insn "iwmmxt_wmaddun"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (minus:V2SI
- (mult:V2SI
- (vec_select:V2SI (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 2)]))
- (vec_select:V2SI (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y"))
- (parallel [(const_int 0) (const_int 2)])))
- (mult:V2SI
- (vec_select:V2SI (zero_extend:V4SI (match_dup 1))
- (parallel [(const_int 1) (const_int 3)]))
- (vec_select:V2SI (zero_extend:V4SI (match_dup 2))
- (parallel [(const_int 1) (const_int 3)])))))]
- "TARGET_REALLY_IWMMXT"
- "wmaddun%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmadd")]
-)
-
-(define_insn "iwmmxt_wmulwsm"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (truncate:V2SI
- (ashiftrt:V2DI
- (mult:V2DI
- (sign_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (sign_extend:V2DI (match_operand:V2SI 2 "register_operand" "y")))
- (const_int 32))))]
- "TARGET_REALLY_IWMMXT"
- "wmulwsm%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmulw")]
-)
-
-(define_insn "iwmmxt_wmulwum"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (truncate:V2SI
- (lshiftrt:V2DI
- (mult:V2DI
- (zero_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (zero_extend:V2DI (match_operand:V2SI 2 "register_operand" "y")))
- (const_int 32))))]
- "TARGET_REALLY_IWMMXT"
- "wmulwum%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmulw")]
-)
-
-(define_insn "iwmmxt_wmulsmr"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (truncate:V4HI
- (ashiftrt:V4SI
- (plus:V4SI
- (mult:V4SI
- (sign_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (sign_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
- (const_vector:V4SI [(const_int 32768)
- (const_int 32768)
- (const_int 32768)]))
- (const_int 16))))]
- "TARGET_REALLY_IWMMXT"
- "wmulsmr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmul")]
-)
-
-(define_insn "iwmmxt_wmulumr"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (truncate:V4HI
- (lshiftrt:V4SI
- (plus:V4SI
- (mult:V4SI
- (zero_extend:V4SI (match_operand:V4HI 1 "register_operand" "y"))
- (zero_extend:V4SI (match_operand:V4HI 2 "register_operand" "y")))
- (const_vector:V4SI [(const_int 32768)
- (const_int 32768)
- (const_int 32768)
- (const_int 32768)]))
- (const_int 16))))]
- "TARGET_REALLY_IWMMXT"
- "wmulumr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmul")]
-)
-
-(define_insn "iwmmxt_wmulwsmr"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (truncate:V2SI
- (ashiftrt:V2DI
- (plus:V2DI
- (mult:V2DI
- (sign_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (sign_extend:V2DI (match_operand:V2SI 2 "register_operand" "y")))
- (const_vector:V2DI [(const_int 2147483648)
- (const_int 2147483648)]))
- (const_int 32))))]
- "TARGET_REALLY_IWMMXT"
- "wmulwsmr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmul")]
-)
-
-(define_insn "iwmmxt_wmulwumr"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (truncate:V2SI
- (lshiftrt:V2DI
- (plus:V2DI
- (mult:V2DI
- (zero_extend:V2DI (match_operand:V2SI 1 "register_operand" "y"))
- (zero_extend:V2DI (match_operand:V2SI 2 "register_operand" "y")))
- (const_vector:V2DI [(const_int 2147483648)
- (const_int 2147483648)]))
- (const_int 32))))]
- "TARGET_REALLY_IWMMXT"
- "wmulwumr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmulw")]
-)
-
-(define_insn "iwmmxt_wmulwl"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (mult:V2SI
- (match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")))]
- "TARGET_REALLY_IWMMXT"
- "wmulwl%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmulw")]
-)
-
-(define_insn "iwmmxt_wqmulm"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WQMULM))]
- "TARGET_REALLY_IWMMXT"
- "wqmulm%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmulm")]
-)
-
-(define_insn "iwmmxt_wqmulwm"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")] UNSPEC_WQMULWM))]
- "TARGET_REALLY_IWMMXT"
- "wqmulwm%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmulwm")]
-)
-
-(define_insn "iwmmxt_wqmulmr"
- [(set (match_operand:V4HI 0 "register_operand" "=y")
- (unspec:V4HI [(match_operand:V4HI 1 "register_operand" "y")
- (match_operand:V4HI 2 "register_operand" "y")] UNSPEC_WQMULMR))]
- "TARGET_REALLY_IWMMXT"
- "wqmulmr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmulm")]
-)
-
-(define_insn "iwmmxt_wqmulwmr"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "y")
- (match_operand:V2SI 2 "register_operand" "y")] UNSPEC_WQMULWMR))]
- "TARGET_REALLY_IWMMXT"
- "wqmulwmr%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmulwm")]
-)
-
-(define_insn "iwmmxt_waddbhusm"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_concat:V8QI
- (const_vector:V4QI [(const_int 0) (const_int 0) (const_int 0) (const_int 0)])
- (us_truncate:V4QI
- (ss_plus:V4HI
- (match_operand:V4HI 1 "register_operand" "y")
- (zero_extend:V4HI
- (vec_select:V4QI (match_operand:V8QI 2 "register_operand" "y")
- (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)])))))))]
- "TARGET_REALLY_IWMMXT"
- "waddbhusm%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_waddbhus")]
-)
-
-(define_insn "iwmmxt_waddbhusl"
- [(set (match_operand:V8QI 0 "register_operand" "=y")
- (vec_concat:V8QI
- (us_truncate:V4QI
- (ss_plus:V4HI
- (match_operand:V4HI 1 "register_operand" "y")
- (zero_extend:V4HI
- (vec_select:V4QI (match_operand:V8QI 2 "register_operand" "y")
- (parallel [(const_int 0) (const_int 1) (const_int 2) (const_int 3)])))))
- (const_vector:V4QI [(const_int 0) (const_int 0) (const_int 0) (const_int 0)])))]
- "TARGET_REALLY_IWMMXT"
- "waddbhusl%?\\t%0, %1, %2"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_waddbhus")]
-)
-
-(define_insn "iwmmxt_wqmiabb"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 32))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 32))] UNSPEC_WQMIAxy))]
- "TARGET_REALLY_IWMMXT"
- "wqmiabb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiabt"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 32))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 48))] UNSPEC_WQMIAxy))]
- "TARGET_REALLY_IWMMXT"
- "wqmiabt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiatb"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 48))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 32))] UNSPEC_WQMIAxy))]
- "TARGET_REALLY_IWMMXT"
- "wqmiatb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiatt"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 48))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 48))] UNSPEC_WQMIAxy))]
- "TARGET_REALLY_IWMMXT"
- "wqmiatt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiabbn"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 32))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 32))] UNSPEC_WQMIAxyn))]
- "TARGET_REALLY_IWMMXT"
- "wqmiabbn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiabtn"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 32))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 48))] UNSPEC_WQMIAxyn))]
- "TARGET_REALLY_IWMMXT"
- "wqmiabtn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiatbn"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 48))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 0))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 32))] UNSPEC_WQMIAxyn))]
- "TARGET_REALLY_IWMMXT"
- "wqmiatbn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wqmiattn"
- [(set (match_operand:V2SI 0 "register_operand" "=y")
- (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "0")
- (zero_extract:V4HI (match_operand:V4HI 2 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 2) (const_int 16) (const_int 48))
- (zero_extract:V4HI (match_operand:V4HI 3 "register_operand" "y") (const_int 16) (const_int 16))
- (zero_extract:V4HI (match_dup 3) (const_int 16) (const_int 48))] UNSPEC_WQMIAxyn))]
- "TARGET_REALLY_IWMMXT"
- "wqmiattn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wqmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiabb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 0)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 0)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 2)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 2)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiabb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiabt"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 0)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 1)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 2)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 3)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiabt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiatb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 1)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 0)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 3)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 2)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiatb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiatt"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 1)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 1)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 3)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 3)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiatt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiabbn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 0)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 0)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 2)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 2)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiabbn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiabtn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 0)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 1)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 2)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 3)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiabtn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiatbn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 1)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 0)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 3)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 2)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiatbn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiattn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI (match_operand:DI 1 "register_operand" "0")
- (plus:DI
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 2 "register_operand" "y")
- (parallel [(const_int 1)])))
- (sign_extend:DI
- (vec_select:HI (match_operand:V4HI 3 "register_operand" "y")
- (parallel [(const_int 1)]))))
- (mult:DI
- (sign_extend:DI
- (vec_select:HI (match_dup 2)
- (parallel [(const_int 3)])))
- (sign_extend:DI
- (vec_select:HI (match_dup 3)
- (parallel [(const_int 3)])))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiattn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiaxy")]
-)
-
-(define_insn "iwmmxt_wmiawbb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 0)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 0)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawbb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawbt"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 0)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 1)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawbt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawtb"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 1)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 0)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawtb%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawtt"
-[(set (match_operand:DI 0 "register_operand" "=y")
- (plus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 1)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 1)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawtt%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawbbn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 0)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 0)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawbbn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawbtn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 0)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 1)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawbtn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawtbn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 1)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 0)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawtbn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmiawttn"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (minus:DI
- (match_operand:DI 1 "register_operand" "0")
- (mult:DI
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 2 "register_operand" "y") (parallel [(const_int 1)])))
- (sign_extend:DI (vec_select:SI (match_operand:V2SI 3 "register_operand" "y") (parallel [(const_int 1)]))))))]
- "TARGET_REALLY_IWMMXT"
- "wmiawttn%?\\t%0, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmiawxy")]
-)
-
-(define_insn "iwmmxt_wmerge"
- [(set (match_operand:DI 0 "register_operand" "=y")
- (ior:DI
- (ashift:DI
- (match_operand:DI 2 "register_operand" "y")
- (minus:SI
- (const_int 64)
- (mult:SI
- (match_operand:SI 3 "immediate_operand" "i")
- (const_int 8))))
- (lshiftrt:DI
- (ashift:DI
- (match_operand:DI 1 "register_operand" "y")
- (mult:SI
- (match_dup 3)
- (const_int 8)))
- (mult:SI
- (match_dup 3)
- (const_int 8)))))]
- "TARGET_REALLY_IWMMXT"
- "wmerge%?\\t%0, %1, %2, %3"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_wmerge")]
-)
-
-(define_insn "iwmmxt_tandc<mode>3"
- [(set (reg:CC CC_REGNUM)
- (subreg:CC (unspec:VMMX [(const_int 0)] UNSPEC_TANDC) 0))
- (unspec:CC [(reg:SI 15)] UNSPEC_TANDC)]
- "TARGET_REALLY_IWMMXT"
- "tandc<MMX_char>%?\\t r15"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_tandc")]
-)
-
-(define_insn "iwmmxt_torc<mode>3"
- [(set (reg:CC CC_REGNUM)
- (subreg:CC (unspec:VMMX [(const_int 0)] UNSPEC_TORC) 0))
- (unspec:CC [(reg:SI 15)] UNSPEC_TORC)]
- "TARGET_REALLY_IWMMXT"
- "torc<MMX_char>%?\\t r15"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_torc")]
-)
-
-(define_insn "iwmmxt_torvsc<mode>3"
- [(set (reg:CC CC_REGNUM)
- (subreg:CC (unspec:VMMX [(const_int 0)] UNSPEC_TORVSC) 0))
- (unspec:CC [(reg:SI 15)] UNSPEC_TORVSC)]
- "TARGET_REALLY_IWMMXT"
- "torvsc<MMX_char>%?\\t r15"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_torvsc")]
-)
-
-(define_insn "iwmmxt_textrc<mode>3"
- [(set (reg:CC CC_REGNUM)
- (subreg:CC (unspec:VMMX [(const_int 0)
- (match_operand:SI 0 "immediate_operand" "i")] UNSPEC_TEXTRC) 0))
- (unspec:CC [(reg:SI 15)] UNSPEC_TEXTRC)]
- "TARGET_REALLY_IWMMXT"
- "textrc<MMX_char>%?\\t r15, %0"
- [(set_attr "predicable" "yes")
- (set_attr "type" "wmmx_textrc")]
-)