1 ;; Machine description for Tilera TILE-Gx chip for GCC.
2 ;; Copyright (C) 2011, 2012
3 ;; Free Software Foundation, Inc.
4 ;; Contributed by Walter Lee (walt@tilera.com)
6 ;; This file is part of GCC.
8 ;; GCC is free software; you can redistribute it and/or modify it
9 ;; under the terms of the GNU General Public License as published
10 ;; by the Free Software Foundation; either version 3, or (at your
11 ;; option) any later version.
13 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
14 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 ;; License for more details.
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GCC; see the file COPYING3. If not see
20 ;; <http://www.gnu.org/licenses/>.
24 ;; The following represent intrinsic insns, organized by latency.
28 (UNSPEC_INSN_ADDR_SHL16INSLI 1)
29 (UNSPEC_INSN_BFEXTS 2)
30 (UNSPEC_INSN_BFEXTU 3)
32 (UNSPEC_INSN_CRC32_32 5)
33 (UNSPEC_INSN_CRC32_8 6)
34 (UNSPEC_INSN_DBLALIGN 7)
35 (UNSPEC_INSN_DBLALIGN2 8)
36 (UNSPEC_INSN_DBLALIGN4 9)
37 (UNSPEC_INSN_DBLALIGN6 10)
38 (UNSPEC_INSN_DRAIN 11)
39 (UNSPEC_INSN_DTLBPR 12)
41 (UNSPEC_INSN_FLUSH 14)
42 (UNSPEC_INSN_FLUSHWB 15)
47 (UNSPEC_INSN_INFOL 20)
50 (UNSPEC_INSN_MFSPR 23)
52 (UNSPEC_INSN_MTSPR 25)
54 (UNSPEC_INSN_PREFETCH_L1_FAULT 27)
55 (UNSPEC_INSN_PREFETCH_L2_FAULT 28)
56 (UNSPEC_INSN_PREFETCH_L3_FAULT 29)
57 (UNSPEC_INSN_REVBITS 30)
58 (UNSPEC_INSN_SHUFFLEBYTES 31)
59 (UNSPEC_INSN_TBLIDXB0 32)
60 (UNSPEC_INSN_TBLIDXB1 33)
61 (UNSPEC_INSN_TBLIDXB2 34)
62 (UNSPEC_INSN_TBLIDXB3 35)
63 (UNSPEC_INSN_V1AVGU 36)
64 (UNSPEC_INSN_V2AVGS 37)
68 (UNSPEC_INSN_CMUL 100)
69 (UNSPEC_INSN_CMULA 101)
70 (UNSPEC_INSN_CMULAF 102)
71 (UNSPEC_INSN_CMULFR 103)
72 (UNSPEC_INSN_CMULHR 104)
73 (UNSPEC_INSN_CMULF 105)
74 (UNSPEC_INSN_CMULH 106)
75 (UNSPEC_INSN_EXCH 107)
76 (UNSPEC_INSN_FDOUBLE_ADDSUB 108)
77 (UNSPEC_INSN_FDOUBLE_ADD_FLAGS 109)
78 (UNSPEC_INSN_FDOUBLE_MUL_FLAGS 110)
79 (UNSPEC_INSN_FDOUBLE_PACK1 111)
80 (UNSPEC_INSN_FDOUBLE_PACK2 112)
81 (UNSPEC_INSN_FDOUBLE_SUB_FLAGS 113)
82 (UNSPEC_INSN_FDOUBLE_UNPACK_MAX 114)
83 (UNSPEC_INSN_FDOUBLE_UNPACK_MIN 115)
84 (UNSPEC_INSN_FETCHADDGEZ 116)
85 (UNSPEC_INSN_FSINGLE_ADD1 117)
86 (UNSPEC_INSN_FSINGLE_ADDSUB2 118)
87 (UNSPEC_INSN_FSINGLE_MUL1 119)
88 (UNSPEC_INSN_FSINGLE_MUL2 120)
89 (UNSPEC_INSN_FSINGLE_PACK1 121)
90 (UNSPEC_INSN_FSINGLE_PACK2 122)
91 (UNSPEC_INSN_FSINGLE_SUB1 123)
92 (UNSPEC_INSN_MULAX 124)
93 (UNSPEC_INSN_MULA_HS_HS 125)
94 (UNSPEC_INSN_MULA_HS_HU 126)
95 (UNSPEC_INSN_MULA_HS_LS 127)
96 (UNSPEC_INSN_MULA_HS_LU 128)
97 (UNSPEC_INSN_MULA_HU_HU 129)
98 (UNSPEC_INSN_MULA_HU_LS 130)
99 (UNSPEC_INSN_MULA_HU_LU 131)
100 (UNSPEC_INSN_MULA_LS_LS 132)
101 (UNSPEC_INSN_MULA_LS_LU 133)
102 (UNSPEC_INSN_MULA_LU_LU 134)
103 (UNSPEC_INSN_MUL_HS_HS 135)
104 (UNSPEC_INSN_MUL_HS_HU 136)
105 (UNSPEC_INSN_MUL_HS_LS 137)
106 (UNSPEC_INSN_MUL_HS_LU 138)
107 (UNSPEC_INSN_MUL_HU_HU 139)
108 (UNSPEC_INSN_MUL_HU_LS 140)
109 (UNSPEC_INSN_MUL_HU_LU 141)
110 (UNSPEC_INSN_MUL_LS_LS 142)
111 (UNSPEC_INSN_MUL_LS_LU 143)
112 (UNSPEC_INSN_MUL_LU_LU 144)
113 (UNSPEC_INSN_V1ADIFFU 145)
114 (UNSPEC_INSN_V1DDOTPU 146)
115 (UNSPEC_INSN_V1DDOTPUA 147)
116 (UNSPEC_INSN_V1DDOTPUS 148)
117 (UNSPEC_INSN_V1DDOTPUSA 149)
118 (UNSPEC_INSN_V1DOTP 150)
119 (UNSPEC_INSN_V1DOTPA 151)
120 (UNSPEC_INSN_V1DOTPU 152)
121 (UNSPEC_INSN_V1DOTPUA 153)
122 (UNSPEC_INSN_V1DOTPUS 154)
123 (UNSPEC_INSN_V1DOTPUSA 155)
124 (UNSPEC_INSN_V1SADAU 156)
125 (UNSPEC_INSN_V1SADU 157)
126 (UNSPEC_INSN_V2ADIFFS 158)
127 (UNSPEC_INSN_V2DOTP 159)
128 (UNSPEC_INSN_V2DOTPA 160)
129 (UNSPEC_INSN_V2MULFSC 161)
130 (UNSPEC_INSN_V2SADAS 162)
131 (UNSPEC_INSN_V2SADAU 163)
132 (UNSPEC_INSN_V2SADS 164)
133 (UNSPEC_INSN_V2SADU 165)
136 (UNSPEC_INSN_CMPEXCH 200)
139 ;; The following are special insns.
143 (UNSPEC_BLOCKAGE 201)
146 (UNSPEC_LNK_AND_LABEL 202)
151 ;; Insns generating difference of two labels
152 (UNSPEC_MOV_PCREL_STEP3 204)
154 ;; Latency specifying loads.
155 (UNSPEC_LATENCY_L2 205)
156 (UNSPEC_LATENCY_MISS 206)
158 ;; A pseudo-op that prevents network operations from being ordered.
159 (UNSPEC_NETWORK_BARRIER 207)
161 ;; Operations that access network registers.
162 (UNSPEC_NETWORK_RECEIVE 208)
163 (UNSPEC_NETWORK_SEND 209)
165 ;; Stack protector operations
169 ;; This is used to move a value to a SPR.
170 (UNSPEC_SPR_MOVE 212)
172 ;; A call to __tls_get_addr
173 (UNSPEC_TLS_GD_CALL 213)
175 ;; An opaque TLS "add" operation for TLS general dynamic model
177 (UNSPEC_TLS_GD_ADD 214)
179 ;; An opaque TLS "load" operation for TLS initial exec model access.
180 (UNSPEC_TLS_IE_LOAD 215)
182 ;; An opaque TLS "add" operation for TLS access.
191 ;; The following are operands.
197 (UNSPEC_HW0_LAST 304)
198 (UNSPEC_HW1_LAST 305)
199 (UNSPEC_HW2_LAST 306)
201 (UNSPEC_HW0_PCREL 307)
202 (UNSPEC_HW1_LAST_PCREL 308)
205 (UNSPEC_HW0_LAST_GOT 310)
206 (UNSPEC_HW1_LAST_GOT 311)
208 (UNSPEC_HW0_TLS_GD 312)
209 (UNSPEC_HW1_LAST_TLS_GD 313)
211 (UNSPEC_HW0_TLS_IE 314)
212 (UNSPEC_HW1_LAST_TLS_IE 315)
214 (UNSPEC_HW0_TLS_LE 316)
215 (UNSPEC_HW1_LAST_TLS_LE 317)
217 ;; This is used to wrap around the addresses of non-temporal load/store
219 (UNSPEC_NON_TEMPORAL 318)
222 ;; Mark the last instruction of various latencies, used to
223 ;; determine the rtx costs of unspec insns.
225 (TILEGX_LAST_LATENCY_1_INSN 99)
226 (TILEGX_LAST_LATENCY_2_INSN 199)
227 (TILEGX_LAST_LATENCY_INSN 299)
231 (TILEGX_NETREG_IDN0 0)
232 (TILEGX_NETREG_IDN1 1)
233 (TILEGX_NETREG_UDN0 2)
234 (TILEGX_NETREG_UDN1 3)
235 (TILEGX_NETREG_UDN2 4)
236 (TILEGX_NETREG_UDN3 5)
240 (TILEGX_CMPEXCH_REG 66)
241 (TILEGX_NETORDER_REG 67)
245 ;; Operand and operator predicates and constraints
247 (include "predicates.md")
248 (include "constraints.md")
249 (include "tilegx-generic.md")
251 ;; Define an insn type attribute. This defines what pipes things can go in.
253 "X0,X0_2cycle,X1,X1_branch,X1_2cycle,X1_L2,X1_miss,X01,Y0,Y0_2cycle,Y1,Y2,Y2_2cycle,Y2_L2,Y2_miss,Y01,cannot_bundle,cannot_bundle_3cycle,cannot_bundle_4cycle,nothing"
254 (const_string "Y01"))
256 (define_attr "length" ""
257 (cond [(eq_attr "type" "X1_branch")
259 (and (le (minus (match_dup 0) (pc)) (const_int 524280))
260 (le (minus (pc) (match_dup 0)) (const_int 524288)))
267 ;; Define some iterators.
268 (define_mode_iterator IVMODE [SI DI V8QI V4HI V2SI])
269 (define_mode_iterator IVNMODE [SI V8QI V4HI V2SI])
270 (define_mode_iterator I48MODE [SI DI])
271 (define_mode_iterator I48MODE2 [SI DI])
272 (define_mode_iterator I124MODE [QI HI SI])
273 (define_mode_iterator FI48MODE [SF DF SI DI])
274 (define_mode_iterator VEC48MODE [V8QI V4HI])
275 (define_mode_iterator VEC248MODE [V8QI V4HI V2SI])
277 (define_mode_attr n [(QI "1") (HI "2") (SI "4") (DI "")
278 (V8QI "1") (V4HI "2") (V2SI "4")])
279 (define_mode_attr x [(SI "x") (DI "")])
280 (define_mode_attr bitsuffix [(SI "_32bit") (DI "")])
281 (define_mode_attr four_if_si [(SI "4") (DI "")])
282 (define_mode_attr four_s_if_si [(SI "4s") (DI "")])
283 (define_mode_attr nbits [(SI "5") (DI "6")])
284 (define_mode_attr shift_pipe [(SI "X01") (DI "*")])
286 ;; Code iterator for either extend.
287 (define_code_iterator any_extend [sign_extend zero_extend])
289 ;; Code iterator for all three shifts.
290 (define_code_iterator any_shift [ashift ashiftrt lshiftrt])
292 ;; Code iterator for all byte ops without immediate variants.
293 (define_code_iterator v1op [us_minus us_plus minus ne le leu mult])
295 ;; Code iterator for all 2-byte vector ops without immediate variants.
296 (define_code_iterator v2op [ss_minus ss_plus minus ne le leu])
298 ;; Code iterator for all 4-byte vector ops without immediate variants.
299 (define_code_iterator v4op [ss_minus ss_plus minus plus])
301 ;; Code iterator for all byte vector ops with immediate variants.
302 (define_code_iterator v1op_immed [plus umax umin eq lt ltu])
304 ;; Code iterator for all 2-byte vector ops with immediate variants.
305 (define_code_iterator v2op_immed [plus smax smin eq lt ltu])
307 ;; Code iterator for all 2-byte vector shifts without immediate variants.
308 (define_code_iterator v2shift [ss_ashift])
310 ;; Code iterator for all 4-byte vector shifts without immediate variants.
311 (define_code_iterator v4shift [ashift ashiftrt lshiftrt ss_ashift])
313 ;; <optab> expands to the name of the optab for a particular code.
314 (define_code_attr optab [(ashift "ashl")
337 ;; <insn> expands to the name of the insn that implements a particular
339 (define_code_attr insn [(ashift "shl")
362 ;; <pipe> expands to the pipeline resource that contains the
364 (define_code_attr pipe [(ashift "X01")
387 ;; <comm> indicates whether a particular code is commutative, using
388 ;; the "%" commutative opterator constraint.
389 (define_code_attr comm [(ashift "")
412 ;; <s> is the load/store extension suffix.
413 (define_code_attr s [(zero_extend "u")
416 ;; Code for packing two 2-byte vectors.
417 (define_code_iterator v2pack [truncate us_truncate])
419 ;; <pack_optab> expands to the part of the optab name describing how
420 ;; two vectors are packed.
421 (define_code_attr pack_optab [(truncate "trunc")
423 (ss_truncate "ssat")])
425 ;; <pack_insn> expands to the insn that implements a particular vector
427 (define_code_attr pack_insn [(truncate "packl")
428 (us_truncate "packuc")
429 (ss_truncate "packsc")])
432 ;; The basic data move insns.
435 (define_expand "movqi"
436 [(set (match_operand:QI 0 "nonimmediate_operand" "")
437 (match_operand:QI 1 "nonautoinc_operand" ""))]
440 if (tilegx_expand_mov (QImode, operands))
444 (define_insn "*movqi_insn"
445 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,r,U,m")
446 (match_operand:QI 1 "move_operand" "r,I,U,m,rO,rO"))]
447 "(register_operand (operands[0], QImode)
448 || reg_or_0_operand (operands[1], QImode))"
453 ld1u_add\t%0, %I1, %i1
455 st1_add\t%I0, %r1, %i0"
456 [(set_attr "type" "*,*,Y2_2cycle,X1_2cycle,Y2,X1")])
458 (define_expand "movhi"
459 [(set (match_operand:HI 0 "nonimmediate_operand" "")
460 (match_operand:HI 1 "nonautoinc_operand" ""))]
463 if (tilegx_expand_mov (HImode, operands))
467 (define_insn "*movhi_insn"
468 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,r,r,U,m")
469 (match_operand:HI 1 "move_operand" "r,I,JT,U,m,rO,rO"))]
470 "(register_operand (operands[0], HImode)
471 || reg_or_0_operand (operands[1], HImode))"
477 ld2u_add\t%0, %I1, %i1
479 st2_add\t%I0, %r1, %i0"
480 [(set_attr "type" "*,*,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
482 (define_expand "movsi"
483 [(set (match_operand:SI 0 "nonimmediate_operand" "")
484 (match_operand:SI 1 "nonautoinc_operand" ""))]
487 if (tilegx_expand_mov (SImode, operands))
491 (define_insn "*movsi_insn"
492 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,r,U,m")
493 (match_operand:SI 1 "move_operand" "r,I,JT,K,U,m,rO,rO"))]
494 "(register_operand (operands[0], SImode)
495 || reg_or_0_operand (operands[1], SImode))"
500 shl16insli\t%0, zero, %h1
502 ld4s_add\t%0, %I1, %i1
504 st4_add\t%I0, %r1, %i0"
505 [(set_attr "type" "*,*,X01,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
507 (define_expand "movdi"
508 [(set (match_operand:DI 0 "nonimmediate_operand" "")
509 (match_operand:DI 1 "nonautoinc_operand" ""))]
512 if (tilegx_expand_mov (DImode, operands))
516 (define_insn "*movdi_insn"
517 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,r,r,r,r,U,m")
518 (match_operand:DI 1 "move_operand" "r,I,JT,K,N,P,U,m,rO,rO"))]
519 "(register_operand (operands[0], DImode)
520 || reg_or_0_operand (operands[1], DImode))"
525 shl16insli\t%0, zero, %h1
526 v1addi\t%0, zero, %j1
527 v2addi\t%0, zero, %h1
531 st_add\t%I0, %r1, %i0"
532 [(set_attr "type" "*,*,X01,X01,X01,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
534 (define_expand "movmisalign<mode>"
535 [(set (match_operand:VEC248MODE 0 "nonautoincmem_nonimmediate_operand" "")
536 (match_operand:VEC248MODE 1 "nonautoincmem_general_operand" ""))]
539 tilegx_expand_movmisalign (<MODE>mode, operands);
543 (define_expand "movsf"
544 [(set (match_operand:SF 0 "nonimmediate_operand" "")
545 (match_operand:SF 1 "general_operand" ""))]
548 /* Materialize immediates using clever SImode code, but don't
549 do this after reload starts, since gen_lowpart will choke
550 during reload if given an illegitimate address. */
551 if (immediate_operand (operands[1], SFmode)
552 && operands[1] != const0_rtx
553 && (register_operand (operands[0], SFmode)
554 || (!reload_in_progress && !reload_completed)))
556 emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
557 gen_lowpart (SImode, operands[1])));
562 (define_insn "*movsf"
563 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,U,m")
564 (match_operand:SF 1 "general_operand" "rO,U,m,rO,rO"))]
569 ld4s_add\t%0, %I1, %i1
571 st4_add\t%I0, %r1, %i0"
572 [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
574 (define_expand "movdf"
575 [(set (match_operand:DF 0 "nonimmediate_operand" "")
576 (match_operand:DF 1 "general_operand" ""))]
579 /* Materialize immediates using clever DImode code, but don't
580 do this after reload starts, since gen_lowpart will choke
581 during reload if given an illegitimate address. */
582 if (immediate_operand (operands[1], DFmode)
583 && operands[1] != const0_rtx
584 && (register_operand (operands[0], DFmode)
585 || (!reload_in_progress && !reload_completed)))
587 emit_insn (gen_movdi (gen_lowpart (DImode, operands[0]),
588 gen_lowpart (DImode, operands[1])));
593 (define_insn "*movdf"
594 [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,r,U,m")
595 (match_operand:DF 1 "general_operand" "rO,U,m,rO,rO"))]
602 st_add\t%I0, %r1, %i0"
603 [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
605 (define_expand "mov<mode>"
606 [(set (match_operand:VEC248MODE 0 "nonimmediate_operand" "")
607 (match_operand:VEC248MODE 1 "general_operand" ""))]
610 /* Materialize immediates using clever DImode code, but don't
611 do this after reload starts, since gen_lowpart will choke
612 during reload if given an illegitimate address. */
613 if (immediate_operand (operands[1], <MODE>mode)
614 && operands[1] != const0_rtx
615 && (register_operand (operands[0], <MODE>mode)
616 || (!reload_in_progress && !reload_completed)))
618 emit_insn (gen_movdi (gen_lowpart (DImode, operands[0]),
619 gen_lowpart (DImode, operands[1])));
624 (define_insn "*mov<mode>"
625 [(set (match_operand:VEC248MODE 0 "nonimmediate_operand" "=r,r,r,U,m")
626 (match_operand:VEC248MODE 1 "general_operand" "rO,U,m,rO,rO"))]
633 st_add\t%I0, %r1, %i0"
634 [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
636 (define_insn "movstrictqi"
637 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r"))
638 (match_operand:QI 1 "reg_or_0_operand" "rO"))]
640 "bfins\t%0, %r1, 0, 7"
641 [(set_attr "type" "X0")])
643 (define_insn "movstricthi"
644 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
645 (match_operand:HI 1 "reg_or_0_operand" "rO"))]
647 "bfins\t%0, %r1, 0, 15"
648 [(set_attr "type" "X0")])
650 (define_insn "movstrictsi"
651 [(set (strict_low_part (match_operand:SI 0 "register_operand" "+r"))
652 (match_operand:SI 1 "reg_or_0_operand" "rO"))]
654 "bfins\t%0, %r1, 0, 31"
655 [(set_attr "type" "X0")])
659 ;; Bit-field extracts/inserts
662 (define_expand "insv"
663 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "")
664 (match_operand:DI 1 "u6bit_cint_operand" "")
665 (match_operand:DI 2 "u6bit_cint_operand" ""))
666 (match_operand:DI 3 "reg_or_cint_operand" ""))]
669 rtx first_rtx = operands[2];
670 HOST_WIDE_INT first = INTVAL (first_rtx);
671 HOST_WIDE_INT width = INTVAL (operands[1]);
676 /* Which bits are we affecting? */
677 HOST_WIDE_INT mask = ((((HOST_WIDE_INT) 1) << width) - 1) << first;
679 /* Extract just the bits we need, sign extending them to make the
680 constant easier to materialize in a register. */
681 int shift = sizeof(HOST_WIDE_INT) * 8 - width;
682 HOST_WIDE_INT n = (INTVAL (v) << shift) >> shift;
686 /* We are setting every bit in the bitfield to zero. Try to use
687 andi instead, since that is more efficient. */
688 rtx mask_rtx = GEN_INT (~mask);
689 if (satisfies_constraint_I (mask_rtx))
691 emit_insn (gen_anddi3 (operands[0], operands[0], mask_rtx));
695 operands[3] = const0_rtx;
701 /* We are setting every bit in the bitfield to one. Try to use
702 ori instead, since that is more efficient. */
703 rtx mask_rtx = GEN_INT (mask);
704 if (satisfies_constraint_I (mask_rtx))
706 emit_insn (gen_iordi3 (operands[0], operands[0], mask_rtx));
711 if (!can_create_pseudo_p ())
714 operands[3] = force_reg (DImode, GEN_INT (n));
719 (define_insn "*insv_tblidxb0"
720 [(set (zero_extract:DI
721 (match_operand:DI 0 "register_operand" "+r")
724 (match_operand:DI 1 "register_operand" "rO"))]
727 [(set_attr "type" "Y0")])
729 (define_insn "*insv_tblidxb1"
730 [(set (zero_extract:DI
731 (match_operand:DI 0 "register_operand" "+r")
737 (match_operand:DI 1 "register_operand" "rO")))]
740 [(set_attr "type" "Y0")])
742 (define_insn "*insv_tblidxb2"
743 [(set (zero_extract:DI
744 (match_operand:DI 0 "register_operand" "+r")
750 (match_operand:DI 1 "register_operand" "rO")))]
753 [(set_attr "type" "Y0")])
755 (define_insn "*insv_tblidxb3"
756 [(set (zero_extract:DI
757 (match_operand:DI 0 "register_operand" "+r")
763 (match_operand:DI 1 "register_operand" "rO")))]
766 [(set_attr "type" "Y0")])
768 (define_insn "*insv_bfins"
769 [(set (zero_extract:DI
770 (match_operand:DI 0 "register_operand" "+r")
771 (match_operand:DI 1 "u6bit_cint_operand" "n")
772 (match_operand:DI 2 "u6bit_cint_operand" "n"))
773 (match_operand:DI 3 "reg_or_cint_operand" "rO"))]
775 "bfins\t%0, %r3, %2, %2+%1-1"
776 [(set_attr "type" "X0")])
778 (define_insn "*insv_mm"
779 [(set (zero_extract:DI
780 (match_operand:DI 0 "register_operand" "+r")
781 (match_operand:DI 1 "u6bit_cint_operand" "n")
782 (match_operand:DI 2 "u6bit_cint_operand" "n"))
784 (match_operand:DI 3 "register_operand" "rO")
791 operands[1] = GEN_INT (INTVAL (operands[1]) + INTVAL (operands[2]));
793 n = INTVAL (operands[2]);
794 n = (n == 0) ? 63 : n - 1;
795 operands[2] = GEN_INT (n);
797 return "mm\t%0, %r3, %1, %2";
799 [(set_attr "type" "X0")])
801 (define_expand "extv"
802 [(set (match_operand:DI 0 "register_operand" "")
803 (sign_extract:DI (match_operand 1 "nonautoincmem_general_operand" "")
804 (match_operand:DI 2 "immediate_operand" "")
805 (match_operand:DI 3 "immediate_operand" "")))]
808 if (MEM_P (operands[1]))
810 HOST_WIDE_INT bit_offset, bit_width;
811 HOST_WIDE_INT first_byte_offset, last_byte_offset;
813 if (GET_MODE (operands[1]) != QImode)
816 bit_width = INTVAL (operands[2]);
817 bit_offset = INTVAL (operands[3]);
819 /* Reject bitfields that can be done with a normal load */
820 if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
823 /* The value in memory cannot span more than 8 bytes. */
824 first_byte_offset = bit_offset / BITS_PER_UNIT;
825 last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
826 if (last_byte_offset - first_byte_offset > 7)
829 tilegx_expand_unaligned_load (operands[0], operands[1],
830 bit_width, bit_offset, 1);
835 operands[1] = force_reg (DImode, operands[1]);
838 (define_expand "extzv"
839 [(set (match_operand:DI 0 "register_operand" "")
840 (zero_extract:DI (match_operand 1 "nonautoincmem_general_operand" "")
841 (match_operand:DI 2 "immediate_operand" "")
842 (match_operand:DI 3 "immediate_operand" "")))]
845 HOST_WIDE_INT bit_width = INTVAL (operands[2]);
846 HOST_WIDE_INT bit_offset = INTVAL (operands[3]);
849 if (MEM_P (operands[1]))
851 HOST_WIDE_INT first_byte_offset, last_byte_offset;
853 if (GET_MODE (operands[1]) != QImode)
856 /* Reject bitfields that can be done with a normal load */
857 if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
860 /* The value in memory cannot span more than 8 bytes. */
861 first_byte_offset = bit_offset / BITS_PER_UNIT;
862 last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
863 if (last_byte_offset - first_byte_offset > 7)
866 tilegx_expand_unaligned_load (operands[0], operands[1],
867 bit_width, bit_offset, 0);
872 operands[1] = force_reg (DImode, operands[1]);
876 /* Extracting the low bits is just a bitwise AND. */
877 HOST_WIDE_INT mask = ((HOST_WIDE_INT)1 << bit_width) - 1;
878 emit_insn (gen_anddi3 (operands[0], operands[1], GEN_INT (mask)));
888 ;; First step of the 3-insn sequence to materialize a symbolic
890 (define_expand "mov_address_step1"
891 [(set (match_operand:DI 0 "register_operand" "")
892 (const:DI (unspec:DI [(match_operand:DI 1 "symbolic_operand" "")]
895 ;; Second step of the 3-insn sequence to materialize a symbolic
897 (define_expand "mov_address_step2"
898 [(set (match_operand:DI 0 "register_operand" "")
900 [(match_operand:DI 1 "reg_or_0_operand" "")
901 (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
903 UNSPEC_INSN_ADDR_SHL16INSLI))])
905 ;; Third step of the 3-insn sequence to materialize a symbolic
907 (define_expand "mov_address_step3"
908 [(set (match_operand:DI 0 "register_operand" "")
910 [(match_operand:DI 1 "reg_or_0_operand" "")
911 (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
913 UNSPEC_INSN_ADDR_SHL16INSLI))])
915 ;; First step of the 2-insn sequence to materialize a 32-bit symbolic
917 (define_expand "mov_address_32bit_step1"
918 [(set (match_operand:SI 0 "register_operand" "")
919 (const:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "")]
922 ;; Second step of the 2-insn sequence to materialize a 32-bit symbolic
924 (define_expand "mov_address_32bit_step2"
925 [(set (match_operand:SI 0 "register_operand" "")
927 [(match_operand:SI 1 "reg_or_0_operand" "")
928 (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
930 UNSPEC_INSN_ADDR_SHL16INSLI))])
934 ;; pic related instructions
937 ;; NOTE: We compute the label in this unusual way because if we place
938 ;; the label after the lnk, whether it is at the same address as the
939 ;; lnk will vary depending on whether the optimization level chooses
940 ;; to insert bundling braces.
941 (define_insn "insn_lnk_and_label<bitsuffix>"
942 [(set (match_operand:I48MODE 0 "register_operand" "=r")
943 (unspec_volatile:I48MODE
944 [(match_operand:I48MODE 1 "symbolic_operand" "")]
945 UNSPEC_LNK_AND_LABEL))]
947 "%1 = . + 8\n\tlnk\t%0"
948 [(set_attr "type" "Y1")])
950 ;; First step of the 3-insn sequence to materialize a position
951 ;; independent address by adding the difference of two labels to a
952 ;; base label in the text segment, assuming that the difference fits
953 ;; in 32 signed bits.
954 (define_expand "mov_pcrel_step1<bitsuffix>"
955 [(set (match_operand:I48MODE 0 "register_operand" "")
956 (const:I48MODE (unspec:I48MODE
957 [(match_operand:I48MODE 1 "symbolic_operand" "")
958 (match_operand:I48MODE 2 "symbolic_operand" "")]
959 UNSPEC_HW1_LAST_PCREL)))]
962 ;; Second step of the 3-insn sequence to materialize a position
963 ;; independent address by adding the difference of two labels to a
964 ;; base label in the text segment, assuming that the difference fits
965 ;; in 32 signed bits.
966 (define_expand "mov_pcrel_step2<bitsuffix>"
967 [(set (match_operand:I48MODE 0 "register_operand" "")
969 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
971 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")
972 (match_operand:I48MODE 3 "symbolic_operand" "")]
974 UNSPEC_INSN_ADDR_SHL16INSLI))]
977 ;; Third step of the 3-insn sequence to materialize a position
978 ;; independent address by adding the difference of two labels to a base
979 ;; label in the text segment, assuming that the difference fits in 32
981 (define_insn "mov_pcrel_step3<bitsuffix>"
982 [(set (match_operand:I48MODE 0 "register_operand" "=r")
983 (unspec:I48MODE [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
984 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")
985 (match_operand:I48MODE 3 "symbolic_operand" "in")
986 (match_operand:I48MODE 4 "symbolic_operand" "in")]
987 UNSPEC_MOV_PCREL_STEP3))]
989 "add<x>\t%0, %r1, %r2")
991 (define_expand "add_got16<bitsuffix>"
992 [(set (match_operand:I48MODE 0 "register_operand" "")
994 (match_operand:I48MODE 1 "reg_or_0_operand" "")
996 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
997 UNSPEC_HW0_LAST_GOT))))]
1000 (define_expand "mov_got32_step1<bitsuffix>"
1001 [(set (match_operand:I48MODE 0 "register_operand" "")
1003 (unspec:I48MODE [(match_operand:I48MODE 1 "symbolic_operand" "")]
1004 UNSPEC_HW1_LAST_GOT)))]
1007 (define_expand "mov_got32_step2<bitsuffix>"
1008 [(set (match_operand:I48MODE 0 "register_operand" "")
1010 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1012 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
1014 UNSPEC_INSN_ADDR_SHL16INSLI))]
1022 (define_expand "mov_tls_gd_step1<bitsuffix>"
1023 [(set (match_operand:I48MODE 0 "register_operand" "")
1025 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1026 UNSPEC_HW1_LAST_TLS_GD)))]
1029 (define_expand "mov_tls_gd_step2<bitsuffix>"
1030 [(set (match_operand:I48MODE 0 "register_operand" "")
1032 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1034 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1035 UNSPEC_HW0_TLS_GD))]
1036 UNSPEC_INSN_ADDR_SHL16INSLI))]
1039 (define_expand "mov_tls_ie_step1<bitsuffix>"
1040 [(set (match_operand:I48MODE 0 "register_operand" "")
1042 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1043 UNSPEC_HW1_LAST_TLS_IE)))]
1046 (define_expand "mov_tls_ie_step2<bitsuffix>"
1047 [(set (match_operand:I48MODE 0 "register_operand" "")
1049 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1051 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1052 UNSPEC_HW0_TLS_IE))]
1053 UNSPEC_INSN_ADDR_SHL16INSLI))]
1056 (define_expand "mov_tls_le_step1<bitsuffix>"
1057 [(set (match_operand:I48MODE 0 "register_operand" "")
1059 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1060 UNSPEC_HW1_LAST_TLS_LE)))]
1063 (define_expand "mov_tls_le_step2<bitsuffix>"
1064 [(set (match_operand:I48MODE 0 "register_operand" "")
1066 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1068 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1069 UNSPEC_HW0_TLS_LE))]
1070 UNSPEC_INSN_ADDR_SHL16INSLI))]
1073 (define_expand "tls_gd_call<bitsuffix>"
1075 [(set (reg:I48MODE 0)
1076 (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1078 UNSPEC_TLS_GD_CALL))
1079 (clobber (reg:I48MODE 25))
1080 (clobber (reg:I48MODE 26))
1081 (clobber (reg:I48MODE 27))
1082 (clobber (reg:I48MODE 28))
1083 (clobber (reg:I48MODE 29))
1084 (clobber (reg:I48MODE 55))])]
1087 cfun->machine->calls_tls_get_addr = true;
1090 (define_insn "*tls_gd_call<bitsuffix>"
1091 [(set (reg:I48MODE 0)
1092 (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1094 UNSPEC_TLS_GD_CALL))
1095 (clobber (reg:I48MODE 25))
1096 (clobber (reg:I48MODE 26))
1097 (clobber (reg:I48MODE 27))
1098 (clobber (reg:I48MODE 28))
1099 (clobber (reg:I48MODE 29))
1100 (clobber (reg:I48MODE 55))]
1102 "jal\ttls_gd_call(%0)"
1103 [(set_attr "type" "X1")])
1105 (define_insn "tls_gd_add<bitsuffix>"
1106 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1107 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1108 (match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1109 UNSPEC_TLS_GD_ADD))]
1111 "add<x>i\t%0, %1, tls_gd_add(%2)")
1113 (define_insn "tls_add<bitsuffix>"
1114 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1115 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1116 (match_operand:I48MODE 2 "register_operand" "0")
1117 (match_operand:I48MODE 3 "tls_symbolic_operand" "")]
1120 "add<x>i\t%0, %1, tls_add(%3)")
1122 (define_insn "tls_ie_load<bitsuffix>"
1123 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1124 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1125 (match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1126 UNSPEC_TLS_IE_LOAD))]
1128 "ld<four_s_if_si>_tls\t%0, %1, tls_ie_load(%2)"
1129 [(set_attr "type" "X1_2cycle")])
1131 (define_insn "*zero_extract<mode>"
1132 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1133 (zero_extract:I48MODE
1134 (match_operand:I48MODE 1 "reg_or_0_operand" "r")
1135 (match_operand:I48MODE 2 "u6bit_cint_operand" "n")
1136 (match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
1138 "bfextu\t%0, %r1, %3, %3+%2-1"
1139 [(set_attr "type" "X0")])
1141 (define_insn "*sign_extract_low32"
1142 [(set (match_operand:DI 0 "register_operand" "=r")
1144 (match_operand:DI 1 "reg_or_0_operand" "r")
1145 (match_operand:DI 2 "u6bit_cint_operand" "n")
1146 (match_operand:DI 3 "u6bit_cint_operand" "n")))]
1147 "INTVAL (operands[3]) == 0 && INTVAL (operands[2]) == 32"
1148 "addxi\t%0, %r1, 0")
1150 (define_insn "*sign_extract"
1151 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1152 (sign_extract:I48MODE
1153 (match_operand:I48MODE 1 "reg_or_0_operand" "r")
1154 (match_operand:I48MODE 2 "u6bit_cint_operand" "n")
1155 (match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
1157 "bfexts\t%0, %r1, %3, %3+%2-1"
1158 [(set_attr "type" "X0")])
1165 (define_insn "add<mode>3"
1166 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1167 (plus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO,rO")
1168 (match_operand:I48MODE 2 "add_operand" "r,I,JT")))]
1171 add<x>\t%0, %r1, %r2
1172 add<x>i\t%0, %r1, %2
1173 add<x>li\t%0, %r1, %H2"
1174 [(set_attr "type" "*,*,X01")])
1176 (define_insn "*addsi3_sext"
1177 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1179 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO")
1180 (match_operand:SI 2 "add_operand" "r,I,JT"))))]
1185 addxli\t%0, %r1, %H2"
1186 [(set_attr "type" "*,*,X01")])
1188 (define_insn "sub<mode>3"
1189 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1190 (minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1191 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
1193 "sub<x>\t%0, %r1, %r2")
1195 (define_insn "*subsi3_sext"
1196 [(set (match_operand:DI 0 "register_operand" "=r")
1198 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1199 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1201 "subx\t%0, %r1, %r2")
1203 (define_insn "neg<mode>2"
1204 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1205 (neg:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO")))]
1207 "sub<x>\t%0, zero, %r1")
1209 (define_insn "*negsi2_sext"
1210 [(set (match_operand:DI 0 "register_operand" "=r")
1212 (neg:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))))]
1214 "subx\t%0, zero, %r1")
1216 (define_insn "ssaddsi3"
1217 [(set (match_operand:SI 0 "register_operand" "=r")
1218 (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1219 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
1221 "addxsc\t%0, %r1, %r2"
1222 [(set_attr "type" "X01")])
1224 (define_insn "*ssaddsi3_sext"
1225 [(set (match_operand:DI 0 "register_operand" "=r")
1227 (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1228 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1230 "addxsc\t%0, %r1, %r2"
1231 [(set_attr "type" "X01")])
1233 (define_insn "sssubsi3"
1234 [(set (match_operand:SI 0 "register_operand" "=r")
1235 (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1236 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
1238 "subxsc\t%0, %r1, %r2"
1239 [(set_attr "type" "X01")])
1241 (define_insn "*sssubsi3_sext"
1242 [(set (match_operand:DI 0 "register_operand" "=r")
1244 (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1245 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1247 "subxsc\t%0, %r1, %r2"
1248 [(set_attr "type" "X01")])
1250 (define_expand "addsf3"
1251 [(set (match_operand:SF 0 "register_operand" "")
1252 (plus:SF (match_operand:SF 1 "register_operand" "")
1253 (match_operand:SF 2 "register_operand" "")))]
1256 rtx result = gen_lowpart (DImode, operands[0]);
1257 rtx a = gen_lowpart (DImode, operands[1]);
1258 rtx b = gen_lowpart (DImode, operands[2]);
1260 rtx tmp = gen_reg_rtx (DImode);
1261 rtx flags = gen_reg_rtx (DImode);
1263 emit_insn (gen_insn_fsingle_add1 (tmp, a, b));
1264 emit_insn (gen_insn_fsingle_addsub2 (tmp, tmp, a, b));
1265 emit_insn (gen_insn_fsingle_pack1 (flags, tmp));
1266 emit_insn (gen_insn_fsingle_pack2 (result, tmp, flags));
1271 (define_expand "subsf3"
1272 [(set (match_operand:SF 0 "register_operand" "")
1273 (minus:SF (match_operand:SF 1 "register_operand" "")
1274 (match_operand:SF 2 "register_operand" "")))]
1277 rtx result = gen_lowpart (DImode, operands[0]);
1278 rtx a = gen_lowpart (DImode, operands[1]);
1279 rtx b = gen_lowpart (DImode, operands[2]);
1281 rtx tmp = gen_reg_rtx (DImode);
1282 rtx flags = gen_reg_rtx (DImode);
1284 emit_insn (gen_insn_fsingle_sub1 (tmp, a, b));
1285 emit_insn (gen_insn_fsingle_addsub2 (tmp, tmp, a, b));
1286 emit_insn (gen_insn_fsingle_pack1 (flags, tmp));
1287 emit_insn (gen_insn_fsingle_pack2 (result, tmp, flags));
1292 (define_expand "mulsf3"
1293 [(set (match_operand:SF 0 "register_operand" "")
1294 (mult:SF (match_operand:SF 1 "register_operand" "")
1295 (match_operand:SF 2 "register_operand" "")))]
1298 rtx result = gen_lowpart (DImode, operands[0]);
1299 rtx a = gen_lowpart (DImode, operands[1]);
1300 rtx b = gen_lowpart (DImode, operands[2]);
1302 rtx tmp1 = gen_reg_rtx (DImode);
1303 rtx tmp2 = gen_reg_rtx (DImode);
1304 rtx flags = gen_reg_rtx (DImode);
1306 emit_insn (gen_insn_fsingle_mul1 (tmp1, a, b));
1307 emit_insn (gen_insn_fsingle_mul2 (tmp2, tmp1, b));
1308 emit_insn (gen_insn_fsingle_pack1 (flags, tmp2));
1309 emit_insn (gen_insn_fsingle_pack2 (result, tmp2, flags));
1314 (define_expand "adddf3"
1315 [(set (match_operand:DF 0 "register_operand" "")
1316 (plus:DF (match_operand:DF 1 "register_operand" "")
1317 (match_operand:DF 2 "register_operand" "")))]
1320 rtx result = gen_lowpart (DImode, operands[0]);
1321 rtx a = gen_lowpart (DImode, operands[1]);
1322 rtx b = gen_lowpart (DImode, operands[2]);
1324 rtx min = gen_reg_rtx (DImode);
1325 rtx max = gen_reg_rtx (DImode);
1326 rtx flags = gen_reg_rtx (DImode);
1328 emit_insn (gen_insn_fdouble_unpack_min (min, a, b));
1329 emit_insn (gen_insn_fdouble_unpack_max (max, a, b));
1330 emit_insn (gen_insn_fdouble_add_flags (flags, a, b));
1331 emit_insn (gen_insn_fdouble_addsub (max, max, min, flags));
1332 emit_insn (gen_insn_fdouble_pack1 (result, max, flags));
1333 emit_insn (gen_insn_fdouble_pack2 (result, result, max, const0_rtx));
1339 (define_expand "subdf3"
1340 [(set (match_operand:DF 0 "register_operand" "")
1341 (minus:DF (match_operand:DF 1 "register_operand" "")
1342 (match_operand:DF 2 "register_operand" "")))]
1345 rtx result = gen_lowpart (DImode, operands[0]);
1346 rtx a = gen_lowpart (DImode, operands[1]);
1347 rtx b = gen_lowpart (DImode, operands[2]);
1349 rtx min = gen_reg_rtx (DImode);
1350 rtx max = gen_reg_rtx (DImode);
1351 rtx flags = gen_reg_rtx (DImode);
1353 emit_insn (gen_insn_fdouble_unpack_min (min, a, b));
1354 emit_insn (gen_insn_fdouble_unpack_max (max, a, b));
1355 emit_insn (gen_insn_fdouble_sub_flags (flags, a, b));
1356 emit_insn (gen_insn_fdouble_addsub (max, max, min, flags));
1357 emit_insn (gen_insn_fdouble_pack1 (result, max, flags));
1358 emit_insn (gen_insn_fdouble_pack2 (result, result, max, const0_rtx));
1363 (define_expand "muldf3"
1364 [(set (match_operand:DF 0 "register_operand" "")
1365 (mult:DF (match_operand:DF 1 "register_operand" "")
1366 (match_operand:DF 2 "register_operand" "")))]
1368 ;; TODO: Decide if we should not inline this with -Os.
1369 ;; "optimize_function_for_speed_p (cfun)"
1371 rtx result = gen_lowpart (DImode, operands[0]);
1372 rtx a = gen_lowpart (DImode, operands[1]);
1373 rtx b = gen_lowpart (DImode, operands[2]);
1375 rtx a_unpacked = gen_reg_rtx (DImode);
1376 rtx b_unpacked = gen_reg_rtx (DImode);
1377 rtx flags = gen_reg_rtx (DImode);
1379 rtx low1 = gen_reg_rtx (DImode);
1380 rtx low = gen_reg_rtx (DImode);
1381 rtx low_carry = gen_reg_rtx (DImode);
1383 rtx mid = gen_reg_rtx (DImode);
1384 rtx mid_l32 = gen_reg_rtx (DImode);
1385 rtx mid_r32 = gen_reg_rtx (DImode);
1387 rtx high1 = gen_reg_rtx (DImode);
1388 rtx high = gen_reg_rtx (DImode);
1389 rtx high1_plus_mid_r32 = gen_reg_rtx (DImode);
1391 /* NOTE: We compute using max(a, 0) and max(b, 0) rather than
1392 min(a, b) and max(a, b) because for multiply we just need to unpack,
1393 we don't actually care which is min and which is max. And this
1394 formulation gives the scheduler more freedom in case one of a or b
1395 would stall at the start of this code sequence. */
1396 emit_insn (gen_insn_fdouble_unpack_max (a_unpacked, a, const0_rtx));
1397 emit_insn (gen_insn_fdouble_unpack_max (b_unpacked, b, const0_rtx));
1398 emit_insn (gen_insn_fdouble_mul_flags (flags, a, b));
1400 /* This depends on the fact that the high few bits of the unpacked
1401 mantissa are zero, so we can't have a carry out from the mid sum. */
1402 emit_insn (gen_insn_mul_lu_lu (low1, a_unpacked, b_unpacked));
1403 emit_insn (gen_insn_mul_hu_lu (mid, a_unpacked, b_unpacked));
1404 emit_insn (gen_insn_mula_hu_lu (mid, mid, b_unpacked, a_unpacked));
1405 emit_insn (gen_insn_mul_hu_hu (high1, a_unpacked, b_unpacked));
1407 emit_insn (gen_ashldi3 (mid_l32, mid, GEN_INT (32)));
1408 emit_insn (gen_lshrdi3 (mid_r32, mid, GEN_INT (32)));
1410 emit_insn (gen_adddi3 (high1_plus_mid_r32, high1, mid_r32));
1412 emit_insn (gen_adddi3 (low, low1, mid_l32));
1413 emit_insn (gen_insn_cmpltu_didi (low_carry, low, mid_l32));
1415 emit_insn (gen_adddi3 (high, high1_plus_mid_r32, low_carry));
1417 emit_insn (gen_insn_fdouble_pack1 (result, high, flags));
1418 emit_insn (gen_insn_fdouble_pack2 (result, result, high, low));
1428 (define_insn "ashl<mode>3"
1429 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1431 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1432 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1435 shl<x>i\t%0, %r1, %2
1436 shl<x>\t%0, %r1, %r2"
1437 [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1439 (define_insn "*ashlsi3_sext"
1440 [(set (match_operand:DI 0 "register_operand" "=r,r")
1443 (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1444 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1449 [(set_attr "type" "X01,X01")])
1451 (define_insn "ashr<mode>3"
1452 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1454 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1455 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1459 shrs\t%0, %r1, %r2")
1461 (define_insn "*ashrsi3_sext"
1462 [(set (match_operand:DI 0 "register_operand" "=r,r")
1464 (ashiftrt:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1465 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1469 shrs\t%0, %r1, %r2")
1471 (define_insn "lshr<mode>3"
1472 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1474 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1475 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1478 shru<x>i\t%0, %r1, %2
1479 shru<x>\t%0, %r1, %r2"
1480 [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1482 (define_insn "*lshrsi3_sext"
1483 [(set (match_operand:DI 0 "register_operand" "=r,r")
1486 (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1487 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1491 shrux\t%0, %r1, %r2"
1492 [(set_attr "type" "X01,X01")])
1494 (define_insn "rotldi3"
1495 [(set (match_operand:DI 0 "register_operand" "=r,r")
1496 (rotate:DI (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1497 (match_operand:SI 2 "reg_or_u6bit_operand" "I,rO")))]
1501 rotl\t%0, %r1, %r2")
1503 (define_insn "insn_shl16insli"
1504 [(set (match_operand:DI 0 "register_operand" "=r,r")
1507 (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1509 (match_operand:DI 2 "u16bit_or_const_symbolic_operand" "O,KT")))]
1513 shl16insli\t%0, %r1, %H2"
1514 [(set_attr "type" "*,X01")])
1516 (define_insn "insn_addr_shl16insli<bitsuffix>"
1517 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1519 [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1520 (match_operand:I48MODE 2 "const_symbolic_operand" "T")]
1521 UNSPEC_INSN_ADDR_SHL16INSLI))]
1523 "shl16insli\t%0, %r1, %H2"
1524 [(set_attr "type" "X01")])
1531 (define_expand "cstore<mode>4"
1532 [(set (match_operand:DI 0 "register_operand" "")
1533 (match_operator:DI 1 "ordered_comparison_operator"
1534 [(match_operand:FI48MODE 2 "reg_or_cint_operand" "")
1535 (match_operand:FI48MODE 3 "reg_or_cint_operand" "")]))]
1538 if (!tilegx_emit_setcc (operands, GET_MODE (operands[2])))
1545 (define_insn "insn_cmpne_<I48MODE:mode><I48MODE2:mode>"
1546 [(set (match_operand:I48MODE2 0 "register_operand" "=r")
1547 (ne:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1548 (match_operand:I48MODE 2 "reg_or_cint_operand" "rO")))]
1550 "cmpne\t%0, %r1, %r2")
1552 (define_insn "insn_cmpeq_<I48MODE:mode><I48MODE2:mode>"
1553 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1554 (eq:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO")
1555 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1559 cmpeq\t%0, %r1, %r2")
1561 (define_insn "insn_cmplts_<I48MODE:mode><I48MODE2:mode>"
1562 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1563 (lt:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1564 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1567 cmpltsi\t%0, %r1, %2
1568 cmplts\t%0, %r1, %r2")
1570 (define_insn "insn_cmpltu_<I48MODE:mode><I48MODE2:mode>"
1571 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1572 (ltu:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1573 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1576 cmpltui\t%0, %r1, %2
1577 cmpltu\t%0, %r1, %r2"
1578 [(set_attr "type" "X01,*")])
1580 (define_insn "insn_cmples_<I48MODE:mode><I48MODE2:mode>"
1581 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1582 (le:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1583 (match_operand:I48MODE 2 "reg_or_cint_operand" "L,rO")))]
1586 cmpltsi\t%0, %r1, %P2
1587 cmples\t%0, %r1, %r2")
1589 (define_insn "insn_cmpleu_<I48MODE:mode><I48MODE2:mode>"
1590 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1591 (leu:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1592 (match_operand:I48MODE 2 "reg_or_cint_operand" "Q,rO")))]
1595 cmpltui\t%0, %r1, %P2
1596 cmpleu\t%0, %r1, %r2"
1597 [(set_attr "type" "X01,*")])
1604 (define_insn "and<mode>3"
1605 [(set (match_operand:IVNMODE 0 "register_operand" "=r,r,r,r")
1606 (and:IVNMODE (match_operand:IVNMODE 1 "reg_or_0_operand" "%rO,rO,0,rO")
1607 (match_operand:IVNMODE 2 "and_operand" "I,S,M,rO")))]
1611 bfextu\t%0, %r1, %M2
1612 bfins\t%0, zero, %m2
1614 [(set_attr "type" "*,X0,X0,*")])
1616 (define_insn "*andsi3_sext"
1617 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
1619 (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,0,rO")
1620 (match_operand:SI 2 "and_operand" "I,S,M,rO"))))]
1624 bfextu\t%0, %r1, %M2
1625 bfins\t%0, zero, %m2
1627 [(set_attr "type" "*,X0,X0,*")])
1629 (define_insn "anddi3"
1630 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r")
1631 (and:DI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO,rO,0,rO")
1632 (match_operand:DI 2 "and_operand" "I,Z0,Z1,S,M,rO")))]
1636 v4int_l\t%0, zero, %r1
1637 v4int_h\t%0, %r1, zero
1638 bfextu\t%0, %r1, %M2
1639 bfins\t%0, zero, %m2
1641 [(set_attr "type" "*,X01,X01,X0,X0,*")])
1643 (define_insn "ior<mode>3"
1644 [(set (match_operand:IVMODE 0 "register_operand" "=r,r")
1645 (ior:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "%rO,rO")
1646 (match_operand:IVMODE 2 "reg_or_s8bit_operand" "rO,I")))]
1651 [(set_attr "type" "*,X01")])
1653 (define_insn "*iorsi3_sext"
1654 [(set (match_operand:DI 0 "register_operand" "=r,r")
1656 (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1657 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1662 [(set_attr "type" "*,X01")])
1664 (define_insn "xor<mode>3"
1665 [(set (match_operand:IVMODE 0 "register_operand" "=r,r")
1666 (xor:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "%rO,rO")
1667 (match_operand:IVMODE 2 "reg_or_s8bit_operand" "rO,I")))]
1672 [(set_attr "type" "*,X01")])
1674 (define_insn "*xorsi3_sext"
1675 [(set (match_operand:DI 0 "register_operand" "=r,r")
1677 (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1678 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1683 [(set_attr "type" "*,X01")])
1685 (define_insn "clzdi2"
1686 [(set (match_operand:DI 0 "register_operand" "=r")
1687 (clz:DI (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1690 [(set_attr "type" "Y0")])
1692 (define_expand "clzsi2"
1694 (ashift:DI (match_operand:SI 1 "reg_or_0_operand" "")
1696 (set (subreg:DI (match_operand:SI 0 "register_operand" "") 0)
1697 (clz:DI (match_dup 2)))]
1700 operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);
1701 operands[2] = gen_reg_rtx (DImode);
1704 (define_insn "ctz<mode>2"
1705 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1706 (ctz:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1709 [(set_attr "type" "Y0")])
1712 (define_insn "popcount<mode>2"
1713 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1714 (popcount:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1717 [(set_attr "type" "Y0")])
1719 (define_expand "parity<mode>2"
1720 [(set (match_operand:I48MODE 0 "register_operand" "")
1721 (parity:I48MODE (match_operand:DI 1 "reg_or_0_operand" "")))]
1724 rtx tmp = gen_reg_rtx (<MODE>mode);
1725 emit_insn (gen_popcount<mode>2 (tmp, operands[1]));
1726 emit_insn (gen_and<mode>3 (operands[0], tmp, const1_rtx));
1730 (define_insn "bswapdi2"
1731 [(set (match_operand:DI 0 "register_operand" "=r")
1732 (bswap:DI (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1735 [(set_attr "type" "Y0")])
1737 (define_expand "bswapsi2"
1738 [(set (match_operand:SI 0 "register_operand" "")
1739 (bswap:SI (match_operand:SI 1 "reg_or_0_operand" "")))]
1742 rtx tmp = gen_reg_rtx (DImode);
1743 emit_insn (gen_bswapdi2 (tmp, gen_lowpart (DImode, operands[1])));
1744 emit_insn (gen_ashrdi3 (gen_lowpart (DImode, operands[0]),
1745 tmp, GEN_INT (32)));
1749 (define_insn "one_cmpl<mode>2"
1750 [(set (match_operand:IVMODE 0 "register_operand" "=r")
1751 (not:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "rO")))]
1753 "nor\t%0, %r1, zero")
1757 ;; Conditional moves
1760 (define_expand "mov<mode>cc"
1761 [(set (match_operand:I48MODE 0 "register_operand" "")
1762 (if_then_else:I48MODE
1763 (match_operand 1 "comparison_operator" "")
1764 (match_operand:I48MODE 2 "reg_or_0_operand" "")
1765 (match_operand:I48MODE 3 "reg_or_0_operand" "")))]
1767 { operands[1] = tilegx_emit_conditional_move (operands[1]); })
1769 (define_insn "movcc_insn_<I48MODE2:mode><I48MODE:mode>"
1770 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r,r")
1771 (if_then_else:I48MODE
1772 (match_operator 4 "eqne_operator"
1773 [(match_operand:I48MODE2 1 "reg_or_0_operand" "rO,rO,rO,rO")
1775 (match_operand:I48MODE 2 "reg_or_0_operand" "rO,O,rO,0")
1776 (match_operand:I48MODE 3 "reg_or_0_operand" "O,rO,0,rO")))]
1781 cmov%d4z\t%0, %r1, %r2
1782 cmov%D4z\t%0, %r1, %r3"
1783 [(set_attr "type" "*,*,Y0,Y0")])
1785 (define_expand "insn_mz"
1786 [(set (match_operand:DI 0 "register_operand" "")
1788 (eq (match_operand:DI 1 "reg_or_0_operand" "")
1790 (match_operand:DI 2 "reg_or_0_operand" "")
1793 (define_expand "insn_mnz"
1794 [(set (match_operand:DI 0 "register_operand" "")
1796 (ne (match_operand:DI 1 "reg_or_0_operand" "")
1798 (match_operand:DI 2 "reg_or_0_operand" "")
1801 (define_expand "insn_cmoveqz"
1802 [(set (match_operand:DI 0 "register_operand" "")
1804 (eq (match_operand:DI 2 "reg_or_0_operand" "")
1806 (match_operand:DI 3 "reg_or_0_operand" "")
1807 (match_operand:DI 1 "reg_or_0_operand" "")))])
1809 (define_expand "insn_cmovnez"
1810 [(set (match_operand:DI 0 "register_operand" "")
1812 (ne (match_operand:DI 2 "reg_or_0_operand" "")
1814 (match_operand:DI 3 "reg_or_0_operand" "")
1815 (match_operand:DI 1 "reg_or_0_operand" "")))])
1822 (define_insn "zero_extendqi<mode>2"
1823 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1824 (zero_extend:I48MODE (match_operand:QI 1 "move_operand" "rO,U,m")))]
1827 bfextu\t%0, %r1, 0, 7
1829 ld1u_add\t%0, %I1, %i1"
1830 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1832 (define_insn "zero_extendhi<mode>2"
1833 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1834 (zero_extend:I48MODE (match_operand:HI 1 "move_operand" "rO,U,m")))]
1837 bfextu\t%0, %r1, 0, 15
1839 ld2u_add\t%0, %I1, %i1"
1840 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1842 (define_insn "zero_extendsidi2"
1843 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1844 (zero_extend:DI (match_operand:SI 1 "move_operand" "rO,U,m")))]
1847 v4int_l\t%0, zero, %r1
1849 ld4u_add\t%0, %I1, %i1"
1850 [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
1852 (define_insn "extendqi<mode>2"
1853 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1854 (sign_extend:I48MODE (match_operand:QI 1 "move_operand" "rO,U,m")))]
1857 bfexts\t%0, %r1, 0, 7
1859 ld1s_add\t%0, %I1, %i1"
1860 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1862 (define_insn "extendhi<mode>2"
1863 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1864 (sign_extend:I48MODE (match_operand:HI 1 "move_operand" "rO,U,m")))]
1867 bfexts\t%0, %r1, 0, 15
1869 ld2s_add\t%0, %I1, %i1"
1870 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1872 ;; All SImode integer registers should already be in sign-extended
1873 ;; form (see TRULY_NOOP_TRUNCATION and truncdisi2). We can therefore
1874 ;; get rid of register->register instructions if we constrain the
1875 ;; source to be in the same register as the destination.
1876 (define_insn_and_split "extendsidi2"
1877 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1878 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "0,U,m")))]
1883 ld4s_add\t%0, %I1, %i1"
1884 "&& reload_completed && register_operand (operands[1], VOIDmode)"
1887 emit_note (NOTE_INSN_DELETED);
1890 [(set_attr "type" "*,Y2_2cycle,X1_2cycle")])
1892 ;; Integer truncation patterns. Truncating SImode values to smaller
1893 ;; modes is a no-op, as it is for most other GCC ports. Truncating
1894 ;; DImode values to SImode is not a no-op since we
1895 ;; need to make sure that the lower 32 bits are properly sign-extended
1896 ;; (see TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
1897 ;; smaller than SImode is equivalent to two separate truncations:
1900 ;; DI ---> HI == DI ---> SI ---> HI
1901 ;; DI ---> QI == DI ---> SI ---> QI
1903 ;; Step A needs a real instruction but step B does not.
1905 (define_insn "truncdisi2"
1906 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,U,m")
1907 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1912 st4_add\t%I0, %r1, %i0"
1913 [(set_attr "type" "Y01,Y2,X1")])
1915 (define_insn "truncdihi2"
1916 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,U,m")
1917 (truncate:HI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1922 st2_add\t%I0, %r1, %i0"
1923 [(set_attr "type" "Y01,Y2,X1")])
1925 (define_insn "truncdiqi2"
1926 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,U,m")
1927 (truncate:QI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1932 st1_add\t%I0, %r1, %i0"
1933 [(set_attr "type" "Y01,Y2,X1")])
1935 ;; Combiner patterns to optimize away unnecessary truncates.
1937 (define_insn "*zero_extendsidi_truncdisi"
1938 [(set (match_operand:DI 0 "register_operand" "=r")
1940 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "0"))))]
1942 "v4int_l\t%0, zero, %r1"
1943 [(set_attr "type" "X01")])
1945 (define_insn "*addsi_truncdisi"
1946 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1948 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO"))
1949 (match_operand:SI 2 "add_operand" "r,I,JT")))]
1954 addxli\t%0, %r1, %H2"
1955 [(set_attr "type" "*,*,X01")])
1957 (define_insn "*addsi_truncdisi2"
1958 [(set (match_operand:SI 0 "register_operand" "=r")
1960 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1961 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1963 "addx\t%0, %r1, %r2")
1965 (define_insn "*ashldi_truncdisi"
1966 [(set (match_operand:DI 0 "register_operand" "=r")
1968 (match_operand:DI 1 "reg_or_0_operand" "rO")
1969 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1971 "shl\t%0, %r1, %r2")
1973 (define_insn "*ashlsi_truncdisi"
1974 [(set (match_operand:SI 0 "register_operand" "=r,r")
1976 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
1977 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
1982 [(set_attr "type" "X01,X01")])
1984 (define_insn "*ashlsi_truncdisi2"
1985 [(set (match_operand:SI 0 "register_operand" "=r")
1987 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1988 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1990 "shlx\t%0, %r1, %r2"
1991 [(set_attr "type" "X01")])
1993 (define_insn "*ashrdi3_truncdisi"
1994 [(set (match_operand:DI 0 "register_operand" "=r")
1996 (match_operand:DI 1 "reg_or_0_operand" "rO")
1997 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1999 "shrs\t%0, %r1, %r2")
2001 (define_insn "*lshrsi_truncdisi"
2002 [(set (match_operand:SI 0 "register_operand" "=r,r")
2004 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
2005 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
2009 shrux\t%0, %r1, %r2"
2010 [(set_attr "type" "X01,X01")])
2012 (define_insn "*lshrsi_truncdisi2"
2013 [(set (match_operand:SI 0 "register_operand" "=r")
2015 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
2016 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
2018 "shrux\t%0, %r1, %r2"
2019 [(set_attr "type" "X01")])
2021 (define_insn "*lshrdi_truncdisi"
2022 [(set (match_operand:DI 0 "register_operand" "=r")
2024 (match_operand:DI 1 "reg_or_0_operand" "rO")
2025 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2027 "shru\t%0, %r1, %r2")
2029 (define_insn "*rotldi_truncdisi"
2030 [(set (match_operand:DI 0 "register_operand" "=r")
2032 (match_operand:DI 1 "reg_or_0_operand" "rO")
2033 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2035 "rotl\t%0, %r1, %r2")
2042 (define_insn "mulsi3"
2043 [(set (match_operand:SI 0 "register_operand" "=r")
2044 (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rO")
2045 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
2047 "mulx\t%0, %r1, %r2"
2048 [(set_attr "type" "Y0_2cycle")])
2050 (define_insn "mulsidi3"
2051 [(set (match_operand:DI 0 "register_operand" "=r")
2052 (mult:DI (sign_extend:DI
2053 (match_operand:SI 1 "reg_or_0_operand" "%rO"))
2055 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2057 "mul_ls_ls\t%0, %r1, %r2"
2058 [(set_attr "type" "Y0_2cycle")])
2060 (define_insn "umulsidi3"
2061 [(set (match_operand:DI 0 "register_operand" "=r")
2062 (mult:DI (zero_extend:DI
2063 (match_operand:SI 1 "reg_or_0_operand" "%rO"))
2065 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2067 "mul_lu_lu\t%0, %r1, %r2"
2068 [(set_attr "type" "Y0_2cycle")])
2070 (define_expand "muldi3"
2071 [(set (match_operand:DI 0 "register_operand" "")
2072 (unspec:DI [(match_operand:DI 1 "nonmemory_operand" "")
2073 (match_operand:DI 2 "nonmemory_operand" "")]
2074 UNSPEC_INSN_MUL_HU_LU))
2076 (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2077 UNSPEC_INSN_MULA_HU_LU))
2079 (ashift:DI (match_dup 0) (const_int 32)))
2081 (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2082 UNSPEC_INSN_MULA_LU_LU))]
2085 operands[1] = force_reg (DImode, operands[1]);
2086 operands[1] = make_safe_from (operands[1], operands[0]);
2088 if (tilegx_expand_muldi (operands[0], operands[1], operands[2]))
2092 operands[2] = force_reg (DImode, operands[2]);
2093 operands[2] = make_safe_from (operands[2], operands[0]);
2097 (define_insn "usmulsidi3"
2098 [(set (match_operand:DI 0 "register_operand" "=r")
2099 (mult:DI (zero_extend:DI
2100 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2102 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2104 "mul_ls_lu\t%0, %r2, %r1"
2105 [(set_attr "type" "X0_2cycle")])
2107 (define_insn "maddsidi4"
2108 [(set (match_operand:DI 0 "register_operand" "=r")
2110 (mult:DI (sign_extend:DI
2111 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2113 (match_operand:SI 2 "reg_or_0_operand" "rO")))
2114 (match_operand:DI 3 "register_operand" "0")))]
2116 "mula_ls_ls\t%0, %r1, %r2"
2117 [(set_attr "type" "Y0_2cycle")])
2119 (define_insn "umaddsidi4"
2120 [(set (match_operand:DI 0 "register_operand" "=r")
2122 (mult:DI (zero_extend:DI
2123 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2125 (match_operand:SI 2 "reg_or_0_operand" "rO")))
2126 (match_operand:DI 3 "register_operand" "0")))]
2128 "mula_lu_lu\t%0, %r1, %r2"
2129 [(set_attr "type" "Y0_2cycle")])
2131 (define_expand "smulsi3_highpart"
2133 (mult:DI (sign_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
2134 (sign_extend:DI (match_operand:SI 2 "reg_or_0_operand" ""))))
2136 (ashiftrt:DI (match_dup 3) (const_int 32)))
2137 (set (match_operand:SI 0 "register_operand" "")
2138 (truncate:SI (match_dup 4)))]
2141 operands[3] = gen_reg_rtx (DImode);
2142 operands[4] = gen_reg_rtx (DImode);
2145 (define_expand "umulsi3_highpart"
2147 (mult:DI (zero_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
2148 (zero_extend:DI (match_operand:SI 2 "reg_or_0_operand" ""))))
2150 (lshiftrt:DI (match_dup 3) (const_int 32)))
2151 (set (match_operand:SI 0 "register_operand" "")
2152 (truncate:SI (match_dup 4)))]
2155 operands[3] = gen_reg_rtx (DImode);
2156 operands[4] = gen_reg_rtx (DImode);
2159 (define_expand "smuldi3_highpart"
2160 [(set (match_operand:DI 0 "register_operand" "")
2163 (mult:TI (sign_extend:TI (match_operand:DI 1 "reg_or_0_operand" ""))
2164 (sign_extend:TI (match_operand:DI 2 "reg_or_0_operand" "")))
2168 tilegx_expand_smuldi3_highpart (operands[0], operands[1], operands[2]);
2172 (define_expand "umuldi3_highpart"
2173 [(set (match_operand:DI 0 "register_operand" "")
2176 (mult:TI (zero_extend:TI (match_operand:DI 1 "reg_or_0_operand" ""))
2177 (zero_extend:TI (match_operand:DI 2 "reg_or_0_operand" "")))
2181 tilegx_expand_umuldi3_highpart (operands[0], operands[1], operands[2]);
2187 ;; Divide stubs. These exist to work around a bug in expmed.c, which
2188 ;; will not attempt to convert a divide by constant into a multiply
2189 ;; unless there is a pattern for a divide of the same mode. The end
2190 ;; result is a 32-bit divide turns into 64-bit multiply.
2193 (define_expand "divsi3"
2194 [(set (match_operand:SI 0 "register_operand" "")
2195 (div:SI (match_operand:SI 1 "reg_or_0_operand" "")
2196 (match_operand:SI 2 "reg_or_0_operand" "")))]
2202 (define_expand "udivsi3"
2203 [(set (match_operand:SI 0 "register_operand" "")
2204 (udiv:SI (match_operand:SI 1 "reg_or_0_operand" "")
2205 (match_operand:SI 2 "reg_or_0_operand" "")))]
2216 ;; Define the subtract-one-and-jump insns so loop.c knows what to generate.
2217 (define_expand "doloop_end"
2218 [(use (match_operand 0 "" "")) ;; loop pseudo
2219 (use (match_operand 1 "" "")) ;; iterations; zero if unknown
2220 (use (match_operand 2 "" "")) ;; max iterations
2221 (use (match_operand 3 "" "")) ;; loop level
2222 (use (match_operand 4 "" ""))] ;; label
2225 if (optimize > 0 && flag_modulo_sched)
2230 enum machine_mode mode = GET_MODE (operands[0]);
2232 /* only do inner loop */
2233 if (INTVAL (operands[3]) > 1)
2235 /* only deal with loop counters in SImode or DImode */
2236 if (mode != SImode && mode != DImode)
2240 emit_move_insn (s0, gen_rtx_PLUS (mode, s0, GEN_INT (-1)));
2241 bcomp = gen_rtx_NE(mode, s0, const0_rtx);
2242 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [4]);
2243 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
2244 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
2254 ;; Prologue/epilogue
2256 (define_expand "prologue"
2260 tilegx_expand_prologue ();
2264 (define_expand "epilogue"
2268 tilegx_expand_epilogue (false);
2272 (define_expand "sibcall_epilogue"
2276 tilegx_expand_epilogue (true);
2281 ;; Stack manipulations
2284 ;; An insn to allocate new stack space for dynamic use (e.g., alloca).
2285 (define_expand "allocate_stack"
2286 [(set (match_operand 0 "register_operand" "")
2287 (minus (reg 54) (match_operand 1 "nonmemory_operand" "")))
2289 (minus (reg 54) (match_dup 1)))]
2291 "tilegx_allocate_stack (operands[0], operands[1]); DONE;")
2297 (define_expand "call"
2298 [(parallel [(call (match_operand:DI 0 "call_operand" "")
2299 (match_operand 1 "" ""))
2301 (clobber (reg:DI 55))])]
2305 (define_insn "*call_insn"
2306 [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2307 (match_operand 1 "" ""))
2309 (clobber (reg:DI 55))]
2314 [(set_attr "type" "Y1,X1")])
2316 (define_expand "call_value"
2317 [(parallel [(set (match_operand 0 "register_operand" "")
2318 (call (match_operand:DI 1 "call_operand" "")
2319 (match_operand 2 "" "")))
2321 (clobber (reg:DI 55))])]
2324 (define_insn "*call_value_insn"
2325 [(set (match_operand 0 "register_operand" "=r,r")
2326 (call (mem:DI (match_operand:I48MODE 1 "call_address_operand" "rO,i"))
2327 (match_operand 2 "" "")))
2329 (clobber (reg:DI 55))]
2334 [(set_attr "type" "Y1,X1")])
2336 (define_expand "sibcall"
2337 [(parallel [(call (match_operand:DI 0 "call_operand" "")
2338 (match_operand 1 "" ""))
2339 (use (reg:DI 54))])]
2343 (define_insn "*sibcall_insn"
2344 [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2345 (match_operand 1 "" ""))
2347 "SIBLING_CALL_P(insn)"
2351 [(set_attr "type" "X1,X1")])
2353 (define_expand "sibcall_value"
2354 [(parallel [(set (match_operand 0 "" "")
2355 (call (match_operand:DI 1 "call_operand" "")
2356 (match_operand 2 "" "")))
2357 (use (reg:DI 54))])]
2361 (define_insn "*sibcall_value"
2362 [(set (match_operand 0 "" "")
2363 (call (mem:DI (match_operand:I48MODE 1 "call_address_operand" "rO,i"))
2364 (match_operand 2 "" "")))
2366 "SIBLING_CALL_P(insn)"
2370 [(set_attr "type" "X1,X1")])
2373 [(set (pc) (label_ref (match_operand 0 "" "")))]
2376 [(set_attr "type" "X1")])
2378 (define_insn "indirect_jump"
2379 [(set (pc) (match_operand 0 "pointer_operand" "rO"))]
2382 [(set_attr "type" "Y1")])
2384 (define_expand "return"
2387 (use (reg:DI 55))])]
2388 "tilegx_can_use_return_insn_p ()"
2391 (define_insn "_return"
2396 [(set_attr "type" "Y1")])
2398 (define_expand "tablejump"
2399 [(set (pc) (match_operand 0 "pointer_operand" ""))
2400 (use (label_ref (match_operand 1 "" "")))]
2403 tilegx_expand_tablejump (operands[0], operands[1]);
2407 (define_insn "tablejump_aux"
2408 [(set (pc) (match_operand 0 "pointer_operand" "rO"))
2409 (use (label_ref (match_operand 1 "" "")))]
2412 [(set_attr "type" "Y1")])
2414 ;; Call subroutine returning any type.
2415 (define_expand "untyped_call"
2416 [(parallel [(call (match_operand 0 "" "")
2418 (match_operand 1 "" "")
2419 (match_operand 2 "" "")])]
2424 emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
2426 for (i = 0; i < XVECLEN (operands[2], 0); i++)
2428 rtx set = XVECEXP (operands[2], 0, i);
2429 emit_move_insn (SET_DEST (set), SET_SRC (set));
2432 /* The optimizer does not know that the call sets the function value
2433 registers we stored in the result block. We avoid problems by
2434 claiming that all hard registers are used and clobbered at this
2436 emit_insn (gen_blockage ());
2441 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers
2442 ;; and all of memory. This blocks insns from being moved across this
2444 (define_insn "blockage"
2445 [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
2448 [(set_attr "type" "nothing")
2449 (set_attr "length" "0")])
2451 ;; Internal expanders to prevent memory ops from moving around frame
2452 ;; allocation/deallocation.
2454 ;; TODO: really this clobber should just clobber the frame memory. Is
2455 ;; this possibly by clobbering memory @ the sp reg (as alpha does?)
2456 ;; or by explicitly setting the alias set to the frame?
2457 (define_insn "sp_adjust"
2458 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
2460 (match_operand:DI 1 "register_operand" "%r,r,r")
2461 (match_operand:DI 2 "add_operand" "r,I,JT")))
2462 (clobber (mem:BLK (scratch)))]
2468 [(set_attr "type" "*,*,X01")])
2470 (define_insn "sp_adjust_32bit"
2471 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
2473 (match_operand:SI 1 "register_operand" "%r,r,r")
2474 (match_operand:SI 2 "add_operand" "r,I,JT")))
2475 (clobber (mem:BLK (scratch)))]
2480 addxli\t%0, %1, %H2"
2481 [(set_attr "type" "*,*,X01")])
2483 ;; Used for move sp, r52, to pop a stack frame. We need to make sure
2484 ;; that stack frame memory operations have been issued before we do this.
2485 ;; TODO: see above TODO.
2486 (define_insn "sp_restore<bitsuffix>"
2487 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2488 (match_operand:I48MODE 1 "register_operand" "r"))
2489 (clobber (mem:BLK (scratch)))]
2497 [(set_attr "type" "Y01")])
2501 ;; Conditional branches
2504 (define_expand "cbranch<mode>4"
2506 (if_then_else (match_operator 0 "ordered_comparison_operator"
2507 [(match_operand:FI48MODE 1 "reg_or_cint_operand")
2508 (match_operand:FI48MODE 2 "reg_or_cint_operand")])
2509 (label_ref (match_operand 3 ""))
2513 tilegx_emit_conditional_branch (operands, GET_MODE (operands[1]));
2517 (define_insn "*bcc_normal<mode>"
2520 (match_operator 1 "signed_comparison_operator"
2521 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2523 (label_ref (match_operand 0 "" ""))
2526 { return tilegx_output_cbranch (insn, operands, false); }
2527 [(set_attr "type" "X1_branch")])
2529 (define_insn "*bcc_reverse<mode>"
2532 (match_operator 1 "signed_comparison_operator"
2533 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2536 (label_ref (match_operand 0 "" ""))))]
2538 { return tilegx_output_cbranch (insn, operands, true); }
2539 [(set_attr "type" "X1_branch")])
2541 (define_insn "*blbs_normal<mode>"
2544 (ne (zero_extract:I48MODE
2545 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2549 (label_ref (match_operand 0 "" ""))
2552 { return tilegx_output_cbranch_with_opcode (insn, operands, "blbs", "blbc",
2554 [(set_attr "type" "X1_branch")])
2556 (define_insn "*blbc_normal<mode>"
2559 (eq (zero_extract:I48MODE
2560 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2564 (label_ref (match_operand 0 "" ""))
2567 { return tilegx_output_cbranch_with_opcode (insn, operands, "blbc", "blbs",
2569 [(set_attr "type" "X1_branch")])
2571 ;; Note that __insn_mf() expands to this.
2572 (define_expand "memory_barrier"
2574 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2577 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
2578 MEM_VOLATILE_P (operands[0]) = 1;
2581 (define_insn "*memory_barrier"
2582 [(set (match_operand:BLK 0 "" "")
2583 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2586 [(set_attr "type" "X1")])
2588 (define_insn "prefetch"
2589 [(prefetch (match_operand 0 "address_operand" "rO")
2590 (match_operand 1 "const_int_operand" "")
2591 (match_operand 2 "const_int_operand" ""))]
2594 switch (INTVAL (operands[2]))
2597 case 1: return "prefetch_l3\t%r0";
2598 case 2: return "prefetch_l2\t%r0";
2599 case 3: return "prefetch_l1\t%r0";
2600 default: gcc_unreachable ();
2603 [(set_attr "type" "Y2")])
2607 ;; "__insn" Intrinsics (some expand directly to normal patterns above).
2610 (define_insn "insn_bfexts"
2611 [(set (match_operand:DI 0 "register_operand" "=r")
2612 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2613 (match_operand:DI 2 "u6bit_cint_operand" "n")
2614 (match_operand:DI 3 "u6bit_cint_operand" "n")]
2615 UNSPEC_INSN_BFEXTS))]
2617 "bfexts\t%0, %r1, %2, %3"
2618 [(set_attr "type" "X0")])
2620 (define_insn "insn_bfextu"
2621 [(set (match_operand:DI 0 "register_operand" "=r")
2622 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2623 (match_operand:DI 2 "u6bit_cint_operand" "n")
2624 (match_operand:DI 3 "u6bit_cint_operand" "n")]
2625 UNSPEC_INSN_BFEXTU))]
2627 "bfextu\t%0, %r1, %2, %3"
2628 [(set_attr "type" "X0")])
2630 (define_insn "*bfins"
2631 [(set (match_operand:DI 0 "register_operand" "=r")
2632 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2633 (match_operand:DI 2 "reg_or_0_operand" "rO")
2634 (match_operand:DI 3 "u6bit_cint_operand" "n")
2635 (match_operand:DI 4 "u6bit_cint_operand" "n")]
2636 UNSPEC_INSN_BFINS))]
2638 "bfins\t%0, %r2, %3, %4"
2639 [(set_attr "type" "X0")])
2641 (define_expand "insn_bfins"
2642 [(set (match_operand:DI 0 "register_operand" "")
2643 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "")
2644 (match_operand:DI 2 "reg_or_0_operand" "")
2645 (match_operand:DI 3 "u6bit_cint_operand" "")
2646 (match_operand:DI 4 "u6bit_cint_operand" "")]
2647 UNSPEC_INSN_BFINS))]
2648 "INTVAL (operands[3]) != 64"
2650 HOST_WIDE_INT first = INTVAL (operands[3]);
2651 HOST_WIDE_INT last = INTVAL (operands[4]);
2655 /* This is not a wacky wraparound case, so we can express this
2656 as a standard insv. */
2657 if (operands[0] != operands[1])
2659 operands[2] = make_safe_from (operands[2], operands[0]);
2660 emit_move_insn (operands[0], operands[1]);
2663 emit_insn (gen_insv (operands[0],
2664 GEN_INT (last - first + 1), operands[3],
2671 (define_insn "insn_cmpexch<four_if_si>"
2672 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2673 (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))
2674 (set (mem:I48MODE (match_dup 1))
2675 (unspec_volatile:I48MODE
2676 [(mem:I48MODE (match_dup 1))
2677 (reg:I48MODE TILEGX_CMPEXCH_REG)
2678 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")]
2679 UNSPEC_INSN_CMPEXCH))]
2681 "cmpexch<four_if_si>\t%0, %r1, %r2"
2682 [(set_attr "type" "X1_L2")])
2684 (define_insn "insn_cmul"
2685 [(set (match_operand:DI 0 "register_operand" "=r")
2686 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2687 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2690 "cmul\t%0, %r1, %r2"
2691 [(set_attr "type" "X0_2cycle")])
2693 (define_insn "insn_cmula"
2694 [(set (match_operand:DI 0 "register_operand" "=r")
2695 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2696 (match_operand:DI 2 "reg_or_0_operand" "rO")
2697 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2698 UNSPEC_INSN_CMULA))]
2700 "cmula\t%0, %r2, %r3"
2701 [(set_attr "type" "X0_2cycle")])
2703 (define_insn "insn_cmulaf"
2704 [(set (match_operand:DI 0 "register_operand" "=r")
2705 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2706 (match_operand:DI 2 "reg_or_0_operand" "rO")
2707 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2708 UNSPEC_INSN_CMULAF))]
2710 "cmulaf\t%0, %r2, %r3"
2711 [(set_attr "type" "X0_2cycle")])
2713 (define_insn "insn_cmulf"
2714 [(set (match_operand:DI 0 "register_operand" "=r")
2715 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2716 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2717 UNSPEC_INSN_CMULF))]
2719 "cmulf\t%0, %r1, %r2"
2720 [(set_attr "type" "X0_2cycle")])
2722 (define_insn "insn_cmulfr"
2723 [(set (match_operand:DI 0 "register_operand" "=r")
2724 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2725 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2726 UNSPEC_INSN_CMULFR))]
2728 "cmulfr\t%0, %r1, %r2"
2729 [(set_attr "type" "X0_2cycle")])
2731 (define_insn "insn_cmulh"
2732 [(set (match_operand:DI 0 "register_operand" "=r")
2733 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2734 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2735 UNSPEC_INSN_CMULH))]
2737 "cmulh\t%0, %r1, %r2"
2738 [(set_attr "type" "X0_2cycle")])
2740 (define_insn "insn_cmulhr"
2741 [(set (match_operand:DI 0 "register_operand" "=r")
2742 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2743 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2744 UNSPEC_INSN_CMULHR))]
2746 "cmulhr\t%0, %r1, %r2"
2747 [(set_attr "type" "X0_2cycle")])
2749 (define_insn "insn_crc32_32"
2750 [(set (match_operand:DI 0 "register_operand" "=r")
2751 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2752 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2753 UNSPEC_INSN_CRC32_32))]
2755 "crc32_32\t%0, %r1, %r2"
2756 [(set_attr "type" "X0")])
2758 (define_insn "insn_crc32_8"
2759 [(set (match_operand:DI 0 "register_operand" "=r")
2760 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2761 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2762 UNSPEC_INSN_CRC32_8))]
2764 "crc32_8\t%0, %r1, %r2"
2765 [(set_attr "type" "X0")])
2767 (define_insn "insn_dblalign"
2768 [(set (match_operand:DI 0 "register_operand" "=r")
2769 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2770 (match_operand:DI 2 "reg_or_0_operand" "rO")
2771 (match_operand 3 "pointer_operand" "rO")]
2772 UNSPEC_INSN_DBLALIGN))]
2774 "dblalign\t%0, %r2, %r3"
2775 [(set_attr "type" "X0")])
2777 (define_insn "insn_dblalign2"
2778 [(set (match_operand:DI 0 "register_operand" "=r")
2779 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2780 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2781 UNSPEC_INSN_DBLALIGN2))]
2783 "dblalign2\t%0, %r1, %r2"
2784 [(set_attr "type" "X01")])
2786 (define_insn "insn_dblalign4"
2787 [(set (match_operand:DI 0 "register_operand" "=r")
2788 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2789 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2790 UNSPEC_INSN_DBLALIGN4))]
2792 "dblalign4\t%0, %r1, %r2"
2793 [(set_attr "type" "X01")])
2795 (define_insn "insn_dblalign6"
2796 [(set (match_operand:DI 0 "register_operand" "=r")
2797 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2798 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2799 UNSPEC_INSN_DBLALIGN6))]
2801 "dblalign6\t%0, %r1, %r2"
2802 [(set_attr "type" "X01")])
2804 (define_insn "insn_dtlbpr"
2805 [(unspec_volatile:VOID [(match_operand:DI 0 "reg_or_0_operand" "rO")]
2806 UNSPEC_INSN_DTLBPR)]
2809 [(set_attr "type" "X1")])
2811 (define_insn "insn_exch<four_if_si>"
2812 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2813 (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))
2814 (set (mem:I48MODE (match_dup 1))
2815 (unspec_volatile:I48MODE
2816 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")]
2819 "exch<four_if_si>\t%0, %r1, %r2"
2820 [(set_attr "type" "X1_2cycle")])
2822 (define_insn "insn_fdouble_add_flags"
2823 [(set (match_operand:DI 0 "register_operand" "=r")
2824 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2825 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2826 UNSPEC_INSN_FDOUBLE_ADD_FLAGS))]
2828 "fdouble_add_flags\t%0, %r1, %r2"
2829 [(set_attr "type" "X0_2cycle")])
2831 (define_insn "insn_fdouble_addsub"
2832 [(set (match_operand:DI 0 "register_operand" "=r")
2833 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2834 (match_operand:DI 2 "reg_or_0_operand" "rO")
2835 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2836 UNSPEC_INSN_FDOUBLE_ADDSUB))]
2838 "fdouble_addsub\t%0, %r2, %r3"
2839 [(set_attr "type" "X0_2cycle")])
2841 (define_insn "insn_fdouble_mul_flags"
2842 [(set (match_operand:DI 0 "register_operand" "=r")
2843 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2844 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2845 UNSPEC_INSN_FDOUBLE_MUL_FLAGS))]
2847 "fdouble_mul_flags\t%0, %r1, %r2"
2848 [(set_attr "type" "X0_2cycle")])
2850 (define_insn "insn_fdouble_pack1"
2851 [(set (match_operand:DI 0 "register_operand" "=r")
2852 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2853 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2854 UNSPEC_INSN_FDOUBLE_PACK1))]
2856 "fdouble_pack1\t%0, %r1, %r2"
2857 [(set_attr "type" "X0_2cycle")])
2859 (define_insn "insn_fdouble_pack2"
2860 [(set (match_operand:DI 0 "register_operand" "=r")
2861 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2862 (match_operand:DI 2 "reg_or_0_operand" "rO")
2863 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2864 UNSPEC_INSN_FDOUBLE_PACK2))]
2866 "fdouble_pack2\t%0, %r2, %r3"
2867 [(set_attr "type" "X0_2cycle")])
2869 (define_insn "insn_fdouble_sub_flags"
2870 [(set (match_operand:DI 0 "register_operand" "=r")
2871 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2872 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2873 UNSPEC_INSN_FDOUBLE_SUB_FLAGS))]
2875 "fdouble_sub_flags\t%0, %r1, %r2"
2876 [(set_attr "type" "X0_2cycle")])
2878 (define_insn "insn_fdouble_unpack_max"
2879 [(set (match_operand:DI 0 "register_operand" "=r")
2880 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2881 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2882 UNSPEC_INSN_FDOUBLE_UNPACK_MAX))]
2884 "fdouble_unpack_max\t%0, %r1, %r2"
2885 [(set_attr "type" "X0_2cycle")])
2887 (define_insn "insn_fdouble_unpack_min"
2888 [(set (match_operand:DI 0 "register_operand" "=r")
2889 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2890 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2891 UNSPEC_INSN_FDOUBLE_UNPACK_MIN))]
2893 "fdouble_unpack_min\t%0, %r1, %r2"
2894 [(set_attr "type" "X0_2cycle")])
2896 (define_insn "insn_fetchadd<four_if_si>"
2897 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2898 (unspec_volatile:I48MODE
2899 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2901 (set (mem:I48MODE (match_dup 1))
2902 (plus:I48MODE (mem:I48MODE (match_dup 1))
2903 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2905 "fetchadd<four_if_si>\t%0, %r1, %r2"
2906 [(set_attr "type" "X1_2cycle")])
2908 (define_insn "insn_fetchaddgez<four_if_si>"
2909 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2910 (unspec_volatile:I48MODE
2911 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2913 (set (mem:I48MODE (match_dup 1))
2914 (unspec:I48MODE [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2915 (mem:I48MODE (match_dup 1))]
2916 UNSPEC_INSN_FETCHADDGEZ))]
2918 "fetchaddgez<four_if_si>\t%0, %r1, %r2"
2919 [(set_attr "type" "X1_2cycle")])
2921 (define_insn "insn_fetchand<four_if_si>"
2922 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2923 (unspec_volatile:I48MODE
2924 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2926 (set (mem:I48MODE (match_dup 1))
2927 (and:I48MODE (mem:I48MODE (match_dup 1))
2928 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2930 "fetchand<four_if_si>\t%0, %r1, %r2"
2931 [(set_attr "type" "X1_2cycle")])
2933 (define_insn "insn_fetchor<four_if_si>"
2934 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2935 (unspec_volatile:I48MODE
2936 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2938 (set (mem:I48MODE (match_dup 1))
2939 (ior:I48MODE (mem:I48MODE (match_dup 1))
2940 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2942 "fetchor<four_if_si>\t%0, %r1, %r2"
2943 [(set_attr "type" "X1_2cycle")])
2945 (define_insn "insn_finv"
2946 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2950 [(set_attr "type" "X1")])
2952 (define_insn "insn_flush"
2953 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2957 [(set_attr "type" "X1")])
2959 (define_insn "insn_flushwb"
2960 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FLUSHWB)]
2963 [(set_attr "type" "X1")])
2965 (define_insn "insn_fnop"
2966 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FNOP)]
2970 (define_insn "insn_fsingle_add1"
2971 [(set (match_operand:DI 0 "register_operand" "=r")
2972 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2973 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2974 UNSPEC_INSN_FSINGLE_ADD1))]
2976 "fsingle_add1\t%0, %r1, %r2"
2977 [(set_attr "type" "X0")])
2979 (define_insn "insn_fsingle_addsub2"
2980 [(set (match_operand:DI 0 "register_operand" "=r")
2981 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2982 (match_operand:DI 2 "reg_or_0_operand" "rO")
2983 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2984 UNSPEC_INSN_FSINGLE_ADDSUB2))]
2986 "fsingle_addsub2\t%0, %r2, %r3"
2987 [(set_attr "type" "X0_2cycle")])
2989 (define_insn "insn_fsingle_mul1"
2990 [(set (match_operand:DI 0 "register_operand" "=r")
2991 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2992 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2993 UNSPEC_INSN_FSINGLE_MUL1))]
2995 "fsingle_mul1\t%0, %r1, %r2"
2996 [(set_attr "type" "X0")])
2998 (define_insn "insn_fsingle_mul2"
2999 [(set (match_operand:DI 0 "register_operand" "=r")
3000 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3001 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3002 UNSPEC_INSN_FSINGLE_MUL2))]
3004 "fsingle_mul2\t%0, %r1, %r2"
3005 [(set_attr "type" "X0_2cycle")])
3007 (define_insn "insn_fsingle_pack1"
3008 [(set (match_operand:DI 0 "register_operand" "=r")
3009 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")]
3010 UNSPEC_INSN_FSINGLE_PACK1))]
3012 "fsingle_pack1\t%0, %r1"
3013 [(set_attr "type" "Y0_2cycle")])
3015 (define_insn "insn_fsingle_pack2"
3016 [(set (match_operand:DI 0 "register_operand" "=r")
3017 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3018 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3019 UNSPEC_INSN_FSINGLE_PACK2))]
3021 "fsingle_pack2\t%0, %r1, %r2"
3022 [(set_attr "type" "X0_2cycle")])
3024 (define_insn "insn_fsingle_sub1"
3025 [(set (match_operand:DI 0 "register_operand" "=r")
3026 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3027 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3028 UNSPEC_INSN_FSINGLE_SUB1))]
3030 "fsingle_sub1\t%0, %r1, %r2"
3031 [(set_attr "type" "X0")])
3033 (define_insn "insn_drain"
3034 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_DRAIN)]
3037 [(set_attr "type" "cannot_bundle")])
3039 (define_insn "insn_icoh"
3040 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3044 [(set_attr "type" "X1")])
3046 (define_insn "insn_ill"
3047 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_ILL)]
3050 [(set_attr "type" "cannot_bundle")])
3052 (define_insn "insn_info"
3053 [(unspec_volatile:VOID [(match_operand:DI 0 "s8bit_cint_operand" "i")]
3058 (define_insn "insn_infol"
3059 [(unspec_volatile:VOID [(match_operand:DI 0 "s16bit_cint_operand" "i")]
3063 [(set_attr "type" "X01")])
3065 (define_insn "insn_inv"
3066 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3070 [(set_attr "type" "X1")])
3074 (define_expand "insn_ld"
3075 [(set (match_operand:DI 0 "register_operand" "")
3076 (mem:DI (match_operand 1 "pointer_operand" "")))]
3079 (define_insn "insn_ld_add<bitsuffix>"
3080 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3081 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3082 (match_operand 2 "s8bit_cint_operand" "i")))
3083 (set (match_operand:DI 0 "register_operand" "=r")
3084 (mem:DI (match_dup 3)))]
3086 "ld_add\t%0, %1, %2"
3087 [(set_attr "type" "X1_2cycle")])
3089 (define_insn "insn_ldna"
3090 [(set (match_operand:DI 0 "register_operand" "=r")
3091 (mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3095 [(set_attr "type" "X1_2cycle")])
3097 (define_insn "insn_ldna_add<bitsuffix>"
3098 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3099 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3100 (match_operand 2 "s8bit_cint_operand" "i")))
3101 (set (match_operand:DI 0 "register_operand" "=r")
3102 (mem:DI (and:DI (match_dup 3) (const_int -8))))]
3104 "ldna_add\t%0, %1, %2"
3105 [(set_attr "type" "X1_2cycle")])
3107 (define_expand "insn_ld<n><s>"
3108 [(set (match_operand:DI 0 "register_operand" "")
3110 (mem:I124MODE (match_operand 1 "pointer_operand" ""))))]
3113 (define_insn "insn_ld<I124MODE:n><s>_add<I48MODE:bitsuffix>"
3114 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3115 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3116 (match_operand 2 "s8bit_cint_operand" "i")))
3117 (set (match_operand:DI 0 "register_operand" "=r")
3118 (any_extend:DI (mem:I124MODE (match_dup 3))))]
3120 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3121 [(set_attr "type" "X1_2cycle")])
3123 ;; non temporal loads
3125 (define_insn "insn_ldnt"
3126 [(set (match_operand:DI 0 "register_operand" "=r")
3127 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3128 UNSPEC_NON_TEMPORAL))]
3131 [(set_attr "type" "X1_2cycle")])
3133 (define_insn "insn_ldnt_add<bitsuffix>"
3134 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3135 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3136 (match_operand 2 "s8bit_cint_operand" "i")))
3137 (set (match_operand:DI 0 "register_operand" "=r")
3138 (unspec:DI [(mem:DI (match_dup 3))]
3139 UNSPEC_NON_TEMPORAL))]
3141 "ldnt_add\t%0, %1, %2"
3142 [(set_attr "type" "X1_2cycle")])
3144 (define_insn "insn_ldnt<n><s>"
3145 [(set (match_operand:DI 0 "register_operand" "=r")
3148 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3149 UNSPEC_NON_TEMPORAL)))]
3151 "ldnt<n><s>\t%0, %r1"
3152 [(set_attr "type" "X1_2cycle")])
3154 (define_insn "insn_ldnt<I124MODE:n><s>_add<I48MODE:bitsuffix>"
3155 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3156 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3157 (match_operand 2 "s8bit_cint_operand" "i")))
3158 (set (match_operand:DI 0 "register_operand" "=r")
3159 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3160 UNSPEC_NON_TEMPORAL)))]
3162 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3163 [(set_attr "type" "X1_2cycle")])
3167 (define_insn "insn_ld_L2"
3168 [(set (match_operand:DI 0 "register_operand" "=r")
3169 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3170 UNSPEC_LATENCY_L2))]
3173 [(set_attr "type" "Y2_L2")])
3175 (define_insn "insn_ld_add_L2<bitsuffix>"
3176 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3177 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3178 (match_operand 2 "s8bit_cint_operand" "i")))
3179 (set (match_operand:DI 0 "register_operand" "=r")
3180 (unspec:DI [(mem:DI (match_dup 3))]
3181 UNSPEC_LATENCY_L2))]
3183 "ld_add\t%0, %1, %2"
3184 [(set_attr "type" "X1_L2")])
3186 (define_insn "insn_ldna_L2"
3187 [(set (match_operand:DI 0 "register_operand" "=r")
3188 (unspec:DI [(mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3190 UNSPEC_LATENCY_L2))]
3193 [(set_attr "type" "X1_L2")])
3195 (define_insn "insn_ldna_add_L2<bitsuffix>"
3196 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3197 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3198 (match_operand 2 "s8bit_cint_operand" "i")))
3199 (set (match_operand:DI 0 "register_operand" "=r")
3200 (unspec:DI [(mem:DI (and:DI (match_dup 3) (const_int -8)))]
3201 UNSPEC_LATENCY_L2))]
3203 "ldna_add\t%0, %1, %2"
3204 [(set_attr "type" "X1_L2")])
3206 (define_insn "insn_ld<n><s>_L2"
3207 [(set (match_operand:DI 0 "register_operand" "=r")
3210 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3211 UNSPEC_LATENCY_L2)))]
3214 [(set_attr "type" "Y2_L2")])
3216 (define_insn "insn_ld<I124MODE:n><s>_add_L2<I48MODE:bitsuffix>"
3217 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3218 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3219 (match_operand 2 "s8bit_cint_operand" "i")))
3220 (set (match_operand:DI 0 "register_operand" "=r")
3221 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3222 UNSPEC_LATENCY_L2)))]
3224 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3225 [(set_attr "type" "X1_L2")])
3227 ;; L2 hits, non temporal loads
3229 (define_insn "insn_ldnt_L2"
3230 [(set (match_operand:DI 0 "register_operand" "=r")
3231 (unspec:DI [(unspec:DI
3232 [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3233 UNSPEC_NON_TEMPORAL)]
3234 UNSPEC_LATENCY_L2))]
3237 [(set_attr "type" "X1_L2")])
3239 (define_insn "insn_ldnt_add_L2<bitsuffix>"
3240 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3241 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3242 (match_operand 2 "s8bit_cint_operand" "i")))
3243 (set (match_operand:DI 0 "register_operand" "=r")
3244 (unspec:DI [(unspec:DI
3245 [(mem:DI (match_dup 3))]
3246 UNSPEC_NON_TEMPORAL)]
3247 UNSPEC_LATENCY_L2))]
3249 "ldnt_add\t%0, %1, %2"
3250 [(set_attr "type" "X1_L2")])
3252 (define_insn "insn_ldnt<n><s>_L2"
3253 [(set (match_operand:DI 0 "register_operand" "=r")
3257 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3258 UNSPEC_NON_TEMPORAL)]
3259 UNSPEC_LATENCY_L2)))]
3261 "ldnt<n><s>\t%0, %r1"
3262 [(set_attr "type" "X1_L2")])
3264 (define_insn "insn_ldnt<I124MODE:n><s>_add_L2<I48MODE:bitsuffix>"
3265 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3266 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3267 (match_operand 2 "s8bit_cint_operand" "i")))
3268 (set (match_operand:DI 0 "register_operand" "=r")
3270 (unspec:I124MODE [(unspec:I124MODE
3271 [(mem:I124MODE (match_dup 3))]
3272 UNSPEC_NON_TEMPORAL)]
3273 UNSPEC_LATENCY_L2)))]
3275 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3276 [(set_attr "type" "X1_L2")])
3280 (define_insn "insn_ld_miss"
3281 [(set (match_operand:DI 0 "register_operand" "=r")
3282 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3283 UNSPEC_LATENCY_MISS))]
3286 [(set_attr "type" "Y2_miss")])
3288 (define_insn "insn_ld_add_miss<bitsuffix>"
3289 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3290 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3291 (match_operand 2 "s8bit_cint_operand" "i")))
3292 (set (match_operand:DI 0 "register_operand" "=r")
3293 (unspec:DI [(mem:DI (match_dup 3))]
3294 UNSPEC_LATENCY_MISS))]
3296 "ld_add\t%0, %1, %2"
3297 [(set_attr "type" "X1_miss")])
3299 (define_insn "insn_ldna_miss"
3300 [(set (match_operand:DI 0 "register_operand" "=r")
3301 (unspec:DI [(mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3303 UNSPEC_LATENCY_MISS))]
3306 [(set_attr "type" "X1_miss")])
3308 (define_insn "insn_ldna_add_miss<bitsuffix>"
3309 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3310 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3311 (match_operand 2 "s8bit_cint_operand" "i")))
3312 (set (match_operand:DI 0 "register_operand" "=r")
3313 (unspec:DI [(mem:DI (and:DI (match_dup 3) (const_int -8)))]
3314 UNSPEC_LATENCY_MISS))]
3316 "ldna_add\t%0, %1, %2"
3317 [(set_attr "type" "X1_miss")])
3319 (define_insn "insn_ld<n><s>_miss"
3320 [(set (match_operand:DI 0 "register_operand" "=r")
3323 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3324 UNSPEC_LATENCY_MISS)))]
3327 [(set_attr "type" "Y2_miss")])
3329 (define_insn "insn_ld<I124MODE:n><s>_add_miss<I48MODE:bitsuffix>"
3330 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3331 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3332 (match_operand 2 "s8bit_cint_operand" "i")))
3333 (set (match_operand:DI 0 "register_operand" "=r")
3334 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3335 UNSPEC_LATENCY_MISS)))]
3337 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3338 [(set_attr "type" "X1_miss")])
3340 ;; L2 miss, non temporal loads
3342 (define_insn "insn_ldnt_miss"
3343 [(set (match_operand:DI 0 "register_operand" "=r")
3344 (unspec:DI [(unspec:DI
3345 [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3346 UNSPEC_NON_TEMPORAL)]
3347 UNSPEC_LATENCY_MISS))]
3350 [(set_attr "type" "X1_miss")])
3352 (define_insn "insn_ldnt_add_miss<bitsuffix>"
3353 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3354 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3355 (match_operand 2 "s8bit_cint_operand" "i")))
3356 (set (match_operand:DI 0 "register_operand" "=r")
3357 (unspec:DI [(unspec:DI
3358 [(mem:DI (match_dup 3))]
3359 UNSPEC_NON_TEMPORAL)]
3360 UNSPEC_LATENCY_MISS))]
3362 "ldnt_add\t%0, %1, %2"
3363 [(set_attr "type" "X1_miss")])
3365 (define_insn "insn_ldnt<n><s>_miss"
3366 [(set (match_operand:DI 0 "register_operand" "=r")
3370 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3371 UNSPEC_NON_TEMPORAL)]
3372 UNSPEC_LATENCY_MISS)))]
3374 "ldnt<n><s>\t%0, %r1"
3375 [(set_attr "type" "X1_miss")])
3377 (define_insn "insn_ldnt<I124MODE:n><s>_add_miss<I48MODE:bitsuffix>"
3378 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3379 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3380 (match_operand 2 "s8bit_cint_operand" "i")))
3381 (set (match_operand:DI 0 "register_operand" "=r")
3383 (unspec:I124MODE [(unspec:I124MODE
3384 [(mem:I124MODE (match_dup 3))]
3385 UNSPEC_NON_TEMPORAL)]
3386 UNSPEC_LATENCY_MISS)))]
3388 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3389 [(set_attr "type" "X1_miss")])
3393 (define_insn "insn_lnk"
3394 [(set (match_operand:DI 0 "register_operand" "=r")
3395 (unspec:DI [(const_int 0)] UNSPEC_INSN_LNK))]
3398 [(set_attr "type" "Y1")])
3400 (define_insn "insn_mfspr"
3401 [(set (match_operand:DI 0 "register_operand" "=r")
3402 (unspec_volatile:DI [(match_operand:DI 1 "u14bit_cint_operand" "i")]
3404 (clobber (mem:BLK (const_int 0)))]
3407 [(set_attr "type" "X1")])
3409 (define_insn "insn_mtspr"
3410 [(unspec_volatile:DI [(match_operand:DI 0 "u14bit_cint_operand" "i")
3411 (match_operand:DI 1 "reg_or_0_operand" "rO")]
3413 (clobber (mem:BLK (const_int 0)))]
3416 [(set_attr "type" "X1")])
3418 (define_insn "insn_mm"
3419 [(set (match_operand:DI 0 "register_operand" "=r")
3420 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3421 (match_operand:DI 2 "reg_or_0_operand" "rO")
3422 (match_operand:DI 3 "u6bit_cint_operand" "i")
3423 (match_operand:DI 4 "u6bit_cint_operand" "i")]
3426 "mm\t%0, %r2, %3, %4"
3427 [(set_attr "type" "X0")])
3429 (define_insn "insn_mul_hs_hs"
3430 [(set (match_operand:DI 0 "register_operand" "=r")
3431 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3432 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3433 UNSPEC_INSN_MUL_HS_HS))]
3435 "mul_hs_hs\t%0, %r1, %r2"
3436 [(set_attr "type" "Y0_2cycle")])
3438 (define_insn "insn_mul_hs_hu"
3439 [(set (match_operand:DI 0 "register_operand" "=r")
3440 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3441 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3442 UNSPEC_INSN_MUL_HS_HU))]
3444 "mul_hs_hu\t%0, %r1, %r2"
3445 [(set_attr "type" "X0_2cycle")])
3447 (define_insn "insn_mul_hs_ls"
3448 [(set (match_operand:DI 0 "register_operand" "=r")
3449 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3450 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3451 UNSPEC_INSN_MUL_HS_LS))]
3453 "mul_hs_ls\t%0, %r1, %r2"
3454 [(set_attr "type" "X0_2cycle")])
3456 (define_insn "insn_mul_hs_lu"
3457 [(set (match_operand:DI 0 "register_operand" "=r")
3458 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3459 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3460 UNSPEC_INSN_MUL_HS_LU))]
3462 "mul_hs_lu\t%0, %r1, %r2"
3463 [(set_attr "type" "X0_2cycle")])
3465 (define_insn "insn_mul_hu_hu"
3466 [(set (match_operand:DI 0 "register_operand" "=r")
3467 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3468 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3469 UNSPEC_INSN_MUL_HU_HU))]
3471 "mul_hu_hu\t%0, %r1, %r2"
3472 [(set_attr "type" "Y0_2cycle")])
3474 (define_insn "insn_mul_hu_ls"
3475 [(set (match_operand:DI 0 "register_operand" "=r")
3476 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3477 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3478 UNSPEC_INSN_MUL_HU_LS))]
3480 "mul_hu_ls\t%0, %r1, %r2"
3481 [(set_attr "type" "X0_2cycle")])
3483 (define_insn "insn_mul_hu_lu"
3484 [(set (match_operand:DI 0 "register_operand" "=r")
3485 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3486 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3487 UNSPEC_INSN_MUL_HU_LU))]
3489 "mul_hu_lu\t%0, %r1, %r2"
3490 [(set_attr "type" "X0_2cycle")])
3492 (define_insn "insn_mul_ls_ls"
3493 [(set (match_operand:DI 0 "register_operand" "=r")
3494 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3495 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3496 UNSPEC_INSN_MUL_LS_LS))]
3498 "mul_ls_ls\t%0, %r1, %r2"
3499 [(set_attr "type" "Y0_2cycle")])
3501 (define_insn "insn_mul_ls_lu"
3502 [(set (match_operand:DI 0 "register_operand" "=r")
3503 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3504 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3505 UNSPEC_INSN_MUL_LS_LU))]
3507 "mul_ls_lu\t%0, %r1, %r2"
3508 [(set_attr "type" "X0_2cycle")])
3510 (define_insn "insn_mul_lu_lu"
3511 [(set (match_operand:DI 0 "register_operand" "=r")
3512 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3513 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3514 UNSPEC_INSN_MUL_LU_LU))]
3516 "mul_lu_lu\t%0, %r1, %r2"
3517 [(set_attr "type" "Y0_2cycle")])
3519 (define_insn "insn_mula_hs_hs"
3520 [(set (match_operand:DI 0 "register_operand" "=r")
3521 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3522 (match_operand:DI 2 "reg_or_0_operand" "rO")
3523 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3524 UNSPEC_INSN_MULA_HS_HS))]
3526 "mula_hs_hs\t%0, %r2, %r3"
3527 [(set_attr "type" "Y0_2cycle")])
3529 (define_insn "insn_mula_hs_hu"
3530 [(set (match_operand:DI 0 "register_operand" "=r")
3531 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3532 (match_operand:DI 2 "reg_or_0_operand" "rO")
3533 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3534 UNSPEC_INSN_MULA_HS_HU))]
3536 "mula_hs_hu\t%0, %r2, %r3"
3537 [(set_attr "type" "X0_2cycle")])
3539 (define_insn "insn_mula_hs_ls"
3540 [(set (match_operand:DI 0 "register_operand" "=r")
3541 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3542 (match_operand:DI 2 "reg_or_0_operand" "rO")
3543 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3544 UNSPEC_INSN_MULA_HS_LS))]
3546 "mula_hs_ls\t%0, %r2, %r3"
3547 [(set_attr "type" "X0_2cycle")])
3549 (define_insn "insn_mula_hs_lu"
3550 [(set (match_operand:DI 0 "register_operand" "=r")
3551 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3552 (match_operand:DI 2 "reg_or_0_operand" "rO")
3553 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3554 UNSPEC_INSN_MULA_HS_LU))]
3556 "mula_hs_lu\t%0, %r2, %r3"
3557 [(set_attr "type" "X0_2cycle")])
3559 (define_insn "insn_mula_hu_hu"
3560 [(set (match_operand:DI 0 "register_operand" "=r")
3561 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3562 (match_operand:DI 2 "reg_or_0_operand" "rO")
3563 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3564 UNSPEC_INSN_MULA_HU_HU))]
3566 "mula_hu_hu\t%0, %r2, %r3"
3567 [(set_attr "type" "Y0_2cycle")])
3569 (define_insn "insn_mula_hu_ls"
3570 [(set (match_operand:DI 0 "register_operand" "=r")
3571 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3572 (match_operand:DI 2 "reg_or_0_operand" "rO")
3573 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3574 UNSPEC_INSN_MULA_HU_LS))]
3576 "mula_hu_ls\t%0, %r2, %r3"
3577 [(set_attr "type" "X0_2cycle")])
3579 (define_insn "insn_mula_hu_lu"
3580 [(set (match_operand:DI 0 "register_operand" "=r")
3581 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3582 (match_operand:DI 2 "reg_or_0_operand" "rO")
3583 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3584 UNSPEC_INSN_MULA_HU_LU))]
3586 "mula_hu_lu\t%0, %r2, %r3"
3587 [(set_attr "type" "X0_2cycle")])
3589 (define_insn "insn_mula_ls_ls"
3590 [(set (match_operand:DI 0 "register_operand" "=r")
3591 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3592 (match_operand:DI 2 "reg_or_0_operand" "rO")
3593 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3594 UNSPEC_INSN_MULA_LS_LS))]
3596 "mula_ls_ls\t%0, %r2, %r3"
3597 [(set_attr "type" "Y0_2cycle")])
3599 (define_insn "insn_mula_ls_lu"
3600 [(set (match_operand:DI 0 "register_operand" "=r")
3601 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3602 (match_operand:DI 2 "reg_or_0_operand" "rO")
3603 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3604 UNSPEC_INSN_MULA_LS_LU))]
3606 "mula_ls_lu\t%0, %r2, %r3"
3607 [(set_attr "type" "X0_2cycle")])
3609 (define_insn "insn_mula_lu_lu"
3610 [(set (match_operand:DI 0 "register_operand" "=r")
3611 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3612 (match_operand:DI 2 "reg_or_0_operand" "rO")
3613 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3614 UNSPEC_INSN_MULA_LU_LU))]
3616 "mula_lu_lu\t%0, %r2, %r3"
3617 [(set_attr "type" "Y0_2cycle")])
3619 (define_insn "insn_mulax"
3620 [(set (match_operand:SI 0 "register_operand" "=r")
3621 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3622 (match_operand:SI 2 "reg_or_0_operand" "rO")
3623 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3624 UNSPEC_INSN_MULAX))]
3626 "mulax\t%0, %r2, %r3"
3627 [(set_attr "type" "Y0_2cycle")])
3629 (define_insn "insn_nap"
3630 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_NAP)]
3633 [(set_attr "type" "cannot_bundle")])
3635 (define_insn "insn_nor_<mode>"
3636 [(set (match_operand:I48MODE 0 "register_operand" "=r")
3638 (not:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO"))
3639 (not:I48MODE (match_operand:I48MODE 2 "reg_or_0_operand" "rO"))))]
3641 "nor\t%0, %r1, %r2")
3643 (define_expand "insn_prefetch_l1"
3644 [(prefetch (match_operand 0 "pointer_operand" "")
3649 (define_expand "insn_prefetch_l2"
3650 [(prefetch (match_operand 0 "pointer_operand" "")
3655 (define_expand "insn_prefetch_l3"
3656 [(prefetch (match_operand 0 "pointer_operand" "")
3661 (define_insn "insn_prefetch_l1_fault"
3662 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3663 UNSPEC_INSN_PREFETCH_L1_FAULT)]
3665 "prefetch_l1_fault\t%r0"
3666 [(set_attr "type" "Y2")])
3668 (define_insn "insn_prefetch_l2_fault"
3669 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3670 UNSPEC_INSN_PREFETCH_L2_FAULT)]
3672 "prefetch_l2_fault\t%r0"
3673 [(set_attr "type" "Y2")])
3675 (define_insn "insn_prefetch_l3_fault"
3676 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3677 UNSPEC_INSN_PREFETCH_L3_FAULT)]
3679 "prefetch_l3_fault\t%r0"
3680 [(set_attr "type" "Y2")])
3682 (define_insn "insn_revbits"
3683 [(set (match_operand:DI 0 "register_operand" "=r")
3684 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")]
3685 UNSPEC_INSN_REVBITS))]
3688 [(set_attr "type" "Y0")])
3690 (define_insn "insn_shl1add"
3691 [(set (match_operand:DI 0 "register_operand" "=r")
3692 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3694 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3696 "shl1add\t%0, %r1, %r2")
3698 (define_insn "insn_shl1addx"
3699 [(set (match_operand:SI 0 "register_operand" "=r")
3700 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3702 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3704 "shl1addx\t%0, %r1, %r2")
3706 (define_insn "insn_shl2add"
3707 [(set (match_operand:DI 0 "register_operand" "=r")
3708 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3710 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3712 "shl2add\t%0, %r1, %r2")
3714 (define_insn "insn_shl2addx"
3715 [(set (match_operand:SI 0 "register_operand" "=r")
3716 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3718 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3720 "shl2addx\t%0, %r1, %r2")
3722 (define_insn "insn_shl3add"
3723 [(set (match_operand:DI 0 "register_operand" "=r")
3724 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3726 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3728 "shl3add\t%0, %r1, %r2")
3730 (define_insn "insn_shl3addx"
3731 [(set (match_operand:SI 0 "register_operand" "=r")
3732 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3734 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3736 "shl3addx\t%0, %r1, %r2")
3738 (define_insn "insn_shufflebytes"
3739 [(set (match_operand:DI 0 "register_operand" "=r")
3740 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3741 (match_operand:DI 2 "reg_or_0_operand" "rO")
3742 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3743 UNSPEC_INSN_SHUFFLEBYTES))]
3745 "shufflebytes\t%0, %r2, %r3"
3746 [(set_attr "type" "X0")])
3750 (define_expand "insn_st"
3751 [(set (mem:DI (match_operand 0 "pointer_operand" ""))
3752 (match_operand:DI 1 "reg_or_0_operand" ""))]
3755 (define_insn "insn_st_add<bitsuffix>"
3756 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3757 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3758 (match_operand 2 "s8bit_cint_operand" "i")))
3759 (set (mem:DI (match_dup 3))
3760 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3762 "st_add\t%0, %r1, %2"
3763 [(set_attr "type" "X1")])
3765 (define_expand "insn_st<n>"
3766 [(set (mem:I124MODE (match_operand 0 "pointer_operand" ""))
3767 (match_operand:DI 1 "reg_or_0_operand" ""))]
3770 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3773 (define_expand "insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3775 [(set (match_operand:I48MODE 0 "pointer_operand" "")
3776 (plus:I48MODE (match_operand 3 "pointer_operand" "")
3777 (match_operand 2 "s8bit_cint_operand" "")))
3778 (set (mem:I124MODE (match_dup 3))
3779 (match_operand:DI 1 "reg_or_0_operand" ""))])]
3782 operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3786 (define_insn "*insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3787 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3788 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3789 (match_operand 2 "s8bit_cint_operand" "i")))
3790 (set (mem:I124MODE (match_dup 3))
3791 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3793 "st<I124MODE:n>_add\t%0, %r1, %2"
3794 [(set_attr "type" "X1")])
3796 ;; non-temporal stores
3798 (define_insn "insn_stnt"
3799 [(set (mem:DI (unspec [(match_operand 0 "pointer_operand" "rO")]
3800 UNSPEC_NON_TEMPORAL))
3801 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3804 [(set_attr "type" "X1")])
3806 (define_insn "insn_stnt_add<bitsuffix>"
3807 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3808 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3809 (match_operand 2 "s8bit_cint_operand" "i")))
3810 (set (mem:DI (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3811 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3813 "stnt_add\t%0, %r1, %2"
3814 [(set_attr "type" "X1")])
3816 (define_expand "insn_stnt<n>"
3817 [(set (mem:I124MODE (unspec [(match_operand 0 "pointer_operand" "")]
3818 UNSPEC_NON_TEMPORAL))
3819 (match_operand:DI 1 "reg_or_0_operand" ""))]
3822 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3825 (define_insn "*insn_stnt<n>"
3826 [(set (mem:I124MODE (unspec [(match_operand 0 "pointer_operand" "rO")]
3827 UNSPEC_NON_TEMPORAL))
3828 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3831 [(set_attr "type" "X1")])
3833 (define_expand "insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>"
3835 [(set (match_operand:I48MODE 0 "pointer_operand" "")
3836 (plus:I48MODE (match_operand 3 "pointer_operand" "")
3837 (match_operand 2 "s8bit_cint_operand" "")))
3838 (set (mem:I124MODE (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3839 (match_operand:DI 1 "reg_or_0_operand" "rO"))])]
3842 operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3846 (define_insn "*insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>"
3847 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3848 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3849 (match_operand 2 "s8bit_cint_operand" "i")))
3850 (set (mem:I124MODE (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3851 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3853 "stnt<I124MODE:n>_add\t%0, %r1, %2"
3854 [(set_attr "type" "X1")])
3858 (define_insn "insn_tblidxb0"
3859 [(set (match_operand:DI 0 "register_operand" "=r")
3860 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3861 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3862 UNSPEC_INSN_TBLIDXB0))]
3865 [(set_attr "type" "Y0")])
3867 (define_insn "insn_tblidxb1"
3868 [(set (match_operand:DI 0 "register_operand" "=r")
3869 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3870 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3871 UNSPEC_INSN_TBLIDXB1))]
3874 [(set_attr "type" "Y0")])
3876 (define_insn "insn_tblidxb2"
3877 [(set (match_operand:DI 0 "register_operand" "=r")
3878 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3879 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3880 UNSPEC_INSN_TBLIDXB2))]
3883 [(set_attr "type" "Y0")])
3885 (define_insn "insn_tblidxb3"
3886 [(set (match_operand:DI 0 "register_operand" "=r")
3887 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3888 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3889 UNSPEC_INSN_TBLIDXB3))]
3892 [(set_attr "type" "Y0")])
3906 (define_insn "<optab>v8qi3"
3907 [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3909 (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO,rO")
3910 (match_operand:V8QI 2 "reg_or_v8s8bit_operand" "W,rO")))]
3913 v1<insn>i\t%0, %r1, %j2
3914 v1<insn>\t%0, %r1, %r2"
3915 [(set_attr "type" "<pipe>,<pipe>")])
3917 (define_expand "insn_v1<insn>"
3918 [(set (match_operand:DI 0 "register_operand" "")
3920 (match_operand:DI 1 "reg_or_0_operand" "")
3921 (match_operand:DI 2 "reg_or_0_operand" "")))]
3924 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3925 V8QImode, operands[1], operands[2], true);
3929 (define_expand "insn_v1<insn>i"
3930 [(set (match_operand:DI 0 "register_operand" "")
3932 (match_operand:DI 1 "reg_or_0_operand" "")
3933 (match_operand:DI 2 "s8bit_cint_operand" "")))]
3936 /* Tile out immediate and expand to general case. */
3937 rtx n = tilegx_simd_int (operands[2], QImode);
3938 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3939 V8QImode, operands[1], n, true);
3949 (define_insn "<optab>v8qi3"
3950 [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3952 (match_operand:V8QI 1 "reg_or_0_operand" "rO,rO")
3953 (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
3956 v1<insn>i\t%0, %r1, %2
3957 v1<insn>\t%0, %r1, %r2"
3958 [(set_attr "type" "<pipe>,<pipe>")])
3960 (define_expand "insn_v1<insn>"
3961 [(set (match_operand:DI 0 "register_operand" "")
3963 (match_operand:DI 1 "reg_or_0_operand" "")
3964 (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
3967 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3968 V8QImode, operands[1], operands[2], false);
3984 (define_insn "<optab>v4hi3"
3985 [(set (match_operand:V4HI 0 "register_operand" "=r,r")
3987 (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO,rO")
3988 (match_operand:V4HI 2 "reg_or_v4s8bit_operand" "Y,rO")))]
3991 v2<insn>i\t%0, %r1, %j2
3992 v2<insn>\t%0, %r1, %r2"
3993 [(set_attr "type" "<pipe>,<pipe>")])
3995 (define_expand "insn_v2<insn>"
3996 [(set (match_operand:DI 0 "register_operand" "")
3998 (match_operand:DI 1 "reg_or_0_operand" "")
3999 (match_operand:DI 2 "reg_or_0_operand" "")))]
4002 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4003 V4HImode, operands[1], operands[2], true);
4007 (define_expand "insn_v2<insn>i"
4008 [(set (match_operand:DI 0 "register_operand" "")
4010 (match_operand:DI 1 "reg_or_0_operand" "")
4011 (match_operand:DI 2 "s8bit_cint_operand" "")))]
4014 /* Tile out immediate and expand to general case. */
4015 rtx n = tilegx_simd_int (operands[2], HImode);
4016 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4017 V4HImode, operands[1], n, true);
4027 (define_insn "<optab>v4hi3"
4028 [(set (match_operand:V4HI 0 "register_operand" "=r,r")
4030 (match_operand:V4HI 1 "reg_or_0_operand" "rO,rO")
4031 (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
4034 v2<insn>i\t%0, %r1, %2
4035 v2<insn>\t%0, %r1, %r2"
4036 [(set_attr "type" "<pipe>,<pipe>")])
4038 (define_expand "insn_v2<insn>"
4039 [(set (match_operand:DI 0 "register_operand" "")
4041 (match_operand:DI 1 "reg_or_0_operand" "")
4042 (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
4045 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4046 V4HImode, operands[1], operands[2], false);
4057 (define_insn "<optab>v8qi3"
4058 [(set (match_operand:V8QI 0 "register_operand" "=r")
4060 (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO")
4061 (match_operand:V8QI 2 "reg_or_0_operand" "rO")))]
4063 "v1<insn>\t%0, %r1, %r2"
4064 [(set_attr "type" "<pipe>")])
4066 (define_expand "insn_v1<insn>"
4067 [(set (match_operand:DI 0 "register_operand" "")
4069 (match_operand:DI 1 "reg_or_0_operand" "")
4070 (match_operand:DI 2 "reg_or_0_operand" "")))]
4073 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
4074 V8QImode, operands[1], operands[2], true);
4084 (define_insn "<optab>v4hi3"
4085 [(set (match_operand:V4HI 0 "register_operand" "=r")
4087 (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO")
4088 (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4090 "v2<insn>\t%0, %r1, %r2"
4091 [(set_attr "type" "<pipe>")])
4093 (define_expand "insn_v2<insn>"
4094 [(set (match_operand:DI 0 "register_operand" "")
4096 (match_operand:DI 1 "reg_or_0_operand" "")
4097 (match_operand:DI 2 "reg_or_0_operand" "")))]
4100 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4101 V4HImode, operands[1], operands[2], true);
4106 (define_insn "mulv4hi3"
4107 [(set (match_operand:V4HI 0 "register_operand" "=r")
4109 (match_operand:V4HI 1 "reg_or_0_operand" "%rO")
4110 (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4112 "v2mults\t%0, %r1, %r2"
4113 [(set_attr "type" "X0_2cycle")])
4115 (define_expand "insn_v2mults"
4116 [(set (match_operand:DI 0 "register_operand" "")
4118 (match_operand:DI 1 "reg_or_0_operand" "")
4119 (match_operand:DI 2 "reg_or_0_operand" "")))]
4122 tilegx_expand_builtin_vector_binop (gen_mulv4hi3, V4HImode, operands[0],
4123 V4HImode, operands[1], operands[2], true);
4128 (define_insn "<optab>v4hi3"
4129 [(set (match_operand:V4HI 0 "register_operand" "=r")
4131 (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4132 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4134 "v2<insn>\t%0, %r1, %r2"
4135 [(set_attr "type" "<pipe>")])
4137 (define_expand "insn_v2<insn>"
4138 [(set (match_operand:DI 0 "register_operand" "")
4140 (match_operand:DI 1 "reg_or_0_operand" "")
4141 (match_operand:DI 2 "reg_or_0_operand" "")))]
4144 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4145 V4HImode, operands[1], operands[2], false);
4153 (define_insn "<optab>v2si3"
4154 [(set (match_operand:V2SI 0 "register_operand" "=r")
4156 (match_operand:V2SI 1 "reg_or_0_operand" "<comm>rO")
4157 (match_operand:V2SI 2 "reg_or_0_operand" "rO")))]
4159 "v4<insn>\t%0, %r1, %r2"
4160 [(set_attr "type" "<pipe>")])
4162 (define_expand "insn_v4<insn>"
4163 [(set (match_operand:DI 0 "register_operand" "")
4165 (match_operand:DI 1 "reg_or_0_operand" "")
4166 (match_operand:DI 2 "reg_or_0_operand" "")))]
4169 tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4170 V2SImode, operands[1], operands[2], true);
4178 (define_insn "<optab>v2si3"
4179 [(set (match_operand:V2SI 0 "register_operand" "=r")
4181 (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4182 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4184 "v4<insn>\t%0, %r1, %r2"
4185 [(set_attr "type" "<pipe>")])
4187 (define_expand "insn_v4<insn>"
4188 [(set (match_operand:DI 0 "register_operand" "")
4190 (match_operand:DI 1 "reg_or_0_operand" "")
4191 (match_operand:DI 2 "reg_or_0_operand" "")))]
4194 tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4195 V2SImode, operands[1], operands[2], false);
4200 ;; {B7,B6,B5,B4,B3,B2,B1,B0} {A7,A6,A5,A4,A3,A2,A1,A0}
4201 ;; => {A7,A6,A5,A4,A3,A2,A1,A0,B7,B6,B5,B4,B3,B2,B1,B0}
4202 ;; => {A7,B7,A6,B6,A5,B5,A4,B4}
4203 (define_insn "vec_interleave_highv8qi"
4204 [(set (match_operand:V8QI 0 "register_operand" "=r")
4206 (vec_concat:V16QI (match_operand:V8QI 1 "reg_or_0_operand" "rO")
4207 (match_operand:V8QI 2 "reg_or_0_operand" "rO"))
4208 (parallel [(const_int 4) (const_int 12)
4209 (const_int 5) (const_int 13)
4210 (const_int 6) (const_int 14)
4211 (const_int 7) (const_int 15)])))]
4213 "v1int_h\t%0, %r2, %r1"
4214 [(set_attr "type" "X01")])
4216 (define_expand "insn_v1int_h"
4217 [(match_operand:DI 0 "register_operand" "")
4218 (match_operand:DI 1 "reg_or_0_operand" "")
4219 (match_operand:DI 2 "reg_or_0_operand" "")]
4222 /* Our instruction interleaves opposite of the way vec_interleave
4223 works, so we need to reverse the source operands. */
4224 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv8qi, V8QImode,
4225 operands[0], V8QImode, operands[2],
4231 ;; {B7,B6,B5,B4,B3,B2,B1,B0} {A7,A6,A5,A4,A3,A2,A1,A0}
4232 ;; => {A7,A6,A5,A4,A3,A2,A1,A0,B7,B6,B5,B4,B3,B2,B1,B0}
4233 ;; => {A3,B3,A2,B2,A1,B1,A0,B0}
4234 (define_insn "vec_interleave_lowv8qi"
4235 [(set (match_operand:V8QI 0 "register_operand" "=r")
4237 (vec_concat:V16QI (match_operand:V8QI 1 "reg_or_0_operand" "rO")
4238 (match_operand:V8QI 2 "reg_or_0_operand" "rO"))
4239 (parallel [(const_int 0) (const_int 8)
4240 (const_int 1) (const_int 9)
4241 (const_int 2) (const_int 10)
4242 (const_int 3) (const_int 11)])))]
4244 "v1int_l\t%0, %r2, %r1"
4245 [(set_attr "type" "X01")])
4247 (define_expand "insn_v1int_l"
4248 [(match_operand:DI 0 "register_operand" "")
4249 (match_operand:DI 1 "reg_or_0_operand" "")
4250 (match_operand:DI 2 "reg_or_0_operand" "")]
4253 /* Our instruction interleaves opposite of the way vec_interleave
4254 works, so we need to reverse the source operands. */
4255 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv8qi, V8QImode,
4256 operands[0], V8QImode, operands[2],
4262 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4263 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4265 (define_insn "vec_interleave_highv4hi"
4266 [(set (match_operand:V4HI 0 "register_operand" "=r")
4268 (vec_concat:V8HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4269 (match_operand:V4HI 2 "reg_or_0_operand" "rO"))
4270 (parallel [(const_int 2) (const_int 6)
4271 (const_int 3) (const_int 7)])))]
4273 "v2int_h\t%0, %r2, %r1"
4274 [(set_attr "type" "X01")])
4276 (define_expand "insn_v2int_h"
4277 [(match_operand:DI 0 "register_operand" "")
4278 (match_operand:DI 1 "reg_or_0_operand" "")
4279 (match_operand:DI 2 "reg_or_0_operand" "")]
4282 /* Our instruction interleaves opposite of the way vec_interleave
4283 works, so we need to reverse the source operands. */
4284 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv4hi, V4HImode,
4285 operands[0], V4HImode, operands[2],
4291 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4292 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4294 (define_insn "vec_interleave_lowv4hi"
4295 [(set (match_operand:V4HI 0 "register_operand" "=r")
4297 (vec_concat:V8HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4298 (match_operand:V4HI 2 "reg_or_0_operand" "rO"))
4299 (parallel [(const_int 0) (const_int 4)
4300 (const_int 1) (const_int 5)])))]
4302 "v2int_l\t%0, %r2, %r1"
4303 [(set_attr "type" "X01")])
4305 (define_expand "insn_v2int_l"
4306 [(match_operand:DI 0 "register_operand" "")
4307 (match_operand:DI 1 "reg_or_0_operand" "")
4308 (match_operand:DI 2 "reg_or_0_operand" "")]
4311 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv4hi, V4HImode,
4312 operands[0], V4HImode, operands[2],
4321 (define_insn "vec_interleave_highv2si"
4322 [(set (match_operand:V2SI 0 "register_operand" "=r")
4324 (vec_concat:V4SI (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4325 (match_operand:V2SI 2 "reg_or_0_operand" "rO"))
4326 (parallel [(const_int 1) (const_int 3)])))]
4328 "v4int_h\t%0, %r2, %r1"
4329 [(set_attr "type" "X01")])
4331 (define_expand "insn_v4int_h"
4332 [(match_operand:DI 0 "register_operand" "")
4333 (match_operand:DI 1 "reg_or_0_operand" "")
4334 (match_operand:DI 2 "reg_or_0_operand" "")]
4337 /* Our instruction interleaves opposite of the way vec_interleave
4338 works, so we need to reverse the source operands. */
4339 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv2si, V2SImode,
4340 operands[0], V2SImode, operands[2],
4349 (define_insn "vec_interleave_lowv2si"
4350 [(set (match_operand:V2SI 0 "register_operand" "=r")
4352 (vec_concat:V4SI (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4353 (match_operand:V2SI 2 "reg_or_0_operand" "rO"))
4354 (parallel [(const_int 0) (const_int 2)])))]
4356 "v4int_l\t%0, %r2, %r1"
4357 [(set_attr "type" "X01")])
4359 (define_expand "insn_v4int_l"
4360 [(match_operand:DI 0 "register_operand" "")
4361 (match_operand:DI 1 "reg_or_0_operand" "")
4362 (match_operand:DI 2 "reg_or_0_operand" "")]
4365 /* Our instruction interleaves opposite of the way vec_interleave
4366 works, so we need to reverse the source operands. */
4367 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv2si, V2SImode,
4368 operands[0], V2SImode, operands[2],
4377 (define_insn "insn_mnz_<mode>"
4378 [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4379 (if_then_else:VEC48MODE
4381 (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4383 (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")
4386 "v<n>mnz\t%0, %r1, %r2"
4387 [(set_attr "type" "X01")])
4389 (define_expand "insn_v<n>mnz"
4390 [(set (match_operand:DI 0 "register_operand" "")
4391 (if_then_else:VEC48MODE
4393 (match_operand:DI 1 "reg_or_0_operand" "")
4395 (match_operand:DI 2 "reg_or_0_operand" "")
4399 tilegx_expand_builtin_vector_binop (gen_insn_mnz_<mode>, <MODE>mode,
4400 operands[0], <MODE>mode, operands[1],
4405 (define_insn "insn_mz_<mode>"
4406 [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4407 (if_then_else:VEC48MODE
4409 (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4412 (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")))]
4414 "v<n>mz\t%0, %r1, %r2"
4415 [(set_attr "type" "X01")])
4416 (define_expand "insn_v<n>mz"
4417 [(set (match_operand:DI 0 "register_operand" "")
4418 (if_then_else:VEC48MODE
4420 (match_operand:DI 1 "reg_or_0_operand" "")
4423 (match_operand:DI 2 "reg_or_0_operand" "")))]
4426 tilegx_expand_builtin_vector_binop (gen_insn_mz_<mode>, <MODE>mode,
4427 operands[0], <MODE>mode, operands[1],
4433 (define_insn "vec_widen_umult_lo_v8qi"
4434 [(set (match_operand:V4HI 0 "register_operand" "=r")
4438 (match_operand:V8QI 1 "register_operand" "r")
4439 (parallel [(const_int 0) (const_int 1)
4440 (const_int 2) (const_int 3)])))
4443 (match_operand:V8QI 2 "register_operand" "r")
4444 (parallel [(const_int 0) (const_int 1)
4445 (const_int 2) (const_int 3)])))))]
4447 "v1mulu\t%0, %r1, %r2"
4448 [(set_attr "type" "X0_2cycle")])
4450 (define_expand "insn_v1mulu"
4451 [(match_operand:DI 0 "register_operand" "")
4452 (match_operand:DI 1 "reg_or_0_operand" "")
4453 (match_operand:DI 2 "reg_or_0_operand" "")]
4456 tilegx_expand_builtin_vector_binop (gen_vec_widen_umult_lo_v8qi, V4HImode,
4457 operands[0], V8QImode, operands[1],
4463 (define_insn "vec_widen_usmult_lo_v8qi"
4464 [(set (match_operand:V4HI 0 "register_operand" "=r")
4468 (match_operand:V8QI 1 "register_operand" "r")
4469 (parallel [(const_int 0) (const_int 1)
4470 (const_int 2) (const_int 3)])))
4473 (match_operand:V8QI 2 "register_operand" "r")
4474 (parallel [(const_int 0) (const_int 1)
4475 (const_int 2) (const_int 3)])))))]
4477 "v1mulus\t%0, %r1, %r2"
4478 [(set_attr "type" "X0_2cycle")])
4480 (define_expand "insn_v1mulus"
4481 [(match_operand:DI 0 "register_operand" "")
4482 (match_operand:DI 1 "reg_or_0_operand" "")
4483 (match_operand:DI 2 "reg_or_0_operand" "")]
4486 tilegx_expand_builtin_vector_binop (gen_vec_widen_usmult_lo_v8qi, V4HImode,
4487 operands[0], V8QImode, operands[1],
4493 (define_insn "vec_widen_smult_lo_v4qi"
4494 [(set (match_operand:V2SI 0 "register_operand" "=r")
4498 (match_operand:V4HI 1 "register_operand" "r")
4499 (parallel [(const_int 0) (const_int 1)])))
4502 (match_operand:V4HI 2 "register_operand" "r")
4503 (parallel [(const_int 0) (const_int 1)])))))]
4505 "v2muls\t%0, %r1, %r2"
4506 [(set_attr "type" "X0_2cycle")])
4508 (define_expand "insn_v2muls"
4509 [(match_operand:DI 0 "register_operand" "")
4510 (match_operand:DI 1 "reg_or_0_operand" "")
4511 (match_operand:DI 2 "reg_or_0_operand" "")]
4514 tilegx_expand_builtin_vector_binop (gen_vec_widen_smult_lo_v4qi, V2SImode,
4515 operands[0], V4HImode, operands[1],
4522 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4523 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4524 (define_insn "vec_pack_<pack_optab>_v4hi"
4525 [(set (match_operand:V8QI 0 "reg_or_0_operand" "=r")
4527 (v2pack:V4QI (match_operand:V4HI 1 "reg_or_0_operand" "rO"))
4528 (v2pack:V4QI (match_operand:V4HI 2 "reg_or_0_operand" "rO"))))]
4530 "v2<pack_insn>\t%0, %r2, %r1"
4531 [(set_attr "type" "X01")])
4533 (define_expand "insn_v2<pack_insn>"
4534 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4536 (v2pack:V4QI (match_operand:DI 2 "reg_or_0_operand" ""))
4537 (v2pack:V4QI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4540 /* Our instruction concats opposite of the way vec_pack works, so we
4541 need to reverse the source operands. */
4542 tilegx_expand_builtin_vector_binop (gen_vec_pack_<pack_optab>_v4hi,
4543 V8QImode, operands[0], V4HImode,
4544 operands[2], operands[1], true);
4549 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4550 ;; => {A3_hi,A2_hi,A1_hi,A0_hi,B3_hi,B2_hi,B1_hi,B0_hi}
4551 (define_insn "vec_pack_hipart_v4hi"
4552 [(set (match_operand:V8QI 0 "reg_or_0_operand" "=r")
4555 (ashiftrt:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4558 (ashiftrt:V4HI (match_operand:V4HI 2 "reg_or_0_operand" "rO")
4561 "v2packh\t%0, %r2, %r1"
4562 [(set_attr "type" "X01")])
4564 (define_expand "insn_v2packh"
4565 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4568 (ashiftrt:V4HI (match_operand:DI 2 "reg_or_0_operand" "")
4571 (ashiftrt:V4HI (match_operand:DI 1 "reg_or_0_operand" "")
4575 /* Our instruction concats opposite of the way vec_pack works, so we
4576 need to reverse the source operands. */
4577 tilegx_expand_builtin_vector_binop (gen_vec_pack_hipart_v4hi, V8QImode,
4578 operands[0], V4HImode, operands[2],
4586 (define_insn "vec_pack_ssat_v2si"
4587 [(set (match_operand:V4HI 0 "reg_or_0_operand" "=r")
4589 (us_truncate:V2HI (match_operand:V2SI 1 "reg_or_0_operand" "rO"))
4590 (us_truncate:V2HI (match_operand:V2SI 2 "reg_or_0_operand" "rO"))))]
4592 "v4packsc\t%0, %r2, %r1"
4593 [(set_attr "type" "X01")])
4595 (define_expand "insn_v4packsc"
4596 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4598 (us_truncate:V2HI (match_operand:DI 2 "reg_or_0_operand" ""))
4599 (us_truncate:V2HI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4602 /* Our instruction concats opposite of the way vec_pack works, so we
4603 need to reverse the source operands. */
4604 tilegx_expand_builtin_vector_binop (gen_vec_pack_ssat_v2si, V4HImode,
4605 operands[0], V2SImode, operands[2],
4610 ;; Rest of the vector intrinsics
4611 (define_insn "insn_v1adiffu"
4612 [(set (match_operand:DI 0 "register_operand" "=r")
4613 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4614 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4615 UNSPEC_INSN_V1ADIFFU))]
4617 "v1adiffu\t%0, %r1, %r2"
4618 [(set_attr "type" "X0_2cycle")])
4620 (define_insn "insn_v1avgu"
4621 [(set (match_operand:DI 0 "register_operand" "=r")
4622 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4623 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4624 UNSPEC_INSN_V1AVGU))]
4626 "v1avgu\t%0, %r1, %r2"
4627 [(set_attr "type" "X0")])
4629 (define_insn "insn_v1ddotpu"
4630 [(set (match_operand:DI 0 "register_operand" "=r")
4631 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4632 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4633 UNSPEC_INSN_V1DDOTPU))]
4635 "v1ddotpu\t%0, %r1, %r2"
4636 [(set_attr "type" "X0_2cycle")])
4638 (define_insn "insn_v1ddotpua"
4639 [(set (match_operand:DI 0 "register_operand" "=r")
4640 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4641 (match_operand:DI 2 "reg_or_0_operand" "rO")
4642 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4643 UNSPEC_INSN_V1DDOTPUA))]
4645 "v1ddotpua\t%0, %r2, %r3"
4646 [(set_attr "type" "X0_2cycle")])
4648 (define_insn "insn_v1ddotpus"
4649 [(set (match_operand:DI 0 "register_operand" "=r")
4650 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4651 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4652 UNSPEC_INSN_V1DDOTPUS))]
4654 "v1ddotpus\t%0, %r1, %r2"
4655 [(set_attr "type" "X0_2cycle")])
4657 (define_insn "insn_v1ddotpusa"
4658 [(set (match_operand:DI 0 "register_operand" "=r")
4659 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4660 (match_operand:DI 2 "reg_or_0_operand" "rO")
4661 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4662 UNSPEC_INSN_V1DDOTPUSA))]
4664 "v1ddotpusa\t%0, %r2, %r3"
4665 [(set_attr "type" "X0_2cycle")])
4667 (define_insn "insn_v1dotp"
4668 [(set (match_operand:DI 0 "register_operand" "=r")
4669 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4670 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4671 UNSPEC_INSN_V1DOTP))]
4673 "v1dotp\t%0, %r1, %r2"
4674 [(set_attr "type" "X0_2cycle")])
4676 (define_insn "insn_v1dotpa"
4677 [(set (match_operand:DI 0 "register_operand" "=r")
4678 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4679 (match_operand:DI 2 "reg_or_0_operand" "rO")
4680 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4681 UNSPEC_INSN_V1DOTPA))]
4683 "v1dotpa\t%0, %r2, %r3"
4684 [(set_attr "type" "X0_2cycle")])
4686 (define_insn "insn_v1dotpu"
4687 [(set (match_operand:DI 0 "register_operand" "=r")
4688 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4689 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4690 UNSPEC_INSN_V1DOTPU))]
4692 "v1dotpu\t%0, %r1, %r2"
4693 [(set_attr "type" "X0_2cycle")])
4695 (define_insn "insn_v1dotpua"
4696 [(set (match_operand:DI 0 "register_operand" "=r")
4697 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4698 (match_operand:DI 2 "reg_or_0_operand" "rO")
4699 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4700 UNSPEC_INSN_V1DOTPUA))]
4702 "v1dotpua\t%0, %r2, %r3"
4703 [(set_attr "type" "X0_2cycle")])
4705 (define_insn "insn_v1dotpus"
4706 [(set (match_operand:DI 0 "register_operand" "=r")
4707 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4708 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4709 UNSPEC_INSN_V1DOTPUS))]
4711 "v1dotpus\t%0, %r1, %r2"
4712 [(set_attr "type" "X0_2cycle")])
4714 (define_insn "insn_v1dotpusa"
4715 [(set (match_operand:DI 0 "register_operand" "=r")
4716 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4717 (match_operand:DI 2 "reg_or_0_operand" "rO")
4718 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4719 UNSPEC_INSN_V1DOTPUSA))]
4721 "v1dotpusa\t%0, %r2, %r3"
4722 [(set_attr "type" "X0_2cycle")])
4724 (define_insn "insn_v1sadau"
4725 [(set (match_operand:DI 0 "register_operand" "=r")
4726 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4727 (match_operand:DI 2 "reg_or_0_operand" "rO")
4728 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4729 UNSPEC_INSN_V1SADAU))]
4731 "v1sadau\t%0, %r2, %r3"
4732 [(set_attr "type" "X0_2cycle")])
4734 (define_insn "insn_v1sadu"
4735 [(set (match_operand:DI 0 "register_operand" "=r")
4736 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4737 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4738 UNSPEC_INSN_V1SADU))]
4740 "v1sadu\t%0, %r1, %r2"
4741 [(set_attr "type" "X0_2cycle")])
4743 (define_insn "*insn_v1sadu"
4744 [(set (match_operand:SI 0 "register_operand" "=r")
4746 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4747 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4748 UNSPEC_INSN_V1SADU)))]
4750 "v1sadu\t%0, %r1, %r2"
4751 [(set_attr "type" "X0_2cycle")])
4753 (define_insn "insn_v2adiffs"
4754 [(set (match_operand:DI 0 "register_operand" "=r")
4755 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4756 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4757 UNSPEC_INSN_V2ADIFFS))]
4759 "v2adiffs\t%0, %r1, %r2"
4760 [(set_attr "type" "X0_2cycle")])
4762 (define_insn "insn_v2avgs"
4763 [(set (match_operand:DI 0 "register_operand" "=r")
4764 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4765 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4766 UNSPEC_INSN_V2AVGS))]
4768 "v2avgs\t%0, %r1, %r2"
4769 [(set_attr "type" "X0")])
4771 (define_insn "insn_v2dotp"
4772 [(set (match_operand:DI 0 "register_operand" "=r")
4773 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4774 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4775 UNSPEC_INSN_V2DOTP))]
4777 "v2dotp\t%0, %r1, %r2"
4778 [(set_attr "type" "X0_2cycle")])
4780 (define_insn "insn_v2dotpa"
4781 [(set (match_operand:DI 0 "register_operand" "=r")
4782 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4783 (match_operand:DI 2 "reg_or_0_operand" "rO")
4784 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4785 UNSPEC_INSN_V2DOTPA))]
4787 "v2dotpa\t%0, %r2, %r3"
4788 [(set_attr "type" "X0_2cycle")])
4790 (define_insn "insn_v2mulfsc"
4791 [(set (match_operand:DI 0 "register_operand" "=r")
4792 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4793 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4794 UNSPEC_INSN_V2MULFSC))]
4796 "v2mulfsc\t%0, %r1, %r2"
4797 [(set_attr "type" "X0_2cycle")])
4799 (define_insn "insn_v2sadas"
4800 [(set (match_operand:DI 0 "register_operand" "=r")
4801 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4802 (match_operand:DI 2 "reg_or_0_operand" "rO")
4803 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4804 UNSPEC_INSN_V2SADAS))]
4806 "v2sadas\t%0, %r2, %r3"
4807 [(set_attr "type" "X0_2cycle")])
4809 (define_insn "insn_v2sadau"
4810 [(set (match_operand:DI 0 "register_operand" "=r")
4811 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4812 (match_operand:DI 2 "reg_or_0_operand" "rO")
4813 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4814 UNSPEC_INSN_V2SADAU))]
4816 "v2sadau\t%0, %r2, %r3"
4817 [(set_attr "type" "X0_2cycle")])
4819 (define_insn "insn_v2sads"
4820 [(set (match_operand:DI 0 "register_operand" "=r")
4821 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4822 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4823 UNSPEC_INSN_V2SADS))]
4825 "v2sads\t%0, %r1, %r2"
4826 [(set_attr "type" "X0_2cycle")])
4828 (define_insn "*insn_v2sads"
4829 [(set (match_operand:SI 0 "register_operand" "=r")
4831 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4832 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4833 UNSPEC_INSN_V2SADS)))]
4835 "v2sads\t%0, %r1, %r2"
4836 [(set_attr "type" "X0_2cycle")])
4838 (define_insn "insn_v2sadu"
4839 [(set (match_operand:DI 0 "register_operand" "=r")
4840 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4841 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4842 UNSPEC_INSN_V2SADU))]
4844 "v2sadu\t%0, %r1, %r2"
4845 [(set_attr "type" "X0_2cycle")])
4847 (define_insn "*insn_v2sadu"
4848 [(set (match_operand:SI 0 "register_operand" "=r")
4850 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4851 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4852 UNSPEC_INSN_V2SADU)))]
4854 "v2sadu\t%0, %r1, %r2"
4855 [(set_attr "type" "X0_2cycle")])
4857 (define_insn "insn_wh64"
4858 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
4860 (clobber (mem:BLK (const_int 0)))]
4863 [(set_attr "type" "X1")])
4866 ;; Network intrinsics
4868 ;; Note the "pseudo" text is handled specially by the
4869 ;; asm_output_opcode routine. If the output is an empty string, the
4870 ;; instruction would bypass the asm_output_opcode routine, bypassing
4871 ;; the bundle handling code.
4872 (define_insn "tilegx_network_barrier"
4873 [(unspec_volatile:SI [(const_int 0)] UNSPEC_NETWORK_BARRIER)]
4876 [(set_attr "type" "nothing")
4877 (set_attr "length" "0")])
4879 (define_insn "*netreg_receive"
4880 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,U,m")
4881 (unspec_volatile:DI [(match_operand:DI 1 "netreg_operand" "i,i,i")
4882 (reg:DI TILEGX_NETORDER_REG)]
4883 UNSPEC_NETWORK_RECEIVE))
4884 (clobber (reg:DI TILEGX_NETORDER_REG))]
4890 st_add\t%I0, %N1, %i0"
4891 [(set_attr "type" "*,Y2,X1")])
4893 (define_insn "*netreg_send"
4894 [(unspec_volatile:DI
4895 [(match_operand:DI 0 "netreg_operand" "i,i,i,i,i,i")
4896 (match_operand:DI 1 "reg_or_cint_operand" "r,I,J,K,N,P")
4897 (reg:DI TILEGX_NETORDER_REG)]
4898 UNSPEC_NETWORK_SEND)
4899 (clobber (reg:DI TILEGX_NETORDER_REG))]
4905 shl16insli\t%N0, zero, %h1
4906 v1addi\t%N0, zero, %j1
4907 v2addi\t%N0, zero, %h1"
4908 [(set_attr "type" "*,*,X01,X01,X01,X01")])
4910 (define_expand "tilegx_idn0_receive"
4912 [(set (match_operand:DI 0 "register_operand" "")
4913 (unspec_volatile:DI [(const_int TILEGX_NETREG_IDN0)
4914 (reg:DI TILEGX_NETORDER_REG)]
4915 UNSPEC_NETWORK_RECEIVE))
4916 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4919 (define_expand "tilegx_idn1_receive"
4921 [(set (match_operand:DI 0 "register_operand" "")
4922 (unspec_volatile:DI [(const_int TILEGX_NETREG_IDN1)
4923 (reg:DI TILEGX_NETORDER_REG)]
4924 UNSPEC_NETWORK_RECEIVE))
4925 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4928 (define_expand "tilegx_idn_send"
4930 [(unspec_volatile:DI [(const_int TILEGX_NETREG_IDN0)
4931 (match_operand:DI 0 "reg_or_cint_operand" "")
4932 (reg:DI TILEGX_NETORDER_REG)]
4933 UNSPEC_NETWORK_SEND)
4934 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4937 (define_expand "tilegx_udn0_receive"
4939 [(set (match_operand:DI 0 "register_operand" "")
4940 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN0)
4941 (reg:DI TILEGX_NETORDER_REG)]
4942 UNSPEC_NETWORK_RECEIVE))
4943 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4946 (define_expand "tilegx_udn1_receive"
4948 [(set (match_operand:DI 0 "register_operand" "")
4949 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN1)
4950 (reg:DI TILEGX_NETORDER_REG)]
4951 UNSPEC_NETWORK_RECEIVE))
4952 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4955 (define_expand "tilegx_udn2_receive"
4957 [(set (match_operand:DI 0 "register_operand" "")
4958 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN2)
4959 (reg:DI TILEGX_NETORDER_REG)]
4960 UNSPEC_NETWORK_RECEIVE))
4961 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4964 (define_expand "tilegx_udn3_receive"
4966 [(set (match_operand:DI 0 "register_operand" "")
4967 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN3)
4968 (reg:DI TILEGX_NETORDER_REG)]
4969 UNSPEC_NETWORK_RECEIVE))
4970 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4973 (define_expand "tilegx_udn_send"
4975 [(unspec_volatile:DI [(const_int TILEGX_NETREG_UDN0)
4976 (match_operand:DI 0 "reg_or_cint_operand" "")
4977 (reg:DI TILEGX_NETORDER_REG)]
4978 UNSPEC_NETWORK_SEND)
4979 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4982 (define_insn "*netreg_adddi_to_network"
4983 [(unspec_volatile:DI
4984 [(match_operand:DI 0 "netreg_operand" "i,i,i")
4985 (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO")
4986 (match_operand:DI 2 "add_operand" "r,I,JT"))
4987 (reg:DI TILEGX_NETORDER_REG)]
4988 UNSPEC_NETWORK_SEND)
4989 (clobber (reg:DI TILEGX_NETORDER_REG))]
4994 addli\t%N0, %r1, %H2"
4995 [(set_attr "type" "*,*,X01")])
4997 (define_insn "*netreg_adddi_from_network"
4998 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
4999 (plus:DI (unspec_volatile:DI
5000 [(match_operand:DI 1 "netreg_operand" "%i,i,i")
5001 (reg:DI TILEGX_NETORDER_REG)]
5002 UNSPEC_NETWORK_RECEIVE)
5003 (match_operand:DI 2 "add_operand" "rO,I,JT")))
5004 (clobber (reg:DI TILEGX_NETORDER_REG))]
5009 addli\t%0, %N1, %H2"
5010 [(set_attr "type" "*,*,X01")])
5014 ;; Stack protector instructions.
5017 (define_expand "stack_protect_set"
5018 [(set (match_operand 0 "nonautoincmem_operand" "")
5019 (match_operand 1 "nonautoincmem_operand" ""))]
5022 #ifdef TARGET_THREAD_SSP_OFFSET
5023 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
5024 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
5025 rtx ssp = gen_reg_rtx (Pmode);
5027 emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
5029 operands[1] = gen_rtx_MEM (Pmode, ssp);
5033 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
5035 emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
5040 (define_insn "stack_protect_setsi"
5041 [(set (match_operand:SI 0 "nonautoincmem_operand" "=U")
5042 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")]
5044 (set (match_scratch:SI 2 "=&r") (const_int 0))]
5046 "ld4s\t%2, %1; { st4\t%0, %2; move\t%2, zero }"
5047 [(set_attr "length" "16")
5048 (set_attr "type" "cannot_bundle_3cycle")])
5050 (define_insn "stack_protect_setdi"
5051 [(set (match_operand:DI 0 "nonautoincmem_operand" "=U")
5052 (unspec:DI [(match_operand:DI 1 "nonautoincmem_operand" "U")]
5054 (set (match_scratch:DI 2 "=&r") (const_int 0))]
5056 "ld\t%2, %1; { st\t%0, %2; move\t%2, zero }"
5057 [(set_attr "length" "16")
5058 (set_attr "type" "cannot_bundle_3cycle")])
5060 (define_expand "stack_protect_test"
5061 [(match_operand 0 "nonautoincmem_operand" "")
5062 (match_operand 1 "nonautoincmem_operand" "")
5063 (match_operand 2 "" "")]
5069 #ifdef TARGET_THREAD_SSP_OFFSET
5070 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
5071 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
5072 rtx ssp = gen_reg_rtx (Pmode);
5074 emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
5076 operands[1] = gen_rtx_MEM (Pmode, ssp);
5079 compare_result = gen_reg_rtx (Pmode);
5082 emit_insn (gen_stack_protect_testsi (compare_result, operands[0],
5085 emit_insn (gen_stack_protect_testdi (compare_result, operands[0],
5088 bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx);
5090 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]);
5092 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
5093 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
5099 (define_insn "stack_protect_testsi"
5100 [(set (match_operand:SI 0 "register_operand" "=&r")
5101 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")
5102 (match_operand:SI 2 "nonautoincmem_operand" "U")]
5104 (set (match_scratch:SI 3 "=&r") (const_int 0))]
5106 "ld4s\t%0, %1; ld4s\t%3, %2; { cmpeq\t%0, %0, %3; move\t%3, zero }"
5107 [(set_attr "length" "24")
5108 (set_attr "type" "cannot_bundle_4cycle")])
5110 (define_insn "stack_protect_testdi"
5111 [(set (match_operand:DI 0 "register_operand" "=&r")
5112 (unspec:DI [(match_operand:DI 1 "nonautoincmem_operand" "U")
5113 (match_operand:DI 2 "nonautoincmem_operand" "U")]
5115 (set (match_scratch:DI 3 "=&r") (const_int 0))]
5117 "ld\t%0, %1; ld\t%3, %2; { cmpeq\t%0, %0, %3; move\t%3, zero }"
5118 [(set_attr "length" "24")
5119 (set_attr "type" "cannot_bundle_4cycle")])