comparison gcc/config/tilepro/tilepro.md @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 ;; Machine description for Tilera TILEPro chip for GCC.
2 ;; Copyright (C) 2011-2017 Free Software Foundation, Inc.
3 ;; Contributed by Walter Lee (walt@tilera.com)
4 ;;
5 ;; This file is part of GCC.
6 ;;
7 ;; GCC is free software; you can redistribute it and/or modify it
8 ;; under the terms of the GNU General Public License as published
9 ;; by the Free Software Foundation; either version 3, or (at your
10 ;; option) any later version.
11 ;;
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 ;; License for more details.
16 ;;
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GCC; see the file COPYING3. If not see
19 ;; <http://www.gnu.org/licenses/>.
20
21 (define_constants [
22 ;;
23 ;; The following represent intrinsic insns, organized by latency.
24 ;;
25
26 ;; single cycle
27 (UNSPEC_INSN_ADDLIS 1)
28 (UNSPEC_INSN_AULI 2)
29 (UNSPEC_INSN_AVGB_U 3)
30 (UNSPEC_INSN_AVGH 4)
31 (UNSPEC_INSN_BITX 5)
32 (UNSPEC_INSN_CRC32_32 6)
33 (UNSPEC_INSN_CRC32_8 7)
34 (UNSPEC_INSN_DRAIN 8)
35 (UNSPEC_INSN_DTLBPR 9)
36 (UNSPEC_INSN_DWORD_ALIGN 10)
37 (UNSPEC_INSN_FINV 11)
38 (UNSPEC_INSN_FLUSH 12)
39 (UNSPEC_INSN_FNOP 13)
40 (UNSPEC_INSN_ICOH 14)
41 (UNSPEC_INSN_ILL 15)
42 (UNSPEC_INSN_INFO 16)
43 (UNSPEC_INSN_INFOL 17)
44 (UNSPEC_INSN_INV 18)
45 (UNSPEC_INSN_LNK 19)
46 (UNSPEC_INSN_MFSPR 20)
47 (UNSPEC_INSN_MNZB 21)
48 (UNSPEC_INSN_MNZH 22)
49 (UNSPEC_INSN_MOVELIS 23)
50 (UNSPEC_INSN_MTSPR 24)
51 (UNSPEC_INSN_MZB 25)
52 (UNSPEC_INSN_MZH 26)
53 (UNSPEC_INSN_NAP 27)
54 (UNSPEC_INSN_PACKBS_U 28)
55 (UNSPEC_INSN_PACKHB 29)
56 (UNSPEC_INSN_PACKHS 30)
57 (UNSPEC_INSN_PACKLB 31)
58 (UNSPEC_INSN_PREFETCH_L1 32)
59 (UNSPEC_INSN_TBLIDXB0 33)
60 (UNSPEC_INSN_TBLIDXB1 34)
61 (UNSPEC_INSN_TBLIDXB2 35)
62 (UNSPEC_INSN_TBLIDXB3 36)
63 (UNSPEC_INSN_WH64 37)
64
65 ;; 2 cycles
66 (UNSPEC_INSN_ADIFFB_U 100)
67 (UNSPEC_INSN_ADIFFH 101)
68 (UNSPEC_INSN_MULHHA_SS 102)
69 (UNSPEC_INSN_MULHHA_SU 103)
70 (UNSPEC_INSN_MULHHA_UU 104)
71 (UNSPEC_INSN_MULHHSA_UU 105)
72 (UNSPEC_INSN_MULHH_SS 106)
73 (UNSPEC_INSN_MULHH_SU 107)
74 (UNSPEC_INSN_MULHH_UU 108)
75 (UNSPEC_INSN_MULHLA_SS 109)
76 (UNSPEC_INSN_MULHLA_SU 110)
77 (UNSPEC_INSN_MULHLA_US 111)
78 (UNSPEC_INSN_MULHLA_UU 112)
79 (UNSPEC_INSN_MULHLSA_UU 113)
80 (UNSPEC_INSN_MULHL_SS 114)
81 (UNSPEC_INSN_MULHL_SU 115)
82 (UNSPEC_INSN_MULHL_US 116)
83 (UNSPEC_INSN_MULHL_UU 117)
84 (UNSPEC_INSN_MULLLA_SS 118)
85 (UNSPEC_INSN_MULLLA_SU 119)
86 (UNSPEC_INSN_MULLLA_UU 120)
87 (UNSPEC_INSN_MULLLSA_UU 121)
88 (UNSPEC_INSN_MULLL_SU 122)
89 (UNSPEC_INSN_MULLL_SS 123)
90 (UNSPEC_INSN_MULLL_UU 124)
91 (UNSPEC_INSN_SADAB_U 125)
92 (UNSPEC_INSN_SADAH 126)
93 (UNSPEC_INSN_SADAH_U 127)
94 (UNSPEC_INSN_SADB_U 128)
95 (UNSPEC_INSN_SADH 129)
96 (UNSPEC_INSN_SADH_U 130)
97
98 ;;
99 ;; The following are special insns.
100 ;;
101
102 ;; Blockage
103 (UNSPEC_BLOCKAGE 200)
104
105 ;; Latency specifying loads.
106 (UNSPEC_LATENCY_L2 201)
107 (UNSPEC_LATENCY_MISS 202)
108
109 ;; Lnk and its label
110 (UNSPEC_LNK_AND_LABEL 203)
111
112 ;; Memory fence
113 (UNSPEC_MF 204)
114
115 ;; A pseudo-op that prevents network operations from being ordered.
116 (UNSPEC_NETWORK_BARRIER 205)
117
118 ;; Operations that access network registers.
119 (UNSPEC_NETWORK_RECEIVE 206)
120 (UNSPEC_NETWORK_SEND 207)
121
122 ;; Stack protector operations
123 (UNSPEC_SP_SET 208)
124 (UNSPEC_SP_TEST 209)
125
126 ;; A call to __tls_get_addr
127 (UNSPEC_TLS_GD_CALL 210)
128
129 ;; An opaque TLS "add" operation for TLS general dynamic model
130 ;; access.
131 (UNSPEC_TLS_GD_ADD 211)
132
133 ;; An opaque TLS "load" operation for TLS initial exec model access.
134 (UNSPEC_TLS_IE_LOAD 212)
135
136 ;;
137 ;; The following are operands.
138 ;;
139 (UNSPEC_PCREL_SYM 300)
140 (UNSPEC_GOT16_SYM 301)
141 (UNSPEC_GOT32_SYM 302)
142 (UNSPEC_TLS_GD 303)
143 (UNSPEC_TLS_IE 304)
144 (UNSPEC_TLS_LE 305)
145 ])
146
147 ;; Mark the last instruction of various latencies, used to
148 ;; determine the rtx costs of unspec insns.
149 (define_constants [
150 (TILEPRO_LAST_LATENCY_1_INSN 99)
151 (TILEPRO_LAST_LATENCY_2_INSN 199)
152 (TILEPRO_LAST_LATENCY_INSN 299)
153 ])
154
155 ;; Constants for network registers.
156 (define_constants [
157 (TILEPRO_NETREG_IDN0 0)
158 (TILEPRO_NETREG_IDN1 1)
159 (TILEPRO_NETREG_SN 2)
160 (TILEPRO_NETREG_UDN0 3)
161 (TILEPRO_NETREG_UDN1 4)
162 (TILEPRO_NETREG_UDN2 5)
163 (TILEPRO_NETREG_UDN3 6)
164 ])
165
166 ;; Constants for special purpose registers.
167 (define_constants [
168 (TILEPRO_NETORDER_REG 66)])
169
170
171 ;; Operand and operator predicates and constraints
172
173 (include "predicates.md")
174 (include "constraints.md")
175 (include "tilepro-generic.md")
176
177 ;; Define an insn type attribute. This defines what pipes things can
178 ;; go in.
179 (define_attr "type"
180 "X0,X0_2cycle,X1,X1_branch,X1_2cycle,X1_L2,X1_miss,X01,Y0,Y0_2cycle,Y2,Y2_2cycle,Y2_L2,Y2_miss,Y01,cannot_bundle,cannot_bundle_3cycle,cannot_bundle_4cycle,nothing"
181 (const_string "Y01"))
182
183 (define_attr "length" ""
184 (cond [(eq_attr "type" "X1_branch")
185 (if_then_else
186 (and (le (minus (match_dup 0) (pc)) (const_int 524280))
187 (le (minus (pc) (match_dup 0)) (const_int 524288)))
188 (const_int 8)
189 (const_int 16))
190 ]
191 (const_int 8)))
192
193
194 ;; Define iterators.
195 (define_mode_iterator I48MODE [SI DI])
196 (define_mode_iterator I12MODE [QI HI])
197
198 (define_code_iterator binop_u5bit [ashift ashiftrt lshiftrt rotate])
199 (define_code_iterator binop_with_imm
200 [ashift lshiftrt ashiftrt rotate eq lt and ior xor])
201 (define_code_iterator unop [bswap clz ctz popcount])
202
203 (define_mode_attr load [(QI "lb") (HI "lh") (SI "lw")])
204 (define_mode_attr store [(QI "sb") (HI "sh") (SI "sw")])
205
206 ;; <optab> expands to the name of the optab for a particular code.
207 (define_code_attr optab [(ashift "ashl")
208 (ashiftrt "ashr")
209 (lshiftrt "lshr")
210 (eq "seq")
211 (ne "sne")
212 (lt "slt")
213 (ltu "sltu")
214 (le "sle")
215 (leu "sleu")
216 (minus "sub")
217 (plus "add")
218 (rotate "rotl")
219 (smax "smax")
220 (smin "smin")
221 (umax "umax")
222 (umin "umin")
223 (ss_minus "sssub")
224 (ss_plus "ssadd")
225 (us_minus "ussub")
226 (us_plus "usadd")
227 (and "and")
228 (ior "ior")
229 (xor "xor")
230 (bswap "bswap")
231 (clz "clz")
232 (ctz "ctz")
233 (popcount "popcount")])
234
235 ;; <insn> expands to the name of the insn that implements a particular
236 ;; code.
237 (define_code_attr insn [(ashift "shl")
238 (ashiftrt "sra")
239 (lshiftrt "shr")
240 (eq "seq")
241 (ne "sne")
242 (lt "slt")
243 (ltu "slt")
244 (le "slte")
245 (leu "slte")
246 (minus "sub")
247 (plus "add")
248 (rotate "rl")
249 (smax "max")
250 (smin "min")
251 (umax "max")
252 (umin "min")
253 (ss_minus "sub")
254 (ss_plus "add")
255 (us_minus "sub")
256 (us_plus "add")
257 (and "and")
258 (ior "or")
259 (xor "xor")
260 (bswap "bytex")
261 (clz "clz")
262 (ctz "ctz")
263 (popcount "pcnt")])
264
265 ;; <u> expands to the suffix of the insn that implements a particular
266 ;; code.
267 (define_code_attr u [(ashift "")
268 (ashiftrt "")
269 (lshiftrt "")
270 (eq "")
271 (ne "")
272 (lt "")
273 (ltu "_u")
274 (le "")
275 (leu "_u")
276 (minus "")
277 (plus "")
278 (rotate "")
279 (smax "")
280 (smin "")
281 (umax "_u")
282 (umin "_u")
283 (ss_minus "s")
284 (ss_plus "s")
285 (us_minus "s_u")
286 (us_plus "s_u")
287 (and "")
288 (ior "")
289 (xor "")])
290
291 ;; <comm> indicates whether a particular code is commutative, using
292 ;; the "%" commutative opterator constraint.
293 (define_code_attr comm [(ashift "")
294 (ashiftrt "")
295 (lshiftrt "")
296 (eq "%")
297 (ne "%")
298 (lt "")
299 (ltu "")
300 (le "")
301 (leu "")
302 (minus "")
303 (plus "%")
304 (rotate "")
305 (smax "%")
306 (umax "%")
307 (smin "%")
308 (umin "%")
309 (ss_plus "%")
310 (us_plus "%")
311 (ss_minus "")
312 (us_minus "")
313 (and "%")
314 (ior "%")
315 (xor "%")])
316
317 (define_mode_iterator VEC [V4QI V2HI])
318
319 ;; Code iterator for all three shifts.
320 (define_code_iterator any_shift [ashift ashiftrt lshiftrt])
321
322 ;; Code iterator for all byte ops without immediate variants.
323 (define_code_iterator v1op [us_plus ne le leu minus us_minus])
324
325 ;; Code iterator for all 2-byte vector ops without immediate variants.
326 (define_code_iterator v2op [ss_plus ne le leu minus ss_minus])
327
328 ;; Code iterator for all byte vector ops with immediate variants.
329 (define_code_iterator v1op_immed [plus umax umin eq lt ltu])
330
331 ;; Code iterator for all 2-byte vector ops with immediate variants.
332 (define_code_iterator v2op_immed [plus smax smin eq lt ltu])
333
334 ;; Code for packing two 2-byte vectors.
335 (define_code_iterator v2pack [truncate us_truncate])
336
337 ;; <pack_optab> expands to the part of the optab name describing how
338 ;; two vectors are packed.
339 (define_code_attr pack_optab [(truncate "trunc")
340 (us_truncate "usat")
341 (ss_truncate "ssat")])
342
343 ;; <pack_insn> expands to the insn that implements a particular vector
344 ;; packing code.
345 (define_code_attr pack_insn [(truncate "packl")
346 (us_truncate "pack")
347 (ss_truncate "pack")])
348
349 ;; <pack_u> expands to the suffix of the insn that implements a
350 ;; particular vector packing code.
351 (define_code_attr pack_u [(truncate "")
352 (us_truncate "s_u")
353 (ss_truncate "s")])
354
355
356 ;;
357 ;; The basic data move insns.
358 ;;
359
360 (define_expand "movqi"
361 [(set (match_operand:QI 0 "nonimmediate_operand" "")
362 (match_operand:QI 1 "nonautoinc_operand" ""))]
363 ""
364 {
365 if (tilepro_expand_mov (QImode, operands))
366 DONE;
367 })
368
369 (define_insn "*movqi_insn"
370 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,r,U,m")
371 (match_operand:QI 1 "move_operand" "r,I,U,m,rO,rO"))]
372 "(register_operand (operands[0], QImode)
373 || reg_or_0_operand (operands[1], QImode))"
374 "@
375 move\t%0, %r1
376 movei\t%0, %1
377 lb_u\t%0, %1
378 lbadd_u\t%0, %I1, %i1
379 sb\t%0, %r1
380 sbadd\t%I0, %r1, %i0"
381 [(set_attr "type" "*,*,Y2_2cycle,X1_2cycle,Y2,X1")])
382
383 (define_expand "movhi"
384 [(set (match_operand:HI 0 "nonimmediate_operand" "")
385 (match_operand:HI 1 "nonautoinc_operand" ""))]
386 ""
387 {
388 if (tilepro_expand_mov (HImode, operands))
389 DONE;
390 })
391
392 (define_insn "*movhi_insn"
393 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,r,r,U,m")
394 (match_operand:HI 1 "move_operand" "r,I,J,U,m,rO,rO"))]
395 "(register_operand (operands[0], HImode)
396 || reg_or_0_operand (operands[1], HImode))"
397 "@
398 move\t%0, %r1
399 movei\t%0, %1
400 moveli\t%0, %1
401 lh_u\t%0, %1
402 lhadd_u\t%0, %I1, %i1
403 sh\t%0, %r1
404 shadd\t%I0, %r1, %i0"
405 [(set_attr "type" "*,*,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
406
407
408 (define_expand "movsi"
409 [(set (match_operand:SI 0 "nonimmediate_operand" "")
410 (match_operand:SI 1 "nonautoinc_operand" ""))]
411 ""
412 {
413 if (tilepro_expand_mov (SImode, operands))
414 DONE;
415 })
416
417 (define_insn "*movsi_high_insn"
418 [(set (match_operand:SI 0 "register_operand" "=r")
419 (high:SI (match_operand:SI 1 "symbolic_operand" "in")))]
420 ""
421 "auli\t%0, zero, ha16(%1)"
422 [(set_attr "type" "X01")])
423
424 (define_insn "*movsi_insn"
425 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,r,r,r,U,m")
426 (match_operand:SI 1 "move_operand" "r,I,J,K,N,P,U,m,rO,rO"))]
427 "(register_operand (operands[0], SImode)
428 || reg_or_0_operand (operands[1], SImode))"
429 "@
430 move\t%0, %r1
431 movei\t%0, %1
432 moveli\t%0, %1
433 auli\t%0, zero, %h1
434 addib\t%0, zero, %j1
435 addih\t%0, zero, %h1
436 lw\t%0, %1
437 lwadd\t%0, %I1, %i1
438 sw\t%0, %r1
439 swadd\t%I0, %r1, %i0"
440 [(set_attr "type" "*,*,X01,X01,X01,X01,Y2_2cycle,X1_2cycle,Y2,X1")])
441
442 (define_insn "movstrictqi"
443 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r"))
444 (match_operand:QI 1 "reg_or_0_operand" "rO"))]
445 ""
446 "mm\t%r0, %r1, %r0, 0, 7"
447 [(set_attr "type" "X01")])
448
449 (define_insn "movstricthi"
450 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
451 (match_operand:HI 1 "reg_or_0_operand" "rO"))]
452 ""
453 "mm\t%r0, %r1, %r0, 0, 15"
454 [(set_attr "type" "X01")])
455
456 (define_expand "movmisalign<mode>"
457 [(set (match_operand:VEC 0 "nonautoincmem_nonimmediate_operand" "")
458 (match_operand:VEC 1 "nonautoincmem_general_operand" ""))]
459 ""
460 {
461 tilepro_expand_movmisalign (<MODE>mode, operands);
462 DONE;
463 })
464
465 (define_expand "movsf"
466 [(set (match_operand:SF 0 "nonimmediate_operand" "")
467 (match_operand:SF 1 "general_operand" ""))]
468 ""
469 {
470 /* Materialize immediates using clever SImode code, but don't
471 do this after reload starts, since gen_lowpart will choke
472 during reload if given an illegitimate address. */
473 if (immediate_operand (operands[1], SFmode)
474 && operands[1] != const0_rtx
475 && (register_operand (operands[0], SFmode)
476 || (!reload_in_progress && !reload_completed)))
477 {
478 emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
479 gen_lowpart (SImode, operands[1])));
480 DONE;
481 }
482 })
483
484 (define_insn "*movsf"
485 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,U,m")
486 (match_operand:SF 1 "general_operand" "rO,U,m,rO,rO"))]
487 ""
488 "@
489 move\t%0, %r1
490 lw\t%0, %1
491 lwadd\t%0, %I1, %i1
492 sw\t%0, %r1
493 swadd\t%I0, %r1, %i0"
494 [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
495
496 (define_expand "mov<mode>"
497 [(set (match_operand:VEC 0 "nonimmediate_operand" "")
498 (match_operand:VEC 1 "general_operand" ""))]
499 ""
500 {
501 /* Materialize immediates using clever SImode code, but don't
502 do this after reload starts, since gen_lowpart will choke
503 during reload if given an illegitimate address. */
504 if (immediate_operand (operands[1], <MODE>mode)
505 && operands[1] != const0_rtx
506 && (register_operand (operands[0], <MODE>mode)
507 || (!reload_in_progress && !reload_completed)))
508 {
509 emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
510 gen_lowpart (SImode, operands[1])));
511 DONE;
512 }
513 })
514
515 (define_insn "*mov<mode>"
516 [(set (match_operand:VEC 0 "nonimmediate_operand" "=r,r,r,U,m")
517 (match_operand:VEC 1 "general_operand" "rO,U,m,rO,rO"))]
518 ""
519 "@
520 move\t%0, %r1
521 lw\t%0, %1
522 lwadd\t%0, %I1, %i1
523 sw\t%0, %r1
524 swadd\t%I0, %r1, %i0"
525 [(set_attr "type" "*,Y2_2cycle,X1_2cycle,Y2,X1")])
526
527
528 ;;
529 ;; Bit-field extracts
530 ;;
531
532 (define_expand "extv"
533 [(set (match_operand:SI 0 "register_operand" "")
534 (sign_extract:SI
535 (match_operand:QI 1 "nonautoincmem_operand" "")
536 (match_operand:SI 2 "immediate_operand" "")
537 (match_operand:SI 3 "immediate_operand" "")))]
538 ""
539 {
540 HOST_WIDE_INT bit_offset, bit_width;
541 HOST_WIDE_INT first_byte_offset, last_byte_offset;
542
543 bit_width = INTVAL (operands[2]);
544 bit_offset = INTVAL (operands[3]);
545
546 /* Reject bitfields that can be done with a normal load */
547 if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
548 FAIL;
549
550 /* The value in memory cannot span more than 4 bytes. */
551 first_byte_offset = bit_offset / BITS_PER_UNIT;
552 last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
553 if (last_byte_offset - first_byte_offset > 3)
554 FAIL;
555
556 tilepro_expand_unaligned_load (operands[0], operands[1],
557 bit_width, bit_offset, 1);
558
559 DONE;
560 })
561
562 (define_expand "extzv"
563 [(set (match_operand:SI 0 "register_operand" "")
564 (zero_extract:SI
565 (match_operand:QI 1 "nonautoincmem_operand" "")
566 (match_operand:SI 2 "immediate_operand" "")
567 (match_operand:SI 3 "immediate_operand" "")))]
568 ""
569 {
570 HOST_WIDE_INT bit_offset, bit_width;
571 HOST_WIDE_INT first_byte_offset, last_byte_offset;
572
573 bit_width = INTVAL (operands[2]);
574 bit_offset = INTVAL (operands[3]);
575
576 /* Reject bitfields that can be done with a normal load */
577 if (MEM_ALIGN (operands[1]) >= bit_offset + bit_width)
578 FAIL;
579
580 /* The value in memory cannot span more than 4 bytes. */
581 first_byte_offset = bit_offset / BITS_PER_UNIT;
582 last_byte_offset = (bit_offset + bit_width - 1) / BITS_PER_UNIT;
583 if (last_byte_offset - first_byte_offset > 3)
584 FAIL;
585
586 tilepro_expand_unaligned_load (operands[0], operands[1],
587 bit_width, bit_offset, 0);
588
589 DONE;
590 })
591
592
593 ;;
594 ;; Arithmetic ops
595 ;;
596
597 (define_insn "*s123a_insn"
598 [(set (match_operand:SI 0 "register_operand" "=r")
599 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
600 (match_operand:SI 2 "cint_248_operand" "I"))
601 (match_operand:SI 3 "reg_or_0_operand" "rO")))]
602 ""
603 "s%t2a\t%0, %r1, %r3")
604
605 (define_expand "addsi3"
606 [(set (match_operand:SI 0 "register_operand" "")
607 (plus:SI (match_operand:SI 1 "register_operand" "")
608 (match_operand:SI 2 "reg_or_cint_operand" "")))]
609 ""
610 "
611 if (tilepro_expand_addsi (operands[0], operands[1], operands[2]))
612 DONE;
613 ")
614
615 (define_insn "*addsi_high_insn"
616 [(set (match_operand:SI 0 "register_operand" "=r")
617 (plus:SI
618 (match_operand:SI 1 "reg_or_0_operand" "%rO")
619 (high:SI (match_operand:SI 2 "const_symbolic_operand" "T"))))]
620 ""
621 "auli\t%0, %r1, %H2"
622 [(set_attr "type" "X01")])
623
624 (define_insn "*addsi_lo_sum_insn"
625 [(set (match_operand:SI 0 "register_operand" "=r")
626 (lo_sum:SI
627 (match_operand:SI 1 "reg_or_0_operand" "%rO")
628 (match_operand:SI 2 "const_symbolic_operand" "T")))]
629 ""
630 "addli\t%0, %r1, %L2"
631 [(set_attr "type" "X01")])
632
633 (define_insn "*addsi3_insn"
634 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
635 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO,rO")
636 (match_operand:SI 2 "add_operand" "r,I,J,K")))]
637 ""
638 "@
639 add\t%0, %r1, %r2
640 addi\t%0, %r1, %2
641 addli\t%0, %r1, %2
642 auli\t%0, %r1, %h2"
643 [(set_attr "type" "*,*,X01,X01")])
644
645 (define_insn "subsi3"
646 [(set (match_operand:SI 0 "register_operand" "=r")
647 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
648 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
649 ""
650 "sub\t%0, %r1, %r2")
651
652 (define_insn "negsi2"
653 [(set (match_operand:SI 0 "register_operand" "=r")
654 (neg:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))]
655 ""
656 "sub\t%0, zero, %r1")
657
658 (define_insn "ssaddsi3"
659 [(set (match_operand:SI 0 "register_operand" "=r")
660 (ss_plus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
661 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
662 ""
663 "adds\t%0, %r1, %r2"
664 [(set_attr "type" "X01")])
665
666 (define_insn "sssubsi3"
667 [(set (match_operand:SI 0 "register_operand" "=r")
668 (ss_minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
669 (match_operand:SI 2 "reg_or_0_operand" "rO")))]
670 ""
671 "subs\t%0, %r1, %r2"
672 [(set_attr "type" "X01")])
673
674 ;;
675 ;; Shifts
676 ;;
677
678 ;; ashift, ashiftrt, lshiftrt, rotate.
679 (define_insn "<optab>si3"
680 [(set (match_operand:SI 0 "register_operand" "=r,r")
681 (binop_u5bit:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
682 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
683 ""
684 "@
685 <insn>i\t%0, %r1, %2
686 <insn>\t%0, %r1, %r2")
687
688
689 ;;
690 ;; Compares
691 ;;
692
693 (define_expand "cstore<mode>4"
694 [(set (match_operand:SI 0 "register_operand" "")
695 (match_operator:SI 1 "ordered_comparison_operator"
696 [(match_operand:I48MODE 2 "reg_or_cint_operand" "")
697 (match_operand:I48MODE 3 "reg_or_cint_operand" "")]))]
698 ""
699 { if (!tilepro_emit_setcc (operands, <MODE>mode)) FAIL; else DONE; })
700
701 (define_insn "insn_seq"
702 [(set (match_operand:SI 0 "register_operand" "=r,r")
703 (eq:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
704 (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))]
705 ""
706 "@
707 seqi\t%0, %r1, %2
708 seq\t%0, %r1, %r2")
709
710 (define_insn "insn_sne"
711 [(set (match_operand:SI 0 "register_operand" "=r")
712 (ne:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
713 (match_operand:SI 2 "reg_or_cint_operand" "rO")))]
714 ""
715 "sne\t%0, %r1, %r2")
716
717 (define_insn "insn_slt"
718 [(set (match_operand:SI 0 "register_operand" "=r,r")
719 (lt:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
720 (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))]
721 ""
722 "@
723 slti\t%0, %r1, %2
724 slt\t%0, %r1, %r2")
725
726 (define_insn "insn_slte"
727 [(set (match_operand:SI 0 "register_operand" "=r,r")
728 (le:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
729 (match_operand:SI 2 "reg_or_cint_operand" "L,rO")))]
730 ""
731 "@
732 slti\t%0, %r1, %P2
733 slte\t%0, %r1, %r2")
734
735 (define_insn "insn_slt_u"
736 [(set (match_operand:SI 0 "register_operand" "=r,r")
737 (ltu:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
738 (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))]
739 ""
740 "@
741 slti_u\t%0, %r1, %2
742 slt_u\t%0, %r1, %r2")
743
744 (define_insn "insn_slte_u"
745 [(set (match_operand:SI 0 "register_operand" "=r,r")
746 (leu:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
747 (match_operand:SI 2 "reg_or_cint_operand" "Q,rO")))]
748 ""
749 "@
750 slti_u\t%0, %r1, %P2
751 slte_u\t%0, %r1, %r2")
752
753
754 ;;
755 ;; Logical ops
756 ;;
757
758 (define_insn "andsi3"
759 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
760 (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO")
761 (match_operand:SI 2 "and_operand" "I,M,rO")))]
762 ""
763 "@
764 andi\t%0, %r1, %2
765 mm\t%0, %r1, zero, %M2
766 and\t%0, %r1, %r2"
767 [(set_attr "type" "*,X01,*")])
768
769 (define_insn "iorsi3"
770 [(set (match_operand:SI 0 "register_operand" "=r,r")
771 (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
772 (match_operand:SI 2 "reg_or_s8bit_operand" "I,rO")))]
773 ""
774 "@
775 ori\t%0, %r1, %2
776 or\t%0, %r1, %r2")
777
778 (define_insn "xorsi3"
779 [(set (match_operand:SI 0 "register_operand" "=r,r")
780 (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO")
781 (match_operand:SI 2 "reg_or_s8bit_operand" "rO,I")))]
782 ""
783 "@
784 xor\t%0, %r1, %r2
785 xori\t%0, %r1, %2"
786 [(set_attr "type" "*,X01")])
787
788 ;; bswap, clz, ctz, popcount
789 (define_insn "<optab>si2"
790 [(set (match_operand:SI 0 "register_operand" "=r")
791 (unop:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))]
792 ""
793 "<insn>\t%0, %r1"
794 [(set_attr "type" "Y0")])
795
796 (define_expand "ctzdi2"
797 [(set (match_operand:DI 0 "register_operand" "")
798 (ctz:DI (match_operand:DI 1 "register_operand" "")))]
799 ""
800 {
801 rtx lo, hi, ctz_lo, ctz_hi, ctz_hi_plus_32, result;
802
803 split_di (&operands[1], 1, &lo, &hi);
804 lo = force_reg (SImode, lo);
805 hi = force_reg (SImode, hi);
806
807 ctz_lo = gen_reg_rtx (SImode);
808 emit_insn (gen_ctzsi2 (ctz_lo, lo));
809
810 ctz_hi = gen_reg_rtx (SImode);
811 emit_insn (gen_ctzsi2 (ctz_hi, hi));
812
813 ctz_hi_plus_32 = gen_reg_rtx (SImode);
814 emit_insn (gen_addsi3 (ctz_hi_plus_32, ctz_hi, GEN_INT (32)));
815
816 result = gen_reg_rtx (SImode);
817 emit_insn (gen_insn_mvz (result, ctz_lo, lo, ctz_hi_plus_32));
818
819 emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
820
821 DONE;
822 })
823
824 (define_expand "clzdi2"
825 [(set (match_operand:DI 0 "register_operand" "")
826 (clz:DI (match_operand:DI 1 "register_operand" "")))]
827 ""
828 {
829 rtx lo, hi, clz_lo, clz_hi, clz_lo_plus_32, result;
830
831 split_di (&operands[1], 1, &lo, &hi);
832 lo = force_reg (SImode, lo);
833 hi = force_reg (SImode, hi);
834
835 clz_lo = gen_reg_rtx (SImode);
836 emit_insn (gen_clzsi2 (clz_lo, lo));
837
838 clz_hi = gen_reg_rtx (SImode);
839 emit_insn (gen_clzsi2 (clz_hi, hi));
840
841 clz_lo_plus_32 = gen_reg_rtx (SImode);
842 emit_insn (gen_addsi3 (clz_lo_plus_32, clz_lo, GEN_INT (32)));
843
844 result = gen_reg_rtx (SImode);
845 emit_insn (gen_insn_mvz (result, clz_hi, hi, clz_lo_plus_32));
846
847 emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
848
849 DONE;
850 })
851
852 (define_expand "ffsdi2"
853 [(set (match_operand:DI 0 "register_operand" "")
854 (ffs:DI (match_operand:DI 1 "register_operand" "")))]
855 ""
856 {
857 rtx lo, hi, ctz_lo, ctz_hi, ctz_hi_plus_32, ctz, ctz_plus_1,ctz_cond;
858 rtx result;
859
860 split_di (&operands[1], 1, &lo, &hi);
861 lo = force_reg (SImode, lo);
862 hi = force_reg (SImode, hi);
863
864 ctz_lo = gen_reg_rtx (SImode);
865 emit_insn (gen_ctzsi2 (ctz_lo, lo));
866
867 ctz_hi = gen_reg_rtx (SImode);
868 emit_insn (gen_ctzsi2 (ctz_hi, hi));
869
870 ctz_hi_plus_32 = gen_reg_rtx (SImode);
871 emit_insn (gen_addsi3 (ctz_hi_plus_32, ctz_hi, GEN_INT (32)));
872
873 ctz = gen_reg_rtx (SImode);
874 emit_insn (gen_insn_mvz (ctz, ctz_lo, lo, ctz_hi_plus_32));
875
876 ctz_plus_1 = gen_reg_rtx (SImode);
877 emit_insn (gen_addsi3 (ctz_plus_1, ctz, GEN_INT (1)));
878
879 ctz_cond = gen_reg_rtx (SImode);
880 emit_insn (gen_iorsi3 (ctz_cond, lo, hi));
881
882 result = gen_reg_rtx (SImode);
883 emit_insn (gen_insn_mvz (result, ctz_plus_1, ctz_cond, const0_rtx));
884
885 emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
886
887 DONE;
888 })
889
890 (define_expand "popcountdi2"
891 [(set (match_operand:DI 0 "register_operand" "")
892 (popcount:DI (match_operand:DI 1 "nonmemory_operand" "")))]
893 ""
894 {
895 rtx lo, hi, popcount_lo, popcount_hi, result;
896
897 split_di (&operands[1], 1, &lo, &hi);
898 lo = force_reg (SImode, lo);
899 hi = force_reg (SImode, hi);
900
901 popcount_lo = gen_reg_rtx (SImode);
902 emit_insn (gen_popcountsi2 (popcount_lo, lo));
903
904 popcount_hi = gen_reg_rtx (SImode);
905 emit_insn (gen_popcountsi2 (popcount_hi, hi));
906
907 result = gen_reg_rtx (SImode);
908 emit_insn (gen_addsi3 (result, popcount_lo, popcount_hi));
909
910 emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
911
912 DONE;
913 })
914
915 (define_expand "paritysi2"
916 [(set (match_operand:SI 0 "register_operand" "")
917 (parity:SI (match_operand:SI 1 "reg_or_0_operand" "")))]
918 ""
919 {
920 operands[2] = gen_reg_rtx (SImode);
921 emit_insn (gen_popcountsi2 (operands[2], operands[1]));
922 emit_insn (gen_andsi3 (operands[0], operands[2], const1_rtx));
923 DONE;
924 })
925
926 (define_expand "paritydi2"
927 [(set (match_operand:DI 0 "register_operand" "")
928 (parity:DI (match_operand:DI 1 "nonmemory_operand" "")))]
929 ""
930 {
931 rtx lo, hi, xor_lohi, result;
932
933 split_di (&operands[1], 1, &lo, &hi);
934 lo = force_reg (SImode, lo);
935 hi = force_reg (SImode, hi);
936
937 xor_lohi = gen_reg_rtx (SImode);
938 emit_insn (gen_xorsi3 (xor_lohi, lo, hi));
939
940 result = gen_reg_rtx (SImode);
941 emit_insn (gen_paritysi2 (result, xor_lohi));
942
943 emit_move_insn (operands[0], convert_to_mode (DImode, result, 1));
944
945 DONE;
946 })
947
948 (define_insn "one_cmplsi2"
949 [(set (match_operand:SI 0 "register_operand" "=r")
950 (not:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))]
951 ""
952 "nor\t%0, %r1, zero")
953
954
955 ;;
956 ;; Conditional moves.
957 ;;
958
959 (define_expand "movsicc"
960 [(set (match_operand:SI 0 "register_operand" "")
961 (if_then_else:SI (match_operand 1 "comparison_operator" "")
962 (match_operand:SI 2 "reg_or_0_operand" "")
963 (match_operand:SI 3 "reg_or_0_operand" "")))]
964 ""
965 { operands[1] = tilepro_emit_conditional_move (operands[1]); })
966
967 (define_insn "movcc_insn"
968 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
969 (if_then_else:SI
970 (match_operator 4 "eqne_operator"
971 [(match_operand:SI 1 "reg_or_0_operand" "rO,rO,rO,rO")
972 (const_int 0)])
973 (match_operand:SI 2 "reg_or_0_operand" "rO,O,rO,0")
974 (match_operand:SI 3 "reg_or_0_operand" "O,rO,0,rO")))]
975 ""
976 "@
977 m%c4\t%0, %r1, %r2
978 m%C4\t%0, %r1, %r3
979 mv%c4\t%0, %r1, %r2
980 mv%C4\t%0, %r1, %r3"
981 [(set_attr "type" "*,*,Y0,Y0")])
982
983 (define_expand "insn_mz"
984 [(set (match_operand:SI 0 "register_operand" "")
985 (if_then_else:SI
986 (eq (match_operand:SI 1 "reg_or_0_operand" "")
987 (const_int 0))
988 (match_operand:SI 2 "reg_or_0_operand" "")
989 (const_int 0)))])
990
991 (define_expand "insn_mnz"
992 [(set (match_operand:SI 0 "register_operand" "")
993 (if_then_else:SI
994 (ne (match_operand:SI 1 "reg_or_0_operand" "")
995 (const_int 0))
996 (match_operand:SI 2 "reg_or_0_operand" "")
997 (const_int 0)))])
998
999 (define_expand "insn_mvz"
1000 [(set (match_operand:SI 0 "register_operand" "")
1001 (if_then_else:SI
1002 (eq (match_operand:SI 2 "reg_or_0_operand" "")
1003 (const_int 0))
1004 (match_operand:SI 3 "reg_or_0_operand" "")
1005 (match_operand:SI 1 "reg_or_0_operand" "")))])
1006
1007 (define_expand "insn_mvnz"
1008 [(set (match_operand:SI 0 "register_operand" "")
1009 (if_then_else:SI
1010 (ne (match_operand:SI 2 "reg_or_0_operand" "")
1011 (const_int 0))
1012 (match_operand:SI 3 "reg_or_0_operand" "")
1013 (match_operand:SI 1 "reg_or_0_operand" "")))])
1014
1015
1016 ;;
1017 ;; Conversions
1018 ;;
1019
1020 (define_insn "zero_extendqisi2"
1021 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1022 (zero_extend:SI (match_operand:QI 1 "move_operand" "rO,U,m")))]
1023 ""
1024 "@
1025 mm\t%0, %r1, zero, 0, 7
1026 lb_u\t%0, %1
1027 lbadd_u\t%0, %I1, %i1"
1028 [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
1029
1030 (define_insn "zero_extendhisi2"
1031 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1032 (zero_extend:SI (match_operand:HI 1 "move_operand" "rO,U,m")))]
1033 ""
1034 "@
1035 mm\t%0, %r1, zero, 0, 15
1036 lh_u\t%0, %1
1037 lhadd_u\t%0, %I1, %i1"
1038 [(set_attr "type" "X01,Y2_2cycle,X1_2cycle")])
1039
1040 (define_expand "extendhisi2"
1041 [(set (match_operand:SI 0 "register_operand" "")
1042 (sign_extend:SI (match_operand:HI 1 "move_operand" "")))]
1043 ""
1044 {
1045 if (!memory_operand (operands[1], HImode))
1046 {
1047 operands[1] = gen_lowpart (SImode, operands[1]);
1048 operands[2] = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0];
1049
1050 emit_move_insn (operands[2], gen_rtx_ASHIFT (SImode, operands[1],
1051 GEN_INT (16)));
1052 emit_move_insn (operands[0], gen_rtx_ASHIFTRT (SImode, operands[2],
1053 GEN_INT (16)));
1054 DONE;
1055 }
1056 })
1057
1058 (define_insn "*lh"
1059 [(set (match_operand:SI 0 "register_operand" "=r,r")
1060 (sign_extend:SI (match_operand:HI 1 "memory_operand" "U,m")))]
1061 ""
1062 "@
1063 lh\t%0, %1
1064 lhadd\t%0, %I1, %i1"
1065 [(set_attr "type" "Y2_2cycle,X1_2cycle")])
1066
1067 (define_expand "extendqisi2"
1068 [(set (match_operand:SI 0 "register_operand" "")
1069 (sign_extend:SI (match_operand:QI 1 "move_operand" "")))]
1070 ""
1071 {
1072 if (!memory_operand (operands[1], QImode))
1073 {
1074 operands[1] = gen_lowpart (SImode, operands[1]);
1075 operands[2] = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0];
1076
1077 emit_move_insn (operands[2], gen_rtx_ASHIFT (SImode, operands[1],
1078 GEN_INT (24)));
1079 emit_move_insn (operands[0], gen_rtx_ASHIFTRT (SImode, operands[2],
1080 GEN_INT (24)));
1081 DONE;
1082 }
1083 })
1084
1085 (define_insn "*lb"
1086 [(set (match_operand:SI 0 "register_operand" "=r,r")
1087 (sign_extend:SI (match_operand:QI 1 "memory_operand" "U,m")))]
1088 ""
1089 "@
1090 lb\t%0, %1
1091 lbadd\t%0, %I1, %i1"
1092 [(set_attr "type" "Y2_2cycle,X1_2cycle")])
1093
1094 ;;
1095 ;; insv patterns
1096 ;;
1097 (define_expand "insv"
1098 [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "")
1099 (match_operand:SI 1 "u5bit_cint_operand" "")
1100 (match_operand:SI 2 "u5bit_cint_operand" ""))
1101 (match_operand:SI 3 "reg_or_cint_operand" ""))]
1102 ""
1103 {
1104 tilepro_expand_insv (operands);
1105 DONE;
1106 })
1107
1108 (define_insn "*insv_tblidxb0"
1109 [(set (zero_extract:SI
1110 (match_operand:SI 0 "register_operand" "+r")
1111 (const_int 8)
1112 (const_int 2))
1113 (match_operand:SI 1 "register_operand" "rO"))]
1114 ""
1115 "tblidxb0\t%0, %r1"
1116 [(set_attr "type" "Y0")])
1117
1118 (define_insn "*insv_tblidxb1"
1119 [(set (zero_extract:SI
1120 (match_operand:SI 0 "register_operand" "+r")
1121 (const_int 8)
1122 (const_int 2))
1123 (zero_extract:SI
1124 (const_int 8)
1125 (const_int 8)
1126 (match_operand:SI 1 "register_operand" "rO")))]
1127 ""
1128 "tblidxb1\t%0, %r1"
1129 [(set_attr "type" "Y0")])
1130
1131 (define_insn "*insv_tblidxb2"
1132 [(set (zero_extract:SI
1133 (match_operand:SI 0 "register_operand" "+r")
1134 (const_int 8)
1135 (const_int 2))
1136 (zero_extract:SI
1137 (const_int 8)
1138 (const_int 16)
1139 (match_operand:SI 1 "register_operand" "rO")))]
1140 ""
1141 "tblidxb2\t%0, %r1"
1142 [(set_attr "type" "Y0")])
1143
1144 (define_insn "*insv_tblidxb3"
1145 [(set (zero_extract:SI
1146 (match_operand:SI 0 "register_operand" "+r")
1147 (const_int 8)
1148 (const_int 2))
1149 (zero_extract:SI
1150 (const_int 8)
1151 (const_int 24)
1152 (match_operand:SI 1 "register_operand" "rO")))]
1153 ""
1154 "tblidxb3\t%0, %r1"
1155 [(set_attr "type" "Y0")])
1156
1157 (define_insn "*insv_mm1"
1158 [(set (zero_extract:SI
1159 (match_operand:SI 0 "register_operand" "+r")
1160 (match_operand:SI 1 "u5bit_cint_operand" "n")
1161 (const_int 0))
1162 (match_operand:SI 2 "register_operand" "rO"))]
1163 ""
1164 "mm\t%0, %r2, %0, 0, %1-1"
1165 [(set_attr "type" "X01")])
1166
1167 (define_insn "*insv_mm2"
1168 [(set (zero_extract:SI
1169 (match_operand:SI 0 "register_operand" "+r")
1170 (match_operand:SI 1 "u5bit_cint_operand" "n")
1171 (match_operand:SI 2 "u5bit_cint_operand" "n"))
1172 (zero_extract:SI
1173 (match_operand:SI 3 "register_operand" "rO")
1174 (match_dup 1)
1175 (match_dup 2)))]
1176 ""
1177 "mm\t%0, %r3, %0, %2, %2+%1-1"
1178 [(set_attr "type" "X01")])
1179
1180
1181 ;;
1182 ;; Multiplies
1183 ;;
1184
1185 (define_expand "mulsi3"
1186 [(set (match_operand:SI 0 "register_operand" "=r")
1187 (mult:SI (zero_extend:SI
1188 (subreg:HI (match_operand:SI 1 "nonmemory_operand" "") 0))
1189 (zero_extend:SI
1190 (subreg:HI (match_operand:SI 2 "nonmemory_operand" "") 0))))
1191 (set (match_dup 0)
1192 (unspec:SI [(match_dup 0) (match_dup 1) (match_dup 2)]
1193 UNSPEC_INSN_MULHLSA_UU))
1194 (set (match_dup 0)
1195 (unspec:SI [(match_dup 0) (match_dup 2) (match_dup 1)]
1196 UNSPEC_INSN_MULHLSA_UU))]
1197 ""
1198 {
1199 operands[1] = force_reg (SImode, operands[1]);
1200 operands[1] = make_safe_from (operands[1], operands[0]);
1201
1202 if (tilepro_expand_mulsi (operands[0], operands[1], operands[2]))
1203 DONE;
1204 else
1205 {
1206 operands[2] = force_reg (SImode, operands[2]);
1207 operands[2] = make_safe_from (operands[2], operands[0]);
1208 }
1209 })
1210
1211 (define_insn "mulhisi3"
1212 [(set (match_operand:SI 0 "register_operand" "=r")
1213 (mult:SI (sign_extend:SI
1214 (match_operand:HI 1 "reg_or_0_operand" "rO"))
1215 (sign_extend:SI
1216 (match_operand:HI 2 "reg_or_0_operand" "rO"))))]
1217 ""
1218 "mulll_ss\t%0, %r1, %r2"
1219 [(set_attr "type" "Y0_2cycle")])
1220
1221 (define_insn "umulhisi3"
1222 [(set (match_operand:SI 0 "register_operand" "=r")
1223 (mult:SI (zero_extend:SI
1224 (match_operand:HI 1 "reg_or_0_operand" "rO"))
1225 (zero_extend:SI
1226 (match_operand:HI 2 "reg_or_0_operand" "rO"))))]
1227 ""
1228 "mulll_uu\t%0, %r1, %r2"
1229 [(set_attr "type" "Y0_2cycle")])
1230
1231 (define_insn "usmulhisi3"
1232 [(set (match_operand:SI 0 "register_operand" "=r")
1233 (mult:SI (zero_extend:SI
1234 (match_operand:HI 1 "reg_or_0_operand" "rO"))
1235 (sign_extend:SI
1236 (match_operand:HI 2 "reg_or_0_operand" "rO"))))]
1237 ""
1238 "mulll_su\t%0, %r2, %r1"
1239 [(set_attr "type" "X0_2cycle")])
1240
1241 (define_insn "maddhisi4"
1242 [(set (match_operand:SI 0 "register_operand" "=r")
1243 (plus:SI
1244 (mult:SI (sign_extend:SI
1245 (match_operand:HI 1 "reg_or_0_operand" "rO"))
1246 (sign_extend:SI
1247 (match_operand:HI 2 "reg_or_0_operand" "rO")))
1248 (match_operand:SI 3 "register_operand" "0")))]
1249 ""
1250 "mullla_ss\t%0, %r1, %r2"
1251 [(set_attr "type" "Y0_2cycle")])
1252
1253 (define_insn "umaddhisi4"
1254 [(set (match_operand:SI 0 "register_operand" "=r")
1255 (plus:SI
1256 (mult:SI (zero_extend:SI
1257 (match_operand:HI 1 "reg_or_0_operand" "rO"))
1258 (zero_extend:SI
1259 (match_operand:HI 2 "reg_or_0_operand" "rO")))
1260 (match_operand:SI 3 "register_operand" "0")))]
1261 ""
1262 "mullla_uu\t%0, %r1, %r2"
1263 [(set_attr "type" "Y0_2cycle")])
1264
1265
1266 (define_insn "mulqihi3"
1267 [(set (match_operand:HI 0 "register_operand" "=r")
1268 (mult:HI (sign_extend:HI
1269 (match_operand:QI 1 "reg_or_0_operand" "rO"))
1270 (sign_extend:HI
1271 (match_operand:QI 2 "reg_or_0_operand" "rO"))))]
1272 ""
1273 "mulll_ss\t%0, %r1, %r2"
1274 [(set_attr "type" "Y0_2cycle")])
1275
1276 (define_insn "umulqihi3"
1277 [(set (match_operand:HI 0 "register_operand" "=r")
1278 (mult:HI (zero_extend:HI
1279 (match_operand:QI 1 "reg_or_0_operand" "rO"))
1280 (zero_extend:HI
1281 (match_operand:QI 2 "reg_or_0_operand" "rO"))))]
1282 ""
1283 "mulll_uu\t%0, %r1, %r2"
1284 [(set_attr "type" "Y0_2cycle")])
1285
1286 (define_expand "smulsi3_highpart"
1287 [(set (match_operand:SI 0 "register_operand" "")
1288 (truncate:SI
1289 (ashiftrt:DI
1290 (mult:DI (sign_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
1291 (sign_extend:DI (match_operand:SI 2 "reg_or_0_operand" "")))
1292 (const_int 32))))]
1293 ""
1294 {
1295 tilepro_expand_smulsi3_highpart (operands[0], operands[1], operands[2]);
1296 DONE;
1297 })
1298
1299 (define_expand "umulsi3_highpart"
1300 [(set (match_operand:SI 0 "register_operand" "")
1301 (truncate:SI
1302 (lshiftrt:DI
1303 (mult:DI (zero_extend:DI (match_operand:SI 1 "reg_or_0_operand" ""))
1304 (zero_extend:DI (match_operand:SI 2 "reg_or_0_operand" "")))
1305 (const_int 32))))]
1306 ""
1307 {
1308 tilepro_expand_umulsi3_highpart (operands[0], operands[1], operands[2]);
1309 DONE;
1310 })
1311
1312
1313 ;;
1314 ;; Loops
1315 ;;
1316
1317 ;; Define the subtract-one-and-jump insns so loop.c knows what to
1318 ;; generate.
1319 (define_expand "doloop_end"
1320 [(use (match_operand 0 "" "")) ;; loop pseudo
1321 (use (match_operand 1 "" ""))] ;; label
1322 ""
1323 {
1324 if (optimize > 0)
1325 {
1326 rtx s0;
1327 rtx bcomp;
1328 rtx loc_ref;
1329
1330 /* only deal with loop counters in SImode */
1331 if (GET_MODE (operands[0]) != SImode)
1332 FAIL;
1333
1334 s0 = operands [0];
1335
1336 emit_move_insn (s0, gen_rtx_PLUS (SImode, s0, GEN_INT (-1)));
1337 bcomp = gen_rtx_NE(SImode, s0, const0_rtx);
1338 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [1]);
1339 emit_jump_insn (gen_rtx_SET (pc_rtx,
1340 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
1341 loc_ref, pc_rtx)));
1342 DONE;
1343 }
1344 else
1345 FAIL;
1346
1347 })
1348
1349 ;;
1350 ;; Prologue/epilogue
1351 ;;
1352 (define_expand "prologue"
1353 [(const_int 0)]
1354 ""
1355 {
1356 tilepro_expand_prologue ();
1357 DONE;
1358 })
1359
1360 (define_expand "epilogue"
1361 [(const_int 0)]
1362 ""
1363 {
1364 tilepro_expand_epilogue (false);
1365 DONE;
1366 })
1367
1368 (define_expand "sibcall_epilogue"
1369 [(const_int 0)]
1370 ""
1371 {
1372 tilepro_expand_epilogue (true);
1373 DONE;
1374 })
1375
1376 ;;
1377 ;; Stack manipulations
1378 ;;
1379
1380 ;; An insn to allocate new stack space for dynamic use (e.g., alloca).
1381 (define_expand "allocate_stack"
1382 [(set (match_operand 0 "register_operand" "")
1383 (minus (reg 54) (match_operand 1 "nonmemory_operand" "")))
1384 (set (reg 54)
1385 (minus (reg 54) (match_dup 1)))]
1386 ""
1387 "tilepro_allocate_stack (operands[0], operands[1]); DONE;")
1388
1389 ;;
1390 ;; Branches
1391 ;;
1392 (define_expand "call"
1393 [(parallel [(call (match_operand:SI 0 "call_operand" "")
1394 (match_operand 1 "" ""))
1395 (use (reg:SI 54))
1396 (clobber (reg:SI 55))])]
1397 ""
1398 "")
1399
1400 (define_insn "*call_insn"
1401 [(call (mem:SI (match_operand:SI 0 "call_address_operand" "rO,i"))
1402 (match_operand 1 "" ""))
1403 (use (reg:SI 54))
1404 (clobber (reg:SI 55))]
1405 ""
1406 "@
1407 jalr\t%r0
1408 jal\t%p0"
1409 [(set_attr "type" "X1,X1")])
1410
1411 (define_expand "call_value"
1412 [(parallel [(set (match_operand 0 "register_operand" "")
1413 (call (match_operand:SI 1 "call_operand" "")
1414 (match_operand 2 "" "")))
1415 (use (reg:SI 54))
1416 (clobber (reg:SI 55))])]
1417 "")
1418
1419 (define_insn "*call_value_insn"
1420 [(set (match_operand 0 "register_operand" "=r,r")
1421 (call (mem:SI (match_operand:SI 1 "call_address_operand" "rO,i"))
1422 (match_operand 2 "" "")))
1423 (use (reg:SI 54))
1424 (clobber (reg:SI 55))]
1425 ""
1426 "@
1427 jalr\t%r1
1428 jal\t%p1"
1429 [(set_attr "type" "X1,X1")])
1430
1431 (define_expand "sibcall"
1432 [(parallel [(call (match_operand:SI 0 "call_operand" "")
1433 (match_operand 1 "" ""))
1434 (use (reg:SI 54))])]
1435 ""
1436 "")
1437
1438 (define_insn "*sibcall_insn"
1439 [(call (mem:SI (match_operand:SI 0 "call_address_operand" "rO,i"))
1440 (match_operand 1 "" ""))
1441 (use (reg:SI 54))]
1442 "SIBLING_CALL_P(insn)"
1443 "@
1444 jr\t%r0
1445 j\t%p0"
1446 [(set_attr "type" "X1,X1")])
1447
1448 (define_expand "sibcall_value"
1449 [(parallel [(set (match_operand 0 "" "")
1450 (call (match_operand:SI 1 "call_operand" "")
1451 (match_operand:SI 2 "" "")))
1452 (use (reg:SI 54))])]
1453 ""
1454 "")
1455
1456 (define_insn "*sibcall_value"
1457 [(set (match_operand 0 "" "")
1458 (call (mem:SI (match_operand:SI 1 "call_address_operand" "rO,i"))
1459 (match_operand:SI 2 "" "")))
1460 (use (reg:SI 54))]
1461 "SIBLING_CALL_P(insn)"
1462 "@
1463 jr\t%r1
1464 j\t%p1"
1465 [(set_attr "type" "X1,X1")])
1466
1467 (define_insn "jump"
1468 [(set (pc) (label_ref (match_operand 0 "" "")))]
1469 ""
1470 "j\t%l0"
1471 [(set_attr "type" "X1")])
1472
1473 (define_insn "indirect_jump"
1474 [(set (pc) (match_operand:SI 0 "register_operand" "rO"))]
1475 ""
1476 "jr\t%r0"
1477 [(set_attr "type" "X1")])
1478
1479 (define_expand "return"
1480 [(parallel
1481 [(return)
1482 (use (reg:SI 55))])]
1483 "tilepro_can_use_return_insn_p ()"
1484 "")
1485
1486 (define_insn "_return"
1487 [(return)
1488 (use (reg:SI 55))]
1489 "reload_completed"
1490 "jrp\tlr"
1491 [(set_attr "type" "X1")])
1492
1493 (define_expand "tablejump"
1494 [(set (pc) (match_operand:SI 0 "register_operand" ""))
1495 (use (label_ref (match_operand 1 "" "")))]
1496 ""
1497 {
1498 tilepro_expand_tablejump (operands[0], operands[1]);
1499 DONE;
1500 })
1501
1502 (define_insn "tablejump_aux"
1503 [(set (pc) (match_operand:SI 0 "register_operand" "r"))
1504 (use (label_ref (match_operand 1 "" "")))]
1505 ""
1506 "jr\t%0"
1507 [(set_attr "type" "X1")])
1508
1509 ;; Call subroutine returning any type.
1510 (define_expand "untyped_call"
1511 [(parallel [(call (match_operand 0 "" "")
1512 (const_int 0))
1513 (match_operand 1 "" "")
1514 (match_operand 2 "" "")])]
1515 ""
1516 {
1517 int i;
1518
1519 emit_call_insn (gen_call (operands[0], const0_rtx));
1520
1521 for (i = 0; i < XVECLEN (operands[2], 0); i++)
1522 {
1523 rtx set = XVECEXP (operands[2], 0, i);
1524 emit_move_insn (SET_DEST (set), SET_SRC (set));
1525 }
1526
1527 /* The optimizer does not know that the call sets the function value
1528 registers we stored in the result block. We avoid problems by
1529 claiming that all hard registers are used and clobbered at this
1530 point. */
1531 emit_insn (gen_blockage ());
1532
1533 DONE;
1534 })
1535
1536 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers
1537 ;; and all of memory. This blocks insns from being moved across this
1538 ;; point.
1539 (define_insn "blockage"
1540 [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
1541 ""
1542 "pseudo"
1543 [(set_attr "type" "nothing")
1544 (set_attr "length" "0")])
1545
1546 ;; Internal expanders to prevent memory ops from moving around frame
1547 ;; allocation/deallocation.
1548 ;;
1549 ;; TODO: really this clobber should just clobber the frame memory. Is
1550 ;; this possibly by clobbering memory @ the sp reg (as alpha does?)
1551 ;; or by explicitly setting the alias set to the frame?
1552 (define_insn "sp_adjust"
1553 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1554 (plus:SI
1555 (match_operand:SI 1 "register_operand" "%r,r,r")
1556 (match_operand:SI 2 "add_operand" "r,I,J")))
1557 (clobber (mem:BLK (scratch)))]
1558 ""
1559 "@
1560 add\t%0, %1, %2
1561 addi\t%0, %1, %2
1562 addli\t%0, %1, %2"
1563 [(set_attr "type" "*,*,X01")])
1564
1565 ;; Used for move sp, r52, to pop a stack frame. We need to make sure
1566 ;; that stack frame memory operations have been issued before we do
1567 ;; this. TODO: see above TODO.
1568 (define_insn "sp_restore"
1569 [(set (match_operand:SI 0 "register_operand" "=r")
1570 (match_operand:SI 1 "register_operand" "r"))
1571 (clobber (mem:BLK (scratch)))]
1572 ""
1573 "move\t%0, %1")
1574
1575 (define_insn "nop"
1576 [(const_int 0)]
1577 ""
1578 "nop"
1579 [(set_attr "type" "Y01")])
1580
1581 (define_insn "trap"
1582 [(trap_if (const_int 1) (const_int 0))]
1583 ""
1584 "raise; moveli zero, 6"
1585 [(set_attr "type" "cannot_bundle")])
1586
1587
1588 ;;
1589 ;; Conditional branches
1590 ;;
1591
1592 (define_expand "cbranchsi4"
1593 [(set (pc)
1594 (if_then_else (match_operator 0 "ordered_comparison_operator"
1595 [(match_operand:SI 1 "reg_or_cint_operand")
1596 (match_operand:SI 2 "reg_or_cint_operand")])
1597 (label_ref (match_operand 3 ""))
1598 (pc)))]
1599 ""
1600 { tilepro_emit_conditional_branch (operands, SImode); DONE; })
1601
1602
1603 (define_expand "cbranchdi4"
1604 [(set (pc)
1605 (if_then_else (match_operator 0 "ordered_comparison_operator"
1606 [(match_operand:DI 1 "reg_or_cint_operand")
1607 (match_operand:DI 2 "reg_or_cint_operand")])
1608 (label_ref (match_operand 3 ""))
1609 (pc)))]
1610 ""
1611 { tilepro_emit_conditional_branch (operands, DImode); DONE; })
1612
1613
1614 (define_insn "*bcc_normal"
1615 [(set (pc)
1616 (if_then_else
1617 (match_operator 1 "signed_comparison_operator"
1618 [(match_operand:SI 2 "reg_or_0_operand" "rO")
1619 (const_int 0)])
1620 (label_ref (match_operand 0 "" ""))
1621 (pc)))]
1622 ""
1623 { return tilepro_output_cbranch (insn, operands, false); }
1624 [(set_attr "type" "X1_branch")])
1625
1626 (define_insn "*bcc_reverse"
1627 [(set (pc)
1628 (if_then_else
1629 (match_operator 1 "signed_comparison_operator"
1630 [(match_operand:SI 2 "reg_or_0_operand" "rO")
1631 (const_int 0)])
1632 (pc)
1633 (label_ref (match_operand 0 "" ""))))]
1634 ""
1635 { return tilepro_output_cbranch (insn, operands, true); }
1636 [(set_attr "type" "X1_branch")])
1637
1638 ;; FIXME: the straight forward versions which do not include the
1639 ;; subreg:QI does not match for some unknown reason.
1640 (define_insn "*bbs_normal"
1641 [(set (pc)
1642 (if_then_else
1643 (ne (zero_extract:SI (subreg:QI
1644 (match_operand:SI 1 "reg_or_0_operand" "rO") 0)
1645 (const_int 1)
1646 (const_int 0))
1647 (const_int 0))
1648 (label_ref (match_operand 0 "" ""))
1649 (pc)))]
1650 ""
1651 { return tilepro_output_cbranch_with_opcode (insn, operands, "bbs", "bbns",
1652 1, 0); }
1653 [(set_attr "type" "X1_branch")])
1654
1655 (define_insn "*bbc_normal"
1656 [(set (pc)
1657 (if_then_else
1658 (eq (zero_extract:SI (subreg:QI
1659 (match_operand:SI 1 "reg_or_0_operand" "rO") 0)
1660 (const_int 1)
1661 (const_int 0))
1662 (const_int 0))
1663 (label_ref (match_operand 0 "" ""))
1664 (pc)))]
1665 ""
1666 { return tilepro_output_cbranch_with_opcode (insn, operands, "bbns", "bbs",
1667 1, 0); }
1668 [(set_attr "type" "X1_branch")])
1669
1670 ;; Note that __insn_mf() expands to this.
1671 (define_expand "memory_barrier"
1672 [(set (match_dup 0)
1673 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
1674 ""
1675 {
1676 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
1677 MEM_VOLATILE_P (operands[0]) = 1;
1678 })
1679
1680 (define_insn "*memory_barrier"
1681 [(set (match_operand:BLK 0 "" "")
1682 (unspec_volatile:BLK [(match_dup 0)] UNSPEC_MF))]
1683 ""
1684 "mf"
1685 [(set_attr "type" "X1")])
1686
1687 (define_insn "prefetch"
1688 [(prefetch (match_operand:SI 0 "address_operand" "rO")
1689 (match_operand:SI 1 "const_int_operand" "")
1690 (match_operand:SI 2 "const_int_operand" ""))]
1691 ""
1692 "prefetch\t%r0"
1693 [(set_attr "type" "Y2")])
1694
1695
1696 ;;
1697 ;; Network intrinsics
1698 ;;
1699
1700 ;; Note the "pseudo" text is handled specially by the
1701 ;; asm_output_opcode routine. If the output is an empty string, the
1702 ;; instruction would bypass the asm_output_opcode routine, bypassing
1703 ;; the bundle handling code.
1704 (define_insn "tilepro_network_barrier"
1705 [(unspec_volatile:SI [(const_int 0)] UNSPEC_NETWORK_BARRIER)]
1706 ""
1707 "pseudo"
1708 [(set_attr "type" "nothing")
1709 (set_attr "length" "0")])
1710
1711 (define_insn "*netreg_receive"
1712 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,U,m")
1713 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i,i")
1714 (reg:SI TILEPRO_NETORDER_REG)]
1715 UNSPEC_NETWORK_RECEIVE))
1716 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1717 ""
1718 "@
1719 move\t%0, %N1
1720 sw\t%0, %N1
1721 swadd\t%I0, %N1, %i0"
1722 [(set_attr "type" "*,Y2,X1")])
1723
1724 (define_insn "*netreg_send"
1725 [(unspec_volatile:SI
1726 [(match_operand:SI 0 "netreg_operand" "i,i,i,i,i,i")
1727 (match_operand:SI 1 "reg_or_cint_operand" "rO,I,J,K,N,P")
1728 (reg:SI TILEPRO_NETORDER_REG)]
1729 UNSPEC_NETWORK_SEND)
1730 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1731 ""
1732 "@
1733 move\t%N0, %r1
1734 movei\t%N0, %1
1735 moveli\t%N0, %1
1736 auli\t%N0, zero, %h1
1737 addib\t%N0, zero, %j1
1738 addih\t%N0, zero, %h1"
1739 [(set_attr "type" "*,*,X01,X01,X01,X01")])
1740
1741 (define_insn "*netreg_copy"
1742 [(unspec_volatile:SI
1743 [(match_operand:SI 0 "netreg_operand" "i")
1744 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
1745 (reg:SI TILEPRO_NETORDER_REG)]
1746 UNSPEC_NETWORK_RECEIVE)
1747 (reg:SI TILEPRO_NETORDER_REG)]
1748 UNSPEC_NETWORK_SEND)
1749 (clobber (reg:SI TILEPRO_NETORDER_REG))
1750 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1751 ""
1752 "move %N0, %N1")
1753
1754 (define_expand "tilepro_idn0_receive"
1755 [(parallel
1756 [(set (match_operand:SI 0 "register_operand" "")
1757 (unspec_volatile:SI [(const_int TILEPRO_NETREG_IDN0)
1758 (reg:SI TILEPRO_NETORDER_REG)]
1759 UNSPEC_NETWORK_RECEIVE))
1760 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1761 "")
1762
1763 (define_expand "tilepro_idn1_receive"
1764 [(parallel
1765 [(set (match_operand:SI 0 "register_operand" "")
1766 (unspec_volatile:SI [(const_int TILEPRO_NETREG_IDN1)
1767 (reg:SI TILEPRO_NETORDER_REG)]
1768 UNSPEC_NETWORK_RECEIVE))
1769 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1770 "")
1771
1772 (define_expand "tilepro_idn_send"
1773 [(parallel
1774 [(unspec_volatile:SI [(const_int TILEPRO_NETREG_IDN0)
1775 (match_operand:SI 0 "reg_or_cint_operand" "")
1776 (reg:SI TILEPRO_NETORDER_REG)]
1777 UNSPEC_NETWORK_SEND)
1778 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1779 "")
1780
1781 (define_expand "tilepro_sn_receive"
1782 [(parallel
1783 [(set (match_operand:SI 0 "register_operand" "")
1784 (unspec_volatile:SI [(const_int TILEPRO_NETREG_SN)
1785 (reg:SI TILEPRO_NETORDER_REG)]
1786 UNSPEC_NETWORK_RECEIVE))
1787 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1788 "")
1789
1790 (define_expand "tilepro_sn_send"
1791 [(parallel
1792 [(unspec_volatile:SI [(const_int TILEPRO_NETREG_SN)
1793 (match_operand:SI 0 "reg_or_cint_operand" "")
1794 (reg:SI TILEPRO_NETORDER_REG)]
1795 UNSPEC_NETWORK_SEND)
1796 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1797 "")
1798
1799 (define_expand "tilepro_udn0_receive"
1800 [(parallel
1801 [(set (match_operand:SI 0 "register_operand" "")
1802 (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN0)
1803 (reg:SI TILEPRO_NETORDER_REG)]
1804 UNSPEC_NETWORK_RECEIVE))
1805 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1806 "")
1807
1808 (define_expand "tilepro_udn1_receive"
1809 [(parallel
1810 [(set (match_operand:SI 0 "register_operand" "")
1811 (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN1)
1812 (reg:SI TILEPRO_NETORDER_REG)]
1813 UNSPEC_NETWORK_RECEIVE))
1814 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1815 "")
1816
1817 (define_expand "tilepro_udn2_receive"
1818 [(parallel
1819 [(set (match_operand:SI 0 "register_operand" "")
1820 (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN2)
1821 (reg:SI TILEPRO_NETORDER_REG)]
1822 UNSPEC_NETWORK_RECEIVE))
1823 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1824 "")
1825
1826 (define_expand "tilepro_udn3_receive"
1827 [(parallel
1828 [(set (match_operand:SI 0 "register_operand" "")
1829 (unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN3)
1830 (reg:SI TILEPRO_NETORDER_REG)]
1831 UNSPEC_NETWORK_RECEIVE))
1832 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1833 "")
1834
1835 (define_expand "tilepro_udn_send"
1836 [(parallel
1837 [(unspec_volatile:SI [(const_int TILEPRO_NETREG_UDN0)
1838 (match_operand:SI 0 "reg_or_cint_operand" "")
1839 (reg:SI TILEPRO_NETORDER_REG)]
1840 UNSPEC_NETWORK_SEND)
1841 (clobber (reg:SI TILEPRO_NETORDER_REG))])]
1842 "")
1843
1844 (define_insn "*netreg_add_to_network"
1845 [(unspec_volatile:SI
1846 [(match_operand:SI 0 "netreg_operand" "i,i,i,i")
1847 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rO,rO,rO,rO")
1848 (match_operand:SI 2 "add_operand" "r,I,J,K"))
1849 (reg:SI TILEPRO_NETORDER_REG)]
1850 UNSPEC_NETWORK_SEND)
1851 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1852 ""
1853 "@
1854 add\t%N0, %r1, %2
1855 addi\t%N0, %r1, %2
1856 addli\t%N0, %r1, %2
1857 auli\t%N0, %r1, %h2"
1858 [(set_attr "type" "*,*,X01,X01")])
1859
1860 (define_insn "*netreg_add_from_network"
1861 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1862 (plus:SI
1863 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i,i,i")
1864 (reg:SI TILEPRO_NETORDER_REG)]
1865 UNSPEC_NETWORK_RECEIVE)
1866 (match_operand:SI 2 "add_operand" "rO,I,J,K")))
1867 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1868 ""
1869 "@
1870 add\t%0, %N1, %r2
1871 addi\t%0, %N1, %2
1872 addli\t%0, %N1, %2
1873 auli\t%0, %N1, %h2"
1874 [(set_attr "type" "*,*,X01,X01")])
1875
1876 (define_insn "*netreg_add_from_to_network"
1877 [(unspec_volatile:SI
1878 [(match_operand:SI 0 "netreg_operand" "i,i,i,i")
1879 (plus:SI
1880 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i,i,i")
1881 (reg:SI TILEPRO_NETORDER_REG)]
1882 UNSPEC_NETWORK_RECEIVE)
1883 (match_operand:SI 2 "add_operand" "rO,I,J,K"))
1884 (reg:SI TILEPRO_NETORDER_REG)]
1885 UNSPEC_NETWORK_SEND)
1886 (clobber (reg:SI TILEPRO_NETORDER_REG))
1887 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1888 ""
1889 "@
1890 add\t%N0, %N1, %r2
1891 addi\t%N0, %N1, %2
1892 addli\t%N0, %N1, %2
1893 auli\t%N0, %N1, %h2"
1894 [(set_attr "type" "*,*,X01,X01")])
1895
1896 (define_code_iterator netreg_binop
1897 [minus])
1898
1899 (define_insn "*netreg_binop_to_network"
1900 [(unspec_volatile:SI
1901 [(match_operand:SI 0 "netreg_operand" "i")
1902 (netreg_binop:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
1903 (match_operand:SI 2 "reg_or_0_operand" "rO"))
1904 (reg:SI TILEPRO_NETORDER_REG)]
1905 UNSPEC_NETWORK_SEND)
1906 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1907 ""
1908 "<insn>\t%N0, %r1, %r2")
1909
1910 (define_insn "*netreg_binop_from_network0"
1911 [(set (match_operand:SI 0 "register_operand" "=r")
1912 (netreg_binop:SI
1913 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
1914 (reg:SI TILEPRO_NETORDER_REG)]
1915 UNSPEC_NETWORK_RECEIVE)
1916 (match_operand:SI 2 "reg_or_0_operand" "rO")))
1917 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1918 ""
1919 "<insn>\t%0, %N1, %r2")
1920
1921 (define_insn "*netreg_binop_from_network1"
1922 [(set (match_operand:SI 0 "register_operand" "=r")
1923 (netreg_binop:SI
1924 (match_operand:SI 1 "reg_or_0_operand" "rO")
1925 (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
1926 (reg:SI TILEPRO_NETORDER_REG)]
1927 UNSPEC_NETWORK_RECEIVE)))
1928 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1929 ""
1930 "<insn>\t%0, %r1, %N2")
1931
1932 (define_insn "*netreg_binop_from_to_network0"
1933 [(unspec_volatile:SI
1934 [(match_operand:SI 0 "netreg_operand" "i")
1935 (netreg_binop:SI
1936 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
1937 (reg:SI TILEPRO_NETORDER_REG)]
1938 UNSPEC_NETWORK_RECEIVE)
1939 (match_operand:SI 2 "reg_or_0_operand" "rO"))
1940 (reg:SI TILEPRO_NETORDER_REG)]
1941 UNSPEC_NETWORK_SEND)
1942 (clobber (reg:SI TILEPRO_NETORDER_REG))
1943 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1944 ""
1945 "<insn>\t%N0, %N1, %r2")
1946
1947 (define_insn "*netreg_binop_from_to_network1"
1948 [(unspec_volatile:SI
1949 [(match_operand:SI 0 "netreg_operand" "i")
1950 (netreg_binop:SI
1951 (match_operand:SI 1 "reg_or_0_operand" "rO")
1952 (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
1953 (reg:SI TILEPRO_NETORDER_REG)]
1954 UNSPEC_NETWORK_RECEIVE))
1955 (reg:SI TILEPRO_NETORDER_REG)]
1956 UNSPEC_NETWORK_SEND)
1957 (clobber (reg:SI TILEPRO_NETORDER_REG))
1958 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1959 ""
1960 "<insn>\t%N0, %r1, %N2")
1961
1962 (define_insn "*netreg_binop_to_network"
1963 [(unspec_volatile:SI
1964 [(match_operand:SI 0 "netreg_operand" "i,i")
1965 (binop_with_imm:SI (match_operand:SI 1 "reg_or_0_operand" "rO,rO")
1966 (match_operand:SI 2 "reg_or_cint_operand" "I,rO"))
1967 (reg:SI TILEPRO_NETORDER_REG)]
1968 UNSPEC_NETWORK_SEND)
1969 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1970 ""
1971 "@
1972 <insn>i<u>\t%N0, %r1, %2
1973 <insn><u>\t%N0, %r1, %r2")
1974
1975 (define_insn "*netreg_binop_from_network"
1976 [(set (match_operand:SI 0 "register_operand" "=r,r")
1977 (binop_with_imm:SI
1978 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i")
1979 (reg:SI TILEPRO_NETORDER_REG)]
1980 UNSPEC_NETWORK_RECEIVE)
1981 (match_operand:SI 2 "reg_or_cint_operand" "I,rO")))
1982 (clobber (reg:SI TILEPRO_NETORDER_REG))]
1983 ""
1984 "@
1985 <insn>i<u>\t%0, %N1, %2
1986 <insn><u>\t%0, %N1, %r2")
1987
1988 (define_insn "*netreg_binop_from_to_network"
1989 [(unspec_volatile:SI
1990 [(match_operand:SI 0 "netreg_operand" "i,i")
1991 (binop_with_imm:SI
1992 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i,i")
1993 (reg:SI TILEPRO_NETORDER_REG)]
1994 UNSPEC_NETWORK_RECEIVE)
1995 (match_operand:SI 2 "reg_or_cint_operand" "I,rO"))
1996 (reg:SI TILEPRO_NETORDER_REG)]
1997 UNSPEC_NETWORK_SEND)
1998 (clobber (reg:SI TILEPRO_NETORDER_REG))
1999 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2000 ""
2001 "@
2002 <insn>i<u>\t%N0, %N1, %2
2003 <insn><u>\t%N0, %N1, %r2")
2004
2005 (define_insn "*netreg_unop_to_network"
2006 [(unspec_volatile:SI [(match_operand:SI 0 "netreg_operand" "i")
2007 (unop:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))
2008 (reg:SI TILEPRO_NETORDER_REG)]
2009 UNSPEC_NETWORK_SEND)
2010 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2011 ""
2012 "<insn>\t%N0, %r1"
2013 [(set_attr "type" "Y0")])
2014
2015 (define_insn "*netreg_unop_from_network"
2016 [(set (match_operand:SI 0 "register_operand" "=r")
2017 (unop:SI
2018 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
2019 (reg:SI TILEPRO_NETORDER_REG)]
2020 UNSPEC_NETWORK_RECEIVE)))
2021 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2022 ""
2023 "<insn>\t%0, %N1"
2024 [(set_attr "type" "Y0")])
2025
2026 (define_insn "*netreg_unop_from_to_network"
2027 [(unspec_volatile:SI
2028 [(match_operand:SI 0 "netreg_operand" "i")
2029 (unop:SI
2030 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
2031 (reg:SI TILEPRO_NETORDER_REG)]
2032 UNSPEC_NETWORK_RECEIVE))
2033 (reg:SI TILEPRO_NETORDER_REG)]
2034 UNSPEC_NETWORK_SEND)
2035 (clobber (reg:SI TILEPRO_NETORDER_REG))
2036 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2037 ""
2038 "<insn>\t%N0, %N1"
2039 [(set_attr "type" "Y0")])
2040
2041 (define_insn "*netreg_sadh_u_from_network0"
2042 [(set (match_operand:SI 0 "register_operand" "=r")
2043 (unspec:SI
2044 [(unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
2045 (reg:SI TILEPRO_NETORDER_REG)]
2046 UNSPEC_NETWORK_RECEIVE)
2047 (match_operand:SI 2 "reg_or_0_operand" "rO")]
2048 UNSPEC_INSN_SADH_U))
2049 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2050 ""
2051 "sadh_u\t%0, %N1, %r2"
2052 [(set_attr "type" "X0_2cycle")])
2053
2054 (define_insn "*netreg_sadh_u_from_network1"
2055 [(set (match_operand:SI 0 "register_operand" "=r")
2056 (unspec:SI
2057 [(match_operand:SI 1 "reg_or_0_operand" "rO")
2058 (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
2059 (reg:SI TILEPRO_NETORDER_REG)]
2060 UNSPEC_NETWORK_RECEIVE)]
2061 UNSPEC_INSN_SADH_U))
2062 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2063 ""
2064 "sadh_u\t%0, %r1, %N2"
2065 [(set_attr "type" "X0_2cycle")])
2066
2067 (define_insn "*netreg_sadah_u_from_network0"
2068 [(set (match_operand:SI 0 "register_operand" "=r")
2069 (unspec:SI
2070 [(match_operand:SI 1 "reg_or_0_operand" "0")
2071 (unspec_volatile:SI [(match_operand:SI 2 "netreg_operand" "i")
2072 (reg:SI TILEPRO_NETORDER_REG)]
2073 UNSPEC_NETWORK_RECEIVE)
2074 (match_operand:SI 3 "reg_or_0_operand" "rO")]
2075 UNSPEC_INSN_SADAH_U))
2076 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2077 ""
2078 "sadah_u\t%0, %N2, %r3"
2079 [(set_attr "type" "X0_2cycle")])
2080
2081 (define_insn "*netreg_sadah_u_from_network1"
2082 [(set (match_operand:SI 0 "register_operand" "=r")
2083 (unspec:SI
2084 [(match_operand:SI 1 "reg_or_0_operand" "0")
2085 (match_operand:SI 2 "reg_or_0_operand" "rO")
2086 (unspec_volatile:SI [(match_operand:SI 3 "netreg_operand" "i")
2087 (reg:SI TILEPRO_NETORDER_REG)]
2088 UNSPEC_NETWORK_RECEIVE)]
2089 UNSPEC_INSN_SADAH_U))
2090 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2091 ""
2092 "sadah_u\t%0, %r2, %N3"
2093 [(set_attr "type" "X0_2cycle")])
2094
2095 (define_code_iterator mm_combiner [ior xor plus])
2096
2097 ;; This doesn't seem to match -- too complex for 'combine'?
2098 ;;
2099 ;; (define_insn "*netreg_mm_to_network"
2100 ;; [(unspec_volatile:SI
2101 ;; [(match_operand:SI 0 "netreg_operand" "i")
2102 ;; (mm_combiner:SI
2103 ;; (and:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
2104 ;; (match_operand:SI 3 "const_int_operand" "n"))
2105 ;; (and:SI (match_operand:SI 2 "reg_or_0_operand" "rO")
2106 ;; (match_operand:SI 4 "const_int_operand" "n")))]
2107 ;; UNSPEC_NETWORK_SEND)]
2108 ;; "tilepro_bitfield_operand_p (INTVAL (operands[3]), NULL, NULL)
2109 ;; && INTVAL (operands[3]) == ~INTVAL (operands[4])"
2110 ;; "mm\t%N0, %r1, %r2, %M3"
2111 ;; [(set_attr "type" "X01")])
2112
2113 ;; FIXME: the straight forward versions which do not include the
2114 ;; subreg:QI does not match for some unknown reason.
2115 (define_insn "*netreg_bbs_normal"
2116 [(set (pc)
2117 (if_then_else
2118 (ne (zero_extract:SI
2119 (subreg:QI
2120 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
2121 (reg:SI TILEPRO_NETORDER_REG)]
2122 UNSPEC_NETWORK_RECEIVE) 0)
2123 (const_int 1)
2124 (const_int 0))
2125 (const_int 0))
2126 (label_ref (match_operand 0 "" ""))
2127 (pc)))
2128 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2129 ""
2130 { return tilepro_output_cbranch_with_opcode (insn, operands, "bbs", "bbns",
2131 1, 1); }
2132 [(set_attr "type" "X1_branch")])
2133
2134 (define_insn "*netreg_bbc_normal"
2135 [(set (pc)
2136 (if_then_else
2137 (eq (zero_extract:SI
2138 (subreg:QI
2139 (unspec_volatile:SI [(match_operand:SI 1 "netreg_operand" "i")
2140 (reg:SI TILEPRO_NETORDER_REG)]
2141 UNSPEC_NETWORK_RECEIVE) 0)
2142 (const_int 1)
2143 (const_int 0))
2144 (const_int 0))
2145 (label_ref (match_operand 0 "" ""))
2146 (pc)))
2147 (clobber (reg:SI TILEPRO_NETORDER_REG))]
2148 ""
2149 { return tilepro_output_cbranch_with_opcode (insn, operands, "bbns", "bbns",
2150 1, 1); }
2151 [(set_attr "type" "X1_branch")])
2152
2153
2154 ;;
2155 ;; "__insn" Intrinsics (some expand directly to normal patterns above).
2156 ;;
2157
2158 (define_insn "insn_addlis"
2159 [(set (match_operand:SI 0 "register_operand" "=r")
2160 (unspec_volatile:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
2161 (match_operand:SI 2 "s16bit_cint_operand" "i")]
2162 UNSPEC_INSN_ADDLIS))]
2163 ""
2164 "addlis\t%0, %r1, %2"
2165 [(set_attr "type" "X01")])
2166
2167 (define_insn "insn_auli"
2168 [(set (match_operand:SI 0 "register_operand" "=r")
2169 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
2170 (match_operand:SI 2 "s16bit_cint_operand" "i")]
2171 UNSPEC_INSN_AULI))]
2172 ""
2173 "auli\t%0, %r1, %2"
2174 [(set_attr "type" "X01")])
2175
2176 (define_insn "insn_drain"
2177 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_DRAIN)]
2178 ""
2179 "drain"
2180 [(set_attr "type" "cannot_bundle")])
2181
2182 (define_insn "insn_icoh"
2183 [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
2184 UNSPEC_INSN_ICOH)]
2185 ""
2186 "icoh\t%r0"
2187 [(set_attr "type" "X1")])
2188
2189
2190 (define_insn "insn_info"
2191 [(unspec_volatile:VOID [(match_operand:SI 0 "s8bit_cint_operand" "i")]
2192 UNSPEC_INSN_INFO)]
2193 ""
2194 "info\t%0")
2195
2196 (define_insn "insn_infol"
2197 [(unspec_volatile:VOID [(match_operand:SI 0 "s16bit_cint_operand" "i")]
2198 UNSPEC_INSN_INFOL)]
2199 ""
2200 "infol\t%0"
2201 [(set_attr "type" "X01")])
2202
2203 ;; loads
2204
2205 (define_expand "insn_<load>"
2206 [(set (match_operand:SI 0 "register_operand" "")
2207 (sign_extend:SI
2208 (mem:I12MODE (match_operand:SI 1 "address_operand" ""))))]
2209 "")
2210
2211 (define_expand "insn_<load>_u"
2212 [(set (match_operand:SI 0 "register_operand" "")
2213 (zero_extend:SI
2214 (mem:I12MODE (match_operand:SI 1 "address_operand" ""))))]
2215 "")
2216
2217 (define_insn "insn_<load>add"
2218 [(set (match_operand:SI 1 "register_operand" "=r")
2219 (plus:SI (match_operand:SI 3 "register_operand" "1")
2220 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2221 (set (match_operand:SI 0 "register_operand" "=r")
2222 (sign_extend:SI (mem:I12MODE (match_dup 3))))]
2223 ""
2224 "<load>add\t%0, %1, %2"
2225 [(set_attr "type" "X1_2cycle")])
2226
2227 (define_insn "insn_<load>add_u"
2228 [(set (match_operand:SI 1 "register_operand" "=r")
2229 (plus:SI (match_operand:SI 3 "register_operand" "1")
2230 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2231 (set (match_operand:SI 0 "register_operand" "=r")
2232 (zero_extend:SI (mem:I12MODE (match_dup 3))))]
2233 ""
2234 "<load>add_u\t%0, %1, %2"
2235 [(set_attr "type" "X1_2cycle")])
2236
2237 (define_expand "insn_lw"
2238 [(set (match_operand:SI 0 "register_operand" "")
2239 (mem:SI (match_operand:SI 1 "address_operand" "")))]
2240 "")
2241
2242 (define_insn "insn_lwadd"
2243 [(set (match_operand:SI 1 "register_operand" "=r")
2244 (plus:SI (match_operand:SI 3 "register_operand" "1")
2245 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2246 (set (match_operand:SI 0 "register_operand" "=r")
2247 (mem:SI (match_dup 3)))]
2248 ""
2249 "lwadd\t%0, %1, %2"
2250 [(set_attr "type" "X1_2cycle")])
2251
2252 (define_insn "insn_lwadd_na"
2253 [(set (match_operand:SI 1 "register_operand" "=r")
2254 (plus:SI (match_operand:SI 3 "register_operand" "1")
2255 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2256 (set (match_operand:SI 0 "register_operand" "=r")
2257 (mem:SI (and:SI (match_dup 3) (const_int -4))))]
2258 ""
2259 "lwadd_na\t%0, %1, %2"
2260 [(set_attr "type" "X1_2cycle")])
2261
2262 (define_insn "insn_lw_na"
2263 [(set (match_operand:SI 0 "register_operand" "=r")
2264 (mem:SI (and:SI (match_operand:SI 1 "address_operand" "rO")
2265 (const_int -4))))]
2266 ""
2267 "lw_na\t%0, %r1"
2268 [(set_attr "type" "X1_2cycle")])
2269
2270 ;; L2 hits
2271
2272 (define_insn "insn_<load>_L2"
2273 [(set (match_operand:SI 0 "register_operand" "=r")
2274 (sign_extend:SI
2275 (unspec:I12MODE
2276 [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
2277 UNSPEC_LATENCY_L2)))]
2278 ""
2279 "<load>\t%0, %r1"
2280 [(set_attr "type" "Y2_L2")])
2281
2282 (define_insn "insn_<load>_u_L2"
2283 [(set (match_operand:SI 0 "register_operand" "=r")
2284 (zero_extend:SI
2285 (unspec:I12MODE
2286 [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
2287 UNSPEC_LATENCY_L2)))]
2288 ""
2289 "<load>_u\t%0, %r1"
2290 [(set_attr "type" "Y2_L2")])
2291
2292 (define_insn "insn_<load>add_L2"
2293 [(set (match_operand:SI 1 "register_operand" "=r")
2294 (plus:SI (match_operand:SI 3 "register_operand" "1")
2295 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2296 (set (match_operand:SI 0 "register_operand" "=r")
2297 (sign_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
2298 UNSPEC_LATENCY_L2)))]
2299 ""
2300 "<load>add\t%0, %1, %2"
2301 [(set_attr "type" "X1_L2")])
2302
2303 (define_insn "insn_<load>add_u_L2"
2304 [(set (match_operand:SI 1 "register_operand" "=r")
2305 (plus:SI (match_operand:SI 3 "register_operand" "1")
2306 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2307 (set (match_operand:SI 0 "register_operand" "=r")
2308 (zero_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
2309 UNSPEC_LATENCY_L2)))]
2310 ""
2311 "<load>add_u\t%0, %1, %2"
2312 [(set_attr "type" "X1_L2")])
2313
2314 (define_insn "insn_lwadd_L2"
2315 [(set (match_operand:SI 1 "register_operand" "=r")
2316 (plus:SI (match_operand:SI 3 "register_operand" "1")
2317 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2318 (set (match_operand:SI 0 "register_operand" "=r")
2319 (unspec:SI [(mem:SI (match_dup 3))] UNSPEC_LATENCY_L2))]
2320 ""
2321 "lwadd\t%0, %1, %2"
2322 [(set_attr "type" "X1_L2")])
2323
2324 (define_insn "insn_lwadd_na_L2"
2325 [(set (match_operand:SI 1 "register_operand" "=r")
2326 (plus:SI (match_operand:SI 3 "register_operand" "1")
2327 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2328 (set (match_operand:SI 0 "register_operand" "=r")
2329 (unspec:SI [(mem:SI (and:SI (match_dup 3) (const_int -4)))]
2330 UNSPEC_LATENCY_L2))]
2331 ""
2332 "lwadd_na\t%0, %1, %2"
2333 [(set_attr "type" "X1_L2")])
2334
2335 (define_insn "insn_lw_na_L2"
2336 [(set (match_operand:SI 0 "register_operand" "=r")
2337 (unspec:SI [(mem:SI (and:SI (match_operand:SI 1 "address_operand" "rO")
2338 (const_int -4)))]
2339 UNSPEC_LATENCY_L2))]
2340 ""
2341 "lw_na\t%0, %r1"
2342 [(set_attr "type" "X1_L2")])
2343
2344 (define_insn "insn_lw_L2"
2345 [(set (match_operand:SI 0 "register_operand" "=r")
2346 (unspec:SI [(mem:SI (match_operand:SI 1 "address_operand" "rO"))]
2347 UNSPEC_LATENCY_L2))]
2348 ""
2349 "lw\t%0, %r1"
2350 [(set_attr "type" "Y2_L2")])
2351
2352 ;; L2 miss
2353
2354 (define_insn "insn_<load>_miss"
2355 [(set (match_operand:SI 0 "register_operand" "=r")
2356 (sign_extend:SI
2357 (unspec:I12MODE
2358 [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
2359 UNSPEC_LATENCY_MISS)))]
2360 ""
2361 "<load>\t%0, %r1"
2362 [(set_attr "type" "Y2_miss")])
2363
2364 (define_insn "insn_<load>_u_miss"
2365 [(set (match_operand:SI 0 "register_operand" "=r")
2366 (zero_extend:SI
2367 (unspec:I12MODE
2368 [(mem:I12MODE (match_operand:SI 1 "address_operand" "rO"))]
2369 UNSPEC_LATENCY_MISS)))]
2370 ""
2371 "<load>_u\t%0, %r1"
2372 [(set_attr "type" "Y2_miss")])
2373
2374 (define_insn "insn_<load>add_miss"
2375 [(set (match_operand:SI 1 "register_operand" "=r")
2376 (plus:SI (match_operand:SI 3 "register_operand" "1")
2377 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2378 (set (match_operand:SI 0 "register_operand" "=r")
2379 (sign_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
2380 UNSPEC_LATENCY_MISS)))]
2381 ""
2382 "<load>add\t%0, %1, %2"
2383 [(set_attr "type" "X1_miss")])
2384
2385 (define_insn "insn_<load>add_u_miss"
2386 [(set (match_operand:SI 1 "register_operand" "=r")
2387 (plus:SI (match_operand:SI 3 "register_operand" "1")
2388 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2389 (set (match_operand:SI 0 "register_operand" "=r")
2390 (zero_extend:SI (unspec:I12MODE [(mem:I12MODE (match_dup 3))]
2391 UNSPEC_LATENCY_MISS)))]
2392 ""
2393 "<load>add_u\t%0, %1, %2"
2394 [(set_attr "type" "X1_miss")])
2395
2396 (define_insn "insn_lwadd_miss"
2397 [(set (match_operand:SI 1 "register_operand" "=r")
2398 (plus:SI (match_operand:SI 3 "register_operand" "1")
2399 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2400 (set (match_operand:SI 0 "register_operand" "=r")
2401 (unspec:SI [(mem:SI (match_dup 3))] UNSPEC_LATENCY_MISS))]
2402 ""
2403 "lwadd\t%0, %1, %2"
2404 [(set_attr "type" "X1_miss")])
2405
2406 (define_insn "insn_lwadd_na_miss"
2407 [(set (match_operand:SI 1 "register_operand" "=r")
2408 (plus:SI (match_operand:SI 3 "register_operand" "1")
2409 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2410 (set (match_operand:SI 0 "register_operand" "=r")
2411 (unspec:SI [(mem:SI (and:SI (match_dup 3) (const_int -4)))]
2412 UNSPEC_LATENCY_MISS))]
2413 ""
2414 "lwadd_na\t%0, %1, %2"
2415 [(set_attr "type" "X1_miss")])
2416
2417 (define_insn "insn_lw_na_miss"
2418 [(set (match_operand:SI 0 "register_operand" "=r")
2419 (unspec:SI [(mem:SI (and:SI (match_operand:SI 1 "address_operand" "rO")
2420 (const_int -4)))]
2421 UNSPEC_LATENCY_MISS))]
2422 ""
2423 "lw_na\t%0, %r1"
2424 [(set_attr "type" "X1_miss")])
2425
2426 (define_insn "insn_lw_miss"
2427 [(set (match_operand:SI 0 "register_operand" "=r")
2428 (unspec:SI [(mem:SI (match_operand:SI 1 "address_operand" "rO"))]
2429 UNSPEC_LATENCY_MISS))]
2430 ""
2431 "lw\t%0, %r1"
2432 [(set_attr "type" "Y2_miss")])
2433
2434 ;; end loads
2435
2436 (define_insn "insn_mfspr"
2437 [(set (match_operand:SI 0 "register_operand" "=r")
2438 (unspec_volatile:SI [(match_operand:SI 1 "u15bit_cint_operand" "i")]
2439 UNSPEC_INSN_MFSPR))
2440 (clobber (mem:BLK (const_int 0)))]
2441 ""
2442 "mfspr\t%0, %1"
2443 [(set_attr "type" "X1")])
2444
2445 (define_insn "*mm"
2446 [(set (match_operand:SI 0 "register_operand" "=r")
2447 (mm_combiner:SI
2448 (and:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
2449 (match_operand:SI 3 "const_int_operand" "n"))
2450 (and:SI (match_operand:SI 2 "reg_or_0_operand" "rO")
2451 (match_operand:SI 4 "const_int_operand" "n"))))]
2452 "tilepro_bitfield_operand_p (INTVAL (operands[3]), NULL, NULL)
2453 && INTVAL (operands[3]) == ~INTVAL (operands[4])"
2454 "mm\t%0, %r1, %r2, %M3"
2455 [(set_attr "type" "X01")])
2456
2457 (define_expand "insn_mm"
2458 [(set (match_operand:SI 0 "register_operand" "")
2459 (ior:SI
2460 (and:SI (match_operand:SI 1 "reg_or_cint_operand" "")
2461 (match_operand:SI 3 "u5bit_cint_operand" ""))
2462 (and:SI (match_operand:SI 2 "reg_or_cint_operand" "")
2463 (match_operand:SI 4 "u5bit_cint_operand" ""))))]
2464 ""
2465 {
2466 int first, last, i;
2467 HOST_WIDE_INT mask;
2468
2469 first = INTVAL (operands[3]) & 31;
2470 last = INTVAL (operands[4]) & 31;
2471
2472 if (((last + 1) & 31) == first)
2473 {
2474 /* Handle pathological case of a mask that includes only the
2475 first operand. The reordering code below can't handle this. */
2476 emit_move_insn (operands[0], operands[1]);
2477 DONE;
2478 }
2479
2480 /* Canonicalize order by putting constant second, if any. */
2481 if (CONST_INT_P (operands[1]))
2482 {
2483 int tmp_first;
2484
2485 rtx tmp = operands[1];
2486 operands[1] = operands[2];
2487 operands[2] = tmp;
2488
2489 /* Invert the bit range. */
2490 tmp_first = first;
2491 first = (last + 1) & 31;
2492 last = (tmp_first - 1) & 31;
2493 }
2494
2495 /* Convert the first/last bit range into a bit mask. */
2496 mask = 0;
2497
2498 for (i = first; ; i = (i + 1) & 31)
2499 {
2500 mask |= ((HOST_WIDE_INT)1) << i;
2501 if (i == last)
2502 break;
2503 }
2504
2505 mask = trunc_int_for_mode (mask, SImode);
2506
2507 operands[1] = force_reg (SImode, operands[1]);
2508 operands[3] = GEN_INT (mask);
2509 operands[4] = GEN_INT (~mask);
2510
2511 if (CONST_INT_P (operands[2]))
2512 {
2513 HOST_WIDE_INT inserted_bits = INTVAL (operands[2]) & ~mask;
2514
2515 if (inserted_bits == 0)
2516 {
2517 /* All inserted bits are zero. Use a bitwise AND. */
2518 emit_insn (gen_andsi3 (operands[0], operands[1], operands[3]));
2519 DONE;
2520 }
2521 else if (inserted_bits == ~mask)
2522 {
2523 /* All inserted bits are ones. Use a bitwise IOR if we can. */
2524 if (satisfies_constraint_I (operands[4]))
2525 {
2526 emit_insn (gen_iorsi3 (operands[0], operands[1], operands[4]));
2527 DONE;
2528 }
2529
2530 /* Canonicalize to inserting -1 when setting all masked bits
2531 to 1, to facilitate CSE. */
2532 inserted_bits = -1;
2533 }
2534
2535 /* Sign extend the inserted bits to make them easier to materialize
2536 in a register, but only if the inserted bits (~mask) do not already
2537 include the high bits. */
2538 if ((~mask & 0x80000000) == 0)
2539 {
2540 int shift = sizeof (HOST_WIDE_INT) * 8 - first;
2541 inserted_bits = (inserted_bits << shift) >> shift;
2542 }
2543
2544 operands[2] = GEN_INT (inserted_bits);
2545 }
2546
2547 operands[2] = force_reg (SImode, operands[2]);
2548 })
2549
2550 (define_insn "insn_movelis"
2551 [(set (match_operand:SI 0 "register_operand" "=r")
2552 (unspec_volatile:SI [(match_operand:SI 1 "s16bit_cint_operand" "i")]
2553 UNSPEC_INSN_MOVELIS))]
2554 ""
2555 "movelis\t%0, %1"
2556 [(set_attr "type" "X01")])
2557
2558 (define_insn "insn_mtspr"
2559 [(unspec_volatile:SI [(match_operand:SI 0 "u15bit_cint_operand" "i")
2560 (match_operand:SI 1 "reg_or_0_operand" "rO")]
2561 UNSPEC_INSN_MTSPR)
2562 (clobber (mem:BLK (const_int 0)))]
2563 ""
2564 "mtspr\t%0, %r1"
2565 [(set_attr "type" "X1")])
2566
2567 (define_expand "insn_prefetch"
2568 [(prefetch (match_operand:SI 0 "address_operand" "")
2569 (const_int 0)
2570 (const_int 2))])
2571
2572 (define_expand "insn_prefetch_L1"
2573 [(use (match_operand:SI 0 "address_operand" ""))]
2574 ""
2575 {
2576 /* Generate a volatile byte load to a dummy register. */
2577 rtx mem = gen_rtx_MEM (QImode, operands[0]);
2578 MEM_VOLATILE_P (mem) = 1;
2579
2580 emit_insn (gen_zero_extendqisi2 (gen_reg_rtx (SImode), mem));
2581 DONE;
2582 })
2583
2584 (define_expand "insn_s1a"
2585 [(set (match_operand:SI 0 "register_operand" "")
2586 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
2587 (const_int 2))
2588 (match_operand:SI 2 "reg_or_0_operand" "")))]
2589 "")
2590
2591 (define_expand "insn_s2a"
2592 [(set (match_operand:SI 0 "register_operand" "")
2593 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
2594 (const_int 4))
2595 (match_operand:SI 2 "reg_or_0_operand" "")))]
2596 "")
2597
2598 (define_expand "insn_s3a"
2599 [(set (match_operand:SI 0 "register_operand" "")
2600 (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
2601 (const_int 8))
2602 (match_operand:SI 2 "reg_or_0_operand" "")))]
2603 "")
2604
2605 (define_expand "insn_<store>"
2606 [(set (mem:I12MODE (match_operand:SI 0 "address_operand" ""))
2607 (match_operand:SI 1 "reg_or_0_operand" ""))]
2608 ""
2609 {
2610 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], SImode, 0);
2611 })
2612
2613 (define_expand "insn_sw"
2614 [(set (mem:SI (match_operand:SI 0 "address_operand" ""))
2615 (match_operand:SI 1 "reg_or_0_operand" ""))]
2616 "")
2617
2618 (define_expand "insn_<store>add"
2619 [(parallel
2620 [(set (match_operand:SI 0 "register_operand" "")
2621 (plus:SI (match_operand:SI 3 "register_operand" "")
2622 (match_operand:SI 2 "s8bit_cint_operand" "")))
2623 (set (mem:I12MODE (match_dup 3))
2624 (match_operand:SI 1 "reg_or_0_operand" ""))])]
2625 ""
2626 {
2627 operands[1] = simplify_gen_subreg (<MODE>mode, operands[1], SImode, 0);
2628 })
2629
2630 (define_insn "*insn_<store>add"
2631 [(set (match_operand:SI 0 "register_operand" "=r")
2632 (plus:SI (match_operand:SI 3 "register_operand" "0")
2633 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2634 (set (mem:I12MODE (match_dup 3))
2635 (match_operand:I12MODE 1 "reg_or_0_operand" "rO"))]
2636 ""
2637 "<store>add\t%0, %r1, %2"
2638 [(set_attr "type" "X1")])
2639
2640 (define_insn "insn_swadd"
2641 [(set (match_operand:SI 0 "register_operand" "=r")
2642 (plus:SI (match_operand:SI 3 "register_operand" "0")
2643 (match_operand:SI 2 "s8bit_cint_operand" "i")))
2644 (set (mem:SI (match_dup 3))
2645 (match_operand:SI 1 "reg_or_0_operand" "rO"))]
2646 ""
2647 "swadd\t%0, %r1, %2"
2648 [(set_attr "type" "X1")])
2649
2650 (define_insn "insn_wh64"
2651 [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
2652 UNSPEC_INSN_WH64)
2653 (clobber (mem:BLK (const_int 0)))]
2654 ""
2655 "wh64\t%r0"
2656 [(set_attr "type" "X1")])
2657
2658 (define_insn "insn_tns"
2659 [(set (match_operand:SI 0 "register_operand" "=r")
2660 (mem:SI (match_operand:SI 1 "reg_or_0_operand" "rO")))
2661 (set (mem:SI (match_dup 1)) (const_int 1))]
2662 ""
2663 "tns\t%0, %1"
2664 [(set_attr "type" "X1")])
2665
2666 ;; insn_addb
2667 ;; insn_addib
2668 ;; insn_maxb_u
2669 ;; insn_maxib_u
2670 ;; insn_minb_u
2671 ;; insn_minib_u
2672 ;; insn_seqb
2673 ;; insn_seqib
2674 ;; insn_sltb
2675 ;; insn_sltib
2676 ;; insn_sltb_u
2677 ;; insn_sltib_u
2678 (define_insn "<optab>v4qi3"
2679 [(set (match_operand:V4QI 0 "register_operand" "=r,r")
2680 (v1op_immed:V4QI
2681 (match_operand:V4QI 1 "reg_or_0_operand" "<comm>rO,rO")
2682 (match_operand:V4QI 2 "reg_or_v4s8bit_operand" "W,rO")))]
2683 ""
2684 "@
2685 <insn>ib<u>\t%0, %r1, %j2
2686 <insn>b<u>\t%0, %r1, %r2"
2687 [(set_attr "type" "X01,X01")])
2688
2689 (define_expand "insn_<insn>b<u>"
2690 [(set (match_operand:SI 0 "register_operand" "")
2691 (v1op_immed:V4QI
2692 (match_operand:SI 1 "reg_or_0_operand" "")
2693 (match_operand:SI 2 "reg_or_0_operand" "")))]
2694 ""
2695 {
2696 tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
2697 V4QImode, operands[1], operands[2], true);
2698 DONE;
2699 })
2700
2701 (define_expand "insn_<insn>ib<u>"
2702 [(set (match_operand:SI 0 "register_operand" "")
2703 (v1op_immed:V4QI
2704 (match_operand:SI 1 "reg_or_0_operand" "")
2705 (match_operand:SI 2 "s8bit_cint_operand" "")))]
2706 ""
2707 {
2708 /* Tile out immediate and expand to general case. */
2709 rtx n = tilepro_simd_int (operands[2], QImode);
2710 tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
2711 V4QImode, operands[1], n, true);
2712 DONE;
2713 })
2714
2715 ;; insn_shlb
2716 ;; insn_shlib
2717 ;; insn_shrb
2718 ;; insn_shrib
2719 ;; insn_srab
2720 ;; insn_sraib
2721 (define_insn "<optab>v4qi3"
2722 [(set (match_operand:V4QI 0 "register_operand" "=r,r")
2723 (any_shift:V4QI
2724 (match_operand:V4QI 1 "reg_or_0_operand" "rO,rO")
2725 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
2726 ""
2727 "@
2728 <insn>ib<u>\t%0, %r1, %2
2729 <insn>b<u>\t%0, %r1, %r2"
2730 [(set_attr "type" "X01,X01")])
2731
2732 (define_expand "insn_<insn>b<u>"
2733 [(set (match_operand:SI 0 "register_operand" "")
2734 (any_shift:V4QI
2735 (match_operand:SI 1 "reg_or_0_operand" "")
2736 (match_operand:SI 2 "reg_or_u5bit_operand" "")))]
2737 ""
2738 {
2739 tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
2740 V4QImode, operands[1], operands[2], false);
2741 DONE;
2742 })
2743
2744 ;; insn_addh
2745 ;; insn_addih
2746 ;; insn_maxh
2747 ;; insn_maxih
2748 ;; insn_minh
2749 ;; insn_minih
2750 ;; insn_seqh
2751 ;; insn_seqih
2752 ;; insn_slth
2753 ;; insn_sltih
2754 ;; insn_slth_u
2755 ;; insn_sltih_u
2756 (define_insn "<optab>v2hi3"
2757 [(set (match_operand:V2HI 0 "register_operand" "=r,r")
2758 (v2op_immed:V2HI
2759 (match_operand:V2HI 1 "reg_or_0_operand" "<comm>rO,rO")
2760 (match_operand:V2HI 2 "reg_or_v2s8bit_operand" "Y,rO")))]
2761 ""
2762 "@
2763 <insn>ih<u>\t%0, %r1, %j2
2764 <insn>h<u>\t%0, %r1, %r2"
2765 [(set_attr "type" "X01,X01")])
2766
2767 (define_expand "insn_<insn>h<u>"
2768 [(set (match_operand:SI 0 "register_operand" "")
2769 (v2op_immed:V2HI
2770 (match_operand:SI 1 "reg_or_0_operand" "")
2771 (match_operand:SI 2 "reg_or_0_operand" "")))]
2772 ""
2773 {
2774 tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
2775 V2HImode, operands[1], operands[2], true);
2776 DONE;
2777 })
2778
2779 (define_expand "insn_<insn>ih<u>"
2780 [(set (match_operand:SI 0 "register_operand" "")
2781 (v2op_immed:V2HI
2782 (match_operand:SI 1 "reg_or_0_operand" "")
2783 (match_operand:SI 2 "s8bit_cint_operand" "")))]
2784 ""
2785 {
2786 /* Tile out immediate and expand to general case. */
2787 rtx n = tilepro_simd_int (operands[2], HImode);
2788 tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
2789 V2HImode, operands[1], n, true);
2790 DONE;
2791 })
2792
2793 ;; insn_shlh
2794 ;; insn_shlih
2795 ;; insn_shrh
2796 ;; insn_shrih
2797 ;; insn_srah
2798 ;; insn_sraih
2799 (define_insn "<optab>v2hi3"
2800 [(set (match_operand:V2HI 0 "register_operand" "=r,r")
2801 (any_shift:V2HI
2802 (match_operand:V2HI 1 "reg_or_0_operand" "rO,rO")
2803 (match_operand:SI 2 "reg_or_u5bit_operand" "I,rO")))]
2804 ""
2805 "@
2806 <insn>ih<u>\t%0, %r1, %2
2807 <insn>h<u>\t%0, %r1, %r2"
2808 [(set_attr "type" "X01,X01")])
2809
2810 (define_expand "insn_<insn>h<u>"
2811 [(set (match_operand:SI 0 "register_operand" "")
2812 (any_shift:V2HI
2813 (match_operand:SI 1 "reg_or_0_operand" "")
2814 (match_operand:SI 2 "reg_or_0_operand" "")))]
2815 ""
2816 {
2817 tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
2818 V2HImode, operands[1], operands[2], false);
2819 DONE;
2820 })
2821
2822 ;; insn_addbs_u
2823 ;; insn_subbs_u
2824 ;; insn_subb
2825 ;; insn_slteb
2826 ;; insn_slteb_u
2827 ;; insn_sneb
2828 (define_insn "<optab>v4qi3"
2829 [(set (match_operand:V4QI 0 "register_operand" "=r")
2830 (v1op:V4QI
2831 (match_operand:V4QI 1 "reg_or_0_operand" "<comm>rO")
2832 (match_operand:V4QI 2 "reg_or_0_operand" "rO")))]
2833 ""
2834 "<insn>b<u>\t%0, %r1, %r2"
2835 [(set_attr "type" "X01")])
2836
2837 (define_expand "insn_<insn>b<u>"
2838 [(set (match_operand:SI 0 "register_operand" "")
2839 (v1op:V4QI
2840 (match_operand:SI 1 "reg_or_0_operand" "")
2841 (match_operand:SI 2 "reg_or_0_operand" "")))]
2842 ""
2843 {
2844 tilepro_expand_builtin_vector_binop (gen_<optab>v4qi3, V4QImode, operands[0],
2845 V4QImode, operands[1], operands[2], true);
2846 DONE;
2847 })
2848
2849 ;; insn_addhs
2850 ;; insn_subhs
2851 ;; insn_subh
2852 ;; insn_slteh
2853 ;; insn_slteh_u
2854 ;; insn_sneh
2855 (define_insn "<optab>v2hi3"
2856 [(set (match_operand:V2HI 0 "register_operand" "=r")
2857 (v2op:V2HI
2858 (match_operand:V2HI 1 "reg_or_0_operand" "<comm>rO")
2859 (match_operand:V2HI 2 "reg_or_0_operand" "rO")))]
2860 ""
2861 "<insn>h<u>\t%0, %r1, %r2"
2862 [(set_attr "type" "X01")])
2863
2864 (define_expand "insn_<insn>h<u>"
2865 [(set (match_operand:SI 0 "register_operand" "")
2866 (v2op:V2HI
2867 (match_operand:SI 1 "reg_or_0_operand" "")
2868 (match_operand:SI 2 "reg_or_0_operand" "")))]
2869 ""
2870 {
2871 tilepro_expand_builtin_vector_binop (gen_<optab>v2hi3, V2HImode, operands[0],
2872 V2HImode, operands[1], operands[2], true);
2873 DONE;
2874 })
2875
2876 ;; insn_inthb
2877
2878 ;; Byte ordering of these vectors is endian dependent. We concat
2879 ;; right-to-left for little endian. We concat and interleave in the
2880 ;; opposite way gcc's vector patterns work, so we need to reverse the
2881 ;; order of source operands.
2882
2883 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
2884 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
2885 ;; => {A3,B3,A2,B2}
2886 (define_insn "vec_interleave_highv4qi"
2887 [(set (match_operand:V4QI 0 "register_operand" "=r")
2888 (vec_select:V4QI
2889 (vec_concat:V8QI (match_operand:V4QI 1 "reg_or_0_operand" "rO")
2890 (match_operand:V4QI 2 "reg_or_0_operand" "rO"))
2891 (parallel [(const_int 2) (const_int 6)
2892 (const_int 3) (const_int 7)])))]
2893 ""
2894 "inthb\t%0, %r2, %r1"
2895 [(set_attr "type" "X01")])
2896
2897 (define_expand "insn_inthb"
2898 [(match_operand:SI 0 "register_operand" "")
2899 (match_operand:SI 1 "reg_or_0_operand" "")
2900 (match_operand:SI 2 "reg_or_0_operand" "")]
2901 ""
2902 {
2903 /* Our instruction interleaves opposite of the way vec_interleave
2904 works, so we need to reverse the source operands. */
2905 tilepro_expand_builtin_vector_binop (gen_vec_interleave_highv4qi, V4QImode,
2906 operands[0], V4QImode, operands[2],
2907 operands[1], true);
2908 DONE;
2909 })
2910
2911 ;; insn_intlb
2912 ;; {B3,B2,B1,B0} {A3,A2,A1,A0}
2913 ;; => {A3,A2,A1,A0,B3,B2,B1,B0}
2914 ;; => {A1,B1,A0,B0}
2915 (define_insn "vec_interleave_lowv4qi"
2916 [(set (match_operand:V4QI 0 "register_operand" "=r")
2917 (vec_select:V4QI
2918 (vec_concat:V8QI (match_operand:V4QI 1 "reg_or_0_operand" "rO")
2919 (match_operand:V4QI 2 "reg_or_0_operand" "rO"))
2920 (parallel [(const_int 0) (const_int 4)
2921 (const_int 1) (const_int 5)])))]
2922 ""
2923 "intlb\t%0, %r2, %r1"
2924 [(set_attr "type" "X01")])
2925
2926 (define_expand "insn_intlb"
2927 [(match_operand:SI 0 "register_operand" "")
2928 (match_operand:SI 1 "reg_or_0_operand" "")
2929 (match_operand:SI 2 "reg_or_0_operand" "")]
2930 ""
2931 {
2932 /* Our instruction interleaves opposite of the way vec_interleave
2933 works, so we need to reverse the source operands. */
2934 tilepro_expand_builtin_vector_binop (gen_vec_interleave_lowv4qi, V4QImode,
2935 operands[0], V4QImode, operands[2],
2936 operands[1], true);
2937 DONE;
2938 })
2939
2940 ;; insn_inthh
2941 ;; {B1,B0} {A1,A0}
2942 ;; => {A1,A0,B1,B0}
2943 ;; => {A1,B1}
2944 (define_insn "vec_interleave_highv2hi"
2945 [(set (match_operand:V2HI 0 "register_operand" "=r")
2946 (vec_select:V2HI
2947 (vec_concat:V4HI (match_operand:V2HI 1 "reg_or_0_operand" "rO")
2948 (match_operand:V2HI 2 "reg_or_0_operand" "rO"))
2949 (parallel [(const_int 1) (const_int 3)])))]
2950 ""
2951 "inthh\t%0, %r2, %r1"
2952 [(set_attr "type" "X01")])
2953
2954 (define_expand "insn_inthh"
2955 [(match_operand:SI 0 "register_operand" "")
2956 (match_operand:SI 1 "reg_or_0_operand" "")
2957 (match_operand:SI 2 "reg_or_0_operand" "")]
2958 ""
2959 {
2960 /* Our instruction interleaves opposite of the way vec_interleave
2961 works, so we need to reverse the source operands. */
2962 tilepro_expand_builtin_vector_binop (gen_vec_interleave_highv2hi, V2HImode,
2963 operands[0], V2HImode, operands[2],
2964 operands[1], true);
2965 DONE;
2966 })
2967
2968 ;; insn_intlh
2969 ;; {B1,B0} {A1,A0}
2970 ;; => {A1,A0,B1,B0}
2971 ;; => {A0,B0}
2972 (define_insn "vec_interleave_lowv2hi"
2973 [(set (match_operand:V2HI 0 "register_operand" "=r")
2974 (vec_select:V2HI
2975 (vec_concat:V4HI (match_operand:V2HI 1 "reg_or_0_operand" "rO")
2976 (match_operand:V2HI 2 "reg_or_0_operand" "rO"))
2977 (parallel [(const_int 0) (const_int 2)])))]
2978 ""
2979 "intlh\t%0, %r2, %r1"
2980 [(set_attr "type" "X01")])
2981
2982 (define_expand "insn_intlh"
2983 [(match_operand:SI 0 "register_operand" "")
2984 (match_operand:SI 1 "reg_or_0_operand" "")
2985 (match_operand:SI 2 "reg_or_0_operand" "")]
2986 ""
2987 {
2988 /* Our instruction interleaves opposite of the way vec_interleave
2989 works, so we need to reverse the source operands. */
2990 tilepro_expand_builtin_vector_binop (gen_vec_interleave_lowv2hi, V2HImode,
2991 operands[0], V2HImode, operands[2],
2992 operands[1], true);
2993 DONE;
2994 })
2995
2996 ;; insn_packbs_u
2997 ;; insn_packlb
2998 ;; {B1,B0} {A1,A0}
2999 ;; => {A1,A0,B1,B0}
3000 (define_insn "vec_pack_<pack_optab>_v2hi"
3001 [(set (match_operand:V4QI 0 "register_operand" "=r")
3002 (vec_concat:V4QI
3003 (v2pack:V2QI (match_operand:V2HI 1 "reg_or_0_operand" "rO"))
3004 (v2pack:V2QI (match_operand:V2HI 2 "reg_or_0_operand" "rO"))))]
3005 ""
3006 "<pack_insn>b<pack_u>\t%0, %r2, %r1"
3007 [(set_attr "type" "X01")])
3008
3009 (define_expand "insn_<pack_insn>b<pack_u>"
3010 [(set (match_operand:SI 0 "register_operand" "")
3011 (vec_concat:V4QI
3012 (v2pack:V2QI (match_operand:SI 1 "reg_or_0_operand" ""))
3013 (v2pack:V2QI (match_operand:SI 2 "reg_or_0_operand" ""))))]
3014 ""
3015 {
3016 /* Our instruction concats opposite of the way vec_pack works, so we
3017 need to reverse the source operands. */
3018 tilepro_expand_builtin_vector_binop (gen_vec_pack_<pack_optab>_v2hi,
3019 V4QImode, operands[0],
3020 V2HImode, operands[2], operands[1], true);
3021 DONE;
3022 })
3023
3024 ;; insn_packhb
3025 ;; {B1,B0} {A1,A0}
3026 ;; => {A1,A0,B1,B0}
3027 (define_insn "vec_pack_hipart_v2hi"
3028 [(set (match_operand:V4QI 0 "register_operand" "=r")
3029 (vec_concat:V4QI
3030 (truncate:V2QI
3031 (ashiftrt:V2HI (match_operand:V2HI 1 "reg_or_0_operand" "rO")
3032 (const_int 8)))
3033 (truncate:V2QI
3034 (ashiftrt:V2HI (match_operand:V2HI 2 "reg_or_0_operand" "rO")
3035 (const_int 8)))))]
3036 ""
3037 "packhb\t%0, %r2, %r1"
3038 [(set_attr "type" "X01")])
3039
3040 (define_expand "insn_packhb"
3041 [(set (match_operand:SI 0 "register_operand" "")
3042 (vec_concat:V4QI
3043 (truncate:V2QI
3044 (ashiftrt:V2HI (match_operand:SI 2 "reg_or_0_operand" "")
3045 (const_int 8)))
3046 (truncate:V2QI
3047 (ashiftrt:V2HI (match_operand:SI 1 "reg_or_0_operand" "")
3048 (const_int 8)))))]
3049 ""
3050 {
3051 /* Our instruction concats opposite of the way vec_pack works, so we
3052 need to reverse the source operands. */
3053 tilepro_expand_builtin_vector_binop (gen_vec_pack_hipart_v2hi,
3054 V4QImode, operands[0],
3055 V2HImode, operands[2], operands[1], true);
3056 DONE;
3057 })
3058
3059 ;; insn_packhs
3060 ;; {B0} {A0}
3061 ;; => {A0,B0}
3062 (define_insn "vec_pack_ssat_si"
3063 [(set (match_operand:V2HI 0 "register_operand" "=r")
3064 (vec_concat:V2HI
3065 (ss_truncate:HI (match_operand:SI 1 "reg_or_0_operand" "rO"))
3066 (ss_truncate:HI (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
3067 ""
3068 "packhs\t%0, %r2, %r1"
3069 [(set_attr "type" "X01")])
3070
3071 (define_expand "insn_packhs"
3072 [(set (match_operand:SI 0 "register_operand" "")
3073 (vec_concat:V2HI
3074 (ss_truncate:HI (match_operand:SI 2 "reg_or_0_operand" ""))
3075 (ss_truncate:HI (match_operand:SI 1 "reg_or_0_operand" ""))))]
3076 ""
3077 {
3078 /* Our instruction concats opposite of the way vec_pack works, so we
3079 need to reverse the source operands. */
3080 tilepro_expand_builtin_vector_binop (gen_vec_pack_ssat_si,
3081 V2HImode, operands[0],
3082 SImode, operands[2], operands[1], true);
3083 DONE;
3084 })
3085
3086 ;; Rest of the intrinsics
3087 (define_insn "insn_adiffb_u"
3088 [(set (match_operand:SI 0 "register_operand" "=r")
3089 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3090 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3091 UNSPEC_INSN_ADIFFB_U))]
3092 ""
3093 "adiffb_u\t%0, %r1, %r2"
3094 [(set_attr "type" "X0_2cycle")])
3095
3096 (define_insn "insn_adiffh"
3097 [(set (match_operand:SI 0 "register_operand" "=r")
3098 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3099 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3100 UNSPEC_INSN_ADIFFH))]
3101 ""
3102 "adiffh\t%0, %r1, %r2"
3103 [(set_attr "type" "X0_2cycle")])
3104
3105 (define_insn "insn_avgb_u"
3106 [(set (match_operand:SI 0 "register_operand" "=r")
3107 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3108 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3109 UNSPEC_INSN_AVGB_U))]
3110 ""
3111 "avgb_u\t%0, %r1, %r2"
3112 [(set_attr "type" "X0")])
3113
3114 (define_insn "insn_avgh"
3115 [(set (match_operand:SI 0 "register_operand" "=r")
3116 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3117 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3118 UNSPEC_INSN_AVGH))]
3119 ""
3120 "avgh\t%0, %r1, %r2"
3121 [(set_attr "type" "X0")])
3122
3123 (define_insn "insn_bitx"
3124 [(set (match_operand:SI 0 "register_operand" "=r")
3125 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")]
3126 UNSPEC_INSN_BITX))]
3127 ""
3128 "bitx\t%0, %r1"
3129 [(set_attr "type" "Y0")])
3130
3131 (define_insn "insn_crc32_32"
3132 [(set (match_operand:SI 0 "register_operand" "=r")
3133 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3134 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3135 UNSPEC_INSN_CRC32_32))]
3136 ""
3137 "crc32_32\t%0, %r1, %r2"
3138 [(set_attr "type" "X0")])
3139
3140 (define_insn "insn_crc32_8"
3141 [(set (match_operand:SI 0 "register_operand" "=r")
3142 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3143 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3144 UNSPEC_INSN_CRC32_8))]
3145 ""
3146 "crc32_8\t%0, %r1, %r2"
3147 [(set_attr "type" "X0")])
3148
3149 (define_insn "insn_dtlbpr"
3150 [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
3151 UNSPEC_INSN_DTLBPR)]
3152 ""
3153 "dtlbpr\t%r0"
3154 [(set_attr "type" "X1")])
3155
3156 (define_insn "insn_dword_align"
3157 [(set (match_operand:SI 0 "register_operand" "=r")
3158 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3159 (match_operand:SI 2 "reg_or_0_operand" "rO")
3160 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3161 UNSPEC_INSN_DWORD_ALIGN))]
3162 ""
3163 "dword_align\t%0, %r2, %r3"
3164 [(set_attr "type" "X0")])
3165
3166 (define_insn "insn_finv"
3167 [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
3168 UNSPEC_INSN_FINV)]
3169 ""
3170 "finv\t%r0"
3171 [(set_attr "type" "X1")])
3172
3173 (define_insn "insn_flush"
3174 [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
3175 UNSPEC_INSN_FLUSH)]
3176 ""
3177 "flush\t%r0"
3178 [(set_attr "type" "X1")])
3179
3180 (define_insn "insn_fnop"
3181 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_FNOP)]
3182 ""
3183 "fnop")
3184
3185 (define_insn "insn_ill"
3186 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_ILL)]
3187 ""
3188 "ill"
3189 [(set_attr "type" "cannot_bundle")])
3190
3191 (define_insn "insn_inv"
3192 [(unspec_volatile:VOID [(match_operand:SI 0 "reg_or_0_operand" "rO")]
3193 UNSPEC_INSN_INV)]
3194 ""
3195 "inv\t%r0"
3196 [(set_attr "type" "X1")])
3197
3198 (define_insn "insn_lnk"
3199 [(set (match_operand:SI 0 "register_operand" "=r")
3200 (unspec:SI [(const_int 0)] UNSPEC_INSN_LNK))]
3201 ""
3202 "lnk\t%0"
3203 [(set_attr "type" "X1")])
3204
3205 (define_insn "insn_mnzb"
3206 [(set (match_operand:SI 0 "register_operand" "=r")
3207 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3208 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3209 UNSPEC_INSN_MNZB))]
3210 ""
3211 "mnzb\t%0, %r1, %r2"
3212 [(set_attr "type" "X01")])
3213
3214 (define_insn "insn_mnzh"
3215 [(set (match_operand:SI 0 "register_operand" "=r")
3216 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3217 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3218 UNSPEC_INSN_MNZH))]
3219 ""
3220 "mnzh\t%0, %r1, %r2"
3221 [(set_attr "type" "X01")])
3222
3223 (define_insn "insn_mulhh_ss"
3224 [(set (match_operand:SI 0 "register_operand" "=r")
3225 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3226 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3227 UNSPEC_INSN_MULHH_SS))]
3228 ""
3229 "mulhh_ss\t%0, %r1, %r2"
3230 [(set_attr "type" "Y0_2cycle")])
3231
3232 (define_insn "insn_mulhh_su"
3233 [(set (match_operand:SI 0 "register_operand" "=r")
3234 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3235 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3236 UNSPEC_INSN_MULHH_SU))]
3237 ""
3238 "mulhh_su\t%0, %r1, %r2"
3239 [(set_attr "type" "X0_2cycle")])
3240
3241 (define_insn "insn_mulhh_uu"
3242 [(set (match_operand:SI 0 "register_operand" "=r")
3243 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3244 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3245 UNSPEC_INSN_MULHH_UU))]
3246 ""
3247 "mulhh_uu\t%0, %r1, %r2"
3248 [(set_attr "type" "Y0_2cycle")])
3249
3250 (define_insn "insn_mulhha_ss"
3251 [(set (match_operand:SI 0 "register_operand" "=r")
3252 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3253 (match_operand:SI 2 "reg_or_0_operand" "rO")
3254 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3255 UNSPEC_INSN_MULHHA_SS))]
3256 ""
3257 "mulhha_ss\t%0, %r2, %r3"
3258 [(set_attr "type" "Y0_2cycle")])
3259
3260 (define_insn "insn_mulhha_su"
3261 [(set (match_operand:SI 0 "register_operand" "=r")
3262 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3263 (match_operand:SI 2 "reg_or_0_operand" "rO")
3264 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3265 UNSPEC_INSN_MULHHA_SU))]
3266 ""
3267 "mulhha_su\t%0, %r2, %r3"
3268 [(set_attr "type" "X0_2cycle")])
3269
3270 (define_insn "insn_mulhha_uu"
3271 [(set (match_operand:SI 0 "register_operand" "=r")
3272 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3273 (match_operand:SI 2 "reg_or_0_operand" "rO")
3274 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3275 UNSPEC_INSN_MULHHA_UU))]
3276 ""
3277 "mulhha_uu\t%0, %r2, %r3"
3278 [(set_attr "type" "Y0_2cycle")])
3279
3280 (define_insn "insn_mulhhsa_uu"
3281 [(set (match_operand:SI 0 "register_operand" "=r")
3282 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3283 (match_operand:SI 2 "reg_or_0_operand" "rO")
3284 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3285 UNSPEC_INSN_MULHHSA_UU))]
3286 ""
3287 "mulhhsa_uu\t%0, %r2, %r3"
3288 [(set_attr "type" "X0_2cycle")])
3289
3290 (define_insn "insn_mulhl_ss"
3291 [(set (match_operand:SI 0 "register_operand" "=r")
3292 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3293 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3294 UNSPEC_INSN_MULHL_SS))]
3295 ""
3296 "mulhl_ss\t%0, %r1, %r2"
3297 [(set_attr "type" "X0_2cycle")])
3298
3299 (define_insn "insn_mulhl_su"
3300 [(set (match_operand:SI 0 "register_operand" "=r")
3301 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3302 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3303 UNSPEC_INSN_MULHL_SU))]
3304 ""
3305 "mulhl_su\t%0, %r1, %r2"
3306 [(set_attr "type" "X0_2cycle")])
3307
3308 (define_insn "insn_mulhl_us"
3309 [(set (match_operand:SI 0 "register_operand" "=r")
3310 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3311 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3312 UNSPEC_INSN_MULHL_US))]
3313 ""
3314 "mulhl_us\t%0, %r1, %r2"
3315 [(set_attr "type" "X0_2cycle")])
3316
3317 (define_insn "insn_mulhl_uu"
3318 [(set (match_operand:SI 0 "register_operand" "=r")
3319 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3320 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3321 UNSPEC_INSN_MULHL_UU))]
3322 ""
3323 "mulhl_uu\t%0, %r1, %r2"
3324 [(set_attr "type" "X0_2cycle")])
3325
3326 (define_insn "insn_mulhla_ss"
3327 [(set (match_operand:SI 0 "register_operand" "=r")
3328 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3329 (match_operand:SI 2 "reg_or_0_operand" "rO")
3330 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3331 UNSPEC_INSN_MULHLA_SS))]
3332 ""
3333 "mulhla_ss\t%0, %r2, %r3"
3334 [(set_attr "type" "X0_2cycle")])
3335
3336 (define_insn "insn_mulhla_su"
3337 [(set (match_operand:SI 0 "register_operand" "=r")
3338 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3339 (match_operand:SI 2 "reg_or_0_operand" "rO")
3340 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3341 UNSPEC_INSN_MULHLA_SU))]
3342 ""
3343 "mulhla_su\t%0, %r2, %r3"
3344 [(set_attr "type" "X0_2cycle")])
3345
3346 (define_insn "insn_mulhla_us"
3347 [(set (match_operand:SI 0 "register_operand" "=r")
3348 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3349 (match_operand:SI 2 "reg_or_0_operand" "rO")
3350 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3351 UNSPEC_INSN_MULHLA_US))]
3352 ""
3353 "mulhla_us\t%0, %r2, %r3"
3354 [(set_attr "type" "X0_2cycle")])
3355
3356 (define_insn "insn_mulhla_uu"
3357 [(set (match_operand:SI 0 "register_operand" "=r")
3358 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3359 (match_operand:SI 2 "reg_or_0_operand" "rO")
3360 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3361 UNSPEC_INSN_MULHLA_UU))]
3362 ""
3363 "mulhla_uu\t%0, %r2, %r3"
3364 [(set_attr "type" "X0_2cycle")])
3365
3366 (define_insn "insn_mulhlsa_uu"
3367 [(set (match_operand:SI 0 "register_operand" "=r")
3368 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3369 (match_operand:SI 2 "reg_or_0_operand" "rO")
3370 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3371 UNSPEC_INSN_MULHLSA_UU))]
3372 ""
3373 "mulhlsa_uu\t%0, %r2, %r3"
3374 [(set_attr "type" "Y0_2cycle")])
3375
3376 (define_insn "insn_mulll_ss"
3377 [(set (match_operand:SI 0 "register_operand" "=r")
3378 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3379 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3380 UNSPEC_INSN_MULLL_SS))]
3381 ""
3382 "mulll_ss\t%0, %r1, %r2"
3383 [(set_attr "type" "Y0_2cycle")])
3384
3385 (define_insn "insn_mulll_su"
3386 [(set (match_operand:SI 0 "register_operand" "=r")
3387 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3388 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3389 UNSPEC_INSN_MULLL_SU))]
3390 ""
3391 "mulll_su\t%0, %r1, %r2"
3392 [(set_attr "type" "X0_2cycle")])
3393
3394 (define_insn "insn_mulll_uu"
3395 [(set (match_operand:SI 0 "register_operand" "=r")
3396 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3397 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3398 UNSPEC_INSN_MULLL_UU))]
3399 ""
3400 "mulll_uu\t%0, %r1, %r2"
3401 [(set_attr "type" "Y0_2cycle")])
3402
3403 (define_insn "insn_mullla_ss"
3404 [(set (match_operand:SI 0 "register_operand" "=r")
3405 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3406 (match_operand:SI 2 "reg_or_0_operand" "rO")
3407 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3408 UNSPEC_INSN_MULLLA_SS))]
3409 ""
3410 "mullla_ss\t%0, %r2, %r3"
3411 [(set_attr "type" "Y0_2cycle")])
3412
3413 (define_insn "insn_mullla_su"
3414 [(set (match_operand:SI 0 "register_operand" "=r")
3415 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3416 (match_operand:SI 2 "reg_or_0_operand" "rO")
3417 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3418 UNSPEC_INSN_MULLLA_SU))]
3419 ""
3420 "mullla_su\t%0, %r2, %r3"
3421 [(set_attr "type" "X0_2cycle")])
3422
3423 (define_insn "insn_mullla_uu"
3424 [(set (match_operand:SI 0 "register_operand" "=r")
3425 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3426 (match_operand:SI 2 "reg_or_0_operand" "rO")
3427 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3428 UNSPEC_INSN_MULLLA_UU))]
3429 ""
3430 "mullla_uu\t%0, %r2, %r3"
3431 [(set_attr "type" "Y0_2cycle")])
3432
3433 (define_insn "insn_mulllsa_uu"
3434 [(set (match_operand:SI 0 "register_operand" "=r")
3435 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3436 (match_operand:SI 2 "reg_or_0_operand" "rO")
3437 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3438 UNSPEC_INSN_MULLLSA_UU))]
3439 ""
3440 "mulllsa_uu\t%0, %r2, %r3"
3441 [(set_attr "type" "X0_2cycle")])
3442
3443 (define_insn "insn_mzb"
3444 [(set (match_operand:SI 0 "register_operand" "=r")
3445 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3446 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3447 UNSPEC_INSN_MZB))]
3448 ""
3449 "mzb\t%0, %r1, %r2"
3450 [(set_attr "type" "X01")])
3451
3452 (define_insn "insn_mzh"
3453 [(set (match_operand:SI 0 "register_operand" "=r")
3454 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3455 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3456 UNSPEC_INSN_MZH))]
3457 ""
3458 "mzh\t%0, %r1, %r2"
3459 [(set_attr "type" "X01")])
3460
3461 (define_insn "insn_nap"
3462 [(unspec_volatile:VOID [(const_int 0)] UNSPEC_INSN_NAP)]
3463 ""
3464 "nap"
3465 [(set_attr "type" "cannot_bundle")])
3466
3467 (define_insn "insn_nor"
3468 [(set (match_operand:SI 0 "register_operand" "=r")
3469 (and:SI (not:SI (match_operand:SI 1 "reg_or_0_operand" "rO"))
3470 (not:SI (match_operand:SI 2 "reg_or_0_operand" "rO"))))]
3471 ""
3472 "nor\t%0, %r1, %r2")
3473
3474 (define_insn "insn_sadab_u"
3475 [(set (match_operand:SI 0 "register_operand" "=r")
3476 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3477 (match_operand:SI 2 "reg_or_0_operand" "rO")
3478 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3479 UNSPEC_INSN_SADAB_U))]
3480 ""
3481 "sadab_u\t%0, %r2, %r3"
3482 [(set_attr "type" "X0_2cycle")])
3483
3484 (define_insn "insn_sadah"
3485 [(set (match_operand:SI 0 "register_operand" "=r")
3486 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3487 (match_operand:SI 2 "reg_or_0_operand" "rO")
3488 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3489 UNSPEC_INSN_SADAH))]
3490 ""
3491 "sadah\t%0, %r2, %r3"
3492 [(set_attr "type" "X0_2cycle")])
3493
3494 (define_insn "insn_sadah_u"
3495 [(set (match_operand:SI 0 "register_operand" "=r")
3496 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3497 (match_operand:SI 2 "reg_or_0_operand" "rO")
3498 (match_operand:SI 3 "reg_or_0_operand" "rO")]
3499 UNSPEC_INSN_SADAH_U))]
3500 ""
3501 "sadah_u\t%0, %r2, %r3"
3502 [(set_attr "type" "X0_2cycle")])
3503
3504 (define_insn "insn_sadb_u"
3505 [(set (match_operand:SI 0 "register_operand" "=r")
3506 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3507 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3508 UNSPEC_INSN_SADB_U))]
3509 ""
3510 "sadb_u\t%0, %r1, %r2"
3511 [(set_attr "type" "X0_2cycle")])
3512
3513 (define_insn "insn_sadh"
3514 [(set (match_operand:SI 0 "register_operand" "=r")
3515 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3516 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3517 UNSPEC_INSN_SADH))]
3518 ""
3519 "sadh\t%0, %r1, %r2"
3520 [(set_attr "type" "X0_2cycle")])
3521
3522 (define_insn "insn_sadh_u"
3523 [(set (match_operand:SI 0 "register_operand" "=r")
3524 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "rO")
3525 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3526 UNSPEC_INSN_SADH_U))]
3527 ""
3528 "sadh_u\t%0, %r1, %r2"
3529 [(set_attr "type" "X0_2cycle")])
3530
3531 (define_insn "insn_tblidxb0"
3532 [(set (match_operand:SI 0 "register_operand" "=r")
3533 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3534 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3535 UNSPEC_INSN_TBLIDXB0))]
3536 ""
3537 "tblidxb0\t%0, %r2"
3538 [(set_attr "type" "Y0")])
3539
3540 (define_insn "insn_tblidxb1"
3541 [(set (match_operand:SI 0 "register_operand" "=r")
3542 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3543 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3544 UNSPEC_INSN_TBLIDXB1))]
3545 ""
3546 "tblidxb1\t%0, %r2"
3547 [(set_attr "type" "Y0")])
3548
3549 (define_insn "insn_tblidxb2"
3550 [(set (match_operand:SI 0 "register_operand" "=r")
3551 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3552 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3553 UNSPEC_INSN_TBLIDXB2))]
3554 ""
3555 "tblidxb2\t%0, %r2"
3556 [(set_attr "type" "Y0")])
3557
3558 (define_insn "insn_tblidxb3"
3559 [(set (match_operand:SI 0 "register_operand" "=r")
3560 (unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "0")
3561 (match_operand:SI 2 "reg_or_0_operand" "rO")]
3562 UNSPEC_INSN_TBLIDXB3))]
3563 ""
3564 "tblidxb3\t%0, %r2"
3565 [(set_attr "type" "Y0")])
3566
3567
3568 ;;
3569 ;; pic related instructions
3570 ;;
3571
3572 ;; NOTE: We compute the label in this unusual way because if we place
3573 ;; the label after the lnk, whether it is at the same address as the
3574 ;; lnk will vary depending on whether the optimization level chooses to
3575 ;; insert bundling braces.
3576 (define_insn "insn_lnk_and_label"
3577 [(set (match_operand:SI 0 "register_operand" "=r")
3578 (unspec_volatile:SI [(match_operand:SI 1 "symbolic_operand" "")]
3579 UNSPEC_LNK_AND_LABEL))]
3580 ""
3581 "%1 = . + 8\n\tlnk\t%0"
3582 [(set_attr "type" "X1")])
3583
3584 (define_expand "addli_pcrel"
3585 [(set (match_operand:SI 0 "register_operand" "")
3586 (lo_sum:SI
3587 (match_operand:SI 1 "register_operand" "")
3588 (const:SI
3589 (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")
3590 (match_operand:SI 3 "symbolic_operand" "")]
3591 UNSPEC_PCREL_SYM))))]
3592 "flag_pic")
3593
3594 (define_expand "auli_pcrel"
3595 [(set (match_operand:SI 0 "register_operand" "")
3596 (plus:SI
3597 (match_operand:SI 1 "reg_or_0_operand" "")
3598 (high:SI
3599 (const:SI
3600 (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")
3601 (match_operand:SI 3 "symbolic_operand" "")]
3602 UNSPEC_PCREL_SYM)))))]
3603 "flag_pic")
3604
3605 (define_expand "add_got16"
3606 [(set (match_operand:SI 0 "register_operand" "")
3607 (lo_sum:SI
3608 (match_operand:SI 1 "reg_or_0_operand" "")
3609 (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
3610 UNSPEC_GOT16_SYM))))]
3611 "flag_pic == 1")
3612
3613 (define_expand "addhi_got32"
3614 [(set (match_operand:SI 0 "register_operand" "")
3615 (plus:SI
3616 (match_operand:SI 1 "reg_or_0_operand" "")
3617 (high:SI
3618 (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
3619 UNSPEC_GOT32_SYM)))))]
3620 "flag_pic == 2")
3621
3622 (define_expand "addlo_got32"
3623 [(set (match_operand:SI 0 "register_operand" "")
3624 (lo_sum:SI
3625 (match_operand:SI 1 "reg_or_0_operand" "")
3626 (const:SI (unspec:SI [(match_operand:SI 2 "symbolic_operand" "")]
3627 UNSPEC_GOT32_SYM))))]
3628 "flag_pic == 2")
3629
3630
3631 ;;
3632 ;; TLS
3633 ;;
3634
3635 (define_expand "tls_gd_addhi"
3636 [(set (match_operand:SI 0 "register_operand" "")
3637 (plus:SI
3638 (match_operand:SI 1 "reg_or_0_operand" "")
3639 (high:SI
3640 (const:SI (unspec:SI [(match_operand 2 "tls_symbolic_operand" "")]
3641 UNSPEC_TLS_GD)))))]
3642 "HAVE_AS_TLS")
3643
3644 (define_expand "tls_gd_addlo"
3645 [(set (match_operand:SI 0 "register_operand" "")
3646 (lo_sum:SI
3647 (match_operand:SI 1 "reg_or_0_operand" "")
3648 (const:SI (unspec:SI [(match_operand 2 "tls_symbolic_operand" "")]
3649 UNSPEC_TLS_GD))))]
3650 "HAVE_AS_TLS")
3651
3652 (define_expand "tls_gd_call"
3653 [(parallel
3654 [(set (reg:SI 0)
3655 (unspec:SI [(match_operand:SI 0 "tls_symbolic_operand" "")
3656 (reg:SI 0)]
3657 UNSPEC_TLS_GD_CALL))
3658 (clobber (reg:SI 25))
3659 (clobber (reg:SI 26))
3660 (clobber (reg:SI 27))
3661 (clobber (reg:SI 28))
3662 (clobber (reg:SI 29))
3663 (clobber (reg:SI 55))])]
3664 ""
3665 {
3666 cfun->machine->calls_tls_get_addr = true;
3667 })
3668
3669 (define_insn "*tls_gd_call"
3670 [(set (reg:SI 0)
3671 (unspec:SI [(match_operand:SI 0 "tls_symbolic_operand" "")
3672 (reg:SI 0)]
3673 UNSPEC_TLS_GD_CALL))
3674 (clobber (reg:SI 25))
3675 (clobber (reg:SI 26))
3676 (clobber (reg:SI 27))
3677 (clobber (reg:SI 28))
3678 (clobber (reg:SI 29))
3679 (clobber (reg:SI 55))]
3680 ""
3681 "jal\ttls_gd_call(%0)"
3682 [(set_attr "type" "X1")])
3683
3684 (define_insn "tls_gd_add"
3685 [(set (match_operand:SI 0 "register_operand" "=r")
3686 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
3687 (match_operand:SI 2 "tls_symbolic_operand" "")]
3688 UNSPEC_TLS_GD_ADD))]
3689 "HAVE_AS_TLS"
3690 "addi\t%0, %1, tls_gd_add(%2)")
3691
3692 (define_insn "tls_ie_load"
3693 [(set (match_operand:SI 0 "register_operand" "=r")
3694 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
3695 (match_operand:SI 2 "tls_symbolic_operand" "")]
3696 UNSPEC_TLS_IE_LOAD))]
3697 "HAVE_AS_TLS"
3698 "lw_tls\t%0, %1, tls_ie_load(%2)"
3699 [(set_attr "type" "X1_2cycle")])
3700
3701 (define_expand "tls_ie_addhi"
3702 [(set (match_operand:SI 0 "register_operand" "")
3703 (plus:SI
3704 (match_operand:SI 1 "register_operand" "")
3705 (high:SI
3706 (const:SI (unspec:SI [(match_operand 2 "tls_ie_symbolic_operand" "")]
3707 UNSPEC_TLS_IE)))))]
3708 "HAVE_AS_TLS")
3709
3710 (define_expand "tls_ie_addlo"
3711 [(set (match_operand:SI 0 "register_operand" "")
3712 (lo_sum:SI
3713 (match_operand:SI 1 "register_operand" "")
3714 (const:SI (unspec:SI [(match_operand 2 "tls_ie_symbolic_operand" "")]
3715 UNSPEC_TLS_IE))))]
3716 "HAVE_AS_TLS")
3717
3718 (define_expand "tls_le_addhi"
3719 [(set (match_operand:SI 0 "register_operand" "")
3720 (plus:SI
3721 (match_operand:SI 1 "register_operand" "")
3722 (high:SI
3723 (const:SI (unspec:SI [(match_operand 2 "tls_le_symbolic_operand" "")]
3724 UNSPEC_TLS_LE)))))]
3725 "HAVE_AS_TLS")
3726
3727 (define_expand "tls_le_addlo"
3728 [(set (match_operand:SI 0 "register_operand" "")
3729 (lo_sum:SI
3730 (match_operand:SI 1 "register_operand" "")
3731 (const:SI (unspec:SI [(match_operand 2 "tls_le_symbolic_operand" "")]
3732 UNSPEC_TLS_LE))))]
3733 "HAVE_AS_TLS")
3734
3735
3736 ;;
3737 ;; Stack protector instructions.
3738 ;;
3739
3740 (define_expand "stack_protect_set"
3741 [(set (match_operand 0 "nonautoincmem_operand" "")
3742 (match_operand 1 "nonautoincmem_operand" ""))]
3743 ""
3744 {
3745 #ifdef TARGET_THREAD_SSP_OFFSET
3746 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
3747 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
3748 rtx ssp = gen_reg_rtx (Pmode);
3749
3750 emit_insn (gen_rtx_SET (ssp, ssp_addr));
3751
3752 operands[1] = gen_rtx_MEM (Pmode, ssp);
3753 #endif
3754
3755 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
3756
3757 DONE;
3758 })
3759
3760 (define_insn "stack_protect_setsi"
3761 [(set (match_operand:SI 0 "nonautoincmem_operand" "=U")
3762 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")]
3763 UNSPEC_SP_SET))
3764 (set (match_scratch:SI 2 "=&r") (const_int 0))]
3765 ""
3766 "lw\t%2, %1; { sw\t%0, %2; move\t%2, zero }"
3767 [(set_attr "length" "16")
3768 (set_attr "type" "cannot_bundle_3cycle")])
3769
3770
3771 (define_expand "stack_protect_test"
3772 [(match_operand 0 "nonautoincmem_operand" "")
3773 (match_operand 1 "nonautoincmem_operand" "")
3774 (match_operand 2 "" "")]
3775 ""
3776 {
3777 rtx compare_result;
3778 rtx bcomp, loc_ref;
3779
3780 #ifdef TARGET_THREAD_SSP_OFFSET
3781 rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
3782 rtx ssp_addr = gen_rtx_PLUS (Pmode, tp, GEN_INT (TARGET_THREAD_SSP_OFFSET));
3783 rtx ssp = gen_reg_rtx (Pmode);
3784
3785 emit_insn (gen_rtx_SET (ssp, ssp_addr));
3786
3787 operands[1] = gen_rtx_MEM (Pmode, ssp);
3788 #endif
3789
3790 compare_result = gen_reg_rtx (SImode);
3791
3792 emit_insn (gen_stack_protect_testsi (compare_result, operands[0],
3793 operands[1]));
3794
3795 bcomp = gen_rtx_NE (SImode, compare_result, const0_rtx);
3796
3797 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[2]);
3798
3799 emit_jump_insn (gen_rtx_SET (pc_rtx,
3800 gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp,
3801 loc_ref, pc_rtx)));
3802
3803 DONE;
3804 })
3805
3806 (define_insn "stack_protect_testsi"
3807 [(set (match_operand:SI 0 "register_operand" "=&r")
3808 (unspec:SI [(match_operand:SI 1 "nonautoincmem_operand" "U")
3809 (match_operand:SI 2 "nonautoincmem_operand" "U")]
3810 UNSPEC_SP_TEST))
3811 (set (match_scratch:SI 3 "=&r") (const_int 0))]
3812 ""
3813 "lw\t%0, %1; lw\t%3, %2; { seq\t%0, %0, %3; move\t%3, zero }"
3814 [(set_attr "length" "24")
3815 (set_attr "type" "cannot_bundle_4cycle")])
3816