aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8.1/gcc/config/tilepro/tilepro.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.8.1/gcc/config/tilepro/tilepro.md')
-rw-r--r--gcc-4.8.1/gcc/config/tilepro/tilepro.md3817
1 files changed, 0 insertions, 3817 deletions
diff --git a/gcc-4.8.1/gcc/config/tilepro/tilepro.md b/gcc-4.8.1/gcc/config/tilepro/tilepro.md
deleted file mode 100644
index ca8cf80ca..000000000
--- a/gcc-4.8.1/gcc/config/tilepro/tilepro.md
+++ /dev/null
@@ -1,3817 +0,0 @@
-;; Machine description for Tilera TILEPro chip for GCC.
-;; Copyright (C) 2011-2013 Free Software Foundation, Inc.
-;; Contributed by Walter Lee (walt@tilera.com)
-;;
-;; 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_constants [
- ;;
- ;; The following represent intrinsic insns, organized by latency.
- ;;
-
- ;; single cycle
- (UNSPEC_INSN_ADDLIS 1)
- (UNSPEC_INSN_AULI 2)
- (UNSPEC_INSN_AVGB_U 3)
- (UNSPEC_INSN_AVGH 4)
- (UNSPEC_INSN_BITX 5)
- (UNSPEC_INSN_CRC32_32 6)
- (UNSPEC_INSN_CRC32_8 7)
- (UNSPEC_INSN_DRAIN 8)
- (UNSPEC_INSN_DTLBPR 9)
- (UNSPEC_INSN_DWORD_ALIGN 10)
- (UNSPEC_INSN_FINV 11)
- (UNSPEC_INSN_FLUSH 12)
- (UNSPEC_INSN_FNOP 13)
- (UNSPEC_INSN_ICOH 14)
- (UNSPEC_INSN_ILL 15)
- (UNSPEC_INSN_INFO 16)
- (UNSPEC_INSN_INFOL 17)
- (UNSPEC_INSN_INV 18)
- (UNSPEC_INSN_LNK 19)
- (UNSPEC_INSN_MFSPR 20)
- (UNSPEC_INSN_MNZB 21)
- (UNSPEC_INSN_MNZH 22)
- (UNSPEC_INSN_MOVELIS 23)
- (UNSPEC_INSN_MTSPR 24)
- (UNSPEC_INSN_MZB 25)
- (UNSPEC_INSN_MZH 26)
- (UNSPEC_INSN_NAP 27)
- (UNSPEC_INSN_PACKBS_U 28)
- (UNSPEC_INSN_PACKHB 29)
- (UNSPEC_INSN_PACKHS 30)
- (UNSPEC_INSN_PACKLB 31)
- (UNSPEC_INSN_PREFETCH_L1 32)
- (UNSPEC_INSN_TBLIDXB0 33)
- (UNSPEC_INSN_TBLIDXB1 34)
- (UNSPEC_INSN_TBLIDXB2 35)
- (UNSPEC_INSN_TBLIDXB3 36)
- (UNSPEC_INSN_WH64 37)
-
- ;; 2 cycles
- (UNSPEC_INSN_ADIFFB_U 100)
- (UNSPEC_INSN_ADIFFH 101)
- (UNSPEC_INSN_MULHHA_SS 102)
- (UNSPEC_INSN_MULHHA_SU 103)
- (UNSPEC_INSN_MULHHA_UU 104)
- (UNSPEC_INSN_MULHHSA_UU 105)
- (UNSPEC_INSN_MULHH_SS 106)
- (UNSPEC_INSN_MULHH_SU 107)
- (UNSPEC_INSN_MULHH_UU 108)
- (UNSPEC_INSN_MULHLA_SS 109)
- (UNSPEC_INSN_MULHLA_SU 110)
- (UNSPEC_INSN_MULHLA_US 111)
- (UNSPEC_INSN_MULHLA_UU 112)
- (UNSPEC_INSN_MULHLSA_UU 113)
- (UNSPEC_INSN_MULHL_SS 114)
- (UNSPEC_INSN_MULHL_SU 115)
- (UNSPEC_INSN_MULHL_US 116)
- (UNSPEC_INSN_MULHL_UU 117)
- (UNSPEC_INSN_MULLLA_SS 118)
- (UNSPEC_INSN_MULLLA_SU 119)
- (UNSPEC_INSN_MULLLA_UU 120)
- (UNSPEC_INSN_MULLLSA_UU 121)
- (UNSPEC_INSN_MULLL_SU 122)
- (UNSPEC_INSN_MULLL_SS 123)
- (UNSPEC_INSN_MULLL_UU 124)
- (UNSPEC_INSN_SADAB_U 125)
- (UNSPEC_INSN_SADAH 126)
- (UNSPEC_INSN_SADAH_U 127)
- (UNSPEC_INSN_SADB_U 128)
- (UNSPEC_INSN_SADH 129)
- (UNSPEC_INSN_SADH_U 130)
-
- ;;
- ;; The following are special insns.
- ;;
-
- ;; Blockage
- (UNSPEC_BLOCKAGE 200)
-
- ;; Latency specifying loads.
- (UNSPEC_LATENCY_L2 201)
- (UNSPEC_LATENCY_MISS 202)
-
- ;; Lnk and its label
- (UNSPEC_LNK_AND_LABEL 203)
-
- ;; Memory fence
- (UNSPEC_MF 204)
-
- ;; A pseudo-op that prevents network operations from being ordered.
- (UNSPEC_NETWORK_BARRIER 205)
-
- ;; Operations that access network registers.
- (UNSPEC_NETWORK_RECEIVE 206)
- (UNSPEC_NETWORK_SEND 207)
-
- ;; Stack protector operations
- (UNSPEC_SP_SET 208)
- (UNSPEC_SP_TEST 209)
-
- ;; A call to __tls_get_addr
- (UNSPEC_TLS_GD_CALL 210)
-
- ;; An opaque TLS "add" operation for TLS general dynamic model
- ;; access.
- (UNSPEC_TLS_GD_ADD 211)
-
- ;; An opaque TLS "load" operation for TLS initial exec model access.
- (UNSPEC_TLS_IE_LOAD 212)
-
- ;;
- ;; The following are operands.
- ;;
- (UNSPEC_PCREL_SYM 300)
- (UNSPEC_GOT16_SYM 301)
- (UNSPEC_GOT32_SYM 302)
- (UNSPEC_TLS_GD 303)
- (UNSPEC_TLS_IE 304)
- (UNSPEC_TLS_LE 305)
-])
-
-;; Mark the last instruction of various latencies, used to
-;; determine the rtx costs of unspec insns.
-(define_constants [
- (TILEPRO_LAST_LATENCY_1_INSN 99)
- (TILEPRO_LAST_LATENCY_2_INSN 199)
- (TILEPRO_LAST_LATENCY_INSN 299)
-])
-
-;; Constants for network registers.
-(define_constants [
- (TILEPRO_NETREG_IDN0 0)
- (TILEPRO_NETREG_IDN1 1)
- (TILEPRO_NETREG_SN 2)
- (TILEPRO_NETREG_UDN0 3)
- (TILEPRO_NETREG_UDN1 4)
- (TILEPRO_NETREG_UDN2 5)
- (TILEPRO_NETREG_UDN3 6)
-])
-
-;; Constants for special purpose registers.
-(define_constants [
- (TILEPRO_NETORDER_REG 66)])
-
-
-;; Operand and operator predicates and constraints
-
-(include "predicates.md")
-(include "constraints.md")
-(include "tilepro-generic.md")
-
-;; Define an insn type attribute. This defines what pipes things can
-;; go in.
-(define_attr "type"
- "X0,X0_2cycle,X1,X1_branch,X1_2cycle,X1_L2,X1_miss,X01,Y0,Y0_2cycle,Y2,Y2_2cycle,Y2_L2,Y2_miss,Y01,cannot_bundle,cannot_bundle_3cycle,cannot_bundle_4cycle,nothing"
- (const_string "Y01"))
-
-(define_attr "length" ""
- (cond [(eq_attr "type" "X1_branch")
- (if_then_else
- (and (le (minus (match_dup 0) (pc)) (const_int 524280))
- (le (minus (pc) (match_dup 0)) (const_int 524288)))
- (const_int 8)
- (const_int 16))
- ]
- (const_int 8)))
-
-
-;; Define iterators.
-(define_mode_iterator I48MODE [SI DI])
-(define_mode_iterator I12MODE [QI HI])
-
-(define_code_iterator binop_u5bit [ashift ashiftrt lshiftrt rotate])
-(define_code_iterator binop_with_imm
- [ashift lshiftrt ashiftrt rotate eq lt and ior xor])
-(define_code_iterator unop [bswap clz ctz popcount])
-
-(define_mode_attr load [(QI "lb") (HI "lh") (SI "lw")])
-(define_mode_attr store [(QI "sb") (HI "sh") (SI "sw")])
-
-;; <optab> expands to the name of the optab for a particular code.
-(define_code_attr optab [(ashift "ashl")
- (ashiftrt "ashr")
- (lshiftrt "lshr")
- (eq "seq")
- (ne "sne")
- (lt "slt")
- (ltu "sltu")
- (le "sle")
- (leu "sleu")
- (minus "sub")
- (plus "add")
- (rotate "rotl")
- (smax "smax")
- (smin "smin")
- (umax "umax")
- (umin "umin")
- (ss_minus "sssub")
- (ss_plus "ssadd")
- (us_minus "ussub")
- (us_plus "usadd")
- (and "and")
- (ior "ior")
- (xor "xor")
- (bswap "bswap")
- (clz "clz")
- (ctz "ctz")
- (popcount "popcount")])
-
-;; <insn> expands to the name of the insn that implements a particular
-;; code.
-(define_code_attr insn [(ashift "shl")
- (ashiftrt "sra")
- (lshiftrt "shr")
- (eq "seq")
- (ne "sne")
- (lt "slt")
- (ltu "slt")
- (le "slte")
- (leu "slte")
- (minus "sub")
- (plus "add")
- (rotate "rl")
- (smax "max")
- (smin "min")
- (umax "max")
- (umin "min")
- (ss_minus "sub")
- (ss_plus "add")
- (us_minus "sub")
- (us_plus "add")
- (and "and")
- (ior "or")
- (xor "xor")
- (bswap "bytex")
- (clz "clz")
- (ctz "ctz")
- (popcount "pcnt")])
-
-;; <u> expands to the suffix of the insn that implements a particular
-;; code.
-(define_code_attr u [(ashift "")
- (ashiftrt "")
- (lshiftrt "")
- (eq "")
- (ne "")
- (lt "")
- (ltu "_u")
- (le "")
- (leu "_u")
- (minus "")
- (plus "")
- (rotate "")
- (smax "")
- (smin "")
- (umax "_u")
- (umin "_u")
- (ss_minus "s")
- (ss_plus "s")
- (us_minus "s_u")
- (us_plus "s_u")
- (and "")
- (ior "")
- (xor "")])
-
-;; <comm> indicates whether a particular code is commutative, using
-;; the "%" commutative opterator constraint.
-(define_code_attr comm [(ashift "")
- (ashiftrt "")
- (lshiftrt "")
- (eq "%")
- (ne "%")
- (lt "")
- (ltu "")
- (le "")
- (leu "")
- (minus "")
- (plus "%")
- (rotate "")
- (smax "%")
- (umax "%")
- (smin "%")
- (umin "%")
- (ss_plus "%")
- (us_plus "%")
- (ss_minus "")
- (us_minus "")
- (and "%")
- (ior "%")
- (xor "%")])
-
-(define_mode_iterator VEC [V4QI V2HI])
-
-;; Code iterator for all three shifts.
-(define_code_iterator any_shift [ashift ashiftrt lshiftrt])
-
-;; Code iterator for all byte ops without immediate variants.
-(define_code_iterator v1op [us_plus ne le leu minus us_minus])
-
-;; Code iterator for all 2-byte vector ops without immediate variants.
-(define_code_iterator v2op [ss_plus ne le leu minus ss_minus])
-
-;; Code iterator for all byte vector ops with immediate variants.
-(define_code_iterator v1op_immed [plus umax umin eq lt ltu])
-
-;; Code iterator for all 2-byte vector ops with immediate variants.
-(define_code_iterator v2op_immed [plus smax smin eq lt ltu])
-
-;; Code for packing two 2-byte vectors.
-(define_code_iterator v2pack [truncate us_truncate])
-
-;; <pack_optab> expands to the part of the optab name describing how
-;; two vectors are packed.
-(define_code_attr pack_optab [(truncate "trunc")
- (us_truncate "usat")
- (ss_truncate "ssat")])
-
-;; <pack_insn> expands to the insn that implements a particular vector
-;; packing code.
-(define_code_attr pack_insn [(truncate "packl")
- (us_truncate "pack")
- (ss_truncate "pack")])
-
-;; <pack_u> expands to the suffix of the insn that implements a
-;; particular vector packing code.
-(define_code_attr pack_u [(truncate "")
- (us_truncate "s_u")
- (ss_truncate "s")])
-
-
-;;
-;; The basic data move insns.
-;;
-
-(define_expand "movqi"
- [(set (match_operand:QI 0 "nonimmediate_operand" "")
- (match_operand:QI 1 "nonautoinc_operand" ""))]
- ""
-{
- if (tilepro_expand_mov (QImode, operands))
- DONE;
-})
-
-(define_insn "*movqi_insn"
- [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,r,U,m")
- (match_operand:QI 1 "move_operand" "r,I,U,m,rO,rO"))]
- "(register_operand (operands[0], QImode)
- || reg_or_0_operand (operands[1], QImode))"
- "@
- move\t%0, %r1
- movei\t%0, %1
- lb_u\t%0, %1
- lbadd_u\t%0, %I1, %i1
- sb\t%0, %r1
- sbadd\t%I0, %r1, %i0"
- [(set_attr "type" "*,*,Y2_2cycle,X1_2cycle,Y2,X1")])
-
-(define_expand "movhi"
- [(set (match_operand:HI 0 "nonimmediate_operand" "")
- (match_operand:HI 1 "nonautoinc_operand" ""))]
- ""
-{
- if (tilepro_expand_mov (HImode, operands))
- DONE;
-})
-
-(define_insn "*movhi_insn"
- [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,r,r,U,m")
- (match_operand:HI 1 "move_operand" "r,I,J,U,m,rO,rO"))]
- "(register_operand (operands[0], HImode)
- || reg_or_0_operand (operands[1], HImode))"
- "@
- move\t%0, %r1
- movei\t%0, %1
- moveli\t%0, %1
- lh_u\t%0, %1
- lhadd_u\t%0, %I1, %i1
- sh\t%0, %r1
- shadd\t%I0, %r1, %i0"
- [(set_attr "type" "*,*,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
-
-
-(define_expand "movsi"
- [(set (match_operand:SI 0 "nonimmediate_operand" "")
- (match_operand:SI 1 "nonautoinc_operand" ""))]
- ""
-{
- if (tilepro_expand_mov (SImode, operands))
- DONE;
-})
-
-(define_insn "*movsi_high_insn"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (high:SI (match_operand:SI 1 "symbolic_operand" "in")))]
- ""
- "auli\t%0, zero, ha16(%1)"
- [(set_attr "type" "X01")])
-
-(define_insn "*movsi_insn"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,r,r,r,U,m")
- (match_operand:SI 1 "move_operand" "r,I,J,K,N,P,U,m,rO,rO"))]
- "(register_operand (operands[0], SImode)
- || reg_or_0_operand (operands[1], SImode))"
- "@
- move\t%0, %r1
- movei\t%0, %1
- moveli\t%0, %1
- auli\t%0, zero, %h1
- addib\t%0, zero, %j1
- addih\t%0, zero, %h1
- lw\t%0, %1
- lwadd\t%0, %I1, %i1
- sw\t%0, %r1
- swadd\t%I0, %r1, %i0"
- [(set_attr "type" "*,*,X01,X01,X01,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
-
-(define_insn "movstrictqi"
- [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r"))
- (match_operand:QI 1 "reg_or_0_operand" "rO"))]
- ""
- "mm\t%r0, %r1, %r0, 0, 7"
- [(set_attr "type" "X01")])
-
-(define_insn "movstricthi"
- [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
- (match_operand:HI 1 "reg_or_0_operand" "rO"))]
- ""
- "mm\t%r0, %r1, %r0, 0, 15"
- [(set_attr "type" "X01")])
-
-(define_expand "movmisalign<mode>"
- [(set (match_operand:VEC 0 "nonautoincmem_nonimmediate_operand" "")
- (match_operand:VEC 1 "nonautoincmem_general_operand" ""))]
- ""
-{
- tilepro_expand_movmisalign (<MODE>mode, operands);
- DONE;
-})
-
-(define_expand "movsf"
- [(set (match_operand:SF 0 "nonimmediate_operand" "")
- (match_operand:SF 1 "general_operand" ""))]
- ""
-{
- /* Materialize immediates using clever SImode code, but don't
- do this after reload starts, since gen_lowpart will choke
- during reload if given an illegitimate address. */
- if (immediate_operand (operands[1], SFmode)
- && operands[1] != const0_rtx
- && (register_operand (operands[0], SFmode)
- || (!reload_in_progress && !reload_completed)))
- {
- emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
- gen_lowpart (SImode, operands[1])));
- DONE;
- }
-})
-
-(define_insn "*movsf"
- [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,U,m")
- (match_operand:SF 1 "general_operand" "rO,U,m,rO,rO"))]
- ""
- "@
- move\t%0, %r1
- lw\t%0, %1
- lwadd\t%0, %I1, %i1
- sw\t%0, %r1
- swadd\t%I0, %r1, %i0"
- [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
-
-(define_expand "mov<mode>"
- [(set (match_operand:VEC 0 "nonimmediate_operand" "")
- (match_operand:VEC 1 "general_operand" ""))]
- ""
-{
- /* Materialize immediates using clever SImode code, but don't
- do this after reload starts, since gen_lowpart will choke
- during reload if given an illegitimate address. */
- if (immediate_operand (operands[1], <MODE>mode)
- && operands[1] != const0_rtx
- && (register_operand (operands[0], <MODE>mode)
- || (!reload_in_progress && !reload_completed)))
- {
- emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
- gen_lowpart (SImode, operands[1])));
- DONE;
- }
-})
-
-(define_insn "*mov<mode>"
- [(set (match_operand:VEC 0 "nonimmediate_operand" "=r,r,r,U,m")
- (match_operand:VEC 1 "general_operand" "rO,U,m,rO,rO"))]
- ""
- "@
- move\t%0, %r1
- lw\t%0, %1
- lwadd\t%0, %I1, %i1
- sw\t%0, %r1
- swadd\t%I0, %r1, %i0"
- [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
-
-
-;;
-;; Bit-field extracts
-;;
-
-(define_expand "extv"
- [(set (match_operand:SI 0 "register_operand" "")
- (sign_extract:SI
- (match_operand:QI 1 "nonautoincmem_operand" "")
- (match_operand:SI 2 "immediate_operand" "")
- (match_operand:SI 3 "immediate_operand" "")))]
- ""
-{
- HOST_WIDE_INT bit_offset, bit_width;
- HOST_WIDE_INT first_byte_offset, last_byte_offset;
-
- bit_width = INTVAL (operands[2]);
- bit_offset = INTVAL (operands[3]);
-
- /* Reject bitfields that can be done with a normal load */
- if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
- FAIL;
-
- /* The value in memory cannot span more than 4 bytes. */
- first_byte_offset = bit_offset / BITS_PER_UNIT;
- last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
- if (last_byte_offset - first_byte_offset > 3)
- FAIL;
-
- tilepro_expand_unaligned_load (operands[0], operands[1],
- bit_width, bit_offset, 1);
-
- DONE;
-})
-
-(define_expand "extzv"
- [(set (match_operand:SI 0 "register_operand" "")
- (zero_extract:SI
- (match_operand:QI 1 "nonautoincmem_operand" "")
- (match_operand:SI 2 "immediate_operand" "")
- (match_operand:SI 3 "immediate_operand" "")))]
- ""
-{
- HOST_WIDE_INT bit_offset, bit_width;
- HOST_WIDE_INT first_byte_offset, last_byte_offset;
-
- bit_width = INTVAL (operands[2]);
- bit_offset = INTVAL (operands[3]);
-
- /* Reject bitfields that can be done with a normal load */
- if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
- FAIL;
-
- /* The value in memory cannot span more than 4 bytes. */
- first_byte_offset = bit_offset / BITS_PER_UNIT;
- last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
- if (last_byte_offset - first_byte_offset > 3)
- FAIL;
-
- tilepro_expand_unaligned_load (operands[0], operands[1],
- bit_width, bit_offset, 0);
-
- DONE;
-})
-
-
-;;
-;; Arithmetic ops
-;;
-
-(define_insn "*s123a_insn"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "cint_248_operand" "I"))
- (match_operand:SI 3 "reg_or_0_operand" "rO")))]
- ""
- "s%t2a\t%0, %r1, %r3")
-
-(define_expand "addsi3"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI (match_operand:SI 1 "register_operand" "")
- (match_operand:SI 2 "reg_or_cint_operand" "")))]
- ""
- "
- if (tilepro_expand_addsi (operands[0], operands[1], operands[2]))
- DONE;
- ")
-
-(define_insn "*addsi_high_insn"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (plus:SI
- (match_operand:SI 1 "reg_or_0_operand" "%rO")
- (high:SI (match_operand:SI 2 "const_symbolic_operand" "T"))))]
- ""
- "auli\t%0, %r1, %H2"
- [(set_attr "type" "X01")])
-
-(define_insn "*addsi_lo_sum_insn"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (lo_sum:SI
- (match_operand:SI 1 "reg_or_0_operand" "%rO")
- (match_operand:SI 2 "const_symbolic_operand" "T")))]
- ""
- "addli\t%0, %r1, %L2"
- [(set_attr "type" "X01")])
-
-(define_insn "*addsi3_insn"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
- (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO,rO")
- (match_operand:SI 2 "add_operand" "r,I,J,K")))]
- ""
- "@
- add\t%0, %r1, %r2
- addi\t%0, %r1, %2
- addli\t%0, %r1, %2
- auli\t%0, %r1, %h2"
- [(set_attr "type" "*,*,X01,X01")])
-
-(define_insn "subsi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")))]
- ""
- "sub\t%0, %r1, %r2")
-
-(define_insn "negsi2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (neg:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))]
- ""
- "sub\t%0, zero, %r1")
-
-(define_insn "ssaddsi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")))]
- ""
- "adds\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_insn "sssubsi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")))]
- ""
- "subs\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-;;
-;; Shifts
-;;
-
-;; ashift, ashiftrt, lshiftrt, rotate.
-(define_insn "<optab>si3"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (binop_u5bit:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
- ""
- "@
- <insn>i\t%0, %r1, %2
- <insn>\t%0, %r1, %r2")
-
-
-;;
-;; Compares
-;;
-
-(define_expand "cstore<mode>4"
- [(set (match_operand:SI 0 "register_operand" "")
- (match_operator:SI 1 "ordered_comparison_operator"
- [(match_operand:I48MODE 2 "reg_or_cint_operand" "")
- (match_operand:I48MODE 3 "reg_or_cint_operand" "")]))]
- ""
- { if (!tilepro_emit_setcc (operands, <MODE>mode)) FAIL; else DONE; })
-
-(define_insn "insn_seq"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (eq:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
- (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))]
- ""
- "@
- seqi\t%0, %r1, %2
- seq\t%0, %r1, %r2")
-
-(define_insn "insn_sne"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (ne:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_cint_operand" "rO")))]
- ""
- "sne\t%0, %r1, %r2")
-
-(define_insn "insn_slt"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (lt:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))]
- ""
- "@
- slti\t%0, %r1, %2
- slt\t%0, %r1, %r2")
-
-(define_insn "insn_slte"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (le:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_cint_operand" "L,rO")))]
- ""
- "@
- slti\t%0, %r1, %P2
- slte\t%0, %r1, %r2")
-
-(define_insn "insn_slt_u"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (ltu:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))]
- ""
- "@
- slti_u\t%0, %r1, %2
- slt_u\t%0, %r1, %r2")
-
-(define_insn "insn_slte_u"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (leu:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_cint_operand" "Q,rO")))]
- ""
- "@
- slti_u\t%0, %r1, %P2
- slte_u\t%0, %r1, %r2")
-
-
-;;
-;; Logical ops
-;;
-
-(define_insn "andsi3"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r")
- (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO")
- (match_operand:SI 2 "and_operand" "I,M,rO")))]
- ""
- "@
- andi\t%0, %r1, %2
- mm\t%0, %r1, zero, %M2
- and\t%0, %r1, %r2"
- [(set_attr "type" "*,X01,*")])
-
-(define_insn "iorsi3"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
- (match_operand:SI 2 "reg_or_s8bit_operand" "I,rO")))]
- ""
- "@
- ori\t%0, %r1, %2
- or\t%0, %r1, %r2")
-
-(define_insn "xorsi3"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
- (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I")))]
- ""
- "@
- xor\t%0, %r1, %r2
- xori\t%0, %r1, %2"
- [(set_attr "type" "*,X01")])
-
-;; bswap, clz, ctz, popcount
-(define_insn "<optab>si2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unop:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))]
- ""
- "<insn>\t%0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_expand "ctzdi2"
- [(set (match_operand:DI 0 "register_operand" "")
- (ctz:DI (match_operand:DI 1 "reg_or_0_operand" "")))]
- ""
-{
- rtx lo, hi, ctz_lo, ctz_hi, ctz_hi_plus_32, result;
-
- split_di (&operands[1], 1, &lo, &hi);
- lo = force_reg (SImode, lo);
- hi = force_reg (SImode, hi);
-
- ctz_lo = gen_reg_rtx (SImode);
- emit_insn (gen_ctzsi2 (ctz_lo, lo));
-
- ctz_hi = gen_reg_rtx (SImode);
- emit_insn (gen_ctzsi2 (ctz_hi, hi));
-
- ctz_hi_plus_32 = gen_reg_rtx (SImode);
- emit_insn (gen_addsi3 (ctz_hi_plus_32, ctz_hi, GEN_INT (32)));
-
- result = gen_reg_rtx (SImode);
- emit_insn (gen_insn_mvz (result, ctz_lo, lo, ctz_hi_plus_32));
-
- emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
-
- DONE;
-})
-
-(define_expand "clzdi2"
- [(set (match_operand:DI 0 "register_operand" "")
- (clz:DI (match_operand:DI 1 "reg_or_0_operand" "")))]
- ""
-{
- rtx lo, hi, clz_lo, clz_hi, clz_lo_plus_32, result;
-
- split_di (&operands[1], 1, &lo, &hi);
- lo = force_reg (SImode, lo);
- hi = force_reg (SImode, hi);
-
- clz_lo = gen_reg_rtx (SImode);
- emit_insn (gen_clzsi2 (clz_lo, lo));
-
- clz_hi = gen_reg_rtx (SImode);
- emit_insn (gen_clzsi2 (clz_hi, hi));
-
- clz_lo_plus_32 = gen_reg_rtx (SImode);
- emit_insn (gen_addsi3 (clz_lo_plus_32, clz_lo, GEN_INT (32)));
-
- result = gen_reg_rtx (SImode);
- emit_insn (gen_insn_mvz (result, clz_hi, hi, clz_lo_plus_32));
-
- emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
-
- DONE;
-})
-
-(define_expand "ffsdi2"
- [(set (match_operand:DI 0 "register_operand" "")
- (ffs:DI (match_operand:DI 1 "reg_or_0_operand" "")))]
- ""
-{
- rtx lo, hi, ctz_lo, ctz_hi, ctz_hi_plus_32, ctz, ctz_plus_1,ctz_cond;
- rtx result;
-
- split_di (&operands[1], 1, &lo, &hi);
- lo = force_reg (SImode, lo);
- hi = force_reg (SImode, hi);
-
- ctz_lo = gen_reg_rtx (SImode);
- emit_insn (gen_ctzsi2 (ctz_lo, lo));
-
- ctz_hi = gen_reg_rtx (SImode);
- emit_insn (gen_ctzsi2 (ctz_hi, hi));
-
- ctz_hi_plus_32 = gen_reg_rtx (SImode);
- emit_insn (gen_addsi3 (ctz_hi_plus_32, ctz_hi, GEN_INT (32)));
-
- ctz = gen_reg_rtx (SImode);
- emit_insn (gen_insn_mvz (ctz, ctz_lo, lo, ctz_hi_plus_32));
-
- ctz_plus_1 = gen_reg_rtx (SImode);
- emit_insn (gen_addsi3 (ctz_plus_1, ctz, GEN_INT (1)));
-
- ctz_cond = gen_reg_rtx (SImode);
- emit_insn (gen_iorsi3 (ctz_cond, lo, hi));
-
- result = gen_reg_rtx (SImode);
- emit_insn (gen_insn_mvz (result, ctz_plus_1, ctz_cond, const0_rtx));
-
- emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
-
- DONE;
-})
-
-(define_expand "popcountdi2"
- [(set (match_operand:DI 0 "register_operand" "")
- (popcount:DI (match_operand:DI 1 "nonmemory_operand" "")))]
- ""
-{
- rtx lo, hi, popcount_lo, popcount_hi, result;
-
- split_di (&operands[1], 1, &lo, &hi);
- lo = force_reg (SImode, lo);
- hi = force_reg (SImode, hi);
-
- popcount_lo = gen_reg_rtx (SImode);
- emit_insn (gen_popcountsi2 (popcount_lo, lo));
-
- popcount_hi = gen_reg_rtx (SImode);
- emit_insn (gen_popcountsi2 (popcount_hi, hi));
-
- result = gen_reg_rtx (SImode);
- emit_insn (gen_addsi3 (result, popcount_lo, popcount_hi));
-
- emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
-
- DONE;
-})
-
-(define_expand "paritysi2"
- [(set (match_operand:SI 0 "register_operand" "")
- (parity:SI (match_operand:SI 1 "reg_or_0_operand" "")))]
- ""
- {
- operands[2] = gen_reg_rtx (SImode);
- emit_insn (gen_popcountsi2 (operands[2], operands[1]));
- emit_insn (gen_andsi3 (operands[0], operands[2], const1_rtx));
- DONE;
- })
-
-(define_expand "paritydi2"
- [(set (match_operand:DI 0 "register_operand" "")
- (parity:DI (match_operand:DI 1 "nonmemory_operand" "")))]
- ""
-{
- rtx lo, hi, xor_lohi, result;
-
- split_di (&operands[1], 1, &lo, &hi);
- lo = force_reg (SImode, lo);
- hi = force_reg (SImode, hi);
-
- xor_lohi = gen_reg_rtx (SImode);
- emit_insn (gen_xorsi3 (xor_lohi, lo, hi));
-
- result = gen_reg_rtx (SImode);
- emit_insn (gen_paritysi2 (result, xor_lohi));
-
- emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
-
- DONE;
-})
-
-(define_insn "one_cmplsi2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (not:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))]
- ""
- "nor\t%0, %r1, zero")
-
-
-;;
-;; Conditional moves.
-;;
-
-(define_expand "movsicc"
- [(set (match_operand:SI 0 "register_operand" "")
- (if_then_else:SI (match_operand 1 "comparison_operator" "")
- (match_operand:SI 2 "reg_or_0_operand" "")
- (match_operand:SI 3 "reg_or_0_operand" "")))]
- ""
- { operands[1] = tilepro_emit_conditional_move (operands[1]); })
-
-(define_insn "movcc_insn"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
- (if_then_else:SI
- (match_operator 4 "eqne_operator"
- [(match_operand:SI 1 "reg_or_0_operand" "rO,rO,rO,rO")
- (const_int 0)])
- (match_operand:SI 2 "reg_or_0_operand" "rO,O,rO,0")
- (match_operand:SI 3 "reg_or_0_operand" "O,rO,0,rO")))]
- ""
- "@
- m%c4\t%0, %r1, %r2
- m%C4\t%0, %r1, %r3
- mv%c4\t%0, %r1, %r2
- mv%C4\t%0, %r1, %r3"
- [(set_attr "type" "*,*,Y0,Y0")])
-
-(define_expand "insn_mz"
- [(set (match_operand:SI 0 "register_operand" "")
- (if_then_else:SI
- (eq (match_operand:SI 1 "reg_or_0_operand" "")
- (const_int 0))
- (match_operand:SI 2 "reg_or_0_operand" "")
- (const_int 0)))])
-
-(define_expand "insn_mnz"
- [(set (match_operand:SI 0 "register_operand" "")
- (if_then_else:SI
- (ne (match_operand:SI 1 "reg_or_0_operand" "")
- (const_int 0))
- (match_operand:SI 2 "reg_or_0_operand" "")
- (const_int 0)))])
-
-(define_expand "insn_mvz"
- [(set (match_operand:SI 0 "register_operand" "")
- (if_then_else:SI
- (eq (match_operand:SI 2 "reg_or_0_operand" "")
- (const_int 0))
- (match_operand:SI 3 "reg_or_0_operand" "")
- (match_operand:SI 1 "reg_or_0_operand" "")))])
-
-(define_expand "insn_mvnz"
- [(set (match_operand:SI 0 "register_operand" "")
- (if_then_else:SI
- (ne (match_operand:SI 2 "reg_or_0_operand" "")
- (const_int 0))
- (match_operand:SI 3 "reg_or_0_operand" "")
- (match_operand:SI 1 "reg_or_0_operand" "")))])
-
-
-;;
-;; Conversions
-;;
-
-(define_insn "zero_extendqisi2"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r")
- (zero_extend:SI (match_operand:QI 1 "move_operand" "rO,U,m")))]
- ""
- "@
- mm\t%0, %r1, zero, 0, 7
- lb_u\t%0, %1
- lbadd_u\t%0, %I1, %i1"
- [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
-
-(define_insn "zero_extendhisi2"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r")
- (zero_extend:SI (match_operand:HI 1 "move_operand" "rO,U,m")))]
- ""
- "@
- mm\t%0, %r1, zero, 0, 15
- lh_u\t%0, %1
- lhadd_u\t%0, %I1, %i1"
- [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
-
-(define_expand "extendhisi2"
- [(set (match_operand:SI 0 "register_operand" "")
- (sign_extend:SI (match_operand:HI 1 "move_operand" "")))]
- ""
-{
- if (!memory_operand (operands[1], HImode))
- {
- operands[1] = gen_lowpart (SImode, operands[1]);
- operands[2] = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0];
-
- emit_move_insn (operands[2], gen_rtx_ASHIFT (SImode, operands[1],
- GEN_INT (16)));
- emit_move_insn (operands[0], gen_rtx_ASHIFTRT (SImode, operands[2],
- GEN_INT (16)));
- DONE;
- }
-})
-
-(define_insn "*lh"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (sign_extend:SI (match_operand:HI 1 "memory_operand" "U,m")))]
- ""
- "@
- lh\t%0, %1
- lhadd\t%0, %I1, %i1"
- [(set_attr "type" "Y2_2cycle,X1_2cycle")])
-
-(define_expand "extendqisi2"
- [(set (match_operand:SI 0 "register_operand" "")
- (sign_extend:SI (match_operand:QI 1 "move_operand" "")))]
- ""
-{
- if (!memory_operand (operands[1], QImode))
- {
- operands[1] = gen_lowpart (SImode, operands[1]);
- operands[2] = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0];
-
- emit_move_insn (operands[2], gen_rtx_ASHIFT (SImode, operands[1],
- GEN_INT (24)));
- emit_move_insn (operands[0], gen_rtx_ASHIFTRT (SImode, operands[2],
- GEN_INT (24)));
- DONE;
- }
-})
-
-(define_insn "*lb"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (sign_extend:SI (match_operand:QI 1 "memory_operand" "U,m")))]
- ""
- "@
- lb\t%0, %1
- lbadd\t%0, %I1, %i1"
- [(set_attr "type" "Y2_2cycle,X1_2cycle")])
-
-;;
-;; insv patterns
-;;
-(define_expand "insv"
- [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "")
- (match_operand:SI 1 "u5bit_cint_operand" "")
- (match_operand:SI 2 "u5bit_cint_operand" ""))
- (match_operand:SI 3 "reg_or_cint_operand" ""))]
- ""
-{
- tilepro_expand_insv (operands);
- DONE;
-})
-
-(define_insn "*insv_tblidxb0"
- [(set (zero_extract:SI
- (match_operand:SI 0 "register_operand" "+r")
- (const_int 8)
- (const_int 2))
- (match_operand:SI 1 "register_operand" "rO"))]
- ""
- "tblidxb0\t%0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*insv_tblidxb1"
- [(set (zero_extract:SI
- (match_operand:SI 0 "register_operand" "+r")
- (const_int 8)
- (const_int 2))
- (zero_extract:SI
- (const_int 8)
- (const_int 8)
- (match_operand:SI 1 "register_operand" "rO")))]
- ""
- "tblidxb1\t%0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*insv_tblidxb2"
- [(set (zero_extract:SI
- (match_operand:SI 0 "register_operand" "+r")
- (const_int 8)
- (const_int 2))
- (zero_extract:SI
- (const_int 8)
- (const_int 16)
- (match_operand:SI 1 "register_operand" "rO")))]
- ""
- "tblidxb2\t%0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*insv_tblidxb3"
- [(set (zero_extract:SI
- (match_operand:SI 0 "register_operand" "+r")
- (const_int 8)
- (const_int 2))
- (zero_extract:SI
- (const_int 8)
- (const_int 24)
- (match_operand:SI 1 "register_operand" "rO")))]
- ""
- "tblidxb3\t%0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*insv_mm1"
- [(set (zero_extract:SI
- (match_operand:SI 0 "register_operand" "+r")
- (match_operand:SI 1 "u5bit_cint_operand" "n")
- (const_int 0))
- (match_operand:SI 2 "register_operand" "rO"))]
- ""
- "mm\t%0, %r2, %0, 0, %1-1"
- [(set_attr "type" "X01")])
-
-(define_insn "*insv_mm2"
- [(set (zero_extract:SI
- (match_operand:SI 0 "register_operand" "+r")
- (match_operand:SI 1 "u5bit_cint_operand" "n")
- (match_operand:SI 2 "u5bit_cint_operand" "n"))
- (zero_extract:SI
- (match_operand:SI 3 "register_operand" "rO")
- (match_dup 1)
- (match_dup 2)))]
- ""
- "mm\t%0, %r3, %0, %2, %2+%1-1"
- [(set_attr "type" "X01")])
-
-
-;;
-;; Multiplies
-;;
-
-(define_expand "mulsi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mult:SI (zero_extend:SI
- (subreg:HI (match_operand:SI 1 "nonmemory_operand" "") 0))
- (zero_extend:SI
- (subreg:HI (match_operand:SI 2 "nonmemory_operand" "") 0))))
- (set (match_dup 0)
- (unspec:SI [(match_dup 0) (match_dup 1) (match_dup 2)]
- UNSPEC_INSN_MULHLSA_UU))
- (set (match_dup 0)
- (unspec:SI [(match_dup 0) (match_dup 2) (match_dup 1)]
- UNSPEC_INSN_MULHLSA_UU))]
- ""
- {
- operands[1] = force_reg (SImode, operands[1]);
- operands[1] = make_safe_from (operands[1], operands[0]);
-
- if (tilepro_expand_mulsi (operands[0], operands[1], operands[2]))
- DONE;
- else
- {
- operands[2] = force_reg (SImode, operands[2]);
- operands[2] = make_safe_from (operands[2], operands[0]);
- }
- })
-
-(define_insn "mulhisi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mult:SI (sign_extend:SI
- (match_operand:HI 1 "reg_or_0_operand" "rO"))
- (sign_extend:SI
- (match_operand:HI 2 "reg_or_0_operand" "rO"))))]
- ""
- "mulll_ss\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "umulhisi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mult:SI (zero_extend:SI
- (match_operand:HI 1 "reg_or_0_operand" "rO"))
- (zero_extend:SI
- (match_operand:HI 2 "reg_or_0_operand" "rO"))))]
- ""
- "mulll_uu\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "usmulhisi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mult:SI (zero_extend:SI
- (match_operand:HI 1 "reg_or_0_operand" "rO"))
- (sign_extend:SI
- (match_operand:HI 2 "reg_or_0_operand" "rO"))))]
- ""
- "mulll_su\t%0, %r2, %r1"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "maddhisi4"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (plus:SI
- (mult:SI (sign_extend:SI
- (match_operand:HI 1 "reg_or_0_operand" "rO"))
- (sign_extend:SI
- (match_operand:HI 2 "reg_or_0_operand" "rO")))
- (match_operand:SI 3 "register_operand" "0")))]
- ""
- "mullla_ss\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "umaddhisi4"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (plus:SI
- (mult:SI (zero_extend:SI
- (match_operand:HI 1 "reg_or_0_operand" "rO"))
- (zero_extend:SI
- (match_operand:HI 2 "reg_or_0_operand" "rO")))
- (match_operand:SI 3 "register_operand" "0")))]
- ""
- "mullla_uu\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-
-(define_insn "mulqihi3"
- [(set (match_operand:HI 0 "register_operand" "=r")
- (mult:HI (sign_extend:HI
- (match_operand:QI 1 "reg_or_0_operand" "rO"))
- (sign_extend:HI
- (match_operand:QI 2 "reg_or_0_operand" "rO"))))]
- ""
- "mulll_ss\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "umulqihi3"
- [(set (match_operand:HI 0 "register_operand" "=r")
- (mult:HI (zero_extend:HI
- (match_operand:QI 1 "reg_or_0_operand" "rO"))
- (zero_extend:HI
- (match_operand:QI 2 "reg_or_0_operand" "rO"))))]
- ""
- "mulll_uu\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_expand "smulsi3_highpart"
- [(set (match_operand:SI 0 "register_operand" "")
- (truncate:SI
- (ashiftrt:DI
- (mult:DI (sign_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
- (sign_extend:DI (match_operand:SI 2 "reg_or_0_operand" "")))
- (const_int 32))))]
- ""
- {
- tilepro_expand_smulsi3_highpart (operands[0], operands[1], operands[2]);
- DONE;
- })
-
-(define_expand "umulsi3_highpart"
- [(set (match_operand:SI 0 "register_operand" "")
- (truncate:SI
- (lshiftrt:DI
- (mult:DI (zero_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
- (zero_extend:DI (match_operand:SI 2 "reg_or_0_operand" "")))
- (const_int 32))))]
- ""
-{
- tilepro_expand_umulsi3_highpart (operands[0], operands[1], operands[2]);
- DONE;
-})
-
-
-;;
-;; Loops
-;;
-
-;; Define the subtract-one-and-jump insns so loop.c knows what to
-;; generate.
-(define_expand "doloop_end"
- [(use (match_operand 0 "" "")) ;; loop pseudo
- (use (match_operand 1 "" "")) ;; iterations; zero if unknown
- (use (match_operand 2 "" "")) ;; max iterations
- (use (match_operand 3 "" "")) ;; loop level
- (use (match_operand 4 "" "")) ;; label
- (use (match_operand 5 "" ""))] ;; flag: 1 if loop entered at top, else 0
- ""
-{
- if (optimize > 0)
- {
- rtx s0;
- rtx bcomp;
- rtx loc_ref;
-
- /* only do inner loop */
- if (INTVAL (operands[3]) > 1)
- FAIL;
- /* only deal with loop counters in SImode */
- if (GET_MODE (operands[0]) != SImode)
- FAIL;
-
- s0 = operands [0];
-
- emit_move_insn (s0, gen_rtx_PLUS (SImode, s0, GEN_INT (-1)));
- bcomp = gen_rtx_NE(SImode, s0, const0_rtx);
- loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [4]);
- emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
- gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
- loc_ref, pc_rtx)));
- DONE;
- }
- else
- FAIL;
-
-})
-
-;;
-;; Prologue/epilogue
-;;
-(define_expand "prologue"
- [(const_int 0)]
- ""
-{
- tilepro_expand_prologue ();
- DONE;
-})
-
-(define_expand "epilogue"
- [(const_int 0)]
- ""
-{
- tilepro_expand_epilogue (false);
- DONE;
-})
-
-(define_expand "sibcall_epilogue"
- [(const_int 0)]
- ""
-{
- tilepro_expand_epilogue (true);
- DONE;
-})
-
-;;
-;; Stack manipulations
-;;
-
-;; An insn to allocate new stack space for dynamic use (e.g., alloca).
-(define_expand "allocate_stack"
- [(set (match_operand 0 "register_operand" "")
- (minus (reg 54) (match_operand 1 "nonmemory_operand" "")))
- (set (reg 54)
- (minus (reg 54) (match_dup 1)))]
- ""
- "tilepro_allocate_stack (operands[0], operands[1]); DONE;")
-
-;;
-;; Branches
-;;
-(define_expand "call"
- [(parallel [(call (match_operand:SI 0 "call_operand" "")
- (match_operand 1 "" ""))
- (use (reg:SI 54))
- (clobber (reg:SI 55))])]
- ""
- "")
-
-(define_insn "*call_insn"
- [(call (mem:SI (match_operand:SI 0 "call_address_operand" "rO,i"))
- (match_operand 1 "" ""))
- (use (reg:SI 54))
- (clobber (reg:SI 55))]
- ""
- "@
- jalr\t%r0
- jal\t%p0"
- [(set_attr "type" "X1,X1")])
-
-(define_expand "call_value"
- [(parallel [(set (match_operand 0 "register_operand" "")
- (call (match_operand:SI 1 "call_operand" "")
- (match_operand 2 "" "")))
- (use (reg:SI 54))
- (clobber (reg:SI 55))])]
- "")
-
-(define_insn "*call_value_insn"
- [(set (match_operand 0 "register_operand" "=r,r")
- (call (mem:SI (match_operand:SI 1 "call_address_operand" "rO,i"))
- (match_operand 2 "" "")))
- (use (reg:SI 54))
- (clobber (reg:SI 55))]
- ""
- "@
- jalr\t%r1
- jal\t%p1"
- [(set_attr "type" "X1,X1")])
-
-(define_expand "sibcall"
- [(parallel [(call (match_operand:SI 0 "call_operand" "")
- (match_operand 1 "" ""))
- (use (reg:SI 54))])]
- ""
- "")
-
-(define_insn "*sibcall_insn"
- [(call (mem:SI (match_operand:SI 0 "call_address_operand" "rO,i"))
- (match_operand 1 "" ""))
- (use (reg:SI 54))]
- "SIBLING_CALL_P(insn)"
- "@
- jr\t%r0
- j\t%p0"
- [(set_attr "type" "X1,X1")])
-
-(define_expand "sibcall_value"
- [(parallel [(set (match_operand 0 "" "")
- (call (match_operand:SI 1 "call_operand" "")
- (match_operand:SI 2 "" "")))
- (use (reg:SI 54))])]
- ""
- "")
-
-(define_insn "*sibcall_value"
- [(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:SI 1 "call_address_operand" "rO,i"))
- (match_operand:SI 2 "" "")))
- (use (reg:SI 54))]
- "SIBLING_CALL_P(insn)"
- "@
- jr\t%r1
- j\t%p1"
- [(set_attr "type" "X1,X1")])
-
-(define_insn "jump"
- [(set (pc) (label_ref (match_operand 0 "" "")))]
- ""
- "j\t%l0"
- [(set_attr "type" "X1")])
-
-(define_insn "indirect_jump"
- [(set (pc) (match_operand:SI 0 "register_operand" "rO"))]
- ""
- "jr\t%r0"
- [(set_attr "type" "X1")])
-
-(define_expand "return"
- [(parallel
- [(return)
- (use (reg:SI 55))])]
- "tilepro_can_use_return_insn_p ()"
- "")
-
-(define_insn "_return"
- [(return)
- (use (reg:SI 55))]
- "reload_completed"
- "jrp\tlr"
- [(set_attr "type" "X1")])
-
-(define_expand "tablejump"
- [(set (pc) (match_operand:SI 0 "register_operand" ""))
- (use (label_ref (match_operand 1 "" "")))]
- ""
-{
- tilepro_expand_tablejump (operands[0], operands[1]);
- DONE;
-})
-
-(define_insn "tablejump_aux"
- [(set (pc) (match_operand:SI 0 "register_operand" "r"))
- (use (label_ref (match_operand 1 "" "")))]
- ""
- "jr\t%0"
- [(set_attr "type" "X1")])
-
-;; Call subroutine returning any type.
-(define_expand "untyped_call"
- [(parallel [(call (match_operand 0 "" "")
- (const_int 0))
- (match_operand 1 "" "")
- (match_operand 2 "" "")])]
- ""
-{
- int i;
-
- emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
-
- for (i = 0; i < XVECLEN (operands[2], 0); i++)
- {
- rtx set = XVECEXP (operands[2], 0, i);
- emit_move_insn (SET_DEST (set), SET_SRC (set));
- }
-
- /* The optimizer does not know that the call sets the function value
- registers we stored in the result block. We avoid problems by
- claiming that all hard registers are used and clobbered at this
- point. */
- emit_insn (gen_blockage ());
-
- DONE;
-})
-
-;; UNSPEC_VOLATILE is considered to use and clobber all hard registers
-;; and all of memory. This blocks insns from being moved across this
-;; point.
-(define_insn "blockage"
- [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
- ""
- "pseudo"
- [(set_attr "type" "nothing")
- (set_attr "length" "0")])
-
-;; Internal expanders to prevent memory ops from moving around frame
-;; allocation/deallocation.
-;;
-;; TODO: really this clobber should just clobber the frame memory. Is
-;; this possibly by clobbering memory @ the sp reg (as alpha does?)
-;; or by explicitly setting the alias set to the frame?
-(define_insn "sp_adjust"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r")
- (plus:SI
- (match_operand:SI 1 "register_operand" "%r,r,r")
- (match_operand:SI 2 "add_operand" "r,I,J")))
- (clobber (mem:BLK (scratch)))]
- ""
- "@
- add\t%0, %1, %2
- addi\t%0, %1, %2
- addli\t%0, %1, %2"
- [(set_attr "type" "*,*,X01")])
-
-;; Used for move sp, r52, to pop a stack frame. We need to make sure
-;; that stack frame memory operations have been issued before we do
-;; this. TODO: see above TODO.
-(define_insn "sp_restore"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (match_operand:SI 1 "register_operand" "r"))
- (clobber (mem:BLK (scratch)))]
- ""
- "move\t%0, %1")
-
-(define_insn "nop"
- [(const_int 0)]
- ""
- "nop"
- [(set_attr "type" "Y01")])
-
-
-;;
-;; Conditional branches
-;;
-
-(define_expand "cbranchsi4"
- [(set (pc)
- (if_then_else (match_operator 0 "ordered_comparison_operator"
- [(match_operand:SI 1 "reg_or_cint_operand")
- (match_operand:SI 2 "reg_or_cint_operand")])
- (label_ref (match_operand 3 ""))
- (pc)))]
- ""
- { tilepro_emit_conditional_branch (operands, SImode); DONE; })
-
-
-(define_expand "cbranchdi4"
- [(set (pc)
- (if_then_else (match_operator 0 "ordered_comparison_operator"
- [(match_operand:DI 1 "reg_or_cint_operand")
- (match_operand:DI 2 "reg_or_cint_operand")])
- (label_ref (match_operand 3 ""))
- (pc)))]
- ""
- { tilepro_emit_conditional_branch (operands, DImode); DONE; })
-
-
-(define_insn "*bcc_normal"
- [(set (pc)
- (if_then_else
- (match_operator 1 "signed_comparison_operator"
- [(match_operand:SI 2 "reg_or_0_operand" "rO")
- (const_int 0)])
- (label_ref (match_operand 0 "" ""))
- (pc)))]
- ""
- { return tilepro_output_cbranch (insn, operands, false); }
- [(set_attr "type" "X1_branch")])
-
-(define_insn "*bcc_reverse"
- [(set (pc)
- (if_then_else
- (match_operator 1 "signed_comparison_operator"
- [(match_operand:SI 2 "reg_or_0_operand" "rO")
- (const_int 0)])
- (pc)
- (label_ref (match_operand 0 "" ""))))]
- ""
- { return tilepro_output_cbranch (insn, operands, true); }
- [(set_attr "type" "X1_branch")])
-
-;; FIXME: the straight forward versions which do not include the
-;; subreg:QI does not match for some unknown reason.
-(define_insn "*bbs_normal"
- [(set (pc)
- (if_then_else
- (ne (zero_extract:SI (subreg:QI
- (match_operand:SI 1 "reg_or_0_operand" "rO") 0)
- (const_int 1)
- (const_int 0))
- (const_int 0))
- (label_ref (match_operand 0 "" ""))
- (pc)))]
- ""
- { return tilepro_output_cbranch_with_opcode (insn, operands, "bbs", "bbns",
- 1, 0); }
- [(set_attr "type" "X1_branch")])
-
-(define_insn "*bbc_normal"
- [(set (pc)
- (if_then_else
- (eq (zero_extract:SI (subreg:QI
- (match_operand:SI 1 "reg_or_0_operand" "rO") 0)
- (const_int 1)
- (const_int 0))
- (const_int 0))
- (label_ref (match_operand 0 "" ""))
- (pc)))]
- ""
- { return tilepro_output_cbranch_with_opcode (insn, operands, "bbns", "bbs",
- 1, 0); }
- [(set_attr "type" "X1_branch")])
-
-;; Note that __insn_mf() expands to this.
-(define_expand "memory_barrier"
- [(set (match_dup 0)
- (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
- ""
-{
- operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
- MEM_VOLATILE_P (operands[0]) = 1;
-})
-
-(define_insn "*memory_barrier"
- [(set (match_operand:BLK 0 "" "")
- (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
- ""
- "mf"
- [(set_attr "type" "X1")])
-
-(define_insn "prefetch"
- [(prefetch (match_operand:SI 0 "address_operand" "rO")
- (match_operand:SI 1 "const_int_operand" "")
- (match_operand:SI 2 "const_int_operand" ""))]
- ""
- "prefetch\t%r0"
- [(set_attr "type" "Y2")])
-
-
-;;
-;; Network intrinsics
-;;
-
-;; Note the "pseudo" text is handled specially by the
-;; asm_output_opcode routine. If the output is an empty string, the
-;; instruction would bypass the asm_output_opcode routine, bypassing
-;; the bundle handling code.
-(define_insn "tilepro_network_barrier"
- [(unspec_volatile:SI [(const_int 0)] UNSPEC_NETWORK_BARRIER)]
- ""
- "pseudo"
- [(set_attr "type" "nothing")
- (set_attr "length" "0")])
-
-(define_insn "*netreg_receive"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=r,U,m")
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i,i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- move\t%0, %N1
- sw\t%0, %N1
- swadd\t%I0, %N1, %i0"
- [(set_attr "type" "*,Y2,X1")])
-
-(define_insn "*netreg_send"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i,i,i,i,i,i")
- (match_operand:SI 1 "reg_or_cint_operand" "rO,I,J,K,N,P")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- move\t%N0, %r1
- movei\t%N0, %1
- moveli\t%N0, %1
- auli\t%N0, zero, %h1
- addib\t%N0, zero, %j1
- addih\t%N0, zero, %h1"
- [(set_attr "type" "*,*,X01,X01,X01,X01")])
-
-(define_insn "*netreg_copy"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i")
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "move %N0, %N1")
-
-(define_expand "tilepro_idn0_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_IDN0)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_idn1_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_IDN1)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_idn_send"
- [(parallel
- [(unspec_volatile:SI [(const_int TILEPRO_NETREG_IDN0)
- (match_operand:SI 0 "reg_or_cint_operand" "")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_sn_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_SN)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_sn_send"
- [(parallel
- [(unspec_volatile:SI [(const_int TILEPRO_NETREG_SN)
- (match_operand:SI 0 "reg_or_cint_operand" "")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_udn0_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN0)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_udn1_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN1)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_udn2_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN2)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_udn3_receive"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN3)
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_expand "tilepro_udn_send"
- [(parallel
- [(unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN0)
- (match_operand:SI 0 "reg_or_cint_operand" "")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))])]
- "")
-
-(define_insn "*netreg_add_to_network"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i,i,i,i")
- (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO,rO")
- (match_operand:SI 2 "add_operand" "r,I,J,K"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- add\t%N0, %r1, %2
- addi\t%N0, %r1, %2
- addli\t%N0, %r1, %2
- auli\t%N0, %r1, %h2"
- [(set_attr "type" "*,*,X01,X01")])
-
-(define_insn "*netreg_add_from_network"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
- (plus:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i,i,i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "add_operand" "rO,I,J,K")))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- add\t%0, %N1, %r2
- addi\t%0, %N1, %2
- addli\t%0, %N1, %2
- auli\t%0, %N1, %h2"
- [(set_attr "type" "*,*,X01,X01")])
-
-(define_insn "*netreg_add_from_to_network"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i,i,i,i")
- (plus:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i,i,i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "add_operand" "rO,I,J,K"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- add\t%N0, %N1, %r2
- addi\t%N0, %N1, %2
- addli\t%N0, %N1, %2
- auli\t%N0, %N1, %h2"
- [(set_attr "type" "*,*,X01,X01")])
-
-(define_code_iterator netreg_binop
- [minus])
-
-(define_insn "*netreg_binop_to_network"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i")
- (netreg_binop:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%N0, %r1, %r2")
-
-(define_insn "*netreg_binop_from_network0"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (netreg_binop:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "reg_or_0_operand" "rO")))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%0, %N1, %r2")
-
-(define_insn "*netreg_binop_from_network1"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (netreg_binop:SI
- (match_operand:SI 1 "reg_or_0_operand" "rO")
- (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%0, %r1, %N2")
-
-(define_insn "*netreg_binop_from_to_network0"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i")
- (netreg_binop:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "reg_or_0_operand" "rO"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%N0, %N1, %r2")
-
-(define_insn "*netreg_binop_from_to_network1"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i")
- (netreg_binop:SI
- (match_operand:SI 1 "reg_or_0_operand" "rO")
- (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%N0, %r1, %N2")
-
-(define_insn "*netreg_binop_to_network"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i,i")
- (binop_with_imm:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_cint_operand" "I,rO"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- <insn>i<u>\t%N0, %r1, %2
- <insn><u>\t%N0, %r1, %r2")
-
-(define_insn "*netreg_binop_from_network"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (binop_with_imm:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- <insn>i<u>\t%0, %N1, %2
- <insn><u>\t%0, %N1, %r2")
-
-(define_insn "*netreg_binop_from_to_network"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i,i")
- (binop_with_imm:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "reg_or_cint_operand" "I,rO"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "@
- <insn>i<u>\t%N0, %N1, %2
- <insn><u>\t%N0, %N1, %r2")
-
-(define_insn "*netreg_unop_to_network"
- [(unspec_volatile:SI [(match_operand:SI 0 "netreg_operand" "i")
- (unop:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%N0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*netreg_unop_from_network"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unop:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%0, %N1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*netreg_unop_from_to_network"
- [(unspec_volatile:SI
- [(match_operand:SI 0 "netreg_operand" "i")
- (unop:SI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE))
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_SEND)
- (clobber (reg:SI TILEPRO_NETORDER_REG))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "<insn>\t%N0, %N1"
- [(set_attr "type" "Y0")])
-
-(define_insn "*netreg_sadh_u_from_network0"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI
- [(unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADH_U))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "sadh_u\t%0, %N1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "*netreg_sadh_u_from_network1"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI
- [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)]
- UNSPEC_INSN_SADH_U))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "sadh_u\t%0, %r1, %N2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "*netreg_sadah_u_from_network0"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI
- [(match_operand:SI 1 "reg_or_0_operand" "0")
- (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADAH_U))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "sadah_u\t%0, %N2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "*netreg_sadah_u_from_network1"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI
- [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (unspec_volatile:SI [(match_operand:SI 3 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE)]
- UNSPEC_INSN_SADAH_U))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- "sadah_u\t%0, %r2, %N3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_code_iterator mm_combiner [ior xor plus])
-
-;; This doesn't seem to match -- too complex for 'combine'?
-;;
-;; (define_insn "*netreg_mm_to_network"
-;; [(unspec_volatile:SI
-;; [(match_operand:SI 0 "netreg_operand" "i")
-;; (mm_combiner:SI
-;; (and:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
-;; (match_operand:SI 3 "const_int_operand" "n"))
-;; (and:SI (match_operand:SI 2 "reg_or_0_operand" "rO")
-;; (match_operand:SI 4 "const_int_operand" "n")))]
-;; UNSPEC_NETWORK_SEND)]
-;; "tilepro_bitfield_operand_p (INTVAL (operands[3]), NULL, NULL)
-;; && INTVAL (operands[3]) == ~INTVAL (operands[4])"
-;; "mm\t%N0, %r1, %r2, %M3"
-;; [(set_attr "type" "X01")])
-
-;; FIXME: the straight forward versions which do not include the
-;; subreg:QI does not match for some unknown reason.
-(define_insn "*netreg_bbs_normal"
- [(set (pc)
- (if_then_else
- (ne (zero_extract:SI
- (subreg:QI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE) 0)
- (const_int 1)
- (const_int 0))
- (const_int 0))
- (label_ref (match_operand 0 "" ""))
- (pc)))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- { return tilepro_output_cbranch_with_opcode (insn, operands, "bbs", "bbns",
- 1, 1); }
- [(set_attr "type" "X1_branch")])
-
-(define_insn "*netreg_bbc_normal"
- [(set (pc)
- (if_then_else
- (eq (zero_extract:SI
- (subreg:QI
- (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
- (reg:SI TILEPRO_NETORDER_REG)]
- UNSPEC_NETWORK_RECEIVE) 0)
- (const_int 1)
- (const_int 0))
- (const_int 0))
- (label_ref (match_operand 0 "" ""))
- (pc)))
- (clobber (reg:SI TILEPRO_NETORDER_REG))]
- ""
- { return tilepro_output_cbranch_with_opcode (insn, operands, "bbns", "bbns",
- 1, 1); }
- [(set_attr "type" "X1_branch")])
-
-
-;;
-;; "__insn" Intrinsics (some expand directly to normal patterns above).
-;;
-
-(define_insn "insn_addlis"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec_volatile:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "s16bit_cint_operand" "i")]
- UNSPEC_INSN_ADDLIS))]
- ""
- "addlis\t%0, %r1, %2"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_auli"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "s16bit_cint_operand" "i")]
- UNSPEC_INSN_AULI))]
- ""
- "auli\t%0, %r1, %2"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_drain"
- [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_DRAIN)]
- ""
- "drain"
- [(set_attr "type" "cannot_bundle")])
-
-(define_insn "insn_icoh"
- [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_ICOH)]
- ""
- "icoh\t%r0"
- [(set_attr "type" "X1")])
-
-
-(define_insn "insn_info"
- [(unspec_volatile:VOID [(match_operand:SI 0 "s8bit_cint_operand" "i")]
- UNSPEC_INSN_INFO)]
- ""
- "info\t%0")
-
-(define_insn "insn_infol"
- [(unspec_volatile:VOID [(match_operand:SI 0 "s16bit_cint_operand" "i")]
- UNSPEC_INSN_INFOL)]
- ""
- "infol\t%0"
- [(set_attr "type" "X01")])
-
-;; loads
-
-(define_expand "insn_<load>"
- [(set (match_operand:SI 0 "register_operand" "")
- (sign_extend:SI
- (mem:I12MODE (match_operand:SI 1 "address_operand" ""))))]
- "")
-
-(define_expand "insn_<load>_u"
- [(set (match_operand:SI 0 "register_operand" "")
- (zero_extend:SI
- (mem:I12MODE (match_operand:SI 1 "address_operand" ""))))]
- "")
-
-(define_insn "insn_<load>add"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI (mem:I12MODE (match_dup 3))))]
- ""
- "<load>add\t%0, %1, %2"
- [(set_attr "type" "X1_2cycle")])
-
-(define_insn "insn_<load>add_u"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (mem:I12MODE (match_dup 3))))]
- ""
- "<load>add_u\t%0, %1, %2"
- [(set_attr "type" "X1_2cycle")])
-
-(define_expand "insn_lw"
- [(set (match_operand:SI 0 "register_operand" "")
- (mem:SI (match_operand:SI 1 "address_operand" "")))]
- "")
-
-(define_insn "insn_lwadd"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (mem:SI (match_dup 3)))]
- ""
- "lwadd\t%0, %1, %2"
- [(set_attr "type" "X1_2cycle")])
-
-(define_insn "insn_lwadd_na"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (mem:SI (and:SI (match_dup 3) (const_int -4))))]
- ""
- "lwadd_na\t%0, %1, %2"
- [(set_attr "type" "X1_2cycle")])
-
-(define_insn "insn_lw_na"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mem:SI (and:SI (match_operand:SI 1 "address_operand" "rO")
- (const_int -4))))]
- ""
- "lw_na\t%0, %r1"
- [(set_attr "type" "X1_2cycle")])
-
-;; L2 hits
-
-(define_insn "insn_<load>_L2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI
- (unspec:I12MODE
- [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
- UNSPEC_LATENCY_L2)))]
- ""
- "<load>\t%0, %r1"
- [(set_attr "type" "Y2_L2")])
-
-(define_insn "insn_<load>_u_L2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI
- (unspec:I12MODE
- [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
- UNSPEC_LATENCY_L2)))]
- ""
- "<load>_u\t%0, %r1"
- [(set_attr "type" "Y2_L2")])
-
-(define_insn "insn_<load>add_L2"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
- UNSPEC_LATENCY_L2)))]
- ""
- "<load>add\t%0, %1, %2"
- [(set_attr "type" "X1_L2")])
-
-(define_insn "insn_<load>add_u_L2"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
- UNSPEC_LATENCY_L2)))]
- ""
- "<load>add_u\t%0, %1, %2"
- [(set_attr "type" "X1_L2")])
-
-(define_insn "insn_lwadd_L2"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (match_dup 3))] UNSPEC_LATENCY_L2))]
- ""
- "lwadd\t%0, %1, %2"
- [(set_attr "type" "X1_L2")])
-
-(define_insn "insn_lwadd_na_L2"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (and:SI (match_dup 3) (const_int -4)))]
- UNSPEC_LATENCY_L2))]
- ""
- "lwadd_na\t%0, %1, %2"
- [(set_attr "type" "X1_L2")])
-
-(define_insn "insn_lw_na_L2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (and:SI (match_operand:SI 1 "address_operand" "rO")
- (const_int -4)))]
- UNSPEC_LATENCY_L2))]
- ""
- "lw_na\t%0, %r1"
- [(set_attr "type" "X1_L2")])
-
-(define_insn "insn_lw_L2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (match_operand:SI 1 "address_operand" "rO"))]
- UNSPEC_LATENCY_L2))]
- ""
- "lw\t%0, %r1"
- [(set_attr "type" "Y2_L2")])
-
-;; L2 miss
-
-(define_insn "insn_<load>_miss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI
- (unspec:I12MODE
- [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
- UNSPEC_LATENCY_MISS)))]
- ""
- "<load>\t%0, %r1"
- [(set_attr "type" "Y2_miss")])
-
-(define_insn "insn_<load>_u_miss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI
- (unspec:I12MODE
- [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
- UNSPEC_LATENCY_MISS)))]
- ""
- "<load>_u\t%0, %r1"
- [(set_attr "type" "Y2_miss")])
-
-(define_insn "insn_<load>add_miss"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (sign_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
- UNSPEC_LATENCY_MISS)))]
- ""
- "<load>add\t%0, %1, %2"
- [(set_attr "type" "X1_miss")])
-
-(define_insn "insn_<load>add_u_miss"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
- UNSPEC_LATENCY_MISS)))]
- ""
- "<load>add_u\t%0, %1, %2"
- [(set_attr "type" "X1_miss")])
-
-(define_insn "insn_lwadd_miss"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (match_dup 3))] UNSPEC_LATENCY_MISS))]
- ""
- "lwadd\t%0, %1, %2"
- [(set_attr "type" "X1_miss")])
-
-(define_insn "insn_lwadd_na_miss"
- [(set (match_operand:SI 1 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (and:SI (match_dup 3) (const_int -4)))]
- UNSPEC_LATENCY_MISS))]
- ""
- "lwadd_na\t%0, %1, %2"
- [(set_attr "type" "X1_miss")])
-
-(define_insn "insn_lw_na_miss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (and:SI (match_operand:SI 1 "address_operand" "rO")
- (const_int -4)))]
- UNSPEC_LATENCY_MISS))]
- ""
- "lw_na\t%0, %r1"
- [(set_attr "type" "X1_miss")])
-
-(define_insn "insn_lw_miss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(mem:SI (match_operand:SI 1 "address_operand" "rO"))]
- UNSPEC_LATENCY_MISS))]
- ""
- "lw\t%0, %r1"
- [(set_attr "type" "Y2_miss")])
-
-;; end loads
-
-(define_insn "insn_mfspr"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec_volatile:SI [(match_operand:SI 1 "u15bit_cint_operand" "i")]
- UNSPEC_INSN_MFSPR))
- (clobber (mem:BLK (const_int 0)))]
- ""
- "mfspr\t%0, %1"
- [(set_attr "type" "X1")])
-
-(define_insn "*mm"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mm_combiner:SI
- (and:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "const_int_operand" "n"))
- (and:SI (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 4 "const_int_operand" "n"))))]
- "tilepro_bitfield_operand_p (INTVAL (operands[3]), NULL, NULL)
- && INTVAL (operands[3]) == ~INTVAL (operands[4])"
- "mm\t%0, %r1, %r2, %M3"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_mm"
- [(set (match_operand:SI 0 "register_operand" "")
- (ior:SI
- (and:SI (match_operand:SI 1 "reg_or_cint_operand" "")
- (match_operand:SI 3 "u5bit_cint_operand" ""))
- (and:SI (match_operand:SI 2 "reg_or_cint_operand" "")
- (match_operand:SI 4 "u5bit_cint_operand" ""))))]
- ""
-{
- int first, last, i;
- HOST_WIDE_INT mask;
-
- first = INTVAL (operands[3]) & 31;
- last = INTVAL (operands[4]) & 31;
-
- if (((last + 1) & 31) == first)
- {
- /* Handle pathological case of a mask that includes only the
- first operand. The reordering code below can't handle this. */
- emit_move_insn (operands[0], operands[1]);
- DONE;
- }
-
- /* Canonicalize order by putting constant second, if any. */
- if (CONST_INT_P (operands[1]))
- {
- int tmp_first;
-
- rtx tmp = operands[1];
- operands[1] = operands[2];
- operands[2] = tmp;
-
- /* Invert the bit range. */
- tmp_first = first;
- first = (last + 1) & 31;
- last = (tmp_first - 1) & 31;
- }
-
- /* Convert the first/last bit range into a bit mask. */
- mask = 0;
-
- for (i = first; ; i = (i + 1) & 31)
- {
- mask |= ((HOST_WIDE_INT)1) << i;
- if (i == last)
- break;
- }
-
- mask = trunc_int_for_mode (mask, SImode);
-
- operands[1] = force_reg (SImode, operands[1]);
- operands[3] = GEN_INT (mask);
- operands[4] = GEN_INT (~mask);
-
- if (CONST_INT_P (operands[2]))
- {
- HOST_WIDE_INT inserted_bits = INTVAL (operands[2]) & ~mask;
-
- if (inserted_bits == 0)
- {
- /* All inserted bits are zero. Use a bitwise AND. */
- emit_insn (gen_andsi3 (operands[0], operands[1], operands[3]));
- DONE;
- }
- else if (inserted_bits == ~mask)
- {
- /* All inserted bits are ones. Use a bitwise IOR if we can. */
- if (satisfies_constraint_I (operands[4]))
- {
- emit_insn (gen_iorsi3 (operands[0], operands[1], operands[4]));
- DONE;
- }
-
- /* Canonicalize to inserting -1 when setting all masked bits
- to 1, to facilitate CSE. */
- inserted_bits = -1;
- }
-
- /* Sign extend the inserted bits to make them easier to materialize
- in a register, but only if the inserted bits (~mask) do not already
- include the high bits. */
- if ((~mask & 0x80000000) == 0)
- {
- int shift = sizeof (HOST_WIDE_INT) * 8 - first;
- inserted_bits = (inserted_bits << shift) >> shift;
- }
-
- operands[2] = GEN_INT (inserted_bits);
- }
-
- operands[2] = force_reg (SImode, operands[2]);
-})
-
-(define_insn "insn_movelis"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec_volatile:SI [(match_operand:SI 1 "s16bit_cint_operand" "i")]
- UNSPEC_INSN_MOVELIS))]
- ""
- "movelis\t%0, %1"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_mtspr"
- [(unspec_volatile:SI [(match_operand:SI 0 "u15bit_cint_operand" "i")
- (match_operand:SI 1 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MTSPR)
- (clobber (mem:BLK (const_int 0)))]
- ""
- "mtspr\t%0, %r1"
- [(set_attr "type" "X1")])
-
-(define_expand "insn_prefetch"
- [(prefetch (match_operand:SI 0 "address_operand" "")
- (const_int 0)
- (const_int 2))])
-
-(define_expand "insn_prefetch_L1"
- [(use (match_operand:SI 0 "address_operand" ""))]
- ""
-{
- /* Generate a volatile byte load to a dummy register. */
- rtx mem = gen_rtx_MEM (QImode, operands[0]);
- MEM_VOLATILE_P (mem) = 1;
-
- emit_insn (gen_zero_extendqisi2 (gen_reg_rtx (SImode), mem));
- DONE;
-})
-
-(define_expand "insn_s1a"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
- (const_int 2))
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- "")
-
-(define_expand "insn_s2a"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
- (const_int 4))
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- "")
-
-(define_expand "insn_s3a"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
- (const_int 8))
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- "")
-
-(define_expand "insn_<store>"
- [(set (mem:I12MODE (match_operand:SI 0 "address_operand" ""))
- (match_operand:SI 1 "reg_or_0_operand" ""))]
- ""
-{
- operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], SImode, 0);
-})
-
-(define_expand "insn_sw"
- [(set (mem:SI (match_operand:SI 0 "address_operand" ""))
- (match_operand:SI 1 "reg_or_0_operand" ""))]
- "")
-
-(define_expand "insn_<store>add"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI (match_operand:SI 3 "register_operand" "")
- (match_operand:SI 2 "s8bit_cint_operand" "")))
- (set (mem:I12MODE (match_dup 3))
- (match_operand:SI 1 "reg_or_0_operand" ""))])]
- ""
-{
- operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], SImode, 0);
-})
-
-(define_insn "*insn_<store>add"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "0")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (mem:I12MODE (match_dup 3))
- (match_operand:I12MODE 1 "reg_or_0_operand" "rO"))]
- ""
- "<store>add\t%0, %r1, %2"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_swadd"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (plus:SI (match_operand:SI 3 "register_operand" "0")
- (match_operand:SI 2 "s8bit_cint_operand" "i")))
- (set (mem:SI (match_dup 3))
- (match_operand:SI 1 "reg_or_0_operand" "rO"))]
- ""
- "swadd\t%0, %r1, %2"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_wh64"
- [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_WH64)
- (clobber (mem:BLK (const_int 0)))]
- ""
- "wh64\t%r0"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_tns"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (mem:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))
- (set (mem:SI (match_dup 1)) (const_int 1))]
- ""
- "tns\t%0, %1"
- [(set_attr "type" "X1")])
-
-;; insn_addb
-;; insn_addib
-;; insn_maxb_u
-;; insn_maxib_u
-;; insn_minb_u
-;; insn_minib_u
-;; insn_seqb
-;; insn_seqib
-;; insn_sltb
-;; insn_sltib
-;; insn_sltb_u
-;; insn_sltib_u
-(define_insn "<optab>v4qi3"
- [(set (match_operand:V4QI 0 "register_operand" "=r,r")
- (v1op_immed:V4QI
- (match_operand:V4QI 1 "reg_or_0_operand" "<comm>rO,rO")
- (match_operand:V4QI 2 "reg_or_v4s8bit_operand" "W,rO")))]
- ""
- "@
- <insn>ib<u>\t%0, %r1, %j2
- <insn>b<u>\t%0, %r1, %r2"
- [(set_attr "type" "X01,X01")])
-
-(define_expand "insn_<insn>b<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (v1op_immed:V4QI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- ""
-{
- tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
- V4QImode, operands[1], operands[2], true);
- DONE;
-})
-
-(define_expand "insn_<insn>ib<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (v1op_immed:V4QI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "s8bit_cint_operand" "")))]
- ""
-{
- /* Tile out immediate and expand to general case. */
- rtx n = tilepro_simd_int (operands[2], QImode);
- tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
- V4QImode, operands[1], n, true);
- DONE;
-})
-
-;; insn_shlb
-;; insn_shlib
-;; insn_shrb
-;; insn_shrib
-;; insn_srab
-;; insn_sraib
-(define_insn "<optab>v4qi3"
- [(set (match_operand:V4QI 0 "register_operand" "=r,r")
- (any_shift:V4QI
- (match_operand:V4QI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
- ""
- "@
- <insn>ib<u>\t%0, %r1, %2
- <insn>b<u>\t%0, %r1, %r2"
- [(set_attr "type" "X01,X01")])
-
-(define_expand "insn_<insn>b<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (any_shift:V4QI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_u5bit_operand" "")))]
- ""
-{
- tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
- V4QImode, operands[1], operands[2], false);
- DONE;
-})
-
-;; insn_addh
-;; insn_addih
-;; insn_maxh
-;; insn_maxih
-;; insn_minh
-;; insn_minih
-;; insn_seqh
-;; insn_seqih
-;; insn_slth
-;; insn_sltih
-;; insn_slth_u
-;; insn_sltih_u
-(define_insn "<optab>v2hi3"
- [(set (match_operand:V2HI 0 "register_operand" "=r,r")
- (v2op_immed:V2HI
- (match_operand:V2HI 1 "reg_or_0_operand" "<comm>rO,rO")
- (match_operand:V2HI 2 "reg_or_v2s8bit_operand" "Y,rO")))]
- ""
- "@
- <insn>ih<u>\t%0, %r1, %j2
- <insn>h<u>\t%0, %r1, %r2"
- [(set_attr "type" "X01,X01")])
-
-(define_expand "insn_<insn>h<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (v2op_immed:V2HI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- ""
-{
- tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
- V2HImode, operands[1], operands[2], true);
- DONE;
-})
-
-(define_expand "insn_<insn>ih<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (v2op_immed:V2HI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "s8bit_cint_operand" "")))]
- ""
-{
- /* Tile out immediate and expand to general case. */
- rtx n = tilepro_simd_int (operands[2], HImode);
- tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
- V2HImode, operands[1], n, true);
- DONE;
-})
-
-;; insn_shlh
-;; insn_shlih
-;; insn_shrh
-;; insn_shrih
-;; insn_srah
-;; insn_sraih
-(define_insn "<optab>v2hi3"
- [(set (match_operand:V2HI 0 "register_operand" "=r,r")
- (any_shift:V2HI
- (match_operand:V2HI 1 "reg_or_0_operand" "rO,rO")
- (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
- ""
- "@
- <insn>ih<u>\t%0, %r1, %2
- <insn>h<u>\t%0, %r1, %r2"
- [(set_attr "type" "X01,X01")])
-
-(define_expand "insn_<insn>h<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (any_shift:V2HI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- ""
-{
- tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
- V2HImode, operands[1], operands[2], false);
- DONE;
-})
-
-;; insn_addbs_u
-;; insn_subbs_u
-;; insn_subb
-;; insn_slteb
-;; insn_slteb_u
-;; insn_sneb
-(define_insn "<optab>v4qi3"
- [(set (match_operand:V4QI 0 "register_operand" "=r")
- (v1op:V4QI
- (match_operand:V4QI 1 "reg_or_0_operand" "<comm>rO")
- (match_operand:V4QI 2 "reg_or_0_operand" "rO")))]
- ""
- "<insn>b<u>\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_<insn>b<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (v1op:V4QI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- ""
-{
- tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
- V4QImode, operands[1], operands[2], true);
- DONE;
-})
-
-;; insn_addhs
-;; insn_subhs
-;; insn_subh
-;; insn_slteh
-;; insn_slteh_u
-;; insn_sneh
-(define_insn "<optab>v2hi3"
- [(set (match_operand:V2HI 0 "register_operand" "=r")
- (v2op:V2HI
- (match_operand:V2HI 1 "reg_or_0_operand" "<comm>rO")
- (match_operand:V2HI 2 "reg_or_0_operand" "rO")))]
- ""
- "<insn>h<u>\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_<insn>h<u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (v2op:V2HI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")))]
- ""
-{
- tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
- V2HImode, operands[1], operands[2], true);
- DONE;
-})
-
-;; insn_inthb
-
-;; Byte ordering of these vectors is endian dependent. We concat
-;; right-to-left for little endian. We concat and interleave in the
-;; opposite way gcc's vector patterns work, so we need to reverse the
-;; order of source operands.
-
-;; {B3,B2,B1,B0} {A3,A2,A1,A0}
-;; => {A3,A2,A1,A0,B3,B2,B1,B0}
-;; => {A3,B3,A2,B2}
-(define_insn "vec_interleave_highv4qi"
- [(set (match_operand:V4QI 0 "register_operand" "=r")
- (vec_select:V4QI
- (vec_concat:V8QI (match_operand:V4QI 1 "reg_or_0_operand" "rO")
- (match_operand:V4QI 2 "reg_or_0_operand" "rO"))
- (parallel [(const_int 2) (const_int 6)
- (const_int 3) (const_int 7)])))]
- ""
- "inthb\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_inthb"
- [(match_operand:SI 0 "register_operand" "")
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")]
- ""
-{
- /* Our instruction interleaves opposite of the way vec_interleave
- works, so we need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_interleave_highv4qi, V4QImode,
- operands[0], V4QImode, operands[2],
- operands[1], true);
- DONE;
-})
-
-;; insn_intlb
-;; {B3,B2,B1,B0} {A3,A2,A1,A0}
-;; => {A3,A2,A1,A0,B3,B2,B1,B0}
-;; => {A1,B1,A0,B0}
-(define_insn "vec_interleave_lowv4qi"
- [(set (match_operand:V4QI 0 "register_operand" "=r")
- (vec_select:V4QI
- (vec_concat:V8QI (match_operand:V4QI 1 "reg_or_0_operand" "rO")
- (match_operand:V4QI 2 "reg_or_0_operand" "rO"))
- (parallel [(const_int 0) (const_int 4)
- (const_int 1) (const_int 5)])))]
- ""
- "intlb\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_intlb"
- [(match_operand:SI 0 "register_operand" "")
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")]
- ""
-{
- /* Our instruction interleaves opposite of the way vec_interleave
- works, so we need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_interleave_lowv4qi, V4QImode,
- operands[0], V4QImode, operands[2],
- operands[1], true);
- DONE;
-})
-
-;; insn_inthh
-;; {B1,B0} {A1,A0}
-;; => {A1,A0,B1,B0}
-;; => {A1,B1}
-(define_insn "vec_interleave_highv2hi"
- [(set (match_operand:V2HI 0 "register_operand" "=r")
- (vec_select:V2HI
- (vec_concat:V4HI (match_operand:V2HI 1 "reg_or_0_operand" "rO")
- (match_operand:V2HI 2 "reg_or_0_operand" "rO"))
- (parallel [(const_int 1) (const_int 3)])))]
- ""
- "inthh\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_inthh"
- [(match_operand:SI 0 "register_operand" "")
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")]
- ""
-{
- /* Our instruction interleaves opposite of the way vec_interleave
- works, so we need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_interleave_highv2hi, V2HImode,
- operands[0], V2HImode, operands[2],
- operands[1], true);
- DONE;
-})
-
-;; insn_intlh
-;; {B1,B0} {A1,A0}
-;; => {A1,A0,B1,B0}
-;; => {A0,B0}
-(define_insn "vec_interleave_lowv2hi"
- [(set (match_operand:V2HI 0 "register_operand" "=r")
- (vec_select:V2HI
- (vec_concat:V4HI (match_operand:V2HI 1 "reg_or_0_operand" "rO")
- (match_operand:V2HI 2 "reg_or_0_operand" "rO"))
- (parallel [(const_int 0) (const_int 2)])))]
- ""
- "intlh\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_intlh"
- [(match_operand:SI 0 "register_operand" "")
- (match_operand:SI 1 "reg_or_0_operand" "")
- (match_operand:SI 2 "reg_or_0_operand" "")]
- ""
-{
- /* Our instruction interleaves opposite of the way vec_interleave
- works, so we need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_interleave_lowv2hi, V2HImode,
- operands[0], V2HImode, operands[2],
- operands[1], true);
- DONE;
-})
-
-;; insn_packbs_u
-;; insn_packlb
-;; {B1,B0} {A1,A0}
-;; => {A1,A0,B1,B0}
-(define_insn "vec_pack_<pack_optab>_v2hi"
- [(set (match_operand:V4QI 0 "register_operand" "=r")
- (vec_concat:V4QI
- (v2pack:V2QI (match_operand:V2HI 1 "reg_or_0_operand" "rO"))
- (v2pack:V2QI (match_operand:V2HI 2 "reg_or_0_operand" "rO"))))]
- ""
- "<pack_insn>b<pack_u>\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_<pack_insn>b<pack_u>"
- [(set (match_operand:SI 0 "register_operand" "")
- (vec_concat:V4QI
- (v2pack:V2QI (match_operand:SI 1 "reg_or_0_operand" ""))
- (v2pack:V2QI (match_operand:SI 2 "reg_or_0_operand" ""))))]
- ""
-{
- /* Our instruction concats opposite of the way vec_pack works, so we
- need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_pack_<pack_optab>_v2hi,
- V4QImode, operands[0],
- V2HImode, operands[2], operands[1], true);
- DONE;
-})
-
-;; insn_packhb
-;; {B1,B0} {A1,A0}
-;; => {A1,A0,B1,B0}
-(define_insn "vec_pack_hipart_v2hi"
- [(set (match_operand:V4QI 0 "register_operand" "=r")
- (vec_concat:V4QI
- (truncate:V2QI
- (ashiftrt:V2HI (match_operand:V2HI 1 "reg_or_0_operand" "rO")
- (const_int 8)))
- (truncate:V2QI
- (ashiftrt:V2HI (match_operand:V2HI 2 "reg_or_0_operand" "rO")
- (const_int 8)))))]
- ""
- "packhb\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_packhb"
- [(set (match_operand:SI 0 "register_operand" "")
- (vec_concat:V4QI
- (truncate:V2QI
- (ashiftrt:V2HI (match_operand:SI 2 "reg_or_0_operand" "")
- (const_int 8)))
- (truncate:V2QI
- (ashiftrt:V2HI (match_operand:SI 1 "reg_or_0_operand" "")
- (const_int 8)))))]
- ""
-{
- /* Our instruction concats opposite of the way vec_pack works, so we
- need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_pack_hipart_v2hi,
- V4QImode, operands[0],
- V2HImode, operands[2], operands[1], true);
- DONE;
-})
-
-;; insn_packhs
-;; {B0} {A0}
-;; => {A0,B0}
-(define_insn "vec_pack_ssat_si"
- [(set (match_operand:V2HI 0 "register_operand" "=r")
- (vec_concat:V2HI
- (ss_truncate:HI (match_operand:SI 1 "reg_or_0_operand" "rO"))
- (ss_truncate:HI (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
- ""
- "packhs\t%0, %r2, %r1"
- [(set_attr "type" "X01")])
-
-(define_expand "insn_packhs"
- [(set (match_operand:SI 0 "register_operand" "")
- (vec_concat:V2HI
- (ss_truncate:HI (match_operand:SI 2 "reg_or_0_operand" ""))
- (ss_truncate:HI (match_operand:SI 1 "reg_or_0_operand" ""))))]
- ""
-{
- /* Our instruction concats opposite of the way vec_pack works, so we
- need to reverse the source operands. */
- tilepro_expand_builtin_vector_binop (gen_vec_pack_ssat_si,
- V2HImode, operands[0],
- SImode, operands[2], operands[1], true);
- DONE;
-})
-
-;; Rest of the intrinsics
-(define_insn "insn_adiffb_u"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_ADIFFB_U))]
- ""
- "adiffb_u\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_adiffh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_ADIFFH))]
- ""
- "adiffh\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_avgb_u"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_AVGB_U))]
- ""
- "avgb_u\t%0, %r1, %r2"
- [(set_attr "type" "X0")])
-
-(define_insn "insn_avgh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_AVGH))]
- ""
- "avgh\t%0, %r1, %r2"
- [(set_attr "type" "X0")])
-
-(define_insn "insn_bitx"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_BITX))]
- ""
- "bitx\t%0, %r1"
- [(set_attr "type" "Y0")])
-
-(define_insn "insn_crc32_32"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_CRC32_32))]
- ""
- "crc32_32\t%0, %r1, %r2"
- [(set_attr "type" "X0")])
-
-(define_insn "insn_crc32_8"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_CRC32_8))]
- ""
- "crc32_8\t%0, %r1, %r2"
- [(set_attr "type" "X0")])
-
-(define_insn "insn_dtlbpr"
- [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_DTLBPR)]
- ""
- "dtlbpr\t%r0"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_dword_align"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_DWORD_ALIGN))]
- ""
- "dword_align\t%0, %r2, %r3"
- [(set_attr "type" "X0")])
-
-(define_insn "insn_finv"
- [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_FINV)]
- ""
- "finv\t%r0"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_flush"
- [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_FLUSH)]
- ""
- "flush\t%r0"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_fnop"
- [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FNOP)]
- ""
- "fnop")
-
-(define_insn "insn_ill"
- [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_ILL)]
- ""
- "ill"
- [(set_attr "type" "cannot_bundle")])
-
-(define_insn "insn_inv"
- [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_INV)]
- ""
- "inv\t%r0"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_lnk"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(const_int 0)] UNSPEC_INSN_LNK))]
- ""
- "lnk\t%0"
- [(set_attr "type" "X1")])
-
-(define_insn "insn_mnzb"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MNZB))]
- ""
- "mnzb\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_mnzh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MNZH))]
- ""
- "mnzh\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_mulhh_ss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHH_SS))]
- ""
- "mulhh_ss\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulhh_su"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHH_SU))]
- ""
- "mulhh_su\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhh_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHH_UU))]
- ""
- "mulhh_uu\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulhha_ss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHHA_SS))]
- ""
- "mulhha_ss\t%0, %r2, %r3"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulhha_su"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHHA_SU))]
- ""
- "mulhha_su\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhha_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHHA_UU))]
- ""
- "mulhha_uu\t%0, %r2, %r3"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulhhsa_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHHSA_UU))]
- ""
- "mulhhsa_uu\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhl_ss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHL_SS))]
- ""
- "mulhl_ss\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhl_su"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHL_SU))]
- ""
- "mulhl_su\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhl_us"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHL_US))]
- ""
- "mulhl_us\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhl_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHL_UU))]
- ""
- "mulhl_uu\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhla_ss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHLA_SS))]
- ""
- "mulhla_ss\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhla_su"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHLA_SU))]
- ""
- "mulhla_su\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhla_us"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHLA_US))]
- ""
- "mulhla_us\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhla_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHLA_UU))]
- ""
- "mulhla_uu\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulhlsa_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULHLSA_UU))]
- ""
- "mulhlsa_uu\t%0, %r2, %r3"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulll_ss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLL_SS))]
- ""
- "mulll_ss\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulll_su"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLL_SU))]
- ""
- "mulll_su\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mulll_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLL_UU))]
- ""
- "mulll_uu\t%0, %r1, %r2"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mullla_ss"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLLA_SS))]
- ""
- "mullla_ss\t%0, %r2, %r3"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mullla_su"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLLA_SU))]
- ""
- "mullla_su\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mullla_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLLA_UU))]
- ""
- "mullla_uu\t%0, %r2, %r3"
- [(set_attr "type" "Y0_2cycle")])
-
-(define_insn "insn_mulllsa_uu"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MULLLSA_UU))]
- ""
- "mulllsa_uu\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_mzb"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MZB))]
- ""
- "mzb\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_mzh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_MZH))]
- ""
- "mzh\t%0, %r1, %r2"
- [(set_attr "type" "X01")])
-
-(define_insn "insn_nap"
- [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_NAP)]
- ""
- "nap"
- [(set_attr "type" "cannot_bundle")])
-
-(define_insn "insn_nor"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (and:SI (not:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))
- (not:SI (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
- ""
- "nor\t%0, %r1, %r2")
-
-(define_insn "insn_sadab_u"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADAB_U))]
- ""
- "sadab_u\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_sadah"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADAH))]
- ""
- "sadah\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_sadah_u"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")
- (match_operand:SI 3 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADAH_U))]
- ""
- "sadah_u\t%0, %r2, %r3"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_sadb_u"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADB_U))]
- ""
- "sadb_u\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_sadh"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADH))]
- ""
- "sadh\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_sadh_u"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_SADH_U))]
- ""
- "sadh_u\t%0, %r1, %r2"
- [(set_attr "type" "X0_2cycle")])
-
-(define_insn "insn_tblidxb0"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_TBLIDXB0))]
- ""
- "tblidxb0\t%0, %r2"
- [(set_attr "type" "Y0")])
-
-(define_insn "insn_tblidxb1"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_TBLIDXB1))]
- ""
- "tblidxb1\t%0, %r2"
- [(set_attr "type" "Y0")])
-
-(define_insn "insn_tblidxb2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_TBLIDXB2))]
- ""
- "tblidxb2\t%0, %r2"
- [(set_attr "type" "Y0")])
-
-(define_insn "insn_tblidxb3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
- (match_operand:SI 2 "reg_or_0_operand" "rO")]
- UNSPEC_INSN_TBLIDXB3))]
- ""
- "tblidxb3\t%0, %r2"
- [(set_attr "type" "Y0")])
-
-
-;;
-;; pic related instructions
-;;
-
-;; NOTE: We compute the label in this unusual way because if we place
-;; the label after the lnk, whether it is at the same address as the
-;; lnk will vary depending on whether the optimization level chooses to
-;; insert bundling braces.
-(define_insn "insn_lnk_and_label"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec_volatile:SI [(match_operand:SI 1 "symbolic_operand" "")]
- UNSPEC_LNK_AND_LABEL))]
- ""
- "%1 = . + 8\n\tlnk\t%0"
- [(set_attr "type" "X1")])
-
-(define_expand "addli_pcrel"
- [(set (match_operand:SI 0 "register_operand" "")
- (lo_sum:SI
- (match_operand:SI 1 "register_operand" "")
- (const:SI
- (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")
- (match_operand:SI 3 "symbolic_operand" "")]
- UNSPEC_PCREL_SYM))))]
- "flag_pic")
-
-(define_expand "auli_pcrel"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (high:SI
- (const:SI
- (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")
- (match_operand:SI 3 "symbolic_operand" "")]
- UNSPEC_PCREL_SYM)))))]
- "flag_pic")
-
-(define_expand "add_got16"
- [(set (match_operand:SI 0 "register_operand" "")
- (lo_sum:SI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
- UNSPEC_GOT16_SYM))))]
- "flag_pic == 1")
-
-(define_expand "addhi_got32"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (high:SI
- (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
- UNSPEC_GOT32_SYM)))))]
- "flag_pic == 2")
-
-(define_expand "addlo_got32"
- [(set (match_operand:SI 0 "register_operand" "")
- (lo_sum:SI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
- UNSPEC_GOT32_SYM))))]
- "flag_pic == 2")
-
-
-;;
-;; TLS
-;;
-
-(define_expand "tls_gd_addhi"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (high:SI
- (const:SI (unspec:SI [(match_operand 2 "tls_symbolic_operand" "")]
- UNSPEC_TLS_GD)))))]
- "HAVE_AS_TLS")
-
-(define_expand "tls_gd_addlo"
- [(set (match_operand:SI 0 "register_operand" "")
- (lo_sum:SI
- (match_operand:SI 1 "reg_or_0_operand" "")
- (const:SI (unspec:SI [(match_operand 2 "tls_symbolic_operand" "")]
- UNSPEC_TLS_GD))))]
- "HAVE_AS_TLS")
-
-(define_expand "tls_gd_call"
- [(parallel
- [(set (reg:SI 0)
- (unspec:SI [(match_operand:SI 0 "tls_symbolic_operand" "")
- (reg:SI 0)]
- UNSPEC_TLS_GD_CALL))
- (clobber (reg:SI 25))
- (clobber (reg:SI 26))
- (clobber (reg:SI 27))
- (clobber (reg:SI 28))
- (clobber (reg:SI 29))
- (clobber (reg:SI 55))])]
- ""
-{
- cfun->machine->calls_tls_get_addr = true;
-})
-
-(define_insn "*tls_gd_call"
- [(set (reg:SI 0)
- (unspec:SI [(match_operand:SI 0 "tls_symbolic_operand" "")
- (reg:SI 0)]
- UNSPEC_TLS_GD_CALL))
- (clobber (reg:SI 25))
- (clobber (reg:SI 26))
- (clobber (reg:SI 27))
- (clobber (reg:SI 28))
- (clobber (reg:SI 29))
- (clobber (reg:SI 55))]
- ""
- "jal\ttls_gd_call(%0)"
- [(set_attr "type" "X1")])
-
-(define_insn "tls_gd_add"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "register_operand" "r")
- (match_operand:SI 2 "tls_symbolic_operand" "")]
- UNSPEC_TLS_GD_ADD))]
- "HAVE_AS_TLS"
- "addi\t%0, %1, tls_gd_add(%2)")
-
-(define_insn "tls_ie_load"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:SI 1 "register_operand" "r")
- (match_operand:SI 2 "tls_symbolic_operand" "")]
- UNSPEC_TLS_IE_LOAD))]
- "HAVE_AS_TLS"
- "lw_tls\t%0, %1, tls_ie_load(%2)"
- [(set_attr "type" "X1_2cycle")])
-
-(define_expand "tls_ie_addhi"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI
- (match_operand:SI 1 "register_operand" "")
- (high:SI
- (const:SI (unspec:SI [(match_operand 2 "tls_ie_symbolic_operand" "")]
- UNSPEC_TLS_IE)))))]
- "HAVE_AS_TLS")
-
-(define_expand "tls_ie_addlo"
- [(set (match_operand:SI 0 "register_operand" "")
- (lo_sum:SI
- (match_operand:SI 1 "register_operand" "")
- (const:SI (unspec:SI [(match_operand 2 "tls_ie_symbolic_operand" "")]
- UNSPEC_TLS_IE))))]
- "HAVE_AS_TLS")
-
-(define_expand "tls_le_addhi"
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI
- (match_operand:SI 1 "register_operand" "")
- (high:SI
- (const:SI (unspec:SI [(match_operand 2 "tls_le_symbolic_operand" "")]
- UNSPEC_TLS_LE)))))]
- "HAVE_AS_TLS")
-
-(define_expand "tls_le_addlo"
- [(set (match_operand:SI 0 "register_operand" "")
- (lo_sum:SI
- (match_operand:SI 1 "register_operand" "")
- (const:SI (unspec:SI [(match_operand 2 "tls_le_symbolic_operand" "")]
- UNSPEC_TLS_LE))))]
- "HAVE_AS_TLS")
-
-
-;;
-;; Stack protector instructions.
-;;
-
-(define_expand "stack_protect_set"
- [(set (match_operand 0 "nonautoincmem_operand" "")
- (match_operand 1 "nonautoincmem_operand" ""))]
- ""
-{
-#ifdef TARGET_THREAD_SSP_OFFSET
- rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
- rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
- rtx ssp = gen_reg_rtx (Pmode);
-
- emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
-
- operands[1] = gen_rtx_MEM (Pmode, ssp);
-#endif
-
- emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
-
- DONE;
-})
-
-(define_insn "stack_protect_setsi"
- [(set (match_operand:SI 0 "nonautoincmem_operand" "=U")
- (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")]
- UNSPEC_SP_SET))
- (set (match_scratch:SI 2 "=&r") (const_int 0))]
- ""
- "lw\t%2, %1; { sw\t%0, %2; move\t%2, zero }"
- [(set_attr "length" "16")
- (set_attr "type" "cannot_bundle_3cycle")])
-
-
-(define_expand "stack_protect_test"
- [(match_operand 0 "nonautoincmem_operand" "")
- (match_operand 1 "nonautoincmem_operand" "")
- (match_operand 2 "" "")]
- ""
-{
- rtx compare_result;
- rtx bcomp, loc_ref;
-
-#ifdef TARGET_THREAD_SSP_OFFSET
- rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
- rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
- rtx ssp = gen_reg_rtx (Pmode);
-
- emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
-
- operands[1] = gen_rtx_MEM (Pmode, ssp);
-#endif
-
- compare_result = gen_reg_rtx (SImode);
-
- emit_insn (gen_stack_protect_testsi (compare_result, operands[0],
- operands[1]));
-
- bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx);
-
- loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]);
-
- emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
- gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
- loc_ref, pc_rtx)));
-
- DONE;
-})
-
-(define_insn "stack_protect_testsi"
- [(set (match_operand:SI 0 "register_operand" "=&r")
- (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")
- (match_operand:SI 2 "nonautoincmem_operand" "U")]
- UNSPEC_SP_TEST))
- (set (match_scratch:SI 3 "=&r") (const_int 0))]
- ""
- "lw\t%0, %1; lw\t%3, %2; { seq\t%0, %0, %3; move\t%3, zero }"
- [(set_attr "length" "24")
- (set_attr "type" "cannot_bundle_4cycle")])
-