]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/tilegx/tilegx.md
033d125a99b6e97d13013dd180722740a587b97f
[thirdparty/gcc.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_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
849 if (MEM_P (operands[1]))
850 {
851 HOST_WIDE_INT first_byte_offset, last_byte_offset;
852
853 if (GET_MODE (operands[1]) != QImode)
854 FAIL;
855
856 /* Reject bitfields that can be done with a normal load */
857 if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
858 FAIL;
859
860 /* The value in memory cannot span more than 8 bytes. */
861 first_byte_offset = bit_offset / BITS_PER_UNIT;
862 last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
863 if (last_byte_offset - first_byte_offset > 7)
864 FAIL;
865
866 tilegx_expand_unaligned_load (operands[0], operands[1],
867 bit_width, bit_offset, 0);
868
869 DONE;
870 }
871
872 operands[1] = force_reg (DImode, operands[1]);
873
874 if (bit_offset == 0)
875 {
876 /* Extracting the low bits is just a bitwise AND. */
877 HOST_WIDE_INT mask = ((HOST_WIDE_INT)1 << bit_width) - 1;
878 emit_insn (gen_anddi3 (operands[0], operands[1], GEN_INT (mask)));
879 DONE;
880 }
881 })
882
883 \f
884 ;;
885 ;; Addresses
886 ;;
887
888 ;; First step of the 3-insn sequence to materialize a symbolic
889 ;; address.
890 (define_expand "mov_address_step1"
891 [(set (match_operand:DI 0 "register_operand" "")
892 (const:DI (unspec:DI [(match_operand:DI 1 "symbolic_operand" "")]
893 UNSPEC_HW2_LAST)))])
894
895 ;; Second step of the 3-insn sequence to materialize a symbolic
896 ;; address.
897 (define_expand "mov_address_step2"
898 [(set (match_operand:DI 0 "register_operand" "")
899 (unspec:DI
900 [(match_operand:DI 1 "reg_or_0_operand" "")
901 (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
902 UNSPEC_HW1))]
903 UNSPEC_INSN_ADDR_SHL16INSLI))])
904
905 ;; Third step of the 3-insn sequence to materialize a symbolic
906 ;; address.
907 (define_expand "mov_address_step3"
908 [(set (match_operand:DI 0 "register_operand" "")
909 (unspec:DI
910 [(match_operand:DI 1 "reg_or_0_operand" "")
911 (const:DI (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
912 UNSPEC_HW0))]
913 UNSPEC_INSN_ADDR_SHL16INSLI))])
914
915 ;; First step of the 2-insn sequence to materialize a 32-bit symbolic
916 ;; address.
917 (define_expand "mov_address_32bit_step1"
918 [(set (match_operand:SI 0 "register_operand" "")
919 (const:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "")]
920 UNSPEC_HW1_LAST)))])
921
922 ;; Second step of the 2-insn sequence to materialize a 32-bit symbolic
923 ;; address.
924 (define_expand "mov_address_32bit_step2"
925 [(set (match_operand:SI 0 "register_operand" "")
926 (unspec:SI
927 [(match_operand:SI 1 "reg_or_0_operand" "")
928 (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
929 UNSPEC_HW0))]
930 UNSPEC_INSN_ADDR_SHL16INSLI))])
931
932 \f
933 ;;
934 ;; pic related instructions
935 ;;
936
937 ;; NOTE: We compute the label in this unusual way because if we place
938 ;; the label after the lnk, whether it is at the same address as the
939 ;; lnk will vary depending on whether the optimization level chooses
940 ;; to insert bundling braces.
941 (define_insn "insn_lnk_and_label<bitsuffix>"
942 [(set (match_operand:I48MODE 0 "register_operand" "=r")
943 (unspec_volatile:I48MODE
944 [(match_operand:I48MODE 1 "symbolic_operand" "")]
945 UNSPEC_LNK_AND_LABEL))]
946 ""
947 "%1 = . + 8\n\tlnk\t%0"
948 [(set_attr "type" "Y1")])
949
950 ;; First step of the 3-insn sequence to materialize a position
951 ;; independent address by adding the difference of two labels to a
952 ;; base label in the text segment, assuming that the difference fits
953 ;; in 32 signed bits.
954 (define_expand "mov_pcrel_step1<bitsuffix>"
955 [(set (match_operand:I48MODE 0 "register_operand" "")
956 (const:I48MODE (unspec:I48MODE
957 [(match_operand:I48MODE 1 "symbolic_operand" "")
958 (match_operand:I48MODE 2 "symbolic_operand" "")]
959 UNSPEC_HW1_LAST_PCREL)))]
960 "flag_pic")
961
962 ;; Second step of the 3-insn sequence to materialize a position
963 ;; independent address by adding the difference of two labels to a
964 ;; base label in the text segment, assuming that the difference fits
965 ;; in 32 signed bits.
966 (define_expand "mov_pcrel_step2<bitsuffix>"
967 [(set (match_operand:I48MODE 0 "register_operand" "")
968 (unspec:I48MODE
969 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
970 (const:I48MODE
971 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")
972 (match_operand:I48MODE 3 "symbolic_operand" "")]
973 UNSPEC_HW0_PCREL))]
974 UNSPEC_INSN_ADDR_SHL16INSLI))]
975 "flag_pic")
976
977 ;; Third step of the 3-insn sequence to materialize a position
978 ;; independent address by adding the difference of two labels to a base
979 ;; label in the text segment, assuming that the difference fits in 32
980 ;; signed bits.
981 (define_insn "mov_pcrel_step3<bitsuffix>"
982 [(set (match_operand:I48MODE 0 "register_operand" "=r")
983 (unspec:I48MODE [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
984 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")
985 (match_operand:I48MODE 3 "symbolic_operand" "in")
986 (match_operand:I48MODE 4 "symbolic_operand" "in")]
987 UNSPEC_MOV_PCREL_STEP3))]
988 "flag_pic"
989 "add<x>\t%0, %r1, %r2")
990
991 (define_expand "add_got16<bitsuffix>"
992 [(set (match_operand:I48MODE 0 "register_operand" "")
993 (plus:I48MODE
994 (match_operand:I48MODE 1 "reg_or_0_operand" "")
995 (const:I48MODE
996 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
997 UNSPEC_HW0_LAST_GOT))))]
998 "flag_pic == 1")
999
1000 (define_expand "mov_got32_step1<bitsuffix>"
1001 [(set (match_operand:I48MODE 0 "register_operand" "")
1002 (const:I48MODE
1003 (unspec:I48MODE [(match_operand:I48MODE 1 "symbolic_operand" "")]
1004 UNSPEC_HW1_LAST_GOT)))]
1005 "flag_pic == 2")
1006
1007 (define_expand "mov_got32_step2<bitsuffix>"
1008 [(set (match_operand:I48MODE 0 "register_operand" "")
1009 (unspec:I48MODE
1010 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1011 (const:I48MODE
1012 (unspec:I48MODE [(match_operand:I48MODE 2 "symbolic_operand" "")]
1013 UNSPEC_HW0_GOT))]
1014 UNSPEC_INSN_ADDR_SHL16INSLI))]
1015 "flag_pic == 2")
1016
1017 \f
1018 ;;
1019 ;; TLS
1020 ;;
1021
1022 (define_expand "mov_tls_gd_step1<bitsuffix>"
1023 [(set (match_operand:I48MODE 0 "register_operand" "")
1024 (const:I48MODE
1025 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1026 UNSPEC_HW1_LAST_TLS_GD)))]
1027 "HAVE_AS_TLS")
1028
1029 (define_expand "mov_tls_gd_step2<bitsuffix>"
1030 [(set (match_operand:I48MODE 0 "register_operand" "")
1031 (unspec:I48MODE
1032 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1033 (const:I48MODE
1034 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1035 UNSPEC_HW0_TLS_GD))]
1036 UNSPEC_INSN_ADDR_SHL16INSLI))]
1037 "HAVE_AS_TLS")
1038
1039 (define_expand "mov_tls_ie_step1<bitsuffix>"
1040 [(set (match_operand:I48MODE 0 "register_operand" "")
1041 (const:I48MODE
1042 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1043 UNSPEC_HW1_LAST_TLS_IE)))]
1044 "HAVE_AS_TLS")
1045
1046 (define_expand "mov_tls_ie_step2<bitsuffix>"
1047 [(set (match_operand:I48MODE 0 "register_operand" "")
1048 (unspec:I48MODE
1049 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1050 (const:I48MODE
1051 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1052 UNSPEC_HW0_TLS_IE))]
1053 UNSPEC_INSN_ADDR_SHL16INSLI))]
1054 "HAVE_AS_TLS")
1055
1056 (define_expand "mov_tls_le_step1<bitsuffix>"
1057 [(set (match_operand:I48MODE 0 "register_operand" "")
1058 (const:I48MODE
1059 (unspec:I48MODE [(match_operand:I48MODE 1 "tls_symbolic_operand" "")]
1060 UNSPEC_HW1_LAST_TLS_LE)))]
1061 "HAVE_AS_TLS")
1062
1063 (define_expand "mov_tls_le_step2<bitsuffix>"
1064 [(set (match_operand:I48MODE 0 "register_operand" "")
1065 (unspec:I48MODE
1066 [(match_operand:I48MODE 1 "reg_or_0_operand" "")
1067 (const:I48MODE
1068 (unspec:I48MODE [(match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1069 UNSPEC_HW0_TLS_LE))]
1070 UNSPEC_INSN_ADDR_SHL16INSLI))]
1071 "HAVE_AS_TLS")
1072
1073 (define_expand "tls_gd_call<bitsuffix>"
1074 [(parallel
1075 [(set (reg:I48MODE 0)
1076 (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1077 (reg:I48MODE 0)]
1078 UNSPEC_TLS_GD_CALL))
1079 (clobber (reg:I48MODE 25))
1080 (clobber (reg:I48MODE 26))
1081 (clobber (reg:I48MODE 27))
1082 (clobber (reg:I48MODE 28))
1083 (clobber (reg:I48MODE 29))
1084 (clobber (reg:I48MODE 55))])]
1085 ""
1086 {
1087 cfun->machine->calls_tls_get_addr = true;
1088 })
1089
1090 (define_insn "*tls_gd_call<bitsuffix>"
1091 [(set (reg:I48MODE 0)
1092 (unspec:I48MODE [(match_operand:I48MODE 0 "tls_symbolic_operand" "")
1093 (reg:I48MODE 0)]
1094 UNSPEC_TLS_GD_CALL))
1095 (clobber (reg:I48MODE 25))
1096 (clobber (reg:I48MODE 26))
1097 (clobber (reg:I48MODE 27))
1098 (clobber (reg:I48MODE 28))
1099 (clobber (reg:I48MODE 29))
1100 (clobber (reg:I48MODE 55))]
1101 ""
1102 "jal\ttls_gd_call(%0)"
1103 [(set_attr "type" "X1")])
1104
1105 (define_insn "tls_gd_add<bitsuffix>"
1106 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1107 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1108 (match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1109 UNSPEC_TLS_GD_ADD))]
1110 "HAVE_AS_TLS"
1111 "add<x>i\t%0, %1, tls_gd_add(%2)")
1112
1113 (define_insn "tls_add<bitsuffix>"
1114 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1115 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1116 (match_operand:I48MODE 2 "register_operand" "0")
1117 (match_operand:I48MODE 3 "tls_symbolic_operand" "")]
1118 UNSPEC_TLS_ADD))]
1119 "HAVE_AS_TLS"
1120 "add<x>i\t%0, %1, tls_add(%3)")
1121
1122 (define_insn "tls_ie_load<bitsuffix>"
1123 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1124 (unspec:I48MODE [(match_operand:I48MODE 1 "register_operand" "r")
1125 (match_operand:I48MODE 2 "tls_symbolic_operand" "")]
1126 UNSPEC_TLS_IE_LOAD))]
1127 "HAVE_AS_TLS"
1128 "ld<four_s_if_si>_tls\t%0, %1, tls_ie_load(%2)"
1129 [(set_attr "type" "X1_2cycle")])
1130
1131 (define_insn "*zero_extract<mode>"
1132 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1133 (zero_extract:I48MODE
1134 (match_operand:I48MODE 1 "reg_or_0_operand" "r")
1135 (match_operand:I48MODE 2 "u6bit_cint_operand" "n")
1136 (match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
1137 ""
1138 "bfextu\t%0, %r1, %3, %3+%2-1"
1139 [(set_attr "type" "X0")])
1140
1141 (define_insn "*sign_extract_low32"
1142 [(set (match_operand:DI 0 "register_operand" "=r")
1143 (sign_extract:DI
1144 (match_operand:DI 1 "reg_or_0_operand" "r")
1145 (match_operand:DI 2 "u6bit_cint_operand" "n")
1146 (match_operand:DI 3 "u6bit_cint_operand" "n")))]
1147 "INTVAL (operands[3]) == 0 && INTVAL (operands[2]) == 32"
1148 "addxi\t%0, %r1, 0")
1149
1150 (define_insn "*sign_extract"
1151 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1152 (sign_extract:I48MODE
1153 (match_operand:I48MODE 1 "reg_or_0_operand" "r")
1154 (match_operand:I48MODE 2 "u6bit_cint_operand" "n")
1155 (match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
1156 ""
1157 "bfexts\t%0, %r1, %3, %3+%2-1"
1158 [(set_attr "type" "X0")])
1159
1160 \f
1161 ;;
1162 ;; Arithmetic ops
1163 ;;
1164
1165 (define_insn "add<mode>3"
1166 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1167 (plus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO,rO")
1168 (match_operand:I48MODE 2 "add_operand" "r,I,JT")))]
1169 ""
1170 "@
1171 add<x>\t%0, %r1, %r2
1172 add<x>i\t%0, %r1, %2
1173 add<x>li\t%0, %r1, %H2"
1174 [(set_attr "type" "*,*,X01")])
1175
1176 (define_insn "*addsi3_sext"
1177 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1178 (sign_extend:DI
1179 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO")
1180 (match_operand:SI 2 "add_operand" "r,I,JT"))))]
1181 ""
1182 "@
1183 addx\t%0, %r1, %r2
1184 addxi\t%0, %r1, %2
1185 addxli\t%0, %r1, %H2"
1186 [(set_attr "type" "*,*,X01")])
1187
1188 (define_insn "sub<mode>3"
1189 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1190 (minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1191 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
1192 ""
1193 "sub<x>\t%0, %r1, %r2")
1194
1195 (define_insn "*subsi3_sext"
1196 [(set (match_operand:DI 0 "register_operand" "=r")
1197 (sign_extend:DI
1198 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1199 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1200 ""
1201 "subx\t%0, %r1, %r2")
1202
1203 (define_insn "neg<mode>2"
1204 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1205 (neg:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO")))]
1206 ""
1207 "sub<x>\t%0, zero, %r1")
1208
1209 (define_insn "*negsi2_sext"
1210 [(set (match_operand:DI 0 "register_operand" "=r")
1211 (sign_extend:DI
1212 (neg:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))))]
1213 ""
1214 "subx\t%0, zero, %r1")
1215
1216 (define_insn "ssaddsi3"
1217 [(set (match_operand:SI 0 "register_operand" "=r")
1218 (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1219 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
1220 ""
1221 "addxsc\t%0, %r1, %r2"
1222 [(set_attr "type" "X01")])
1223
1224 (define_insn "*ssaddsi3_sext"
1225 [(set (match_operand:DI 0 "register_operand" "=r")
1226 (sign_extend:DI
1227 (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1228 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1229 ""
1230 "addxsc\t%0, %r1, %r2"
1231 [(set_attr "type" "X01")])
1232
1233 (define_insn "sssubsi3"
1234 [(set (match_operand:SI 0 "register_operand" "=r")
1235 (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1236 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
1237 ""
1238 "subxsc\t%0, %r1, %r2"
1239 [(set_attr "type" "X01")])
1240
1241 (define_insn "*sssubsi3_sext"
1242 [(set (match_operand:DI 0 "register_operand" "=r")
1243 (sign_extend:DI
1244 (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1245 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
1246 ""
1247 "subxsc\t%0, %r1, %r2"
1248 [(set_attr "type" "X01")])
1249
1250 (define_expand "addsf3"
1251 [(set (match_operand:SF 0 "register_operand" "")
1252 (plus:SF (match_operand:SF 1 "register_operand" "")
1253 (match_operand:SF 2 "register_operand" "")))]
1254 ""
1255 {
1256 rtx result = gen_lowpart (DImode, operands[0]);
1257 rtx a = gen_lowpart (DImode, operands[1]);
1258 rtx b = gen_lowpart (DImode, operands[2]);
1259
1260 rtx tmp = gen_reg_rtx (DImode);
1261 rtx flags = gen_reg_rtx (DImode);
1262
1263 emit_insn (gen_insn_fsingle_add1 (tmp, a, b));
1264 emit_insn (gen_insn_fsingle_addsub2 (tmp, tmp, a, b));
1265 emit_insn (gen_insn_fsingle_pack1 (flags, tmp));
1266 emit_insn (gen_insn_fsingle_pack2 (result, tmp, flags));
1267
1268 DONE;
1269 })
1270
1271 (define_expand "subsf3"
1272 [(set (match_operand:SF 0 "register_operand" "")
1273 (minus:SF (match_operand:SF 1 "register_operand" "")
1274 (match_operand:SF 2 "register_operand" "")))]
1275 ""
1276 {
1277 rtx result = gen_lowpart (DImode, operands[0]);
1278 rtx a = gen_lowpart (DImode, operands[1]);
1279 rtx b = gen_lowpart (DImode, operands[2]);
1280
1281 rtx tmp = gen_reg_rtx (DImode);
1282 rtx flags = gen_reg_rtx (DImode);
1283
1284 emit_insn (gen_insn_fsingle_sub1 (tmp, a, b));
1285 emit_insn (gen_insn_fsingle_addsub2 (tmp, tmp, a, b));
1286 emit_insn (gen_insn_fsingle_pack1 (flags, tmp));
1287 emit_insn (gen_insn_fsingle_pack2 (result, tmp, flags));
1288
1289 DONE;
1290 })
1291
1292 (define_expand "mulsf3"
1293 [(set (match_operand:SF 0 "register_operand" "")
1294 (mult:SF (match_operand:SF 1 "register_operand" "")
1295 (match_operand:SF 2 "register_operand" "")))]
1296 ""
1297 {
1298 rtx result = gen_lowpart (DImode, operands[0]);
1299 rtx a = gen_lowpart (DImode, operands[1]);
1300 rtx b = gen_lowpart (DImode, operands[2]);
1301
1302 rtx tmp1 = gen_reg_rtx (DImode);
1303 rtx tmp2 = gen_reg_rtx (DImode);
1304 rtx flags = gen_reg_rtx (DImode);
1305
1306 emit_insn (gen_insn_fsingle_mul1 (tmp1, a, b));
1307 emit_insn (gen_insn_fsingle_mul2 (tmp2, tmp1, b));
1308 emit_insn (gen_insn_fsingle_pack1 (flags, tmp2));
1309 emit_insn (gen_insn_fsingle_pack2 (result, tmp2, flags));
1310
1311 DONE;
1312 })
1313
1314 (define_expand "adddf3"
1315 [(set (match_operand:DF 0 "register_operand" "")
1316 (plus:DF (match_operand:DF 1 "register_operand" "")
1317 (match_operand:DF 2 "register_operand" "")))]
1318 ""
1319 {
1320 rtx result = gen_lowpart (DImode, operands[0]);
1321 rtx a = gen_lowpart (DImode, operands[1]);
1322 rtx b = gen_lowpart (DImode, operands[2]);
1323
1324 rtx min = gen_reg_rtx (DImode);
1325 rtx max = gen_reg_rtx (DImode);
1326 rtx flags = gen_reg_rtx (DImode);
1327
1328 emit_insn (gen_insn_fdouble_unpack_min (min, a, b));
1329 emit_insn (gen_insn_fdouble_unpack_max (max, a, b));
1330 emit_insn (gen_insn_fdouble_add_flags (flags, a, b));
1331 emit_insn (gen_insn_fdouble_addsub (max, max, min, flags));
1332 emit_insn (gen_insn_fdouble_pack1 (result, max, flags));
1333 emit_insn (gen_insn_fdouble_pack2 (result, result, max, const0_rtx));
1334
1335 DONE;
1336 })
1337
1338
1339 (define_expand "subdf3"
1340 [(set (match_operand:DF 0 "register_operand" "")
1341 (minus:DF (match_operand:DF 1 "register_operand" "")
1342 (match_operand:DF 2 "register_operand" "")))]
1343 ""
1344 {
1345 rtx result = gen_lowpart (DImode, operands[0]);
1346 rtx a = gen_lowpart (DImode, operands[1]);
1347 rtx b = gen_lowpart (DImode, operands[2]);
1348
1349 rtx min = gen_reg_rtx (DImode);
1350 rtx max = gen_reg_rtx (DImode);
1351 rtx flags = gen_reg_rtx (DImode);
1352
1353 emit_insn (gen_insn_fdouble_unpack_min (min, a, b));
1354 emit_insn (gen_insn_fdouble_unpack_max (max, a, b));
1355 emit_insn (gen_insn_fdouble_sub_flags (flags, a, b));
1356 emit_insn (gen_insn_fdouble_addsub (max, max, min, flags));
1357 emit_insn (gen_insn_fdouble_pack1 (result, max, flags));
1358 emit_insn (gen_insn_fdouble_pack2 (result, result, max, const0_rtx));
1359
1360 DONE;
1361 })
1362
1363 (define_expand "muldf3"
1364 [(set (match_operand:DF 0 "register_operand" "")
1365 (mult:DF (match_operand:DF 1 "register_operand" "")
1366 (match_operand:DF 2 "register_operand" "")))]
1367 ""
1368 ;; TODO: Decide if we should not inline this with -Os.
1369 ;; "optimize_function_for_speed_p (cfun)"
1370 {
1371 rtx result = gen_lowpart (DImode, operands[0]);
1372 rtx a = gen_lowpart (DImode, operands[1]);
1373 rtx b = gen_lowpart (DImode, operands[2]);
1374
1375 rtx a_unpacked = gen_reg_rtx (DImode);
1376 rtx b_unpacked = gen_reg_rtx (DImode);
1377 rtx flags = gen_reg_rtx (DImode);
1378
1379 rtx low1 = gen_reg_rtx (DImode);
1380 rtx low = gen_reg_rtx (DImode);
1381 rtx low_carry = gen_reg_rtx (DImode);
1382
1383 rtx mid = gen_reg_rtx (DImode);
1384 rtx mid_l32 = gen_reg_rtx (DImode);
1385 rtx mid_r32 = gen_reg_rtx (DImode);
1386
1387 rtx high1 = gen_reg_rtx (DImode);
1388 rtx high = gen_reg_rtx (DImode);
1389 rtx high1_plus_mid_r32 = gen_reg_rtx (DImode);
1390
1391 /* NOTE: We compute using max(a, 0) and max(b, 0) rather than
1392 min(a, b) and max(a, b) because for multiply we just need to unpack,
1393 we don't actually care which is min and which is max. And this
1394 formulation gives the scheduler more freedom in case one of a or b
1395 would stall at the start of this code sequence. */
1396 emit_insn (gen_insn_fdouble_unpack_max (a_unpacked, a, const0_rtx));
1397 emit_insn (gen_insn_fdouble_unpack_max (b_unpacked, b, const0_rtx));
1398 emit_insn (gen_insn_fdouble_mul_flags (flags, a, b));
1399
1400 /* This depends on the fact that the high few bits of the unpacked
1401 mantissa are zero, so we can't have a carry out from the mid sum. */
1402 emit_insn (gen_insn_mul_lu_lu (low1, a_unpacked, b_unpacked));
1403 emit_insn (gen_insn_mul_hu_lu (mid, a_unpacked, b_unpacked));
1404 emit_insn (gen_insn_mula_hu_lu (mid, mid, b_unpacked, a_unpacked));
1405 emit_insn (gen_insn_mul_hu_hu (high1, a_unpacked, b_unpacked));
1406
1407 emit_insn (gen_ashldi3 (mid_l32, mid, GEN_INT (32)));
1408 emit_insn (gen_lshrdi3 (mid_r32, mid, GEN_INT (32)));
1409
1410 emit_insn (gen_adddi3 (high1_plus_mid_r32, high1, mid_r32));
1411
1412 emit_insn (gen_adddi3 (low, low1, mid_l32));
1413 emit_insn (gen_insn_cmpltu_didi (low_carry, low, mid_l32));
1414
1415 emit_insn (gen_adddi3 (high, high1_plus_mid_r32, low_carry));
1416
1417 emit_insn (gen_insn_fdouble_pack1 (result, high, flags));
1418 emit_insn (gen_insn_fdouble_pack2 (result, result, high, low));
1419
1420 DONE;
1421 })
1422
1423 \f
1424 ;;
1425 ;; Shifts
1426 ;;
1427
1428 (define_insn "ashl<mode>3"
1429 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1430 (ashift:I48MODE
1431 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1432 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1433 ""
1434 "@
1435 shl<x>i\t%0, %r1, %2
1436 shl<x>\t%0, %r1, %r2"
1437 [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1438
1439 (define_insn "*ashlsi3_sext"
1440 [(set (match_operand:DI 0 "register_operand" "=r,r")
1441 (sign_extend:DI
1442 (ashift:SI
1443 (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1444 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1445 ""
1446 "@
1447 shlxi\t%0, %r1, %2
1448 shlx\t%0, %r1, %r2"
1449 [(set_attr "type" "X01,X01")])
1450
1451 (define_insn "ashr<mode>3"
1452 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1453 (ashiftrt:I48MODE
1454 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1455 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1456 ""
1457 "@
1458 shrsi\t%0, %r1, %2
1459 shrs\t%0, %r1, %r2")
1460
1461 (define_insn "*ashrsi3_sext"
1462 [(set (match_operand:DI 0 "register_operand" "=r,r")
1463 (sign_extend:DI
1464 (ashiftrt:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1465 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1466 ""
1467 "@
1468 shrsi\t%0, %r1, %2
1469 shrs\t%0, %r1, %r2")
1470
1471 (define_insn "lshr<mode>3"
1472 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
1473 (lshiftrt:I48MODE
1474 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1475 (match_operand:SI 2 "reg_or_u<nbits>bit_operand" "I,rO")))]
1476 ""
1477 "@
1478 shru<x>i\t%0, %r1, %2
1479 shru<x>\t%0, %r1, %r2"
1480 [(set_attr "type" "<shift_pipe>,<shift_pipe>")])
1481
1482 (define_insn "*lshrsi3_sext"
1483 [(set (match_operand:DI 0 "register_operand" "=r,r")
1484 (sign_extend:DI
1485 (lshiftrt:SI
1486 (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1487 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO"))))]
1488 ""
1489 "@
1490 shruxi\t%0, %r1, %2
1491 shrux\t%0, %r1, %r2"
1492 [(set_attr "type" "X01,X01")])
1493
1494 (define_insn "rotldi3"
1495 [(set (match_operand:DI 0 "register_operand" "=r,r")
1496 (rotate:DI (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1497 (match_operand:SI 2 "reg_or_u6bit_operand" "I,rO")))]
1498 ""
1499 "@
1500 rotli\t%0, %r1, %2
1501 rotl\t%0, %r1, %r2")
1502
1503 (define_insn "insn_shl16insli"
1504 [(set (match_operand:DI 0 "register_operand" "=r,r")
1505 (ior:DI
1506 (ashift:DI
1507 (match_operand:DI 1 "reg_or_0_operand" "rO,rO")
1508 (const_int 16))
1509 (match_operand:DI 2 "u16bit_or_const_symbolic_operand" "O,KT")))]
1510 ""
1511 "@
1512 shli\t%0, %r1, 16
1513 shl16insli\t%0, %r1, %H2"
1514 [(set_attr "type" "*,X01")])
1515
1516 (define_insn "insn_addr_shl16insli<bitsuffix>"
1517 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1518 (unspec:I48MODE
1519 [(match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1520 (match_operand:I48MODE 2 "const_symbolic_operand" "T")]
1521 UNSPEC_INSN_ADDR_SHL16INSLI))]
1522 ""
1523 "shl16insli\t%0, %r1, %H2"
1524 [(set_attr "type" "X01")])
1525
1526 \f
1527 ;;
1528 ;; Compares
1529 ;;
1530
1531 (define_expand "cstore<mode>4"
1532 [(set (match_operand:DI 0 "register_operand" "")
1533 (match_operator:DI 1 "ordered_comparison_operator"
1534 [(match_operand:FI48MODE 2 "reg_or_cint_operand" "")
1535 (match_operand:FI48MODE 3 "reg_or_cint_operand" "")]))]
1536 ""
1537 {
1538 if (!tilegx_emit_setcc (operands, GET_MODE (operands[2])))
1539 FAIL;
1540 else
1541 DONE;
1542 })
1543
1544
1545 (define_insn "insn_cmpne_<I48MODE:mode><I48MODE2:mode>"
1546 [(set (match_operand:I48MODE2 0 "register_operand" "=r")
1547 (ne:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
1548 (match_operand:I48MODE 2 "reg_or_cint_operand" "rO")))]
1549 ""
1550 "cmpne\t%0, %r1, %r2")
1551
1552 (define_insn "insn_cmpeq_<I48MODE:mode><I48MODE2:mode>"
1553 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1554 (eq:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO")
1555 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1556 ""
1557 "@
1558 cmpeqi\t%0, %r1, %2
1559 cmpeq\t%0, %r1, %r2")
1560
1561 (define_insn "insn_cmplts_<I48MODE:mode><I48MODE2:mode>"
1562 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1563 (lt:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1564 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1565 ""
1566 "@
1567 cmpltsi\t%0, %r1, %2
1568 cmplts\t%0, %r1, %r2")
1569
1570 (define_insn "insn_cmpltu_<I48MODE:mode><I48MODE2:mode>"
1571 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1572 (ltu:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1573 (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
1574 ""
1575 "@
1576 cmpltui\t%0, %r1, %2
1577 cmpltu\t%0, %r1, %r2"
1578 [(set_attr "type" "X01,*")])
1579
1580 (define_insn "insn_cmples_<I48MODE:mode><I48MODE2:mode>"
1581 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1582 (le:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1583 (match_operand:I48MODE 2 "reg_or_cint_operand" "L,rO")))]
1584 ""
1585 "@
1586 cmpltsi\t%0, %r1, %P2
1587 cmples\t%0, %r1, %r2")
1588
1589 (define_insn "insn_cmpleu_<I48MODE:mode><I48MODE2:mode>"
1590 [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
1591 (leu:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO,rO")
1592 (match_operand:I48MODE 2 "reg_or_cint_operand" "Q,rO")))]
1593 ""
1594 "@
1595 cmpltui\t%0, %r1, %P2
1596 cmpleu\t%0, %r1, %r2"
1597 [(set_attr "type" "X01,*")])
1598
1599 \f
1600 ;;
1601 ;; Logical ops
1602 ;;
1603
1604 (define_insn "and<mode>3"
1605 [(set (match_operand:IVNMODE 0 "register_operand" "=r,r,r,r")
1606 (and:IVNMODE (match_operand:IVNMODE 1 "reg_or_0_operand" "%rO,rO,0,rO")
1607 (match_operand:IVNMODE 2 "and_operand" "I,S,M,rO")))]
1608 ""
1609 "@
1610 andi\t%0, %r1, %2
1611 bfextu\t%0, %r1, %M2
1612 bfins\t%0, zero, %m2
1613 and\t%0, %r1, %r2"
1614 [(set_attr "type" "*,X0,X0,*")])
1615
1616 (define_insn "*andsi3_sext"
1617 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
1618 (sign_extend:DI
1619 (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,0,rO")
1620 (match_operand:SI 2 "and_operand" "I,S,M,rO"))))]
1621 ""
1622 "@
1623 andi\t%0, %r1, %2
1624 bfextu\t%0, %r1, %M2
1625 bfins\t%0, zero, %m2
1626 and\t%0, %r1, %r2"
1627 [(set_attr "type" "*,X0,X0,*")])
1628
1629 (define_insn "anddi3"
1630 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r")
1631 (and:DI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO,rO,0,rO")
1632 (match_operand:DI 2 "and_operand" "I,Z0,Z1,S,M,rO")))]
1633 ""
1634 "@
1635 andi\t%0, %r1, %2
1636 v4int_l\t%0, zero, %r1
1637 v4int_h\t%0, %r1, zero
1638 bfextu\t%0, %r1, %M2
1639 bfins\t%0, zero, %m2
1640 and\t%0, %r1, %r2"
1641 [(set_attr "type" "*,X01,X01,X0,X0,*")])
1642
1643 (define_insn "ior<mode>3"
1644 [(set (match_operand:IVMODE 0 "register_operand" "=r,r")
1645 (ior:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "%rO,rO")
1646 (match_operand:IVMODE 2 "reg_or_s8bit_operand" "rO,I")))]
1647 ""
1648 "@
1649 or\t%0, %r1, %r2
1650 ori\t%0, %r1, %2"
1651 [(set_attr "type" "*,X01")])
1652
1653 (define_insn "*iorsi3_sext"
1654 [(set (match_operand:DI 0 "register_operand" "=r,r")
1655 (sign_extend:DI
1656 (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1657 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1658 ""
1659 "@
1660 or\t%0, %r1, %r2
1661 ori\t%0, %r1, %2"
1662 [(set_attr "type" "*,X01")])
1663
1664 (define_insn "xor<mode>3"
1665 [(set (match_operand:IVMODE 0 "register_operand" "=r,r")
1666 (xor:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "%rO,rO")
1667 (match_operand:IVMODE 2 "reg_or_s8bit_operand" "rO,I")))]
1668 ""
1669 "@
1670 xor\t%0, %r1, %r2
1671 xori\t%0, %r1, %2"
1672 [(set_attr "type" "*,X01")])
1673
1674 (define_insn "*xorsi3_sext"
1675 [(set (match_operand:DI 0 "register_operand" "=r,r")
1676 (sign_extend:DI
1677 (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
1678 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I"))))]
1679 ""
1680 "@
1681 xor\t%0, %r1, %r2
1682 xori\t%0, %r1, %2"
1683 [(set_attr "type" "*,X01")])
1684
1685 (define_insn "clzdi2"
1686 [(set (match_operand:DI 0 "register_operand" "=r")
1687 (clz:DI (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1688 ""
1689 "clz\t%0, %r1"
1690 [(set_attr "type" "Y0")])
1691
1692 (define_expand "clzsi2"
1693 [(set (match_dup 2)
1694 (ashift:DI (match_operand:SI 1 "reg_or_0_operand" "")
1695 (const_int 32)))
1696 (set (subreg:DI (match_operand:SI 0 "register_operand" "") 0)
1697 (clz:DI (match_dup 2)))]
1698 ""
1699 {
1700 operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);
1701 operands[2] = gen_reg_rtx (DImode);
1702 })
1703
1704 (define_insn "ctz<mode>2"
1705 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1706 (ctz:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1707 ""
1708 "ctz\t%0, %r1"
1709 [(set_attr "type" "Y0")])
1710
1711
1712 (define_insn "popcount<mode>2"
1713 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1714 (popcount:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1715 ""
1716 "pcnt\t%0, %r1"
1717 [(set_attr "type" "Y0")])
1718
1719 (define_expand "parity<mode>2"
1720 [(set (match_operand:I48MODE 0 "register_operand" "")
1721 (parity:I48MODE (match_operand:DI 1 "reg_or_0_operand" "")))]
1722 ""
1723 {
1724 rtx tmp = gen_reg_rtx (<MODE>mode);
1725 emit_insn (gen_popcount<mode>2 (tmp, operands[1]));
1726 emit_insn (gen_and<mode>3 (operands[0], tmp, const1_rtx));
1727 DONE;
1728 })
1729
1730 (define_insn "bswapdi2"
1731 [(set (match_operand:DI 0 "register_operand" "=r")
1732 (bswap:DI (match_operand:DI 1 "reg_or_0_operand" "rO")))]
1733 ""
1734 "revbytes\t%0, %r1"
1735 [(set_attr "type" "Y0")])
1736
1737 (define_expand "bswapsi2"
1738 [(set (match_operand:SI 0 "register_operand" "")
1739 (bswap:SI (match_operand:SI 1 "reg_or_0_operand" "")))]
1740 ""
1741 {
1742 rtx tmp = gen_reg_rtx (DImode);
1743 emit_insn (gen_bswapdi2 (tmp, gen_lowpart (DImode, operands[1])));
1744 emit_insn (gen_ashrdi3 (gen_lowpart (DImode, operands[0]),
1745 tmp, GEN_INT (32)));
1746 DONE;
1747 })
1748
1749 (define_insn "one_cmpl<mode>2"
1750 [(set (match_operand:IVMODE 0 "register_operand" "=r")
1751 (not:IVMODE (match_operand:IVMODE 1 "reg_or_0_operand" "rO")))]
1752 ""
1753 "nor\t%0, %r1, zero")
1754
1755 \f
1756 ;;
1757 ;; Conditional moves
1758 ;;
1759
1760 (define_expand "mov<mode>cc"
1761 [(set (match_operand:I48MODE 0 "register_operand" "")
1762 (if_then_else:I48MODE
1763 (match_operand 1 "comparison_operator" "")
1764 (match_operand:I48MODE 2 "reg_or_0_operand" "")
1765 (match_operand:I48MODE 3 "reg_or_0_operand" "")))]
1766 ""
1767 { operands[1] = tilegx_emit_conditional_move (operands[1]); })
1768
1769 (define_insn "movcc_insn_<I48MODE2:mode><I48MODE:mode>"
1770 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r,r")
1771 (if_then_else:I48MODE
1772 (match_operator 4 "eqne_operator"
1773 [(match_operand:I48MODE2 1 "reg_or_0_operand" "rO,rO,rO,rO")
1774 (const_int 0)])
1775 (match_operand:I48MODE 2 "reg_or_0_operand" "rO,O,rO,0")
1776 (match_operand:I48MODE 3 "reg_or_0_operand" "O,rO,0,rO")))]
1777 ""
1778 "@
1779 m%c4\t%0, %r1, %r2
1780 m%C4\t%0, %r1, %r3
1781 cmov%d4z\t%0, %r1, %r2
1782 cmov%D4z\t%0, %r1, %r3"
1783 [(set_attr "type" "*,*,Y0,Y0")])
1784
1785 (define_expand "insn_mz"
1786 [(set (match_operand:DI 0 "register_operand" "")
1787 (if_then_else:DI
1788 (eq (match_operand:DI 1 "reg_or_0_operand" "")
1789 (const_int 0))
1790 (match_operand:DI 2 "reg_or_0_operand" "")
1791 (const_int 0)))])
1792
1793 (define_expand "insn_mnz"
1794 [(set (match_operand:DI 0 "register_operand" "")
1795 (if_then_else:DI
1796 (ne (match_operand:DI 1 "reg_or_0_operand" "")
1797 (const_int 0))
1798 (match_operand:DI 2 "reg_or_0_operand" "")
1799 (const_int 0)))])
1800
1801 (define_expand "insn_cmoveqz"
1802 [(set (match_operand:DI 0 "register_operand" "")
1803 (if_then_else:DI
1804 (eq (match_operand:DI 2 "reg_or_0_operand" "")
1805 (const_int 0))
1806 (match_operand:DI 3 "reg_or_0_operand" "")
1807 (match_operand:DI 1 "reg_or_0_operand" "")))])
1808
1809 (define_expand "insn_cmovnez"
1810 [(set (match_operand:DI 0 "register_operand" "")
1811 (if_then_else:DI
1812 (ne (match_operand:DI 2 "reg_or_0_operand" "")
1813 (const_int 0))
1814 (match_operand:DI 3 "reg_or_0_operand" "")
1815 (match_operand:DI 1 "reg_or_0_operand" "")))])
1816
1817 \f
1818 ;;
1819 ;; Conversions
1820 ;;
1821
1822 (define_insn "zero_extendqi<mode>2"
1823 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1824 (zero_extend:I48MODE (match_operand:QI 1 "move_operand" "rO,U,m")))]
1825 ""
1826 "@
1827 bfextu\t%0, %r1, 0, 7
1828 ld1u\t%0, %1
1829 ld1u_add\t%0, %I1, %i1"
1830 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1831
1832 (define_insn "zero_extendhi<mode>2"
1833 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1834 (zero_extend:I48MODE (match_operand:HI 1 "move_operand" "rO,U,m")))]
1835 ""
1836 "@
1837 bfextu\t%0, %r1, 0, 15
1838 ld2u\t%0, %1
1839 ld2u_add\t%0, %I1, %i1"
1840 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1841
1842 (define_insn "zero_extendsidi2"
1843 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1844 (zero_extend:DI (match_operand:SI 1 "move_operand" "rO,U,m")))]
1845 ""
1846 "@
1847 v4int_l\t%0, zero, %r1
1848 ld4u\t%0, %1
1849 ld4u_add\t%0, %I1, %i1"
1850 [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
1851
1852 (define_insn "extendqi<mode>2"
1853 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1854 (sign_extend:I48MODE (match_operand:QI 1 "move_operand" "rO,U,m")))]
1855 ""
1856 "@
1857 bfexts\t%0, %r1, 0, 7
1858 ld1s\t%0, %1
1859 ld1s_add\t%0, %I1, %i1"
1860 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1861
1862 (define_insn "extendhi<mode>2"
1863 [(set (match_operand:I48MODE 0 "register_operand" "=r,r,r")
1864 (sign_extend:I48MODE (match_operand:HI 1 "move_operand" "rO,U,m")))]
1865 ""
1866 "@
1867 bfexts\t%0, %r1, 0, 15
1868 ld2s\t%0, %1
1869 ld2s_add\t%0, %I1, %i1"
1870 [(set_attr "type" "X0,Y2_2cycle,X1_2cycle")])
1871
1872 ;; All SImode integer registers should already be in sign-extended
1873 ;; form (see TRULY_NOOP_TRUNCATION and truncdisi2). We can therefore
1874 ;; get rid of register->register instructions if we constrain the
1875 ;; source to be in the same register as the destination.
1876 (define_insn_and_split "extendsidi2"
1877 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1878 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "0,U,m")))]
1879 ""
1880 "@
1881 #
1882 ld4s\t%0, %1
1883 ld4s_add\t%0, %I1, %i1"
1884 "&& reload_completed && register_operand (operands[1], VOIDmode)"
1885 [(const_int 0)]
1886 {
1887 emit_note (NOTE_INSN_DELETED);
1888 DONE;
1889 }
1890 [(set_attr "type" "*,Y2_2cycle,X1_2cycle")])
1891
1892 ;; Integer truncation patterns. Truncating SImode values to smaller
1893 ;; modes is a no-op, as it is for most other GCC ports. Truncating
1894 ;; DImode values to SImode is not a no-op since we
1895 ;; need to make sure that the lower 32 bits are properly sign-extended
1896 ;; (see TRULY_NOOP_TRUNCATION). Truncating DImode values into modes
1897 ;; smaller than SImode is equivalent to two separate truncations:
1898 ;;
1899 ;; A B
1900 ;; DI ---> HI == DI ---> SI ---> HI
1901 ;; DI ---> QI == DI ---> SI ---> QI
1902 ;;
1903 ;; Step A needs a real instruction but step B does not.
1904
1905 (define_insn "truncdisi2"
1906 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,U,m")
1907 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1908 ""
1909 "@
1910 addxi\t%0, %r1, 0
1911 st4\t%0, %r1
1912 st4_add\t%I0, %r1, %i0"
1913 [(set_attr "type" "Y01,Y2,X1")])
1914
1915 (define_insn "truncdihi2"
1916 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,U,m")
1917 (truncate:HI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1918 ""
1919 "@
1920 addxi\t%0, %r1, 0
1921 st2\t%0, %r1
1922 st2_add\t%I0, %r1, %i0"
1923 [(set_attr "type" "Y01,Y2,X1")])
1924
1925 (define_insn "truncdiqi2"
1926 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,U,m")
1927 (truncate:QI (match_operand:DI 1 "reg_or_0_operand" "rO,rO,rO")))]
1928 ""
1929 "@
1930 addxi\t%0, %r1, 0
1931 st1\t%0, %r1
1932 st1_add\t%I0, %r1, %i0"
1933 [(set_attr "type" "Y01,Y2,X1")])
1934
1935 ;; Combiner patterns to optimize away unnecessary truncates.
1936
1937 (define_insn "*zero_extendsidi_truncdisi"
1938 [(set (match_operand:DI 0 "register_operand" "=r")
1939 (zero_extend:DI
1940 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "0"))))]
1941 ""
1942 "v4int_l\t%0, zero, %r1"
1943 [(set_attr "type" "X01")])
1944
1945 (define_insn "*addsi_truncdisi"
1946 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1947 (plus:SI
1948 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO"))
1949 (match_operand:SI 2 "add_operand" "r,I,JT")))]
1950 ""
1951 "@
1952 addx\t%0, %r1, %r2
1953 addxi\t%0, %r1, %2
1954 addxli\t%0, %r1, %H2"
1955 [(set_attr "type" "*,*,X01")])
1956
1957 (define_insn "*addsi_truncdisi2"
1958 [(set (match_operand:SI 0 "register_operand" "=r")
1959 (plus:SI
1960 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1961 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1962 ""
1963 "addx\t%0, %r1, %r2")
1964
1965 (define_insn "*ashldi_truncdisi"
1966 [(set (match_operand:DI 0 "register_operand" "=r")
1967 (ashift:DI
1968 (match_operand:DI 1 "reg_or_0_operand" "rO")
1969 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1970 ""
1971 "shl\t%0, %r1, %r2")
1972
1973 (define_insn "*ashlsi_truncdisi"
1974 [(set (match_operand:SI 0 "register_operand" "=r,r")
1975 (ashift:SI
1976 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
1977 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
1978 ""
1979 "@
1980 shlxi\t%0, %r1, %2
1981 shlx\t%0, %r1, %r2"
1982 [(set_attr "type" "X01,X01")])
1983
1984 (define_insn "*ashlsi_truncdisi2"
1985 [(set (match_operand:SI 0 "register_operand" "=r")
1986 (ashift:SI
1987 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
1988 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
1989 ""
1990 "shlx\t%0, %r1, %r2"
1991 [(set_attr "type" "X01")])
1992
1993 (define_insn "*ashrdi3_truncdisi"
1994 [(set (match_operand:DI 0 "register_operand" "=r")
1995 (ashiftrt:DI
1996 (match_operand:DI 1 "reg_or_0_operand" "rO")
1997 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
1998 ""
1999 "shrs\t%0, %r1, %r2")
2000
2001 (define_insn "*lshrsi_truncdisi"
2002 [(set (match_operand:SI 0 "register_operand" "=r,r")
2003 (lshiftrt:SI
2004 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO,rO"))
2005 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
2006 ""
2007 "@
2008 shruxi\t%0, %r1, %2
2009 shrux\t%0, %r1, %r2"
2010 [(set_attr "type" "X01,X01")])
2011
2012 (define_insn "*lshrsi_truncdisi2"
2013 [(set (match_operand:SI 0 "register_operand" "=r")
2014 (lshiftrt:SI
2015 (truncate:SI (match_operand:DI 1 "reg_or_0_operand" "rO"))
2016 (truncate:SI (match_operand:DI 2 "reg_or_0_operand" "rO"))))]
2017 ""
2018 "shrux\t%0, %r1, %r2"
2019 [(set_attr "type" "X01")])
2020
2021 (define_insn "*lshrdi_truncdisi"
2022 [(set (match_operand:DI 0 "register_operand" "=r")
2023 (lshiftrt:DI
2024 (match_operand:DI 1 "reg_or_0_operand" "rO")
2025 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2026 ""
2027 "shru\t%0, %r1, %r2")
2028
2029 (define_insn "*rotldi_truncdisi"
2030 [(set (match_operand:DI 0 "register_operand" "=r")
2031 (rotate:DI
2032 (match_operand:DI 1 "reg_or_0_operand" "rO")
2033 (truncate:SI (match_operand:DI 2 "reg_or_u6bit_operand" "rO"))))]
2034 ""
2035 "rotl\t%0, %r1, %r2")
2036
2037 \f
2038 ;;
2039 ;; Multiplies
2040 ;;
2041
2042 (define_insn "mulsi3"
2043 [(set (match_operand:SI 0 "register_operand" "=r")
2044 (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rO")
2045 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
2046 ""
2047 "mulx\t%0, %r1, %r2"
2048 [(set_attr "type" "Y0_2cycle")])
2049
2050 (define_insn "mulsidi3"
2051 [(set (match_operand:DI 0 "register_operand" "=r")
2052 (mult:DI (sign_extend:DI
2053 (match_operand:SI 1 "reg_or_0_operand" "%rO"))
2054 (sign_extend:DI
2055 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2056 ""
2057 "mul_ls_ls\t%0, %r1, %r2"
2058 [(set_attr "type" "Y0_2cycle")])
2059
2060 (define_insn "umulsidi3"
2061 [(set (match_operand:DI 0 "register_operand" "=r")
2062 (mult:DI (zero_extend:DI
2063 (match_operand:SI 1 "reg_or_0_operand" "%rO"))
2064 (zero_extend:DI
2065 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2066 ""
2067 "mul_lu_lu\t%0, %r1, %r2"
2068 [(set_attr "type" "Y0_2cycle")])
2069
2070 (define_expand "muldi3"
2071 [(set (match_operand:DI 0 "register_operand" "")
2072 (unspec:DI [(match_operand:DI 1 "nonmemory_operand" "")
2073 (match_operand:DI 2 "nonmemory_operand" "")]
2074 UNSPEC_INSN_MUL_HU_LU))
2075 (set (match_dup 0)
2076 (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2077 UNSPEC_INSN_MULA_HU_LU))
2078 (set (match_dup 0)
2079 (ashift:DI (match_dup 0) (const_int 32)))
2080 (set (match_dup 0)
2081 (unspec:DI [(match_dup 0) (match_dup 2) (match_dup 1)]
2082 UNSPEC_INSN_MULA_LU_LU))]
2083 ""
2084 {
2085 operands[1] = force_reg (DImode, operands[1]);
2086 operands[1] = make_safe_from (operands[1], operands[0]);
2087
2088 if (tilegx_expand_muldi (operands[0], operands[1], operands[2]))
2089 DONE;
2090 else
2091 {
2092 operands[2] = force_reg (DImode, operands[2]);
2093 operands[2] = make_safe_from (operands[2], operands[0]);
2094 }
2095 })
2096
2097 (define_insn "usmulsidi3"
2098 [(set (match_operand:DI 0 "register_operand" "=r")
2099 (mult:DI (zero_extend:DI
2100 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2101 (sign_extend:DI
2102 (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
2103 ""
2104 "mul_ls_lu\t%0, %r2, %r1"
2105 [(set_attr "type" "X0_2cycle")])
2106
2107 (define_insn "maddsidi4"
2108 [(set (match_operand:DI 0 "register_operand" "=r")
2109 (plus:DI
2110 (mult:DI (sign_extend:DI
2111 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2112 (sign_extend:DI
2113 (match_operand:SI 2 "reg_or_0_operand" "rO")))
2114 (match_operand:DI 3 "register_operand" "0")))]
2115 ""
2116 "mula_ls_ls\t%0, %r1, %r2"
2117 [(set_attr "type" "Y0_2cycle")])
2118
2119 (define_insn "umaddsidi4"
2120 [(set (match_operand:DI 0 "register_operand" "=r")
2121 (plus:DI
2122 (mult:DI (zero_extend:DI
2123 (match_operand:SI 1 "reg_or_0_operand" "rO"))
2124 (zero_extend:DI
2125 (match_operand:SI 2 "reg_or_0_operand" "rO")))
2126 (match_operand:DI 3 "register_operand" "0")))]
2127 ""
2128 "mula_lu_lu\t%0, %r1, %r2"
2129 [(set_attr "type" "Y0_2cycle")])
2130
2131 (define_expand "smulsi3_highpart"
2132 [(set (match_dup 3)
2133 (mult:DI (sign_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
2134 (sign_extend:DI (match_operand:SI 2 "reg_or_0_operand" ""))))
2135 (set (match_dup 4)
2136 (ashiftrt:DI (match_dup 3) (const_int 32)))
2137 (set (match_operand:SI 0 "register_operand" "")
2138 (truncate:SI (match_dup 4)))]
2139 ""
2140 {
2141 operands[3] = gen_reg_rtx (DImode);
2142 operands[4] = gen_reg_rtx (DImode);
2143 })
2144
2145 (define_expand "umulsi3_highpart"
2146 [(set (match_dup 3)
2147 (mult:DI (zero_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
2148 (zero_extend:DI (match_operand:SI 2 "reg_or_0_operand" ""))))
2149 (set (match_dup 4)
2150 (lshiftrt:DI (match_dup 3) (const_int 32)))
2151 (set (match_operand:SI 0 "register_operand" "")
2152 (truncate:SI (match_dup 4)))]
2153 ""
2154 {
2155 operands[3] = gen_reg_rtx (DImode);
2156 operands[4] = gen_reg_rtx (DImode);
2157 })
2158
2159 (define_expand "smuldi3_highpart"
2160 [(set (match_operand:DI 0 "register_operand" "")
2161 (truncate:DI
2162 (ashiftrt:TI
2163 (mult:TI (sign_extend:TI (match_operand:DI 1 "reg_or_0_operand" ""))
2164 (sign_extend:TI (match_operand:DI 2 "reg_or_0_operand" "")))
2165 (const_int 64))))]
2166 ""
2167 {
2168 tilegx_expand_smuldi3_highpart (operands[0], operands[1], operands[2]);
2169 DONE;
2170 })
2171
2172 (define_expand "umuldi3_highpart"
2173 [(set (match_operand:DI 0 "register_operand" "")
2174 (truncate:DI
2175 (lshiftrt:TI
2176 (mult:TI (zero_extend:TI (match_operand:DI 1 "reg_or_0_operand" ""))
2177 (zero_extend:TI (match_operand:DI 2 "reg_or_0_operand" "")))
2178 (const_int 64))))]
2179 ""
2180 {
2181 tilegx_expand_umuldi3_highpart (operands[0], operands[1], operands[2]);
2182 DONE;
2183 })
2184
2185 \f
2186 ;;
2187 ;; Divide stubs. These exist to work around a bug in expmed.c, which
2188 ;; will not attempt to convert a divide by constant into a multiply
2189 ;; unless there is a pattern for a divide of the same mode. The end
2190 ;; result is a 32-bit divide turns into 64-bit multiply.
2191 ;;
2192
2193 (define_expand "divsi3"
2194 [(set (match_operand:SI 0 "register_operand" "")
2195 (div:SI (match_operand:SI 1 "reg_or_0_operand" "")
2196 (match_operand:SI 2 "reg_or_0_operand" "")))]
2197 ""
2198 {
2199 FAIL;
2200 })
2201
2202 (define_expand "udivsi3"
2203 [(set (match_operand:SI 0 "register_operand" "")
2204 (udiv:SI (match_operand:SI 1 "reg_or_0_operand" "")
2205 (match_operand:SI 2 "reg_or_0_operand" "")))]
2206 ""
2207 {
2208 FAIL;
2209 })
2210
2211 \f
2212 ;;
2213 ;; Loops
2214 ;;
2215
2216 ;; Define the subtract-one-and-jump insns so loop.c knows what to generate.
2217 (define_expand "doloop_end"
2218 [(use (match_operand 0 "" "")) ;; loop pseudo
2219 (use (match_operand 1 "" "")) ;; iterations; zero if unknown
2220 (use (match_operand 2 "" "")) ;; max iterations
2221 (use (match_operand 3 "" "")) ;; loop level
2222 (use (match_operand 4 "" ""))] ;; label
2223 ""
2224 {
2225 if (optimize > 0 && flag_modulo_sched)
2226 {
2227 rtx s0;
2228 rtx bcomp;
2229 rtx loc_ref;
2230 enum machine_mode mode = GET_MODE (operands[0]);
2231
2232 /* only do inner loop */
2233 if (INTVAL (operands[3]) > 1)
2234 FAIL;
2235 /* only deal with loop counters in SImode or DImode */
2236 if (mode != SImode && mode != DImode)
2237 FAIL;
2238
2239 s0 = operands [0];
2240 emit_move_insn (s0, gen_rtx_PLUS (mode, s0, GEN_INT (-1)));
2241 bcomp = gen_rtx_NE(mode, s0, const0_rtx);
2242 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [4]);
2243 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
2244 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
2245 loc_ref, pc_rtx)));
2246 DONE;
2247 }
2248 else
2249 FAIL;
2250
2251 })
2252
2253 ;;
2254 ;; Prologue/epilogue
2255 ;;
2256 (define_expand "prologue"
2257 [(const_int 0)]
2258 ""
2259 {
2260 tilegx_expand_prologue ();
2261 DONE;
2262 })
2263
2264 (define_expand "epilogue"
2265 [(const_int 0)]
2266 ""
2267 {
2268 tilegx_expand_epilogue (false);
2269 DONE;
2270 })
2271
2272 (define_expand "sibcall_epilogue"
2273 [(const_int 0)]
2274 ""
2275 {
2276 tilegx_expand_epilogue (true);
2277 DONE;
2278 })
2279
2280 ;;
2281 ;; Stack manipulations
2282 ;;
2283
2284 ;; An insn to allocate new stack space for dynamic use (e.g., alloca).
2285 (define_expand "allocate_stack"
2286 [(set (match_operand 0 "register_operand" "")
2287 (minus (reg 54) (match_operand 1 "nonmemory_operand" "")))
2288 (set (reg 54)
2289 (minus (reg 54) (match_dup 1)))]
2290 ""
2291 "tilegx_allocate_stack (operands[0], operands[1]); DONE;")
2292
2293 ;;
2294 ;; Branches
2295 ;;
2296
2297 (define_expand "call"
2298 [(parallel [(call (match_operand:DI 0 "call_operand" "")
2299 (match_operand 1 "" ""))
2300 (use (reg:DI 54))
2301 (clobber (reg:DI 55))])]
2302 ""
2303 "")
2304
2305 (define_insn "*call_insn"
2306 [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2307 (match_operand 1 "" ""))
2308 (use (reg:DI 54))
2309 (clobber (reg:DI 55))]
2310 ""
2311 "@
2312 jalr\t%r0
2313 jal\t%p0"
2314 [(set_attr "type" "Y1,X1")])
2315
2316 (define_expand "call_value"
2317 [(parallel [(set (match_operand 0 "register_operand" "")
2318 (call (match_operand:DI 1 "call_operand" "")
2319 (match_operand 2 "" "")))
2320 (use (reg:DI 54))
2321 (clobber (reg:DI 55))])]
2322 "")
2323
2324 (define_insn "*call_value_insn"
2325 [(set (match_operand 0 "register_operand" "=r,r")
2326 (call (mem:DI (match_operand:I48MODE 1 "call_address_operand" "rO,i"))
2327 (match_operand 2 "" "")))
2328 (use (reg:DI 54))
2329 (clobber (reg:DI 55))]
2330 ""
2331 "@
2332 jalr\t%r1
2333 jal\t%p1"
2334 [(set_attr "type" "Y1,X1")])
2335
2336 (define_expand "sibcall"
2337 [(parallel [(call (match_operand:DI 0 "call_operand" "")
2338 (match_operand 1 "" ""))
2339 (use (reg:DI 54))])]
2340 ""
2341 "")
2342
2343 (define_insn "*sibcall_insn"
2344 [(call (mem:DI (match_operand:I48MODE 0 "call_address_operand" "rO,i"))
2345 (match_operand 1 "" ""))
2346 (use (reg:DI 54))]
2347 "SIBLING_CALL_P(insn)"
2348 "@
2349 jr\t%r0
2350 j\t%p0"
2351 [(set_attr "type" "X1,X1")])
2352
2353 (define_expand "sibcall_value"
2354 [(parallel [(set (match_operand 0 "" "")
2355 (call (match_operand:DI 1 "call_operand" "")
2356 (match_operand 2 "" "")))
2357 (use (reg:DI 54))])]
2358 ""
2359 "")
2360
2361 (define_insn "*sibcall_value"
2362 [(set (match_operand 0 "" "")
2363 (call (mem:DI (match_operand:I48MODE 1 "call_address_operand" "rO,i"))
2364 (match_operand 2 "" "")))
2365 (use (reg:DI 54))]
2366 "SIBLING_CALL_P(insn)"
2367 "@
2368 jr\t%r1
2369 j\t%p1"
2370 [(set_attr "type" "X1,X1")])
2371
2372 (define_insn "jump"
2373 [(set (pc) (label_ref (match_operand 0 "" "")))]
2374 ""
2375 "j\t%l0"
2376 [(set_attr "type" "X1")])
2377
2378 (define_insn "indirect_jump"
2379 [(set (pc) (match_operand 0 "pointer_operand" "rO"))]
2380 ""
2381 "jr\t%r0"
2382 [(set_attr "type" "Y1")])
2383
2384 (define_expand "return"
2385 [(parallel
2386 [(return)
2387 (use (reg:DI 55))])]
2388 "tilegx_can_use_return_insn_p ()"
2389 "")
2390
2391 (define_insn "_return"
2392 [(return)
2393 (use (reg:DI 55))]
2394 "reload_completed"
2395 "jrp\tlr"
2396 [(set_attr "type" "Y1")])
2397
2398 (define_expand "tablejump"
2399 [(set (pc) (match_operand 0 "pointer_operand" ""))
2400 (use (label_ref (match_operand 1 "" "")))]
2401 ""
2402 {
2403 tilegx_expand_tablejump (operands[0], operands[1]);
2404 DONE;
2405 })
2406
2407 (define_insn "tablejump_aux"
2408 [(set (pc) (match_operand 0 "pointer_operand" "rO"))
2409 (use (label_ref (match_operand 1 "" "")))]
2410 ""
2411 "jr\t%r0"
2412 [(set_attr "type" "Y1")])
2413
2414 ;; Call subroutine returning any type.
2415 (define_expand "untyped_call"
2416 [(parallel [(call (match_operand 0 "" "")
2417 (const_int 0))
2418 (match_operand 1 "" "")
2419 (match_operand 2 "" "")])]
2420 ""
2421 {
2422 int i;
2423
2424 emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
2425
2426 for (i = 0; i < XVECLEN (operands[2], 0); i++)
2427 {
2428 rtx set = XVECEXP (operands[2], 0, i);
2429 emit_move_insn (SET_DEST (set), SET_SRC (set));
2430 }
2431
2432 /* The optimizer does not know that the call sets the function value
2433 registers we stored in the result block. We avoid problems by
2434 claiming that all hard registers are used and clobbered at this
2435 point. */
2436 emit_insn (gen_blockage ());
2437
2438 DONE;
2439 })
2440
2441 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers
2442 ;; and all of memory. This blocks insns from being moved across this
2443 ;; point.
2444 (define_insn "blockage"
2445 [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
2446 ""
2447 "pseudo"
2448 [(set_attr "type" "nothing")
2449 (set_attr "length" "0")])
2450
2451 ;; Internal expanders to prevent memory ops from moving around frame
2452 ;; allocation/deallocation.
2453 ;;
2454 ;; TODO: really this clobber should just clobber the frame memory. Is
2455 ;; this possibly by clobbering memory @ the sp reg (as alpha does?)
2456 ;; or by explicitly setting the alias set to the frame?
2457 (define_insn "sp_adjust"
2458 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
2459 (plus:DI
2460 (match_operand:DI 1 "register_operand" "%r,r,r")
2461 (match_operand:DI 2 "add_operand" "r,I,JT")))
2462 (clobber (mem:BLK (scratch)))]
2463 ""
2464 "@
2465 add\t%0, %1, %2
2466 addi\t%0, %1, %2
2467 addli\t%0, %1, %H2"
2468 [(set_attr "type" "*,*,X01")])
2469
2470 (define_insn "sp_adjust_32bit"
2471 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
2472 (plus:SI
2473 (match_operand:SI 1 "register_operand" "%r,r,r")
2474 (match_operand:SI 2 "add_operand" "r,I,JT")))
2475 (clobber (mem:BLK (scratch)))]
2476 ""
2477 "@
2478 addx\t%0, %1, %2
2479 addxi\t%0, %1, %2
2480 addxli\t%0, %1, %H2"
2481 [(set_attr "type" "*,*,X01")])
2482
2483 ;; Used for move sp, r52, to pop a stack frame. We need to make sure
2484 ;; that stack frame memory operations have been issued before we do this.
2485 ;; TODO: see above TODO.
2486 (define_insn "sp_restore<bitsuffix>"
2487 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2488 (match_operand:I48MODE 1 "register_operand" "r"))
2489 (clobber (mem:BLK (scratch)))]
2490 ""
2491 "move\t%0, %1")
2492
2493 (define_insn "nop"
2494 [(const_int 0)]
2495 ""
2496 "nop"
2497 [(set_attr "type" "Y01")])
2498
2499 \f
2500 ;;
2501 ;; Conditional branches
2502 ;;
2503
2504 (define_expand "cbranch<mode>4"
2505 [(set (pc)
2506 (if_then_else (match_operator 0 "ordered_comparison_operator"
2507 [(match_operand:FI48MODE 1 "reg_or_cint_operand")
2508 (match_operand:FI48MODE 2 "reg_or_cint_operand")])
2509 (label_ref (match_operand 3 ""))
2510 (pc)))]
2511 ""
2512 {
2513 tilegx_emit_conditional_branch (operands, GET_MODE (operands[1]));
2514 DONE;
2515 })
2516
2517 (define_insn "*bcc_normal<mode>"
2518 [(set (pc)
2519 (if_then_else
2520 (match_operator 1 "signed_comparison_operator"
2521 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2522 (const_int 0)])
2523 (label_ref (match_operand 0 "" ""))
2524 (pc)))]
2525 ""
2526 { return tilegx_output_cbranch (insn, operands, false); }
2527 [(set_attr "type" "X1_branch")])
2528
2529 (define_insn "*bcc_reverse<mode>"
2530 [(set (pc)
2531 (if_then_else
2532 (match_operator 1 "signed_comparison_operator"
2533 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2534 (const_int 0)])
2535 (pc)
2536 (label_ref (match_operand 0 "" ""))))]
2537 ""
2538 { return tilegx_output_cbranch (insn, operands, true); }
2539 [(set_attr "type" "X1_branch")])
2540
2541 (define_insn "*blbs_normal<mode>"
2542 [(set (pc)
2543 (if_then_else
2544 (ne (zero_extract:I48MODE
2545 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2546 (const_int 1)
2547 (const_int 0))
2548 (const_int 0))
2549 (label_ref (match_operand 0 "" ""))
2550 (pc)))]
2551 ""
2552 { return tilegx_output_cbranch_with_opcode (insn, operands, "blbs", "blbc",
2553 1); }
2554 [(set_attr "type" "X1_branch")])
2555
2556 (define_insn "*blbc_normal<mode>"
2557 [(set (pc)
2558 (if_then_else
2559 (eq (zero_extract:I48MODE
2560 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
2561 (const_int 1)
2562 (const_int 0))
2563 (const_int 0))
2564 (label_ref (match_operand 0 "" ""))
2565 (pc)))]
2566 ""
2567 { return tilegx_output_cbranch_with_opcode (insn, operands, "blbc", "blbs",
2568 1); }
2569 [(set_attr "type" "X1_branch")])
2570
2571 ;; Note that __insn_mf() expands to this.
2572 (define_expand "memory_barrier"
2573 [(set (match_dup 0)
2574 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2575 ""
2576 {
2577 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
2578 MEM_VOLATILE_P (operands[0]) = 1;
2579 })
2580
2581 (define_insn "*memory_barrier"
2582 [(set (match_operand:BLK 0 "" "")
2583 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
2584 ""
2585 "mf"
2586 [(set_attr "type" "X1")])
2587
2588 (define_insn "prefetch"
2589 [(prefetch (match_operand 0 "address_operand" "rO")
2590 (match_operand 1 "const_int_operand" "")
2591 (match_operand 2 "const_int_operand" ""))]
2592 ""
2593 {
2594 switch (INTVAL (operands[2]))
2595 {
2596 case 0:
2597 case 1: return "prefetch_l3\t%r0";
2598 case 2: return "prefetch_l2\t%r0";
2599 case 3: return "prefetch_l1\t%r0";
2600 default: gcc_unreachable ();
2601 }
2602 }
2603 [(set_attr "type" "Y2")])
2604
2605 \f
2606 ;;
2607 ;; "__insn" Intrinsics (some expand directly to normal patterns above).
2608 ;;
2609
2610 (define_insn "insn_bfexts"
2611 [(set (match_operand:DI 0 "register_operand" "=r")
2612 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2613 (match_operand:DI 2 "u6bit_cint_operand" "n")
2614 (match_operand:DI 3 "u6bit_cint_operand" "n")]
2615 UNSPEC_INSN_BFEXTS))]
2616 ""
2617 "bfexts\t%0, %r1, %2, %3"
2618 [(set_attr "type" "X0")])
2619
2620 (define_insn "insn_bfextu"
2621 [(set (match_operand:DI 0 "register_operand" "=r")
2622 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2623 (match_operand:DI 2 "u6bit_cint_operand" "n")
2624 (match_operand:DI 3 "u6bit_cint_operand" "n")]
2625 UNSPEC_INSN_BFEXTU))]
2626 ""
2627 "bfextu\t%0, %r1, %2, %3"
2628 [(set_attr "type" "X0")])
2629
2630 (define_insn "*bfins"
2631 [(set (match_operand:DI 0 "register_operand" "=r")
2632 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2633 (match_operand:DI 2 "reg_or_0_operand" "rO")
2634 (match_operand:DI 3 "u6bit_cint_operand" "n")
2635 (match_operand:DI 4 "u6bit_cint_operand" "n")]
2636 UNSPEC_INSN_BFINS))]
2637 ""
2638 "bfins\t%0, %r2, %3, %4"
2639 [(set_attr "type" "X0")])
2640
2641 (define_expand "insn_bfins"
2642 [(set (match_operand:DI 0 "register_operand" "")
2643 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "")
2644 (match_operand:DI 2 "reg_or_0_operand" "")
2645 (match_operand:DI 3 "u6bit_cint_operand" "")
2646 (match_operand:DI 4 "u6bit_cint_operand" "")]
2647 UNSPEC_INSN_BFINS))]
2648 "INTVAL (operands[3]) != 64"
2649 {
2650 HOST_WIDE_INT first = INTVAL (operands[3]);
2651 HOST_WIDE_INT last = INTVAL (operands[4]);
2652
2653 if (last >= first)
2654 {
2655 /* This is not a wacky wraparound case, so we can express this
2656 as a standard insv. */
2657 if (operands[0] != operands[1])
2658 {
2659 operands[2] = make_safe_from (operands[2], operands[0]);
2660 emit_move_insn (operands[0], operands[1]);
2661 }
2662
2663 emit_insn (gen_insv (operands[0],
2664 GEN_INT (last - first + 1), operands[3],
2665 operands[2]));
2666
2667 DONE;
2668 }
2669 })
2670
2671 (define_insn "insn_cmpexch<four_if_si>"
2672 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2673 (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))
2674 (set (mem:I48MODE (match_dup 1))
2675 (unspec_volatile:I48MODE
2676 [(mem:I48MODE (match_dup 1))
2677 (reg:I48MODE TILEGX_CMPEXCH_REG)
2678 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")]
2679 UNSPEC_INSN_CMPEXCH))]
2680 ""
2681 "cmpexch<four_if_si>\t%0, %r1, %r2"
2682 [(set_attr "type" "X1_L2")])
2683
2684 (define_insn "insn_cmul"
2685 [(set (match_operand:DI 0 "register_operand" "=r")
2686 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2687 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2688 UNSPEC_INSN_CMUL))]
2689 ""
2690 "cmul\t%0, %r1, %r2"
2691 [(set_attr "type" "X0_2cycle")])
2692
2693 (define_insn "insn_cmula"
2694 [(set (match_operand:DI 0 "register_operand" "=r")
2695 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2696 (match_operand:DI 2 "reg_or_0_operand" "rO")
2697 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2698 UNSPEC_INSN_CMULA))]
2699 ""
2700 "cmula\t%0, %r2, %r3"
2701 [(set_attr "type" "X0_2cycle")])
2702
2703 (define_insn "insn_cmulaf"
2704 [(set (match_operand:DI 0 "register_operand" "=r")
2705 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2706 (match_operand:DI 2 "reg_or_0_operand" "rO")
2707 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2708 UNSPEC_INSN_CMULAF))]
2709 ""
2710 "cmulaf\t%0, %r2, %r3"
2711 [(set_attr "type" "X0_2cycle")])
2712
2713 (define_insn "insn_cmulf"
2714 [(set (match_operand:DI 0 "register_operand" "=r")
2715 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2716 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2717 UNSPEC_INSN_CMULF))]
2718 ""
2719 "cmulf\t%0, %r1, %r2"
2720 [(set_attr "type" "X0_2cycle")])
2721
2722 (define_insn "insn_cmulfr"
2723 [(set (match_operand:DI 0 "register_operand" "=r")
2724 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2725 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2726 UNSPEC_INSN_CMULFR))]
2727 ""
2728 "cmulfr\t%0, %r1, %r2"
2729 [(set_attr "type" "X0_2cycle")])
2730
2731 (define_insn "insn_cmulh"
2732 [(set (match_operand:DI 0 "register_operand" "=r")
2733 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2734 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2735 UNSPEC_INSN_CMULH))]
2736 ""
2737 "cmulh\t%0, %r1, %r2"
2738 [(set_attr "type" "X0_2cycle")])
2739
2740 (define_insn "insn_cmulhr"
2741 [(set (match_operand:DI 0 "register_operand" "=r")
2742 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2743 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2744 UNSPEC_INSN_CMULHR))]
2745 ""
2746 "cmulhr\t%0, %r1, %r2"
2747 [(set_attr "type" "X0_2cycle")])
2748
2749 (define_insn "insn_crc32_32"
2750 [(set (match_operand:DI 0 "register_operand" "=r")
2751 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2752 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2753 UNSPEC_INSN_CRC32_32))]
2754 ""
2755 "crc32_32\t%0, %r1, %r2"
2756 [(set_attr "type" "X0")])
2757
2758 (define_insn "insn_crc32_8"
2759 [(set (match_operand:DI 0 "register_operand" "=r")
2760 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2761 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2762 UNSPEC_INSN_CRC32_8))]
2763 ""
2764 "crc32_8\t%0, %r1, %r2"
2765 [(set_attr "type" "X0")])
2766
2767 (define_insn "insn_dblalign"
2768 [(set (match_operand:DI 0 "register_operand" "=r")
2769 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2770 (match_operand:DI 2 "reg_or_0_operand" "rO")
2771 (match_operand 3 "pointer_operand" "rO")]
2772 UNSPEC_INSN_DBLALIGN))]
2773 ""
2774 "dblalign\t%0, %r2, %r3"
2775 [(set_attr "type" "X0")])
2776
2777 (define_insn "insn_dblalign2"
2778 [(set (match_operand:DI 0 "register_operand" "=r")
2779 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2780 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2781 UNSPEC_INSN_DBLALIGN2))]
2782 ""
2783 "dblalign2\t%0, %r1, %r2"
2784 [(set_attr "type" "X01")])
2785
2786 (define_insn "insn_dblalign4"
2787 [(set (match_operand:DI 0 "register_operand" "=r")
2788 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2789 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2790 UNSPEC_INSN_DBLALIGN4))]
2791 ""
2792 "dblalign4\t%0, %r1, %r2"
2793 [(set_attr "type" "X01")])
2794
2795 (define_insn "insn_dblalign6"
2796 [(set (match_operand:DI 0 "register_operand" "=r")
2797 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2798 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2799 UNSPEC_INSN_DBLALIGN6))]
2800 ""
2801 "dblalign6\t%0, %r1, %r2"
2802 [(set_attr "type" "X01")])
2803
2804 (define_insn "insn_dtlbpr"
2805 [(unspec_volatile:VOID [(match_operand:DI 0 "reg_or_0_operand" "rO")]
2806 UNSPEC_INSN_DTLBPR)]
2807 ""
2808 "dtlbpr\t%r0"
2809 [(set_attr "type" "X1")])
2810
2811 (define_insn "insn_exch<four_if_si>"
2812 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2813 (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))
2814 (set (mem:I48MODE (match_dup 1))
2815 (unspec_volatile:I48MODE
2816 [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")]
2817 UNSPEC_INSN_EXCH))]
2818 ""
2819 "exch<four_if_si>\t%0, %r1, %r2"
2820 [(set_attr "type" "X1_2cycle")])
2821
2822 (define_insn "insn_fdouble_add_flags"
2823 [(set (match_operand:DI 0 "register_operand" "=r")
2824 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2825 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2826 UNSPEC_INSN_FDOUBLE_ADD_FLAGS))]
2827 ""
2828 "fdouble_add_flags\t%0, %r1, %r2"
2829 [(set_attr "type" "X0_2cycle")])
2830
2831 (define_insn "insn_fdouble_addsub"
2832 [(set (match_operand:DI 0 "register_operand" "=r")
2833 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2834 (match_operand:DI 2 "reg_or_0_operand" "rO")
2835 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2836 UNSPEC_INSN_FDOUBLE_ADDSUB))]
2837 ""
2838 "fdouble_addsub\t%0, %r2, %r3"
2839 [(set_attr "type" "X0_2cycle")])
2840
2841 (define_insn "insn_fdouble_mul_flags"
2842 [(set (match_operand:DI 0 "register_operand" "=r")
2843 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2844 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2845 UNSPEC_INSN_FDOUBLE_MUL_FLAGS))]
2846 ""
2847 "fdouble_mul_flags\t%0, %r1, %r2"
2848 [(set_attr "type" "X0_2cycle")])
2849
2850 (define_insn "insn_fdouble_pack1"
2851 [(set (match_operand:DI 0 "register_operand" "=r")
2852 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2853 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2854 UNSPEC_INSN_FDOUBLE_PACK1))]
2855 ""
2856 "fdouble_pack1\t%0, %r1, %r2"
2857 [(set_attr "type" "X0_2cycle")])
2858
2859 (define_insn "insn_fdouble_pack2"
2860 [(set (match_operand:DI 0 "register_operand" "=r")
2861 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2862 (match_operand:DI 2 "reg_or_0_operand" "rO")
2863 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2864 UNSPEC_INSN_FDOUBLE_PACK2))]
2865 ""
2866 "fdouble_pack2\t%0, %r2, %r3"
2867 [(set_attr "type" "X0_2cycle")])
2868
2869 (define_insn "insn_fdouble_sub_flags"
2870 [(set (match_operand:DI 0 "register_operand" "=r")
2871 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2872 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2873 UNSPEC_INSN_FDOUBLE_SUB_FLAGS))]
2874 ""
2875 "fdouble_sub_flags\t%0, %r1, %r2"
2876 [(set_attr "type" "X0_2cycle")])
2877
2878 (define_insn "insn_fdouble_unpack_max"
2879 [(set (match_operand:DI 0 "register_operand" "=r")
2880 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2881 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2882 UNSPEC_INSN_FDOUBLE_UNPACK_MAX))]
2883 ""
2884 "fdouble_unpack_max\t%0, %r1, %r2"
2885 [(set_attr "type" "X0_2cycle")])
2886
2887 (define_insn "insn_fdouble_unpack_min"
2888 [(set (match_operand:DI 0 "register_operand" "=r")
2889 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2890 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2891 UNSPEC_INSN_FDOUBLE_UNPACK_MIN))]
2892 ""
2893 "fdouble_unpack_min\t%0, %r1, %r2"
2894 [(set_attr "type" "X0_2cycle")])
2895
2896 (define_insn "insn_fetchadd<four_if_si>"
2897 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2898 (unspec_volatile:I48MODE
2899 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2900 UNSPEC_ATOMIC))
2901 (set (mem:I48MODE (match_dup 1))
2902 (plus:I48MODE (mem:I48MODE (match_dup 1))
2903 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2904 ""
2905 "fetchadd<four_if_si>\t%0, %r1, %r2"
2906 [(set_attr "type" "X1_2cycle")])
2907
2908 (define_insn "insn_fetchaddgez<four_if_si>"
2909 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2910 (unspec_volatile:I48MODE
2911 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2912 UNSPEC_ATOMIC))
2913 (set (mem:I48MODE (match_dup 1))
2914 (unspec:I48MODE [(match_operand:I48MODE 2 "reg_or_0_operand" "rO")
2915 (mem:I48MODE (match_dup 1))]
2916 UNSPEC_INSN_FETCHADDGEZ))]
2917 ""
2918 "fetchaddgez<four_if_si>\t%0, %r1, %r2"
2919 [(set_attr "type" "X1_2cycle")])
2920
2921 (define_insn "insn_fetchand<four_if_si>"
2922 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2923 (unspec_volatile:I48MODE
2924 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2925 UNSPEC_ATOMIC))
2926 (set (mem:I48MODE (match_dup 1))
2927 (and:I48MODE (mem:I48MODE (match_dup 1))
2928 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2929 ""
2930 "fetchand<four_if_si>\t%0, %r1, %r2"
2931 [(set_attr "type" "X1_2cycle")])
2932
2933 (define_insn "insn_fetchor<four_if_si>"
2934 [(set (match_operand:I48MODE 0 "register_operand" "=r")
2935 (unspec_volatile:I48MODE
2936 [(mem:I48MODE (match_operand 1 "pointer_operand" "rO"))]
2937 UNSPEC_ATOMIC))
2938 (set (mem:I48MODE (match_dup 1))
2939 (ior:I48MODE (mem:I48MODE (match_dup 1))
2940 (match_operand:I48MODE 2 "reg_or_0_operand" "rO")))]
2941 ""
2942 "fetchor<four_if_si>\t%0, %r1, %r2"
2943 [(set_attr "type" "X1_2cycle")])
2944
2945 (define_insn "insn_finv"
2946 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2947 UNSPEC_INSN_FINV)]
2948 ""
2949 "finv\t%r0"
2950 [(set_attr "type" "X1")])
2951
2952 (define_insn "insn_flush"
2953 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
2954 UNSPEC_INSN_FLUSH)]
2955 ""
2956 "flush\t%r0"
2957 [(set_attr "type" "X1")])
2958
2959 (define_insn "insn_flushwb"
2960 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FLUSHWB)]
2961 ""
2962 "flushwb"
2963 [(set_attr "type" "X1")])
2964
2965 (define_insn "insn_fnop"
2966 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FNOP)]
2967 ""
2968 "fnop")
2969
2970 (define_insn "insn_fsingle_add1"
2971 [(set (match_operand:DI 0 "register_operand" "=r")
2972 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2973 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2974 UNSPEC_INSN_FSINGLE_ADD1))]
2975 ""
2976 "fsingle_add1\t%0, %r1, %r2"
2977 [(set_attr "type" "X0")])
2978
2979 (define_insn "insn_fsingle_addsub2"
2980 [(set (match_operand:DI 0 "register_operand" "=r")
2981 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
2982 (match_operand:DI 2 "reg_or_0_operand" "rO")
2983 (match_operand:DI 3 "reg_or_0_operand" "rO")]
2984 UNSPEC_INSN_FSINGLE_ADDSUB2))]
2985 ""
2986 "fsingle_addsub2\t%0, %r2, %r3"
2987 [(set_attr "type" "X0_2cycle")])
2988
2989 (define_insn "insn_fsingle_mul1"
2990 [(set (match_operand:DI 0 "register_operand" "=r")
2991 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
2992 (match_operand:DI 2 "reg_or_0_operand" "rO")]
2993 UNSPEC_INSN_FSINGLE_MUL1))]
2994 ""
2995 "fsingle_mul1\t%0, %r1, %r2"
2996 [(set_attr "type" "X0")])
2997
2998 (define_insn "insn_fsingle_mul2"
2999 [(set (match_operand:DI 0 "register_operand" "=r")
3000 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3001 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3002 UNSPEC_INSN_FSINGLE_MUL2))]
3003 ""
3004 "fsingle_mul2\t%0, %r1, %r2"
3005 [(set_attr "type" "X0_2cycle")])
3006
3007 (define_insn "insn_fsingle_pack1"
3008 [(set (match_operand:DI 0 "register_operand" "=r")
3009 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")]
3010 UNSPEC_INSN_FSINGLE_PACK1))]
3011 ""
3012 "fsingle_pack1\t%0, %r1"
3013 [(set_attr "type" "Y0_2cycle")])
3014
3015 (define_insn "insn_fsingle_pack2"
3016 [(set (match_operand:DI 0 "register_operand" "=r")
3017 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3018 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3019 UNSPEC_INSN_FSINGLE_PACK2))]
3020 ""
3021 "fsingle_pack2\t%0, %r1, %r2"
3022 [(set_attr "type" "X0_2cycle")])
3023
3024 (define_insn "insn_fsingle_sub1"
3025 [(set (match_operand:DI 0 "register_operand" "=r")
3026 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3027 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3028 UNSPEC_INSN_FSINGLE_SUB1))]
3029 ""
3030 "fsingle_sub1\t%0, %r1, %r2"
3031 [(set_attr "type" "X0")])
3032
3033 (define_insn "insn_drain"
3034 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_DRAIN)]
3035 ""
3036 "drain"
3037 [(set_attr "type" "cannot_bundle")])
3038
3039 (define_insn "insn_icoh"
3040 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3041 UNSPEC_INSN_ICOH)]
3042 ""
3043 "icoh\t%r0"
3044 [(set_attr "type" "X1")])
3045
3046 (define_insn "insn_ill"
3047 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_ILL)]
3048 ""
3049 "ill"
3050 [(set_attr "type" "cannot_bundle")])
3051
3052 (define_insn "insn_info"
3053 [(unspec_volatile:VOID [(match_operand:DI 0 "s8bit_cint_operand" "i")]
3054 UNSPEC_INSN_INFO)]
3055 ""
3056 "info\t%0")
3057
3058 (define_insn "insn_infol"
3059 [(unspec_volatile:VOID [(match_operand:DI 0 "s16bit_cint_operand" "i")]
3060 UNSPEC_INSN_INFOL)]
3061 ""
3062 "infol\t%0"
3063 [(set_attr "type" "X01")])
3064
3065 (define_insn "insn_inv"
3066 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3067 UNSPEC_INSN_INV)]
3068 ""
3069 "inv\t%r0"
3070 [(set_attr "type" "X1")])
3071
3072 ;; loads
3073
3074 (define_expand "insn_ld"
3075 [(set (match_operand:DI 0 "register_operand" "")
3076 (mem:DI (match_operand 1 "pointer_operand" "")))]
3077 "")
3078
3079 (define_insn "insn_ld_add<bitsuffix>"
3080 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3081 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3082 (match_operand 2 "s8bit_cint_operand" "i")))
3083 (set (match_operand:DI 0 "register_operand" "=r")
3084 (mem:DI (match_dup 3)))]
3085 ""
3086 "ld_add\t%0, %1, %2"
3087 [(set_attr "type" "X1_2cycle")])
3088
3089 (define_insn "insn_ldna"
3090 [(set (match_operand:DI 0 "register_operand" "=r")
3091 (mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3092 (const_int -8))))]
3093 ""
3094 "ldna\t%0, %r1"
3095 [(set_attr "type" "X1_2cycle")])
3096
3097 (define_insn "insn_ldna_add<bitsuffix>"
3098 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3099 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3100 (match_operand 2 "s8bit_cint_operand" "i")))
3101 (set (match_operand:DI 0 "register_operand" "=r")
3102 (mem:DI (and:DI (match_dup 3) (const_int -8))))]
3103 ""
3104 "ldna_add\t%0, %1, %2"
3105 [(set_attr "type" "X1_2cycle")])
3106
3107 (define_expand "insn_ld<n><s>"
3108 [(set (match_operand:DI 0 "register_operand" "")
3109 (any_extend:DI
3110 (mem:I124MODE (match_operand 1 "pointer_operand" ""))))]
3111 "")
3112
3113 (define_insn "insn_ld<I124MODE:n><s>_add<I48MODE:bitsuffix>"
3114 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3115 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3116 (match_operand 2 "s8bit_cint_operand" "i")))
3117 (set (match_operand:DI 0 "register_operand" "=r")
3118 (any_extend:DI (mem:I124MODE (match_dup 3))))]
3119 ""
3120 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3121 [(set_attr "type" "X1_2cycle")])
3122
3123 ;; non temporal loads
3124
3125 (define_insn "insn_ldnt"
3126 [(set (match_operand:DI 0 "register_operand" "=r")
3127 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3128 UNSPEC_NON_TEMPORAL))]
3129 ""
3130 "ldnt\t%0, %r1"
3131 [(set_attr "type" "X1_2cycle")])
3132
3133 (define_insn "insn_ldnt_add<bitsuffix>"
3134 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3135 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3136 (match_operand 2 "s8bit_cint_operand" "i")))
3137 (set (match_operand:DI 0 "register_operand" "=r")
3138 (unspec:DI [(mem:DI (match_dup 3))]
3139 UNSPEC_NON_TEMPORAL))]
3140 ""
3141 "ldnt_add\t%0, %1, %2"
3142 [(set_attr "type" "X1_2cycle")])
3143
3144 (define_insn "insn_ldnt<n><s>"
3145 [(set (match_operand:DI 0 "register_operand" "=r")
3146 (any_extend:DI
3147 (unspec:I124MODE
3148 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3149 UNSPEC_NON_TEMPORAL)))]
3150 ""
3151 "ldnt<n><s>\t%0, %r1"
3152 [(set_attr "type" "X1_2cycle")])
3153
3154 (define_insn "insn_ldnt<I124MODE:n><s>_add<I48MODE:bitsuffix>"
3155 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3156 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3157 (match_operand 2 "s8bit_cint_operand" "i")))
3158 (set (match_operand:DI 0 "register_operand" "=r")
3159 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3160 UNSPEC_NON_TEMPORAL)))]
3161 ""
3162 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3163 [(set_attr "type" "X1_2cycle")])
3164
3165 ;; L2 hits
3166
3167 (define_insn "insn_ld_L2"
3168 [(set (match_operand:DI 0 "register_operand" "=r")
3169 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3170 UNSPEC_LATENCY_L2))]
3171 ""
3172 "ld\t%0, %r1"
3173 [(set_attr "type" "Y2_L2")])
3174
3175 (define_insn "insn_ld_add_L2<bitsuffix>"
3176 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3177 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3178 (match_operand 2 "s8bit_cint_operand" "i")))
3179 (set (match_operand:DI 0 "register_operand" "=r")
3180 (unspec:DI [(mem:DI (match_dup 3))]
3181 UNSPEC_LATENCY_L2))]
3182 ""
3183 "ld_add\t%0, %1, %2"
3184 [(set_attr "type" "X1_L2")])
3185
3186 (define_insn "insn_ldna_L2"
3187 [(set (match_operand:DI 0 "register_operand" "=r")
3188 (unspec:DI [(mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3189 (const_int -8)))]
3190 UNSPEC_LATENCY_L2))]
3191 ""
3192 "ldna\t%0, %r1"
3193 [(set_attr "type" "X1_L2")])
3194
3195 (define_insn "insn_ldna_add_L2<bitsuffix>"
3196 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3197 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3198 (match_operand 2 "s8bit_cint_operand" "i")))
3199 (set (match_operand:DI 0 "register_operand" "=r")
3200 (unspec:DI [(mem:DI (and:DI (match_dup 3) (const_int -8)))]
3201 UNSPEC_LATENCY_L2))]
3202 ""
3203 "ldna_add\t%0, %1, %2"
3204 [(set_attr "type" "X1_L2")])
3205
3206 (define_insn "insn_ld<n><s>_L2"
3207 [(set (match_operand:DI 0 "register_operand" "=r")
3208 (any_extend:DI
3209 (unspec:I124MODE
3210 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3211 UNSPEC_LATENCY_L2)))]
3212 ""
3213 "ld<n><s>\t%0, %r1"
3214 [(set_attr "type" "Y2_L2")])
3215
3216 (define_insn "insn_ld<I124MODE:n><s>_add_L2<I48MODE:bitsuffix>"
3217 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3218 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3219 (match_operand 2 "s8bit_cint_operand" "i")))
3220 (set (match_operand:DI 0 "register_operand" "=r")
3221 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3222 UNSPEC_LATENCY_L2)))]
3223 ""
3224 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3225 [(set_attr "type" "X1_L2")])
3226
3227 ;; L2 hits, non temporal loads
3228
3229 (define_insn "insn_ldnt_L2"
3230 [(set (match_operand:DI 0 "register_operand" "=r")
3231 (unspec:DI [(unspec:DI
3232 [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3233 UNSPEC_NON_TEMPORAL)]
3234 UNSPEC_LATENCY_L2))]
3235 ""
3236 "ldnt\t%0, %r1"
3237 [(set_attr "type" "X1_L2")])
3238
3239 (define_insn "insn_ldnt_add_L2<bitsuffix>"
3240 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3241 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3242 (match_operand 2 "s8bit_cint_operand" "i")))
3243 (set (match_operand:DI 0 "register_operand" "=r")
3244 (unspec:DI [(unspec:DI
3245 [(mem:DI (match_dup 3))]
3246 UNSPEC_NON_TEMPORAL)]
3247 UNSPEC_LATENCY_L2))]
3248 ""
3249 "ldnt_add\t%0, %1, %2"
3250 [(set_attr "type" "X1_L2")])
3251
3252 (define_insn "insn_ldnt<n><s>_L2"
3253 [(set (match_operand:DI 0 "register_operand" "=r")
3254 (any_extend:DI
3255 (unspec:I124MODE
3256 [(unspec:I124MODE
3257 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3258 UNSPEC_NON_TEMPORAL)]
3259 UNSPEC_LATENCY_L2)))]
3260 ""
3261 "ldnt<n><s>\t%0, %r1"
3262 [(set_attr "type" "X1_L2")])
3263
3264 (define_insn "insn_ldnt<I124MODE:n><s>_add_L2<I48MODE:bitsuffix>"
3265 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3266 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3267 (match_operand 2 "s8bit_cint_operand" "i")))
3268 (set (match_operand:DI 0 "register_operand" "=r")
3269 (any_extend:DI
3270 (unspec:I124MODE [(unspec:I124MODE
3271 [(mem:I124MODE (match_dup 3))]
3272 UNSPEC_NON_TEMPORAL)]
3273 UNSPEC_LATENCY_L2)))]
3274 ""
3275 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3276 [(set_attr "type" "X1_L2")])
3277
3278 ;; L2 miss
3279
3280 (define_insn "insn_ld_miss"
3281 [(set (match_operand:DI 0 "register_operand" "=r")
3282 (unspec:DI [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3283 UNSPEC_LATENCY_MISS))]
3284 ""
3285 "ld\t%0, %r1"
3286 [(set_attr "type" "Y2_miss")])
3287
3288 (define_insn "insn_ld_add_miss<bitsuffix>"
3289 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3290 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3291 (match_operand 2 "s8bit_cint_operand" "i")))
3292 (set (match_operand:DI 0 "register_operand" "=r")
3293 (unspec:DI [(mem:DI (match_dup 3))]
3294 UNSPEC_LATENCY_MISS))]
3295 ""
3296 "ld_add\t%0, %1, %2"
3297 [(set_attr "type" "X1_miss")])
3298
3299 (define_insn "insn_ldna_miss"
3300 [(set (match_operand:DI 0 "register_operand" "=r")
3301 (unspec:DI [(mem:DI (and:DI (match_operand 1 "pointer_operand" "rO")
3302 (const_int -8)))]
3303 UNSPEC_LATENCY_MISS))]
3304 ""
3305 "ldna\t%0, %r1"
3306 [(set_attr "type" "X1_miss")])
3307
3308 (define_insn "insn_ldna_add_miss<bitsuffix>"
3309 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3310 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3311 (match_operand 2 "s8bit_cint_operand" "i")))
3312 (set (match_operand:DI 0 "register_operand" "=r")
3313 (unspec:DI [(mem:DI (and:DI (match_dup 3) (const_int -8)))]
3314 UNSPEC_LATENCY_MISS))]
3315 ""
3316 "ldna_add\t%0, %1, %2"
3317 [(set_attr "type" "X1_miss")])
3318
3319 (define_insn "insn_ld<n><s>_miss"
3320 [(set (match_operand:DI 0 "register_operand" "=r")
3321 (any_extend:DI
3322 (unspec:I124MODE
3323 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3324 UNSPEC_LATENCY_MISS)))]
3325 ""
3326 "ld<n><s>\t%0, %r1"
3327 [(set_attr "type" "Y2_miss")])
3328
3329 (define_insn "insn_ld<I124MODE:n><s>_add_miss<I48MODE:bitsuffix>"
3330 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3331 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3332 (match_operand 2 "s8bit_cint_operand" "i")))
3333 (set (match_operand:DI 0 "register_operand" "=r")
3334 (any_extend:DI (unspec:I124MODE [(mem:I124MODE (match_dup 3))]
3335 UNSPEC_LATENCY_MISS)))]
3336 ""
3337 "ld<I124MODE:n><s>_add\t%0, %1, %2"
3338 [(set_attr "type" "X1_miss")])
3339
3340 ;; L2 miss, non temporal loads
3341
3342 (define_insn "insn_ldnt_miss"
3343 [(set (match_operand:DI 0 "register_operand" "=r")
3344 (unspec:DI [(unspec:DI
3345 [(mem:DI (match_operand 1 "pointer_operand" "rO"))]
3346 UNSPEC_NON_TEMPORAL)]
3347 UNSPEC_LATENCY_MISS))]
3348 ""
3349 "ldnt\t%0, %r1"
3350 [(set_attr "type" "X1_miss")])
3351
3352 (define_insn "insn_ldnt_add_miss<bitsuffix>"
3353 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3354 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3355 (match_operand 2 "s8bit_cint_operand" "i")))
3356 (set (match_operand:DI 0 "register_operand" "=r")
3357 (unspec:DI [(unspec:DI
3358 [(mem:DI (match_dup 3))]
3359 UNSPEC_NON_TEMPORAL)]
3360 UNSPEC_LATENCY_MISS))]
3361 ""
3362 "ldnt_add\t%0, %1, %2"
3363 [(set_attr "type" "X1_miss")])
3364
3365 (define_insn "insn_ldnt<n><s>_miss"
3366 [(set (match_operand:DI 0 "register_operand" "=r")
3367 (any_extend:DI
3368 (unspec:I124MODE
3369 [(unspec:I124MODE
3370 [(mem:I124MODE (match_operand 1 "pointer_operand" "rO"))]
3371 UNSPEC_NON_TEMPORAL)]
3372 UNSPEC_LATENCY_MISS)))]
3373 ""
3374 "ldnt<n><s>\t%0, %r1"
3375 [(set_attr "type" "X1_miss")])
3376
3377 (define_insn "insn_ldnt<I124MODE:n><s>_add_miss<I48MODE:bitsuffix>"
3378 [(set (match_operand:I48MODE 1 "pointer_operand" "=r")
3379 (plus:I48MODE (match_operand 3 "pointer_operand" "1")
3380 (match_operand 2 "s8bit_cint_operand" "i")))
3381 (set (match_operand:DI 0 "register_operand" "=r")
3382 (any_extend:DI
3383 (unspec:I124MODE [(unspec:I124MODE
3384 [(mem:I124MODE (match_dup 3))]
3385 UNSPEC_NON_TEMPORAL)]
3386 UNSPEC_LATENCY_MISS)))]
3387 ""
3388 "ldnt<I124MODE:n><s>_add\t%0, %1, %2"
3389 [(set_attr "type" "X1_miss")])
3390
3391 ;; end loads
3392
3393 (define_insn "insn_lnk"
3394 [(set (match_operand:DI 0 "register_operand" "=r")
3395 (unspec:DI [(const_int 0)] UNSPEC_INSN_LNK))]
3396 ""
3397 "lnk\t%0"
3398 [(set_attr "type" "Y1")])
3399
3400 (define_insn "insn_mfspr"
3401 [(set (match_operand:DI 0 "register_operand" "=r")
3402 (unspec_volatile:DI [(match_operand:DI 1 "u14bit_cint_operand" "i")]
3403 UNSPEC_INSN_MFSPR))
3404 (clobber (mem:BLK (const_int 0)))]
3405 ""
3406 "mfspr\t%0, %1"
3407 [(set_attr "type" "X1")])
3408
3409 (define_insn "insn_mtspr"
3410 [(unspec_volatile:DI [(match_operand:DI 0 "u14bit_cint_operand" "i")
3411 (match_operand:DI 1 "reg_or_0_operand" "rO")]
3412 UNSPEC_INSN_MTSPR)
3413 (clobber (mem:BLK (const_int 0)))]
3414 ""
3415 "mtspr\t%0, %r1"
3416 [(set_attr "type" "X1")])
3417
3418 (define_insn "insn_mm"
3419 [(set (match_operand:DI 0 "register_operand" "=r")
3420 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3421 (match_operand:DI 2 "reg_or_0_operand" "rO")
3422 (match_operand:DI 3 "u6bit_cint_operand" "i")
3423 (match_operand:DI 4 "u6bit_cint_operand" "i")]
3424 UNSPEC_INSN_MM))]
3425 ""
3426 "mm\t%0, %r2, %3, %4"
3427 [(set_attr "type" "X0")])
3428
3429 (define_insn "insn_mul_hs_hs"
3430 [(set (match_operand:DI 0 "register_operand" "=r")
3431 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3432 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3433 UNSPEC_INSN_MUL_HS_HS))]
3434 ""
3435 "mul_hs_hs\t%0, %r1, %r2"
3436 [(set_attr "type" "Y0_2cycle")])
3437
3438 (define_insn "insn_mul_hs_hu"
3439 [(set (match_operand:DI 0 "register_operand" "=r")
3440 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3441 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3442 UNSPEC_INSN_MUL_HS_HU))]
3443 ""
3444 "mul_hs_hu\t%0, %r1, %r2"
3445 [(set_attr "type" "X0_2cycle")])
3446
3447 (define_insn "insn_mul_hs_ls"
3448 [(set (match_operand:DI 0 "register_operand" "=r")
3449 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3450 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3451 UNSPEC_INSN_MUL_HS_LS))]
3452 ""
3453 "mul_hs_ls\t%0, %r1, %r2"
3454 [(set_attr "type" "X0_2cycle")])
3455
3456 (define_insn "insn_mul_hs_lu"
3457 [(set (match_operand:DI 0 "register_operand" "=r")
3458 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3459 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3460 UNSPEC_INSN_MUL_HS_LU))]
3461 ""
3462 "mul_hs_lu\t%0, %r1, %r2"
3463 [(set_attr "type" "X0_2cycle")])
3464
3465 (define_insn "insn_mul_hu_hu"
3466 [(set (match_operand:DI 0 "register_operand" "=r")
3467 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3468 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3469 UNSPEC_INSN_MUL_HU_HU))]
3470 ""
3471 "mul_hu_hu\t%0, %r1, %r2"
3472 [(set_attr "type" "Y0_2cycle")])
3473
3474 (define_insn "insn_mul_hu_ls"
3475 [(set (match_operand:DI 0 "register_operand" "=r")
3476 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3477 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3478 UNSPEC_INSN_MUL_HU_LS))]
3479 ""
3480 "mul_hu_ls\t%0, %r1, %r2"
3481 [(set_attr "type" "X0_2cycle")])
3482
3483 (define_insn "insn_mul_hu_lu"
3484 [(set (match_operand:DI 0 "register_operand" "=r")
3485 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3486 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3487 UNSPEC_INSN_MUL_HU_LU))]
3488 ""
3489 "mul_hu_lu\t%0, %r1, %r2"
3490 [(set_attr "type" "X0_2cycle")])
3491
3492 (define_insn "insn_mul_ls_ls"
3493 [(set (match_operand:DI 0 "register_operand" "=r")
3494 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3495 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3496 UNSPEC_INSN_MUL_LS_LS))]
3497 ""
3498 "mul_ls_ls\t%0, %r1, %r2"
3499 [(set_attr "type" "Y0_2cycle")])
3500
3501 (define_insn "insn_mul_ls_lu"
3502 [(set (match_operand:DI 0 "register_operand" "=r")
3503 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3504 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3505 UNSPEC_INSN_MUL_LS_LU))]
3506 ""
3507 "mul_ls_lu\t%0, %r1, %r2"
3508 [(set_attr "type" "X0_2cycle")])
3509
3510 (define_insn "insn_mul_lu_lu"
3511 [(set (match_operand:DI 0 "register_operand" "=r")
3512 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
3513 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3514 UNSPEC_INSN_MUL_LU_LU))]
3515 ""
3516 "mul_lu_lu\t%0, %r1, %r2"
3517 [(set_attr "type" "Y0_2cycle")])
3518
3519 (define_insn "insn_mula_hs_hs"
3520 [(set (match_operand:DI 0 "register_operand" "=r")
3521 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3522 (match_operand:DI 2 "reg_or_0_operand" "rO")
3523 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3524 UNSPEC_INSN_MULA_HS_HS))]
3525 ""
3526 "mula_hs_hs\t%0, %r2, %r3"
3527 [(set_attr "type" "Y0_2cycle")])
3528
3529 (define_insn "insn_mula_hs_hu"
3530 [(set (match_operand:DI 0 "register_operand" "=r")
3531 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3532 (match_operand:DI 2 "reg_or_0_operand" "rO")
3533 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3534 UNSPEC_INSN_MULA_HS_HU))]
3535 ""
3536 "mula_hs_hu\t%0, %r2, %r3"
3537 [(set_attr "type" "X0_2cycle")])
3538
3539 (define_insn "insn_mula_hs_ls"
3540 [(set (match_operand:DI 0 "register_operand" "=r")
3541 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3542 (match_operand:DI 2 "reg_or_0_operand" "rO")
3543 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3544 UNSPEC_INSN_MULA_HS_LS))]
3545 ""
3546 "mula_hs_ls\t%0, %r2, %r3"
3547 [(set_attr "type" "X0_2cycle")])
3548
3549 (define_insn "insn_mula_hs_lu"
3550 [(set (match_operand:DI 0 "register_operand" "=r")
3551 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3552 (match_operand:DI 2 "reg_or_0_operand" "rO")
3553 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3554 UNSPEC_INSN_MULA_HS_LU))]
3555 ""
3556 "mula_hs_lu\t%0, %r2, %r3"
3557 [(set_attr "type" "X0_2cycle")])
3558
3559 (define_insn "insn_mula_hu_hu"
3560 [(set (match_operand:DI 0 "register_operand" "=r")
3561 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3562 (match_operand:DI 2 "reg_or_0_operand" "rO")
3563 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3564 UNSPEC_INSN_MULA_HU_HU))]
3565 ""
3566 "mula_hu_hu\t%0, %r2, %r3"
3567 [(set_attr "type" "Y0_2cycle")])
3568
3569 (define_insn "insn_mula_hu_ls"
3570 [(set (match_operand:DI 0 "register_operand" "=r")
3571 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3572 (match_operand:DI 2 "reg_or_0_operand" "rO")
3573 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3574 UNSPEC_INSN_MULA_HU_LS))]
3575 ""
3576 "mula_hu_ls\t%0, %r2, %r3"
3577 [(set_attr "type" "X0_2cycle")])
3578
3579 (define_insn "insn_mula_hu_lu"
3580 [(set (match_operand:DI 0 "register_operand" "=r")
3581 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3582 (match_operand:DI 2 "reg_or_0_operand" "rO")
3583 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3584 UNSPEC_INSN_MULA_HU_LU))]
3585 ""
3586 "mula_hu_lu\t%0, %r2, %r3"
3587 [(set_attr "type" "X0_2cycle")])
3588
3589 (define_insn "insn_mula_ls_ls"
3590 [(set (match_operand:DI 0 "register_operand" "=r")
3591 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3592 (match_operand:DI 2 "reg_or_0_operand" "rO")
3593 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3594 UNSPEC_INSN_MULA_LS_LS))]
3595 ""
3596 "mula_ls_ls\t%0, %r2, %r3"
3597 [(set_attr "type" "Y0_2cycle")])
3598
3599 (define_insn "insn_mula_ls_lu"
3600 [(set (match_operand:DI 0 "register_operand" "=r")
3601 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3602 (match_operand:DI 2 "reg_or_0_operand" "rO")
3603 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3604 UNSPEC_INSN_MULA_LS_LU))]
3605 ""
3606 "mula_ls_lu\t%0, %r2, %r3"
3607 [(set_attr "type" "X0_2cycle")])
3608
3609 (define_insn "insn_mula_lu_lu"
3610 [(set (match_operand:DI 0 "register_operand" "=r")
3611 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3612 (match_operand:DI 2 "reg_or_0_operand" "rO")
3613 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3614 UNSPEC_INSN_MULA_LU_LU))]
3615 ""
3616 "mula_lu_lu\t%0, %r2, %r3"
3617 [(set_attr "type" "Y0_2cycle")])
3618
3619 (define_insn "insn_mulax"
3620 [(set (match_operand:SI 0 "register_operand" "=r")
3621 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3622 (match_operand:SI 2 "reg_or_0_operand" "rO")
3623 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3624 UNSPEC_INSN_MULAX))]
3625 ""
3626 "mulax\t%0, %r2, %r3"
3627 [(set_attr "type" "Y0_2cycle")])
3628
3629 (define_insn "insn_nap"
3630 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_NAP)]
3631 ""
3632 "nap"
3633 [(set_attr "type" "cannot_bundle")])
3634
3635 (define_insn "insn_nor_<mode>"
3636 [(set (match_operand:I48MODE 0 "register_operand" "=r")
3637 (and:I48MODE
3638 (not:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rO"))
3639 (not:I48MODE (match_operand:I48MODE 2 "reg_or_0_operand" "rO"))))]
3640 ""
3641 "nor\t%0, %r1, %r2")
3642
3643 (define_expand "insn_prefetch_l1"
3644 [(prefetch (match_operand 0 "pointer_operand" "")
3645 (const_int 0)
3646 (const_int 3))]
3647 "")
3648
3649 (define_expand "insn_prefetch_l2"
3650 [(prefetch (match_operand 0 "pointer_operand" "")
3651 (const_int 0)
3652 (const_int 2))]
3653 "")
3654
3655 (define_expand "insn_prefetch_l3"
3656 [(prefetch (match_operand 0 "pointer_operand" "")
3657 (const_int 0)
3658 (const_int 1))]
3659 "")
3660
3661 (define_insn "insn_prefetch_l1_fault"
3662 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3663 UNSPEC_INSN_PREFETCH_L1_FAULT)]
3664 ""
3665 "prefetch_l1_fault\t%r0"
3666 [(set_attr "type" "Y2")])
3667
3668 (define_insn "insn_prefetch_l2_fault"
3669 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3670 UNSPEC_INSN_PREFETCH_L2_FAULT)]
3671 ""
3672 "prefetch_l2_fault\t%r0"
3673 [(set_attr "type" "Y2")])
3674
3675 (define_insn "insn_prefetch_l3_fault"
3676 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
3677 UNSPEC_INSN_PREFETCH_L3_FAULT)]
3678 ""
3679 "prefetch_l3_fault\t%r0"
3680 [(set_attr "type" "Y2")])
3681
3682 (define_insn "insn_revbits"
3683 [(set (match_operand:DI 0 "register_operand" "=r")
3684 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")]
3685 UNSPEC_INSN_REVBITS))]
3686 ""
3687 "revbits\t%0, %r1"
3688 [(set_attr "type" "Y0")])
3689
3690 (define_insn "insn_shl1add"
3691 [(set (match_operand:DI 0 "register_operand" "=r")
3692 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3693 (const_int 2))
3694 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3695 ""
3696 "shl1add\t%0, %r1, %r2")
3697
3698 (define_insn "insn_shl1addx"
3699 [(set (match_operand:SI 0 "register_operand" "=r")
3700 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3701 (const_int 2))
3702 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3703 ""
3704 "shl1addx\t%0, %r1, %r2")
3705
3706 (define_insn "insn_shl2add"
3707 [(set (match_operand:DI 0 "register_operand" "=r")
3708 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3709 (const_int 4))
3710 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3711 ""
3712 "shl2add\t%0, %r1, %r2")
3713
3714 (define_insn "insn_shl2addx"
3715 [(set (match_operand:SI 0 "register_operand" "=r")
3716 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3717 (const_int 4))
3718 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3719 ""
3720 "shl2addx\t%0, %r1, %r2")
3721
3722 (define_insn "insn_shl3add"
3723 [(set (match_operand:DI 0 "register_operand" "=r")
3724 (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rO")
3725 (const_int 8))
3726 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
3727 ""
3728 "shl3add\t%0, %r1, %r2")
3729
3730 (define_insn "insn_shl3addx"
3731 [(set (match_operand:SI 0 "register_operand" "=r")
3732 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
3733 (const_int 8))
3734 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
3735 ""
3736 "shl3addx\t%0, %r1, %r2")
3737
3738 (define_insn "insn_shufflebytes"
3739 [(set (match_operand:DI 0 "register_operand" "=r")
3740 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3741 (match_operand:DI 2 "reg_or_0_operand" "rO")
3742 (match_operand:DI 3 "reg_or_0_operand" "rO")]
3743 UNSPEC_INSN_SHUFFLEBYTES))]
3744 ""
3745 "shufflebytes\t%0, %r2, %r3"
3746 [(set_attr "type" "X0")])
3747
3748 ;; stores
3749
3750 (define_expand "insn_st"
3751 [(set (mem:DI (match_operand 0 "pointer_operand" ""))
3752 (match_operand:DI 1 "reg_or_0_operand" ""))]
3753 "")
3754
3755 (define_insn "insn_st_add<bitsuffix>"
3756 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3757 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3758 (match_operand 2 "s8bit_cint_operand" "i")))
3759 (set (mem:DI (match_dup 3))
3760 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3761 ""
3762 "st_add\t%0, %r1, %2"
3763 [(set_attr "type" "X1")])
3764
3765 (define_expand "insn_st<n>"
3766 [(set (mem:I124MODE (match_operand 0 "pointer_operand" ""))
3767 (match_operand:DI 1 "reg_or_0_operand" ""))]
3768 ""
3769 {
3770 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3771 })
3772
3773 (define_expand "insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3774 [(parallel
3775 [(set (match_operand:I48MODE 0 "pointer_operand" "")
3776 (plus:I48MODE (match_operand 3 "pointer_operand" "")
3777 (match_operand 2 "s8bit_cint_operand" "")))
3778 (set (mem:I124MODE (match_dup 3))
3779 (match_operand:DI 1 "reg_or_0_operand" ""))])]
3780 ""
3781 {
3782 operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3783 DImode, 0);
3784 })
3785
3786 (define_insn "*insn_st<I124MODE:n>_add<I48MODE:bitsuffix>"
3787 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3788 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3789 (match_operand 2 "s8bit_cint_operand" "i")))
3790 (set (mem:I124MODE (match_dup 3))
3791 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3792 ""
3793 "st<I124MODE:n>_add\t%0, %r1, %2"
3794 [(set_attr "type" "X1")])
3795
3796 ;; non-temporal stores
3797
3798 (define_insn "insn_stnt"
3799 [(set (mem:DI (unspec [(match_operand 0 "pointer_operand" "rO")]
3800 UNSPEC_NON_TEMPORAL))
3801 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3802 ""
3803 "stnt\t%0, %r1"
3804 [(set_attr "type" "X1")])
3805
3806 (define_insn "insn_stnt_add<bitsuffix>"
3807 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3808 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3809 (match_operand 2 "s8bit_cint_operand" "i")))
3810 (set (mem:DI (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3811 (match_operand:DI 1 "reg_or_0_operand" "rO"))]
3812 ""
3813 "stnt_add\t%0, %r1, %2"
3814 [(set_attr "type" "X1")])
3815
3816 (define_expand "insn_stnt<n>"
3817 [(set (mem:I124MODE (unspec [(match_operand 0 "pointer_operand" "")]
3818 UNSPEC_NON_TEMPORAL))
3819 (match_operand:DI 1 "reg_or_0_operand" ""))]
3820 ""
3821 {
3822 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], DImode, 0);
3823 })
3824
3825 (define_insn "*insn_stnt<n>"
3826 [(set (mem:I124MODE (unspec [(match_operand 0 "pointer_operand" "rO")]
3827 UNSPEC_NON_TEMPORAL))
3828 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3829 ""
3830 "stnt<n>\t%0, %r1"
3831 [(set_attr "type" "X1")])
3832
3833 (define_expand "insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>"
3834 [(parallel
3835 [(set (match_operand:I48MODE 0 "pointer_operand" "")
3836 (plus:I48MODE (match_operand 3 "pointer_operand" "")
3837 (match_operand 2 "s8bit_cint_operand" "")))
3838 (set (mem:I124MODE (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3839 (match_operand:DI 1 "reg_or_0_operand" "rO"))])]
3840 ""
3841 {
3842 operands[1] = simplify_gen_subreg (<I124MODE:MODE>mode, operands[1],
3843 DImode, 0);
3844 })
3845
3846 (define_insn "*insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>"
3847 [(set (match_operand:I48MODE 0 "pointer_operand" "=r")
3848 (plus:I48MODE (match_operand 3 "pointer_operand" "0")
3849 (match_operand 2 "s8bit_cint_operand" "i")))
3850 (set (mem:I124MODE (unspec:I48MODE [(match_dup 3)] UNSPEC_NON_TEMPORAL))
3851 (match_operand:I124MODE 1 "reg_or_0_operand" "rO"))]
3852 ""
3853 "stnt<I124MODE:n>_add\t%0, %r1, %2"
3854 [(set_attr "type" "X1")])
3855
3856 ;; end stores
3857
3858 (define_insn "insn_tblidxb0"
3859 [(set (match_operand:DI 0 "register_operand" "=r")
3860 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3861 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3862 UNSPEC_INSN_TBLIDXB0))]
3863 ""
3864 "tblidxb0\t%0, %r2"
3865 [(set_attr "type" "Y0")])
3866
3867 (define_insn "insn_tblidxb1"
3868 [(set (match_operand:DI 0 "register_operand" "=r")
3869 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3870 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3871 UNSPEC_INSN_TBLIDXB1))]
3872 ""
3873 "tblidxb1\t%0, %r2"
3874 [(set_attr "type" "Y0")])
3875
3876 (define_insn "insn_tblidxb2"
3877 [(set (match_operand:DI 0 "register_operand" "=r")
3878 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3879 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3880 UNSPEC_INSN_TBLIDXB2))]
3881 ""
3882 "tblidxb2\t%0, %r2"
3883 [(set_attr "type" "Y0")])
3884
3885 (define_insn "insn_tblidxb3"
3886 [(set (match_operand:DI 0 "register_operand" "=r")
3887 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
3888 (match_operand:DI 2 "reg_or_0_operand" "rO")]
3889 UNSPEC_INSN_TBLIDXB3))]
3890 ""
3891 "tblidxb3\t%0, %r2"
3892 [(set_attr "type" "Y0")])
3893
3894 ;; insn_v1add
3895 ;; insn_v1addi
3896 ;; insn_v1cmpeq
3897 ;; insn_v1cmpeqi
3898 ;; insn_v1cmplts
3899 ;; insn_v1cmpltsi
3900 ;; insn_v1cmpltu
3901 ;; insn_v1cmpltui
3902 ;; insn_v1maxu
3903 ;; insn_v1maxui
3904 ;; insn_v1minu
3905 ;; insn_v1minui
3906 (define_insn "<optab>v8qi3"
3907 [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3908 (v1op_immed:V8QI
3909 (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO,rO")
3910 (match_operand:V8QI 2 "reg_or_v8s8bit_operand" "W,rO")))]
3911 ""
3912 "@
3913 v1<insn>i\t%0, %r1, %j2
3914 v1<insn>\t%0, %r1, %r2"
3915 [(set_attr "type" "<pipe>,<pipe>")])
3916
3917 (define_expand "insn_v1<insn>"
3918 [(set (match_operand:DI 0 "register_operand" "")
3919 (v1op_immed:V8QI
3920 (match_operand:DI 1 "reg_or_0_operand" "")
3921 (match_operand:DI 2 "reg_or_0_operand" "")))]
3922 ""
3923 {
3924 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3925 V8QImode, operands[1], operands[2], true);
3926 DONE;
3927 })
3928
3929 (define_expand "insn_v1<insn>i"
3930 [(set (match_operand:DI 0 "register_operand" "")
3931 (v1op_immed:V8QI
3932 (match_operand:DI 1 "reg_or_0_operand" "")
3933 (match_operand:DI 2 "s8bit_cint_operand" "")))]
3934 ""
3935 {
3936 /* Tile out immediate and expand to general case. */
3937 rtx n = tilegx_simd_int (operands[2], QImode);
3938 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3939 V8QImode, operands[1], n, true);
3940 DONE;
3941 })
3942
3943 ;; insn_v1shl
3944 ;; insn_v1shli
3945 ;; insn_v1shrs
3946 ;; insn_v1shrsi
3947 ;; insn_v1shru
3948 ;; insn_v1shrui
3949 (define_insn "<optab>v8qi3"
3950 [(set (match_operand:V8QI 0 "register_operand" "=r,r")
3951 (any_shift:V8QI
3952 (match_operand:V8QI 1 "reg_or_0_operand" "rO,rO")
3953 (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
3954 ""
3955 "@
3956 v1<insn>i\t%0, %r1, %2
3957 v1<insn>\t%0, %r1, %r2"
3958 [(set_attr "type" "<pipe>,<pipe>")])
3959
3960 (define_expand "insn_v1<insn>"
3961 [(set (match_operand:DI 0 "register_operand" "")
3962 (any_shift:V8QI
3963 (match_operand:DI 1 "reg_or_0_operand" "")
3964 (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
3965 ""
3966 {
3967 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
3968 V8QImode, operands[1], operands[2], false);
3969 DONE;
3970 })
3971
3972 ;; insn_v2add
3973 ;; insn_v2addi
3974 ;; insn_v2maxs
3975 ;; insn_v2maxsi
3976 ;; insn_v2mins
3977 ;; insn_v2minsi
3978 ;; insn_v2cmpeq
3979 ;; insn_v2cmpeqi
3980 ;; insn_v2cmplts
3981 ;; insn_v2cmpltsi
3982 ;; insn_v2cmpltu
3983 ;; insn_v2cmpltui
3984 (define_insn "<optab>v4hi3"
3985 [(set (match_operand:V4HI 0 "register_operand" "=r,r")
3986 (v2op_immed:V4HI
3987 (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO,rO")
3988 (match_operand:V4HI 2 "reg_or_v4s8bit_operand" "Y,rO")))]
3989 ""
3990 "@
3991 v2<insn>i\t%0, %r1, %j2
3992 v2<insn>\t%0, %r1, %r2"
3993 [(set_attr "type" "<pipe>,<pipe>")])
3994
3995 (define_expand "insn_v2<insn>"
3996 [(set (match_operand:DI 0 "register_operand" "")
3997 (v2op_immed:V4HI
3998 (match_operand:DI 1 "reg_or_0_operand" "")
3999 (match_operand:DI 2 "reg_or_0_operand" "")))]
4000 ""
4001 {
4002 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4003 V4HImode, operands[1], operands[2], true);
4004 DONE;
4005 })
4006
4007 (define_expand "insn_v2<insn>i"
4008 [(set (match_operand:DI 0 "register_operand" "")
4009 (v2op_immed:V4HI
4010 (match_operand:DI 1 "reg_or_0_operand" "")
4011 (match_operand:DI 2 "s8bit_cint_operand" "")))]
4012 ""
4013 {
4014 /* Tile out immediate and expand to general case. */
4015 rtx n = tilegx_simd_int (operands[2], HImode);
4016 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4017 V4HImode, operands[1], n, true);
4018 DONE;
4019 })
4020
4021 ;; insn_v2shl
4022 ;; insn_v2shli
4023 ;; insn_v2shrs
4024 ;; insn_v2shrsi
4025 ;; insn_v2shru
4026 ;; insn_v2shrui
4027 (define_insn "<optab>v4hi3"
4028 [(set (match_operand:V4HI 0 "register_operand" "=r,r")
4029 (any_shift:V4HI
4030 (match_operand:V4HI 1 "reg_or_0_operand" "rO,rO")
4031 (match_operand:DI 2 "reg_or_u5bit_operand" "I,rO")))]
4032 ""
4033 "@
4034 v2<insn>i\t%0, %r1, %2
4035 v2<insn>\t%0, %r1, %r2"
4036 [(set_attr "type" "<pipe>,<pipe>")])
4037
4038 (define_expand "insn_v2<insn>"
4039 [(set (match_operand:DI 0 "register_operand" "")
4040 (any_shift:V4HI
4041 (match_operand:DI 1 "reg_or_0_operand" "")
4042 (match_operand:DI 2 "reg_or_u5bit_operand" "")))]
4043 ""
4044 {
4045 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4046 V4HImode, operands[1], operands[2], false);
4047 DONE;
4048 })
4049
4050 ;; insn_v1adduc
4051 ;; insn_v1subuc
4052 ;; insn_v1sub
4053 ;; insn_v1cmpne
4054 ;; insn_v1cmples
4055 ;; insn_v1cmpleu
4056 ;; insn_v1multu
4057 (define_insn "<optab>v8qi3"
4058 [(set (match_operand:V8QI 0 "register_operand" "=r")
4059 (v1op:V8QI
4060 (match_operand:V8QI 1 "reg_or_0_operand" "<comm>rO")
4061 (match_operand:V8QI 2 "reg_or_0_operand" "rO")))]
4062 ""
4063 "v1<insn>\t%0, %r1, %r2"
4064 [(set_attr "type" "<pipe>")])
4065
4066 (define_expand "insn_v1<insn>"
4067 [(set (match_operand:DI 0 "register_operand" "")
4068 (v1op:V8QI
4069 (match_operand:DI 1 "reg_or_0_operand" "")
4070 (match_operand:DI 2 "reg_or_0_operand" "")))]
4071 ""
4072 {
4073 tilegx_expand_builtin_vector_binop (gen_<optab>v8qi3, V8QImode, operands[0],
4074 V8QImode, operands[1], operands[2], true);
4075 DONE;
4076 })
4077
4078 ;; insn_v2addsc
4079 ;; insn_v2subsc
4080 ;; insn_v2sub
4081 ;; insn_v2cmpne
4082 ;; insn_v2cmples
4083 ;; insn_v2cmpleu
4084 (define_insn "<optab>v4hi3"
4085 [(set (match_operand:V4HI 0 "register_operand" "=r")
4086 (v2op:V4HI
4087 (match_operand:V4HI 1 "reg_or_0_operand" "<comm>rO")
4088 (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4089 ""
4090 "v2<insn>\t%0, %r1, %r2"
4091 [(set_attr "type" "<pipe>")])
4092
4093 (define_expand "insn_v2<insn>"
4094 [(set (match_operand:DI 0 "register_operand" "")
4095 (v2op:V4HI
4096 (match_operand:DI 1 "reg_or_0_operand" "")
4097 (match_operand:DI 2 "reg_or_0_operand" "")))]
4098 ""
4099 {
4100 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4101 V4HImode, operands[1], operands[2], true);
4102 DONE;
4103 })
4104
4105 ;; insn_v2mults
4106 (define_insn "mulv4hi3"
4107 [(set (match_operand:V4HI 0 "register_operand" "=r")
4108 (mult:V4HI
4109 (match_operand:V4HI 1 "reg_or_0_operand" "%rO")
4110 (match_operand:V4HI 2 "reg_or_0_operand" "rO")))]
4111 ""
4112 "v2mults\t%0, %r1, %r2"
4113 [(set_attr "type" "X0_2cycle")])
4114
4115 (define_expand "insn_v2mults"
4116 [(set (match_operand:DI 0 "register_operand" "")
4117 (mult:V4HI
4118 (match_operand:DI 1 "reg_or_0_operand" "")
4119 (match_operand:DI 2 "reg_or_0_operand" "")))]
4120 ""
4121 {
4122 tilegx_expand_builtin_vector_binop (gen_mulv4hi3, V4HImode, operands[0],
4123 V4HImode, operands[1], operands[2], true);
4124 DONE;
4125 })
4126
4127 ;; insn_v2shlsc
4128 (define_insn "<optab>v4hi3"
4129 [(set (match_operand:V4HI 0 "register_operand" "=r")
4130 (v2shift:V4HI
4131 (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4132 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4133 ""
4134 "v2<insn>\t%0, %r1, %r2"
4135 [(set_attr "type" "<pipe>")])
4136
4137 (define_expand "insn_v2<insn>"
4138 [(set (match_operand:DI 0 "register_operand" "")
4139 (v2shift:V4HI
4140 (match_operand:DI 1 "reg_or_0_operand" "")
4141 (match_operand:DI 2 "reg_or_0_operand" "")))]
4142 ""
4143 {
4144 tilegx_expand_builtin_vector_binop (gen_<optab>v4hi3, V4HImode, operands[0],
4145 V4HImode, operands[1], operands[2], false);
4146 DONE;
4147 })
4148
4149 ;; insn_v4addsc
4150 ;; insn_v4subsc
4151 ;; insn_v4add
4152 ;; insn_v4sub
4153 (define_insn "<optab>v2si3"
4154 [(set (match_operand:V2SI 0 "register_operand" "=r")
4155 (v4op:V2SI
4156 (match_operand:V2SI 1 "reg_or_0_operand" "<comm>rO")
4157 (match_operand:V2SI 2 "reg_or_0_operand" "rO")))]
4158 ""
4159 "v4<insn>\t%0, %r1, %r2"
4160 [(set_attr "type" "<pipe>")])
4161
4162 (define_expand "insn_v4<insn>"
4163 [(set (match_operand:DI 0 "register_operand" "")
4164 (v4op:V2SI
4165 (match_operand:DI 1 "reg_or_0_operand" "")
4166 (match_operand:DI 2 "reg_or_0_operand" "")))]
4167 ""
4168 {
4169 tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4170 V2SImode, operands[1], operands[2], true);
4171 DONE;
4172 })
4173
4174 ;; insn_v4shl
4175 ;; insn_v4shrs
4176 ;; insn_v4shru
4177 ;; insn_v4shlsc
4178 (define_insn "<optab>v2si3"
4179 [(set (match_operand:V2SI 0 "register_operand" "=r")
4180 (v4shift:V2SI
4181 (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4182 (match_operand:DI 2 "reg_or_0_operand" "rO")))]
4183 ""
4184 "v4<insn>\t%0, %r1, %r2"
4185 [(set_attr "type" "<pipe>")])
4186
4187 (define_expand "insn_v4<insn>"
4188 [(set (match_operand:DI 0 "register_operand" "")
4189 (v4shift:V2SI
4190 (match_operand:DI 1 "reg_or_0_operand" "")
4191 (match_operand:DI 2 "reg_or_0_operand" "")))]
4192 ""
4193 {
4194 tilegx_expand_builtin_vector_binop (gen_<optab>v2si3, V2SImode, operands[0],
4195 V2SImode, operands[1], operands[2], false);
4196 DONE;
4197 })
4198
4199 ;; insn_v1int_h
4200 ;; {B7,B6,B5,B4,B3,B2,B1,B0} {A7,A6,A5,A4,A3,A2,A1,A0}
4201 ;; => {A7,A6,A5,A4,A3,A2,A1,A0,B7,B6,B5,B4,B3,B2,B1,B0}
4202 ;; => {A7,B7,A6,B6,A5,B5,A4,B4}
4203 (define_insn "vec_interleave_highv8qi"
4204 [(set (match_operand:V8QI 0 "register_operand" "=r")
4205 (vec_select:V8QI
4206 (vec_concat:V16QI (match_operand:V8QI 1 "reg_or_0_operand" "rO")
4207 (match_operand:V8QI 2 "reg_or_0_operand" "rO"))
4208 (parallel [(const_int 4) (const_int 12)
4209 (const_int 5) (const_int 13)
4210 (const_int 6) (const_int 14)
4211 (const_int 7) (const_int 15)])))]
4212 ""
4213 "v1int_h\t%0, %r2, %r1"
4214 [(set_attr "type" "X01")])
4215
4216 (define_expand "insn_v1int_h"
4217 [(match_operand:DI 0 "register_operand" "")
4218 (match_operand:DI 1 "reg_or_0_operand" "")
4219 (match_operand:DI 2 "reg_or_0_operand" "")]
4220 ""
4221 {
4222 /* Our instruction interleaves opposite of the way vec_interleave
4223 works, so we need to reverse the source operands. */
4224 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv8qi, V8QImode,
4225 operands[0], V8QImode, operands[2],
4226 operands[1], true);
4227 DONE;
4228 })
4229
4230 ;; insn_v1int_l
4231 ;; {B7,B6,B5,B4,B3,B2,B1,B0} {A7,A6,A5,A4,A3,A2,A1,A0}
4232 ;; => {A7,A6,A5,A4,A3,A2,A1,A0,B7,B6,B5,B4,B3,B2,B1,B0}
4233 ;; => {A3,B3,A2,B2,A1,B1,A0,B0}
4234 (define_insn "vec_interleave_lowv8qi"
4235 [(set (match_operand:V8QI 0 "register_operand" "=r")
4236 (vec_select:V8QI
4237 (vec_concat:V16QI (match_operand:V8QI 1 "reg_or_0_operand" "rO")
4238 (match_operand:V8QI 2 "reg_or_0_operand" "rO"))
4239 (parallel [(const_int 0) (const_int 8)
4240 (const_int 1) (const_int 9)
4241 (const_int 2) (const_int 10)
4242 (const_int 3) (const_int 11)])))]
4243 ""
4244 "v1int_l\t%0, %r2, %r1"
4245 [(set_attr "type" "X01")])
4246
4247 (define_expand "insn_v1int_l"
4248 [(match_operand:DI 0 "register_operand" "")
4249 (match_operand:DI 1 "reg_or_0_operand" "")
4250 (match_operand:DI 2 "reg_or_0_operand" "")]
4251 ""
4252 {
4253 /* Our instruction interleaves opposite of the way vec_interleave
4254 works, so we need to reverse the source operands. */
4255 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv8qi, V8QImode,
4256 operands[0], V8QImode, operands[2],
4257 operands[1], true);
4258 DONE;
4259 })
4260
4261 ;; insn_v2int_h
4262 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4263 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4264 ;; => {A3,B3,A2,B2}
4265 (define_insn "vec_interleave_highv4hi"
4266 [(set (match_operand:V4HI 0 "register_operand" "=r")
4267 (vec_select:V4HI
4268 (vec_concat:V8HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4269 (match_operand:V4HI 2 "reg_or_0_operand" "rO"))
4270 (parallel [(const_int 2) (const_int 6)
4271 (const_int 3) (const_int 7)])))]
4272 ""
4273 "v2int_h\t%0, %r2, %r1"
4274 [(set_attr "type" "X01")])
4275
4276 (define_expand "insn_v2int_h"
4277 [(match_operand:DI 0 "register_operand" "")
4278 (match_operand:DI 1 "reg_or_0_operand" "")
4279 (match_operand:DI 2 "reg_or_0_operand" "")]
4280 ""
4281 {
4282 /* Our instruction interleaves opposite of the way vec_interleave
4283 works, so we need to reverse the source operands. */
4284 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv4hi, V4HImode,
4285 operands[0], V4HImode, operands[2],
4286 operands[1], true);
4287 DONE;
4288 })
4289
4290 ;; insn_v2int_l
4291 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4292 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4293 ;; => {A1,B1,A0,B0}
4294 (define_insn "vec_interleave_lowv4hi"
4295 [(set (match_operand:V4HI 0 "register_operand" "=r")
4296 (vec_select:V4HI
4297 (vec_concat:V8HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4298 (match_operand:V4HI 2 "reg_or_0_operand" "rO"))
4299 (parallel [(const_int 0) (const_int 4)
4300 (const_int 1) (const_int 5)])))]
4301 ""
4302 "v2int_l\t%0, %r2, %r1"
4303 [(set_attr "type" "X01")])
4304
4305 (define_expand "insn_v2int_l"
4306 [(match_operand:DI 0 "register_operand" "")
4307 (match_operand:DI 1 "reg_or_0_operand" "")
4308 (match_operand:DI 2 "reg_or_0_operand" "")]
4309 ""
4310 {
4311 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv4hi, V4HImode,
4312 operands[0], V4HImode, operands[2],
4313 operands[1], true);
4314 DONE;
4315 })
4316
4317 ;; insn_v4int_h
4318 ;; {B1,B0} {A1,A0}
4319 ;; => {A1,A0,B1,B0}
4320 ;; => {A1,B1}
4321 (define_insn "vec_interleave_highv2si"
4322 [(set (match_operand:V2SI 0 "register_operand" "=r")
4323 (vec_select:V2SI
4324 (vec_concat:V4SI (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4325 (match_operand:V2SI 2 "reg_or_0_operand" "rO"))
4326 (parallel [(const_int 1) (const_int 3)])))]
4327 ""
4328 "v4int_h\t%0, %r2, %r1"
4329 [(set_attr "type" "X01")])
4330
4331 (define_expand "insn_v4int_h"
4332 [(match_operand:DI 0 "register_operand" "")
4333 (match_operand:DI 1 "reg_or_0_operand" "")
4334 (match_operand:DI 2 "reg_or_0_operand" "")]
4335 ""
4336 {
4337 /* Our instruction interleaves opposite of the way vec_interleave
4338 works, so we need to reverse the source operands. */
4339 tilegx_expand_builtin_vector_binop (gen_vec_interleave_highv2si, V2SImode,
4340 operands[0], V2SImode, operands[2],
4341 operands[1], true);
4342 DONE;
4343 })
4344
4345 ;; insn_v4int_l
4346 ;; {B1,B0} {A1,A0}
4347 ;; => {A1,A0,B1,B0}
4348 ;; => {A0,B0}
4349 (define_insn "vec_interleave_lowv2si"
4350 [(set (match_operand:V2SI 0 "register_operand" "=r")
4351 (vec_select:V2SI
4352 (vec_concat:V4SI (match_operand:V2SI 1 "reg_or_0_operand" "rO")
4353 (match_operand:V2SI 2 "reg_or_0_operand" "rO"))
4354 (parallel [(const_int 0) (const_int 2)])))]
4355 ""
4356 "v4int_l\t%0, %r2, %r1"
4357 [(set_attr "type" "X01")])
4358
4359 (define_expand "insn_v4int_l"
4360 [(match_operand:DI 0 "register_operand" "")
4361 (match_operand:DI 1 "reg_or_0_operand" "")
4362 (match_operand:DI 2 "reg_or_0_operand" "")]
4363 ""
4364 {
4365 /* Our instruction interleaves opposite of the way vec_interleave
4366 works, so we need to reverse the source operands. */
4367 tilegx_expand_builtin_vector_binop (gen_vec_interleave_lowv2si, V2SImode,
4368 operands[0], V2SImode, operands[2],
4369 operands[1], true);
4370 DONE;
4371 })
4372
4373 ;; insn_v1mnz
4374 ;; insn_v1mz
4375 ;; insn_v2mnz
4376 ;; insn_v2mz
4377 (define_insn "insn_mnz_<mode>"
4378 [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4379 (if_then_else:VEC48MODE
4380 (ne:VEC48MODE
4381 (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4382 (const_int 0))
4383 (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")
4384 (const_int 0)))]
4385 ""
4386 "v<n>mnz\t%0, %r1, %r2"
4387 [(set_attr "type" "X01")])
4388
4389 (define_expand "insn_v<n>mnz"
4390 [(set (match_operand:DI 0 "register_operand" "")
4391 (if_then_else:VEC48MODE
4392 (ne:VEC48MODE
4393 (match_operand:DI 1 "reg_or_0_operand" "")
4394 (const_int 0))
4395 (match_operand:DI 2 "reg_or_0_operand" "")
4396 (const_int 0)))]
4397 ""
4398 {
4399 tilegx_expand_builtin_vector_binop (gen_insn_mnz_<mode>, <MODE>mode,
4400 operands[0], <MODE>mode, operands[1],
4401 operands[2], true);
4402 DONE;
4403 })
4404
4405 (define_insn "insn_mz_<mode>"
4406 [(set (match_operand:VEC48MODE 0 "register_operand" "=r")
4407 (if_then_else:VEC48MODE
4408 (ne:VEC48MODE
4409 (match_operand:VEC48MODE 1 "reg_or_0_operand" "rO")
4410 (const_int 0))
4411 (const_int 0)
4412 (match_operand:VEC48MODE 2 "reg_or_0_operand" "rO")))]
4413 ""
4414 "v<n>mz\t%0, %r1, %r2"
4415 [(set_attr "type" "X01")])
4416 (define_expand "insn_v<n>mz"
4417 [(set (match_operand:DI 0 "register_operand" "")
4418 (if_then_else:VEC48MODE
4419 (ne:VEC48MODE
4420 (match_operand:DI 1 "reg_or_0_operand" "")
4421 (const_int 0))
4422 (const_int 0)
4423 (match_operand:DI 2 "reg_or_0_operand" "")))]
4424 ""
4425 {
4426 tilegx_expand_builtin_vector_binop (gen_insn_mz_<mode>, <MODE>mode,
4427 operands[0], <MODE>mode, operands[1],
4428 operands[2], true);
4429 DONE;
4430 })
4431
4432 ;; insn_v1mulu
4433 (define_insn "vec_widen_umult_lo_v8qi"
4434 [(set (match_operand:V4HI 0 "register_operand" "=r")
4435 (mult:V4HI
4436 (zero_extend:V4HI
4437 (vec_select:V4QI
4438 (match_operand:V8QI 1 "register_operand" "r")
4439 (parallel [(const_int 0) (const_int 1)
4440 (const_int 2) (const_int 3)])))
4441 (zero_extend:V4HI
4442 (vec_select:V4QI
4443 (match_operand:V8QI 2 "register_operand" "r")
4444 (parallel [(const_int 0) (const_int 1)
4445 (const_int 2) (const_int 3)])))))]
4446 ""
4447 "v1mulu\t%0, %r1, %r2"
4448 [(set_attr "type" "X0_2cycle")])
4449
4450 (define_expand "insn_v1mulu"
4451 [(match_operand:DI 0 "register_operand" "")
4452 (match_operand:DI 1 "reg_or_0_operand" "")
4453 (match_operand:DI 2 "reg_or_0_operand" "")]
4454 ""
4455 {
4456 tilegx_expand_builtin_vector_binop (gen_vec_widen_umult_lo_v8qi, V4HImode,
4457 operands[0], V8QImode, operands[1],
4458 operands[2], true);
4459 DONE;
4460 })
4461
4462 ;; insn_v1mulus
4463 (define_insn "vec_widen_usmult_lo_v8qi"
4464 [(set (match_operand:V4HI 0 "register_operand" "=r")
4465 (mult:V4HI
4466 (zero_extend:V4HI
4467 (vec_select:V4QI
4468 (match_operand:V8QI 1 "register_operand" "r")
4469 (parallel [(const_int 0) (const_int 1)
4470 (const_int 2) (const_int 3)])))
4471 (sign_extend:V4HI
4472 (vec_select:V4QI
4473 (match_operand:V8QI 2 "register_operand" "r")
4474 (parallel [(const_int 0) (const_int 1)
4475 (const_int 2) (const_int 3)])))))]
4476 ""
4477 "v1mulus\t%0, %r1, %r2"
4478 [(set_attr "type" "X0_2cycle")])
4479
4480 (define_expand "insn_v1mulus"
4481 [(match_operand:DI 0 "register_operand" "")
4482 (match_operand:DI 1 "reg_or_0_operand" "")
4483 (match_operand:DI 2 "reg_or_0_operand" "")]
4484 ""
4485 {
4486 tilegx_expand_builtin_vector_binop (gen_vec_widen_usmult_lo_v8qi, V4HImode,
4487 operands[0], V8QImode, operands[1],
4488 operands[2], true);
4489 DONE;
4490 })
4491
4492 ;; insn_v2muls
4493 (define_insn "vec_widen_smult_lo_v4qi"
4494 [(set (match_operand:V2SI 0 "register_operand" "=r")
4495 (mult:V2SI
4496 (sign_extend:V2SI
4497 (vec_select:V2HI
4498 (match_operand:V4HI 1 "register_operand" "r")
4499 (parallel [(const_int 0) (const_int 1)])))
4500 (sign_extend:V2SI
4501 (vec_select:V2HI
4502 (match_operand:V4HI 2 "register_operand" "r")
4503 (parallel [(const_int 0) (const_int 1)])))))]
4504 ""
4505 "v2muls\t%0, %r1, %r2"
4506 [(set_attr "type" "X0_2cycle")])
4507
4508 (define_expand "insn_v2muls"
4509 [(match_operand:DI 0 "register_operand" "")
4510 (match_operand:DI 1 "reg_or_0_operand" "")
4511 (match_operand:DI 2 "reg_or_0_operand" "")]
4512 ""
4513 {
4514 tilegx_expand_builtin_vector_binop (gen_vec_widen_smult_lo_v4qi, V2SImode,
4515 operands[0], V4HImode, operands[1],
4516 operands[2], true);
4517 DONE;
4518 })
4519
4520 ;; v2packl
4521 ;; v2packuc
4522 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4523 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
4524 (define_insn "vec_pack_<pack_optab>_v4hi"
4525 [(set (match_operand:V8QI 0 "reg_or_0_operand" "=r")
4526 (vec_concat:V8QI
4527 (v2pack:V4QI (match_operand:V4HI 1 "reg_or_0_operand" "rO"))
4528 (v2pack:V4QI (match_operand:V4HI 2 "reg_or_0_operand" "rO"))))]
4529 ""
4530 "v2<pack_insn>\t%0, %r2, %r1"
4531 [(set_attr "type" "X01")])
4532
4533 (define_expand "insn_v2<pack_insn>"
4534 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4535 (vec_concat:V8QI
4536 (v2pack:V4QI (match_operand:DI 2 "reg_or_0_operand" ""))
4537 (v2pack:V4QI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4538 ""
4539 {
4540 /* Our instruction concats opposite of the way vec_pack works, so we
4541 need to reverse the source operands. */
4542 tilegx_expand_builtin_vector_binop (gen_vec_pack_<pack_optab>_v4hi,
4543 V8QImode, operands[0], V4HImode,
4544 operands[2], operands[1], true);
4545 DONE;
4546 })
4547
4548 ;; v2packh
4549 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
4550 ;; => {A3_hi,A2_hi,A1_hi,A0_hi,B3_hi,B2_hi,B1_hi,B0_hi}
4551 (define_insn "vec_pack_hipart_v4hi"
4552 [(set (match_operand:V8QI 0 "reg_or_0_operand" "=r")
4553 (vec_concat:V8QI
4554 (truncate:V4QI
4555 (ashiftrt:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rO")
4556 (const_int 8)))
4557 (truncate:V4QI
4558 (ashiftrt:V4HI (match_operand:V4HI 2 "reg_or_0_operand" "rO")
4559 (const_int 8)))))]
4560 ""
4561 "v2packh\t%0, %r2, %r1"
4562 [(set_attr "type" "X01")])
4563
4564 (define_expand "insn_v2packh"
4565 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4566 (vec_concat:V8QI
4567 (truncate:V4QI
4568 (ashiftrt:V4HI (match_operand:DI 2 "reg_or_0_operand" "")
4569 (const_int 8)))
4570 (truncate:V4QI
4571 (ashiftrt:V4HI (match_operand:DI 1 "reg_or_0_operand" "")
4572 (const_int 8)))))]
4573 ""
4574 {
4575 /* Our instruction concats opposite of the way vec_pack works, so we
4576 need to reverse the source operands. */
4577 tilegx_expand_builtin_vector_binop (gen_vec_pack_hipart_v4hi, V8QImode,
4578 operands[0], V4HImode, operands[2],
4579 operands[1], true);
4580 DONE;
4581 })
4582
4583 ;; v4packsc
4584 ;; {B1,B0} {A1,A0}
4585 ;; => {A1,A0,B1,B0}
4586 (define_insn "vec_pack_ssat_v2si"
4587 [(set (match_operand:V4HI 0 "reg_or_0_operand" "=r")
4588 (vec_concat:V4HI
4589 (us_truncate:V2HI (match_operand:V2SI 1 "reg_or_0_operand" "rO"))
4590 (us_truncate:V2HI (match_operand:V2SI 2 "reg_or_0_operand" "rO"))))]
4591 ""
4592 "v4packsc\t%0, %r2, %r1"
4593 [(set_attr "type" "X01")])
4594
4595 (define_expand "insn_v4packsc"
4596 [(set (match_operand:DI 0 "reg_or_0_operand" "")
4597 (vec_concat:V4HI
4598 (us_truncate:V2HI (match_operand:DI 2 "reg_or_0_operand" ""))
4599 (us_truncate:V2HI (match_operand:DI 1 "reg_or_0_operand" ""))))]
4600 ""
4601 {
4602 /* Our instruction concats opposite of the way vec_pack works, so we
4603 need to reverse the source operands. */
4604 tilegx_expand_builtin_vector_binop (gen_vec_pack_ssat_v2si, V4HImode,
4605 operands[0], V2SImode, operands[2],
4606 operands[1], true);
4607 DONE;
4608 })
4609
4610 ;; Rest of the vector intrinsics
4611 (define_insn "insn_v1adiffu"
4612 [(set (match_operand:DI 0 "register_operand" "=r")
4613 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4614 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4615 UNSPEC_INSN_V1ADIFFU))]
4616 ""
4617 "v1adiffu\t%0, %r1, %r2"
4618 [(set_attr "type" "X0_2cycle")])
4619
4620 (define_insn "insn_v1avgu"
4621 [(set (match_operand:DI 0 "register_operand" "=r")
4622 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4623 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4624 UNSPEC_INSN_V1AVGU))]
4625 ""
4626 "v1avgu\t%0, %r1, %r2"
4627 [(set_attr "type" "X0")])
4628
4629 (define_insn "insn_v1ddotpu"
4630 [(set (match_operand:DI 0 "register_operand" "=r")
4631 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4632 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4633 UNSPEC_INSN_V1DDOTPU))]
4634 ""
4635 "v1ddotpu\t%0, %r1, %r2"
4636 [(set_attr "type" "X0_2cycle")])
4637
4638 (define_insn "insn_v1ddotpua"
4639 [(set (match_operand:DI 0 "register_operand" "=r")
4640 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4641 (match_operand:DI 2 "reg_or_0_operand" "rO")
4642 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4643 UNSPEC_INSN_V1DDOTPUA))]
4644 ""
4645 "v1ddotpua\t%0, %r2, %r3"
4646 [(set_attr "type" "X0_2cycle")])
4647
4648 (define_insn "insn_v1ddotpus"
4649 [(set (match_operand:DI 0 "register_operand" "=r")
4650 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4651 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4652 UNSPEC_INSN_V1DDOTPUS))]
4653 ""
4654 "v1ddotpus\t%0, %r1, %r2"
4655 [(set_attr "type" "X0_2cycle")])
4656
4657 (define_insn "insn_v1ddotpusa"
4658 [(set (match_operand:DI 0 "register_operand" "=r")
4659 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4660 (match_operand:DI 2 "reg_or_0_operand" "rO")
4661 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4662 UNSPEC_INSN_V1DDOTPUSA))]
4663 ""
4664 "v1ddotpusa\t%0, %r2, %r3"
4665 [(set_attr "type" "X0_2cycle")])
4666
4667 (define_insn "insn_v1dotp"
4668 [(set (match_operand:DI 0 "register_operand" "=r")
4669 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4670 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4671 UNSPEC_INSN_V1DOTP))]
4672 ""
4673 "v1dotp\t%0, %r1, %r2"
4674 [(set_attr "type" "X0_2cycle")])
4675
4676 (define_insn "insn_v1dotpa"
4677 [(set (match_operand:DI 0 "register_operand" "=r")
4678 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4679 (match_operand:DI 2 "reg_or_0_operand" "rO")
4680 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4681 UNSPEC_INSN_V1DOTPA))]
4682 ""
4683 "v1dotpa\t%0, %r2, %r3"
4684 [(set_attr "type" "X0_2cycle")])
4685
4686 (define_insn "insn_v1dotpu"
4687 [(set (match_operand:DI 0 "register_operand" "=r")
4688 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4689 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4690 UNSPEC_INSN_V1DOTPU))]
4691 ""
4692 "v1dotpu\t%0, %r1, %r2"
4693 [(set_attr "type" "X0_2cycle")])
4694
4695 (define_insn "insn_v1dotpua"
4696 [(set (match_operand:DI 0 "register_operand" "=r")
4697 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4698 (match_operand:DI 2 "reg_or_0_operand" "rO")
4699 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4700 UNSPEC_INSN_V1DOTPUA))]
4701 ""
4702 "v1dotpua\t%0, %r2, %r3"
4703 [(set_attr "type" "X0_2cycle")])
4704
4705 (define_insn "insn_v1dotpus"
4706 [(set (match_operand:DI 0 "register_operand" "=r")
4707 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4708 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4709 UNSPEC_INSN_V1DOTPUS))]
4710 ""
4711 "v1dotpus\t%0, %r1, %r2"
4712 [(set_attr "type" "X0_2cycle")])
4713
4714 (define_insn "insn_v1dotpusa"
4715 [(set (match_operand:DI 0 "register_operand" "=r")
4716 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4717 (match_operand:DI 2 "reg_or_0_operand" "rO")
4718 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4719 UNSPEC_INSN_V1DOTPUSA))]
4720 ""
4721 "v1dotpusa\t%0, %r2, %r3"
4722 [(set_attr "type" "X0_2cycle")])
4723
4724 (define_insn "insn_v1sadau"
4725 [(set (match_operand:DI 0 "register_operand" "=r")
4726 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4727 (match_operand:DI 2 "reg_or_0_operand" "rO")
4728 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4729 UNSPEC_INSN_V1SADAU))]
4730 ""
4731 "v1sadau\t%0, %r2, %r3"
4732 [(set_attr "type" "X0_2cycle")])
4733
4734 (define_insn "insn_v1sadu"
4735 [(set (match_operand:DI 0 "register_operand" "=r")
4736 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4737 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4738 UNSPEC_INSN_V1SADU))]
4739 ""
4740 "v1sadu\t%0, %r1, %r2"
4741 [(set_attr "type" "X0_2cycle")])
4742
4743 (define_insn "*insn_v1sadu"
4744 [(set (match_operand:SI 0 "register_operand" "=r")
4745 (truncate:SI
4746 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4747 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4748 UNSPEC_INSN_V1SADU)))]
4749 ""
4750 "v1sadu\t%0, %r1, %r2"
4751 [(set_attr "type" "X0_2cycle")])
4752
4753 (define_insn "insn_v2adiffs"
4754 [(set (match_operand:DI 0 "register_operand" "=r")
4755 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4756 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4757 UNSPEC_INSN_V2ADIFFS))]
4758 ""
4759 "v2adiffs\t%0, %r1, %r2"
4760 [(set_attr "type" "X0_2cycle")])
4761
4762 (define_insn "insn_v2avgs"
4763 [(set (match_operand:DI 0 "register_operand" "=r")
4764 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4765 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4766 UNSPEC_INSN_V2AVGS))]
4767 ""
4768 "v2avgs\t%0, %r1, %r2"
4769 [(set_attr "type" "X0")])
4770
4771 (define_insn "insn_v2dotp"
4772 [(set (match_operand:DI 0 "register_operand" "=r")
4773 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4774 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4775 UNSPEC_INSN_V2DOTP))]
4776 ""
4777 "v2dotp\t%0, %r1, %r2"
4778 [(set_attr "type" "X0_2cycle")])
4779
4780 (define_insn "insn_v2dotpa"
4781 [(set (match_operand:DI 0 "register_operand" "=r")
4782 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4783 (match_operand:DI 2 "reg_or_0_operand" "rO")
4784 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4785 UNSPEC_INSN_V2DOTPA))]
4786 ""
4787 "v2dotpa\t%0, %r2, %r3"
4788 [(set_attr "type" "X0_2cycle")])
4789
4790 (define_insn "insn_v2mulfsc"
4791 [(set (match_operand:DI 0 "register_operand" "=r")
4792 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4793 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4794 UNSPEC_INSN_V2MULFSC))]
4795 ""
4796 "v2mulfsc\t%0, %r1, %r2"
4797 [(set_attr "type" "X0_2cycle")])
4798
4799 (define_insn "insn_v2sadas"
4800 [(set (match_operand:DI 0 "register_operand" "=r")
4801 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4802 (match_operand:DI 2 "reg_or_0_operand" "rO")
4803 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4804 UNSPEC_INSN_V2SADAS))]
4805 ""
4806 "v2sadas\t%0, %r2, %r3"
4807 [(set_attr "type" "X0_2cycle")])
4808
4809 (define_insn "insn_v2sadau"
4810 [(set (match_operand:DI 0 "register_operand" "=r")
4811 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
4812 (match_operand:DI 2 "reg_or_0_operand" "rO")
4813 (match_operand:DI 3 "reg_or_0_operand" "rO")]
4814 UNSPEC_INSN_V2SADAU))]
4815 ""
4816 "v2sadau\t%0, %r2, %r3"
4817 [(set_attr "type" "X0_2cycle")])
4818
4819 (define_insn "insn_v2sads"
4820 [(set (match_operand:DI 0 "register_operand" "=r")
4821 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4822 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4823 UNSPEC_INSN_V2SADS))]
4824 ""
4825 "v2sads\t%0, %r1, %r2"
4826 [(set_attr "type" "X0_2cycle")])
4827
4828 (define_insn "*insn_v2sads"
4829 [(set (match_operand:SI 0 "register_operand" "=r")
4830 (truncate:SI
4831 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4832 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4833 UNSPEC_INSN_V2SADS)))]
4834 ""
4835 "v2sads\t%0, %r1, %r2"
4836 [(set_attr "type" "X0_2cycle")])
4837
4838 (define_insn "insn_v2sadu"
4839 [(set (match_operand:DI 0 "register_operand" "=r")
4840 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4841 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4842 UNSPEC_INSN_V2SADU))]
4843 ""
4844 "v2sadu\t%0, %r1, %r2"
4845 [(set_attr "type" "X0_2cycle")])
4846
4847 (define_insn "*insn_v2sadu"
4848 [(set (match_operand:SI 0 "register_operand" "=r")
4849 (truncate:SI
4850 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rO")
4851 (match_operand:DI 2 "reg_or_0_operand" "rO")]
4852 UNSPEC_INSN_V2SADU)))]
4853 ""
4854 "v2sadu\t%0, %r1, %r2"
4855 [(set_attr "type" "X0_2cycle")])
4856
4857 (define_insn "insn_wh64"
4858 [(unspec_volatile:VOID [(match_operand 0 "pointer_operand" "rO")]
4859 UNSPEC_INSN_WH64)
4860 (clobber (mem:BLK (const_int 0)))]
4861 ""
4862 "wh64\t%r0"
4863 [(set_attr "type" "X1")])
4864
4865 \f
4866 ;; Network intrinsics
4867
4868 ;; Note the "pseudo" text is handled specially by the
4869 ;; asm_output_opcode routine. If the output is an empty string, the
4870 ;; instruction would bypass the asm_output_opcode routine, bypassing
4871 ;; the bundle handling code.
4872 (define_insn "tilegx_network_barrier"
4873 [(unspec_volatile:SI [(const_int 0)] UNSPEC_NETWORK_BARRIER)]
4874 ""
4875 "pseudo"
4876 [(set_attr "type" "nothing")
4877 (set_attr "length" "0")])
4878
4879 (define_insn "*netreg_receive"
4880 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,U,m")
4881 (unspec_volatile:DI [(match_operand:DI 1 "netreg_operand" "i,i,i")
4882 (reg:DI TILEGX_NETORDER_REG)]
4883 UNSPEC_NETWORK_RECEIVE))
4884 (clobber (reg:DI TILEGX_NETORDER_REG))]
4885
4886 ""
4887 "@
4888 move\t%0, %N1
4889 st\t%0, %N1
4890 st_add\t%I0, %N1, %i0"
4891 [(set_attr "type" "*,Y2,X1")])
4892
4893 (define_insn "*netreg_send"
4894 [(unspec_volatile:DI
4895 [(match_operand:DI 0 "netreg_operand" "i,i,i,i,i,i")
4896 (match_operand:DI 1 "reg_or_cint_operand" "r,I,J,K,N,P")
4897 (reg:DI TILEGX_NETORDER_REG)]
4898 UNSPEC_NETWORK_SEND)
4899 (clobber (reg:DI TILEGX_NETORDER_REG))]
4900 ""
4901 "@
4902 move\t%N0, %r1
4903 movei\t%N0, %1
4904 moveli\t%N0, %1
4905 shl16insli\t%N0, zero, %h1
4906 v1addi\t%N0, zero, %j1
4907 v2addi\t%N0, zero, %h1"
4908 [(set_attr "type" "*,*,X01,X01,X01,X01")])
4909
4910 (define_expand "tilegx_idn0_receive"
4911 [(parallel
4912 [(set (match_operand:DI 0 "register_operand" "")
4913 (unspec_volatile:DI [(const_int TILEGX_NETREG_IDN0)
4914 (reg:DI TILEGX_NETORDER_REG)]
4915 UNSPEC_NETWORK_RECEIVE))
4916 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4917 "")
4918
4919 (define_expand "tilegx_idn1_receive"
4920 [(parallel
4921 [(set (match_operand:DI 0 "register_operand" "")
4922 (unspec_volatile:DI [(const_int TILEGX_NETREG_IDN1)
4923 (reg:DI TILEGX_NETORDER_REG)]
4924 UNSPEC_NETWORK_RECEIVE))
4925 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4926 "")
4927
4928 (define_expand "tilegx_idn_send"
4929 [(parallel
4930 [(unspec_volatile:DI [(const_int TILEGX_NETREG_IDN0)
4931 (match_operand:DI 0 "reg_or_cint_operand" "")
4932 (reg:DI TILEGX_NETORDER_REG)]
4933 UNSPEC_NETWORK_SEND)
4934 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4935 "")
4936
4937 (define_expand "tilegx_udn0_receive"
4938 [(parallel
4939 [(set (match_operand:DI 0 "register_operand" "")
4940 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN0)
4941 (reg:DI TILEGX_NETORDER_REG)]
4942 UNSPEC_NETWORK_RECEIVE))
4943 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4944 "")
4945
4946 (define_expand "tilegx_udn1_receive"
4947 [(parallel
4948 [(set (match_operand:DI 0 "register_operand" "")
4949 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN1)
4950 (reg:DI TILEGX_NETORDER_REG)]
4951 UNSPEC_NETWORK_RECEIVE))
4952 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4953 "")
4954
4955 (define_expand "tilegx_udn2_receive"
4956 [(parallel
4957 [(set (match_operand:DI 0 "register_operand" "")
4958 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN2)
4959 (reg:DI TILEGX_NETORDER_REG)]
4960 UNSPEC_NETWORK_RECEIVE))
4961 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4962 "")
4963
4964 (define_expand "tilegx_udn3_receive"
4965 [(parallel
4966 [(set (match_operand:DI 0 "register_operand" "")
4967 (unspec_volatile:DI [(const_int TILEGX_NETREG_UDN3)
4968 (reg:DI TILEGX_NETORDER_REG)]
4969 UNSPEC_NETWORK_RECEIVE))
4970 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4971 "")
4972
4973 (define_expand "tilegx_udn_send"
4974 [(parallel
4975 [(unspec_volatile:DI [(const_int TILEGX_NETREG_UDN0)
4976 (match_operand:DI 0 "reg_or_cint_operand" "")
4977 (reg:DI TILEGX_NETORDER_REG)]
4978 UNSPEC_NETWORK_SEND)
4979 (clobber (reg:DI TILEGX_NETORDER_REG))])]
4980 "")
4981
4982 (define_insn "*netreg_adddi_to_network"
4983 [(unspec_volatile:DI
4984 [(match_operand:DI 0 "netreg_operand" "i,i,i")
4985 (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rO,rO,rO")
4986 (match_operand:DI 2 "add_operand" "r,I,JT"))
4987 (reg:DI TILEGX_NETORDER_REG)]
4988 UNSPEC_NETWORK_SEND)
4989 (clobber (reg:DI TILEGX_NETORDER_REG))]
4990 ""
4991 "@
4992 add\t%N0, %r1, %2
4993 addi\t%N0, %r1, %2
4994 addli\t%N0, %r1, %H2"
4995 [(set_attr "type" "*,*,X01")])
4996
4997 (define_insn "*netreg_adddi_from_network"
4998 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
4999 (plus:DI (unspec_volatile:DI
5000 [(match_operand:DI 1 "netreg_operand" "%i,i,i")
5001 (reg:DI TILEGX_NETORDER_REG)]
5002 UNSPEC_NETWORK_RECEIVE)
5003 (match_operand:DI 2 "add_operand" "rO,I,JT")))
5004 (clobber (reg:DI TILEGX_NETORDER_REG))]
5005 ""
5006 "@
5007 add\t%0, %N1, %r2
5008 addi\t%0, %N1, %2
5009 addli\t%0, %N1, %H2"
5010 [(set_attr "type" "*,*,X01")])
5011
5012 \f
5013 ;;
5014 ;; Stack protector instructions.
5015 ;;
5016
5017 (define_expand "stack_protect_set"
5018 [(set (match_operand 0 "nonautoincmem_operand" "")
5019 (match_operand 1 "nonautoincmem_operand" ""))]
5020 ""
5021 {
5022 #ifdef TARGET_THREAD_SSP_OFFSET
5023 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
5024 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
5025 rtx ssp = gen_reg_rtx (Pmode);
5026
5027 emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
5028
5029 operands[1] = gen_rtx_MEM (Pmode, ssp);
5030 #endif
5031
5032 if (TARGET_32BIT)
5033 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
5034 else
5035 emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
5036
5037 DONE;
5038 })
5039
5040 (define_insn "stack_protect_setsi"
5041 [(set (match_operand:SI 0 "nonautoincmem_operand" "=U")
5042 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")]
5043 UNSPEC_SP_SET))
5044 (set (match_scratch:SI 2 "=&r") (const_int 0))]
5045 ""
5046 "ld4s\t%2, %1; { st4\t%0, %2; move\t%2, zero }"
5047 [(set_attr "length" "16")
5048 (set_attr "type" "cannot_bundle_3cycle")])
5049
5050 (define_insn "stack_protect_setdi"
5051 [(set (match_operand:DI 0 "nonautoincmem_operand" "=U")
5052 (unspec:DI [(match_operand:DI 1 "nonautoincmem_operand" "U")]
5053 UNSPEC_SP_SET))
5054 (set (match_scratch:DI 2 "=&r") (const_int 0))]
5055 ""
5056 "ld\t%2, %1; { st\t%0, %2; move\t%2, zero }"
5057 [(set_attr "length" "16")
5058 (set_attr "type" "cannot_bundle_3cycle")])
5059
5060 (define_expand "stack_protect_test"
5061 [(match_operand 0 "nonautoincmem_operand" "")
5062 (match_operand 1 "nonautoincmem_operand" "")
5063 (match_operand 2 "" "")]
5064 ""
5065 {
5066 rtx compare_result;
5067 rtx bcomp, loc_ref;
5068
5069 #ifdef TARGET_THREAD_SSP_OFFSET
5070 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
5071 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
5072 rtx ssp = gen_reg_rtx (Pmode);
5073
5074 emit_insn (gen_rtx_SET (VOIDmode, ssp, ssp_addr));
5075
5076 operands[1] = gen_rtx_MEM (Pmode, ssp);
5077 #endif
5078
5079 compare_result = gen_reg_rtx (Pmode);
5080
5081 if (TARGET_32BIT)
5082 emit_insn (gen_stack_protect_testsi (compare_result, operands[0],
5083 operands[1]));
5084 else
5085 emit_insn (gen_stack_protect_testdi (compare_result, operands[0],
5086 operands[1]));
5087
5088 bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx);
5089
5090 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]);
5091
5092 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
5093 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
5094 loc_ref, pc_rtx)));
5095
5096 DONE;
5097 })
5098
5099 (define_insn "stack_protect_testsi"
5100 [(set (match_operand:SI 0 "register_operand" "=&r")
5101 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")
5102 (match_operand:SI 2 "nonautoincmem_operand" "U")]
5103 UNSPEC_SP_TEST))
5104 (set (match_scratch:SI 3 "=&r") (const_int 0))]
5105 ""
5106 "ld4s\t%0, %1; ld4s\t%3, %2; { cmpeq\t%0, %0, %3; move\t%3, zero }"
5107 [(set_attr "length" "24")
5108 (set_attr "type" "cannot_bundle_4cycle")])
5109
5110 (define_insn "stack_protect_testdi"
5111 [(set (match_operand:DI 0 "register_operand" "=&r")
5112 (unspec:DI [(match_operand:DI 1 "nonautoincmem_operand" "U")
5113 (match_operand:DI 2 "nonautoincmem_operand" "U")]
5114 UNSPEC_SP_TEST))
5115 (set (match_scratch:DI 3 "=&r") (const_int 0))]
5116 ""
5117 "ld\t%0, %1; ld\t%3, %2; { cmpeq\t%0, %0, %3; move\t%3, zero }"
5118 [(set_attr "length" "24")
5119 (set_attr "type" "cannot_bundle_4cycle")])
5120
5121 (include "sync.md")