;; Patterns for the Intel Wireless MMX technology architecture.
;; Copyright (C) 2011-2020 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
;; .
(define_insn "iwmmxt_wabs3"
[(set (match_operand:VMMX 0 "register_operand" "=y")
(unspec:VMMX [(match_operand:VMMX 1 "register_operand" "y")] UNSPEC_WABS))]
"TARGET_REALLY_IWMMXT"
"wabs%?\\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 "addc3"
[(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"
"waddc%?\\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_tandc3"
[(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%?\\t r15"
[(set_attr "predicable" "yes")
(set_attr "type" "wmmx_tandc")]
)
(define_insn "iwmmxt_torc3"
[(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%?\\t r15"
[(set_attr "predicable" "yes")
(set_attr "type" "wmmx_torc")]
)
(define_insn "iwmmxt_torvsc3"
[(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%?\\t r15"
[(set_attr "predicable" "yes")
(set_attr "type" "wmmx_torvsc")]
)
(define_insn "iwmmxt_textrc3"
[(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%?\\t r15, %0"
[(set_attr "predicable" "yes")
(set_attr "type" "wmmx_textrc")]
)