OSDN Git Service

Fix some typos and coding style violations.
[pf3gnuchains/gcc-fork.git] / gcc / config / tilegx / tilegx.md
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)
5 ;;
6 ;; This file is part of GCC.
7 ;;
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.
12 ;;
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.
17 ;;
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/>.
21
22 (define_constants [
23   ;;
24   ;; The following represent intrinsic insns, organized by latency.
25   ;;
26
27   ;; single cycle
28   (UNSPEC_INSN_ADDR_SHL16INSLI         1)
29   (UNSPEC_INSN_BFEXTS                  2)
30   (UNSPEC_INSN_BFEXTU                  3)
31   (UNSPEC_INSN_BFINS                   4)
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)
40   (UNSPEC_INSN_FINV                    13)
41   (UNSPEC_INSN_FLUSH                   14)
42   (UNSPEC_INSN_FLUSHWB                 15)
43   (UNSPEC_INSN_FNOP                    16)
44   (UNSPEC_INSN_ICOH                    17)
45   (UNSPEC_INSN_ILL                     18)
46   (UNSPEC_INSN_INFO                    19)
47   (UNSPEC_INSN_INFOL                   20)
48   (UNSPEC_INSN_INV                     21)
49   (UNSPEC_INSN_LNK                     22)
50   (UNSPEC_INSN_MFSPR                   23)
51   (UNSPEC_INSN_MM                      24)
52   (UNSPEC_INSN_MTSPR                   25)
53   (UNSPEC_INSN_NAP                     26)
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)
65   (UNSPEC_INSN_WH64                    38)
66
67   ;; 2 cycles
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)
134
135   ;; 11 cycles
136   (UNSPEC_INSN_CMPEXCH                 200)
137
138   ;;
139   ;; The following are special insns.
140   ;;
141
142   ;; Blockage
143   (UNSPEC_BLOCKAGE                     201)
144
145   ;; Lnk and its label
146   (UNSPEC_LNK_AND_LABEL                202)
147
148   ;; Memory fence
149   (UNSPEC_MF                           203)
150
151   ;; Insns generating difference of two labels
152   (UNSPEC_MOV_PCREL_STEP3              204)
153
154   ;; Latency specifying loads.
155   (UNSPEC_LATENCY_L2                   205)
156   (UNSPEC_LATENCY_MISS                 206)
157
158   ;; A pseudo-op that prevents network operations from being ordered.
159   (UNSPEC_NETWORK_BARRIER              207)
160
161   ;; Operations that access network registers.
162   (UNSPEC_NETWORK_RECEIVE              208)
163   (UNSPEC_NETWORK_SEND                 209)
164
165   ;; Stack protector operations
166   (UNSPEC_SP_SET                       210)
167   (UNSPEC_SP_TEST                      211)
168
169   ;; This is used to move a value to a SPR.
170   (UNSPEC_SPR_MOVE                     212)
171
172   ;; A call to __tls_get_addr
173   (UNSPEC_TLS_GD_CALL                  213)
174
175   ;; An opaque TLS "add" operation for TLS general dynamic model
176   ;; access.
177   (UNSPEC_TLS_GD_ADD                   214)
178
179   ;; An opaque TLS "load" operation for TLS initial exec model access.
180   (UNSPEC_TLS_IE_LOAD                  215)
181
182   ;; An opaque TLS "add" operation for TLS access.
183   (UNSPEC_TLS_ADD                      216)
184
185   ;; Atomics
186   (UNSPEC_ATOMIC                       217)
187   (UNSPEC_CMPXCHG                      218)
188   (UNSPEC_XCHG                         219)
189
190   ;;
191   ;; The following are operands.
192   ;;
193   (UNSPEC_HW0                          300)
194   (UNSPEC_HW1                          301)
195   (UNSPEC_HW2                          302)
196   (UNSPEC_HW3                          303)
197   (UNSPEC_HW0_LAST                     304)
198   (UNSPEC_HW1_LAST                     305)
199   (UNSPEC_HW2_LAST                     306)
200
201   (UNSPEC_HW0_PCREL                    307)
202   (UNSPEC_HW1_LAST_PCREL               308)
203
204   (UNSPEC_HW0_GOT                      309)
205   (UNSPEC_HW0_LAST_GOT                 310)
206   (UNSPEC_HW1_LAST_GOT                 311)
207
208   (UNSPEC_HW0_TLS_GD                   312)
209   (UNSPEC_HW1_LAST_TLS_GD              313)
210
211   (UNSPEC_HW0_TLS_IE                   314)
212   (UNSPEC_HW1_LAST_TLS_IE              315)
213
214   (UNSPEC_HW0_TLS_LE                   316)
215   (UNSPEC_HW1_LAST_TLS_LE              317)
216
217   ;; This is used to wrap around the addresses of non-temporal load/store
218   ;; intrinsics.
219   (UNSPEC_NON_TEMPORAL                 318)
220 ])
221
222 ;; Mark the last instruction of various latencies, used to
223 ;; determine the rtx costs of unspec insns.
224 (define_constants [
225   (TILEGX_LAST_LATENCY_1_INSN           99)
226   (TILEGX_LAST_LATENCY_2_INSN          199)
227   (TILEGX_LAST_LATENCY_INSN            299)
228 ])
229
230 (define_constants [
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)
237 ])
238
239 (define_constants [
240   (TILEGX_CMPEXCH_REG  66)
241   (TILEGX_NETORDER_REG 67)
242 ])
243
244
245 ;; Operand and operator predicates and constraints
246
247 (include "predicates.md")
248 (include "constraints.md")
249 (include "tilegx-generic.md")
250
251 ;; Define an insn type attribute.  This defines what pipes things can go in.
252 (define_attr "type"
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"))
255
256 (define_attr "length" ""
257    (cond [(eq_attr "type" "X1_branch")
258           (if_then_else
259            (and (le (minus (match_dup 0) (pc)) (const_int 524280))
260                 (le (minus (pc) (match_dup 0)) (const_int 524288)))
261            (const_int 8)
262            (const_int 16))
263           ]
264          (const_int 8)))
265
266
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])
276
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 "*")])
285
286 ;; Code iterator for either extend.
287 (define_code_iterator any_extend [sign_extend zero_extend])
288
289 ;; Code iterator for all three shifts.
290 (define_code_iterator any_shift [ashift ashiftrt lshiftrt])
291
292 ;; Code iterator for all byte ops without immediate variants.
293 (define_code_iterator v1op [us_minus us_plus minus ne le leu mult])
294
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])
297
298 ;; Code iterator for all 4-byte vector ops without immediate variants.
299 (define_code_iterator v4op [ss_minus ss_plus minus plus])
300
301 ;; Code iterator for all byte vector ops with immediate variants.
302 (define_code_iterator v1op_immed [plus umax umin eq lt ltu])
303
304 ;; Code iterator for all 2-byte vector ops with immediate variants.
305 (define_code_iterator v2op_immed [plus smax smin eq lt ltu])
306
307 ;; Code iterator for all 2-byte vector shifts without immediate variants.
308 (define_code_iterator v2shift [ss_ashift])
309
310 ;; Code iterator for all 4-byte vector shifts without immediate variants.
311 (define_code_iterator v4shift [ashift ashiftrt lshiftrt ss_ashift])
312
313 ;; <optab> expands to the name of the optab for a particular code.
314 (define_code_attr optab [(ashift "ashl")
315                          (ashiftrt "ashr")
316                          (lshiftrt "lshr")
317                          (ss_ashift "ssashl")
318                          (eq "seq")
319                          (ne "sne")
320                          (lt "slt")
321                          (ltu "sltu")
322                          (le "sle")
323                          (leu "sleu")
324                          (minus "sub")
325                          (plus "add")
326                          (mult "mul")
327                          (smax "smax")
328                          (smin "smin")
329                          (ss_minus "sssub")
330                          (ss_plus "ssadd")
331                          (umax "umax")
332                          (umin "umin")
333                          (us_minus "ussub")
334                          (us_plus "usadd")
335                          ])
336
337 ;; <insn> expands to the name of the insn that implements a particular
338 ;; code.
339 (define_code_attr insn [(ashift "shl")
340                         (ashiftrt "shrs")
341                         (lshiftrt "shru")
342                         (ss_ashift "shlsc")
343                         (eq "cmpeq")
344                         (ne "cmpne")
345                         (lt "cmplts")
346                         (ltu "cmpltu")
347                         (le "cmples")
348                         (leu "cmpleu")
349                         (minus "sub")
350                         (plus "add")
351                         (mult "multu")
352                         (smax "maxs")
353                         (smin "mins")
354                         (umax "maxu")
355                         (umin "minu")
356                         (ss_minus "subsc")
357                         (ss_plus  "addsc")
358                         (us_minus "subuc")
359                         (us_plus  "adduc")
360                         ])
361
362 ;; <pipe> expands to the pipeline resource that contains the
363 ;; particular code.
364 (define_code_attr pipe [(ashift "X01")
365                         (ashiftrt "X01")
366                         (lshiftrt "X01")
367                         (ss_ashift "X01")
368                         (eq "X01")
369                         (ne "X01")
370                         (lt "X01")
371                         (ltu "X01")
372                         (le "X01")
373                         (leu "X01")
374                         (minus "X01")
375                         (plus "X01")
376                         (mult "X0_2cycle")
377                         (smax "X01")
378                         (smin "X01")
379                         (umax "X01")
380                         (umin "X01")
381                         (ss_minus "X01")
382                         (ss_plus  "X01")
383                         (us_minus "X01")
384                         (us_plus  "X01")
385                         ])
386
387 ;; <comm> indicates whether a particular code is commutative, using
388 ;; the "%" commutative opterator constraint.
389 (define_code_attr comm [(ashift "")
390                         (ashiftrt "")
391                         (lshiftrt "")
392                         (ss_ashift "")
393                         (eq "%")
394                         (ne "%")
395                         (lt "")
396                         (ltu "")
397                         (le "")
398                         (leu "")
399                         (minus "")
400                         (plus "%")
401                         (mult "%")
402                         (smin "%")
403                         (umin "%")
404                         (smax "%")
405                         (umax "%")
406                         (ss_plus "%")
407                         (us_plus "%")
408                         (ss_minus "")
409                         (us_minus "")
410                         ])
411
412 ;; <s> is the load/store extension suffix.
413 (define_code_attr s [(zero_extend "u")
414                      (sign_extend "s")])
415
416 ;; Code for packing two 2-byte vectors.
417 (define_code_iterator v2pack [truncate us_truncate])
418
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")
422                               (us_truncate "usat")
423                               (ss_truncate "ssat")])
424
425 ;; <pack_insn> expands to the insn that implements a particular vector
426 ;; packing code.
427 (define_code_attr pack_insn [(truncate "packl")
428                              (us_truncate "packuc")
429                              (ss_truncate "packsc")])
430 \f
431 ;;
432 ;; The basic data move insns.
433 ;;
434
435 (define_expand "movqi"
436   [(set (match_operand:QI 0 "nonimmediate_operand" "")
437         (match_operand:QI 1 "nonautoinc_operand" ""))]
438   ""
439 {
440   if (tilegx_expand_mov (QImode, operands))
441     DONE;
442 })
443
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))"
449   "@
450    move\t%0, %r1
451    movei\t%0, %1
452    ld1u\t%0, %1
453    ld1u_add\t%0, %I1, %i1
454    st1\t%0, %r1
455    st1_add\t%I0, %r1, %i0"
456   [(set_attr "type" "*,*,Y2_2cycle,X1_2cycle,Y2,X1")])
457
458 (define_expand "movhi"
459   [(set (match_operand:HI 0 "nonimmediate_operand" "")
460         (match_operand:HI 1 "nonautoinc_operand" ""))]
461   ""
462 {
463   if (tilegx_expand_mov (HImode, operands))
464     DONE;
465 })
466
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))"
472   "@
473    move\t%0, %r1
474    movei\t%0, %1
475    moveli\t%0, %H1
476    ld2u\t%0, %1
477    ld2u_add\t%0, %I1, %i1
478    st2\t%0, %r1
479    st2_add\t%I0, %r1, %i0"
480   [(set_attr "type" "*,*,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
481
482 (define_expand "movsi"
483   [(set (match_operand:SI 0 "nonimmediate_operand" "")
484         (match_operand:SI 1 "nonautoinc_operand" ""))]
485   ""
486 {
487   if (tilegx_expand_mov (SImode, operands))
488     DONE;
489 })
490
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))"
496   "@
497    move\t%0, %r1
498    movei\t%0, %1
499    moveli\t%0, %H1
500    shl16insli\t%0, zero, %h1
501    ld4s\t%0, %1
502    ld4s_add\t%0, %I1, %i1
503    st4\t%0, %r1
504    st4_add\t%I0, %r1, %i0"
505   [(set_attr "type" "*,*,X01,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
506
507 (define_expand "movdi"
508   [(set (match_operand:DI 0 "nonimmediate_operand" "")
509         (match_operand:DI 1 "nonautoinc_operand" ""))]
510   ""
511 {
512   if (tilegx_expand_mov (DImode, operands))
513     DONE;
514 })
515
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))"
521   "@
522    move\t%0, %r1
523    movei\t%0, %1
524    moveli\t%0, %H1
525    shl16insli\t%0, zero, %h1
526    v1addi\t%0, zero, %j1
527    v2addi\t%0, zero, %h1
528    ld\t%0, %1
529    ld_add\t%0, %I1, %i1
530    st\t%0, %r1
531    st_add\t%I0, %r1, %i0"
532   [(set_attr "type" "*,*,X01,X01,X01,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
533
534 (define_expand "movmisalign<mode>"
535   [(set (match_operand:VEC248MODE 0 "nonautoincmem_nonimmediate_operand" "")
536         (match_operand:VEC248MODE 1 "nonautoincmem_general_operand" ""))]
537   ""
538 {
539   tilegx_expand_movmisalign (<MODE>mode, operands);
540   DONE;
541 })
542
543 (define_expand "movsf"
544   [(set (match_operand:SF 0 "nonimmediate_operand" "")
545         (match_operand:SF 1 "general_operand" ""))]
546   ""
547 {
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)))
555     {
556       emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
557                             gen_lowpart (SImode, operands[1])));
558       DONE;
559     }
560 })
561
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"))]
565   ""
566   "@
567    move\t%0, %r1
568    ld4s\t%0, %1
569    ld4s_add\t%0, %I1, %i1
570    st4\t%0, %r1
571    st4_add\t%I0, %r1, %i0"
572   [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
573
574 (define_expand "movdf"
575   [(set (match_operand:DF 0 "nonimmediate_operand" "")
576         (match_operand:DF 1 "general_operand" ""))]
577   ""
578 {
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)))
586     {
587       emit_insn (gen_movdi (gen_lowpart (DImode, operands[0]),
588                             gen_lowpart (DImode, operands[1])));
589       DONE;
590     }
591 })
592
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"))]
596   ""
597   "@
598    move\t%0, %r1
599    ld\t%0, %1
600    ld_add\t%0, %I1, %i1
601    st\t%0, %r1
602    st_add\t%I0, %r1, %i0"
603   [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
604
605 (define_expand "mov<mode>"
606   [(set (match_operand:VEC248MODE 0 "nonimmediate_operand" "")
607         (match_operand:VEC248MODE 1 "general_operand" ""))]
608   ""
609 {
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)))
617     {
618       emit_insn (gen_movdi (gen_lowpart (DImode, operands[0]),
619                             gen_lowpart (DImode, operands[1])));
620       DONE;
621     }
622 })
623
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"))]
627   ""
628   "@
629    move\t%0, %r1
630    ld\t%0, %1
631    ld_add\t%0, %I1, %i1
632    st\t%0, %r1
633    st_add\t%I0, %r1, %i0"
634   [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
635
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"))]
639   ""
640   "bfins\t%0, %r1, 0, 7"
641   [(set_attr "type" "X0")])
642   
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"))]
646   ""
647   "bfins\t%0, %r1, 0, 15"
648   [(set_attr "type" "X0")])
649   
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"))]
653   ""
654   "bfins\t%0, %r1, 0, 31"
655   [(set_attr "type" "X0")])
656
657 \f
658 ;;
659 ;; Bit-field extracts/inserts
660 ;;
661
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" ""))]
667   ""
668 {
669   rtx first_rtx = operands[2];
670   HOST_WIDE_INT first = INTVAL (first_rtx);
671   HOST_WIDE_INT width = INTVAL (operands[1]);
672   rtx v = operands[3];
673
674   if (CONST_INT_P (v))
675     {
676       /* Which bits are we affecting? */
677       HOST_WIDE_INT mask = ((((HOST_WIDE_INT) 1) << width) - 1) << first;
678
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;
683
684       if (n == 0)
685         {
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))
690             {
691               emit_insn (gen_anddi3 (operands[0], operands[0], mask_rtx));
692               DONE;
693             }
694
695           operands[3] = const0_rtx;
696         }
697       else
698         {
699           if (n == -1)
700             {
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))
705                 {
706                   emit_insn (gen_iordi3 (operands[0], operands[0], mask_rtx));
707                   DONE;
708                 }
709             }
710
711           if (!can_create_pseudo_p ())
712             FAIL;
713
714           operands[3] = force_reg (DImode, GEN_INT (n));
715         }
716     }
717 })
718
719 (define_insn "*insv_tblidxb0"
720   [(set (zero_extract:DI
721          (match_operand:DI 0 "register_operand" "+r")
722          (const_int 8)
723          (const_int 2))
724         (match_operand:DI 1 "register_operand" "rO"))]
725   ""
726   "tblidxb0\t%0, %r1"
727   [(set_attr "type" "Y0")])
728
729 (define_insn "*insv_tblidxb1"
730   [(set (zero_extract:DI
731          (match_operand:DI 0 "register_operand" "+r")
732          (const_int 8)
733          (const_int 2))
734         (zero_extract:DI
735          (const_int 8)
736          (const_int 8)
737         (match_operand:DI 1 "register_operand" "rO")))]
738   ""
739   "tblidxb1\t%0, %r1"
740   [(set_attr "type" "Y0")])
741
742 (define_insn "*insv_tblidxb2"
743   [(set (zero_extract:DI
744          (match_operand:DI 0 "register_operand" "+r")
745          (const_int 8)
746          (const_int 2))
747         (zero_extract:DI
748          (const_int 8)
749          (const_int 16)
750         (match_operand:DI 1 "register_operand" "rO")))]
751   ""
752   "tblidxb2\t%0, %r1"
753   [(set_attr "type" "Y0")])
754
755 (define_insn "*insv_tblidxb3"
756   [(set (zero_extract:DI
757          (match_operand:DI 0 "register_operand" "+r")
758          (const_int 8)
759          (const_int 2))
760         (zero_extract:DI
761          (const_int 8)
762          (const_int 24)
763         (match_operand:DI 1 "register_operand" "rO")))]
764   ""
765   "tblidxb3\t%0, %r1"
766   [(set_attr "type" "Y0")])
767
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"))]
774   ""
775   "bfins\t%0, %r3, %2, %2+%1-1"
776   [(set_attr "type" "X0")])
777
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"))
783         (zero_extract:DI
784          (match_operand:DI 3 "register_operand" "rO")
785          (match_dup 1)
786          (match_dup 2)))]
787   ""
788 {
789   int n;
790
791   operands[1] = GEN_INT (INTVAL (operands[1]) + INTVAL (operands[2]));
792
793   n = INTVAL (operands[2]);
794   n = (n == 0) ? 63 : n - 1;
795   operands[2] = GEN_INT (n);
796
797   return "mm\t%0, %r3, %1, %2";
798 }
799   [(set_attr "type" "X0")])
800
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" "")))]
806   ""
807 {
808   if (MEM_P (operands[1]))
809     {
810       HOST_WIDE_INT bit_offset, bit_width;
811       HOST_WIDE_INT first_byte_offset, last_byte_offset;
812
813       if (GET_MODE (operands[1]) != QImode)
814         FAIL;
815
816       bit_width = INTVAL (operands[2]);
817       bit_offset = INTVAL (operands[3]);
818
819       /* Reject bitfields that can be done with a normal load.  */
820       if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
821         FAIL;
822
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)
827         FAIL;
828
829       tilegx_expand_unaligned_load (operands[0], operands[1],
830                                     bit_width, bit_offset, 1);
831
832       DONE;
833     }
834
835   operands[1] = force_reg (DImode, operands[1]);
836 })
837
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" "")))]
843   ""
844 {
845   HOST_WIDE_INT bit_width = INTVAL (operands[2]);
846   HOST_WIDE_INT bit_offset = INTVAL (operands[3]);
847
848   if (MEM_P (operands[1]))
849     {
850       HOST_WIDE_INT first_byte_offset, last_byte_offset;
851
852       if (GET_MODE (operands[1]) != QImode)
853         FAIL;
854
855       /* Reject bitfields that can be done with a normal load.  */
856       if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
857         FAIL;
858
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)
863         FAIL;
864
865       tilegx_expand_unaligned_load (operands[0], operands[1],
866                                     bit_width, bit_offset, 0);
867
868       DONE;
869     }
870
871     operands[1] = force_reg (DImode, operands[1]);
872
873     if (bit_offset == 0)
874       {
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)));
878          DONE;
879       }
880 })
881
882 \f
883 ;;
884 ;; Addresses
885 ;;
886
887 ;; First step of the 3-insn sequence to materialize a symbolic
888 ;; address.
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" "")]
892                              UNSPEC_HW2_LAST)))])
893
894 ;; Second step of the 3-insn sequence to materialize a symbolic
895 ;; address.
896 (define_expand "mov_address_step2"
897   [(set (match_operand:DI 0 "register_operand" "")
898         (unspec:DI
899          [(match_operand:DI 1 "reg_or_0_operand" "")
900           (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
901                                UNSPEC_HW1))]
902          UNSPEC_INSN_ADDR_SHL16INSLI))])
903   
904 ;; Third step of the 3-insn sequence to materialize a symbolic
905 ;; address.
906 (define_expand "mov_address_step3"
907   [(set (match_operand:DI 0 "register_operand" "")
908         (unspec:DI
909          [(match_operand:DI 1 "reg_or_0_operand" "")
910           (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
911                                UNSPEC_HW0))]
912          UNSPEC_INSN_ADDR_SHL16INSLI))])
913
914 ;; First step of the 2-insn sequence to materialize a 32-bit symbolic
915 ;; address.
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" "")]
919                              UNSPEC_HW1_LAST)))])
920   
921 ;; Second step of the 2-insn sequence to materialize a 32-bit symbolic
922 ;; address.
923 (define_expand "mov_address_32bit_step2"
924   [(set (match_operand:SI 0 "register_operand" "")
925         (unspec:SI
926          [(match_operand:SI 1 "reg_or_0_operand" "")
927           (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
928                                UNSPEC_HW0))]
929          UNSPEC_INSN_ADDR_SHL16INSLI))])
930
931 \f
932 ;;
933 ;; pic related instructions
934 ;;
935
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))]
945   ""
946   "%1 = . + 8\n\tlnk\t%0"
947   [(set_attr "type" "Y1")])
948
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)))]
959   "flag_pic")
960   
961 (define_expand "mov_pcrel_step2<bitsuffix>"
962   [(set (match_operand:I48MODE 0 "register_operand" "")
963         (unspec:I48MODE
964          [(match_operand:I48MODE 1 "reg_or_0_operand" "")
965           (const:I48MODE
966            (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")
967                             (match_operand:I48MODE 3 "symbolic_operand" "")]
968                            UNSPEC_HW0_PCREL))]
969          UNSPEC_INSN_ADDR_SHL16INSLI))]
970   "flag_pic")
971
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))]
979   "flag_pic"
980   "add<x>\t%0, %r1, %r2")
981
982 (define_expand "add_got16<bitsuffix>"
983   [(set (match_operand:I48MODE 0 "register_operand" "")
984         (plus:I48MODE
985          (match_operand:I48MODE 1 "reg_or_0_operand" "")
986          (const:I48MODE
987           (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
988                           UNSPEC_HW0_LAST_GOT))))]
989   "flag_pic == 1")
990
991 (define_expand "mov_got32_step1<bitsuffix>"
992   [(set (match_operand:I48MODE 0 "register_operand" "")
993         (const:I48MODE
994          (unspec:I48MODE [(match_operand:I48MODE 1 "symbolic_operand" "")]
995                          UNSPEC_HW1_LAST_GOT)))]
996   "flag_pic == 2")
997
998 (define_expand "mov_got32_step2<bitsuffix>"
999   [(set (match_operand:I48MODE 0 "register_operand" "")
1000         (unspec:I48MODE
1001          [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1002           (const:I48MODE
1003            (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
1004                            UNSPEC_HW0_GOT))]
1005          UNSPEC_INSN_ADDR_SHL16INSLI))]
1006   "flag_pic == 2")
1007
1008 \f
1009 ;;
1010 ;; TLS
1011 ;;
1012  
1013 (define_expand "mov_tls_gd_step1<bitsuffix>"
1014   [(set (match_operand:I48MODE 0 "register_operand" "")
1015         (const:I48MODE
1016          (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1017                          UNSPEC_HW1_LAST_TLS_GD)))]
1018   "HAVE_AS_TLS")
1019
1020 (define_expand "mov_tls_gd_step2<bitsuffix>"
1021   [(set (match_operand:I48MODE 0 "register_operand" "")
1022         (unspec:I48MODE
1023          [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1024           (const:I48MODE
1025            (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1026                            UNSPEC_HW0_TLS_GD))]
1027          UNSPEC_INSN_ADDR_SHL16INSLI))]
1028   "HAVE_AS_TLS")
1029
1030 (define_expand "mov_tls_ie_step1<bitsuffix>"
1031   [(set (match_operand:I48MODE 0 "register_operand" "")
1032         (const:I48MODE
1033          (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1034                          UNSPEC_HW1_LAST_TLS_IE)))]
1035   "HAVE_AS_TLS")
1036
1037 (define_expand "mov_tls_ie_step2<bitsuffix>"
1038   [(set (match_operand:I48MODE 0 "register_operand" "")
1039         (unspec:I48MODE
1040          [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1041           (const:I48MODE
1042            (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1043                            UNSPEC_HW0_TLS_IE))]
1044          UNSPEC_INSN_ADDR_SHL16INSLI))]
1045   "HAVE_AS_TLS")
1046
1047 (define_expand "mov_tls_le_step1<bitsuffix>"
1048   [(set (match_operand:I48MODE 0 "register_operand" "")
1049         (const:I48MODE
1050          (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1051                          UNSPEC_HW1_LAST_TLS_LE)))]
1052   "HAVE_AS_TLS")
1053
1054 (define_expand "mov_tls_le_step2<bitsuffix>"
1055   [(set (match_operand:I48MODE 0 "register_operand" "")
1056         (unspec:I48MODE
1057          [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1058           (const:I48MODE
1059            (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1060                            UNSPEC_HW0_TLS_LE))]
1061          UNSPEC_INSN_ADDR_SHL16INSLI))]
1062   "HAVE_AS_TLS")
1063
1064 (define_expand "tls_gd_call<bitsuffix>"
1065   [(parallel
1066     [(set (reg:I48MODE 0)
1067           (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1068                            (reg:I48MODE 0)]
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))])]
1076    ""
1077 {
1078   cfun->machine->calls_tls_get_addr = true;
1079 })
1080
1081 (define_insn "*tls_gd_call<bitsuffix>"
1082   [(set (reg:I48MODE 0)
1083         (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1084                          (reg:I48MODE 0)]
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))]
1092   ""
1093   "jal\ttls_gd_call(%0)"
1094   [(set_attr "type" "X1")])
1095
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))]
1101   "HAVE_AS_TLS"
1102   "add<x>i\t%0, %1, tls_gd_add(%2)")
1103
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" "")]
1109                         UNSPEC_TLS_ADD))]
1110   "HAVE_AS_TLS"
1111   "add<x>i\t%0, %1, tls_add(%3)")
1112
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))]
1118   "HAVE_AS_TLS"
1119   "ld<four_s_if_si>_tls\t%0, %1, tls_ie_load(%2)"
1120   [(set_attr "type" "X1_2cycle")])
1121
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")))]
1128   ""
1129   "bfextu\t%0, %r1, %3, %3+%2-1"
1130   [(set_attr "type" "X0")])
1131
1132 (define_insn "*sign_extract_low32"
1133   [(set (match_operand:DI 0 "register_operand" "=r")
1134         (sign_extract:DI
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")
1140
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")))]
1147   ""
1148   "bfexts\t%0, %r1, %3, %3+%2-1"
1149   [(set_attr "type" "X0")])
1150
1151 \f
1152 ;;
1153 ;; Arithmetic ops
1154 ;;
1155
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")))]
1160   ""
1161   "@
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")])
1166
1167 (define_insn "*addsi3_sext"
1168   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1169         (sign_extend:DI
1170          (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO")
1171                   (match_operand:SI 2 "add_operand" "r,I,JT"))))]
1172   ""
1173   "@
1174    addx\t%0, %r1, %r2
1175    addxi\t%0, %r1, %2
1176    addxli\t%0, %r1, %H2"
1177   [(set_attr "type" "*,*,X01")])
1178
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")))]
1183   ""
1184   "sub<x>\t%0, %r1, %r2")
1185
1186 (define_insn "*subsi3_sext"
1187   [(set (match_operand:DI 0 "register_operand" "=r")
1188         (sign_extend:DI
1189          (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1190                    (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1191   ""
1192   "subx\t%0, %r1, %r2")
1193
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")))]
1197   ""
1198   "sub<x>\t%0, zero, %r1")
1199
1200 (define_insn "*negsi2_sext"
1201   [(set (match_operand:DI 0 "register_operand" "=r")
1202         (sign_extend:DI
1203          (neg:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))))]
1204   ""
1205   "subx\t%0, zero, %r1")
1206
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")))]
1211   ""
1212   "addxsc\t%0, %r1, %r2"
1213   [(set_attr "type" "X01")])
1214
1215 (define_insn "*ssaddsi3_sext"
1216   [(set (match_operand:DI 0 "register_operand" "=r")
1217         (sign_extend:DI
1218          (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1219                      (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1220   ""
1221   "addxsc\t%0, %r1, %r2"
1222   [(set_attr "type" "X01")])
1223
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")))]
1228   ""
1229   "subxsc\t%0, %r1, %r2"
1230   [(set_attr "type" "X01")])
1231
1232 (define_insn "*sssubsi3_sext"
1233   [(set (match_operand:DI 0 "register_operand" "=r")
1234         (sign_extend:DI
1235          (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1236                       (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1237   ""
1238   "subxsc\t%0, %r1, %r2"
1239   [(set_attr "type" "X01")])
1240
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" "")))]
1245   ""
1246 {
1247   rtx result = gen_lowpart (DImode, operands[0]);
1248   rtx a = gen_lowpart (DImode, operands[1]);
1249   rtx b = gen_lowpart (DImode, operands[2]);
1250
1251   rtx tmp = gen_reg_rtx (DImode);
1252   rtx flags = gen_reg_rtx (DImode);
1253
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));
1258
1259   DONE;
1260 })
1261
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" "")))]
1266   ""
1267 {
1268   rtx result = gen_lowpart (DImode, operands[0]);
1269   rtx a = gen_lowpart (DImode, operands[1]);
1270   rtx b = gen_lowpart (DImode, operands[2]);
1271
1272   rtx tmp = gen_reg_rtx (DImode);
1273   rtx flags = gen_reg_rtx (DImode);
1274
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));
1279
1280   DONE;
1281 })
1282
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" "")))]
1287   ""
1288 {
1289   rtx result = gen_lowpart (DImode, operands[0]);
1290   rtx a = gen_lowpart (DImode, operands[1]);
1291   rtx b = gen_lowpart (DImode, operands[2]);
1292
1293   rtx tmp1 = gen_reg_rtx (DImode);
1294   rtx tmp2 = gen_reg_rtx (DImode);
1295   rtx flags = gen_reg_rtx (DImode);
1296
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));
1301
1302   DONE;
1303 })
1304
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" "")))]
1309   ""
1310 {
1311   rtx result = gen_lowpart (DImode, operands[0]);
1312   rtx a = gen_lowpart (DImode, operands[1]);
1313   rtx b = gen_lowpart (DImode, operands[2]);
1314
1315   rtx min = gen_reg_rtx (DImode);
1316   rtx max = gen_reg_rtx (DImode);
1317   rtx flags = gen_reg_rtx (DImode);
1318
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));
1325
1326   DONE;
1327 })
1328
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" "")))]
1333   ""
1334 {
1335   rtx result = gen_lowpart (DImode, operands[0]);
1336   rtx a = gen_lowpart (DImode, operands[1]);
1337   rtx b = gen_lowpart (DImode, operands[2]);
1338
1339   rtx min = gen_reg_rtx (DImode);
1340   rtx max = gen_reg_rtx (DImode);
1341   rtx flags = gen_reg_rtx (DImode);
1342
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));
1349
1350   DONE;
1351 })
1352
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" "")))]
1357   ""
1358   ;; TODO: Decide if we should not inline this with -Os.
1359   ;; "optimize_function_for_speed_p (cfun)"
1360 {
1361   rtx result = gen_lowpart (DImode, operands[0]);
1362   rtx a = gen_lowpart (DImode, operands[1]);
1363   rtx b = gen_lowpart (DImode, operands[2]);
1364
1365   rtx a_unpacked = gen_reg_rtx (DImode);
1366   rtx b_unpacked = gen_reg_rtx (DImode);
1367   rtx flags = gen_reg_rtx (DImode);
1368
1369   rtx low1 = gen_reg_rtx (DImode);
1370   rtx low = gen_reg_rtx (DImode);
1371   rtx low_carry = gen_reg_rtx (DImode);
1372
1373   rtx mid = gen_reg_rtx (DImode);
1374   rtx mid_l32 = gen_reg_rtx (DImode);
1375   rtx mid_r32 = gen_reg_rtx (DImode);
1376
1377   rtx high1 = gen_reg_rtx (DImode);
1378   rtx high = gen_reg_rtx (DImode);
1379   rtx high1_plus_mid_r32 = gen_reg_rtx (DImode);
1380
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));
1389
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));
1396
1397   emit_insn (gen_ashldi3 (mid_l32, mid, GEN_INT (32)));
1398   emit_insn (gen_lshrdi3 (mid_r32, mid, GEN_INT (32)));
1399
1400   emit_insn (gen_adddi3 (high1_plus_mid_r32, high1, mid_r32));
1401
1402   emit_insn (gen_adddi3 (low, low1, mid_l32));
1403   emit_insn (gen_insn_cmpltu_didi (low_carry, low, mid_l32));
1404
1405   emit_insn (gen_adddi3 (high, high1_plus_mid_r32, low_carry));
1406
1407   emit_insn (gen_insn_fdouble_pack1 (result, high, flags));
1408   emit_insn (gen_insn_fdouble_pack2 (result, result, high, low));
1409
1410   DONE;
1411 })
1412
1413 \f
1414 ;;
1415 ;; Shifts
1416 ;;
1417
1418 (define_insn "ashl<mode>3"
1419   [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1420         (ashift:I48MODE
1421          (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1422          (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1423   ""
1424   "@
1425   shl<x>i\t%0, %r1, %2
1426   shl<x>\t%0, %r1, %r2"
1427   [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1428
1429 (define_insn "*ashlsi3_sext"
1430   [(set (match_operand:DI 0 "register_operand" "=r,r")
1431         (sign_extend:DI
1432          (ashift:SI
1433           (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1434           (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1435   ""
1436   "@
1437   shlxi\t%0, %r1, %2
1438   shlx\t%0, %r1, %r2"
1439   [(set_attr "type" "X01,X01")])
1440
1441 (define_insn "ashr<mode>3"
1442   [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1443         (ashiftrt:I48MODE
1444          (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1445          (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1446   ""
1447   "@
1448   shrsi\t%0, %r1, %2
1449   shrs\t%0, %r1, %r2")
1450
1451 (define_insn "*ashrsi3_sext"
1452   [(set (match_operand:DI 0 "register_operand" "=r,r")
1453         (sign_extend:DI
1454          (ashiftrt:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1455                       (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1456   ""
1457   "@
1458   shrsi\t%0, %r1, %2
1459   shrs\t%0, %r1, %r2")
1460
1461 (define_insn "lshr<mode>3"
1462   [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1463         (lshiftrt:I48MODE
1464          (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1465          (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1466   ""
1467   "@
1468   shru<x>i\t%0, %r1, %2
1469   shru<x>\t%0, %r1, %r2"
1470   [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1471   
1472 (define_insn "*lshrsi3_sext"
1473   [(set (match_operand:DI 0 "register_operand" "=r,r")
1474         (sign_extend:DI
1475          (lshiftrt:SI
1476           (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1477           (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1478   ""
1479   "@
1480   shruxi\t%0, %r1, %2
1481   shrux\t%0, %r1, %r2"
1482   [(set_attr "type" "X01,X01")])
1483   
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")))]
1488   ""
1489   "@
1490   rotli\t%0, %r1, %2
1491   rotl\t%0, %r1, %r2")
1492
1493 (define_insn "insn_shl16insli"
1494   [(set (match_operand:DI 0 "register_operand" "=r,r")
1495         (ior:DI
1496          (ashift:DI
1497           (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1498           (const_int 16))
1499          (match_operand:DI 2 "u16bit_or_const_symbolic_operand" "O,KT")))]
1500   ""
1501   "@
1502    shli\t%0, %r1, 16
1503    shl16insli\t%0, %r1, %H2"
1504   [(set_attr "type" "*,X01")])
1505
1506 (define_insn "insn_addr_shl16insli<bitsuffix>"
1507   [(set (match_operand:I48MODE 0 "register_operand" "=r")
1508         (unspec:I48MODE
1509          [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1510           (match_operand:I48MODE 2 "const_symbolic_operand" "T")]
1511          UNSPEC_INSN_ADDR_SHL16INSLI))]
1512   ""
1513   "shl16insli\t%0, %r1, %H2"
1514   [(set_attr "type" "X01")])
1515
1516 \f
1517 ;;
1518 ;; Compares
1519 ;;
1520
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" "")]))]
1526   ""
1527 {
1528   if (!tilegx_emit_setcc (operands, GET_MODE (operands[2])))
1529     FAIL;
1530   else
1531     DONE;
1532 })
1533
1534  
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")))]
1539   ""
1540   "cmpne\t%0, %r1, %r2")
1541  
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")))]
1546   ""
1547   "@
1548    cmpeqi\t%0, %r1, %2
1549    cmpeq\t%0, %r1, %r2")
1550
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")))]
1555   ""
1556   "@
1557    cmpltsi\t%0, %r1, %2
1558    cmplts\t%0, %r1, %r2")
1559
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")))]
1564   ""
1565   "@
1566    cmpltui\t%0, %r1, %2
1567    cmpltu\t%0, %r1, %r2"
1568   [(set_attr "type" "X01,*")])
1569
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")))]
1574   ""
1575   "@
1576    cmpltsi\t%0, %r1, %P2
1577    cmples\t%0, %r1, %r2")
1578
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")))]
1583   ""
1584   "@
1585    cmpltui\t%0, %r1, %P2
1586    cmpleu\t%0, %r1, %r2"
1587   [(set_attr "type" "X01,*")])
1588
1589 \f
1590 ;;
1591 ;; Logical ops
1592 ;;
1593
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")))]
1598   ""
1599   "@
1600    andi\t%0, %r1, %2
1601    bfextu\t%0, %r1, %M2
1602    bfins\t%0, zero, %m2
1603    and\t%0, %r1, %r2"
1604   [(set_attr "type" "*,X0,X0,*")])
1605   
1606 (define_insn "*andsi3_sext"
1607   [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
1608         (sign_extend:DI
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"))))]
1611   ""
1612   "@
1613    andi\t%0, %r1, %2
1614    bfextu\t%0, %r1, %M2
1615    bfins\t%0, zero, %m2
1616    and\t%0, %r1, %r2"
1617   [(set_attr "type" "*,X0,X0,*")])
1618   
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")))]
1623   ""
1624   "@
1625    andi\t%0, %r1, %2
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
1630    and\t%0, %r1, %r2"
1631   [(set_attr "type" "*,X01,X01,X0,X0,*")])
1632   
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")))]
1637   ""
1638   "@
1639    or\t%0, %r1, %r2
1640    ori\t%0, %r1, %2"
1641   [(set_attr "type" "*,X01")])
1642   
1643 (define_insn "*iorsi3_sext"
1644   [(set (match_operand:DI 0 "register_operand" "=r,r")
1645         (sign_extend:DI
1646          (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1647                  (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1648   ""
1649   "@
1650    or\t%0, %r1, %r2
1651    ori\t%0, %r1, %2"
1652   [(set_attr "type" "*,X01")])
1653   
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")))]
1658   ""
1659   "@
1660    xor\t%0, %r1, %r2
1661    xori\t%0, %r1, %2"
1662   [(set_attr "type" "*,X01")])
1663
1664 (define_insn "*xorsi3_sext"
1665   [(set (match_operand:DI 0 "register_operand" "=r,r")
1666         (sign_extend:DI
1667          (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1668                  (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1669   ""
1670   "@
1671    xor\t%0, %r1, %r2
1672    xori\t%0, %r1, %2"
1673   [(set_attr "type" "*,X01")])
1674
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")))]
1678   ""
1679   "clz\t%0, %r1"
1680   [(set_attr "type" "Y0")])
1681
1682 (define_expand "clzsi2"
1683   [(set (match_dup 2)
1684         (ashift:DI (match_operand:SI 1 "reg_or_0_operand" "")
1685                    (const_int 32)))
1686    (set (subreg:DI (match_operand:SI 0 "register_operand" "") 0)
1687         (clz:DI (match_dup 2)))]
1688    ""
1689    {
1690      operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);
1691      operands[2] = gen_reg_rtx (DImode);
1692    })
1693
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")))]
1697   ""
1698   "ctz\t%0, %r1"
1699   [(set_attr "type" "Y0")])
1700
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")))]
1704   ""
1705   "pcnt\t%0, %r1"
1706   [(set_attr "type" "Y0")])
1707
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" "")))]
1711   ""
1712   {
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));
1716     DONE;
1717   })
1718
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")))]
1722   ""
1723   "revbytes\t%0, %r1"
1724   [(set_attr "type" "Y0")])
1725
1726 (define_expand "bswapsi2"
1727   [(set (match_operand:SI 0 "register_operand" "")
1728         (bswap:SI (match_operand:SI 1 "reg_or_0_operand" "")))]
1729   ""
1730   {
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)));
1735     DONE;
1736   })
1737
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")))]
1741   ""
1742   "nor\t%0, %r1, zero")
1743
1744 \f
1745 ;;
1746 ;; Conditional moves
1747 ;;
1748
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" "")))]
1755   ""
1756   { operands[1] = tilegx_emit_conditional_move (operands[1]); })
1757
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")
1763            (const_int 0)])
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")))]
1766   ""
1767   "@
1768    m%c4\t%0, %r1, %r2
1769    m%C4\t%0, %r1, %r3
1770    cmov%d4z\t%0, %r1, %r2
1771    cmov%D4z\t%0, %r1, %r3"
1772   [(set_attr "type" "*,*,Y0,Y0")])
1773
1774 (define_expand "insn_mz"
1775   [(set (match_operand:DI 0 "register_operand" "")
1776         (if_then_else:DI
1777          (eq (match_operand:DI 1 "reg_or_0_operand" "")
1778              (const_int 0))
1779          (match_operand:DI 2 "reg_or_0_operand" "")
1780          (const_int 0)))])
1781
1782 (define_expand "insn_mnz"
1783   [(set (match_operand:DI 0 "register_operand" "")
1784         (if_then_else:DI
1785          (ne (match_operand:DI 1 "reg_or_0_operand" "")
1786              (const_int 0))
1787          (match_operand:DI 2 "reg_or_0_operand" "")
1788          (const_int 0)))])
1789
1790 (define_expand "insn_cmoveqz"
1791   [(set (match_operand:DI 0 "register_operand" "")
1792         (if_then_else:DI
1793          (eq (match_operand:DI 2 "reg_or_0_operand" "")
1794              (const_int 0))
1795          (match_operand:DI 3 "reg_or_0_operand" "")
1796          (match_operand:DI 1 "reg_or_0_operand" "")))])
1797
1798 (define_expand "insn_cmovnez"
1799   [(set (match_operand:DI 0 "register_operand" "")
1800         (if_then_else:DI
1801          (ne (match_operand:DI 2 "reg_or_0_operand" "")
1802              (const_int 0))
1803          (match_operand:DI 3 "reg_or_0_operand" "")
1804          (match_operand:DI 1 "reg_or_0_operand" "")))])
1805
1806 \f
1807 ;;
1808 ;; Conversions
1809 ;;
1810
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")))]
1814   ""
1815   "@
1816    bfextu\t%0, %r1, 0, 7
1817    ld1u\t%0, %1
1818    ld1u_add\t%0, %I1, %i1"
1819   [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1820   
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")))]
1824   ""
1825   "@
1826    bfextu\t%0, %r1, 0, 15
1827    ld2u\t%0, %1
1828    ld2u_add\t%0, %I1, %i1"
1829   [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1830
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")))]
1834   ""
1835   "@
1836    v4int_l\t%0, zero, %r1
1837    ld4u\t%0, %1
1838    ld4u_add\t%0, %I1, %i1"
1839   [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
1840
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")))]
1844   ""
1845   "@
1846    bfexts\t%0, %r1, 0, 7
1847    ld1s\t%0, %1
1848    ld1s_add\t%0, %I1, %i1"
1849   [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1850
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")))]
1854   ""
1855   "@
1856    bfexts\t%0, %r1, 0, 15
1857    ld2s\t%0, %1
1858    ld2s_add\t%0, %I1, %i1"
1859   [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1860
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")))]
1868   ""
1869   "@
1870    #
1871    ld4s\t%0, %1
1872    ld4s_add\t%0, %I1, %i1"
1873   "&& reload_completed && register_operand (operands[1], VOIDmode)"
1874   [(const_int 0)]
1875 {
1876   emit_note (NOTE_INSN_DELETED);
1877   DONE;
1878 }
1879   [(set_attr "type" "*,Y2_2cycle,X1_2cycle")])
1880
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:
1887 ;;
1888 ;;                        A       B
1889 ;;    DI ---> HI  ==  DI ---> SI ---> HI
1890 ;;    DI ---> QI  ==  DI ---> SI ---> QI
1891 ;;
1892 ;; Step A needs a real instruction but step B does not.
1893
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")))]
1897   ""
1898   "@
1899    addxi\t%0, %r1, 0
1900    st4\t%0, %r1
1901    st4_add\t%I0, %r1, %i0"
1902   [(set_attr "type" "Y01,Y2,X1")])
1903
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")))]
1907   ""
1908   "@
1909    addxi\t%0, %r1, 0
1910    st2\t%0, %r1
1911    st2_add\t%I0, %r1, %i0"
1912   [(set_attr "type" "Y01,Y2,X1")])
1913
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")))]
1917   ""
1918   "@
1919    addxi\t%0, %r1, 0
1920    st1\t%0, %r1
1921    st1_add\t%I0, %r1, %i0"
1922   [(set_attr "type" "Y01,Y2,X1")])
1923
1924 ;; Combiner patterns to optimize away unnecessary truncates.
1925
1926 (define_insn "*zero_extendsidi_truncdisi"
1927   [(set (match_operand:DI 0 "register_operand" "=r")
1928         (zero_extend:DI
1929          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))))]
1930   ""
1931   "v4int_l\t%0, zero, %r1"
1932   [(set_attr "type" "X01")])
1933
1934 (define_insn "*addsi_truncdisi"
1935   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1936         (plus:SI
1937          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO"))
1938          (match_operand:SI 2 "add_operand" "r,I,JT")))]
1939   ""
1940   "@
1941    addx\t%0, %r1, %r2
1942    addxi\t%0, %r1, %2
1943    addxli\t%0, %r1, %H2"
1944   [(set_attr "type" "*,*,X01")])
1945
1946 (define_insn "*addsi_truncdisi2"
1947   [(set (match_operand:SI 0 "register_operand" "=r")
1948         (plus:SI
1949          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1950          (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1951   ""
1952   "addx\t%0, %r1, %r2")
1953
1954 (define_insn "*ashldi_truncdisi"
1955   [(set (match_operand:DI 0 "register_operand" "=r")
1956         (ashift:DI
1957          (match_operand:DI 1 "reg_or_0_operand" "rO")
1958          (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1959   ""
1960   "shl\t%0, %r1, %r2")
1961
1962 (define_insn "*ashlsi_truncdisi"
1963   [(set (match_operand:SI 0 "register_operand" "=r,r")
1964         (ashift:SI
1965          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
1966          (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
1967   ""
1968   "@
1969   shlxi\t%0, %r1, %2
1970   shlx\t%0, %r1, %r2"
1971   [(set_attr "type" "X01,X01")])
1972
1973 (define_insn "*ashlsi_truncdisi2"
1974   [(set (match_operand:SI 0 "register_operand" "=r")
1975         (ashift:SI
1976          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1977          (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1978   ""
1979   "shlx\t%0, %r1, %r2"
1980   [(set_attr "type" "X01")])
1981
1982 (define_insn "*ashrdi3_truncdisi"
1983   [(set (match_operand:DI 0 "register_operand" "=r")
1984         (ashiftrt:DI
1985          (match_operand:DI 1 "reg_or_0_operand" "rO")
1986          (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1987   ""
1988   "shrs\t%0, %r1, %r2")
1989
1990 (define_insn "*lshrsi_truncdisi"
1991   [(set (match_operand:SI 0 "register_operand" "=r,r")
1992         (lshiftrt:SI
1993          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
1994          (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
1995   ""
1996   "@
1997   shruxi\t%0, %r1, %2
1998   shrux\t%0, %r1, %r2"
1999   [(set_attr "type" "X01,X01")])
2000
2001 (define_insn "*lshrsi_truncdisi2"
2002   [(set (match_operand:SI 0 "register_operand" "=r")
2003         (lshiftrt:SI
2004          (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
2005          (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
2006   ""
2007   "shrux\t%0, %r1, %r2"
2008   [(set_attr "type" "X01")])
2009
2010 (define_insn "*lshrdi_truncdisi"
2011   [(set (match_operand:DI 0 "register_operand" "=r")
2012         (lshiftrt:DI
2013          (match_operand:DI 1 "reg_or_0_operand" "rO")
2014          (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2015   ""
2016   "shru\t%0, %r1, %r2")
2017
2018 (define_insn "*rotldi_truncdisi"
2019   [(set (match_operand:DI 0 "register_operand" "=r")
2020         (rotate:DI
2021          (match_operand:DI 1 "reg_or_0_operand" "rO")
2022          (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2023   ""
2024   "rotl\t%0, %r1, %r2")
2025
2026 \f
2027 ;;
2028 ;; Multiplies
2029 ;;
2030
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")))]
2035   ""
2036   "mulx\t%0, %r1, %r2"
2037   [(set_attr "type" "Y0_2cycle")])
2038
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"))
2043                  (sign_extend:DI
2044                   (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2045   ""
2046   "mul_ls_ls\t%0, %r1, %r2"
2047   [(set_attr "type" "Y0_2cycle")])
2048
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"))
2053                  (zero_extend:DI
2054                   (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2055   ""
2056   "mul_lu_lu\t%0, %r1, %r2"
2057   [(set_attr "type" "Y0_2cycle")])
2058
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))
2064    (set (match_dup 0)
2065         (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2066                    UNSPEC_INSN_MULA_HU_LU))
2067    (set (match_dup 0)
2068         (ashift:DI (match_dup 0) (const_int 32)))
2069    (set (match_dup 0)
2070         (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2071                    UNSPEC_INSN_MULA_LU_LU))]
2072   ""
2073   {
2074     operands[1] = force_reg (DImode, operands[1]);
2075     operands[1] = make_safe_from (operands[1], operands[0]);
2076
2077     if (tilegx_expand_muldi (operands[0], operands[1], operands[2]))
2078       DONE;
2079     else
2080       {
2081         operands[2] = force_reg (DImode, operands[2]);
2082         operands[2] = make_safe_from (operands[2], operands[0]);
2083       }
2084   })
2085
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"))
2090                  (sign_extend:DI
2091                   (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2092   ""
2093   "mul_ls_lu\t%0, %r2, %r1"
2094   [(set_attr "type" "X0_2cycle")])
2095   
2096 (define_insn "maddsidi4"
2097   [(set (match_operand:DI 0 "register_operand" "=r")
2098         (plus:DI
2099          (mult:DI (sign_extend:DI
2100                    (match_operand:SI 1 "reg_or_0_operand" "rO"))
2101                   (sign_extend:DI
2102                    (match_operand:SI 2 "reg_or_0_operand" "rO")))
2103          (match_operand:DI 3 "register_operand" "0")))]
2104   ""
2105   "mula_ls_ls\t%0, %r1, %r2"
2106   [(set_attr "type" "Y0_2cycle")])
2107
2108 (define_insn "umaddsidi4"
2109   [(set (match_operand:DI 0 "register_operand" "=r")
2110         (plus:DI
2111          (mult:DI (zero_extend:DI
2112                    (match_operand:SI 1 "reg_or_0_operand" "rO"))
2113                   (zero_extend:DI
2114                    (match_operand:SI 2 "reg_or_0_operand" "rO")))
2115          (match_operand:DI 3 "register_operand" "0")))]
2116   ""
2117   "mula_lu_lu\t%0, %r1, %r2"
2118   [(set_attr "type" "Y0_2cycle")])
2119
2120 (define_expand "smulsi3_highpart"
2121   [(set (match_dup 3)
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" ""))))
2124    (set (match_dup 4)
2125         (ashiftrt:DI (match_dup 3) (const_int 32)))
2126    (set (match_operand:SI 0 "register_operand" "")
2127         (truncate:SI (match_dup 4)))]
2128   ""
2129   {
2130     operands[3] = gen_reg_rtx (DImode);
2131     operands[4] = gen_reg_rtx (DImode);
2132   })
2133
2134 (define_expand "umulsi3_highpart"
2135   [(set (match_dup 3)
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" ""))))
2138    (set (match_dup 4)
2139         (lshiftrt:DI (match_dup 3) (const_int 32)))
2140    (set (match_operand:SI 0 "register_operand" "")
2141         (truncate:SI (match_dup 4)))]
2142   ""
2143   {
2144     operands[3] = gen_reg_rtx (DImode);
2145     operands[4] = gen_reg_rtx (DImode);
2146   })
2147
2148 (define_expand "smuldi3_highpart"
2149   [(set (match_operand:DI 0 "register_operand" "")
2150         (truncate:DI
2151          (ashiftrt:TI 
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" "")))
2154           (const_int 64))))]
2155   ""
2156   {
2157     tilegx_expand_smuldi3_highpart (operands[0], operands[1], operands[2]);
2158     DONE;
2159   })
2160
2161 (define_expand "umuldi3_highpart"
2162   [(set (match_operand:DI 0 "register_operand" "")
2163         (truncate:DI
2164          (lshiftrt:TI
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" "")))
2167           (const_int 64))))]
2168   ""
2169 {
2170   tilegx_expand_umuldi3_highpart (operands[0], operands[1], operands[2]);
2171   DONE;
2172 })
2173
2174 \f
2175 ;;
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.
2180 ;;
2181
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" "")))]
2186   ""
2187 {
2188   FAIL;
2189 })
2190
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" "")))]
2195   ""
2196 {
2197   FAIL;
2198 })
2199
2200 \f
2201 ;;
2202 ;; Loops
2203 ;;
2204
2205 ;; Define the subtract-one-and-jump insns so loop.c knows what to
2206 ;; generate.
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
2213    ""
2214 {
2215   if (optimize > 0 && flag_modulo_sched)
2216   {
2217      rtx s0;
2218      rtx bcomp;
2219      rtx loc_ref;
2220      enum machine_mode mode = GET_MODE (operands[0]);
2221
2222      /* only do inner loop  */
2223      if (INTVAL (operands[3]) > 1)
2224        FAIL;
2225      /* only deal with loop counters in SImode or DImode  */
2226      if (mode != SImode && mode != DImode)
2227        FAIL;
2228
2229      s0 = operands [0];
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,
2235                                                         loc_ref, pc_rtx)));
2236      DONE;
2237   }
2238   else
2239      FAIL;
2240
2241 })
2242
2243 ;;
2244 ;; Prologue/epilogue
2245 ;;
2246 (define_expand "prologue"
2247   [(const_int 0)]
2248   ""
2249 {
2250   tilegx_expand_prologue ();
2251   DONE;
2252 })
2253
2254 (define_expand "epilogue"
2255   [(const_int 0)]
2256   ""
2257 {
2258   tilegx_expand_epilogue (false);
2259   DONE;
2260 })
2261
2262 (define_expand "sibcall_epilogue"
2263   [(const_int 0)]
2264   ""
2265 {
2266   tilegx_expand_epilogue (true);
2267   DONE;
2268 })
2269  
2270 ;;
2271 ;; Stack manipulations
2272 ;;
2273
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" "")))
2278    (set (reg 54)
2279         (minus (reg 54) (match_dup 1)))]
2280   ""
2281   "tilegx_allocate_stack (operands[0], operands[1]); DONE;")
2282
2283 ;;
2284 ;; Branches
2285 ;;
2286
2287 (define_expand "call"
2288   [(parallel [(call (match_operand:DI 0 "call_operand" "")
2289                     (match_operand 1 "" ""))
2290               (use (reg:DI 54))
2291               (clobber (reg:DI 55))])]
2292   ""
2293   "")
2294
2295 (define_insn "*call_insn"
2296   [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2297          (match_operand 1 "" ""))
2298    (use (reg:DI 54))
2299    (clobber (reg:DI 55))]
2300   ""
2301   "@
2302    jalr\t%r0
2303    jal\t%p0"
2304   [(set_attr "type" "Y1,X1")])
2305
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 "" "")))
2310               (use (reg:DI 54))
2311               (clobber (reg:DI 55))])]
2312   "")
2313
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 "" "")))
2318    (use (reg:DI 54))
2319    (clobber (reg:DI 55))]
2320   ""
2321   "@
2322    jalr\t%r1
2323    jal\t%p1"
2324   [(set_attr "type" "Y1,X1")])
2325
2326 (define_expand "sibcall"
2327   [(parallel [(call (match_operand:DI 0 "call_operand" "")
2328                     (match_operand 1 "" ""))
2329               (use (reg:DI 54))])]
2330   ""
2331   "")
2332
2333 (define_insn "*sibcall_insn"
2334   [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2335          (match_operand 1 "" ""))
2336    (use (reg:DI 54))]
2337   "SIBLING_CALL_P(insn)"
2338   "@
2339    jr\t%r0
2340    j\t%p0"
2341   [(set_attr "type" "X1,X1")])
2342
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))])]
2348   ""
2349   "")
2350
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 "" "")))
2355    (use (reg:DI 54))]
2356   "SIBLING_CALL_P(insn)"
2357   "@
2358    jr\t%r1
2359    j\t%p1"
2360   [(set_attr "type" "X1,X1")])
2361
2362 (define_insn "jump"
2363   [(set (pc) (label_ref (match_operand 0 "" "")))]
2364   ""
2365   "j\t%l0"
2366   [(set_attr "type" "X1")])
2367
2368 (define_insn "indirect_jump"
2369   [(set (pc) (match_operand 0 "pointer_operand" "rO"))]
2370   ""
2371   "jr\t%r0"
2372   [(set_attr "type" "Y1")])
2373
2374 (define_expand "return"
2375   [(parallel
2376     [(return)
2377      (use (reg:DI 55))])]
2378   "tilegx_can_use_return_insn_p ()"
2379   "")
2380
2381 (define_insn "_return"
2382   [(return)
2383    (use (reg:DI 55))]
2384   "reload_completed"
2385   "jrp\tlr"
2386   [(set_attr "type" "Y1")])
2387
2388 (define_expand "tablejump"
2389   [(set (pc) (match_operand 0 "pointer_operand" ""))
2390    (use (label_ref (match_operand 1 "" "")))]
2391   ""
2392 {
2393   tilegx_expand_tablejump (operands[0], operands[1]);
2394   DONE;
2395 })
2396
2397 (define_insn "tablejump_aux"
2398   [(set (pc) (match_operand 0 "pointer_operand" "rO"))
2399    (use (label_ref (match_operand 1 "" "")))]
2400   ""
2401   "jr\t%r0"
2402   [(set_attr "type" "Y1")])
2403
2404 ;; Call subroutine returning any type.
2405 (define_expand "untyped_call"
2406   [(parallel [(call (match_operand 0 "" "")
2407                     (const_int 0))
2408               (match_operand 1 "" "")
2409               (match_operand 2 "" "")])]
2410   ""
2411 {
2412   int i;
2413
2414   emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
2415
2416   for (i = 0; i < XVECLEN (operands[2], 0); i++)
2417     {
2418       rtx set = XVECEXP (operands[2], 0, i);
2419       emit_move_insn (SET_DEST (set), SET_SRC (set));
2420     }
2421
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
2425      point.  */
2426   emit_insn (gen_blockage ());
2427
2428   DONE;
2429 })
2430
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
2433 ;; point.
2434 (define_insn "blockage"
2435   [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
2436   ""
2437   "pseudo"
2438   [(set_attr "type" "nothing")
2439    (set_attr "length" "0")])
2440
2441 ;; Internal expanders to prevent memory ops from moving around frame
2442 ;; allocation/deallocation.
2443 ;;
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")
2449         (plus:DI
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)))]
2453  ""
2454  "@
2455   add\t%0, %1, %2
2456   addi\t%0, %1, %2
2457   addli\t%0, %1, %H2"
2458  [(set_attr "type" "*,*,X01")])
2459
2460 (define_insn "sp_adjust_32bit"
2461   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
2462         (plus:SI
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)))]
2466  ""
2467  "@
2468   addx\t%0, %1, %2
2469   addxi\t%0, %1, %2
2470   addxli\t%0, %1, %H2"
2471  [(set_attr "type" "*,*,X01")])
2472
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)))]
2480  ""
2481  "move\t%0, %1")
2482
2483 (define_insn "nop"
2484   [(const_int 0)]
2485   ""
2486   "nop"
2487   [(set_attr "type" "Y01")])
2488
2489 \f
2490 ;;
2491 ;; Conditional branches
2492 ;;
2493
2494 (define_expand "cbranch<mode>4"
2495   [(set (pc)
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 ""))
2500                     (pc)))]
2501    ""
2502 {
2503   tilegx_emit_conditional_branch (operands, GET_MODE (operands[1]));
2504   DONE;
2505 })
2506
2507 (define_insn "*bcc_normal<mode>"
2508   [(set (pc)
2509         (if_then_else
2510          (match_operator 1 "signed_comparison_operator"
2511                          [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2512                           (const_int 0)])
2513          (label_ref (match_operand 0 "" ""))
2514          (pc)))]
2515   ""
2516   { return tilegx_output_cbranch (insn, operands, false); }
2517   [(set_attr "type" "X1_branch")])
2518
2519 (define_insn "*bcc_reverse<mode>"
2520   [(set (pc)
2521         (if_then_else
2522          (match_operator 1 "signed_comparison_operator"
2523                          [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2524                           (const_int 0)])
2525          (pc)
2526          (label_ref (match_operand 0 "" ""))))]
2527   ""
2528   { return tilegx_output_cbranch (insn, operands, true); }
2529   [(set_attr "type" "X1_branch")])
2530
2531 (define_insn "*blbs_normal<mode>"
2532   [(set (pc)
2533         (if_then_else
2534          (ne (zero_extract:I48MODE
2535               (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2536               (const_int 1)
2537               (const_int 0))
2538              (const_int 0))
2539          (label_ref (match_operand 0 "" ""))
2540          (pc)))]
2541   ""
2542   { return tilegx_output_cbranch_with_opcode (insn, operands, "blbs", "blbc",
2543                                               1); }
2544   [(set_attr "type" "X1_branch")])
2545
2546 (define_insn "*blbc_normal<mode>"
2547   [(set (pc)
2548         (if_then_else
2549          (eq (zero_extract:I48MODE
2550               (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2551               (const_int 1)
2552               (const_int 0))
2553              (const_int 0))
2554          (label_ref (match_operand 0 "" ""))
2555          (pc)))]
2556   ""
2557   { return tilegx_output_cbranch_with_opcode (insn, operands, "blbc", "blbs",
2558                                               1); }
2559   [(set_attr "type" "X1_branch")])
2560
2561 ;; Note that __insn_mf() expands to this.
2562 (define_expand "memory_barrier"
2563   [(set (match_dup 0)
2564         (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2565   ""
2566 {
2567   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
2568   MEM_VOLATILE_P (operands[0]) = 1;
2569 })
2570
2571 (define_insn "*memory_barrier"
2572   [(set (match_operand:BLK 0 "" "")
2573         (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2574   ""
2575   "mf"
2576   [(set_attr "type" "X1")])
2577
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" ""))]
2582   ""
2583 {
2584   switch (INTVAL (operands[2]))
2585     {
2586       case 0:
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 ();
2591     }
2592 }
2593   [(set_attr "type" "Y2")])
2594
2595 \f
2596 ;;
2597 ;; "__insn" Intrinsics (some expand directly to normal patterns above).
2598 ;;
2599
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))]
2606   ""
2607   "bfexts\t%0, %r1, %2, %3"
2608   [(set_attr "type" "X0")])
2609
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))]
2616   ""
2617   "bfextu\t%0, %r1, %2, %3"
2618   [(set_attr "type" "X0")])
2619
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))]
2627    ""
2628    "bfins\t%0, %r2, %3, %4"
2629    [(set_attr "type" "X0")])
2630
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))]
2640   ""
2641   "cmpexch<four_if_si>\t%0, %r1, %r2"
2642   [(set_attr "type" "X1_remote")])
2643
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")]
2648                    UNSPEC_INSN_CMUL))]
2649   ""
2650   "cmul\t%0, %r1, %r2"
2651   [(set_attr "type" "X0_2cycle")])
2652
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))]
2659   ""
2660   "cmula\t%0, %r2, %r3"
2661   [(set_attr "type" "X0_2cycle")])
2662
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))]
2669   ""
2670   "cmulaf\t%0, %r2, %r3"
2671   [(set_attr "type" "X0_2cycle")])
2672
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))]
2678   ""
2679   "cmulf\t%0, %r1, %r2"
2680   [(set_attr "type" "X0_2cycle")])
2681
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))]
2687   ""
2688   "cmulfr\t%0, %r1, %r2"
2689   [(set_attr "type" "X0_2cycle")])
2690
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))]
2696   ""
2697   "cmulh\t%0, %r1, %r2"
2698   [(set_attr "type" "X0_2cycle")])
2699
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))]
2705   ""
2706   "cmulhr\t%0, %r1, %r2"
2707   [(set_attr "type" "X0_2cycle")])
2708
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))]
2714   ""
2715   "crc32_32\t%0, %r1, %r2"
2716   [(set_attr "type" "X0")])
2717
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))]
2723   ""
2724   "crc32_8\t%0, %r1, %r2"
2725   [(set_attr "type" "X0")])
2726
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))]
2733   ""
2734   "dblalign\t%0, %r2, %r3"
2735   [(set_attr "type" "X0")])
2736
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))]
2742   ""
2743   "dblalign2\t%0, %r1, %r2"
2744   [(set_attr "type" "X01")])
2745
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))]
2751   ""
2752   "dblalign4\t%0, %r1, %r2"
2753   [(set_attr "type" "X01")])
2754
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))]
2760   ""
2761   "dblalign6\t%0, %r1, %r2"
2762   [(set_attr "type" "X01")])
2763
2764 (define_insn "insn_dtlbpr"
2765   [(unspec_volatile:VOID [(match_operand:DI 0 "reg_or_0_operand" "rO")]
2766                          UNSPEC_INSN_DTLBPR)]
2767   ""
2768   "dtlbpr\t%r0"
2769   [(set_attr "type" "X1")])
2770
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")]
2777          UNSPEC_INSN_EXCH))]
2778   ""
2779   "exch<four_if_si>\t%0, %r1, %r2"
2780   [(set_attr "type" "X1_remote")])
2781
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))]
2787   ""
2788   "fdouble_add_flags\t%0, %r1, %r2"
2789   [(set_attr "type" "X0_2cycle")])
2790
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))]
2797   ""
2798   "fdouble_addsub\t%0, %r2, %r3"
2799   [(set_attr "type" "X0_2cycle")])
2800
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))]
2806   ""
2807   "fdouble_mul_flags\t%0, %r1, %r2"
2808   [(set_attr "type" "X0_2cycle")])
2809
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))]
2815   ""
2816   "fdouble_pack1\t%0, %r1, %r2"
2817   [(set_attr "type" "X0_2cycle")])
2818
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))]
2825   ""
2826   "fdouble_pack2\t%0, %r2, %r3"
2827   [(set_attr "type" "X0_2cycle")])
2828
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))]
2834   ""
2835   "fdouble_sub_flags\t%0, %r1, %r2"
2836   [(set_attr "type" "X0_2cycle")])
2837
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))]
2843   ""
2844   "fdouble_unpack_max\t%0, %r1, %r2"
2845   [(set_attr "type" "X0_2cycle")])
2846
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))]
2852   ""
2853   "fdouble_unpack_min\t%0, %r1, %r2"
2854   [(set_attr "type" "X0_2cycle")])
2855
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"))]
2860          UNSPEC_ATOMIC))
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")))]
2864   ""
2865   "fetchadd<four_if_si>\t%0, %r1, %r2"
2866   [(set_attr "type" "X1_remote")])
2867
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"))]
2872          UNSPEC_ATOMIC))
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))]
2877   ""
2878   "fetchaddgez<four_if_si>\t%0, %r1, %r2"
2879   [(set_attr "type" "X1_remote")])
2880
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"))]
2885          UNSPEC_ATOMIC))
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")))]
2889   ""
2890   "fetchand<four_if_si>\t%0, %r1, %r2"
2891   [(set_attr "type" "X1_remote")])
2892
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"))]
2897          UNSPEC_ATOMIC))
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")))]
2901   ""
2902   "fetchor<four_if_si>\t%0, %r1, %r2"
2903   [(set_attr "type" "X1_remote")])
2904
2905 (define_insn "insn_finv"
2906   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2907                          UNSPEC_INSN_FINV)]
2908   ""
2909   "finv\t%r0"
2910   [(set_attr "type" "X1")])
2911
2912 (define_insn "insn_flush"
2913   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2914                          UNSPEC_INSN_FLUSH)]
2915   ""
2916   "flush\t%r0"
2917   [(set_attr "type" "X1")])
2918
2919 (define_insn "insn_flushwb"
2920   [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FLUSHWB)]
2921   ""
2922   "flushwb"
2923   [(set_attr "type" "X1")])
2924
2925 (define_insn "insn_fnop"
2926   [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FNOP)]
2927   ""
2928   "fnop")
2929
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))]
2935   ""
2936   "fsingle_add1\t%0, %r1, %r2"
2937   [(set_attr "type" "X0")])
2938
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))]
2945   ""
2946   "fsingle_addsub2\t%0, %r2, %r3"
2947   [(set_attr "type" "X0_2cycle")])
2948
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))]
2954   ""
2955   "fsingle_mul1\t%0, %r1, %r2"
2956   [(set_attr "type" "X0")])
2957
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))]
2963   ""
2964   "fsingle_mul2\t%0, %r1, %r2"
2965   [(set_attr "type" "X0_2cycle")])
2966
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))]
2971   ""
2972   "fsingle_pack1\t%0, %r1"
2973   [(set_attr "type" "Y0_2cycle")])
2974
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))]
2980   ""
2981   "fsingle_pack2\t%0, %r1, %r2"
2982   [(set_attr "type" "X0_2cycle")])
2983
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))]
2989   ""
2990   "fsingle_sub1\t%0, %r1, %r2"
2991   [(set_attr "type" "X0")])
2992
2993 (define_insn "insn_drain"
2994   [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_DRAIN)]
2995   ""
2996   "drain"
2997   [(set_attr "type" "cannot_bundle")])
2998
2999 (define_insn "insn_icoh"
3000   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")] 
3001                          UNSPEC_INSN_ICOH)]
3002   ""
3003   "icoh\t%r0"
3004   [(set_attr "type" "X1")])
3005
3006 (define_insn "insn_ill"
3007   [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_ILL)]
3008   ""
3009   "ill"
3010   [(set_attr "type" "cannot_bundle")])
3011
3012 (define_insn "insn_info"
3013   [(unspec_volatile:VOID [(match_operand:DI 0 "s8bit_cint_operand" "i")]
3014                          UNSPEC_INSN_INFO)]
3015   ""
3016   "info\t%0")
3017
3018 (define_insn "insn_infol"
3019   [(unspec_volatile:VOID [(match_operand:DI 0 "s16bit_cint_operand" "i")]
3020                          UNSPEC_INSN_INFOL)]
3021   ""
3022   "infol\t%0"
3023   [(set_attr "type" "X01")])
3024
3025 (define_insn "insn_inv"
3026   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3027                          UNSPEC_INSN_INV)]
3028   ""
3029   "inv\t%r0"
3030   [(set_attr "type" "X1")])
3031
3032 ;; loads
3033
3034 (define_expand "insn_ld"
3035   [(set (match_operand:DI 0 "register_operand" "")
3036         (mem:DI (match_operand 1 "pointer_operand" "")))]
3037   "")
3038
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)))]
3045   ""
3046   "ld_add\t%0, %1, %2"
3047   [(set_attr "type" "X1_2cycle")])
3048
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")
3052                         (const_int -8))))]
3053   ""
3054   "ldna\t%0, %r1"
3055   [(set_attr "type" "X1_2cycle")])
3056
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))))]
3063   ""
3064   "ldna_add\t%0, %1, %2"
3065   [(set_attr "type" "X1_2cycle")])
3066
3067 (define_expand "insn_ld<n><s>"
3068   [(set (match_operand:DI 0 "register_operand" "")
3069         (any_extend:DI
3070          (mem:I124MODE (match_operand 1 "pointer_operand" ""))))]
3071   "")
3072
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))))]
3079   ""
3080   "ld<I124MODE:n><s>_add\t%0, %1, %2"
3081   [(set_attr "type" "X1_2cycle")])
3082
3083 ;; non temporal loads
3084
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))]
3089   ""
3090   "ldnt\t%0, %r1"
3091   [(set_attr "type" "X1_2cycle")])
3092
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))]
3100   ""
3101   "ldnt_add\t%0, %1, %2"
3102   [(set_attr "type" "X1_2cycle")])
3103
3104 (define_insn "insn_ldnt<n><s>"
3105   [(set (match_operand:DI 0 "register_operand" "=r")
3106         (any_extend:DI
3107          (unspec:I124MODE
3108           [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3109           UNSPEC_NON_TEMPORAL)))]
3110   ""
3111   "ldnt<n><s>\t%0, %r1"
3112   [(set_attr "type" "X1_2cycle")])
3113
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)))]
3121   ""
3122   "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3123   [(set_attr "type" "X1_2cycle")])
3124
3125 ;; L2 hits
3126
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))]
3131   ""
3132   "ld\t%0, %r1"
3133   [(set_attr "type" "Y2_L2")])
3134
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))]
3142   ""
3143   "ld_add\t%0, %1, %2"
3144   [(set_attr "type" "X1_L2")])
3145
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")
3149                                     (const_int -8)))]
3150                    UNSPEC_LATENCY_L2))]
3151   ""
3152   "ldna\t%0, %r1"
3153   [(set_attr "type" "X1_L2")])
3154
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))]
3162   ""
3163   "ldna_add\t%0, %1, %2"
3164   [(set_attr "type" "X1_L2")])
3165
3166 (define_insn "insn_ld<n><s>_L2"
3167   [(set (match_operand:DI 0 "register_operand" "=r")
3168         (any_extend:DI 
3169          (unspec:I124MODE
3170           [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3171           UNSPEC_LATENCY_L2)))]
3172   ""
3173   "ld<n><s>\t%0, %r1"
3174   [(set_attr "type" "Y2_L2")])
3175
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)))]
3183   ""
3184   "ld<I124MODE:n><s>_add\t%0, %1, %2"
3185   [(set_attr "type" "X1_L2")])
3186
3187 ;; L2 hits, non temporal loads
3188
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))]
3195   ""
3196   "ldnt\t%0, %r1"
3197   [(set_attr "type" "X1_L2")])
3198
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))]
3208                    ""
3209   "ldnt_add\t%0, %1, %2"
3210   [(set_attr "type" "X1_L2")])
3211
3212 (define_insn "insn_ldnt<n><s>_L2"
3213   [(set (match_operand:DI 0 "register_operand" "=r")
3214         (any_extend:DI
3215          (unspec:I124MODE
3216           [(unspec:I124MODE
3217             [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3218             UNSPEC_NON_TEMPORAL)]
3219           UNSPEC_LATENCY_L2)))]
3220   ""
3221   "ldnt<n><s>\t%0, %r1"
3222   [(set_attr "type" "X1_L2")])
3223
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")
3229         (any_extend:DI
3230          (unspec:I124MODE [(unspec:I124MODE
3231                             [(mem:I124MODE (match_dup 3))]
3232                             UNSPEC_NON_TEMPORAL)]
3233                           UNSPEC_LATENCY_L2)))]
3234   ""
3235   "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3236   [(set_attr "type" "X1_L2")])
3237
3238 ;; L2 miss
3239
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))]
3244   ""
3245   "ld\t%0, %r1"
3246   [(set_attr "type" "Y2_miss")])
3247
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))]
3255   ""
3256   "ld_add\t%0, %1, %2"
3257   [(set_attr "type" "X1_miss")])
3258
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")
3262                                     (const_int -8)))]
3263                    UNSPEC_LATENCY_MISS))]
3264   ""
3265   "ldna\t%0, %r1"
3266   [(set_attr "type" "X1_miss")])
3267
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))]
3275   ""
3276   "ldna_add\t%0, %1, %2"
3277   [(set_attr "type" "X1_miss")])
3278
3279 (define_insn "insn_ld<n><s>_miss"
3280   [(set (match_operand:DI 0 "register_operand" "=r")
3281         (any_extend:DI 
3282          (unspec:I124MODE
3283           [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3284           UNSPEC_LATENCY_MISS)))]
3285   ""
3286   "ld<n><s>\t%0, %r1"
3287   [(set_attr "type" "Y2_miss")])
3288
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)))]
3296   ""
3297   "ld<I124MODE:n><s>_add\t%0, %1, %2"
3298   [(set_attr "type" "X1_miss")])
3299
3300 ;; L2 miss, non temporal loads
3301
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))]
3308   ""
3309   "ldnt\t%0, %r1"
3310   [(set_attr "type" "X1_miss")])
3311
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))]
3321                    ""
3322   "ldnt_add\t%0, %1, %2"
3323   [(set_attr "type" "X1_miss")])
3324
3325 (define_insn "insn_ldnt<n><s>_miss"
3326   [(set (match_operand:DI 0 "register_operand" "=r")
3327         (any_extend:DI
3328          (unspec:I124MODE
3329           [(unspec:I124MODE
3330             [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3331             UNSPEC_NON_TEMPORAL)]
3332           UNSPEC_LATENCY_MISS)))]
3333   ""
3334   "ldnt<n><s>\t%0, %r1"
3335   [(set_attr "type" "X1_miss")])
3336
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")
3342         (any_extend:DI
3343          (unspec:I124MODE [(unspec:I124MODE
3344                       [(mem:I124MODE (match_dup 3))]
3345                       UNSPEC_NON_TEMPORAL)]
3346                     UNSPEC_LATENCY_MISS)))]
3347   ""
3348   "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3349   [(set_attr "type" "X1_miss")])
3350
3351 ;; end loads
3352
3353 (define_insn "insn_lnk"
3354   [(set (match_operand:DI 0 "register_operand" "=r")
3355         (unspec:DI [(const_int 0)] UNSPEC_INSN_LNK))]
3356   ""
3357   "lnk\t%0"
3358   [(set_attr "type" "Y1")])
3359
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")]
3363                             UNSPEC_INSN_MFSPR))
3364    (clobber (mem:BLK (const_int 0)))]
3365   ""
3366   "mfspr\t%0, %1"
3367   [(set_attr "type" "X1")])
3368
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")]
3372                        UNSPEC_INSN_MTSPR)
3373    (clobber (mem:BLK (const_int 0)))]
3374   ""
3375   "mtspr\t%0, %r1"
3376   [(set_attr "type" "X1")])
3377
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")]
3384                    UNSPEC_INSN_MM))]
3385   ""
3386   "mm\t%0, %r2, %3, %4"
3387   [(set_attr "type" "X0")])
3388
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))]
3394   ""
3395   "mul_hs_hs\t%0, %r1, %r2"
3396   [(set_attr "type" "Y0_2cycle")])
3397
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))]
3403   ""
3404   "mul_hs_hu\t%0, %r1, %r2"
3405   [(set_attr "type" "X0_2cycle")])
3406
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))]
3412   ""
3413   "mul_hs_ls\t%0, %r1, %r2"
3414   [(set_attr "type" "X0_2cycle")])
3415
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))]
3421   ""
3422   "mul_hs_lu\t%0, %r1, %r2"
3423   [(set_attr "type" "X0_2cycle")])
3424
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))]
3430   ""
3431   "mul_hu_hu\t%0, %r1, %r2"
3432   [(set_attr "type" "Y0_2cycle")])
3433
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))]
3439   ""
3440   "mul_hu_ls\t%0, %r1, %r2"
3441   [(set_attr "type" "X0_2cycle")])
3442
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))]
3448   ""
3449   "mul_hu_lu\t%0, %r1, %r2"
3450   [(set_attr "type" "X0_2cycle")])
3451
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))]
3457   ""
3458   "mul_ls_ls\t%0, %r1, %r2"
3459   [(set_attr "type" "Y0_2cycle")])
3460
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))]
3466   ""
3467   "mul_ls_lu\t%0, %r1, %r2"
3468   [(set_attr "type" "X0_2cycle")])
3469
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))]
3475   ""
3476   "mul_lu_lu\t%0, %r1, %r2"
3477   [(set_attr "type" "Y0_2cycle")])
3478
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))]
3485   ""
3486   "mula_hs_hs\t%0, %r2, %r3"
3487   [(set_attr "type" "Y0_2cycle")])
3488
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))]
3495   ""
3496   "mula_hs_hu\t%0, %r2, %r3"
3497   [(set_attr "type" "X0_2cycle")])
3498
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))]
3505   ""
3506   "mula_hs_ls\t%0, %r2, %r3"
3507   [(set_attr "type" "X0_2cycle")])
3508
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))]
3515   ""
3516   "mula_hs_lu\t%0, %r2, %r3"
3517   [(set_attr "type" "X0_2cycle")])
3518
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))]
3525   ""
3526   "mula_hu_hu\t%0, %r2, %r3"
3527   [(set_attr "type" "Y0_2cycle")])
3528
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))]
3535   ""
3536   "mula_hu_ls\t%0, %r2, %r3"
3537   [(set_attr "type" "X0_2cycle")])
3538
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))]
3545   ""
3546   "mula_hu_lu\t%0, %r2, %r3"
3547   [(set_attr "type" "X0_2cycle")])
3548
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))]
3555   ""
3556   "mula_ls_ls\t%0, %r2, %r3"
3557   [(set_attr "type" "Y0_2cycle")])
3558
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))]
3565   ""
3566   "mula_ls_lu\t%0, %r2, %r3"
3567   [(set_attr "type" "X0_2cycle")])
3568
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))]
3575   ""
3576   "mula_lu_lu\t%0, %r2, %r3"
3577   [(set_attr "type" "Y0_2cycle")])
3578
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))]
3585   ""
3586   "mulax\t%0, %r2, %r3"
3587   [(set_attr "type" "Y0_2cycle")])
3588
3589 (define_insn "insn_nap"
3590   [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_NAP)]
3591   ""
3592   "nap"
3593   [(set_attr "type" "cannot_bundle")])
3594
3595 (define_insn "insn_nor_<mode>"
3596   [(set (match_operand:I48MODE 0 "register_operand" "=r")
3597         (and:I48MODE
3598          (not:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO"))
3599          (not:I48MODE (match_operand:I48MODE 2 "reg_or_0_operand" "rO"))))]
3600   ""
3601   "nor\t%0, %r1, %r2")
3602
3603 (define_expand "insn_prefetch_l1"
3604   [(prefetch (match_operand 0 "pointer_operand" "")
3605              (const_int 0)
3606              (const_int 3))]
3607   "")
3608
3609 (define_expand "insn_prefetch_l2"
3610   [(prefetch (match_operand 0 "pointer_operand" "")
3611              (const_int 0)
3612              (const_int 2))]
3613   "")
3614
3615 (define_expand "insn_prefetch_l3"
3616   [(prefetch (match_operand 0 "pointer_operand" "")
3617              (const_int 0)
3618              (const_int 1))]
3619   "")
3620
3621 (define_insn "insn_prefetch_l1_fault"
3622   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3623                          UNSPEC_INSN_PREFETCH_L1_FAULT)]
3624   ""
3625   "prefetch_l1_fault\t%r0"
3626   [(set_attr "type" "Y2")])
3627
3628 (define_insn "insn_prefetch_l2_fault"
3629   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3630                          UNSPEC_INSN_PREFETCH_L2_FAULT)]
3631   ""
3632   "prefetch_l2_fault\t%r0"
3633   [(set_attr "type" "Y2")])
3634
3635 (define_insn "insn_prefetch_l3_fault"
3636   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3637                          UNSPEC_INSN_PREFETCH_L3_FAULT)]
3638   ""
3639   "prefetch_l3_fault\t%r0"
3640   [(set_attr "type" "Y2")])
3641
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))]
3646   ""
3647   "revbits\t%0, %r1"
3648   [(set_attr "type" "Y0")])
3649
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")
3653                           (const_int 2))
3654                  (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3655   ""
3656   "shl1add\t%0, %r1, %r2")
3657
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")
3661                           (const_int 2))
3662                  (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3663   ""
3664   "shl1addx\t%0, %r1, %r2")
3665
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")
3669                           (const_int 4))
3670                  (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3671   ""
3672   "shl2add\t%0, %r1, %r2")
3673
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")
3677                           (const_int 4))
3678                  (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3679   ""
3680   "shl2addx\t%0, %r1, %r2")
3681
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")
3685                           (const_int 8))
3686                  (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3687   ""
3688   "shl3add\t%0, %r1, %r2")
3689
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")
3693                           (const_int 8))
3694                  (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3695   ""
3696   "shl3addx\t%0, %r1, %r2")
3697
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))]
3704   ""
3705   "shufflebytes\t%0, %r2, %r3"
3706   [(set_attr "type" "X0")])
3707
3708 ;; stores
3709
3710 (define_expand "insn_st"
3711   [(set (mem:DI (match_operand 0 "pointer_operand" ""))
3712         (match_operand:DI 1 "reg_or_0_operand" ""))]
3713   "")
3714
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"))]
3721   ""
3722   "st_add\t%0, %r1, %2"
3723   [(set_attr "type" "X1")])
3724
3725 (define_expand "insn_st<n>"
3726   [(set (mem:I124MODE (match_operand 0 "pointer_operand" ""))
3727         (match_operand:DI 1 "reg_or_0_operand" ""))]
3728   ""
3729 {
3730   operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3731 })
3732
3733 (define_expand "insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3734   [(parallel
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" ""))])]
3740   ""
3741 {
3742   operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3743                                      DImode, 0);
3744 })
3745
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"))]
3752   ""
3753   "st<I124MODE:n>_add\t%0, %r1, %2"
3754   [(set_attr "type" "X1")])
3755
3756 ;; non-temporal stores
3757
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"))]
3762   ""
3763   "stnt\t%0, %r1"
3764   [(set_attr "type" "X1")])
3765
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"))]
3772   ""
3773   "stnt_add\t%0, %r1, %2"
3774   [(set_attr "type" "X1")])
3775
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" ""))]
3780   ""
3781 {
3782   operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3783 })
3784
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"))]
3789   ""
3790   "stnt<n>\t%0, %r1"
3791   [(set_attr "type" "X1")])
3792
3793 (define_expand "insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>"
3794   [(parallel
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"))])]
3800   ""
3801 {
3802   operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3803                                      DImode, 0);
3804 })
3805
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"))]
3812   ""
3813   "stnt<I124MODE:n>_add\t%0, %r1, %2"
3814   [(set_attr "type" "X1")])
3815
3816 ;; end stores
3817
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))]
3823   ""
3824   "tblidxb0\t%0, %r2"
3825   [(set_attr "type" "Y0")])
3826
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))]
3832   ""
3833   "tblidxb1\t%0, %r2"
3834   [(set_attr "type" "Y0")])
3835
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))]
3841   ""
3842   "tblidxb2\t%0, %r2"
3843   [(set_attr "type" "Y0")])
3844
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))]
3850   ""
3851   "tblidxb3\t%0, %r2"
3852   [(set_attr "type" "Y0")])
3853
3854 ;; insn_v1add
3855 ;; insn_v1addi
3856 ;; insn_v1cmpeq
3857 ;; insn_v1cmpeqi
3858 ;; insn_v1cmplts
3859 ;; insn_v1cmpltsi
3860 ;; insn_v1cmpltu
3861 ;; insn_v1cmpltui
3862 ;; insn_v1maxu
3863 ;; insn_v1maxui
3864 ;; insn_v1minu
3865 ;; insn_v1minui
3866 (define_insn "<optab>v8qi3"
3867   [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3868         (v1op_immed:V8QI
3869          (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO,rO")
3870          (match_operand:V8QI 2 "reg_or_v8s8bit_operand" "W,rO")))]
3871   ""
3872   "@
3873    v1<insn>i\t%0, %r1, %j2
3874    v1<insn>\t%0, %r1, %r2"
3875   [(set_attr "type" "<pipe>,<pipe>")])
3876
3877 (define_expand "insn_v1<insn>"
3878   [(set (match_operand:DI 0 "register_operand" "")
3879         (v1op_immed:V8QI
3880          (match_operand:DI 1 "reg_or_0_operand" "")
3881          (match_operand:DI 2 "reg_or_0_operand" "")))]
3882   ""
3883 {
3884   tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3885                                       V8QImode, operands[1], operands[2], true);
3886   DONE;
3887 })
3888
3889 (define_expand "insn_v1<insn>i"
3890   [(set (match_operand:DI 0 "register_operand" "")
3891         (v1op_immed:V8QI
3892          (match_operand:DI 1 "reg_or_0_operand" "")
3893          (match_operand:DI 2 "s8bit_cint_operand" "")))]
3894   ""
3895 {
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);
3900   DONE;
3901 })
3902
3903 ;; insn_v1shl
3904 ;; insn_v1shli
3905 ;; insn_v1shrs
3906 ;; insn_v1shrsi
3907 ;; insn_v1shru
3908 ;; insn_v1shrui
3909 (define_insn "<optab>v8qi3"
3910   [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3911         (any_shift:V8QI
3912          (match_operand:V8QI 1 "reg_or_0_operand" "rO,rO")
3913          (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
3914   ""
3915   "@
3916    v1<insn>i\t%0, %r1, %2
3917    v1<insn>\t%0, %r1, %r2"
3918   [(set_attr "type" "<pipe>,<pipe>")])
3919
3920 (define_expand "insn_v1<insn>"
3921   [(set (match_operand:DI 0 "register_operand" "")
3922         (any_shift:V8QI
3923          (match_operand:DI 1 "reg_or_0_operand" "")
3924          (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
3925   ""
3926 {
3927   tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3928                                       V8QImode, operands[1], operands[2], false);
3929   DONE;
3930 })
3931
3932 ;; insn_v2add
3933 ;; insn_v2addi
3934 ;; insn_v2maxs
3935 ;; insn_v2maxsi
3936 ;; insn_v2mins
3937 ;; insn_v2minsi
3938 ;; insn_v2cmpeq
3939 ;; insn_v2cmpeqi
3940 ;; insn_v2cmplts
3941 ;; insn_v2cmpltsi
3942 ;; insn_v2cmpltu
3943 ;; insn_v2cmpltui
3944 (define_insn "<optab>v4hi3"
3945   [(set (match_operand:V4HI 0 "register_operand" "=r,r")
3946         (v2op_immed:V4HI
3947          (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO,rO")
3948          (match_operand:V4HI 2 "reg_or_v4s8bit_operand" "Y,rO")))]
3949   ""
3950   "@
3951    v2<insn>i\t%0, %r1, %j2
3952    v2<insn>\t%0, %r1, %r2"
3953   [(set_attr "type" "<pipe>,<pipe>")])
3954
3955 (define_expand "insn_v2<insn>"
3956   [(set (match_operand:DI 0 "register_operand" "")
3957         (v2op_immed:V4HI
3958          (match_operand:DI 1 "reg_or_0_operand" "")
3959          (match_operand:DI 2 "reg_or_0_operand" "")))]
3960   ""
3961 {
3962   tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
3963                                       V4HImode, operands[1], operands[2], true);
3964   DONE;
3965 })
3966
3967 (define_expand "insn_v2<insn>i"
3968   [(set (match_operand:DI 0 "register_operand" "")
3969         (v2op_immed:V4HI
3970          (match_operand:DI 1 "reg_or_0_operand" "")
3971          (match_operand:DI 2 "s8bit_cint_operand" "")))]
3972   ""
3973 {
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);
3978   DONE;
3979 })
3980
3981 ;; insn_v2shl
3982 ;; insn_v2shli
3983 ;; insn_v2shrs
3984 ;; insn_v2shrsi
3985 ;; insn_v2shru
3986 ;; insn_v2shrui
3987 (define_insn "<optab>v4hi3"
3988   [(set (match_operand:V4HI 0 "register_operand" "=r,r")
3989         (any_shift:V4HI
3990          (match_operand:V4HI 1 "reg_or_0_operand" "rO,rO")
3991          (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
3992   ""
3993   "@
3994    v2<insn>i\t%0, %r1, %2
3995    v2<insn>\t%0, %r1, %r2"
3996   [(set_attr "type" "<pipe>,<pipe>")])
3997
3998 (define_expand "insn_v2<insn>"
3999   [(set (match_operand:DI 0 "register_operand" "")
4000         (any_shift:V4HI
4001          (match_operand:DI 1 "reg_or_0_operand" "")
4002          (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
4003   ""
4004 {
4005   tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4006                                       V4HImode, operands[1], operands[2], false);
4007   DONE;
4008 })
4009
4010 ;; insn_v1adduc
4011 ;; insn_v1subuc
4012 ;; insn_v1sub
4013 ;; insn_v1cmpne
4014 ;; insn_v1cmples
4015 ;; insn_v1cmpleu
4016 ;; insn_v1multu
4017 (define_insn "<optab>v8qi3"
4018   [(set (match_operand:V8QI 0 "register_operand" "=r")
4019         (v1op:V8QI
4020          (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO")
4021          (match_operand:V8QI 2 "reg_or_0_operand" "rO")))]
4022   ""
4023   "v1<insn>\t%0, %r1, %r2"
4024   [(set_attr "type" "<pipe>")])
4025
4026 (define_expand "insn_v1<insn>"
4027   [(set (match_operand:DI 0 "register_operand" "")
4028         (v1op:V8QI
4029          (match_operand:DI 1 "reg_or_0_operand" "")
4030          (match_operand:DI 2 "reg_or_0_operand" "")))]
4031   ""
4032 {
4033   tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
4034                                       V8QImode, operands[1], operands[2], true);
4035   DONE;
4036 })
4037
4038 ;; insn_v2addsc
4039 ;; insn_v2subsc
4040 ;; insn_v2sub
4041 ;; insn_v2cmpne
4042 ;; insn_v2cmples
4043 ;; insn_v2cmpleu
4044 (define_insn "<optab>v4hi3"
4045   [(set (match_operand:V4HI 0 "register_operand" "=r")
4046         (v2op:V4HI
4047          (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO")
4048          (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4049   ""
4050   "v2<insn>\t%0, %r1, %r2"
4051   [(set_attr "type" "<pipe>")])
4052
4053 (define_expand "insn_v2<insn>"
4054   [(set (match_operand:DI 0 "register_operand" "")
4055         (v2op:V4HI
4056          (match_operand:DI 1 "reg_or_0_operand" "")
4057          (match_operand:DI 2 "reg_or_0_operand" "")))]
4058   ""
4059 {
4060   tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4061                                       V4HImode, operands[1], operands[2], true);
4062   DONE;
4063 })
4064
4065 ;; insn_v2mults
4066 (define_insn "mulv4hi3"
4067   [(set (match_operand:V4HI 0 "register_operand" "=r")
4068         (mult:V4HI
4069          (match_operand:V4HI 1 "reg_or_0_operand" "%rO")
4070          (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4071   ""
4072   "v2mults\t%0, %r1, %r2"
4073   [(set_attr "type" "X0_2cycle")])
4074
4075 (define_expand "insn_v2mults"
4076   [(set (match_operand:DI 0 "register_operand" "")
4077         (mult:V4HI
4078          (match_operand:DI 1 "reg_or_0_operand" "")
4079          (match_operand:DI 2 "reg_or_0_operand" "")))]
4080   ""
4081 {
4082   tilegx_expand_builtin_vector_binop (gen_mulv4hi3, V4HImode, operands[0],
4083                                       V4HImode, operands[1], operands[2], true);
4084   DONE;
4085 })
4086
4087 ;; insn_v2shlsc
4088 (define_insn "<optab>v4hi3"
4089   [(set (match_operand:V4HI 0 "register_operand" "=r")
4090         (v2shift:V4HI
4091          (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4092          (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4093   ""
4094   "v2<insn>\t%0, %r1, %r2"
4095   [(set_attr "type" "<pipe>")])
4096
4097 (define_expand "insn_v2<insn>"
4098   [(set (match_operand:DI 0 "register_operand" "")
4099         (v2shift:V4HI
4100          (match_operand:DI 1 "reg_or_0_operand" "")
4101          (match_operand:DI 2 "reg_or_0_operand" "")))]
4102   ""
4103 {
4104   tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4105                                       V4HImode, operands[1], operands[2], false);
4106   DONE;
4107 })
4108
4109 ;; insn_v4addsc
4110 ;; insn_v4subsc
4111 ;; insn_v4add
4112 ;; insn_v4sub
4113 (define_insn "<optab>v2si3"
4114   [(set (match_operand:V2SI 0 "register_operand" "=r")
4115         (v4op:V2SI
4116          (match_operand:V2SI 1 "reg_or_0_operand" "<comm>rO")
4117          (match_operand:V2SI 2 "reg_or_0_operand" "rO")))]
4118   ""
4119   "v4<insn>\t%0, %r1, %r2"
4120   [(set_attr "type" "<pipe>")])
4121
4122 (define_expand "insn_v4<insn>"
4123   [(set (match_operand:DI 0 "register_operand" "")
4124         (v4op:V2SI
4125          (match_operand:DI 1 "reg_or_0_operand" "")
4126          (match_operand:DI 2 "reg_or_0_operand" "")))]
4127   ""
4128 {
4129   tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4130                                       V2SImode, operands[1], operands[2], true);
4131   DONE;
4132 })
4133
4134 ;; insn_v4shl
4135 ;; insn_v4shrs
4136 ;; insn_v4shru
4137 ;; insn_v4shlsc
4138 (define_insn "<optab>v2si3"
4139   [(set (match_operand:V2SI 0 "register_operand" "=r")
4140         (v4shift:V2SI
4141          (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4142          (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4143   ""
4144   "v4<insn>\t%0, %r1, %r2"
4145   [(set_attr "type" "<pipe>")])
4146
4147 (define_expand "insn_v4<insn>"
4148   [(set (match_operand:DI 0 "register_operand" "")
4149         (v4shift:V2SI
4150          (match_operand:DI 1 "reg_or_0_operand" "")
4151          (match_operand:DI 2 "reg_or_0_operand" "")))]
4152   ""
4153 {
4154   tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4155                                       V2SImode, operands[1], operands[2], false);
4156   DONE;
4157 })
4158
4159 ;; insn_v1int_h
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")
4165         (vec_select:V8QI
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)])))]
4172   ""
4173   "v1int_h\t%0, %r2, %r1"
4174   [(set_attr "type" "X01")])
4175
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" "")]
4180   ""
4181 {
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],
4186                                       operands[1], true);
4187   DONE;
4188 })
4189
4190 ;; insn_v1int_l
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")
4196         (vec_select:V8QI
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)])))]
4203   ""
4204   "v1int_l\t%0, %r2, %r1"
4205   [(set_attr "type" "X01")])
4206
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" "")]
4211   ""
4212 {
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],
4217                                       operands[1], true);
4218   DONE;
4219 })
4220
4221 ;; insn_v2int_h
4222 ;;    {B3,B2,B1,B0} {A3,A2,A1,A0}
4223 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4224 ;; => {A3,B3,A2,B2}
4225 (define_insn "vec_interleave_highv4hi"
4226   [(set (match_operand:V4HI 0 "register_operand" "=r")
4227         (vec_select:V4HI
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)])))]
4232   ""
4233   "v2int_h\t%0, %r2, %r1"
4234   [(set_attr "type" "X01")])
4235
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" "")]
4240   ""
4241 {
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],
4246                                       operands[1], true);
4247   DONE;
4248 })
4249
4250 ;; insn_v2int_l
4251 ;;    {B3,B2,B1,B0} {A3,A2,A1,A0}
4252 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4253 ;; => {A1,B1,A0,B0}
4254 (define_insn "vec_interleave_lowv4hi"
4255   [(set (match_operand:V4HI 0 "register_operand" "=r")
4256         (vec_select:V4HI
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)])))]
4261   ""
4262   "v2int_l\t%0, %r2, %r1"
4263   [(set_attr "type" "X01")])
4264
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" "")]
4269   ""
4270 {
4271   tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv4hi, V4HImode,
4272                                       operands[0], V4HImode, operands[2],
4273                                       operands[1], true);
4274   DONE;
4275 })
4276
4277 ;; insn_v4int_h
4278 ;;    {B1,B0} {A1,A0}
4279 ;; => {A1,A0,B1,B0}
4280 ;; => {A1,B1}
4281 (define_insn "vec_interleave_highv2si"
4282   [(set (match_operand:V2SI 0 "register_operand" "=r")
4283         (vec_select:V2SI
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)])))]
4287   ""
4288   "v4int_h\t%0, %r2, %r1"
4289   [(set_attr "type" "X01")])
4290
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" "")]
4295   ""
4296 {
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],
4301                                       operands[1], true);
4302   DONE;
4303 })
4304
4305 ;; insn_v4int_l
4306 ;;    {B1,B0} {A1,A0}
4307 ;; => {A1,A0,B1,B0}
4308 ;; => {A0,B0}
4309 (define_insn "vec_interleave_lowv2si"
4310   [(set (match_operand:V2SI 0 "register_operand" "=r")
4311         (vec_select:V2SI
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)])))]
4315   ""
4316   "v4int_l\t%0, %r2, %r1"
4317   [(set_attr "type" "X01")])
4318
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" "")]
4323   ""
4324 {
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],
4329                                       operands[1], true);
4330   DONE;
4331 })
4332
4333 ;; insn_v1mnz
4334 ;; insn_v1mz
4335 ;; insn_v2mnz
4336 ;; insn_v2mz
4337 (define_insn "insn_mnz_<mode>"
4338   [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4339         (if_then_else:VEC48MODE
4340          (ne:VEC48MODE
4341           (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4342           (const_int 0))
4343          (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")
4344          (const_int 0)))]
4345   ""
4346   "v<n>mnz\t%0, %r1, %r2"
4347   [(set_attr "type" "X01")])
4348
4349 (define_expand "insn_v<n>mnz"
4350   [(set (match_operand:DI 0 "register_operand" "")
4351         (if_then_else:VEC48MODE
4352          (ne:VEC48MODE
4353           (match_operand:DI 1 "reg_or_0_operand" "")
4354           (const_int 0))
4355          (match_operand:DI 2 "reg_or_0_operand" "")
4356          (const_int 0)))]
4357   ""
4358 {
4359   tilegx_expand_builtin_vector_binop (gen_insn_mnz_<mode>, <MODE>mode,
4360                                       operands[0], <MODE>mode, operands[1],
4361                                       operands[2], true);
4362   DONE;
4363 })
4364
4365 (define_insn "insn_mz_<mode>"
4366   [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4367         (if_then_else:VEC48MODE
4368          (ne:VEC48MODE
4369           (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4370           (const_int 0))
4371          (const_int 0)
4372          (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")))]
4373   ""
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
4379          (ne:VEC48MODE
4380           (match_operand:DI 1 "reg_or_0_operand" "")
4381           (const_int 0))
4382          (const_int 0)
4383          (match_operand:DI 2 "reg_or_0_operand" "")))]
4384   ""
4385 {
4386   tilegx_expand_builtin_vector_binop (gen_insn_mz_<mode>, <MODE>mode,
4387                                       operands[0], <MODE>mode, operands[1],
4388                                       operands[2], true);
4389   DONE;
4390 })
4391
4392 ;; insn_v1mulu
4393 (define_insn "vec_widen_umult_lo_v8qi"
4394   [(set (match_operand:V4HI 0 "register_operand" "=r")
4395         (mult:V4HI
4396          (zero_extend:V4HI
4397           (vec_select:V4QI
4398            (match_operand:V8QI 1 "register_operand" "r")
4399            (parallel [(const_int 0) (const_int 1)
4400                       (const_int 2) (const_int 3)])))
4401          (zero_extend:V4HI
4402           (vec_select:V4QI
4403            (match_operand:V8QI 2 "register_operand" "r")
4404            (parallel [(const_int 0) (const_int 1)
4405                       (const_int 2) (const_int 3)])))))]
4406   ""
4407   "v1mulu\t%0, %r1, %r2"
4408   [(set_attr "type" "X0_2cycle")])
4409
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" "")]
4414   ""
4415 {
4416   tilegx_expand_builtin_vector_binop (gen_vec_widen_umult_lo_v8qi, V4HImode,
4417                                       operands[0], V8QImode, operands[1],
4418                                       operands[2], true);
4419   DONE;
4420 })
4421
4422 ;; insn_v1mulus
4423 (define_insn "vec_widen_usmult_lo_v8qi"
4424   [(set (match_operand:V4HI 0 "register_operand" "=r")
4425         (mult:V4HI
4426          (zero_extend:V4HI
4427           (vec_select:V4QI
4428            (match_operand:V8QI 1 "register_operand" "r")
4429            (parallel [(const_int 0) (const_int 1)
4430                       (const_int 2) (const_int 3)])))
4431          (sign_extend:V4HI
4432           (vec_select:V4QI
4433            (match_operand:V8QI 2 "register_operand" "r")
4434            (parallel [(const_int 0) (const_int 1)
4435                       (const_int 2) (const_int 3)])))))]
4436   ""
4437   "v1mulus\t%0, %r1, %r2"
4438   [(set_attr "type" "X0_2cycle")])
4439
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" "")]
4444   ""
4445 {
4446   tilegx_expand_builtin_vector_binop (gen_vec_widen_usmult_lo_v8qi, V4HImode,
4447                                       operands[0], V8QImode, operands[1],
4448                                       operands[2], true);
4449   DONE;
4450 })
4451
4452 ;; insn_v2muls
4453 (define_insn "vec_widen_smult_lo_v4qi"
4454   [(set (match_operand:V2SI 0 "register_operand" "=r")
4455         (mult:V2SI
4456          (sign_extend:V2SI
4457           (vec_select:V2HI
4458            (match_operand:V4HI 1 "register_operand" "r")
4459            (parallel [(const_int 0) (const_int 1)])))
4460          (sign_extend:V2SI
4461           (vec_select:V2HI
4462            (match_operand:V4HI 2 "register_operand" "r")
4463            (parallel [(const_int 0) (const_int 1)])))))]
4464   ""
4465   "v2muls\t%0, %r1, %r2"
4466   [(set_attr "type" "X0_2cycle")])
4467
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" "")]
4472   ""
4473 {
4474   tilegx_expand_builtin_vector_binop (gen_vec_widen_smult_lo_v4qi, V2SImode,
4475                                       operands[0], V4HImode, operands[1],
4476                                       operands[2], true);
4477   DONE;
4478 })
4479
4480 ;; v2packl
4481 ;; v2packuc
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")
4486         (vec_concat:V8QI
4487          (v2pack:V4QI (match_operand:V4HI 1 "reg_or_0_operand" "rO"))
4488          (v2pack:V4QI (match_operand:V4HI 2 "reg_or_0_operand" "rO"))))]
4489   ""
4490   "v2<pack_insn>\t%0, %r2, %r1"
4491   [(set_attr "type" "X01")])
4492
4493 (define_expand "insn_v2<pack_insn>"
4494   [(set (match_operand:DI 0 "reg_or_0_operand" "")
4495         (vec_concat:V8QI
4496          (v2pack:V4QI (match_operand:DI 2 "reg_or_0_operand" ""))
4497          (v2pack:V4QI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4498   ""
4499 {
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);
4505   DONE;
4506 })
4507
4508 ;; v2packh
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")
4513         (vec_concat:V8QI
4514          (truncate:V4QI
4515           (ashiftrt:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4516                          (const_int 8)))
4517          (truncate:V4QI
4518           (ashiftrt:V4HI (match_operand:V4HI 2 "reg_or_0_operand" "rO")
4519                          (const_int 8)))))]
4520   ""
4521   "v2packh\t%0, %r2, %r1"
4522   [(set_attr "type" "X01")])
4523
4524 (define_expand "insn_v2packh"
4525   [(set (match_operand:DI 0 "reg_or_0_operand" "")
4526         (vec_concat:V8QI
4527          (truncate:V4QI
4528           (ashiftrt:V4HI (match_operand:DI 2 "reg_or_0_operand" "")
4529                          (const_int 8)))
4530          (truncate:V4QI
4531           (ashiftrt:V4HI (match_operand:DI 1 "reg_or_0_operand" "")
4532                          (const_int 8)))))]
4533   ""
4534 {
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],
4539                                       operands[1], true);
4540   DONE;
4541 })
4542
4543 ;; v4packsc
4544 ;;    {B1,B0} {A1,A0}
4545 ;; => {A1,A0,B1,B0}
4546 (define_insn "vec_pack_ssat_v2si"
4547   [(set (match_operand:V4HI 0 "reg_or_0_operand" "=r")
4548         (vec_concat:V4HI
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"))))]
4551   ""
4552   "v4packsc\t%0, %r2, %r1"
4553   [(set_attr "type" "X01")])
4554
4555 (define_expand "insn_v4packsc"
4556   [(set (match_operand:DI 0 "reg_or_0_operand" "")
4557         (vec_concat:V4HI
4558          (us_truncate:V2HI (match_operand:DI 2 "reg_or_0_operand" ""))
4559          (us_truncate:V2HI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4560   ""
4561 {
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],
4566                                       operands[1], true);
4567   DONE;
4568 })
4569
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))]
4576   ""
4577   "v1adiffu\t%0, %r1, %r2"
4578   [(set_attr "type" "X0_2cycle")])
4579
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))]
4585   ""
4586   "v1avgu\t%0, %r1, %r2"
4587   [(set_attr "type" "X0")])
4588
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))]
4594   ""
4595   "v1ddotpu\t%0, %r1, %r2"
4596   [(set_attr "type" "X0_2cycle")])
4597
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))]
4604   ""
4605   "v1ddotpua\t%0, %r2, %r3"
4606   [(set_attr "type" "X0_2cycle")])
4607
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))]
4613   ""
4614   "v1ddotpus\t%0, %r1, %r2"
4615   [(set_attr "type" "X0_2cycle")])
4616
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))]
4623   ""
4624   "v1ddotpusa\t%0, %r2, %r3"
4625   [(set_attr "type" "X0_2cycle")])
4626
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))]
4632   ""
4633   "v1dotp\t%0, %r1, %r2"
4634   [(set_attr "type" "X0_2cycle")])
4635
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))]
4642   ""
4643   "v1dotpa\t%0, %r2, %r3"
4644   [(set_attr "type" "X0_2cycle")])
4645
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))]
4651   ""
4652   "v1dotpu\t%0, %r1, %r2"
4653   [(set_attr "type" "X0_2cycle")])
4654
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))]
4661   ""
4662   "v1dotpua\t%0, %r2, %r3"
4663   [(set_attr "type" "X0_2cycle")])
4664
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))]
4670   ""
4671   "v1dotpus\t%0, %r1, %r2"
4672   [(set_attr "type" "X0_2cycle")])
4673
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))]
4680   ""
4681   "v1dotpusa\t%0, %r2, %r3"
4682   [(set_attr "type" "X0_2cycle")])
4683
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))]
4690   ""
4691   "v1sadau\t%0, %r2, %r3"
4692   [(set_attr "type" "X0_2cycle")])
4693
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))]
4699   ""
4700   "v1sadu\t%0, %r1, %r2"
4701   [(set_attr "type" "X0_2cycle")])
4702
4703 (define_insn "*insn_v1sadu"
4704   [(set (match_operand:SI 0 "register_operand" "=r")
4705         (truncate:SI
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)))]
4709    ""
4710   "v1sadu\t%0, %r1, %r2"
4711   [(set_attr "type" "X0_2cycle")])
4712
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))]
4718   ""
4719   "v2adiffs\t%0, %r1, %r2"
4720   [(set_attr "type" "X0_2cycle")])
4721
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))]
4727   ""
4728   "v2avgs\t%0, %r1, %r2"
4729   [(set_attr "type" "X0")])
4730
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))]
4736   ""
4737   "v2dotp\t%0, %r1, %r2"
4738   [(set_attr "type" "X0_2cycle")])
4739
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))]
4746   ""
4747   "v2dotpa\t%0, %r2, %r3"
4748   [(set_attr "type" "X0_2cycle")])
4749
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))]
4755   ""
4756   "v2mulfsc\t%0, %r1, %r2"
4757   [(set_attr "type" "X0_2cycle")])
4758
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))]
4765   ""
4766   "v2sadas\t%0, %r2, %r3"
4767   [(set_attr "type" "X0_2cycle")])
4768
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))]
4775   ""
4776   "v2sadau\t%0, %r2, %r3"
4777   [(set_attr "type" "X0_2cycle")])
4778
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))]
4784   ""
4785   "v2sads\t%0, %r1, %r2"
4786   [(set_attr "type" "X0_2cycle")])
4787
4788 (define_insn "*insn_v2sads"
4789   [(set (match_operand:SI 0 "register_operand" "=r")
4790         (truncate:SI
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)))]
4794   ""
4795   "v2sads\t%0, %r1, %r2"
4796   [(set_attr "type" "X0_2cycle")])
4797
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))]
4803   ""
4804   "v2sadu\t%0, %r1, %r2"
4805   [(set_attr "type" "X0_2cycle")])
4806
4807 (define_insn "*insn_v2sadu"
4808   [(set (match_operand:SI 0 "register_operand" "=r")
4809         (truncate:SI
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)))]
4813   ""
4814   "v2sadu\t%0, %r1, %r2"
4815   [(set_attr "type" "X0_2cycle")])
4816
4817 (define_insn "insn_wh64"
4818   [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
4819                          UNSPEC_INSN_WH64)
4820    (clobber (mem:BLK (const_int 0)))]
4821   ""
4822   "wh64\t%r0"
4823   [(set_attr "type" "X1")])
4824
4825 \f
4826 ;; Network intrinsics
4827
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)]
4834   ""
4835   "pseudo"
4836   [(set_attr "type" "nothing")
4837    (set_attr "length" "0")])
4838
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))]
4845
4846   ""
4847   "@
4848    move\t%0, %N1
4849    st\t%0, %N1
4850    st_add\t%I0, %N1, %i0"
4851   [(set_attr "type" "*,Y2,X1")])
4852
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))]
4860   ""
4861   "@
4862    move\t%N0, %r1
4863    movei\t%N0, %1
4864    moveli\t%N0, %1
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")])
4869
4870 (define_expand "tilegx_idn0_receive"
4871   [(parallel
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))])]
4877   "")
4878
4879 (define_expand "tilegx_idn1_receive"
4880   [(parallel
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))])]
4886   "")
4887
4888 (define_expand "tilegx_idn_send"
4889   [(parallel
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))])]
4895   "")
4896
4897 (define_expand "tilegx_udn0_receive"
4898   [(parallel
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))])]
4904   "")
4905
4906 (define_expand "tilegx_udn1_receive"
4907   [(parallel
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))])]
4913   "")
4914
4915 (define_expand "tilegx_udn2_receive"
4916   [(parallel
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))])]
4922   "")
4923
4924 (define_expand "tilegx_udn3_receive"
4925   [(parallel
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))])]
4931   "")
4932
4933 (define_expand "tilegx_udn_send"
4934   [(parallel
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))])]
4940   "")
4941
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))]
4950   ""
4951   "@
4952    add\t%N0, %r1, %2
4953    addi\t%N0, %r1, %2
4954    addli\t%N0, %r1, %H2"
4955   [(set_attr "type" "*,*,X01")])
4956
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))]
4965   ""
4966   "@
4967    add\t%0, %N1, %r2
4968    addi\t%0, %N1, %2
4969    addli\t%0, %N1, %H2"
4970   [(set_attr "type" "*,*,X01")])
4971
4972 \f
4973 ;;
4974 ;; Stack protector instructions.
4975 ;;
4976
4977 (define_expand "stack_protect_set"
4978   [(set (match_operand 0 "nonautoincmem_operand" "")
4979         (match_operand 1 "nonautoincmem_operand" ""))]
4980   ""
4981 {
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);
4986   
4987   emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
4988
4989   operands[1] = gen_rtx_MEM (Pmode, ssp);
4990 #endif
4991
4992   if (TARGET_32BIT)
4993     emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
4994   else
4995     emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
4996
4997   DONE;
4998 })
4999
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")]
5003                    UNSPEC_SP_SET))
5004    (set (match_scratch:SI 2 "=&r") (const_int 0))]
5005   ""
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")])
5009
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")]
5013                    UNSPEC_SP_SET))
5014    (set (match_scratch:DI 2 "=&r") (const_int 0))]
5015   ""
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")])
5019
5020 (define_expand "stack_protect_test"
5021   [(match_operand 0 "nonautoincmem_operand" "")
5022    (match_operand 1 "nonautoincmem_operand" "")
5023    (match_operand 2 "" "")]
5024   ""
5025 {
5026   rtx compare_result;
5027   rtx bcomp, loc_ref;
5028
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);
5033   
5034   emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
5035
5036   operands[1] = gen_rtx_MEM (Pmode, ssp);
5037 #endif
5038
5039   compare_result = gen_reg_rtx (Pmode);
5040
5041   if (TARGET_32BIT)
5042     emit_insn (gen_stack_protect_testsi (compare_result, operands[0],
5043                                          operands[1]));
5044   else
5045     emit_insn (gen_stack_protect_testdi (compare_result, operands[0],
5046                                          operands[1]));
5047
5048   bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx);
5049
5050   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]);
5051
5052   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
5053                                gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
5054                                                      loc_ref, pc_rtx)));
5055
5056   DONE;
5057 })
5058
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")]
5063                    UNSPEC_SP_TEST))
5064    (set (match_scratch:SI 3 "=&r") (const_int 0))]
5065   ""
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")])
5069
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")]
5074                    UNSPEC_SP_TEST))
5075    (set (match_scratch:DI 3 "=&r") (const_int 0))]
5076   ""
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")])
5080
5081 (include "sync.md")