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_remote,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]);
848 if (MEM_P (operands[1]))
850 HOST_WIDE_INT first_byte_offset, last_byte_offset;
852 if (GET_MODE (operands[1]) != QImode)
855 /* Reject bitfields that can be done with a normal load. */
856 if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
859 /* The value in memory cannot span more than 8 bytes. */
860 first_byte_offset = bit_offset / BITS_PER_UNIT;
861 last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
862 if (last_byte_offset - first_byte_offset > 7)
865 tilegx_expand_unaligned_load (operands[0], operands[1],
866 bit_width, bit_offset, 0);
871 operands[1] = force_reg (DImode, operands[1]);
875 /* Extracting the low bits is just a bitwise AND. */
876 HOST_WIDE_INT mask = ((HOST_WIDE_INT)1 << bit_width) - 1;
877 emit_insn (gen_anddi3 (operands[0], operands[1], GEN_INT (mask)));
887 ;; First step of the 3-insn sequence to materialize a symbolic
889 (define_expand "mov_address_step1"
890 [(set (match_operand:DI 0 "register_operand" "")
891 (const:DI (unspec:DI [(match_operand:DI 1 "symbolic_operand" "")]
894 ;; Second step of the 3-insn sequence to materialize a symbolic
896 (define_expand "mov_address_step2"
897 [(set (match_operand:DI 0 "register_operand" "")
899 [(match_operand:DI 1 "reg_or_0_operand" "")
900 (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
902 UNSPEC_INSN_ADDR_SHL16INSLI))])
904 ;; Third step of the 3-insn sequence to materialize a symbolic
906 (define_expand "mov_address_step3"
907 [(set (match_operand:DI 0 "register_operand" "")
909 [(match_operand:DI 1 "reg_or_0_operand" "")
910 (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
912 UNSPEC_INSN_ADDR_SHL16INSLI))])
914 ;; First step of the 2-insn sequence to materialize a 32-bit symbolic
916 (define_expand "mov_address_32bit_step1"
917 [(set (match_operand:SI 0 "register_operand" "")
918 (const:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "")]
921 ;; Second step of the 2-insn sequence to materialize a 32-bit symbolic
923 (define_expand "mov_address_32bit_step2"
924 [(set (match_operand:SI 0 "register_operand" "")
926 [(match_operand:SI 1 "reg_or_0_operand" "")
927 (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
929 UNSPEC_INSN_ADDR_SHL16INSLI))])
933 ;; pic related instructions
936 ;; NOTE: We compute the label in this unusual way because if we place
937 ;; the label after the lnk, whether it is at the same address as the
938 ;; lnk will vary depending on whether the optimization level chooses
939 ;; to insert bundling braces.
940 (define_insn "insn_lnk_and_label<bitsuffix>"
941 [(set (match_operand:I48MODE 0 "register_operand" "=r")
942 (unspec_volatile:I48MODE
943 [(match_operand:I48MODE 1 "symbolic_operand" "")]
944 UNSPEC_LNK_AND_LABEL))]
946 "%1 = . + 8\n\tlnk\t%0"
947 [(set_attr "type" "Y1")])
949 ;; The next three patterns are used to to materialize a position
950 ;; independent address by adding the difference of two labels to a
951 ;; base label in the text segment, assuming that the difference fits
952 ;; in 32 signed bits.
953 (define_expand "mov_pcrel_step1<bitsuffix>"
954 [(set (match_operand:I48MODE 0 "register_operand" "")
955 (const:I48MODE (unspec:I48MODE
956 [(match_operand:I48MODE 1 "symbolic_operand" "")
957 (match_operand:I48MODE 2 "symbolic_operand" "")]
958 UNSPEC_HW1_LAST_PCREL)))]
961 (define_expand "mov_pcrel_step2<bitsuffix>"
962 [(set (match_operand:I48MODE 0 "register_operand" "")
964 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
966 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")
967 (match_operand:I48MODE 3 "symbolic_operand" "")]
969 UNSPEC_INSN_ADDR_SHL16INSLI))]
972 (define_insn "mov_pcrel_step3<bitsuffix>"
973 [(set (match_operand:I48MODE 0 "register_operand" "=r")
974 (unspec:I48MODE [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
975 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")
976 (match_operand:I48MODE 3 "symbolic_operand" "in")
977 (match_operand:I48MODE 4 "symbolic_operand" "in")]
978 UNSPEC_MOV_PCREL_STEP3))]
980 "add<x>\t%0, %r1, %r2")
982 (define_expand "add_got16<bitsuffix>"
983 [(set (match_operand:I48MODE 0 "register_operand" "")
985 (match_operand:I48MODE 1 "reg_or_0_operand" "")
987 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
988 UNSPEC_HW0_LAST_GOT))))]
991 (define_expand "mov_got32_step1<bitsuffix>"
992 [(set (match_operand:I48MODE 0 "register_operand" "")
994 (unspec:I48MODE [(match_operand:I48MODE 1 "symbolic_operand" "")]
995 UNSPEC_HW1_LAST_GOT)))]
998 (define_expand "mov_got32_step2<bitsuffix>"
999 [(set (match_operand:I48MODE 0 "register_operand" "")
1001 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1003 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
1005 UNSPEC_INSN_ADDR_SHL16INSLI))]
1013 (define_expand "mov_tls_gd_step1<bitsuffix>"
1014 [(set (match_operand:I48MODE 0 "register_operand" "")
1016 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1017 UNSPEC_HW1_LAST_TLS_GD)))]
1020 (define_expand "mov_tls_gd_step2<bitsuffix>"
1021 [(set (match_operand:I48MODE 0 "register_operand" "")
1023 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1025 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1026 UNSPEC_HW0_TLS_GD))]
1027 UNSPEC_INSN_ADDR_SHL16INSLI))]
1030 (define_expand "mov_tls_ie_step1<bitsuffix>"
1031 [(set (match_operand:I48MODE 0 "register_operand" "")
1033 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1034 UNSPEC_HW1_LAST_TLS_IE)))]
1037 (define_expand "mov_tls_ie_step2<bitsuffix>"
1038 [(set (match_operand:I48MODE 0 "register_operand" "")
1040 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1042 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1043 UNSPEC_HW0_TLS_IE))]
1044 UNSPEC_INSN_ADDR_SHL16INSLI))]
1047 (define_expand "mov_tls_le_step1<bitsuffix>"
1048 [(set (match_operand:I48MODE 0 "register_operand" "")
1050 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1051 UNSPEC_HW1_LAST_TLS_LE)))]
1054 (define_expand "mov_tls_le_step2<bitsuffix>"
1055 [(set (match_operand:I48MODE 0 "register_operand" "")
1057 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1059 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1060 UNSPEC_HW0_TLS_LE))]
1061 UNSPEC_INSN_ADDR_SHL16INSLI))]
1064 (define_expand "tls_gd_call<bitsuffix>"
1066 [(set (reg:I48MODE 0)
1067 (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1069 UNSPEC_TLS_GD_CALL))
1070 (clobber (reg:I48MODE 25))
1071 (clobber (reg:I48MODE 26))
1072 (clobber (reg:I48MODE 27))
1073 (clobber (reg:I48MODE 28))
1074 (clobber (reg:I48MODE 29))
1075 (clobber (reg:I48MODE 55))])]
1078 cfun->machine->calls_tls_get_addr = true;
1081 (define_insn "*tls_gd_call<bitsuffix>"
1082 [(set (reg:I48MODE 0)
1083 (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1085 UNSPEC_TLS_GD_CALL))
1086 (clobber (reg:I48MODE 25))
1087 (clobber (reg:I48MODE 26))
1088 (clobber (reg:I48MODE 27))
1089 (clobber (reg:I48MODE 28))
1090 (clobber (reg:I48MODE 29))
1091 (clobber (reg:I48MODE 55))]
1093 "jal\ttls_gd_call(%0)"
1094 [(set_attr "type" "X1")])
1096 (define_insn "tls_gd_add<bitsuffix>"
1097 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1098 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1099 (match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1100 UNSPEC_TLS_GD_ADD))]
1102 "add<x>i\t%0, %1, tls_gd_add(%2)")
1104 (define_insn "tls_add<bitsuffix>"
1105 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1106 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1107 (match_operand:I48MODE 2 "register_operand" "0")
1108 (match_operand:I48MODE 3 "tls_symbolic_operand" "")]
1111 "add<x>i\t%0, %1, tls_add(%3)")
1113 (define_insn "tls_ie_load<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 "tls_symbolic_operand" "")]
1117 UNSPEC_TLS_IE_LOAD))]
1119 "ld<four_s_if_si>_tls\t%0, %1, tls_ie_load(%2)"
1120 [(set_attr "type" "X1_2cycle")])
1122 (define_insn "*zero_extract<mode>"
1123 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1124 (zero_extract:I48MODE
1125 (match_operand:I48MODE 1 "reg_or_0_operand" "r")
1126 (match_operand:I48MODE 2 "u6bit_cint_operand" "n")
1127 (match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
1129 "bfextu\t%0, %r1, %3, %3+%2-1"
1130 [(set_attr "type" "X0")])
1132 (define_insn "*sign_extract_low32"
1133 [(set (match_operand:DI 0 "register_operand" "=r")
1135 (match_operand:DI 1 "reg_or_0_operand" "r")
1136 (match_operand:DI 2 "u6bit_cint_operand" "n")
1137 (match_operand:DI 3 "u6bit_cint_operand" "n")))]
1138 "INTVAL (operands[3]) == 0 && INTVAL (operands[2]) == 32"
1139 "addxi\t%0, %r1, 0")
1141 (define_insn "*sign_extract"
1142 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1143 (sign_extract:I48MODE
1144 (match_operand:I48MODE 1 "reg_or_0_operand" "r")
1145 (match_operand:I48MODE 2 "u6bit_cint_operand" "n")
1146 (match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
1148 "bfexts\t%0, %r1, %3, %3+%2-1"
1149 [(set_attr "type" "X0")])
1156 (define_insn "add<mode>3"
1157 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1158 (plus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO,rO")
1159 (match_operand:I48MODE 2 "add_operand" "r,I,JT")))]
1162 add<x>\t%0, %r1, %r2
1163 add<x>i\t%0, %r1, %2
1164 add<x>li\t%0, %r1, %H2"
1165 [(set_attr "type" "*,*,X01")])
1167 (define_insn "*addsi3_sext"
1168 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1170 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO")
1171 (match_operand:SI 2 "add_operand" "r,I,JT"))))]
1176 addxli\t%0, %r1, %H2"
1177 [(set_attr "type" "*,*,X01")])
1179 (define_insn "sub<mode>3"
1180 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1181 (minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1182 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
1184 "sub<x>\t%0, %r1, %r2")
1186 (define_insn "*subsi3_sext"
1187 [(set (match_operand:DI 0 "register_operand" "=r")
1189 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1190 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1192 "subx\t%0, %r1, %r2")
1194 (define_insn "neg<mode>2"
1195 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1196 (neg:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO")))]
1198 "sub<x>\t%0, zero, %r1")
1200 (define_insn "*negsi2_sext"
1201 [(set (match_operand:DI 0 "register_operand" "=r")
1203 (neg:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))))]
1205 "subx\t%0, zero, %r1")
1207 (define_insn "ssaddsi3"
1208 [(set (match_operand:SI 0 "register_operand" "=r")
1209 (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1210 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
1212 "addxsc\t%0, %r1, %r2"
1213 [(set_attr "type" "X01")])
1215 (define_insn "*ssaddsi3_sext"
1216 [(set (match_operand:DI 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 "sssubsi3"
1225 [(set (match_operand:SI 0 "register_operand" "=r")
1226 (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1227 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
1229 "subxsc\t%0, %r1, %r2"
1230 [(set_attr "type" "X01")])
1232 (define_insn "*sssubsi3_sext"
1233 [(set (match_operand:DI 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_expand "addsf3"
1242 [(set (match_operand:SF 0 "register_operand" "")
1243 (plus:SF (match_operand:SF 1 "register_operand" "")
1244 (match_operand:SF 2 "register_operand" "")))]
1247 rtx result = gen_lowpart (DImode, operands[0]);
1248 rtx a = gen_lowpart (DImode, operands[1]);
1249 rtx b = gen_lowpart (DImode, operands[2]);
1251 rtx tmp = gen_reg_rtx (DImode);
1252 rtx flags = gen_reg_rtx (DImode);
1254 emit_insn (gen_insn_fsingle_add1 (tmp, a, b));
1255 emit_insn (gen_insn_fsingle_addsub2 (tmp, tmp, a, b));
1256 emit_insn (gen_insn_fsingle_pack1 (flags, tmp));
1257 emit_insn (gen_insn_fsingle_pack2 (result, tmp, flags));
1262 (define_expand "subsf3"
1263 [(set (match_operand:SF 0 "register_operand" "")
1264 (minus:SF (match_operand:SF 1 "register_operand" "")
1265 (match_operand:SF 2 "register_operand" "")))]
1268 rtx result = gen_lowpart (DImode, operands[0]);
1269 rtx a = gen_lowpart (DImode, operands[1]);
1270 rtx b = gen_lowpart (DImode, operands[2]);
1272 rtx tmp = gen_reg_rtx (DImode);
1273 rtx flags = gen_reg_rtx (DImode);
1275 emit_insn (gen_insn_fsingle_sub1 (tmp, a, b));
1276 emit_insn (gen_insn_fsingle_addsub2 (tmp, tmp, a, b));
1277 emit_insn (gen_insn_fsingle_pack1 (flags, tmp));
1278 emit_insn (gen_insn_fsingle_pack2 (result, tmp, flags));
1283 (define_expand "mulsf3"
1284 [(set (match_operand:SF 0 "register_operand" "")
1285 (mult:SF (match_operand:SF 1 "register_operand" "")
1286 (match_operand:SF 2 "register_operand" "")))]
1289 rtx result = gen_lowpart (DImode, operands[0]);
1290 rtx a = gen_lowpart (DImode, operands[1]);
1291 rtx b = gen_lowpart (DImode, operands[2]);
1293 rtx tmp1 = gen_reg_rtx (DImode);
1294 rtx tmp2 = gen_reg_rtx (DImode);
1295 rtx flags = gen_reg_rtx (DImode);
1297 emit_insn (gen_insn_fsingle_mul1 (tmp1, a, b));
1298 emit_insn (gen_insn_fsingle_mul2 (tmp2, tmp1, b));
1299 emit_insn (gen_insn_fsingle_pack1 (flags, tmp2));
1300 emit_insn (gen_insn_fsingle_pack2 (result, tmp2, flags));
1305 (define_expand "adddf3"
1306 [(set (match_operand:DF 0 "register_operand" "")
1307 (plus:DF (match_operand:DF 1 "register_operand" "")
1308 (match_operand:DF 2 "register_operand" "")))]
1311 rtx result = gen_lowpart (DImode, operands[0]);
1312 rtx a = gen_lowpart (DImode, operands[1]);
1313 rtx b = gen_lowpart (DImode, operands[2]);
1315 rtx min = gen_reg_rtx (DImode);
1316 rtx max = gen_reg_rtx (DImode);
1317 rtx flags = gen_reg_rtx (DImode);
1319 emit_insn (gen_insn_fdouble_unpack_min (min, a, b));
1320 emit_insn (gen_insn_fdouble_unpack_max (max, a, b));
1321 emit_insn (gen_insn_fdouble_add_flags (flags, a, b));
1322 emit_insn (gen_insn_fdouble_addsub (max, max, min, flags));
1323 emit_insn (gen_insn_fdouble_pack1 (result, max, flags));
1324 emit_insn (gen_insn_fdouble_pack2 (result, result, max, const0_rtx));
1329 (define_expand "subdf3"
1330 [(set (match_operand:DF 0 "register_operand" "")
1331 (minus:DF (match_operand:DF 1 "register_operand" "")
1332 (match_operand:DF 2 "register_operand" "")))]
1335 rtx result = gen_lowpart (DImode, operands[0]);
1336 rtx a = gen_lowpart (DImode, operands[1]);
1337 rtx b = gen_lowpart (DImode, operands[2]);
1339 rtx min = gen_reg_rtx (DImode);
1340 rtx max = gen_reg_rtx (DImode);
1341 rtx flags = gen_reg_rtx (DImode);
1343 emit_insn (gen_insn_fdouble_unpack_min (min, a, b));
1344 emit_insn (gen_insn_fdouble_unpack_max (max, a, b));
1345 emit_insn (gen_insn_fdouble_sub_flags (flags, a, b));
1346 emit_insn (gen_insn_fdouble_addsub (max, max, min, flags));
1347 emit_insn (gen_insn_fdouble_pack1 (result, max, flags));
1348 emit_insn (gen_insn_fdouble_pack2 (result, result, max, const0_rtx));
1353 (define_expand "muldf3"
1354 [(set (match_operand:DF 0 "register_operand" "")
1355 (mult:DF (match_operand:DF 1 "register_operand" "")
1356 (match_operand:DF 2 "register_operand" "")))]
1358 ;; TODO: Decide if we should not inline this with -Os.
1359 ;; "optimize_function_for_speed_p (cfun)"
1361 rtx result = gen_lowpart (DImode, operands[0]);
1362 rtx a = gen_lowpart (DImode, operands[1]);
1363 rtx b = gen_lowpart (DImode, operands[2]);
1365 rtx a_unpacked = gen_reg_rtx (DImode);
1366 rtx b_unpacked = gen_reg_rtx (DImode);
1367 rtx flags = gen_reg_rtx (DImode);
1369 rtx low1 = gen_reg_rtx (DImode);
1370 rtx low = gen_reg_rtx (DImode);
1371 rtx low_carry = gen_reg_rtx (DImode);
1373 rtx mid = gen_reg_rtx (DImode);
1374 rtx mid_l32 = gen_reg_rtx (DImode);
1375 rtx mid_r32 = gen_reg_rtx (DImode);
1377 rtx high1 = gen_reg_rtx (DImode);
1378 rtx high = gen_reg_rtx (DImode);
1379 rtx high1_plus_mid_r32 = gen_reg_rtx (DImode);
1381 /* NOTE: We compute using max(a, 0) and max(b, 0) rather than
1382 min(a, b) and max(a, b) because for multiply we just need to unpack,
1383 we don't actually care which is min and which is max. And this
1384 formulation gives the scheduler more freedom in case one of a or b
1385 would stall at the start of this code sequence. */
1386 emit_insn (gen_insn_fdouble_unpack_max (a_unpacked, a, const0_rtx));
1387 emit_insn (gen_insn_fdouble_unpack_max (b_unpacked, b, const0_rtx));
1388 emit_insn (gen_insn_fdouble_mul_flags (flags, a, b));
1390 /* This depends on the fact that the high few bits of the unpacked
1391 mantissa are zero, so we can't have a carry out from the mid sum. */
1392 emit_insn (gen_insn_mul_lu_lu (low1, a_unpacked, b_unpacked));
1393 emit_insn (gen_insn_mul_hu_lu (mid, a_unpacked, b_unpacked));
1394 emit_insn (gen_insn_mula_hu_lu (mid, mid, b_unpacked, a_unpacked));
1395 emit_insn (gen_insn_mul_hu_hu (high1, a_unpacked, b_unpacked));
1397 emit_insn (gen_ashldi3 (mid_l32, mid, GEN_INT (32)));
1398 emit_insn (gen_lshrdi3 (mid_r32, mid, GEN_INT (32)));
1400 emit_insn (gen_adddi3 (high1_plus_mid_r32, high1, mid_r32));
1402 emit_insn (gen_adddi3 (low, low1, mid_l32));
1403 emit_insn (gen_insn_cmpltu_didi (low_carry, low, mid_l32));
1405 emit_insn (gen_adddi3 (high, high1_plus_mid_r32, low_carry));
1407 emit_insn (gen_insn_fdouble_pack1 (result, high, flags));
1408 emit_insn (gen_insn_fdouble_pack2 (result, result, high, low));
1418 (define_insn "ashl<mode>3"
1419 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1421 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1422 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1425 shl<x>i\t%0, %r1, %2
1426 shl<x>\t%0, %r1, %r2"
1427 [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1429 (define_insn "*ashlsi3_sext"
1430 [(set (match_operand:DI 0 "register_operand" "=r,r")
1433 (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1434 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1439 [(set_attr "type" "X01,X01")])
1441 (define_insn "ashr<mode>3"
1442 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1444 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1445 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1449 shrs\t%0, %r1, %r2")
1451 (define_insn "*ashrsi3_sext"
1452 [(set (match_operand:DI 0 "register_operand" "=r,r")
1454 (ashiftrt:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1455 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1459 shrs\t%0, %r1, %r2")
1461 (define_insn "lshr<mode>3"
1462 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1464 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1465 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1468 shru<x>i\t%0, %r1, %2
1469 shru<x>\t%0, %r1, %r2"
1470 [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1472 (define_insn "*lshrsi3_sext"
1473 [(set (match_operand:DI 0 "register_operand" "=r,r")
1476 (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1477 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1481 shrux\t%0, %r1, %r2"
1482 [(set_attr "type" "X01,X01")])
1484 (define_insn "rotldi3"
1485 [(set (match_operand:DI 0 "register_operand" "=r,r")
1486 (rotate:DI (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1487 (match_operand:SI 2 "reg_or_u6bit_operand" "I,rO")))]
1491 rotl\t%0, %r1, %r2")
1493 (define_insn "insn_shl16insli"
1494 [(set (match_operand:DI 0 "register_operand" "=r,r")
1497 (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1499 (match_operand:DI 2 "u16bit_or_const_symbolic_operand" "O,KT")))]
1503 shl16insli\t%0, %r1, %H2"
1504 [(set_attr "type" "*,X01")])
1506 (define_insn "insn_addr_shl16insli<bitsuffix>"
1507 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1509 [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1510 (match_operand:I48MODE 2 "const_symbolic_operand" "T")]
1511 UNSPEC_INSN_ADDR_SHL16INSLI))]
1513 "shl16insli\t%0, %r1, %H2"
1514 [(set_attr "type" "X01")])
1521 (define_expand "cstore<mode>4"
1522 [(set (match_operand:DI 0 "register_operand" "")
1523 (match_operator:DI 1 "ordered_comparison_operator"
1524 [(match_operand:FI48MODE 2 "reg_or_cint_operand" "")
1525 (match_operand:FI48MODE 3 "reg_or_cint_operand" "")]))]
1528 if (!tilegx_emit_setcc (operands, GET_MODE (operands[2])))
1535 (define_insn "insn_cmpne_<I48MODE:mode><I48MODE2:mode>"
1536 [(set (match_operand:I48MODE2 0 "register_operand" "=r")
1537 (ne:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1538 (match_operand:I48MODE 2 "reg_or_cint_operand" "rO")))]
1540 "cmpne\t%0, %r1, %r2")
1542 (define_insn "insn_cmpeq_<I48MODE:mode><I48MODE2:mode>"
1543 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1544 (eq:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO")
1545 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1549 cmpeq\t%0, %r1, %r2")
1551 (define_insn "insn_cmplts_<I48MODE:mode><I48MODE2:mode>"
1552 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1553 (lt:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1554 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1557 cmpltsi\t%0, %r1, %2
1558 cmplts\t%0, %r1, %r2")
1560 (define_insn "insn_cmpltu_<I48MODE:mode><I48MODE2:mode>"
1561 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1562 (ltu:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1563 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1566 cmpltui\t%0, %r1, %2
1567 cmpltu\t%0, %r1, %r2"
1568 [(set_attr "type" "X01,*")])
1570 (define_insn "insn_cmples_<I48MODE:mode><I48MODE2:mode>"
1571 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1572 (le:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1573 (match_operand:I48MODE 2 "reg_or_cint_operand" "L,rO")))]
1576 cmpltsi\t%0, %r1, %P2
1577 cmples\t%0, %r1, %r2")
1579 (define_insn "insn_cmpleu_<I48MODE:mode><I48MODE2:mode>"
1580 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1581 (leu:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1582 (match_operand:I48MODE 2 "reg_or_cint_operand" "Q,rO")))]
1585 cmpltui\t%0, %r1, %P2
1586 cmpleu\t%0, %r1, %r2"
1587 [(set_attr "type" "X01,*")])
1594 (define_insn "and<mode>3"
1595 [(set (match_operand:IVNMODE 0 "register_operand" "=r,r,r,r")
1596 (and:IVNMODE (match_operand:IVNMODE 1 "reg_or_0_operand" "%rO,rO,0,rO")
1597 (match_operand:IVNMODE 2 "and_operand" "I,S,M,rO")))]
1601 bfextu\t%0, %r1, %M2
1602 bfins\t%0, zero, %m2
1604 [(set_attr "type" "*,X0,X0,*")])
1606 (define_insn "*andsi3_sext"
1607 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
1609 (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,0,rO")
1610 (match_operand:SI 2 "and_operand" "I,S,M,rO"))))]
1614 bfextu\t%0, %r1, %M2
1615 bfins\t%0, zero, %m2
1617 [(set_attr "type" "*,X0,X0,*")])
1619 (define_insn "anddi3"
1620 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r")
1621 (and:DI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO,rO,0,rO")
1622 (match_operand:DI 2 "and_operand" "I,Z0,Z1,S,M,rO")))]
1626 v4int_l\t%0, zero, %r1
1627 v4int_h\t%0, %r1, zero
1628 bfextu\t%0, %r1, %M2
1629 bfins\t%0, zero, %m2
1631 [(set_attr "type" "*,X01,X01,X0,X0,*")])
1633 (define_insn "ior<mode>3"
1634 [(set (match_operand:IVMODE 0 "register_operand" "=r,r")
1635 (ior:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "%rO,rO")
1636 (match_operand:IVMODE 2 "reg_or_s8bit_operand" "rO,I")))]
1641 [(set_attr "type" "*,X01")])
1643 (define_insn "*iorsi3_sext"
1644 [(set (match_operand:DI 0 "register_operand" "=r,r")
1646 (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1647 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1652 [(set_attr "type" "*,X01")])
1654 (define_insn "xor<mode>3"
1655 [(set (match_operand:IVMODE 0 "register_operand" "=r,r")
1656 (xor:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "%rO,rO")
1657 (match_operand:IVMODE 2 "reg_or_s8bit_operand" "rO,I")))]
1662 [(set_attr "type" "*,X01")])
1664 (define_insn "*xorsi3_sext"
1665 [(set (match_operand:DI 0 "register_operand" "=r,r")
1667 (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1668 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1673 [(set_attr "type" "*,X01")])
1675 (define_insn "clzdi2"
1676 [(set (match_operand:DI 0 "register_operand" "=r")
1677 (clz:DI (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1680 [(set_attr "type" "Y0")])
1682 (define_expand "clzsi2"
1684 (ashift:DI (match_operand:SI 1 "reg_or_0_operand" "")
1686 (set (subreg:DI (match_operand:SI 0 "register_operand" "") 0)
1687 (clz:DI (match_dup 2)))]
1690 operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);
1691 operands[2] = gen_reg_rtx (DImode);
1694 (define_insn "ctz<mode>2"
1695 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1696 (ctz:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1699 [(set_attr "type" "Y0")])
1701 (define_insn "popcount<mode>2"
1702 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1703 (popcount:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1706 [(set_attr "type" "Y0")])
1708 (define_expand "parity<mode>2"
1709 [(set (match_operand:I48MODE 0 "register_operand" "")
1710 (parity:I48MODE (match_operand:DI 1 "reg_or_0_operand" "")))]
1713 rtx tmp = gen_reg_rtx (<MODE>mode);
1714 emit_insn (gen_popcount<mode>2 (tmp, operands[1]));
1715 emit_insn (gen_and<mode>3 (operands[0], tmp, const1_rtx));
1719 (define_insn "bswapdi2"
1720 [(set (match_operand:DI 0 "register_operand" "=r")
1721 (bswap:DI (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1724 [(set_attr "type" "Y0")])
1726 (define_expand "bswapsi2"
1727 [(set (match_operand:SI 0 "register_operand" "")
1728 (bswap:SI (match_operand:SI 1 "reg_or_0_operand" "")))]
1731 rtx tmp = gen_reg_rtx (DImode);
1732 emit_insn (gen_bswapdi2 (tmp, gen_lowpart (DImode, operands[1])));
1733 emit_insn (gen_ashrdi3 (gen_lowpart (DImode, operands[0]),
1734 tmp, GEN_INT (32)));
1738 (define_insn "one_cmpl<mode>2"
1739 [(set (match_operand:IVMODE 0 "register_operand" "=r")
1740 (not:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "rO")))]
1742 "nor\t%0, %r1, zero")
1746 ;; Conditional moves
1749 (define_expand "mov<mode>cc"
1750 [(set (match_operand:I48MODE 0 "register_operand" "")
1751 (if_then_else:I48MODE
1752 (match_operand 1 "comparison_operator" "")
1753 (match_operand:I48MODE 2 "reg_or_0_operand" "")
1754 (match_operand:I48MODE 3 "reg_or_0_operand" "")))]
1756 { operands[1] = tilegx_emit_conditional_move (operands[1]); })
1758 (define_insn "movcc_insn_<I48MODE2:mode><I48MODE:mode>"
1759 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r,r")
1760 (if_then_else:I48MODE
1761 (match_operator 4 "eqne_operator"
1762 [(match_operand:I48MODE2 1 "reg_or_0_operand" "rO,rO,rO,rO")
1764 (match_operand:I48MODE 2 "reg_or_0_operand" "rO,O,rO,0")
1765 (match_operand:I48MODE 3 "reg_or_0_operand" "O,rO,0,rO")))]
1770 cmov%d4z\t%0, %r1, %r2
1771 cmov%D4z\t%0, %r1, %r3"
1772 [(set_attr "type" "*,*,Y0,Y0")])
1774 (define_expand "insn_mz"
1775 [(set (match_operand:DI 0 "register_operand" "")
1777 (eq (match_operand:DI 1 "reg_or_0_operand" "")
1779 (match_operand:DI 2 "reg_or_0_operand" "")
1782 (define_expand "insn_mnz"
1783 [(set (match_operand:DI 0 "register_operand" "")
1785 (ne (match_operand:DI 1 "reg_or_0_operand" "")
1787 (match_operand:DI 2 "reg_or_0_operand" "")
1790 (define_expand "insn_cmoveqz"
1791 [(set (match_operand:DI 0 "register_operand" "")
1793 (eq (match_operand:DI 2 "reg_or_0_operand" "")
1795 (match_operand:DI 3 "reg_or_0_operand" "")
1796 (match_operand:DI 1 "reg_or_0_operand" "")))])
1798 (define_expand "insn_cmovnez"
1799 [(set (match_operand:DI 0 "register_operand" "")
1801 (ne (match_operand:DI 2 "reg_or_0_operand" "")
1803 (match_operand:DI 3 "reg_or_0_operand" "")
1804 (match_operand:DI 1 "reg_or_0_operand" "")))])
1811 (define_insn "zero_extendqi<mode>2"
1812 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1813 (zero_extend:I48MODE (match_operand:QI 1 "move_operand" "rO,U,m")))]
1816 bfextu\t%0, %r1, 0, 7
1818 ld1u_add\t%0, %I1, %i1"
1819 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1821 (define_insn "zero_extendhi<mode>2"
1822 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1823 (zero_extend:I48MODE (match_operand:HI 1 "move_operand" "rO,U,m")))]
1826 bfextu\t%0, %r1, 0, 15
1828 ld2u_add\t%0, %I1, %i1"
1829 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1831 (define_insn "zero_extendsidi2"
1832 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1833 (zero_extend:DI (match_operand:SI 1 "move_operand" "rO,U,m")))]
1836 v4int_l\t%0, zero, %r1
1838 ld4u_add\t%0, %I1, %i1"
1839 [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
1841 (define_insn "extendqi<mode>2"
1842 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1843 (sign_extend:I48MODE (match_operand:QI 1 "move_operand" "rO,U,m")))]
1846 bfexts\t%0, %r1, 0, 7
1848 ld1s_add\t%0, %I1, %i1"
1849 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1851 (define_insn "extendhi<mode>2"
1852 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1853 (sign_extend:I48MODE (match_operand:HI 1 "move_operand" "rO,U,m")))]
1856 bfexts\t%0, %r1, 0, 15
1858 ld2s_add\t%0, %I1, %i1"
1859 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1861 ;; All SImode integer registers should already be in sign-extended
1862 ;; form (see TRULY_NOOP_TRUNCATION and truncdisi2). We can therefore
1863 ;; get rid of register->register instructions if we constrain the
1864 ;; source to be in the same register as the destination.
1865 (define_insn_and_split "extendsidi2"
1866 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1867 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "0,U,m")))]
1872 ld4s_add\t%0, %I1, %i1"
1873 "&& reload_completed && register_operand (operands[1], VOIDmode)"
1876 emit_note (NOTE_INSN_DELETED);
1879 [(set_attr "type" "*,Y2_2cycle,X1_2cycle")])
1881 ;; Integer truncation patterns. Truncating SImode values to smaller
1882 ;; modes is a no-op, as it is for most other GCC ports. Truncating
1883 ;; DImode values to SImode is not a no-op since we
1884 ;; need to make sure that the lower 32 bits are properly sign-extended
1885 ;; (see TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
1886 ;; smaller than SImode is equivalent to two separate truncations:
1889 ;; DI ---> HI == DI ---> SI ---> HI
1890 ;; DI ---> QI == DI ---> SI ---> QI
1892 ;; Step A needs a real instruction but step B does not.
1894 (define_insn "truncdisi2"
1895 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,U,m")
1896 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1901 st4_add\t%I0, %r1, %i0"
1902 [(set_attr "type" "Y01,Y2,X1")])
1904 (define_insn "truncdihi2"
1905 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,U,m")
1906 (truncate:HI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1911 st2_add\t%I0, %r1, %i0"
1912 [(set_attr "type" "Y01,Y2,X1")])
1914 (define_insn "truncdiqi2"
1915 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,U,m")
1916 (truncate:QI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1921 st1_add\t%I0, %r1, %i0"
1922 [(set_attr "type" "Y01,Y2,X1")])
1924 ;; Combiner patterns to optimize away unnecessary truncates.
1926 (define_insn "*zero_extendsidi_truncdisi"
1927 [(set (match_operand:DI 0 "register_operand" "=r")
1929 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))))]
1931 "v4int_l\t%0, zero, %r1"
1932 [(set_attr "type" "X01")])
1934 (define_insn "*addsi_truncdisi"
1935 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1937 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO"))
1938 (match_operand:SI 2 "add_operand" "r,I,JT")))]
1943 addxli\t%0, %r1, %H2"
1944 [(set_attr "type" "*,*,X01")])
1946 (define_insn "*addsi_truncdisi2"
1947 [(set (match_operand:SI 0 "register_operand" "=r")
1949 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1950 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1952 "addx\t%0, %r1, %r2")
1954 (define_insn "*ashldi_truncdisi"
1955 [(set (match_operand:DI 0 "register_operand" "=r")
1957 (match_operand:DI 1 "reg_or_0_operand" "rO")
1958 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1960 "shl\t%0, %r1, %r2")
1962 (define_insn "*ashlsi_truncdisi"
1963 [(set (match_operand:SI 0 "register_operand" "=r,r")
1965 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
1966 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
1971 [(set_attr "type" "X01,X01")])
1973 (define_insn "*ashlsi_truncdisi2"
1974 [(set (match_operand:SI 0 "register_operand" "=r")
1976 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1977 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1979 "shlx\t%0, %r1, %r2"
1980 [(set_attr "type" "X01")])
1982 (define_insn "*ashrdi3_truncdisi"
1983 [(set (match_operand:DI 0 "register_operand" "=r")
1985 (match_operand:DI 1 "reg_or_0_operand" "rO")
1986 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1988 "shrs\t%0, %r1, %r2")
1990 (define_insn "*lshrsi_truncdisi"
1991 [(set (match_operand:SI 0 "register_operand" "=r,r")
1993 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
1994 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
1998 shrux\t%0, %r1, %r2"
1999 [(set_attr "type" "X01,X01")])
2001 (define_insn "*lshrsi_truncdisi2"
2002 [(set (match_operand:SI 0 "register_operand" "=r")
2004 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
2005 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
2007 "shrux\t%0, %r1, %r2"
2008 [(set_attr "type" "X01")])
2010 (define_insn "*lshrdi_truncdisi"
2011 [(set (match_operand:DI 0 "register_operand" "=r")
2013 (match_operand:DI 1 "reg_or_0_operand" "rO")
2014 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2016 "shru\t%0, %r1, %r2")
2018 (define_insn "*rotldi_truncdisi"
2019 [(set (match_operand:DI 0 "register_operand" "=r")
2021 (match_operand:DI 1 "reg_or_0_operand" "rO")
2022 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2024 "rotl\t%0, %r1, %r2")
2031 (define_insn "mulsi3"
2032 [(set (match_operand:SI 0 "register_operand" "=r")
2033 (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rO")
2034 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
2036 "mulx\t%0, %r1, %r2"
2037 [(set_attr "type" "Y0_2cycle")])
2039 (define_insn "mulsidi3"
2040 [(set (match_operand:DI 0 "register_operand" "=r")
2041 (mult:DI (sign_extend:DI
2042 (match_operand:SI 1 "reg_or_0_operand" "%rO"))
2044 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2046 "mul_ls_ls\t%0, %r1, %r2"
2047 [(set_attr "type" "Y0_2cycle")])
2049 (define_insn "umulsidi3"
2050 [(set (match_operand:DI 0 "register_operand" "=r")
2051 (mult:DI (zero_extend:DI
2052 (match_operand:SI 1 "reg_or_0_operand" "%rO"))
2054 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2056 "mul_lu_lu\t%0, %r1, %r2"
2057 [(set_attr "type" "Y0_2cycle")])
2059 (define_expand "muldi3"
2060 [(set (match_operand:DI 0 "register_operand" "")
2061 (unspec:DI [(match_operand:DI 1 "nonmemory_operand" "")
2062 (match_operand:DI 2 "nonmemory_operand" "")]
2063 UNSPEC_INSN_MUL_HU_LU))
2065 (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2066 UNSPEC_INSN_MULA_HU_LU))
2068 (ashift:DI (match_dup 0) (const_int 32)))
2070 (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2071 UNSPEC_INSN_MULA_LU_LU))]
2074 operands[1] = force_reg (DImode, operands[1]);
2075 operands[1] = make_safe_from (operands[1], operands[0]);
2077 if (tilegx_expand_muldi (operands[0], operands[1], operands[2]))
2081 operands[2] = force_reg (DImode, operands[2]);
2082 operands[2] = make_safe_from (operands[2], operands[0]);
2086 (define_insn "usmulsidi3"
2087 [(set (match_operand:DI 0 "register_operand" "=r")
2088 (mult:DI (zero_extend:DI
2089 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2091 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2093 "mul_ls_lu\t%0, %r2, %r1"
2094 [(set_attr "type" "X0_2cycle")])
2096 (define_insn "maddsidi4"
2097 [(set (match_operand:DI 0 "register_operand" "=r")
2099 (mult:DI (sign_extend:DI
2100 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2102 (match_operand:SI 2 "reg_or_0_operand" "rO")))
2103 (match_operand:DI 3 "register_operand" "0")))]
2105 "mula_ls_ls\t%0, %r1, %r2"
2106 [(set_attr "type" "Y0_2cycle")])
2108 (define_insn "umaddsidi4"
2109 [(set (match_operand:DI 0 "register_operand" "=r")
2111 (mult:DI (zero_extend:DI
2112 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2114 (match_operand:SI 2 "reg_or_0_operand" "rO")))
2115 (match_operand:DI 3 "register_operand" "0")))]
2117 "mula_lu_lu\t%0, %r1, %r2"
2118 [(set_attr "type" "Y0_2cycle")])
2120 (define_expand "smulsi3_highpart"
2122 (mult:DI (sign_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
2123 (sign_extend:DI (match_operand:SI 2 "reg_or_0_operand" ""))))
2125 (ashiftrt:DI (match_dup 3) (const_int 32)))
2126 (set (match_operand:SI 0 "register_operand" "")
2127 (truncate:SI (match_dup 4)))]
2130 operands[3] = gen_reg_rtx (DImode);
2131 operands[4] = gen_reg_rtx (DImode);
2134 (define_expand "umulsi3_highpart"
2136 (mult:DI (zero_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
2137 (zero_extend:DI (match_operand:SI 2 "reg_or_0_operand" ""))))
2139 (lshiftrt:DI (match_dup 3) (const_int 32)))
2140 (set (match_operand:SI 0 "register_operand" "")
2141 (truncate:SI (match_dup 4)))]
2144 operands[3] = gen_reg_rtx (DImode);
2145 operands[4] = gen_reg_rtx (DImode);
2148 (define_expand "smuldi3_highpart"
2149 [(set (match_operand:DI 0 "register_operand" "")
2152 (mult:TI (sign_extend:TI (match_operand:DI 1 "reg_or_0_operand" ""))
2153 (sign_extend:TI (match_operand:DI 2 "reg_or_0_operand" "")))
2157 tilegx_expand_smuldi3_highpart (operands[0], operands[1], operands[2]);
2161 (define_expand "umuldi3_highpart"
2162 [(set (match_operand:DI 0 "register_operand" "")
2165 (mult:TI (zero_extend:TI (match_operand:DI 1 "reg_or_0_operand" ""))
2166 (zero_extend:TI (match_operand:DI 2 "reg_or_0_operand" "")))
2170 tilegx_expand_umuldi3_highpart (operands[0], operands[1], operands[2]);
2176 ;; Divide stubs. These exist to work around a bug in expmed.c, which
2177 ;; will not attempt to convert a divide by constant into a multiply
2178 ;; unless there is a pattern for a divide of the same mode. The end
2179 ;; result is a 32-bit divide turns into 64-bit multiply.
2182 (define_expand "divsi3"
2183 [(set (match_operand:SI 0 "register_operand" "")
2184 (div:SI (match_operand:SI 1 "reg_or_0_operand" "")
2185 (match_operand:SI 2 "reg_or_0_operand" "")))]
2191 (define_expand "udivsi3"
2192 [(set (match_operand:SI 0 "register_operand" "")
2193 (udiv:SI (match_operand:SI 1 "reg_or_0_operand" "")
2194 (match_operand:SI 2 "reg_or_0_operand" "")))]
2205 ;; Define the subtract-one-and-jump insns so loop.c knows what to
2207 (define_expand "doloop_end"
2208 [(use (match_operand 0 "" "")) ;; loop pseudo
2209 (use (match_operand 1 "" "")) ;; iterations; zero if unknown
2210 (use (match_operand 2 "" "")) ;; max iterations
2211 (use (match_operand 3 "" "")) ;; loop level
2212 (use (match_operand 4 "" ""))] ;; label
2215 if (optimize > 0 && flag_modulo_sched)
2220 enum machine_mode mode = GET_MODE (operands[0]);
2222 /* only do inner loop */
2223 if (INTVAL (operands[3]) > 1)
2225 /* only deal with loop counters in SImode or DImode */
2226 if (mode != SImode && mode != DImode)
2230 emit_move_insn (s0, gen_rtx_PLUS (mode, s0, GEN_INT (-1)));
2231 bcomp = gen_rtx_NE(mode, s0, const0_rtx);
2232 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [4]);
2233 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
2234 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
2244 ;; Prologue/epilogue
2246 (define_expand "prologue"
2250 tilegx_expand_prologue ();
2254 (define_expand "epilogue"
2258 tilegx_expand_epilogue (false);
2262 (define_expand "sibcall_epilogue"
2266 tilegx_expand_epilogue (true);
2271 ;; Stack manipulations
2274 ;; An insn to allocate new stack space for dynamic use (e.g., alloca).
2275 (define_expand "allocate_stack"
2276 [(set (match_operand 0 "register_operand" "")
2277 (minus (reg 54) (match_operand 1 "nonmemory_operand" "")))
2279 (minus (reg 54) (match_dup 1)))]
2281 "tilegx_allocate_stack (operands[0], operands[1]); DONE;")
2287 (define_expand "call"
2288 [(parallel [(call (match_operand:DI 0 "call_operand" "")
2289 (match_operand 1 "" ""))
2291 (clobber (reg:DI 55))])]
2295 (define_insn "*call_insn"
2296 [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2297 (match_operand 1 "" ""))
2299 (clobber (reg:DI 55))]
2304 [(set_attr "type" "Y1,X1")])
2306 (define_expand "call_value"
2307 [(parallel [(set (match_operand 0 "register_operand" "")
2308 (call (match_operand:DI 1 "call_operand" "")
2309 (match_operand 2 "" "")))
2311 (clobber (reg:DI 55))])]
2314 (define_insn "*call_value_insn"
2315 [(set (match_operand 0 "register_operand" "=r,r")
2316 (call (mem:DI (match_operand:I48MODE 1 "call_address_operand" "rO,i"))
2317 (match_operand 2 "" "")))
2319 (clobber (reg:DI 55))]
2324 [(set_attr "type" "Y1,X1")])
2326 (define_expand "sibcall"
2327 [(parallel [(call (match_operand:DI 0 "call_operand" "")
2328 (match_operand 1 "" ""))
2329 (use (reg:DI 54))])]
2333 (define_insn "*sibcall_insn"
2334 [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2335 (match_operand 1 "" ""))
2337 "SIBLING_CALL_P(insn)"
2341 [(set_attr "type" "X1,X1")])
2343 (define_expand "sibcall_value"
2344 [(parallel [(set (match_operand 0 "" "")
2345 (call (match_operand:DI 1 "call_operand" "")
2346 (match_operand 2 "" "")))
2347 (use (reg:DI 54))])]
2351 (define_insn "*sibcall_value"
2352 [(set (match_operand 0 "" "")
2353 (call (mem:DI (match_operand:I48MODE 1 "call_address_operand" "rO,i"))
2354 (match_operand 2 "" "")))
2356 "SIBLING_CALL_P(insn)"
2360 [(set_attr "type" "X1,X1")])
2363 [(set (pc) (label_ref (match_operand 0 "" "")))]
2366 [(set_attr "type" "X1")])
2368 (define_insn "indirect_jump"
2369 [(set (pc) (match_operand 0 "pointer_operand" "rO"))]
2372 [(set_attr "type" "Y1")])
2374 (define_expand "return"
2377 (use (reg:DI 55))])]
2378 "tilegx_can_use_return_insn_p ()"
2381 (define_insn "_return"
2386 [(set_attr "type" "Y1")])
2388 (define_expand "tablejump"
2389 [(set (pc) (match_operand 0 "pointer_operand" ""))
2390 (use (label_ref (match_operand 1 "" "")))]
2393 tilegx_expand_tablejump (operands[0], operands[1]);
2397 (define_insn "tablejump_aux"
2398 [(set (pc) (match_operand 0 "pointer_operand" "rO"))
2399 (use (label_ref (match_operand 1 "" "")))]
2402 [(set_attr "type" "Y1")])
2404 ;; Call subroutine returning any type.
2405 (define_expand "untyped_call"
2406 [(parallel [(call (match_operand 0 "" "")
2408 (match_operand 1 "" "")
2409 (match_operand 2 "" "")])]
2414 emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
2416 for (i = 0; i < XVECLEN (operands[2], 0); i++)
2418 rtx set = XVECEXP (operands[2], 0, i);
2419 emit_move_insn (SET_DEST (set), SET_SRC (set));
2422 /* The optimizer does not know that the call sets the function value
2423 registers we stored in the result block. We avoid problems by
2424 claiming that all hard registers are used and clobbered at this
2426 emit_insn (gen_blockage ());
2431 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers
2432 ;; and all of memory. This blocks insns from being moved across this
2434 (define_insn "blockage"
2435 [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
2438 [(set_attr "type" "nothing")
2439 (set_attr "length" "0")])
2441 ;; Internal expanders to prevent memory ops from moving around frame
2442 ;; allocation/deallocation.
2444 ;; TODO: really this clobber should just clobber the frame memory. Is
2445 ;; this possibly by clobbering memory @ the sp reg (as alpha does?)
2446 ;; or by explicitly setting the alias set to the frame?
2447 (define_insn "sp_adjust"
2448 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
2450 (match_operand:DI 1 "register_operand" "%r,r,r")
2451 (match_operand:DI 2 "add_operand" "r,I,JT")))
2452 (clobber (mem:BLK (scratch)))]
2458 [(set_attr "type" "*,*,X01")])
2460 (define_insn "sp_adjust_32bit"
2461 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
2463 (match_operand:SI 1 "register_operand" "%r,r,r")
2464 (match_operand:SI 2 "add_operand" "r,I,JT")))
2465 (clobber (mem:BLK (scratch)))]
2470 addxli\t%0, %1, %H2"
2471 [(set_attr "type" "*,*,X01")])
2473 ;; Used for move sp, r52, to pop a stack frame. We need to make sure
2474 ;; that stack frame memory operations have been issued before we do
2475 ;; this. TODO: see above TODO.
2476 (define_insn "sp_restore<bitsuffix>"
2477 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2478 (match_operand:I48MODE 1 "register_operand" "r"))
2479 (clobber (mem:BLK (scratch)))]
2487 [(set_attr "type" "Y01")])
2491 ;; Conditional branches
2494 (define_expand "cbranch<mode>4"
2496 (if_then_else (match_operator 0 "ordered_comparison_operator"
2497 [(match_operand:FI48MODE 1 "reg_or_cint_operand")
2498 (match_operand:FI48MODE 2 "reg_or_cint_operand")])
2499 (label_ref (match_operand 3 ""))
2503 tilegx_emit_conditional_branch (operands, GET_MODE (operands[1]));
2507 (define_insn "*bcc_normal<mode>"
2510 (match_operator 1 "signed_comparison_operator"
2511 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2513 (label_ref (match_operand 0 "" ""))
2516 { return tilegx_output_cbranch (insn, operands, false); }
2517 [(set_attr "type" "X1_branch")])
2519 (define_insn "*bcc_reverse<mode>"
2522 (match_operator 1 "signed_comparison_operator"
2523 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2526 (label_ref (match_operand 0 "" ""))))]
2528 { return tilegx_output_cbranch (insn, operands, true); }
2529 [(set_attr "type" "X1_branch")])
2531 (define_insn "*blbs_normal<mode>"
2534 (ne (zero_extract:I48MODE
2535 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2539 (label_ref (match_operand 0 "" ""))
2542 { return tilegx_output_cbranch_with_opcode (insn, operands, "blbs", "blbc",
2544 [(set_attr "type" "X1_branch")])
2546 (define_insn "*blbc_normal<mode>"
2549 (eq (zero_extract:I48MODE
2550 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2554 (label_ref (match_operand 0 "" ""))
2557 { return tilegx_output_cbranch_with_opcode (insn, operands, "blbc", "blbs",
2559 [(set_attr "type" "X1_branch")])
2561 ;; Note that __insn_mf() expands to this.
2562 (define_expand "memory_barrier"
2564 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2567 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
2568 MEM_VOLATILE_P (operands[0]) = 1;
2571 (define_insn "*memory_barrier"
2572 [(set (match_operand:BLK 0 "" "")
2573 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2576 [(set_attr "type" "X1")])
2578 (define_insn "prefetch"
2579 [(prefetch (match_operand 0 "address_operand" "rO")
2580 (match_operand 1 "const_int_operand" "")
2581 (match_operand 2 "const_int_operand" ""))]
2584 switch (INTVAL (operands[2]))
2587 case 1: return "prefetch_l3\t%r0";
2588 case 2: return "prefetch_l2\t%r0";
2589 case 3: return "prefetch_l1\t%r0";
2590 default: gcc_unreachable ();
2593 [(set_attr "type" "Y2")])
2597 ;; "__insn" Intrinsics (some expand directly to normal patterns above).
2600 (define_insn "insn_bfexts"
2601 [(set (match_operand:DI 0 "register_operand" "=r")
2602 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2603 (match_operand:DI 2 "u6bit_cint_operand" "n")
2604 (match_operand:DI 3 "u6bit_cint_operand" "n")]
2605 UNSPEC_INSN_BFEXTS))]
2607 "bfexts\t%0, %r1, %2, %3"
2608 [(set_attr "type" "X0")])
2610 (define_insn "insn_bfextu"
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_BFEXTU))]
2617 "bfextu\t%0, %r1, %2, %3"
2618 [(set_attr "type" "X0")])
2620 (define_insn "insn_bfins"
2621 [(set (match_operand:DI 0 "register_operand" "=r")
2622 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2623 (match_operand:DI 2 "reg_or_0_operand" "rO")
2624 (match_operand:DI 3 "u6bit_cint_operand" "n")
2625 (match_operand:DI 4 "u6bit_cint_operand" "n")]
2626 UNSPEC_INSN_BFINS))]
2628 "bfins\t%0, %r2, %3, %4"
2629 [(set_attr "type" "X0")])
2631 (define_insn "insn_cmpexch<four_if_si>"
2632 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2633 (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))
2634 (set (mem:I48MODE (match_dup 1))
2635 (unspec_volatile:I48MODE
2636 [(mem:I48MODE (match_dup 1))
2637 (reg:I48MODE TILEGX_CMPEXCH_REG)
2638 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")]
2639 UNSPEC_INSN_CMPEXCH))]
2641 "cmpexch<four_if_si>\t%0, %r1, %r2"
2642 [(set_attr "type" "X1_remote")])
2644 (define_insn "insn_cmul"
2645 [(set (match_operand:DI 0 "register_operand" "=r")
2646 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2647 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2650 "cmul\t%0, %r1, %r2"
2651 [(set_attr "type" "X0_2cycle")])
2653 (define_insn "insn_cmula"
2654 [(set (match_operand:DI 0 "register_operand" "=r")
2655 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2656 (match_operand:DI 2 "reg_or_0_operand" "rO")
2657 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2658 UNSPEC_INSN_CMULA))]
2660 "cmula\t%0, %r2, %r3"
2661 [(set_attr "type" "X0_2cycle")])
2663 (define_insn "insn_cmulaf"
2664 [(set (match_operand:DI 0 "register_operand" "=r")
2665 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2666 (match_operand:DI 2 "reg_or_0_operand" "rO")
2667 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2668 UNSPEC_INSN_CMULAF))]
2670 "cmulaf\t%0, %r2, %r3"
2671 [(set_attr "type" "X0_2cycle")])
2673 (define_insn "insn_cmulf"
2674 [(set (match_operand:DI 0 "register_operand" "=r")
2675 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2676 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2677 UNSPEC_INSN_CMULF))]
2679 "cmulf\t%0, %r1, %r2"
2680 [(set_attr "type" "X0_2cycle")])
2682 (define_insn "insn_cmulfr"
2683 [(set (match_operand:DI 0 "register_operand" "=r")
2684 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2685 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2686 UNSPEC_INSN_CMULFR))]
2688 "cmulfr\t%0, %r1, %r2"
2689 [(set_attr "type" "X0_2cycle")])
2691 (define_insn "insn_cmulh"
2692 [(set (match_operand:DI 0 "register_operand" "=r")
2693 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2694 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2695 UNSPEC_INSN_CMULH))]
2697 "cmulh\t%0, %r1, %r2"
2698 [(set_attr "type" "X0_2cycle")])
2700 (define_insn "insn_cmulhr"
2701 [(set (match_operand:DI 0 "register_operand" "=r")
2702 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2703 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2704 UNSPEC_INSN_CMULHR))]
2706 "cmulhr\t%0, %r1, %r2"
2707 [(set_attr "type" "X0_2cycle")])
2709 (define_insn "insn_crc32_32"
2710 [(set (match_operand:DI 0 "register_operand" "=r")
2711 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2712 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2713 UNSPEC_INSN_CRC32_32))]
2715 "crc32_32\t%0, %r1, %r2"
2716 [(set_attr "type" "X0")])
2718 (define_insn "insn_crc32_8"
2719 [(set (match_operand:DI 0 "register_operand" "=r")
2720 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2721 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2722 UNSPEC_INSN_CRC32_8))]
2724 "crc32_8\t%0, %r1, %r2"
2725 [(set_attr "type" "X0")])
2727 (define_insn "insn_dblalign"
2728 [(set (match_operand:DI 0 "register_operand" "=r")
2729 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2730 (match_operand:DI 2 "reg_or_0_operand" "rO")
2731 (match_operand 3 "pointer_operand" "rO")]
2732 UNSPEC_INSN_DBLALIGN))]
2734 "dblalign\t%0, %r2, %r3"
2735 [(set_attr "type" "X0")])
2737 (define_insn "insn_dblalign2"
2738 [(set (match_operand:DI 0 "register_operand" "=r")
2739 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2740 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2741 UNSPEC_INSN_DBLALIGN2))]
2743 "dblalign2\t%0, %r1, %r2"
2744 [(set_attr "type" "X01")])
2746 (define_insn "insn_dblalign4"
2747 [(set (match_operand:DI 0 "register_operand" "=r")
2748 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2749 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2750 UNSPEC_INSN_DBLALIGN4))]
2752 "dblalign4\t%0, %r1, %r2"
2753 [(set_attr "type" "X01")])
2755 (define_insn "insn_dblalign6"
2756 [(set (match_operand:DI 0 "register_operand" "=r")
2757 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2758 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2759 UNSPEC_INSN_DBLALIGN6))]
2761 "dblalign6\t%0, %r1, %r2"
2762 [(set_attr "type" "X01")])
2764 (define_insn "insn_dtlbpr"
2765 [(unspec_volatile:VOID [(match_operand:DI 0 "reg_or_0_operand" "rO")]
2766 UNSPEC_INSN_DTLBPR)]
2769 [(set_attr "type" "X1")])
2771 (define_insn "insn_exch<four_if_si>"
2772 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2773 (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))
2774 (set (mem:I48MODE (match_dup 1))
2775 (unspec_volatile:I48MODE
2776 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")]
2779 "exch<four_if_si>\t%0, %r1, %r2"
2780 [(set_attr "type" "X1_remote")])
2782 (define_insn "insn_fdouble_add_flags"
2783 [(set (match_operand:DI 0 "register_operand" "=r")
2784 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2785 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2786 UNSPEC_INSN_FDOUBLE_ADD_FLAGS))]
2788 "fdouble_add_flags\t%0, %r1, %r2"
2789 [(set_attr "type" "X0_2cycle")])
2791 (define_insn "insn_fdouble_addsub"
2792 [(set (match_operand:DI 0 "register_operand" "=r")
2793 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2794 (match_operand:DI 2 "reg_or_0_operand" "rO")
2795 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2796 UNSPEC_INSN_FDOUBLE_ADDSUB))]
2798 "fdouble_addsub\t%0, %r2, %r3"
2799 [(set_attr "type" "X0_2cycle")])
2801 (define_insn "insn_fdouble_mul_flags"
2802 [(set (match_operand:DI 0 "register_operand" "=r")
2803 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2804 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2805 UNSPEC_INSN_FDOUBLE_MUL_FLAGS))]
2807 "fdouble_mul_flags\t%0, %r1, %r2"
2808 [(set_attr "type" "X0_2cycle")])
2810 (define_insn "insn_fdouble_pack1"
2811 [(set (match_operand:DI 0 "register_operand" "=r")
2812 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2813 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2814 UNSPEC_INSN_FDOUBLE_PACK1))]
2816 "fdouble_pack1\t%0, %r1, %r2"
2817 [(set_attr "type" "X0_2cycle")])
2819 (define_insn "insn_fdouble_pack2"
2820 [(set (match_operand:DI 0 "register_operand" "=r")
2821 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2822 (match_operand:DI 2 "reg_or_0_operand" "rO")
2823 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2824 UNSPEC_INSN_FDOUBLE_PACK2))]
2826 "fdouble_pack2\t%0, %r2, %r3"
2827 [(set_attr "type" "X0_2cycle")])
2829 (define_insn "insn_fdouble_sub_flags"
2830 [(set (match_operand:DI 0 "register_operand" "=r")
2831 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2832 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2833 UNSPEC_INSN_FDOUBLE_SUB_FLAGS))]
2835 "fdouble_sub_flags\t%0, %r1, %r2"
2836 [(set_attr "type" "X0_2cycle")])
2838 (define_insn "insn_fdouble_unpack_max"
2839 [(set (match_operand:DI 0 "register_operand" "=r")
2840 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2841 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2842 UNSPEC_INSN_FDOUBLE_UNPACK_MAX))]
2844 "fdouble_unpack_max\t%0, %r1, %r2"
2845 [(set_attr "type" "X0_2cycle")])
2847 (define_insn "insn_fdouble_unpack_min"
2848 [(set (match_operand:DI 0 "register_operand" "=r")
2849 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2850 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2851 UNSPEC_INSN_FDOUBLE_UNPACK_MIN))]
2853 "fdouble_unpack_min\t%0, %r1, %r2"
2854 [(set_attr "type" "X0_2cycle")])
2856 (define_insn "insn_fetchadd<four_if_si>"
2857 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2858 (unspec_volatile:I48MODE
2859 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2861 (set (mem:I48MODE (match_dup 1))
2862 (plus:I48MODE (mem:I48MODE (match_dup 1))
2863 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2865 "fetchadd<four_if_si>\t%0, %r1, %r2"
2866 [(set_attr "type" "X1_remote")])
2868 (define_insn "insn_fetchaddgez<four_if_si>"
2869 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2870 (unspec_volatile:I48MODE
2871 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2873 (set (mem:I48MODE (match_dup 1))
2874 (unspec:I48MODE [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2875 (mem:I48MODE (match_dup 1))]
2876 UNSPEC_INSN_FETCHADDGEZ))]
2878 "fetchaddgez<four_if_si>\t%0, %r1, %r2"
2879 [(set_attr "type" "X1_remote")])
2881 (define_insn "insn_fetchand<four_if_si>"
2882 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2883 (unspec_volatile:I48MODE
2884 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2886 (set (mem:I48MODE (match_dup 1))
2887 (and:I48MODE (mem:I48MODE (match_dup 1))
2888 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2890 "fetchand<four_if_si>\t%0, %r1, %r2"
2891 [(set_attr "type" "X1_remote")])
2893 (define_insn "insn_fetchor<four_if_si>"
2894 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2895 (unspec_volatile:I48MODE
2896 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2898 (set (mem:I48MODE (match_dup 1))
2899 (ior:I48MODE (mem:I48MODE (match_dup 1))
2900 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2902 "fetchor<four_if_si>\t%0, %r1, %r2"
2903 [(set_attr "type" "X1_remote")])
2905 (define_insn "insn_finv"
2906 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2910 [(set_attr "type" "X1")])
2912 (define_insn "insn_flush"
2913 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2917 [(set_attr "type" "X1")])
2919 (define_insn "insn_flushwb"
2920 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FLUSHWB)]
2923 [(set_attr "type" "X1")])
2925 (define_insn "insn_fnop"
2926 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FNOP)]
2930 (define_insn "insn_fsingle_add1"
2931 [(set (match_operand:DI 0 "register_operand" "=r")
2932 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2933 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2934 UNSPEC_INSN_FSINGLE_ADD1))]
2936 "fsingle_add1\t%0, %r1, %r2"
2937 [(set_attr "type" "X0")])
2939 (define_insn "insn_fsingle_addsub2"
2940 [(set (match_operand:DI 0 "register_operand" "=r")
2941 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2942 (match_operand:DI 2 "reg_or_0_operand" "rO")
2943 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2944 UNSPEC_INSN_FSINGLE_ADDSUB2))]
2946 "fsingle_addsub2\t%0, %r2, %r3"
2947 [(set_attr "type" "X0_2cycle")])
2949 (define_insn "insn_fsingle_mul1"
2950 [(set (match_operand:DI 0 "register_operand" "=r")
2951 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2952 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2953 UNSPEC_INSN_FSINGLE_MUL1))]
2955 "fsingle_mul1\t%0, %r1, %r2"
2956 [(set_attr "type" "X0")])
2958 (define_insn "insn_fsingle_mul2"
2959 [(set (match_operand:DI 0 "register_operand" "=r")
2960 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2961 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2962 UNSPEC_INSN_FSINGLE_MUL2))]
2964 "fsingle_mul2\t%0, %r1, %r2"
2965 [(set_attr "type" "X0_2cycle")])
2967 (define_insn "insn_fsingle_pack1"
2968 [(set (match_operand:DI 0 "register_operand" "=r")
2969 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")]
2970 UNSPEC_INSN_FSINGLE_PACK1))]
2972 "fsingle_pack1\t%0, %r1"
2973 [(set_attr "type" "Y0_2cycle")])
2975 (define_insn "insn_fsingle_pack2"
2976 [(set (match_operand:DI 0 "register_operand" "=r")
2977 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2978 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2979 UNSPEC_INSN_FSINGLE_PACK2))]
2981 "fsingle_pack2\t%0, %r1, %r2"
2982 [(set_attr "type" "X0_2cycle")])
2984 (define_insn "insn_fsingle_sub1"
2985 [(set (match_operand:DI 0 "register_operand" "=r")
2986 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2987 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2988 UNSPEC_INSN_FSINGLE_SUB1))]
2990 "fsingle_sub1\t%0, %r1, %r2"
2991 [(set_attr "type" "X0")])
2993 (define_insn "insn_drain"
2994 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_DRAIN)]
2997 [(set_attr "type" "cannot_bundle")])
2999 (define_insn "insn_icoh"
3000 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3004 [(set_attr "type" "X1")])
3006 (define_insn "insn_ill"
3007 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_ILL)]
3010 [(set_attr "type" "cannot_bundle")])
3012 (define_insn "insn_info"
3013 [(unspec_volatile:VOID [(match_operand:DI 0 "s8bit_cint_operand" "i")]
3018 (define_insn "insn_infol"
3019 [(unspec_volatile:VOID [(match_operand:DI 0 "s16bit_cint_operand" "i")]
3023 [(set_attr "type" "X01")])
3025 (define_insn "insn_inv"
3026 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3030 [(set_attr "type" "X1")])
3034 (define_expand "insn_ld"
3035 [(set (match_operand:DI 0 "register_operand" "")
3036 (mem:DI (match_operand 1 "pointer_operand" "")))]
3039 (define_insn "insn_ld_add<bitsuffix>"
3040 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3041 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3042 (match_operand 2 "s8bit_cint_operand" "i")))
3043 (set (match_operand:DI 0 "register_operand" "=r")
3044 (mem:DI (match_dup 3)))]
3046 "ld_add\t%0, %1, %2"
3047 [(set_attr "type" "X1_2cycle")])
3049 (define_insn "insn_ldna"
3050 [(set (match_operand:DI 0 "register_operand" "=r")
3051 (mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3055 [(set_attr "type" "X1_2cycle")])
3057 (define_insn "insn_ldna_add<bitsuffix>"
3058 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3059 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3060 (match_operand 2 "s8bit_cint_operand" "i")))
3061 (set (match_operand:DI 0 "register_operand" "=r")
3062 (mem:DI (and:DI (match_dup 3) (const_int -8))))]
3064 "ldna_add\t%0, %1, %2"
3065 [(set_attr "type" "X1_2cycle")])
3067 (define_expand "insn_ld<n><s>"
3068 [(set (match_operand:DI 0 "register_operand" "")
3070 (mem:I124MODE (match_operand 1 "pointer_operand" ""))))]
3073 (define_insn "insn_ld<I124MODE:n><s>_add<I48MODE:bitsuffix>"
3074 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3075 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3076 (match_operand 2 "s8bit_cint_operand" "i")))
3077 (set (match_operand:DI 0 "register_operand" "=r")
3078 (any_extend:DI (mem:I124MODE (match_dup 3))))]
3080 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3081 [(set_attr "type" "X1_2cycle")])
3083 ;; non temporal loads
3085 (define_insn "insn_ldnt"
3086 [(set (match_operand:DI 0 "register_operand" "=r")
3087 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3088 UNSPEC_NON_TEMPORAL))]
3091 [(set_attr "type" "X1_2cycle")])
3093 (define_insn "insn_ldnt_add<bitsuffix>"
3094 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3095 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3096 (match_operand 2 "s8bit_cint_operand" "i")))
3097 (set (match_operand:DI 0 "register_operand" "=r")
3098 (unspec:DI [(mem:DI (match_dup 3))]
3099 UNSPEC_NON_TEMPORAL))]
3101 "ldnt_add\t%0, %1, %2"
3102 [(set_attr "type" "X1_2cycle")])
3104 (define_insn "insn_ldnt<n><s>"
3105 [(set (match_operand:DI 0 "register_operand" "=r")
3108 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3109 UNSPEC_NON_TEMPORAL)))]
3111 "ldnt<n><s>\t%0, %r1"
3112 [(set_attr "type" "X1_2cycle")])
3114 (define_insn "insn_ldnt<I124MODE:n><s>_add<I48MODE:bitsuffix>"
3115 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3116 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3117 (match_operand 2 "s8bit_cint_operand" "i")))
3118 (set (match_operand:DI 0 "register_operand" "=r")
3119 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3120 UNSPEC_NON_TEMPORAL)))]
3122 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3123 [(set_attr "type" "X1_2cycle")])
3127 (define_insn "insn_ld_L2"
3128 [(set (match_operand:DI 0 "register_operand" "=r")
3129 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3130 UNSPEC_LATENCY_L2))]
3133 [(set_attr "type" "Y2_L2")])
3135 (define_insn "insn_ld_add_L2<bitsuffix>"
3136 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3137 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3138 (match_operand 2 "s8bit_cint_operand" "i")))
3139 (set (match_operand:DI 0 "register_operand" "=r")
3140 (unspec:DI [(mem:DI (match_dup 3))]
3141 UNSPEC_LATENCY_L2))]
3143 "ld_add\t%0, %1, %2"
3144 [(set_attr "type" "X1_L2")])
3146 (define_insn "insn_ldna_L2"
3147 [(set (match_operand:DI 0 "register_operand" "=r")
3148 (unspec:DI [(mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3150 UNSPEC_LATENCY_L2))]
3153 [(set_attr "type" "X1_L2")])
3155 (define_insn "insn_ldna_add_L2<bitsuffix>"
3156 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3157 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3158 (match_operand 2 "s8bit_cint_operand" "i")))
3159 (set (match_operand:DI 0 "register_operand" "=r")
3160 (unspec:DI [(mem:DI (and:DI (match_dup 3) (const_int -8)))]
3161 UNSPEC_LATENCY_L2))]
3163 "ldna_add\t%0, %1, %2"
3164 [(set_attr "type" "X1_L2")])
3166 (define_insn "insn_ld<n><s>_L2"
3167 [(set (match_operand:DI 0 "register_operand" "=r")
3170 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3171 UNSPEC_LATENCY_L2)))]
3174 [(set_attr "type" "Y2_L2")])
3176 (define_insn "insn_ld<I124MODE:n><s>_add_L2<I48MODE:bitsuffix>"
3177 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3178 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3179 (match_operand 2 "s8bit_cint_operand" "i")))
3180 (set (match_operand:DI 0 "register_operand" "=r")
3181 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3182 UNSPEC_LATENCY_L2)))]
3184 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3185 [(set_attr "type" "X1_L2")])
3187 ;; L2 hits, non temporal loads
3189 (define_insn "insn_ldnt_L2"
3190 [(set (match_operand:DI 0 "register_operand" "=r")
3191 (unspec:DI [(unspec:DI
3192 [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3193 UNSPEC_NON_TEMPORAL)]
3194 UNSPEC_LATENCY_L2))]
3197 [(set_attr "type" "X1_L2")])
3199 (define_insn "insn_ldnt_add_L2<bitsuffix>"
3200 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3201 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3202 (match_operand 2 "s8bit_cint_operand" "i")))
3203 (set (match_operand:DI 0 "register_operand" "=r")
3204 (unspec:DI [(unspec:DI
3205 [(mem:DI (match_dup 3))]
3206 UNSPEC_NON_TEMPORAL)]
3207 UNSPEC_LATENCY_L2))]
3209 "ldnt_add\t%0, %1, %2"
3210 [(set_attr "type" "X1_L2")])
3212 (define_insn "insn_ldnt<n><s>_L2"
3213 [(set (match_operand:DI 0 "register_operand" "=r")
3217 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3218 UNSPEC_NON_TEMPORAL)]
3219 UNSPEC_LATENCY_L2)))]
3221 "ldnt<n><s>\t%0, %r1"
3222 [(set_attr "type" "X1_L2")])
3224 (define_insn "insn_ldnt<I124MODE:n><s>_add_L2<I48MODE:bitsuffix>"
3225 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3226 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3227 (match_operand 2 "s8bit_cint_operand" "i")))
3228 (set (match_operand:DI 0 "register_operand" "=r")
3230 (unspec:I124MODE [(unspec:I124MODE
3231 [(mem:I124MODE (match_dup 3))]
3232 UNSPEC_NON_TEMPORAL)]
3233 UNSPEC_LATENCY_L2)))]
3235 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3236 [(set_attr "type" "X1_L2")])
3240 (define_insn "insn_ld_miss"
3241 [(set (match_operand:DI 0 "register_operand" "=r")
3242 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3243 UNSPEC_LATENCY_MISS))]
3246 [(set_attr "type" "Y2_miss")])
3248 (define_insn "insn_ld_add_miss<bitsuffix>"
3249 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3250 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3251 (match_operand 2 "s8bit_cint_operand" "i")))
3252 (set (match_operand:DI 0 "register_operand" "=r")
3253 (unspec:DI [(mem:DI (match_dup 3))]
3254 UNSPEC_LATENCY_MISS))]
3256 "ld_add\t%0, %1, %2"
3257 [(set_attr "type" "X1_miss")])
3259 (define_insn "insn_ldna_miss"
3260 [(set (match_operand:DI 0 "register_operand" "=r")
3261 (unspec:DI [(mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3263 UNSPEC_LATENCY_MISS))]
3266 [(set_attr "type" "X1_miss")])
3268 (define_insn "insn_ldna_add_miss<bitsuffix>"
3269 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3270 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3271 (match_operand 2 "s8bit_cint_operand" "i")))
3272 (set (match_operand:DI 0 "register_operand" "=r")
3273 (unspec:DI [(mem:DI (and:DI (match_dup 3) (const_int -8)))]
3274 UNSPEC_LATENCY_MISS))]
3276 "ldna_add\t%0, %1, %2"
3277 [(set_attr "type" "X1_miss")])
3279 (define_insn "insn_ld<n><s>_miss"
3280 [(set (match_operand:DI 0 "register_operand" "=r")
3283 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3284 UNSPEC_LATENCY_MISS)))]
3287 [(set_attr "type" "Y2_miss")])
3289 (define_insn "insn_ld<I124MODE:n><s>_add_miss<I48MODE:bitsuffix>"
3290 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3291 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3292 (match_operand 2 "s8bit_cint_operand" "i")))
3293 (set (match_operand:DI 0 "register_operand" "=r")
3294 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3295 UNSPEC_LATENCY_MISS)))]
3297 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3298 [(set_attr "type" "X1_miss")])
3300 ;; L2 miss, non temporal loads
3302 (define_insn "insn_ldnt_miss"
3303 [(set (match_operand:DI 0 "register_operand" "=r")
3304 (unspec:DI [(unspec:DI
3305 [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3306 UNSPEC_NON_TEMPORAL)]
3307 UNSPEC_LATENCY_MISS))]
3310 [(set_attr "type" "X1_miss")])
3312 (define_insn "insn_ldnt_add_miss<bitsuffix>"
3313 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3314 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3315 (match_operand 2 "s8bit_cint_operand" "i")))
3316 (set (match_operand:DI 0 "register_operand" "=r")
3317 (unspec:DI [(unspec:DI
3318 [(mem:DI (match_dup 3))]
3319 UNSPEC_NON_TEMPORAL)]
3320 UNSPEC_LATENCY_MISS))]
3322 "ldnt_add\t%0, %1, %2"
3323 [(set_attr "type" "X1_miss")])
3325 (define_insn "insn_ldnt<n><s>_miss"
3326 [(set (match_operand:DI 0 "register_operand" "=r")
3330 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3331 UNSPEC_NON_TEMPORAL)]
3332 UNSPEC_LATENCY_MISS)))]
3334 "ldnt<n><s>\t%0, %r1"
3335 [(set_attr "type" "X1_miss")])
3337 (define_insn "insn_ldnt<I124MODE:n><s>_add_miss<I48MODE:bitsuffix>"
3338 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3339 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3340 (match_operand 2 "s8bit_cint_operand" "i")))
3341 (set (match_operand:DI 0 "register_operand" "=r")
3343 (unspec:I124MODE [(unspec:I124MODE
3344 [(mem:I124MODE (match_dup 3))]
3345 UNSPEC_NON_TEMPORAL)]
3346 UNSPEC_LATENCY_MISS)))]
3348 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3349 [(set_attr "type" "X1_miss")])
3353 (define_insn "insn_lnk"
3354 [(set (match_operand:DI 0 "register_operand" "=r")
3355 (unspec:DI [(const_int 0)] UNSPEC_INSN_LNK))]
3358 [(set_attr "type" "Y1")])
3360 (define_insn "insn_mfspr"
3361 [(set (match_operand:DI 0 "register_operand" "=r")
3362 (unspec_volatile:DI [(match_operand:DI 1 "u14bit_cint_operand" "i")]
3364 (clobber (mem:BLK (const_int 0)))]
3367 [(set_attr "type" "X1")])
3369 (define_insn "insn_mtspr"
3370 [(unspec_volatile:DI [(match_operand:DI 0 "u14bit_cint_operand" "i")
3371 (match_operand:DI 1 "reg_or_0_operand" "rO")]
3373 (clobber (mem:BLK (const_int 0)))]
3376 [(set_attr "type" "X1")])
3378 (define_insn "insn_mm"
3379 [(set (match_operand:DI 0 "register_operand" "=r")
3380 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3381 (match_operand:DI 2 "reg_or_0_operand" "rO")
3382 (match_operand:DI 3 "u6bit_cint_operand" "i")
3383 (match_operand:DI 4 "u6bit_cint_operand" "i")]
3386 "mm\t%0, %r2, %3, %4"
3387 [(set_attr "type" "X0")])
3389 (define_insn "insn_mul_hs_hs"
3390 [(set (match_operand:DI 0 "register_operand" "=r")
3391 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3392 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3393 UNSPEC_INSN_MUL_HS_HS))]
3395 "mul_hs_hs\t%0, %r1, %r2"
3396 [(set_attr "type" "Y0_2cycle")])
3398 (define_insn "insn_mul_hs_hu"
3399 [(set (match_operand:DI 0 "register_operand" "=r")
3400 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3401 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3402 UNSPEC_INSN_MUL_HS_HU))]
3404 "mul_hs_hu\t%0, %r1, %r2"
3405 [(set_attr "type" "X0_2cycle")])
3407 (define_insn "insn_mul_hs_ls"
3408 [(set (match_operand:DI 0 "register_operand" "=r")
3409 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3410 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3411 UNSPEC_INSN_MUL_HS_LS))]
3413 "mul_hs_ls\t%0, %r1, %r2"
3414 [(set_attr "type" "X0_2cycle")])
3416 (define_insn "insn_mul_hs_lu"
3417 [(set (match_operand:DI 0 "register_operand" "=r")
3418 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3419 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3420 UNSPEC_INSN_MUL_HS_LU))]
3422 "mul_hs_lu\t%0, %r1, %r2"
3423 [(set_attr "type" "X0_2cycle")])
3425 (define_insn "insn_mul_hu_hu"
3426 [(set (match_operand:DI 0 "register_operand" "=r")
3427 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3428 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3429 UNSPEC_INSN_MUL_HU_HU))]
3431 "mul_hu_hu\t%0, %r1, %r2"
3432 [(set_attr "type" "Y0_2cycle")])
3434 (define_insn "insn_mul_hu_ls"
3435 [(set (match_operand:DI 0 "register_operand" "=r")
3436 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3437 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3438 UNSPEC_INSN_MUL_HU_LS))]
3440 "mul_hu_ls\t%0, %r1, %r2"
3441 [(set_attr "type" "X0_2cycle")])
3443 (define_insn "insn_mul_hu_lu"
3444 [(set (match_operand:DI 0 "register_operand" "=r")
3445 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3446 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3447 UNSPEC_INSN_MUL_HU_LU))]
3449 "mul_hu_lu\t%0, %r1, %r2"
3450 [(set_attr "type" "X0_2cycle")])
3452 (define_insn "insn_mul_ls_ls"
3453 [(set (match_operand:DI 0 "register_operand" "=r")
3454 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3455 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3456 UNSPEC_INSN_MUL_LS_LS))]
3458 "mul_ls_ls\t%0, %r1, %r2"
3459 [(set_attr "type" "Y0_2cycle")])
3461 (define_insn "insn_mul_ls_lu"
3462 [(set (match_operand:DI 0 "register_operand" "=r")
3463 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3464 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3465 UNSPEC_INSN_MUL_LS_LU))]
3467 "mul_ls_lu\t%0, %r1, %r2"
3468 [(set_attr "type" "X0_2cycle")])
3470 (define_insn "insn_mul_lu_lu"
3471 [(set (match_operand:DI 0 "register_operand" "=r")
3472 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3473 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3474 UNSPEC_INSN_MUL_LU_LU))]
3476 "mul_lu_lu\t%0, %r1, %r2"
3477 [(set_attr "type" "Y0_2cycle")])
3479 (define_insn "insn_mula_hs_hs"
3480 [(set (match_operand:DI 0 "register_operand" "=r")
3481 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3482 (match_operand:DI 2 "reg_or_0_operand" "rO")
3483 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3484 UNSPEC_INSN_MULA_HS_HS))]
3486 "mula_hs_hs\t%0, %r2, %r3"
3487 [(set_attr "type" "Y0_2cycle")])
3489 (define_insn "insn_mula_hs_hu"
3490 [(set (match_operand:DI 0 "register_operand" "=r")
3491 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3492 (match_operand:DI 2 "reg_or_0_operand" "rO")
3493 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3494 UNSPEC_INSN_MULA_HS_HU))]
3496 "mula_hs_hu\t%0, %r2, %r3"
3497 [(set_attr "type" "X0_2cycle")])
3499 (define_insn "insn_mula_hs_ls"
3500 [(set (match_operand:DI 0 "register_operand" "=r")
3501 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3502 (match_operand:DI 2 "reg_or_0_operand" "rO")
3503 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3504 UNSPEC_INSN_MULA_HS_LS))]
3506 "mula_hs_ls\t%0, %r2, %r3"
3507 [(set_attr "type" "X0_2cycle")])
3509 (define_insn "insn_mula_hs_lu"
3510 [(set (match_operand:DI 0 "register_operand" "=r")
3511 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3512 (match_operand:DI 2 "reg_or_0_operand" "rO")
3513 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3514 UNSPEC_INSN_MULA_HS_LU))]
3516 "mula_hs_lu\t%0, %r2, %r3"
3517 [(set_attr "type" "X0_2cycle")])
3519 (define_insn "insn_mula_hu_hu"
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_HU_HU))]
3526 "mula_hu_hu\t%0, %r2, %r3"
3527 [(set_attr "type" "Y0_2cycle")])
3529 (define_insn "insn_mula_hu_ls"
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_HU_LS))]
3536 "mula_hu_ls\t%0, %r2, %r3"
3537 [(set_attr "type" "X0_2cycle")])
3539 (define_insn "insn_mula_hu_lu"
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_HU_LU))]
3546 "mula_hu_lu\t%0, %r2, %r3"
3547 [(set_attr "type" "X0_2cycle")])
3549 (define_insn "insn_mula_ls_ls"
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_LS_LS))]
3556 "mula_ls_ls\t%0, %r2, %r3"
3557 [(set_attr "type" "Y0_2cycle")])
3559 (define_insn "insn_mula_ls_lu"
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_LS_LU))]
3566 "mula_ls_lu\t%0, %r2, %r3"
3567 [(set_attr "type" "X0_2cycle")])
3569 (define_insn "insn_mula_lu_lu"
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_LU_LU))]
3576 "mula_lu_lu\t%0, %r2, %r3"
3577 [(set_attr "type" "Y0_2cycle")])
3579 (define_insn "insn_mulax"
3580 [(set (match_operand:SI 0 "register_operand" "=r")
3581 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3582 (match_operand:SI 2 "reg_or_0_operand" "rO")
3583 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3584 UNSPEC_INSN_MULAX))]
3586 "mulax\t%0, %r2, %r3"
3587 [(set_attr "type" "Y0_2cycle")])
3589 (define_insn "insn_nap"
3590 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_NAP)]
3593 [(set_attr "type" "cannot_bundle")])
3595 (define_insn "insn_nor_<mode>"
3596 [(set (match_operand:I48MODE 0 "register_operand" "=r")
3598 (not:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO"))
3599 (not:I48MODE (match_operand:I48MODE 2 "reg_or_0_operand" "rO"))))]
3601 "nor\t%0, %r1, %r2")
3603 (define_expand "insn_prefetch_l1"
3604 [(prefetch (match_operand 0 "pointer_operand" "")
3609 (define_expand "insn_prefetch_l2"
3610 [(prefetch (match_operand 0 "pointer_operand" "")
3615 (define_expand "insn_prefetch_l3"
3616 [(prefetch (match_operand 0 "pointer_operand" "")
3621 (define_insn "insn_prefetch_l1_fault"
3622 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3623 UNSPEC_INSN_PREFETCH_L1_FAULT)]
3625 "prefetch_l1_fault\t%r0"
3626 [(set_attr "type" "Y2")])
3628 (define_insn "insn_prefetch_l2_fault"
3629 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3630 UNSPEC_INSN_PREFETCH_L2_FAULT)]
3632 "prefetch_l2_fault\t%r0"
3633 [(set_attr "type" "Y2")])
3635 (define_insn "insn_prefetch_l3_fault"
3636 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3637 UNSPEC_INSN_PREFETCH_L3_FAULT)]
3639 "prefetch_l3_fault\t%r0"
3640 [(set_attr "type" "Y2")])
3642 (define_insn "insn_revbits"
3643 [(set (match_operand:DI 0 "register_operand" "=r")
3644 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")]
3645 UNSPEC_INSN_REVBITS))]
3648 [(set_attr "type" "Y0")])
3650 (define_insn "insn_shl1add"
3651 [(set (match_operand:DI 0 "register_operand" "=r")
3652 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3654 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3656 "shl1add\t%0, %r1, %r2")
3658 (define_insn "insn_shl1addx"
3659 [(set (match_operand:SI 0 "register_operand" "=r")
3660 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3662 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3664 "shl1addx\t%0, %r1, %r2")
3666 (define_insn "insn_shl2add"
3667 [(set (match_operand:DI 0 "register_operand" "=r")
3668 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3670 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3672 "shl2add\t%0, %r1, %r2")
3674 (define_insn "insn_shl2addx"
3675 [(set (match_operand:SI 0 "register_operand" "=r")
3676 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3678 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3680 "shl2addx\t%0, %r1, %r2")
3682 (define_insn "insn_shl3add"
3683 [(set (match_operand:DI 0 "register_operand" "=r")
3684 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3686 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3688 "shl3add\t%0, %r1, %r2")
3690 (define_insn "insn_shl3addx"
3691 [(set (match_operand:SI 0 "register_operand" "=r")
3692 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3694 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3696 "shl3addx\t%0, %r1, %r2")
3698 (define_insn "insn_shufflebytes"
3699 [(set (match_operand:DI 0 "register_operand" "=r")
3700 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3701 (match_operand:DI 2 "reg_or_0_operand" "rO")
3702 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3703 UNSPEC_INSN_SHUFFLEBYTES))]
3705 "shufflebytes\t%0, %r2, %r3"
3706 [(set_attr "type" "X0")])
3710 (define_expand "insn_st"
3711 [(set (mem:DI (match_operand 0 "pointer_operand" ""))
3712 (match_operand:DI 1 "reg_or_0_operand" ""))]
3715 (define_insn "insn_st_add<bitsuffix>"
3716 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3717 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3718 (match_operand 2 "s8bit_cint_operand" "i")))
3719 (set (mem:DI (match_dup 3))
3720 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3722 "st_add\t%0, %r1, %2"
3723 [(set_attr "type" "X1")])
3725 (define_expand "insn_st<n>"
3726 [(set (mem:I124MODE (match_operand 0 "pointer_operand" ""))
3727 (match_operand:DI 1 "reg_or_0_operand" ""))]
3730 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3733 (define_expand "insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3735 [(set (match_operand:I48MODE 0 "pointer_operand" "")
3736 (plus:I48MODE (match_operand 3 "pointer_operand" "")
3737 (match_operand 2 "s8bit_cint_operand" "")))
3738 (set (mem:I124MODE (match_dup 3))
3739 (match_operand:DI 1 "reg_or_0_operand" ""))])]
3742 operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3746 (define_insn "*insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3747 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3748 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3749 (match_operand 2 "s8bit_cint_operand" "i")))
3750 (set (mem:I124MODE (match_dup 3))
3751 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3753 "st<I124MODE:n>_add\t%0, %r1, %2"
3754 [(set_attr "type" "X1")])
3756 ;; non-temporal stores
3758 (define_insn "insn_stnt"
3759 [(set (mem:DI (unspec [(match_operand 0 "pointer_operand" "rO")]
3760 UNSPEC_NON_TEMPORAL))
3761 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3764 [(set_attr "type" "X1")])
3766 (define_insn "insn_stnt_add<bitsuffix>"
3767 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3768 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3769 (match_operand 2 "s8bit_cint_operand" "i")))
3770 (set (mem:DI (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3771 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3773 "stnt_add\t%0, %r1, %2"
3774 [(set_attr "type" "X1")])
3776 (define_expand "insn_stnt<n>"
3777 [(set (mem:I124MODE (unspec [(match_operand 0 "pointer_operand" "")]
3778 UNSPEC_NON_TEMPORAL))
3779 (match_operand:DI 1 "reg_or_0_operand" ""))]
3782 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3785 (define_insn "*insn_stnt<n>"
3786 [(set (mem:I124MODE (unspec [(match_operand 0 "pointer_operand" "rO")]
3787 UNSPEC_NON_TEMPORAL))
3788 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3791 [(set_attr "type" "X1")])
3793 (define_expand "insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>"
3795 [(set (match_operand:I48MODE 0 "pointer_operand" "")
3796 (plus:I48MODE (match_operand 3 "pointer_operand" "")
3797 (match_operand 2 "s8bit_cint_operand" "")))
3798 (set (mem:I124MODE (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3799 (match_operand:DI 1 "reg_or_0_operand" "rO"))])]
3802 operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3806 (define_insn "*insn_stnt<I124MODE:n>_add<I48MODE: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:I124MODE (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3811 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3813 "stnt<I124MODE:n>_add\t%0, %r1, %2"
3814 [(set_attr "type" "X1")])
3818 (define_insn "insn_tblidxb0"
3819 [(set (match_operand:DI 0 "register_operand" "=r")
3820 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3821 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3822 UNSPEC_INSN_TBLIDXB0))]
3825 [(set_attr "type" "Y0")])
3827 (define_insn "insn_tblidxb1"
3828 [(set (match_operand:DI 0 "register_operand" "=r")
3829 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3830 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3831 UNSPEC_INSN_TBLIDXB1))]
3834 [(set_attr "type" "Y0")])
3836 (define_insn "insn_tblidxb2"
3837 [(set (match_operand:DI 0 "register_operand" "=r")
3838 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3839 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3840 UNSPEC_INSN_TBLIDXB2))]
3843 [(set_attr "type" "Y0")])
3845 (define_insn "insn_tblidxb3"
3846 [(set (match_operand:DI 0 "register_operand" "=r")
3847 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3848 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3849 UNSPEC_INSN_TBLIDXB3))]
3852 [(set_attr "type" "Y0")])
3866 (define_insn "<optab>v8qi3"
3867 [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3869 (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO,rO")
3870 (match_operand:V8QI 2 "reg_or_v8s8bit_operand" "W,rO")))]
3873 v1<insn>i\t%0, %r1, %j2
3874 v1<insn>\t%0, %r1, %r2"
3875 [(set_attr "type" "<pipe>,<pipe>")])
3877 (define_expand "insn_v1<insn>"
3878 [(set (match_operand:DI 0 "register_operand" "")
3880 (match_operand:DI 1 "reg_or_0_operand" "")
3881 (match_operand:DI 2 "reg_or_0_operand" "")))]
3884 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3885 V8QImode, operands[1], operands[2], true);
3889 (define_expand "insn_v1<insn>i"
3890 [(set (match_operand:DI 0 "register_operand" "")
3892 (match_operand:DI 1 "reg_or_0_operand" "")
3893 (match_operand:DI 2 "s8bit_cint_operand" "")))]
3896 /* Tile out immediate and expand to general case. */
3897 rtx n = tilegx_simd_int (operands[2], QImode);
3898 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3899 V8QImode, operands[1], n, true);
3909 (define_insn "<optab>v8qi3"
3910 [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3912 (match_operand:V8QI 1 "reg_or_0_operand" "rO,rO")
3913 (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
3916 v1<insn>i\t%0, %r1, %2
3917 v1<insn>\t%0, %r1, %r2"
3918 [(set_attr "type" "<pipe>,<pipe>")])
3920 (define_expand "insn_v1<insn>"
3921 [(set (match_operand:DI 0 "register_operand" "")
3923 (match_operand:DI 1 "reg_or_0_operand" "")
3924 (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
3927 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3928 V8QImode, operands[1], operands[2], false);
3944 (define_insn "<optab>v4hi3"
3945 [(set (match_operand:V4HI 0 "register_operand" "=r,r")
3947 (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO,rO")
3948 (match_operand:V4HI 2 "reg_or_v4s8bit_operand" "Y,rO")))]
3951 v2<insn>i\t%0, %r1, %j2
3952 v2<insn>\t%0, %r1, %r2"
3953 [(set_attr "type" "<pipe>,<pipe>")])
3955 (define_expand "insn_v2<insn>"
3956 [(set (match_operand:DI 0 "register_operand" "")
3958 (match_operand:DI 1 "reg_or_0_operand" "")
3959 (match_operand:DI 2 "reg_or_0_operand" "")))]
3962 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
3963 V4HImode, operands[1], operands[2], true);
3967 (define_expand "insn_v2<insn>i"
3968 [(set (match_operand:DI 0 "register_operand" "")
3970 (match_operand:DI 1 "reg_or_0_operand" "")
3971 (match_operand:DI 2 "s8bit_cint_operand" "")))]
3974 /* Tile out immediate and expand to general case. */
3975 rtx n = tilegx_simd_int (operands[2], HImode);
3976 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
3977 V4HImode, operands[1], n, true);
3987 (define_insn "<optab>v4hi3"
3988 [(set (match_operand:V4HI 0 "register_operand" "=r,r")
3990 (match_operand:V4HI 1 "reg_or_0_operand" "rO,rO")
3991 (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
3994 v2<insn>i\t%0, %r1, %2
3995 v2<insn>\t%0, %r1, %r2"
3996 [(set_attr "type" "<pipe>,<pipe>")])
3998 (define_expand "insn_v2<insn>"
3999 [(set (match_operand:DI 0 "register_operand" "")
4001 (match_operand:DI 1 "reg_or_0_operand" "")
4002 (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
4005 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4006 V4HImode, operands[1], operands[2], false);
4017 (define_insn "<optab>v8qi3"
4018 [(set (match_operand:V8QI 0 "register_operand" "=r")
4020 (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO")
4021 (match_operand:V8QI 2 "reg_or_0_operand" "rO")))]
4023 "v1<insn>\t%0, %r1, %r2"
4024 [(set_attr "type" "<pipe>")])
4026 (define_expand "insn_v1<insn>"
4027 [(set (match_operand:DI 0 "register_operand" "")
4029 (match_operand:DI 1 "reg_or_0_operand" "")
4030 (match_operand:DI 2 "reg_or_0_operand" "")))]
4033 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
4034 V8QImode, operands[1], operands[2], true);
4044 (define_insn "<optab>v4hi3"
4045 [(set (match_operand:V4HI 0 "register_operand" "=r")
4047 (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO")
4048 (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4050 "v2<insn>\t%0, %r1, %r2"
4051 [(set_attr "type" "<pipe>")])
4053 (define_expand "insn_v2<insn>"
4054 [(set (match_operand:DI 0 "register_operand" "")
4056 (match_operand:DI 1 "reg_or_0_operand" "")
4057 (match_operand:DI 2 "reg_or_0_operand" "")))]
4060 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4061 V4HImode, operands[1], operands[2], true);
4066 (define_insn "mulv4hi3"
4067 [(set (match_operand:V4HI 0 "register_operand" "=r")
4069 (match_operand:V4HI 1 "reg_or_0_operand" "%rO")
4070 (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4072 "v2mults\t%0, %r1, %r2"
4073 [(set_attr "type" "X0_2cycle")])
4075 (define_expand "insn_v2mults"
4076 [(set (match_operand:DI 0 "register_operand" "")
4078 (match_operand:DI 1 "reg_or_0_operand" "")
4079 (match_operand:DI 2 "reg_or_0_operand" "")))]
4082 tilegx_expand_builtin_vector_binop (gen_mulv4hi3, V4HImode, operands[0],
4083 V4HImode, operands[1], operands[2], true);
4088 (define_insn "<optab>v4hi3"
4089 [(set (match_operand:V4HI 0 "register_operand" "=r")
4091 (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4092 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4094 "v2<insn>\t%0, %r1, %r2"
4095 [(set_attr "type" "<pipe>")])
4097 (define_expand "insn_v2<insn>"
4098 [(set (match_operand:DI 0 "register_operand" "")
4100 (match_operand:DI 1 "reg_or_0_operand" "")
4101 (match_operand:DI 2 "reg_or_0_operand" "")))]
4104 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4105 V4HImode, operands[1], operands[2], false);
4113 (define_insn "<optab>v2si3"
4114 [(set (match_operand:V2SI 0 "register_operand" "=r")
4116 (match_operand:V2SI 1 "reg_or_0_operand" "<comm>rO")
4117 (match_operand:V2SI 2 "reg_or_0_operand" "rO")))]
4119 "v4<insn>\t%0, %r1, %r2"
4120 [(set_attr "type" "<pipe>")])
4122 (define_expand "insn_v4<insn>"
4123 [(set (match_operand:DI 0 "register_operand" "")
4125 (match_operand:DI 1 "reg_or_0_operand" "")
4126 (match_operand:DI 2 "reg_or_0_operand" "")))]
4129 tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4130 V2SImode, operands[1], operands[2], true);
4138 (define_insn "<optab>v2si3"
4139 [(set (match_operand:V2SI 0 "register_operand" "=r")
4141 (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4142 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4144 "v4<insn>\t%0, %r1, %r2"
4145 [(set_attr "type" "<pipe>")])
4147 (define_expand "insn_v4<insn>"
4148 [(set (match_operand:DI 0 "register_operand" "")
4150 (match_operand:DI 1 "reg_or_0_operand" "")
4151 (match_operand:DI 2 "reg_or_0_operand" "")))]
4154 tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4155 V2SImode, operands[1], operands[2], false);
4160 ;; {B7,B6,B5,B4,B3,B2,B1,B0} {A7,A6,A5,A4,A3,A2,A1,A0}
4161 ;; => {A7,A6,A5,A4,A3,A2,A1,A0,B7,B6,B5,B4,B3,B2,B1,B0}
4162 ;; => {A7,B7,A6,B6,A5,B5,A4,B4}
4163 (define_insn "vec_interleave_highv8qi"
4164 [(set (match_operand:V8QI 0 "register_operand" "=r")
4166 (vec_concat:V16QI (match_operand:V8QI 1 "reg_or_0_operand" "rO")
4167 (match_operand:V8QI 2 "reg_or_0_operand" "rO"))
4168 (parallel [(const_int 4) (const_int 12)
4169 (const_int 5) (const_int 13)
4170 (const_int 6) (const_int 14)
4171 (const_int 7) (const_int 15)])))]
4173 "v1int_h\t%0, %r2, %r1"
4174 [(set_attr "type" "X01")])
4176 (define_expand "insn_v1int_h"
4177 [(match_operand:DI 0 "register_operand" "")
4178 (match_operand:DI 1 "reg_or_0_operand" "")
4179 (match_operand:DI 2 "reg_or_0_operand" "")]
4182 /* Our instruction interleaves opposite of the way vec_interleave
4183 works, so we need to reverse the source operands. */
4184 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv8qi, V8QImode,
4185 operands[0], V8QImode, operands[2],
4191 ;; {B7,B6,B5,B4,B3,B2,B1,B0} {A7,A6,A5,A4,A3,A2,A1,A0}
4192 ;; => {A7,A6,A5,A4,A3,A2,A1,A0,B7,B6,B5,B4,B3,B2,B1,B0}
4193 ;; => {A3,B3,A2,B2,A1,B1,A0,B0}
4194 (define_insn "vec_interleave_lowv8qi"
4195 [(set (match_operand:V8QI 0 "register_operand" "=r")
4197 (vec_concat:V16QI (match_operand:V8QI 1 "reg_or_0_operand" "rO")
4198 (match_operand:V8QI 2 "reg_or_0_operand" "rO"))
4199 (parallel [(const_int 0) (const_int 8)
4200 (const_int 1) (const_int 9)
4201 (const_int 2) (const_int 10)
4202 (const_int 3) (const_int 11)])))]
4204 "v1int_l\t%0, %r2, %r1"
4205 [(set_attr "type" "X01")])
4207 (define_expand "insn_v1int_l"
4208 [(match_operand:DI 0 "register_operand" "")
4209 (match_operand:DI 1 "reg_or_0_operand" "")
4210 (match_operand:DI 2 "reg_or_0_operand" "")]
4213 /* Our instruction interleaves opposite of the way vec_interleave
4214 works, so we need to reverse the source operands. */
4215 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv8qi, V8QImode,
4216 operands[0], V8QImode, operands[2],
4222 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4223 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4225 (define_insn "vec_interleave_highv4hi"
4226 [(set (match_operand:V4HI 0 "register_operand" "=r")
4228 (vec_concat:V8HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4229 (match_operand:V4HI 2 "reg_or_0_operand" "rO"))
4230 (parallel [(const_int 2) (const_int 6)
4231 (const_int 3) (const_int 7)])))]
4233 "v2int_h\t%0, %r2, %r1"
4234 [(set_attr "type" "X01")])
4236 (define_expand "insn_v2int_h"
4237 [(match_operand:DI 0 "register_operand" "")
4238 (match_operand:DI 1 "reg_or_0_operand" "")
4239 (match_operand:DI 2 "reg_or_0_operand" "")]
4242 /* Our instruction interleaves opposite of the way vec_interleave
4243 works, so we need to reverse the source operands. */
4244 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv4hi, V4HImode,
4245 operands[0], V4HImode, operands[2],
4251 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4252 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4254 (define_insn "vec_interleave_lowv4hi"
4255 [(set (match_operand:V4HI 0 "register_operand" "=r")
4257 (vec_concat:V8HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4258 (match_operand:V4HI 2 "reg_or_0_operand" "rO"))
4259 (parallel [(const_int 0) (const_int 4)
4260 (const_int 1) (const_int 5)])))]
4262 "v2int_l\t%0, %r2, %r1"
4263 [(set_attr "type" "X01")])
4265 (define_expand "insn_v2int_l"
4266 [(match_operand:DI 0 "register_operand" "")
4267 (match_operand:DI 1 "reg_or_0_operand" "")
4268 (match_operand:DI 2 "reg_or_0_operand" "")]
4271 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv4hi, V4HImode,
4272 operands[0], V4HImode, operands[2],
4281 (define_insn "vec_interleave_highv2si"
4282 [(set (match_operand:V2SI 0 "register_operand" "=r")
4284 (vec_concat:V4SI (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4285 (match_operand:V2SI 2 "reg_or_0_operand" "rO"))
4286 (parallel [(const_int 1) (const_int 3)])))]
4288 "v4int_h\t%0, %r2, %r1"
4289 [(set_attr "type" "X01")])
4291 (define_expand "insn_v4int_h"
4292 [(match_operand:DI 0 "register_operand" "")
4293 (match_operand:DI 1 "reg_or_0_operand" "")
4294 (match_operand:DI 2 "reg_or_0_operand" "")]
4297 /* Our instruction interleaves opposite of the way vec_interleave
4298 works, so we need to reverse the source operands. */
4299 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv2si, V2SImode,
4300 operands[0], V2SImode, operands[2],
4309 (define_insn "vec_interleave_lowv2si"
4310 [(set (match_operand:V2SI 0 "register_operand" "=r")
4312 (vec_concat:V4SI (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4313 (match_operand:V2SI 2 "reg_or_0_operand" "rO"))
4314 (parallel [(const_int 0) (const_int 2)])))]
4316 "v4int_l\t%0, %r2, %r1"
4317 [(set_attr "type" "X01")])
4319 (define_expand "insn_v4int_l"
4320 [(match_operand:DI 0 "register_operand" "")
4321 (match_operand:DI 1 "reg_or_0_operand" "")
4322 (match_operand:DI 2 "reg_or_0_operand" "")]
4325 /* Our instruction interleaves opposite of the way vec_interleave
4326 works, so we need to reverse the source operands. */
4327 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv2si, V2SImode,
4328 operands[0], V2SImode, operands[2],
4337 (define_insn "insn_mnz_<mode>"
4338 [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4339 (if_then_else:VEC48MODE
4341 (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4343 (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")
4346 "v<n>mnz\t%0, %r1, %r2"
4347 [(set_attr "type" "X01")])
4349 (define_expand "insn_v<n>mnz"
4350 [(set (match_operand:DI 0 "register_operand" "")
4351 (if_then_else:VEC48MODE
4353 (match_operand:DI 1 "reg_or_0_operand" "")
4355 (match_operand:DI 2 "reg_or_0_operand" "")
4359 tilegx_expand_builtin_vector_binop (gen_insn_mnz_<mode>, <MODE>mode,
4360 operands[0], <MODE>mode, operands[1],
4365 (define_insn "insn_mz_<mode>"
4366 [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4367 (if_then_else:VEC48MODE
4369 (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4372 (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")))]
4374 "v<n>mz\t%0, %r1, %r2"
4375 [(set_attr "type" "X01")])
4376 (define_expand "insn_v<n>mz"
4377 [(set (match_operand:DI 0 "register_operand" "")
4378 (if_then_else:VEC48MODE
4380 (match_operand:DI 1 "reg_or_0_operand" "")
4383 (match_operand:DI 2 "reg_or_0_operand" "")))]
4386 tilegx_expand_builtin_vector_binop (gen_insn_mz_<mode>, <MODE>mode,
4387 operands[0], <MODE>mode, operands[1],
4393 (define_insn "vec_widen_umult_lo_v8qi"
4394 [(set (match_operand:V4HI 0 "register_operand" "=r")
4398 (match_operand:V8QI 1 "register_operand" "r")
4399 (parallel [(const_int 0) (const_int 1)
4400 (const_int 2) (const_int 3)])))
4403 (match_operand:V8QI 2 "register_operand" "r")
4404 (parallel [(const_int 0) (const_int 1)
4405 (const_int 2) (const_int 3)])))))]
4407 "v1mulu\t%0, %r1, %r2"
4408 [(set_attr "type" "X0_2cycle")])
4410 (define_expand "insn_v1mulu"
4411 [(match_operand:DI 0 "register_operand" "")
4412 (match_operand:DI 1 "reg_or_0_operand" "")
4413 (match_operand:DI 2 "reg_or_0_operand" "")]
4416 tilegx_expand_builtin_vector_binop (gen_vec_widen_umult_lo_v8qi, V4HImode,
4417 operands[0], V8QImode, operands[1],
4423 (define_insn "vec_widen_usmult_lo_v8qi"
4424 [(set (match_operand:V4HI 0 "register_operand" "=r")
4428 (match_operand:V8QI 1 "register_operand" "r")
4429 (parallel [(const_int 0) (const_int 1)
4430 (const_int 2) (const_int 3)])))
4433 (match_operand:V8QI 2 "register_operand" "r")
4434 (parallel [(const_int 0) (const_int 1)
4435 (const_int 2) (const_int 3)])))))]
4437 "v1mulus\t%0, %r1, %r2"
4438 [(set_attr "type" "X0_2cycle")])
4440 (define_expand "insn_v1mulus"
4441 [(match_operand:DI 0 "register_operand" "")
4442 (match_operand:DI 1 "reg_or_0_operand" "")
4443 (match_operand:DI 2 "reg_or_0_operand" "")]
4446 tilegx_expand_builtin_vector_binop (gen_vec_widen_usmult_lo_v8qi, V4HImode,
4447 operands[0], V8QImode, operands[1],
4453 (define_insn "vec_widen_smult_lo_v4qi"
4454 [(set (match_operand:V2SI 0 "register_operand" "=r")
4458 (match_operand:V4HI 1 "register_operand" "r")
4459 (parallel [(const_int 0) (const_int 1)])))
4462 (match_operand:V4HI 2 "register_operand" "r")
4463 (parallel [(const_int 0) (const_int 1)])))))]
4465 "v2muls\t%0, %r1, %r2"
4466 [(set_attr "type" "X0_2cycle")])
4468 (define_expand "insn_v2muls"
4469 [(match_operand:DI 0 "register_operand" "")
4470 (match_operand:DI 1 "reg_or_0_operand" "")
4471 (match_operand:DI 2 "reg_or_0_operand" "")]
4474 tilegx_expand_builtin_vector_binop (gen_vec_widen_smult_lo_v4qi, V2SImode,
4475 operands[0], V4HImode, operands[1],
4482 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4483 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4484 (define_insn "vec_pack_<pack_optab>_v4hi"
4485 [(set (match_operand:V8QI 0 "reg_or_0_operand" "=r")
4487 (v2pack:V4QI (match_operand:V4HI 1 "reg_or_0_operand" "rO"))
4488 (v2pack:V4QI (match_operand:V4HI 2 "reg_or_0_operand" "rO"))))]
4490 "v2<pack_insn>\t%0, %r2, %r1"
4491 [(set_attr "type" "X01")])
4493 (define_expand "insn_v2<pack_insn>"
4494 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4496 (v2pack:V4QI (match_operand:DI 2 "reg_or_0_operand" ""))
4497 (v2pack:V4QI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4500 /* Our instruction concats opposite of the way vec_pack works, so we
4501 need to reverse the source operands. */
4502 tilegx_expand_builtin_vector_binop (gen_vec_pack_<pack_optab>_v4hi,
4503 V8QImode, operands[0], V4HImode,
4504 operands[2], operands[1], true);
4509 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4510 ;; => {A3_hi,A2_hi,A1_hi,A0_hi,B3_hi,B2_hi,B1_hi,B0_hi}
4511 (define_insn "vec_pack_hipart_v4hi"
4512 [(set (match_operand:V8QI 0 "reg_or_0_operand" "=r")
4515 (ashiftrt:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4518 (ashiftrt:V4HI (match_operand:V4HI 2 "reg_or_0_operand" "rO")
4521 "v2packh\t%0, %r2, %r1"
4522 [(set_attr "type" "X01")])
4524 (define_expand "insn_v2packh"
4525 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4528 (ashiftrt:V4HI (match_operand:DI 2 "reg_or_0_operand" "")
4531 (ashiftrt:V4HI (match_operand:DI 1 "reg_or_0_operand" "")
4535 /* Our instruction concats opposite of the way vec_pack works, so we
4536 need to reverse the source operands. */
4537 tilegx_expand_builtin_vector_binop (gen_vec_pack_hipart_v4hi, V8QImode,
4538 operands[0], V4HImode, operands[2],
4546 (define_insn "vec_pack_ssat_v2si"
4547 [(set (match_operand:V4HI 0 "reg_or_0_operand" "=r")
4549 (us_truncate:V2HI (match_operand:V2SI 1 "reg_or_0_operand" "rO"))
4550 (us_truncate:V2HI (match_operand:V2SI 2 "reg_or_0_operand" "rO"))))]
4552 "v4packsc\t%0, %r2, %r1"
4553 [(set_attr "type" "X01")])
4555 (define_expand "insn_v4packsc"
4556 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4558 (us_truncate:V2HI (match_operand:DI 2 "reg_or_0_operand" ""))
4559 (us_truncate:V2HI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4562 /* Our instruction concats opposite of the way vec_pack works, so we
4563 need to reverse the source operands. */
4564 tilegx_expand_builtin_vector_binop (gen_vec_pack_ssat_v2si, V4HImode,
4565 operands[0], V2SImode, operands[2],
4570 ;; Rest of the vector intrinsics
4571 (define_insn "insn_v1adiffu"
4572 [(set (match_operand:DI 0 "register_operand" "=r")
4573 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4574 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4575 UNSPEC_INSN_V1ADIFFU))]
4577 "v1adiffu\t%0, %r1, %r2"
4578 [(set_attr "type" "X0_2cycle")])
4580 (define_insn "insn_v1avgu"
4581 [(set (match_operand:DI 0 "register_operand" "=r")
4582 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4583 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4584 UNSPEC_INSN_V1AVGU))]
4586 "v1avgu\t%0, %r1, %r2"
4587 [(set_attr "type" "X0")])
4589 (define_insn "insn_v1ddotpu"
4590 [(set (match_operand:DI 0 "register_operand" "=r")
4591 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4592 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4593 UNSPEC_INSN_V1DDOTPU))]
4595 "v1ddotpu\t%0, %r1, %r2"
4596 [(set_attr "type" "X0_2cycle")])
4598 (define_insn "insn_v1ddotpua"
4599 [(set (match_operand:DI 0 "register_operand" "=r")
4600 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4601 (match_operand:DI 2 "reg_or_0_operand" "rO")
4602 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4603 UNSPEC_INSN_V1DDOTPUA))]
4605 "v1ddotpua\t%0, %r2, %r3"
4606 [(set_attr "type" "X0_2cycle")])
4608 (define_insn "insn_v1ddotpus"
4609 [(set (match_operand:DI 0 "register_operand" "=r")
4610 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4611 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4612 UNSPEC_INSN_V1DDOTPUS))]
4614 "v1ddotpus\t%0, %r1, %r2"
4615 [(set_attr "type" "X0_2cycle")])
4617 (define_insn "insn_v1ddotpusa"
4618 [(set (match_operand:DI 0 "register_operand" "=r")
4619 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4620 (match_operand:DI 2 "reg_or_0_operand" "rO")
4621 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4622 UNSPEC_INSN_V1DDOTPUSA))]
4624 "v1ddotpusa\t%0, %r2, %r3"
4625 [(set_attr "type" "X0_2cycle")])
4627 (define_insn "insn_v1dotp"
4628 [(set (match_operand:DI 0 "register_operand" "=r")
4629 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4630 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4631 UNSPEC_INSN_V1DOTP))]
4633 "v1dotp\t%0, %r1, %r2"
4634 [(set_attr "type" "X0_2cycle")])
4636 (define_insn "insn_v1dotpa"
4637 [(set (match_operand:DI 0 "register_operand" "=r")
4638 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4639 (match_operand:DI 2 "reg_or_0_operand" "rO")
4640 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4641 UNSPEC_INSN_V1DOTPA))]
4643 "v1dotpa\t%0, %r2, %r3"
4644 [(set_attr "type" "X0_2cycle")])
4646 (define_insn "insn_v1dotpu"
4647 [(set (match_operand:DI 0 "register_operand" "=r")
4648 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4649 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4650 UNSPEC_INSN_V1DOTPU))]
4652 "v1dotpu\t%0, %r1, %r2"
4653 [(set_attr "type" "X0_2cycle")])
4655 (define_insn "insn_v1dotpua"
4656 [(set (match_operand:DI 0 "register_operand" "=r")
4657 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4658 (match_operand:DI 2 "reg_or_0_operand" "rO")
4659 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4660 UNSPEC_INSN_V1DOTPUA))]
4662 "v1dotpua\t%0, %r2, %r3"
4663 [(set_attr "type" "X0_2cycle")])
4665 (define_insn "insn_v1dotpus"
4666 [(set (match_operand:DI 0 "register_operand" "=r")
4667 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4668 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4669 UNSPEC_INSN_V1DOTPUS))]
4671 "v1dotpus\t%0, %r1, %r2"
4672 [(set_attr "type" "X0_2cycle")])
4674 (define_insn "insn_v1dotpusa"
4675 [(set (match_operand:DI 0 "register_operand" "=r")
4676 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4677 (match_operand:DI 2 "reg_or_0_operand" "rO")
4678 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4679 UNSPEC_INSN_V1DOTPUSA))]
4681 "v1dotpusa\t%0, %r2, %r3"
4682 [(set_attr "type" "X0_2cycle")])
4684 (define_insn "insn_v1sadau"
4685 [(set (match_operand:DI 0 "register_operand" "=r")
4686 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4687 (match_operand:DI 2 "reg_or_0_operand" "rO")
4688 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4689 UNSPEC_INSN_V1SADAU))]
4691 "v1sadau\t%0, %r2, %r3"
4692 [(set_attr "type" "X0_2cycle")])
4694 (define_insn "insn_v1sadu"
4695 [(set (match_operand:DI 0 "register_operand" "=r")
4696 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4697 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4698 UNSPEC_INSN_V1SADU))]
4700 "v1sadu\t%0, %r1, %r2"
4701 [(set_attr "type" "X0_2cycle")])
4703 (define_insn "*insn_v1sadu"
4704 [(set (match_operand:SI 0 "register_operand" "=r")
4706 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4707 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4708 UNSPEC_INSN_V1SADU)))]
4710 "v1sadu\t%0, %r1, %r2"
4711 [(set_attr "type" "X0_2cycle")])
4713 (define_insn "insn_v2adiffs"
4714 [(set (match_operand:DI 0 "register_operand" "=r")
4715 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4716 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4717 UNSPEC_INSN_V2ADIFFS))]
4719 "v2adiffs\t%0, %r1, %r2"
4720 [(set_attr "type" "X0_2cycle")])
4722 (define_insn "insn_v2avgs"
4723 [(set (match_operand:DI 0 "register_operand" "=r")
4724 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4725 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4726 UNSPEC_INSN_V2AVGS))]
4728 "v2avgs\t%0, %r1, %r2"
4729 [(set_attr "type" "X0")])
4731 (define_insn "insn_v2dotp"
4732 [(set (match_operand:DI 0 "register_operand" "=r")
4733 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4734 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4735 UNSPEC_INSN_V2DOTP))]
4737 "v2dotp\t%0, %r1, %r2"
4738 [(set_attr "type" "X0_2cycle")])
4740 (define_insn "insn_v2dotpa"
4741 [(set (match_operand:DI 0 "register_operand" "=r")
4742 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4743 (match_operand:DI 2 "reg_or_0_operand" "rO")
4744 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4745 UNSPEC_INSN_V2DOTPA))]
4747 "v2dotpa\t%0, %r2, %r3"
4748 [(set_attr "type" "X0_2cycle")])
4750 (define_insn "insn_v2mulfsc"
4751 [(set (match_operand:DI 0 "register_operand" "=r")
4752 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4753 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4754 UNSPEC_INSN_V2MULFSC))]
4756 "v2mulfsc\t%0, %r1, %r2"
4757 [(set_attr "type" "X0_2cycle")])
4759 (define_insn "insn_v2sadas"
4760 [(set (match_operand:DI 0 "register_operand" "=r")
4761 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4762 (match_operand:DI 2 "reg_or_0_operand" "rO")
4763 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4764 UNSPEC_INSN_V2SADAS))]
4766 "v2sadas\t%0, %r2, %r3"
4767 [(set_attr "type" "X0_2cycle")])
4769 (define_insn "insn_v2sadau"
4770 [(set (match_operand:DI 0 "register_operand" "=r")
4771 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4772 (match_operand:DI 2 "reg_or_0_operand" "rO")
4773 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4774 UNSPEC_INSN_V2SADAU))]
4776 "v2sadau\t%0, %r2, %r3"
4777 [(set_attr "type" "X0_2cycle")])
4779 (define_insn "insn_v2sads"
4780 [(set (match_operand:DI 0 "register_operand" "=r")
4781 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4782 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4783 UNSPEC_INSN_V2SADS))]
4785 "v2sads\t%0, %r1, %r2"
4786 [(set_attr "type" "X0_2cycle")])
4788 (define_insn "*insn_v2sads"
4789 [(set (match_operand:SI 0 "register_operand" "=r")
4791 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4792 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4793 UNSPEC_INSN_V2SADS)))]
4795 "v2sads\t%0, %r1, %r2"
4796 [(set_attr "type" "X0_2cycle")])
4798 (define_insn "insn_v2sadu"
4799 [(set (match_operand:DI 0 "register_operand" "=r")
4800 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4801 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4802 UNSPEC_INSN_V2SADU))]
4804 "v2sadu\t%0, %r1, %r2"
4805 [(set_attr "type" "X0_2cycle")])
4807 (define_insn "*insn_v2sadu"
4808 [(set (match_operand:SI 0 "register_operand" "=r")
4810 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4811 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4812 UNSPEC_INSN_V2SADU)))]
4814 "v2sadu\t%0, %r1, %r2"
4815 [(set_attr "type" "X0_2cycle")])
4817 (define_insn "insn_wh64"
4818 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
4820 (clobber (mem:BLK (const_int 0)))]
4823 [(set_attr "type" "X1")])
4826 ;; Network intrinsics
4828 ;; Note the "pseudo" text is handled specially by the
4829 ;; asm_output_opcode routine. If the output is an empty string, the
4830 ;; instruction would bypass the asm_output_opcode routine, bypassing
4831 ;; the bundle handling code.
4832 (define_insn "tilegx_network_barrier"
4833 [(unspec_volatile:SI [(const_int 0)] UNSPEC_NETWORK_BARRIER)]
4836 [(set_attr "type" "nothing")
4837 (set_attr "length" "0")])
4839 (define_insn "*netreg_receive"
4840 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,U,m")
4841 (unspec_volatile:DI [(match_operand:DI 1 "netreg_operand" "i,i,i")
4842 (reg:DI TILEGX_NETORDER_REG)]
4843 UNSPEC_NETWORK_RECEIVE))
4844 (clobber (reg:DI TILEGX_NETORDER_REG))]
4850 st_add\t%I0, %N1, %i0"
4851 [(set_attr "type" "*,Y2,X1")])
4853 (define_insn "*netreg_send"
4854 [(unspec_volatile:DI
4855 [(match_operand:DI 0 "netreg_operand" "i,i,i,i,i,i")
4856 (match_operand:DI 1 "reg_or_cint_operand" "r,I,J,K,N,P")
4857 (reg:DI TILEGX_NETORDER_REG)]
4858 UNSPEC_NETWORK_SEND)
4859 (clobber (reg:DI TILEGX_NETORDER_REG))]
4865 shl16insli\t%N0, zero, %h1
4866 v1addi\t%N0, zero, %j1
4867 v2addi\t%N0, zero, %h1"
4868 [(set_attr "type" "*,*,X01,X01,X01,X01")])
4870 (define_expand "tilegx_idn0_receive"
4872 [(set (match_operand:DI 0 "register_operand" "")
4873 (unspec_volatile:DI [(const_int TILEGX_NETREG_IDN0)
4874 (reg:DI TILEGX_NETORDER_REG)]
4875 UNSPEC_NETWORK_RECEIVE))
4876 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4879 (define_expand "tilegx_idn1_receive"
4881 [(set (match_operand:DI 0 "register_operand" "")
4882 (unspec_volatile:DI [(const_int TILEGX_NETREG_IDN1)
4883 (reg:DI TILEGX_NETORDER_REG)]
4884 UNSPEC_NETWORK_RECEIVE))
4885 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4888 (define_expand "tilegx_idn_send"
4890 [(unspec_volatile:DI [(const_int TILEGX_NETREG_IDN0)
4891 (match_operand:DI 0 "reg_or_cint_operand" "")
4892 (reg:DI TILEGX_NETORDER_REG)]
4893 UNSPEC_NETWORK_SEND)
4894 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4897 (define_expand "tilegx_udn0_receive"
4899 [(set (match_operand:DI 0 "register_operand" "")
4900 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN0)
4901 (reg:DI TILEGX_NETORDER_REG)]
4902 UNSPEC_NETWORK_RECEIVE))
4903 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4906 (define_expand "tilegx_udn1_receive"
4908 [(set (match_operand:DI 0 "register_operand" "")
4909 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN1)
4910 (reg:DI TILEGX_NETORDER_REG)]
4911 UNSPEC_NETWORK_RECEIVE))
4912 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4915 (define_expand "tilegx_udn2_receive"
4917 [(set (match_operand:DI 0 "register_operand" "")
4918 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN2)
4919 (reg:DI TILEGX_NETORDER_REG)]
4920 UNSPEC_NETWORK_RECEIVE))
4921 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4924 (define_expand "tilegx_udn3_receive"
4926 [(set (match_operand:DI 0 "register_operand" "")
4927 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN3)
4928 (reg:DI TILEGX_NETORDER_REG)]
4929 UNSPEC_NETWORK_RECEIVE))
4930 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4933 (define_expand "tilegx_udn_send"
4935 [(unspec_volatile:DI [(const_int TILEGX_NETREG_UDN0)
4936 (match_operand:DI 0 "reg_or_cint_operand" "")
4937 (reg:DI TILEGX_NETORDER_REG)]
4938 UNSPEC_NETWORK_SEND)
4939 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4942 (define_insn "*netreg_adddi_to_network"
4943 [(unspec_volatile:DI
4944 [(match_operand:DI 0 "netreg_operand" "i,i,i")
4945 (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO")
4946 (match_operand:DI 2 "add_operand" "r,I,JT"))
4947 (reg:DI TILEGX_NETORDER_REG)]
4948 UNSPEC_NETWORK_SEND)
4949 (clobber (reg:DI TILEGX_NETORDER_REG))]
4954 addli\t%N0, %r1, %H2"
4955 [(set_attr "type" "*,*,X01")])
4957 (define_insn "*netreg_adddi_from_network"
4958 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
4959 (plus:DI (unspec_volatile:DI
4960 [(match_operand:DI 1 "netreg_operand" "%i,i,i")
4961 (reg:DI TILEGX_NETORDER_REG)]
4962 UNSPEC_NETWORK_RECEIVE)
4963 (match_operand:DI 2 "add_operand" "rO,I,JT")))
4964 (clobber (reg:DI TILEGX_NETORDER_REG))]
4969 addli\t%0, %N1, %H2"
4970 [(set_attr "type" "*,*,X01")])
4974 ;; Stack protector instructions.
4977 (define_expand "stack_protect_set"
4978 [(set (match_operand 0 "nonautoincmem_operand" "")
4979 (match_operand 1 "nonautoincmem_operand" ""))]
4982 #ifdef TARGET_THREAD_SSP_OFFSET
4983 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
4984 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
4985 rtx ssp = gen_reg_rtx (Pmode);
4987 emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
4989 operands[1] = gen_rtx_MEM (Pmode, ssp);
4993 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
4995 emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
5000 (define_insn "stack_protect_setsi"
5001 [(set (match_operand:SI 0 "nonautoincmem_operand" "=U")
5002 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")]
5004 (set (match_scratch:SI 2 "=&r") (const_int 0))]
5006 "ld4s\t%2, %1; { st4\t%0, %2; move\t%2, zero }"
5007 [(set_attr "length" "16")
5008 (set_attr "type" "cannot_bundle_3cycle")])
5010 (define_insn "stack_protect_setdi"
5011 [(set (match_operand:DI 0 "nonautoincmem_operand" "=U")
5012 (unspec:DI [(match_operand:DI 1 "nonautoincmem_operand" "U")]
5014 (set (match_scratch:DI 2 "=&r") (const_int 0))]
5016 "ld\t%2, %1; { st\t%0, %2; move\t%2, zero }"
5017 [(set_attr "length" "16")
5018 (set_attr "type" "cannot_bundle_3cycle")])
5020 (define_expand "stack_protect_test"
5021 [(match_operand 0 "nonautoincmem_operand" "")
5022 (match_operand 1 "nonautoincmem_operand" "")
5023 (match_operand 2 "" "")]
5029 #ifdef TARGET_THREAD_SSP_OFFSET
5030 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
5031 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
5032 rtx ssp = gen_reg_rtx (Pmode);
5034 emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
5036 operands[1] = gen_rtx_MEM (Pmode, ssp);
5039 compare_result = gen_reg_rtx (Pmode);
5042 emit_insn (gen_stack_protect_testsi (compare_result, operands[0],
5045 emit_insn (gen_stack_protect_testdi (compare_result, operands[0],
5048 bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx);
5050 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]);
5052 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
5053 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
5059 (define_insn "stack_protect_testsi"
5060 [(set (match_operand:SI 0 "register_operand" "=&r")
5061 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")
5062 (match_operand:SI 2 "nonautoincmem_operand" "U")]
5064 (set (match_scratch:SI 3 "=&r") (const_int 0))]
5066 "ld4s\t%0, %1; ld4s\t%3, %2; { cmpeq\t%0, %0, %3; move\t%3, zero }"
5067 [(set_attr "length" "24")
5068 (set_attr "type" "cannot_bundle_4cycle")])
5070 (define_insn "stack_protect_testdi"
5071 [(set (match_operand:DI 0 "register_operand" "=&r")
5072 (unspec:DI [(match_operand:DI 1 "nonautoincmem_operand" "U")
5073 (match_operand:DI 2 "nonautoincmem_operand" "U")]
5075 (set (match_scratch:DI 3 "=&r") (const_int 0))]
5077 "ld\t%0, %1; ld\t%3, %2; { cmpeq\t%0, %0, %3; move\t%3, zero }"
5078 [(set_attr "length" "24")
5079 (set_attr "type" "cannot_bundle_4cycle")])