diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/config/c6x/c6x-mult.md | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/config/c6x/c6x-mult.md')
-rw-r--r-- | gcc-4.9/gcc/config/c6x/c6x-mult.md | 844 |
1 files changed, 844 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/config/c6x/c6x-mult.md b/gcc-4.9/gcc/config/c6x/c6x-mult.md new file mode 100644 index 000000000..d8e262652 --- /dev/null +++ b/gcc-4.9/gcc/config/c6x/c6x-mult.md @@ -0,0 +1,844 @@ +;; -*- buffer-read-only: t -*- +;; Generated automatically from c6x-mult.md.in by genmult.sh +;; Multiplication patterns for TI C6X. +;; This file is processed by genmult.sh to produce two variants of each +;; pattern, a normal one and a real_mult variant for modulo scheduling. +;; Copyright (C) 2010-2014 Free Software Foundation, Inc. +;; Contributed by Bernd Schmidt <bernds@codesourcery.com> +;; Contributed by CodeSourcery. +;; +;; 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/>. + +;; ------------------------------------------------------------------------- +;; Miscellaneous insns that execute on the M units +;; ------------------------------------------------------------------------- + +(define_insn "rotlsi3" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (rotate:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a") + (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")))] + "TARGET_INSNS_64" + "%|%.\\trotl\\t%$\\t%1, %2, %0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "bitrevsi2" + [(set (match_operand:SI 0 "register_operand" "=a,a,b,b") + (unspec:SI [(match_operand:SI 1 "register_operand" "a,?b,b,?a")] + UNSPEC_BITREV))] + "TARGET_INSNS_64" + "%|%.\\tbitr\\t%$\\t%1, %0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,y,n,y")]) + +;; Vector average. + +(define_insn "avgv2hi3" + [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b") + (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "a,b,?b,?a") + (match_operand:V2HI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG))] + "TARGET_INSNS_64" + "%|%.\\tavg2\\t%$\\t%1, %2, %0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "uavgv4qi3" + [(set (match_operand:V4QI 0 "register_operand" "=a,b,a,b") + (unspec:V4QI [(match_operand:V4QI 1 "register_operand" "a,b,?b,?a") + (match_operand:V4QI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG))] + "TARGET_INSNS_64" + "%|%.\\tavgu4\\t%$\\t%1, %2, %0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,n,y,y")]) + +;; ------------------------------------------------------------------------- +;; Multiplication +;; ------------------------------------------------------------------------- + +(define_insn "mulhi3" + [(set (match_operand:HI 0 "register_operand" "=a,b,a,b") + (mult:HI (match_operand:HI 1 "register_operand" "a,b,?b,?a") + (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5")))] + "" + "%|%.\\tmpy\\t%$\\t%2, %1, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "op_pattern" "sxs") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_const" + [(set (match_operand:SI 0 "register_operand" "=a,b,ab") + (mult:SI (sign_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?ab")) + (match_operand:HI 2 "scst5_operand" "Is5,Is5,Is5")))] + "" + "%|%.\\tmpy\\t%$\\t%2, %1, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y")]) + +(define_insn "*mulhisi3_insn" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (sign_extend:SI + (match_operand:HI 1 "register_operand" "%a,b,?a,?b")) + (sign_extend:SI + (match_operand:HI 2 "reg_or_scst5_operand" "a,b,b,a"))))] + "" + "%|%.\\tmpy\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "op_pattern" "ssx") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_lh" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (sign_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16))))] + "" + "%|%.\\tmpylh\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_hl" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (ashiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (sign_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tmpyhl\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_hh" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (ashiftrt:SI + (match_operand:SI 1 "register_operand" "%a,b,?a,?b") + (const_int 16)) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16))))] + "" + "%|%.\\tmpyh\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "%a,b,?a,?b")) + (zero_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tmpyu\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_lh" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (lshiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16))))] + "" + "%|%.\\tmpylhu\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_hl" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (zero_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tmpyhlu\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_hh" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "%a,b,?a,?b") + (const_int 16)) + (lshiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16))))] + "" + "%|%.\\tmpyhu\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_const" + [(set (match_operand:SI 0 "register_operand" "=a,b,ab") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?ab")) + (match_operand:SI 2 "scst5_operand" "Is5,Is5,Is5")))] + "" + "%|%.\\tmpysu\\t%$\\t%2, %1, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y")]) + +(define_insn "*usmulhisi3_insn" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (sign_extend:SI + (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,bIs5,aIs5"))))] + "" + "%|%.\\tmpyus\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_lh" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16))))] + "" + "%|%.\\tmpyluhs\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_hl" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (sign_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tmpyhuls\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_hh" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16))))] + "" + "%|%.\\tmpyhus\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulsi3_insn" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (mult:SI (match_operand:SI 1 "register_operand" "%a,b,?a,?b") + (match_operand:SI 2 "register_operand" "a,b,b,a")))] + "TARGET_MPY32" + "%|%.\\tmpy32\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "<u>mulsidi3" + [(set (match_operand:DI 0 "register_operand" "=a,b,a,b") + (mult:DI (any_ext:DI + (match_operand:SI 1 "register_operand" "%a,b,?a,?b")) + (any_ext:DI + (match_operand:SI 2 "register_operand" "a,b,b,a"))))] + "TARGET_MPY32" + "%|%.\\tmpy32<u>\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulsidi3" + [(set (match_operand:DI 0 "register_operand" "=a,b,a,b") + (mult:DI (zero_extend:DI + (match_operand:SI 1 "register_operand" "a,b,?a,?b")) + (sign_extend:DI + (match_operand:SI 2 "register_operand" "a,b,b,a"))))] + "TARGET_MPY32" + "%|%.\\tmpy32us\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +;; Widening vector multiply and dot product + +(define_insn "mulv2hiv2si3" + [(set (match_operand:V2SI 0 "register_operand" "=a,b,a,b") + (mult:V2SI + (sign_extend:V2SI (match_operand:V2HI 1 "register_operand" "a,b,a,b")) + (sign_extend:V2SI (match_operand:V2HI 2 "register_operand" "a,b,?b,?a"))))] + "TARGET_INSNS_64" + "%|%.\\tmpy2\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulv4qiv4hi3" + [(set (match_operand:V4HI 0 "register_operand" "=a,b,a,b") + (mult:V4HI + (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,a,b")) + (zero_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,?b,?a"))))] + "TARGET_INSNS_64" + "%|%.\\tmpyu4\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulv4qiv4hi3" + [(set (match_operand:V4HI 0 "register_operand" "=a,b,a,b") + (mult:V4HI + (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,?b,?a")) + (sign_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,a,b"))))] + "TARGET_INSNS_64" + "%|%.\\tmpyus4\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "dotv2hi" + [(set (match_operand:SI 0 "register_operand" "=a,b,a,b") + (plus:SI + (mult:SI + (sign_extend:SI + (vec_select:HI + (match_operand:V2HI 1 "register_operand" "a,b,a,b") + (parallel [(const_int 0)]))) + (sign_extend:SI + (vec_select:HI + (match_operand:V2HI 2 "register_operand" "a,b,?b,?a") + (parallel [(const_int 0)])))) + (mult:SI + (sign_extend:SI + (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))) + (sign_extend:SI + (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))))] + "TARGET_INSNS_64" + "%|%.\\tdotp2\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +;; Fractional multiply + +(define_insn "mulv2hqv2sq3" + [(set (match_operand:V2SQ 0 "register_operand" "=a,b,a,b") + (ss_mult:V2SQ + (fract_convert:V2SQ + (match_operand:V2HQ 1 "register_operand" "%a,b,?a,?b")) + (fract_convert:V2SQ + (match_operand:V2HQ 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tsmpy2\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3" + [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b") + (ss_mult:SQ + (fract_convert:SQ + (match_operand:HQ 1 "register_operand" "%a,b,?a,?b")) + (fract_convert:SQ + (match_operand:HQ 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tsmpy\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_lh" + [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b") + (ss_mult:SQ + (fract_convert:SQ + (match_operand:HQ 1 "register_operand" "a,b,?a,?b")) + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a")))))] + "" + "%|%.\\tsmpylh\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_hl" + [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b") + (ss_mult:SQ + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a"))) + (fract_convert:SQ + (match_operand:HQ 2 "register_operand" "a,b,b,a"))))] + "" + "%|%.\\tsmpyhl\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_hh" + [(set (match_operand:SQ 0 "register_operand" "=a,b,a,b") + (ss_mult:SQ + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a"))) + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a")))))] + "" + "%|%.\\tsmpyh\\t%$\\t%1, %2, %0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) +;; Multiplication patterns for TI C6X. +;; This file is processed by genmult.sh to produce two variants of each +;; pattern, a normal one and a real_mult variant for modulo scheduling. +;; Copyright (C) 2010-2014 Free Software Foundation, Inc. +;; Contributed by Bernd Schmidt <bernds@codesourcery.com> +;; Contributed by CodeSourcery. +;; +;; 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/>. + +;; ------------------------------------------------------------------------- +;; Miscellaneous insns that execute on the M units +;; ------------------------------------------------------------------------- + +(define_insn "rotlsi3_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (rotate:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a") + (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5"))] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\trotl\\t%$\\t%1, %2, %k0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "bitrevsi2_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JA,JB,JB") + (unspec:SI [(match_operand:SI 1 "register_operand" "a,?b,b,?a")] + UNSPEC_BITREV)] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tbitr\\t%$\\t%1, %k0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,y,n,y")]) + +;; Vector average. + +(define_insn "avgv2hi3_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "a,b,?b,?a") + (match_operand:V2HI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG)] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tavg2\\t%$\\t%1, %2, %k0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "uavgv4qi3_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (unspec:V4QI [(match_operand:V4QI 1 "register_operand" "a,b,?b,?a") + (match_operand:V4QI 2 "register_operand" "a,b,a,b")] UNSPEC_AVG)] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tavgu4\\t%$\\t%1, %2, %k0" + [(set_attr "units" "m") + (set_attr "type" "mpy2") + (set_attr "cross" "n,n,y,y")]) + +;; ------------------------------------------------------------------------- +;; Multiplication +;; ------------------------------------------------------------------------- + +(define_insn "mulhi3_real" + [(unspec [(match_operand:HI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:HI (match_operand:HI 1 "register_operand" "a,b,?b,?a") + (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5"))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpy\\t%$\\t%2, %1, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "op_pattern" "sxs") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_const_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JAJB") + (mult:SI (sign_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?ab")) + (match_operand:HI 2 "scst5_operand" "Is5,Is5,Is5"))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpy\\t%$\\t%2, %1, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y")]) + +(define_insn "*mulhisi3_insn_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (sign_extend:SI + (match_operand:HI 1 "register_operand" "%a,b,?a,?b")) + (sign_extend:SI + (match_operand:HI 2 "reg_or_scst5_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpy\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "op_pattern" "ssx") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_lh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (sign_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16)))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpylh\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_hl_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (ashiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (sign_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyhl\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhisi3_hh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (ashiftrt:SI + (match_operand:SI 1 "register_operand" "%a,b,?a,?b") + (const_int 16)) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16)))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyh\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "%a,b,?a,?b")) + (zero_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyu\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_lh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (lshiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16)))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpylhu\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_hl_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (zero_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyhlu\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulhisi3_hh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "%a,b,?a,?b") + (const_int 16)) + (lshiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16)))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyhu\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_const_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JAJB") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?ab")) + (match_operand:SI 2 "scst5_operand" "Is5,Is5,Is5"))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpysu\\t%$\\t%2, %1, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y")]) + +(define_insn "*usmulhisi3_insn_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (sign_extend:SI + (match_operand:HI 2 "reg_or_scst5_operand" "aIs5,bIs5,bIs5,aIs5")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyus\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_lh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (zero_extend:SI + (match_operand:HI 1 "register_operand" "a,b,?a,?b")) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16)))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyluhs\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_hl_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (sign_extend:SI + (match_operand:HI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyhuls\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulhisi3_hh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (lshiftrt:SI + (match_operand:SI 1 "register_operand" "a,b,?a,?b") + (const_int 16)) + (ashiftrt:SI + (match_operand:SI 2 "register_operand" "a,b,b,a") + (const_int 16)))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tmpyhus\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulsi3_insn_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:SI (match_operand:SI 1 "register_operand" "%a,b,?a,?b") + (match_operand:SI 2 "register_operand" "a,b,b,a"))] UNSPEC_REAL_MULT)] + "TARGET_MPY32" + "%|%.\\tmpy32\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "<u>mulsidi3_real" + [(unspec [(match_operand:DI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:DI (any_ext:DI + (match_operand:SI 1 "register_operand" "%a,b,?a,?b")) + (any_ext:DI + (match_operand:SI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "TARGET_MPY32" + "%|%.\\tmpy32<u>\\t%$\\t%1, %2, %K0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulsidi3_real" + [(unspec [(match_operand:DI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:DI (zero_extend:DI + (match_operand:SI 1 "register_operand" "a,b,?a,?b")) + (sign_extend:DI + (match_operand:SI 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "TARGET_MPY32" + "%|%.\\tmpy32us\\t%$\\t%1, %2, %K0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +;; Widening vector multiply and dot product + +(define_insn "mulv2hiv2si3_real" + [(unspec [(match_operand:V2SI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:V2SI + (sign_extend:V2SI (match_operand:V2HI 1 "register_operand" "a,b,a,b")) + (sign_extend:V2SI (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tmpy2\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "umulv4qiv4hi3_real" + [(unspec [(match_operand:V4HI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:V4HI + (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,a,b")) + (zero_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tmpyu4\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "usmulv4qiv4hi3_real" + [(unspec [(match_operand:V4HI 0 "const_int_operand" "=JA,JB,JA,JB") + (mult:V4HI + (zero_extend:V4HI (match_operand:V4QI 1 "register_operand" "a,b,?b,?a")) + (sign_extend:V4HI (match_operand:V4QI 2 "register_operand" "a,b,a,b")))] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tmpyus4\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "dotv2hi_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (plus:SI + (mult:SI + (sign_extend:SI + (vec_select:HI + (match_operand:V2HI 1 "register_operand" "a,b,a,b") + (parallel [(const_int 0)]))) + (sign_extend:SI + (vec_select:HI + (match_operand:V2HI 2 "register_operand" "a,b,?b,?a") + (parallel [(const_int 0)])))) + (mult:SI + (sign_extend:SI + (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))) + (sign_extend:SI + (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))))] UNSPEC_REAL_MULT)] + "TARGET_INSNS_64" + "%|%.\\tdotp2\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +;; Fractional multiply + +(define_insn "mulv2hqv2sq3_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (ss_mult:V2SQ + (fract_convert:V2SQ + (match_operand:V2HQ 1 "register_operand" "%a,b,?a,?b")) + (fract_convert:V2SQ + (match_operand:V2HQ 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tsmpy2\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy4") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (ss_mult:SQ + (fract_convert:SQ + (match_operand:HQ 1 "register_operand" "%a,b,?a,?b")) + (fract_convert:SQ + (match_operand:HQ 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tsmpy\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_lh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (ss_mult:SQ + (fract_convert:SQ + (match_operand:HQ 1 "register_operand" "a,b,?a,?b")) + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a"))))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tsmpylh\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_hl_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (ss_mult:SQ + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a"))) + (fract_convert:SQ + (match_operand:HQ 2 "register_operand" "a,b,b,a")))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tsmpyhl\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) + +(define_insn "mulhqsq3_hh_real" + [(unspec [(match_operand:SI 0 "const_int_operand" "=JA,JB,JA,JB") + (ss_mult:SQ + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 1 "register_operand" "a,b,b,a"))) + (fract_convert:SQ + (truncate:HQ (match_operand:SQ 2 "register_operand" "a,b,b,a"))))] UNSPEC_REAL_MULT)] + "" + "%|%.\\tsmpyh\\t%$\\t%1, %2, %k0" + [(set_attr "type" "mpy2") + (set_attr "units" "m") + (set_attr "cross" "n,n,y,y")]) |