alpha.md revision 1.1.1.10 1 ;; Machine description for DEC Alpha for GNU C compiler
2 ;; Copyright (C) 1992-2022 Free Software Foundation, Inc.
3 ;; Contributed by Richard Kenner (kenner (a] vlsi1.ultra.nyu.edu)
4 ;;
5 ;; This file is part of GCC.
6 ;;
7 ;; GCC is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 3, or (at your option)
10 ;; any later version.
11 ;;
12 ;; GCC is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ;; GNU General Public 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 ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
22
23 ;; Uses of UNSPEC in this file:
24
25 (define_c_enum "unspec" [
26 UNSPEC_XFLT_COMPARE
27 UNSPEC_ARG_HOME
28 UNSPEC_LDGP1
29 UNSPEC_INSXH
30 UNSPEC_MSKXH
31 UNSPEC_CVTQL
32 UNSPEC_CVTLQ
33 UNSPEC_LDGP2
34 UNSPEC_LITERAL
35 UNSPEC_LITUSE
36 UNSPEC_SIBCALL
37 UNSPEC_SYMBOL
38
39 ;; TLS Support
40 UNSPEC_TLSGD_CALL
41 UNSPEC_TLSLDM_CALL
42 UNSPEC_TLSGD
43 UNSPEC_TLSLDM
44 UNSPEC_DTPREL
45 UNSPEC_TPREL
46 UNSPEC_TP
47
48 ;; Builtins
49 UNSPEC_CMPBGE
50 UNSPEC_ZAP
51 UNSPEC_AMASK
52 UNSPEC_IMPLVER
53 UNSPEC_PERR
54 UNSPEC_COPYSIGN
55
56 ;; Atomic operations
57 UNSPEC_MB
58 UNSPEC_ATOMIC
59 UNSPEC_CMPXCHG
60 UNSPEC_XCHG
61 ])
62
63 ;; UNSPEC_VOLATILE:
64
65 (define_c_enum "unspecv" [
66 UNSPECV_IMB
67 UNSPECV_BLOCKAGE
68 UNSPECV_SETJMPR ; builtin_setjmp_receiver
69 UNSPECV_LONGJMP ; builtin_longjmp
70 UNSPECV_TRAPB
71 UNSPECV_PSPL ; prologue_stack_probe_loop
72 UNSPECV_REALIGN
73 UNSPECV_EHR ; exception_receiver
74 UNSPECV_MCOUNT
75 UNSPECV_FORCE_MOV
76 UNSPECV_LDGP1
77 UNSPECV_PLDGP2 ; prologue ldgp
78 UNSPECV_SET_TP
79 UNSPECV_RPCC
80 UNSPECV_SETJMPR_ER ; builtin_setjmp_receiver fragment
81 UNSPECV_LL ; load-locked
82 UNSPECV_SC ; store-conditional
83 UNSPECV_CMPXCHG
84 ])
85
86 ;; On non-BWX targets, CQImode must be handled the similarly to HImode
87 ;; when generating reloads.
88 (define_mode_iterator RELOAD12 [QI HI CQI])
89 (define_mode_attr reloadmode [(QI "qi") (HI "hi") (CQI "hi")])
90
91 ;; Other mode iterators
92 (define_mode_iterator IMODE [QI HI SI DI])
93 (define_mode_iterator I12MODE [QI HI])
94 (define_mode_iterator I124MODE [QI HI SI])
95 (define_mode_iterator I24MODE [HI SI])
96 (define_mode_iterator I248MODE [HI SI DI])
97 (define_mode_iterator I48MODE [SI DI])
98
99 (define_mode_attr DWI [(SI "DI") (DI "TI")])
100 (define_mode_attr modesuffix [(QI "b") (HI "w") (SI "l") (DI "q")
101 (V8QI "b8") (V4HI "w4")
102 (SF "%,") (DF "%-")])
103 (define_mode_attr vecmodesuffix [(QI "b8") (HI "w4")])
104
105 (define_code_iterator any_maxmin [smax smin umax umin])
106
107 (define_code_attr maxmin [(smax "maxs") (smin "mins")
108 (umax "maxu") (umin "minu")])
109
110 ;; Where necessary, the suffixes _le and _be are used to distinguish between
111 ;; little-endian and big-endian patterns.
112 ;;
113 ;; Note that the Unicos/Mk assembler does not support the following
114 ;; opcodes: mov, fmov, nop, fnop, unop.
115
117 ;; Processor type -- this attribute must exactly match the processor_type
118 ;; enumeration in alpha.h.
119
120 (define_attr "tune" "ev4,ev5,ev6"
121 (const (symbol_ref "((enum attr_tune) alpha_tune)")))
122
123 ;; Define an insn type attribute. This is used in function unit delay
124 ;; computations, among other purposes. For the most part, we use the names
125 ;; defined in the EV4 documentation, but add a few that we have to know about
126 ;; separately.
127
128 (define_attr "type"
129 "ild,fld,ldsym,ist,fst,ibr,callpal,fbr,jsr,iadd,ilog,shift,icmov,fcmov,
130 icmp,imul,fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,mb,ld_l,st_c,
131 multi,none"
132 (const_string "iadd"))
133
134 ;; Describe a user's asm statement.
135 (define_asm_attributes
136 [(set_attr "type" "multi")])
137
138 ;; Define the operand size an insn operates on. Used primarily by mul
139 ;; and div operations that have size dependent timings.
140
141 (define_attr "opsize" "si,di,udi"
142 (const_string "di"))
143
144 ;; The TRAP attribute marks instructions that may generate traps
145 ;; (which are imprecise and may need a trapb if software completion
146 ;; is desired).
147
148 (define_attr "trap" "no,yes"
149 (const_string "no"))
150
151 ;; The ROUND_SUFFIX attribute marks which instructions require a
152 ;; rounding-mode suffix. The value NONE indicates no suffix,
153 ;; the value NORMAL indicates a suffix controlled by alpha_fprm.
154
155 (define_attr "round_suffix" "none,normal,c"
156 (const_string "none"))
157
158 ;; The TRAP_SUFFIX attribute marks instructions requiring a trap-mode suffix:
159 ;; NONE no suffix
160 ;; SU accepts only /su (cmpt et al)
161 ;; SUI accepts only /sui (cvtqt and cvtqs)
162 ;; V_SV accepts /v and /sv (cvtql only)
163 ;; V_SV_SVI accepts /v, /sv and /svi (cvttq only)
164 ;; U_SU_SUI accepts /u, /su and /sui (most fp instructions)
165 ;;
166 ;; The actual suffix emitted is controlled by alpha_fptm.
167
168 (define_attr "trap_suffix" "none,su,sui,v_sv,v_sv_svi,u_su_sui"
169 (const_string "none"))
170
171 ;; The length of an instruction sequence in bytes.
172
173 (define_attr "length" ""
174 (const_int 4))
175
176 ;; The USEGP attribute marks instructions that have relocations that use
177 ;; the GP.
178
179 (define_attr "usegp" "no,yes"
180 (cond [(eq_attr "type" "ldsym,jsr")
181 (const_string "yes")
182 (eq_attr "type" "ild,fld,ist,fst")
183 (symbol_ref "((enum attr_usegp) alpha_find_lo_sum_using_gp (insn))")
184 ]
185 (const_string "no")))
186
187 ;; The CANNOT_COPY attribute marks instructions with relocations that
188 ;; cannot easily be duplicated. This includes insns with gpdisp relocs
189 ;; since they have to stay in 1-1 correspondence with one another. This
190 ;; also includes jsr insns, since they must stay in correspondence with
191 ;; the immediately following gpdisp instructions.
192
193 (define_attr "cannot_copy" "false,true"
194 (const_string "false"))
195
196 ;; Used to control the "enabled" attribute on a per-instruction basis.
197 ;; For convenience, conflate ABI issues re loading of addresses with
198 ;; an "isa".
199 (define_attr "isa" "base,bwx,max,fix,cix,vms,ner,er"
200 (const_string "base"))
201
202 (define_attr "enabled" ""
203 (cond [(eq_attr "isa" "bwx") (symbol_ref "TARGET_BWX")
204 (eq_attr "isa" "max") (symbol_ref "TARGET_MAX")
205 (eq_attr "isa" "fix") (symbol_ref "TARGET_FIX")
206 (eq_attr "isa" "cix") (symbol_ref "TARGET_CIX")
207 (eq_attr "isa" "vms") (symbol_ref "TARGET_ABI_OPEN_VMS")
208 (eq_attr "isa" "ner") (symbol_ref "!TARGET_EXPLICIT_RELOCS")
209 (eq_attr "isa" "er") (symbol_ref "TARGET_EXPLICIT_RELOCS")
210 ]
211 (const_int 1)))
212
214 ;; Include scheduling descriptions.
215
216 (include "ev4.md")
217 (include "ev5.md")
218 (include "ev6.md")
219
220
222 ;; Operand and operator predicates and constraints
223
224 (include "predicates.md")
225 (include "constraints.md")
226
227
229 ;; First define the arithmetic insns. Note that the 32-bit forms also
230 ;; sign-extend.
231
232 ;; Handle 32-64 bit extension from memory to a floating point register
233 ;; specially, since this occurs frequently in int->double conversions.
234 ;;
235 ;; Note that while we must retain the =f case in the insn for reload's
236 ;; benefit, it should be eliminated after reload, so we should never emit
237 ;; code for that case. But we don't reject the possibility.
238
239 (define_expand "extendsidi2"
240 [(set (match_operand:DI 0 "register_operand")
241 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand")))])
242
243 (define_insn "*cvtlq"
244 [(set (match_operand:DI 0 "register_operand" "=f")
245 (unspec:DI [(match_operand:SF 1 "reg_or_0_operand" "fG")]
246 UNSPEC_CVTLQ))]
247 ""
248 "cvtlq %1,%0"
249 [(set_attr "type" "fadd")])
250
251 (define_insn "*extendsidi2_1"
252 [(set (match_operand:DI 0 "register_operand" "=r,r,!*f")
253 (sign_extend:DI
254 (match_operand:SI 1 "nonimmediate_operand" "r,m,m")))]
255 ""
256 "@
257 addl $31,%1,%0
258 ldl %0,%1
259 lds %0,%1\;cvtlq %0,%0"
260 [(set_attr "type" "iadd,ild,fld")
261 (set_attr "length" "*,*,8")])
262
263 (define_split
264 [(set (match_operand:DI 0 "hard_fp_register_operand")
265 (sign_extend:DI (match_operand:SI 1 "memory_operand")))]
266 "reload_completed"
267 [(set (match_dup 2) (match_dup 1))
268 (set (match_dup 0) (unspec:DI [(match_dup 2)] UNSPEC_CVTLQ))]
269 {
270 operands[1] = adjust_address (operands[1], SFmode, 0);
271 operands[2] = gen_rtx_REG (SFmode, REGNO (operands[0]));
272 })
273
274 ;; Optimize sign-extension of SImode loads. This shows up in the wake of
275 ;; reload when converting fp->int.
276
277 (define_peephole2
278 [(set (match_operand:SI 0 "hard_int_register_operand")
279 (match_operand:SI 1 "memory_operand"))
280 (set (match_operand:DI 2 "hard_int_register_operand")
281 (sign_extend:DI (match_dup 0)))]
282 "true_regnum (operands[0]) == true_regnum (operands[2])
283 || peep2_reg_dead_p (2, operands[0])"
284 [(set (match_dup 2)
285 (sign_extend:DI (match_dup 1)))])
286
287 (define_insn "addsi3"
288 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
289 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ,rJ,rJ")
290 (match_operand:SI 2 "add_operand" "rI,O,K,L")))]
291 ""
292 "@
293 addl %r1,%2,%0
294 subl %r1,%n2,%0
295 lda %0,%2(%r1)
296 ldah %0,%h2(%r1)")
297
298 (define_split
299 [(set (match_operand:SI 0 "register_operand")
300 (plus:SI (match_operand:SI 1 "register_operand")
301 (match_operand:SI 2 "const_int_operand")))]
302 "! add_operand (operands[2], SImode)"
303 [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
304 (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
305 {
306 HOST_WIDE_INT val = INTVAL (operands[2]);
307 HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000);
308 HOST_WIDE_INT rest = val - low;
309
310 operands[3] = GEN_INT (rest);
311 operands[4] = GEN_INT (low);
312 })
313
314 (define_insn "*addsi_se"
315 [(set (match_operand:DI 0 "register_operand" "=r,r")
316 (sign_extend:DI
317 (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
318 (match_operand:SI 2 "sext_add_operand" "rI,O"))))]
319 ""
320 "@
321 addl %r1,%2,%0
322 subl %r1,%n2,%0")
323
324 (define_insn "*addsi_se2"
325 [(set (match_operand:DI 0 "register_operand" "=r,r")
326 (sign_extend:DI
327 (subreg:SI (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
328 (match_operand:DI 2 "sext_add_operand" "rI,O"))
329 0)))]
330 ""
331 "@
332 addl %r1,%2,%0
333 subl %r1,%n2,%0")
334
335 (define_split
336 [(set (match_operand:DI 0 "register_operand")
337 (sign_extend:DI
338 (plus:SI (match_operand:SI 1 "reg_not_elim_operand")
339 (match_operand:SI 2 "const_int_operand"))))
340 (clobber (match_operand:SI 3 "reg_not_elim_operand"))]
341 "! sext_add_operand (operands[2], SImode) && INTVAL (operands[2]) > 0
342 && INTVAL (operands[2]) % 4 == 0"
343 [(set (match_dup 3) (match_dup 4))
344 (set (match_dup 0) (sign_extend:DI (plus:SI (ashift:SI (match_dup 3)
345 (match_dup 5))
346 (match_dup 1))))]
347 {
348 HOST_WIDE_INT val = INTVAL (operands[2]) / 4;
349 int mult = 4;
350
351 if (val % 2 == 0)
352 val /= 2, mult = 8;
353
354 operands[4] = GEN_INT (val);
355 operands[5] = GEN_INT (exact_log2 (mult));
356 })
357
358 (define_split
359 [(set (match_operand:DI 0 "register_operand")
360 (sign_extend:DI
361 (plus:SI (match_operator:SI 1 "comparison_operator"
362 [(match_operand 2)
363 (match_operand 3)])
364 (match_operand:SI 4 "add_operand"))))
365 (clobber (match_operand:DI 5 "register_operand"))]
366 ""
367 [(set (match_dup 5) (match_dup 6))
368 (set (match_dup 0) (sign_extend:DI (plus:SI (match_dup 7) (match_dup 4))))]
369 {
370 operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[1]), DImode,
371 operands[2], operands[3]);
372 operands[7] = gen_lowpart (SImode, operands[5]);
373 })
374
375 (define_expand "adddi3"
376 [(set (match_operand:DI 0 "register_operand")
377 (plus:DI (match_operand:DI 1 "register_operand")
378 (match_operand:DI 2 "add_operand")))])
379
380 (define_insn "*adddi_er_lo16_dtp"
381 [(set (match_operand:DI 0 "register_operand" "=r")
382 (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
383 (match_operand:DI 2 "dtp16_symbolic_operand")))]
384 "HAVE_AS_TLS"
385 "lda %0,%2(%1)\t\t!dtprel")
386
387 (define_insn "*adddi_er_hi32_dtp"
388 [(set (match_operand:DI 0 "register_operand" "=r")
389 (plus:DI (match_operand:DI 1 "register_operand" "r")
390 (high:DI (match_operand:DI 2 "dtp32_symbolic_operand"))))]
391 "HAVE_AS_TLS"
392 "ldah %0,%2(%1)\t\t!dtprelhi")
393
394 (define_insn "*adddi_er_lo32_dtp"
395 [(set (match_operand:DI 0 "register_operand" "=r")
396 (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
397 (match_operand:DI 2 "dtp32_symbolic_operand")))]
398 "HAVE_AS_TLS"
399 "lda %0,%2(%1)\t\t!dtprello")
400
401 (define_insn "*adddi_er_lo16_tp"
402 [(set (match_operand:DI 0 "register_operand" "=r")
403 (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
404 (match_operand:DI 2 "tp16_symbolic_operand")))]
405 "HAVE_AS_TLS"
406 "lda %0,%2(%1)\t\t!tprel")
407
408 (define_insn "*adddi_er_hi32_tp"
409 [(set (match_operand:DI 0 "register_operand" "=r")
410 (plus:DI (match_operand:DI 1 "register_operand" "r")
411 (high:DI (match_operand:DI 2 "tp32_symbolic_operand"))))]
412 "HAVE_AS_TLS"
413 "ldah %0,%2(%1)\t\t!tprelhi")
414
415 (define_insn "*adddi_er_lo32_tp"
416 [(set (match_operand:DI 0 "register_operand" "=r")
417 (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
418 (match_operand:DI 2 "tp32_symbolic_operand")))]
419 "HAVE_AS_TLS"
420 "lda %0,%2(%1)\t\t!tprello")
421
422 (define_insn "*adddi_er_high_l"
423 [(set (match_operand:DI 0 "register_operand" "=r")
424 (plus:DI (match_operand:DI 1 "register_operand" "r")
425 (high:DI (match_operand:DI 2 "local_symbolic_operand"))))]
426 "TARGET_EXPLICIT_RELOCS && reload_completed"
427 "ldah %0,%2(%1)\t\t!gprelhigh"
428 [(set_attr "usegp" "yes")])
429
430 (define_split
431 [(set (match_operand:DI 0 "register_operand")
432 (high:DI (match_operand:DI 1 "local_symbolic_operand")))]
433 "TARGET_EXPLICIT_RELOCS && reload_completed"
434 [(set (match_dup 0)
435 (plus:DI (match_dup 2) (high:DI (match_dup 1))))]
436 "operands[2] = pic_offset_table_rtx;")
437
438 ;; We used to expend quite a lot of effort choosing addq/subq/lda.
439 ;; With complications like
440 ;;
441 ;; The NT stack unwind code can't handle a subq to adjust the stack
442 ;; (that's a bug, but not one we can do anything about). As of NT4.0 SP3,
443 ;; the exception handling code will loop if a subq is used and an
444 ;; exception occurs.
445 ;;
446 ;; The 19980616 change to emit prologues as RTL also confused some
447 ;; versions of GDB, which also interprets prologues. This has been
448 ;; fixed as of GDB 4.18, but it does not harm to unconditionally
449 ;; use lda here.
450 ;;
451 ;; and the fact that the three insns schedule exactly the same, it's
452 ;; just not worth the effort.
453
454 (define_insn "*adddi_internal"
455 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
456 (plus:DI (match_operand:DI 1 "register_operand" "%r,r,r")
457 (match_operand:DI 2 "add_operand" "r,K,L")))]
458 ""
459 "@
460 addq %1,%2,%0
461 lda %0,%2(%1)
462 ldah %0,%h2(%1)")
463
464 ;; ??? Allow large constants when basing off the frame pointer or some
465 ;; virtual register that may eliminate to the frame pointer. This is
466 ;; done because register elimination offsets will change the hi/lo split,
467 ;; and if we split before reload, we will require additional instructions.
468
469 (define_insn "*adddi_fp_hack"
470 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
471 (plus:DI (match_operand:DI 1 "reg_no_subreg_operand" "r,r,r")
472 (match_operand:DI 2 "const_int_operand" "K,L,n")))]
473 "NONSTRICT_REG_OK_FP_BASE_P (operands[1])
474 && INTVAL (operands[2]) >= 0
475 /* This is the largest constant an lda+ldah pair can add, minus
476 an upper bound on the displacement between SP and AP during
477 register elimination. See INITIAL_ELIMINATION_OFFSET. */
478 && INTVAL (operands[2])
479 < (0x7fff8000
480 - FIRST_PSEUDO_REGISTER * UNITS_PER_WORD
481 - ALPHA_ROUND(crtl->outgoing_args_size)
482 - (ALPHA_ROUND (get_frame_size ()
483 + max_reg_num () * UNITS_PER_WORD
484 + crtl->args.pretend_args_size)
485 - crtl->args.pretend_args_size))"
486 "@
487 lda %0,%2(%1)
488 ldah %0,%h2(%1)
489 #")
490
491 ;; Don't do this if we are adjusting SP since we don't want to do it
492 ;; in two steps. Don't split FP sources for the reason listed above.
493 (define_split
494 [(set (match_operand:DI 0 "register_operand")
495 (plus:DI (match_operand:DI 1 "register_operand")
496 (match_operand:DI 2 "const_int_operand")))]
497 "! add_operand (operands[2], DImode)
498 && operands[0] != stack_pointer_rtx
499 && operands[1] != frame_pointer_rtx
500 && operands[1] != arg_pointer_rtx"
501 [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 3)))
502 (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 4)))]
503 {
504 HOST_WIDE_INT val = INTVAL (operands[2]);
505 HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000);
506 HOST_WIDE_INT rest = val - low;
507 rtx rest_rtx = GEN_INT (rest);
508
509 operands[4] = GEN_INT (low);
510 if (satisfies_constraint_L (rest_rtx))
511 operands[3] = rest_rtx;
512 else if (can_create_pseudo_p ())
513 {
514 operands[3] = gen_reg_rtx (DImode);
515 emit_move_insn (operands[3], operands[2]);
516 emit_insn (gen_adddi3 (operands[0], operands[1], operands[3]));
517 DONE;
518 }
519 else
520 FAIL;
521 })
522
523 (define_insn "*sadd<modesuffix>"
524 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
525 (plus:I48MODE
526 (ashift:I48MODE (match_operand:I48MODE 1 "reg_not_elim_operand" "r,r")
527 (match_operand:I48MODE 2 "const23_operand" "I,I"))
528 (match_operand:I48MODE 3 "sext_add_operand" "rI,O")))]
529 ""
530 "@
531 s%P2add<modesuffix> %1,%3,%0
532 s%P2sub<modesuffix> %1,%n3,%0")
533
534 (define_insn "*saddl_se"
535 [(set (match_operand:DI 0 "register_operand" "=r,r")
536 (sign_extend:DI
537 (plus:SI
538 (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r")
539 (match_operand:SI 2 "const23_operand" "I,I"))
540 (match_operand:SI 3 "sext_add_operand" "rI,O"))))]
541 ""
542 "@
543 s%P2addl %1,%3,%0
544 s%P2subl %1,%n3,%0")
545
546 (define_split
547 [(set (match_operand:DI 0 "register_operand")
548 (sign_extend:DI
549 (plus:SI (ashift:SI (match_operator:SI 1 "comparison_operator"
550 [(match_operand 2)
551 (match_operand 3)])
552 (match_operand:SI 4 "const23_operand"))
553 (match_operand:SI 5 "sext_add_operand"))))
554 (clobber (match_operand:DI 6 "reg_not_elim_operand"))]
555 ""
556 [(set (match_dup 6) (match_dup 7))
557 (set (match_dup 0)
558 (sign_extend:DI (plus:SI (ashift:SI (match_dup 8) (match_dup 4))
559 (match_dup 5))))]
560 {
561 operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[1]), DImode,
562 operands[2], operands[3]);
563 operands[8] = gen_lowpart (SImode, operands[6]);
564 })
565
566 (define_insn "addv<mode>3"
567 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
568 (plus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "%rJ,rJ")
569 (match_operand:I48MODE 2 "sext_add_operand" "rI,O")))
570 (trap_if (ne (plus:<DWI> (sign_extend:<DWI> (match_dup 1))
571 (sign_extend:<DWI> (match_dup 2)))
572 (sign_extend:<DWI> (plus:I48MODE (match_dup 1)
573 (match_dup 2))))
574 (const_int 0))]
575 ""
576 "@
577 add<modesuffix>v %r1,%2,%0
578 sub<modesuffix>v %r1,%n2,%0")
579
580 (define_insn "neg<mode>2"
581 [(set (match_operand:I48MODE 0 "register_operand" "=r")
582 (neg:I48MODE (match_operand:I48MODE 1 "reg_or_8bit_operand" "rI")))]
583 ""
584 "sub<modesuffix> $31,%1,%0")
585
586 (define_insn "*negsi_se"
587 [(set (match_operand:DI 0 "register_operand" "=r")
588 (sign_extend:DI (neg:SI
589 (match_operand:SI 1 "reg_or_8bit_operand" "rI"))))]
590 ""
591 "subl $31,%1,%0")
592
593 (define_insn "negv<mode>2"
594 [(set (match_operand:I48MODE 0 "register_operand" "=r")
595 (neg:I48MODE (match_operand:I48MODE 1 "register_operand" "r")))
596 (trap_if (ne (neg:<DWI> (sign_extend:<DWI> (match_dup 1)))
597 (sign_extend:<DWI> (neg:I48MODE (match_dup 1))))
598 (const_int 0))]
599 ""
600 "sub<modesuffix>v $31,%1,%0")
601
602 (define_insn "sub<mode>3"
603 [(set (match_operand:I48MODE 0 "register_operand" "=r")
604 (minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rJ")
605 (match_operand:I48MODE 2 "reg_or_8bit_operand" "rI")))]
606 ""
607 "sub<modesuffix> %r1,%2,%0")
608
609 (define_insn "*subsi_se"
610 [(set (match_operand:DI 0 "register_operand" "=r")
611 (sign_extend:DI
612 (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
613 (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))]
614 ""
615 "subl %r1,%2,%0")
616
617 (define_insn "*subsi_se2"
618 [(set (match_operand:DI 0 "register_operand" "=r")
619 (sign_extend:DI
620 (subreg:SI (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
621 (match_operand:DI 2 "reg_or_8bit_operand" "rI"))
622 0)))]
623 ""
624 "subl %r1,%2,%0")
625
626 (define_insn "*ssub<modesuffix>"
627 [(set (match_operand:I48MODE 0 "register_operand" "=r")
628 (minus:I48MODE
629 (ashift:I48MODE (match_operand:I48MODE 1 "reg_not_elim_operand" "r")
630 (match_operand:I48MODE 2 "const23_operand" "I"))
631 (match_operand:I48MODE 3 "reg_or_8bit_operand" "rI")))]
632 ""
633 "s%P2sub<modesuffix> %1,%3,%0")
634
635 (define_insn "*ssubl_se"
636 [(set (match_operand:DI 0 "register_operand" "=r")
637 (sign_extend:DI
638 (minus:SI
639 (ashift:SI (match_operand:SI 1 "reg_not_elim_operand" "r")
640 (match_operand:SI 2 "const23_operand" "I"))
641 (match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
642 ""
643 "s%P2subl %1,%3,%0")
644
645 (define_insn "subv<mode>3"
646 [(set (match_operand:I48MODE 0 "register_operand" "=r")
647 (minus:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "rJ")
648 (match_operand:I48MODE 2 "reg_or_8bit_operand" "rI")))
649 (trap_if (ne (minus:<DWI> (sign_extend:<DWI> (match_dup 1))
650 (sign_extend:<DWI> (match_dup 2)))
651 (sign_extend:<DWI> (minus:I48MODE (match_dup 1)
652 (match_dup 2))))
653 (const_int 0))]
654 ""
655 "sub<modesuffix>v %r1,%2,%0")
656
657 (define_insn "mul<mode>3"
658 [(set (match_operand:I48MODE 0 "register_operand" "=r")
659 (mult:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "%rJ")
660 (match_operand:I48MODE 2 "reg_or_8bit_operand" "rI")))]
661 ""
662 "mul<modesuffix> %r1,%2,%0"
663 [(set_attr "type" "imul")
664 (set_attr "opsize" "<mode>")])
665
666 (define_insn "*mulsi_se"
667 [(set (match_operand:DI 0 "register_operand" "=r")
668 (sign_extend:DI
669 (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
670 (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))]
671 ""
672 "mull %r1,%2,%0"
673 [(set_attr "type" "imul")
674 (set_attr "opsize" "si")])
675
676 (define_insn "mulv<mode>3"
677 [(set (match_operand:I48MODE 0 "register_operand" "=r")
678 (mult:I48MODE (match_operand:I48MODE 1 "reg_or_0_operand" "%rJ")
679 (match_operand:I48MODE 2 "reg_or_8bit_operand" "rI")))
680 (trap_if (ne (mult:<DWI> (sign_extend:<DWI> (match_dup 1))
681 (sign_extend:<DWI> (match_dup 2)))
682 (sign_extend:<DWI> (mult:I48MODE (match_dup 1)
683 (match_dup 2))))
684 (const_int 0))]
685 ""
686 "mul<modesuffix>v %r1,%2,%0"
687 [(set_attr "type" "imul")
688 (set_attr "opsize" "<mode>")])
689
690 (define_expand "umuldi3_highpart"
691 [(set (match_operand:DI 0 "register_operand")
692 (truncate:DI
693 (lshiftrt:TI
694 (mult:TI (zero_extend:TI
695 (match_operand:DI 1 "register_operand"))
696 (match_operand:DI 2 "reg_or_8bit_operand"))
697 (const_int 64))))]
698 ""
699 {
700 if (REG_P (operands[2]))
701 operands[2] = gen_rtx_ZERO_EXTEND (TImode, operands[2]);
702 })
703
704 (define_insn "*umuldi3_highpart_reg"
705 [(set (match_operand:DI 0 "register_operand" "=r")
706 (truncate:DI
707 (lshiftrt:TI
708 (mult:TI (zero_extend:TI
709 (match_operand:DI 1 "register_operand" "r"))
710 (zero_extend:TI
711 (match_operand:DI 2 "register_operand" "r")))
712 (const_int 64))))]
713 ""
714 "umulh %1,%2,%0"
715 [(set_attr "type" "imul")
716 (set_attr "opsize" "udi")])
717
718 (define_insn "*umuldi3_highpart_const"
719 [(set (match_operand:DI 0 "register_operand" "=r")
720 (truncate:DI
721 (lshiftrt:TI
722 (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "r"))
723 (match_operand:TI 2 "cint8_operand" "I"))
724 (const_int 64))))]
725 ""
726 "umulh %1,%2,%0"
727 [(set_attr "type" "imul")
728 (set_attr "opsize" "udi")])
729
730 (define_expand "umulditi3"
731 [(set (match_operand:TI 0 "register_operand")
732 (mult:TI
733 (zero_extend:TI (match_operand:DI 1 "reg_no_subreg_operand"))
734 (zero_extend:TI (match_operand:DI 2 "reg_no_subreg_operand"))))]
735 ""
736 {
737 rtx l = gen_reg_rtx (DImode), h = gen_reg_rtx (DImode);
738 emit_insn (gen_muldi3 (l, operands[1], operands[2]));
739 emit_insn (gen_umuldi3_highpart (h, operands[1], operands[2]));
740 emit_move_insn (gen_lowpart (DImode, operands[0]), l);
741 emit_move_insn (gen_highpart (DImode, operands[0]), h);
742 DONE;
743 })
744
746 ;; The divide and remainder operations take their inputs from r24 and
747 ;; r25, put their output in r27, and clobber r23 and r28 on all systems.
748 ;;
749 ;; ??? Force sign-extension here because some versions of OSF/1 and
750 ;; Interix/NT don't do the right thing if the inputs are not properly
751 ;; sign-extended. But Linux, for instance, does not have this
752 ;; problem. Is it worth the complication here to eliminate the sign
753 ;; extension?
754
755 (define_code_iterator any_divmod [div mod udiv umod])
756
757 (define_expand "<code>si3"
758 [(set (match_dup 3)
759 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand")))
760 (set (match_dup 4)
761 (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand")))
762 (parallel [(set (match_dup 5)
763 (sign_extend:DI
764 (any_divmod:SI (truncate:SI (match_dup 3))
765 (truncate:SI (match_dup 4)))))
766 (clobber (reg:DI 23))
767 (clobber (reg:DI 28))])
768 (set (match_operand:SI 0 "nonimmediate_operand")
769 (subreg:SI (match_dup 5) 0))]
770 "TARGET_ABI_OSF"
771 {
772 operands[3] = gen_reg_rtx (DImode);
773 operands[4] = gen_reg_rtx (DImode);
774 operands[5] = gen_reg_rtx (DImode);
775 })
776
777 (define_expand "<code>di3"
778 [(parallel [(set (match_operand:DI 0 "register_operand")
779 (any_divmod:DI
780 (match_operand:DI 1 "register_operand")
781 (match_operand:DI 2 "register_operand")))
782 (clobber (reg:DI 23))
783 (clobber (reg:DI 28))])]
784 "TARGET_ABI_OSF")
785
786 ;; Lengths of 8 for ldq $t12,__divq($gp); jsr $t9,($t12),__divq as
787 ;; expanded by the assembler.
788
789 (define_insn_and_split "*divmodsi_internal_er"
790 [(set (match_operand:DI 0 "register_operand" "=c")
791 (sign_extend:DI
792 (match_operator:SI 3 "divmod_operator"
793 [(truncate:SI (match_operand:DI 1 "register_operand" "a"))
794 (truncate:SI (match_operand:DI 2 "register_operand" "b"))])))
795 (clobber (reg:DI 23))
796 (clobber (reg:DI 28))]
797 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
798 "#"
799 "&& reload_completed"
800 [(parallel [(set (match_dup 0)
801 (sign_extend:DI (match_dup 3)))
802 (use (match_dup 0))
803 (use (match_dup 4))
804 (clobber (reg:DI 23))
805 (clobber (reg:DI 28))])]
806 {
807 const char *str;
808 switch (GET_CODE (operands[3]))
809 {
810 case DIV:
811 str = "__divl";
812 break;
813 case UDIV:
814 str = "__divlu";
815 break;
816 case MOD:
817 str = "__reml";
818 break;
819 case UMOD:
820 str = "__remlu";
821 break;
822 default:
823 gcc_unreachable ();
824 }
825 operands[4] = GEN_INT (alpha_next_sequence_number++);
826 emit_insn (gen_movdi_er_high_g (operands[0], pic_offset_table_rtx,
827 gen_rtx_SYMBOL_REF (DImode, str),
828 operands[4]));
829 }
830 [(set_attr "type" "jsr")
831 (set_attr "length" "8")])
832
833 (define_insn "*divmodsi_internal_er_1"
834 [(set (match_operand:DI 0 "register_operand" "=c")
835 (sign_extend:DI (match_operator:SI 3 "divmod_operator"
836 [(truncate:SI (match_operand:DI 1 "register_operand" "a"))
837 (truncate:SI (match_operand:DI 2 "register_operand" "b"))])))
838 (use (match_operand:DI 4 "register_operand" "c"))
839 (use (match_operand 5 "const_int_operand"))
840 (clobber (reg:DI 23))
841 (clobber (reg:DI 28))]
842 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
843 "jsr $23,($27),__%E3%j5"
844 [(set_attr "type" "jsr")
845 (set_attr "length" "4")])
846
847 (define_insn "*divmodsi_internal"
848 [(set (match_operand:DI 0 "register_operand" "=c")
849 (sign_extend:DI
850 (match_operator:SI 3 "divmod_operator"
851 [(truncate:SI (match_operand:DI 1 "register_operand" "a"))
852 (truncate:SI (match_operand:DI 2 "register_operand" "b"))])))
853 (clobber (reg:DI 23))
854 (clobber (reg:DI 28))]
855 "TARGET_ABI_OSF"
856 "%E3 %1,%2,%0"
857 [(set_attr "type" "jsr")
858 (set_attr "length" "8")])
859
860 (define_insn_and_split "*divmoddi_internal_er"
861 [(set (match_operand:DI 0 "register_operand" "=c")
862 (match_operator:DI 3 "divmod_operator"
863 [(match_operand:DI 1 "register_operand" "a")
864 (match_operand:DI 2 "register_operand" "b")]))
865 (clobber (reg:DI 23))
866 (clobber (reg:DI 28))]
867 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
868 "#"
869 "&& reload_completed"
870 [(parallel [(set (match_dup 0) (match_dup 3))
871 (use (match_dup 0))
872 (use (match_dup 4))
873 (clobber (reg:DI 23))
874 (clobber (reg:DI 28))])]
875 {
876 const char *str;
877 switch (GET_CODE (operands[3]))
878 {
879 case DIV:
880 str = "__divq";
881 break;
882 case UDIV:
883 str = "__divqu";
884 break;
885 case MOD:
886 str = "__remq";
887 break;
888 case UMOD:
889 str = "__remqu";
890 break;
891 default:
892 gcc_unreachable ();
893 }
894 operands[4] = GEN_INT (alpha_next_sequence_number++);
895 emit_insn (gen_movdi_er_high_g (operands[0], pic_offset_table_rtx,
896 gen_rtx_SYMBOL_REF (DImode, str),
897 operands[4]));
898 }
899 [(set_attr "type" "jsr")
900 (set_attr "length" "8")])
901
902 (define_insn "*divmoddi_internal_er_1"
903 [(set (match_operand:DI 0 "register_operand" "=c")
904 (match_operator:DI 3 "divmod_operator"
905 [(match_operand:DI 1 "register_operand" "a")
906 (match_operand:DI 2 "register_operand" "b")]))
907 (use (match_operand:DI 4 "register_operand" "c"))
908 (use (match_operand 5 "const_int_operand"))
909 (clobber (reg:DI 23))
910 (clobber (reg:DI 28))]
911 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
912 "jsr $23,($27),__%E3%j5"
913 [(set_attr "type" "jsr")
914 (set_attr "length" "4")])
915
916 (define_insn "*divmoddi_internal"
917 [(set (match_operand:DI 0 "register_operand" "=c")
918 (match_operator:DI 3 "divmod_operator"
919 [(match_operand:DI 1 "register_operand" "a")
920 (match_operand:DI 2 "register_operand" "b")]))
921 (clobber (reg:DI 23))
922 (clobber (reg:DI 28))]
923 "TARGET_ABI_OSF"
924 "%E3 %1,%2,%0"
925 [(set_attr "type" "jsr")
926 (set_attr "length" "8")])
927
929 ;; Next are the basic logical operations. We only expose the DImode operations
930 ;; to the rtl expanders, but SImode versions exist for combine as well as for
931 ;; the atomic operation splitters.
932
933 (define_insn "*andsi_internal"
934 [(set (match_operand:SI 0 "register_operand" "=r,r,r")
935 (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ,rJ")
936 (match_operand:SI 2 "and_operand" "rI,N,M")))]
937 ""
938 "@
939 and %r1,%2,%0
940 bic %r1,%N2,%0
941 zapnot %r1,%m2,%0"
942 [(set_attr "type" "ilog,ilog,shift")])
943
944 (define_insn "anddi3"
945 [(set (match_operand:DI 0 "register_operand" "=r,r,r")
946 (and:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ,rJ")
947 (match_operand:DI 2 "and_operand" "rI,N,M")))]
948 ""
949 "@
950 and %r1,%2,%0
951 bic %r1,%N2,%0
952 zapnot %r1,%m2,%0"
953 [(set_attr "type" "ilog,ilog,shift")])
954
955 ;; There are times when we can split an AND into two AND insns. This occurs
956 ;; when we can first clear any bytes and then clear anything else. For
957 ;; example "I & 0xffff07" is "(I & 0xffffff) & 0xffffffffffffff07".
958 ;; Only do this when running on 64-bit host since the computations are
959 ;; too messy otherwise.
960
961 (define_split
962 [(set (match_operand:DI 0 "register_operand")
963 (and:DI (match_operand:DI 1 "register_operand")
964 (match_operand:DI 2 "const_int_operand")))]
965 "! and_operand (operands[2], DImode)"
966 [(set (match_dup 0) (and:DI (match_dup 1) (match_dup 3)))
967 (set (match_dup 0) (and:DI (match_dup 0) (match_dup 4)))]
968 {
969 unsigned HOST_WIDE_INT mask1 = INTVAL (operands[2]);
970 unsigned HOST_WIDE_INT mask2 = mask1;
971 int i;
972
973 /* For each byte that isn't all zeros, make it all ones. */
974 for (i = 0; i < 64; i += 8)
975 if ((mask1 & ((HOST_WIDE_INT) 0xff << i)) != 0)
976 mask1 |= (HOST_WIDE_INT) 0xff << i;
977
978 /* Now turn on any bits we've just turned off. */
979 mask2 |= ~ mask1;
980
981 operands[3] = GEN_INT (mask1);
982 operands[4] = GEN_INT (mask2);
983 })
984
985 (define_insn "zero_extendqi<mode>2"
986 [(set (match_operand:I248MODE 0 "register_operand" "=r,r")
987 (zero_extend:I248MODE
988 (match_operand:QI 1 "reg_or_bwx_memory_operand" "r,m")))]
989 ""
990 "@
991 and %1,0xff,%0
992 ldbu %0,%1"
993 [(set_attr "type" "ilog,ild")
994 (set_attr "isa" "*,bwx")])
995
996 (define_insn "zero_extendhi<mode>2"
997 [(set (match_operand:I48MODE 0 "register_operand" "=r,r")
998 (zero_extend:I48MODE
999 (match_operand:HI 1 "reg_or_bwx_memory_operand" "r,m")))]
1000 ""
1001 "@
1002 zapnot %1,3,%0
1003 ldwu %0,%1"
1004 [(set_attr "type" "shift,ild")
1005 (set_attr "isa" "*,bwx")])
1006
1007 (define_insn "zero_extendsidi2"
1008 [(set (match_operand:DI 0 "register_operand" "=r")
1009 (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
1010 ""
1011 "zapnot %1,15,%0"
1012 [(set_attr "type" "shift")])
1013
1014 (define_insn "andnot<mode>3"
1015 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1016 (and:I48MODE
1017 (not:I48MODE (match_operand:I48MODE 1 "reg_or_8bit_operand" "rI"))
1018 (match_operand:I48MODE 2 "reg_or_0_operand" "rJ")))]
1019 ""
1020 "bic %r2,%1,%0"
1021 [(set_attr "type" "ilog")])
1022
1023 (define_insn "*iorsi_internal"
1024 [(set (match_operand:SI 0 "register_operand" "=r,r")
1025 (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
1026 (match_operand:SI 2 "or_operand" "rI,N")))]
1027 ""
1028 "@
1029 bis %r1,%2,%0
1030 ornot %r1,%N2,%0"
1031 [(set_attr "type" "ilog")])
1032
1033 (define_insn "iordi3"
1034 [(set (match_operand:DI 0 "register_operand" "=r,r")
1035 (ior:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
1036 (match_operand:DI 2 "or_operand" "rI,N")))]
1037 ""
1038 "@
1039 bis %r1,%2,%0
1040 ornot %r1,%N2,%0"
1041 [(set_attr "type" "ilog")])
1042
1043 (define_insn "*one_cmplsi_internal"
1044 [(set (match_operand:SI 0 "register_operand" "=r")
1045 (not:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI")))]
1046 ""
1047 "ornot $31,%1,%0"
1048 [(set_attr "type" "ilog")])
1049
1050 (define_insn "one_cmpldi2"
1051 [(set (match_operand:DI 0 "register_operand" "=r")
1052 (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")))]
1053 ""
1054 "ornot $31,%1,%0"
1055 [(set_attr "type" "ilog")])
1056
1057 (define_insn "*iornot<mode>3"
1058 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1059 (ior:I48MODE
1060 (not:I48MODE (match_operand:I48MODE 1 "reg_or_8bit_operand" "rI"))
1061 (match_operand:I48MODE 2 "reg_or_0_operand" "rJ")))]
1062 ""
1063 "ornot %r2,%1,%0"
1064 [(set_attr "type" "ilog")])
1065
1066 (define_insn "*xorsi_internal"
1067 [(set (match_operand:SI 0 "register_operand" "=r,r")
1068 (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
1069 (match_operand:SI 2 "or_operand" "rI,N")))]
1070 ""
1071 "@
1072 xor %r1,%2,%0
1073 eqv %r1,%N2,%0"
1074 [(set_attr "type" "ilog")])
1075
1076 (define_insn "xordi3"
1077 [(set (match_operand:DI 0 "register_operand" "=r,r")
1078 (xor:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
1079 (match_operand:DI 2 "or_operand" "rI,N")))]
1080 ""
1081 "@
1082 xor %r1,%2,%0
1083 eqv %r1,%N2,%0"
1084 [(set_attr "type" "ilog")])
1085
1086 (define_insn "*xornot<mode>3"
1087 [(set (match_operand:I48MODE 0 "register_operand" "=r")
1088 (not:I48MODE (xor:I48MODE
1089 (match_operand:I48MODE 1 "register_operand" "%rJ")
1090 (match_operand:I48MODE 2 "register_operand" "rI"))))]
1091 ""
1092 "eqv %r1,%2,%0"
1093 [(set_attr "type" "ilog")])
1094
1096 ;; Handle FFS and related insns iff we support CIX.
1097
1098 (define_expand "ffsdi2"
1099 [(set (match_dup 2)
1100 (ctz:DI (match_operand:DI 1 "register_operand")))
1101 (set (match_dup 3)
1102 (plus:DI (match_dup 2) (const_int 1)))
1103 (set (match_operand:DI 0 "register_operand")
1104 (if_then_else:DI (eq (match_dup 1) (const_int 0))
1105 (const_int 0) (match_dup 3)))]
1106 "TARGET_CIX"
1107 {
1108 operands[2] = gen_reg_rtx (DImode);
1109 operands[3] = gen_reg_rtx (DImode);
1110 })
1111
1112 (define_insn "clzdi2"
1113 [(set (match_operand:DI 0 "register_operand" "=r")
1114 (clz:DI (match_operand:DI 1 "register_operand" "r")))]
1115 "TARGET_CIX"
1116 "ctlz %1,%0"
1117 [(set_attr "type" "mvi")])
1118
1119 (define_insn "ctzdi2"
1120 [(set (match_operand:DI 0 "register_operand" "=r")
1121 (ctz:DI (match_operand:DI 1 "register_operand" "r")))]
1122 "TARGET_CIX"
1123 "cttz %1,%0"
1124 [(set_attr "type" "mvi")])
1125
1126 (define_insn "popcountdi2"
1127 [(set (match_operand:DI 0 "register_operand" "=r")
1128 (popcount:DI (match_operand:DI 1 "register_operand" "r")))]
1129 "TARGET_CIX"
1130 "ctpop %1,%0"
1131 [(set_attr "type" "mvi")])
1132
1133 (define_expand "bswapsi2"
1134 [(set (match_operand:SI 0 "register_operand")
1135 (bswap:SI (match_operand:SI 1 "register_operand")))]
1136 "!optimize_size"
1137 {
1138 rtx t0, t1;
1139
1140 t0 = gen_reg_rtx (DImode);
1141 t1 = gen_reg_rtx (DImode);
1142
1143 emit_insn (gen_inslh (t0, gen_lowpart (DImode, operands[1]), GEN_INT (7)));
1144 emit_insn (gen_inswl_const (t1, gen_lowpart (HImode, operands[1]),
1145 GEN_INT (24)));
1146 emit_insn (gen_iordi3 (t1, t0, t1));
1147 emit_insn (gen_lshrdi3 (t0, t1, GEN_INT (16)));
1148 emit_insn (gen_anddi3 (t1, t1, alpha_expand_zap_mask (0x5)));
1149 emit_insn (gen_anddi3 (t0, t0, alpha_expand_zap_mask (0xa)));
1150 emit_insn (gen_addsi3 (operands[0], gen_lowpart (SImode, t0),
1151 gen_lowpart (SImode, t1)));
1152 DONE;
1153 })
1154
1155 (define_expand "bswapdi2"
1156 [(set (match_operand:DI 0 "register_operand")
1157 (bswap:DI (match_operand:DI 1 "register_operand")))]
1158 "!optimize_size"
1159 {
1160 rtx t0, t1;
1161
1162 t0 = gen_reg_rtx (DImode);
1163 t1 = gen_reg_rtx (DImode);
1164
1165 /* This method of shifting and masking is not specific to Alpha, but
1166 is only profitable on Alpha because of our handy byte zap insn. */
1167
1168 emit_insn (gen_lshrdi3 (t0, operands[1], GEN_INT (32)));
1169 emit_insn (gen_ashldi3 (t1, operands[1], GEN_INT (32)));
1170 emit_insn (gen_iordi3 (t1, t0, t1));
1171
1172 emit_insn (gen_lshrdi3 (t0, t1, GEN_INT (16)));
1173 emit_insn (gen_ashldi3 (t1, t1, GEN_INT (16)));
1174 emit_insn (gen_anddi3 (t0, t0, alpha_expand_zap_mask (0xcc)));
1175 emit_insn (gen_anddi3 (t1, t1, alpha_expand_zap_mask (0x33)));
1176 emit_insn (gen_iordi3 (t1, t0, t1));
1177
1178 emit_insn (gen_lshrdi3 (t0, t1, GEN_INT (8)));
1179 emit_insn (gen_ashldi3 (t1, t1, GEN_INT (8)));
1180 emit_insn (gen_anddi3 (t0, t0, alpha_expand_zap_mask (0xaa)));
1181 emit_insn (gen_anddi3 (t1, t1, alpha_expand_zap_mask (0x55)));
1182 emit_insn (gen_iordi3 (operands[0], t0, t1));
1183 DONE;
1184 })
1185
1187 ;; Next come the shifts and the various extract and insert operations.
1188
1189 (define_insn "ashldi3"
1190 [(set (match_operand:DI 0 "register_operand" "=r,r")
1191 (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ,rJ")
1192 (match_operand:DI 2 "reg_or_6bit_operand" "P,rS")))]
1193 ""
1194 {
1195 switch (which_alternative)
1196 {
1197 case 0:
1198 if (operands[2] == const1_rtx)
1199 return "addq %r1,%r1,%0";
1200 else
1201 return "s%P2addq %r1,0,%0";
1202 case 1:
1203 return "sll %r1,%2,%0";
1204 default:
1205 gcc_unreachable ();
1206 }
1207 }
1208 [(set_attr "type" "iadd,shift")])
1209
1210 (define_insn "ashlsi3"
1211 [(set (match_operand:SI 0 "register_operand" "=r")
1212 (ashift:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
1213 (match_operand:SI 2 "const123_operand" "P")))]
1214 ""
1215 {
1216 if (operands[2] == const1_rtx)
1217 return "addl %r1,%r1,%0";
1218 else
1219 return "s%P2addl %r1,0,%0";
1220 }
1221 [(set_attr "type" "iadd")])
1222
1223 (define_insn "*ashlsi_se"
1224 [(set (match_operand:DI 0 "register_operand" "=r")
1225 (sign_extend:DI
1226 (ashift:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
1227 (match_operand:SI 2 "const123_operand" "P"))))]
1228 ""
1229 {
1230 if (operands[2] == const1_rtx)
1231 return "addl %r1,%r1,%0";
1232 else
1233 return "s%P2addl %r1,0,%0";
1234 }
1235 [(set_attr "type" "iadd")])
1236
1237 (define_insn "lshrdi3"
1238 [(set (match_operand:DI 0 "register_operand" "=r")
1239 (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1240 (match_operand:DI 2 "reg_or_6bit_operand" "rS")))]
1241 ""
1242 "srl %r1,%2,%0"
1243 [(set_attr "type" "shift")])
1244
1245 (define_insn "ashrdi3"
1246 [(set (match_operand:DI 0 "register_operand" "=r")
1247 (ashiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1248 (match_operand:DI 2 "reg_or_6bit_operand" "rS")))]
1249 ""
1250 "sra %r1,%2,%0"
1251 [(set_attr "type" "shift")])
1252
1253 (define_insn "extendqi<mode>2"
1254 [(set (match_operand:I24MODE 0 "register_operand" "=r")
1255 (sign_extend:I24MODE
1256 (match_operand:QI 1 "register_operand" "r")))]
1257 "TARGET_BWX"
1258 "sextb %1,%0"
1259 [(set_attr "type" "shift")])
1260
1261 (define_expand "extendqidi2"
1262 [(set (match_operand:DI 0 "register_operand")
1263 (sign_extend:DI (match_operand:QI 1 "general_operand")))]
1264 ""
1265 {
1266 if (TARGET_BWX)
1267 operands[1] = force_reg (QImode, operands[1]);
1268 else
1269 {
1270 rtx x, t1, t2, i56;
1271
1272 if (unaligned_memory_operand (operands[1], QImode))
1273 {
1274 x = gen_unaligned_extendqidi (operands[0], XEXP (operands[1], 0));
1275 alpha_set_memflags (x, operands[1]);
1276 emit_insn (x);
1277 DONE;
1278 }
1279
1280 t1 = gen_reg_rtx (DImode);
1281 t2 = gen_reg_rtx (DImode);
1282 i56 = GEN_INT (56);
1283
1284 x = gen_lowpart (DImode, force_reg (QImode, operands[1]));
1285 emit_move_insn (t1, x);
1286 emit_insn (gen_ashldi3 (t2, t1, i56));
1287 emit_insn (gen_ashrdi3 (operands[0], t2, i56));
1288 DONE;
1289 }
1290 })
1291
1292 (define_insn "*extendqidi2_bwx"
1293 [(set (match_operand:DI 0 "register_operand" "=r")
1294 (sign_extend:DI (match_operand:QI 1 "register_operand" "r")))]
1295 "TARGET_BWX"
1296 "sextb %1,%0"
1297 [(set_attr "type" "shift")])
1298
1299 (define_insn "extendhisi2"
1300 [(set (match_operand:SI 0 "register_operand" "=r")
1301 (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))]
1302 "TARGET_BWX"
1303 "sextw %1,%0"
1304 [(set_attr "type" "shift")])
1305
1306 (define_expand "extendhidi2"
1307 [(set (match_operand:DI 0 "register_operand")
1308 (sign_extend:DI (match_operand:HI 1 "general_operand")))]
1309 ""
1310 {
1311 if (TARGET_BWX)
1312 operands[1] = force_reg (HImode, operands[1]);
1313 else
1314 {
1315 rtx x, t1, t2, i48;
1316
1317 if (unaligned_memory_operand (operands[1], HImode))
1318 {
1319 x = gen_unaligned_extendhidi (operands[0], XEXP (operands[1], 0));
1320 alpha_set_memflags (x, operands[1]);
1321 emit_insn (x);
1322 DONE;
1323 }
1324
1325 t1 = gen_reg_rtx (DImode);
1326 t2 = gen_reg_rtx (DImode);
1327 i48 = GEN_INT (48);
1328
1329 x = gen_lowpart (DImode, force_reg (HImode, operands[1]));
1330 emit_move_insn (t1, x);
1331 emit_insn (gen_ashldi3 (t2, t1, i48));
1332 emit_insn (gen_ashrdi3 (operands[0], t2, i48));
1333 DONE;
1334 }
1335 })
1336
1337 (define_insn "*extendhidi2_bwx"
1338 [(set (match_operand:DI 0 "register_operand" "=r")
1339 (sign_extend:DI (match_operand:HI 1 "register_operand" "r")))]
1340 "TARGET_BWX"
1341 "sextw %1,%0"
1342 [(set_attr "type" "shift")])
1343
1344 ;; Here's how we sign extend an unaligned byte and halfword. Doing this
1345 ;; as a pattern saves one instruction. The code is similar to that for
1346 ;; the unaligned loads (see below).
1347 ;;
1348 ;; Operand 1 is the address, operand 0 is the result.
1349
1350 (define_expand "unaligned_extendqidi"
1351 [(set (match_dup 3)
1352 (mem:DI (and:DI (match_operand:DI 1 "address_operand") (const_int -8))))
1353 (set (match_dup 4)
1354 (ashift:DI (match_dup 3)
1355 (minus:DI (const_int 64)
1356 (ashift:DI
1357 (and:DI (match_dup 2) (const_int 7))
1358 (const_int 3)))))
1359 (set (match_operand:QI 0 "register_operand")
1360 (ashiftrt:DI (match_dup 4) (const_int 56)))]
1361 ""
1362 {
1363 operands[0] = gen_lowpart (DImode, operands[0]);
1364 operands[2] = get_unaligned_offset (operands[1], 1);
1365 operands[3] = gen_reg_rtx (DImode);
1366 operands[4] = gen_reg_rtx (DImode);
1367 })
1368
1369 (define_expand "unaligned_extendhidi"
1370 [(set (match_dup 3)
1371 (mem:DI (and:DI (match_operand:DI 1 "address_operand") (const_int -8))))
1372 (set (match_dup 4)
1373 (ashift:DI (match_dup 3)
1374 (minus:DI (const_int 64)
1375 (ashift:DI
1376 (and:DI (match_dup 2) (const_int 7))
1377 (const_int 3)))))
1378 (set (match_operand:HI 0 "register_operand")
1379 (ashiftrt:DI (match_dup 4) (const_int 48)))]
1380 ""
1381 {
1382 operands[0] = gen_lowpart (DImode, operands[0]);
1383 operands[2] = get_unaligned_offset (operands[1], 2);
1384 operands[3] = gen_reg_rtx (DImode);
1385 operands[4] = gen_reg_rtx (DImode);
1386 })
1387
1388 (define_insn "*extxl_const"
1389 [(set (match_operand:DI 0 "register_operand" "=r")
1390 (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1391 (match_operand:DI 2 "mode_width_operand" "n")
1392 (match_operand:DI 3 "mul8_operand" "I")))]
1393 ""
1394 "ext%M2l %r1,%s3,%0"
1395 [(set_attr "type" "shift")])
1396
1397 (define_insn "extxl"
1398 [(set (match_operand:DI 0 "register_operand" "=r")
1399 (zero_extract:DI
1400 (match_operand:DI 1 "reg_or_0_operand" "rJ")
1401 (match_operand:DI 2 "mode_width_operand" "n")
1402 (ashift:DI (match_operand:DI 3 "reg_or_8bit_operand" "rI")
1403 (const_int 3))))]
1404 ""
1405 "ext%M2l %r1,%3,%0"
1406 [(set_attr "type" "shift")])
1407
1408 ;; Combine has some strange notion of preserving existing undefined behavior
1409 ;; in shifts larger than a word size. So capture these patterns that it
1410 ;; should have turned into zero_extracts.
1411
1412 (define_insn "*extxl_1"
1413 [(set (match_operand:DI 0 "register_operand" "=r")
1414 (and:DI (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1415 (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1416 (const_int 3)))
1417 (match_operand:DI 3 "mode_mask_operand" "n")))]
1418 ""
1419 "ext%U3l %1,%2,%0"
1420 [(set_attr "type" "shift")])
1421
1422 (define_insn "*extql_2"
1423 [(set (match_operand:DI 0 "register_operand" "=r")
1424 (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1425 (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1426 (const_int 3))))]
1427 ""
1428 "extql %1,%2,%0"
1429 [(set_attr "type" "shift")])
1430
1431 (define_insn "extqh"
1432 [(set (match_operand:DI 0 "register_operand" "=r")
1433 (ashift:DI
1434 (match_operand:DI 1 "reg_or_0_operand" "rJ")
1435 (minus:DI (const_int 64)
1436 (ashift:DI
1437 (and:DI
1438 (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1439 (const_int 7))
1440 (const_int 3)))))]
1441 ""
1442 "extqh %r1,%2,%0"
1443 [(set_attr "type" "shift")])
1444
1445 (define_insn "extwh"
1446 [(set (match_operand:DI 0 "register_operand" "=r")
1447 (ashift:DI
1448 (and:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1449 (const_int 65535))
1450 (minus:DI (const_int 64)
1451 (ashift:DI
1452 (and:DI
1453 (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1454 (const_int 7))
1455 (const_int 3)))))]
1456 ""
1457 "extwh %r1,%2,%0"
1458 [(set_attr "type" "shift")])
1459
1460 (define_insn "extlh"
1461 [(set (match_operand:DI 0 "register_operand" "=r")
1462 (ashift:DI
1463 (and:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1464 (const_int 2147483647))
1465 (minus:DI (const_int 64)
1466 (ashift:DI
1467 (and:DI
1468 (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1469 (const_int 7))
1470 (const_int 3)))))]
1471 ""
1472 "extlh %r1,%2,%0"
1473 [(set_attr "type" "shift")])
1474
1475 ;; This converts an extXl into an extXh with an appropriate adjustment
1476 ;; to the address calculation.
1477
1478 ;;(define_split
1479 ;; [(set (match_operand:DI 0 "register_operand")
1480 ;; (ashift:DI (zero_extract:DI (match_operand:DI 1 "register_operand")
1481 ;; (match_operand:DI 2 "mode_width_operand")
1482 ;; (ashift:DI (match_operand:DI 3)
1483 ;; (const_int 3)))
1484 ;; (match_operand:DI 4 "const_int_operand")))
1485 ;; (clobber (match_operand:DI 5 "register_operand"))]
1486 ;; "INTVAL (operands[4]) == 64 - INTVAL (operands[2])"
1487 ;; [(set (match_dup 5) (match_dup 6))
1488 ;; (set (match_dup 0)
1489 ;; (ashift:DI (zero_extract:DI (match_dup 1) (match_dup 2)
1490 ;; (ashift:DI (plus:DI (match_dup 5)
1491 ;; (match_dup 7))
1492 ;; (const_int 3)))
1493 ;; (match_dup 4)))]
1494 ;; "
1495 ;;{
1496 ;; operands[6] = plus_constant (DImode, operands[3],
1497 ;; INTVAL (operands[2]) / BITS_PER_UNIT);
1498 ;; operands[7] = GEN_INT (- INTVAL (operands[2]) / BITS_PER_UNIT);
1499 ;;}")
1500
1501 (define_insn "ins<modesuffix>l_const"
1502 [(set (match_operand:DI 0 "register_operand" "=r")
1503 (ashift:DI (zero_extend:DI
1504 (match_operand:I124MODE 1 "register_operand" "r"))
1505 (match_operand:DI 2 "mul8_operand" "I")))]
1506 ""
1507 "ins<modesuffix>l %1,%s2,%0"
1508 [(set_attr "type" "shift")])
1509
1510 (define_insn "ins<modesuffix>l"
1511 [(set (match_operand:DI 0 "register_operand" "=r")
1512 (ashift:DI (zero_extend:DI
1513 (match_operand:I124MODE 1 "register_operand" "r"))
1514 (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1515 (const_int 3))))]
1516 ""
1517 "ins<modesuffix>l %1,%2,%0"
1518 [(set_attr "type" "shift")])
1519
1520 (define_insn "insql"
1521 [(set (match_operand:DI 0 "register_operand" "=r")
1522 (ashift:DI (match_operand:DI 1 "register_operand" "r")
1523 (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1524 (const_int 3))))]
1525 ""
1526 "insql %1,%2,%0"
1527 [(set_attr "type" "shift")])
1528
1529 ;; Combine has this sometimes habit of moving the and outside of the
1530 ;; shift, making life more interesting.
1531
1532 (define_insn "*insxl"
1533 [(set (match_operand:DI 0 "register_operand" "=r")
1534 (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
1535 (match_operand:DI 2 "mul8_operand" "I"))
1536 (match_operand:DI 3 "const_int_operand" "i")))]
1537 "((unsigned HOST_WIDE_INT) 0xff << INTVAL (operands[2])
1538 == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
1539 || ((unsigned HOST_WIDE_INT) 0xffff << INTVAL (operands[2])
1540 == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
1541 || ((unsigned HOST_WIDE_INT) 0xffffffff << INTVAL (operands[2])
1542 == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))"
1543 {
1544 if ((unsigned HOST_WIDE_INT) 0xff << INTVAL (operands[2])
1545 == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
1546 return "insbl %1,%s2,%0";
1547 if ((unsigned HOST_WIDE_INT) 0xffff << INTVAL (operands[2])
1548 == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
1549 return "inswl %1,%s2,%0";
1550 if ((unsigned HOST_WIDE_INT) 0xffffffff << INTVAL (operands[2])
1551 == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
1552 return "insll %1,%s2,%0";
1553
1554 gcc_unreachable ();
1555 }
1556 [(set_attr "type" "shift")])
1557
1558 ;; We do not include the insXh insns because they are complex to express
1559 ;; and it does not appear that we would ever want to generate them.
1560 ;;
1561 ;; Since we need them for block moves, though, cop out and use unspec.
1562
1563 (define_insn "insxh"
1564 [(set (match_operand:DI 0 "register_operand" "=r")
1565 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
1566 (match_operand:DI 2 "mode_width_operand" "n")
1567 (match_operand:DI 3 "reg_or_8bit_operand" "rI")]
1568 UNSPEC_INSXH))]
1569 ""
1570 "ins%M2h %1,%3,%0"
1571 [(set_attr "type" "shift")])
1572
1573 (define_insn "mskxl"
1574 [(set (match_operand:DI 0 "register_operand" "=r")
1575 (and:DI (not:DI (ashift:DI
1576 (match_operand:DI 2 "mode_mask_operand" "n")
1577 (ashift:DI
1578 (match_operand:DI 3 "reg_or_8bit_operand" "rI")
1579 (const_int 3))))
1580 (match_operand:DI 1 "reg_or_0_operand" "rJ")))]
1581 ""
1582 "msk%U2l %r1,%3,%0"
1583 [(set_attr "type" "shift")])
1584
1585 ;; We do not include the mskXh insns because it does not appear we would
1586 ;; ever generate one.
1587 ;;
1588 ;; Again, we do for block moves and we use unspec again.
1589
1590 (define_insn "mskxh"
1591 [(set (match_operand:DI 0 "register_operand" "=r")
1592 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
1593 (match_operand:DI 2 "mode_width_operand" "n")
1594 (match_operand:DI 3 "reg_or_8bit_operand" "rI")]
1595 UNSPEC_MSKXH))]
1596 ""
1597 "msk%M2h %1,%3,%0"
1598 [(set_attr "type" "shift")])
1599
1600 ;; Prefer AND + NE over LSHIFTRT + AND.
1601
1602 (define_insn_and_split "*ze_and_ne"
1603 [(set (match_operand:DI 0 "register_operand" "=r")
1604 (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1605 (const_int 1)
1606 (match_operand 2 "const_int_operand" "I")))]
1607 "(unsigned HOST_WIDE_INT) INTVAL (operands[2]) < 8"
1608 "#"
1609 "(unsigned HOST_WIDE_INT) INTVAL (operands[2]) < 8"
1610 [(set (match_dup 0)
1611 (and:DI (match_dup 1) (match_dup 3)))
1612 (set (match_dup 0)
1613 (ne:DI (match_dup 0) (const_int 0)))]
1614 "operands[3] = GEN_INT (1 << INTVAL (operands[2]));")
1615
1617 ;; Floating-point operations. All the double-precision insns can extend
1618 ;; from single, so indicate that. The exception are the ones that simply
1619 ;; play with the sign bits; it's not clear what to do there.
1620
1621 (define_mode_iterator FMODE [SF DF])
1622
1623 (define_mode_attr opmode [(SF "si") (DF "di")])
1624
1625 (define_insn "abs<mode>2"
1626 [(set (match_operand:FMODE 0 "register_operand" "=f")
1627 (abs:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "fG")))]
1628 "TARGET_FP"
1629 "cpys $f31,%R1,%0"
1630 [(set_attr "type" "fcpys")])
1631
1632 (define_insn "*nabs<mode>2"
1633 [(set (match_operand:FMODE 0 "register_operand" "=f")
1634 (neg:FMODE
1635 (abs:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "fG"))))]
1636 "TARGET_FP"
1637 "cpysn $f31,%R1,%0"
1638 [(set_attr "type" "fadd")])
1639
1640 (define_expand "abstf2"
1641 [(parallel [(set (match_operand:TF 0 "register_operand")
1642 (abs:TF (match_operand:TF 1 "reg_or_0_operand")))
1643 (use (match_dup 2))])]
1644 "TARGET_HAS_XFLOATING_LIBS"
1645 "operands[2] = force_reg (DImode, GEN_INT (HOST_WIDE_INT_1U << 63));")
1646
1647 (define_insn_and_split "*abstf_internal"
1648 [(set (match_operand:TF 0 "register_operand" "=r")
1649 (abs:TF (match_operand:TF 1 "reg_or_0_operand" "rG")))
1650 (use (match_operand:DI 2 "register_operand" "r"))]
1651 "TARGET_HAS_XFLOATING_LIBS"
1652 "#"
1653 "&& reload_completed"
1654 [(const_int 0)]
1655 "alpha_split_tfmode_frobsign (operands, gen_andnotdi3); DONE;")
1656
1657 (define_insn "neg<mode>2"
1658 [(set (match_operand:FMODE 0 "register_operand" "=f")
1659 (neg:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "fG")))]
1660 "TARGET_FP"
1661 "cpysn %R1,%R1,%0"
1662 [(set_attr "type" "fadd")])
1663
1664 (define_expand "negtf2"
1665 [(parallel [(set (match_operand:TF 0 "register_operand")
1666 (neg:TF (match_operand:TF 1 "reg_or_0_operand")))
1667 (use (match_dup 2))])]
1668 "TARGET_HAS_XFLOATING_LIBS"
1669 "operands[2] = force_reg (DImode, GEN_INT (HOST_WIDE_INT_1U << 63));")
1670
1671 (define_insn_and_split "*negtf_internal"
1672 [(set (match_operand:TF 0 "register_operand" "=r")
1673 (neg:TF (match_operand:TF 1 "reg_or_0_operand" "rG")))
1674 (use (match_operand:DI 2 "register_operand" "r"))]
1675 "TARGET_HAS_XFLOATING_LIBS"
1676 "#"
1677 "&& reload_completed"
1678 [(const_int 0)]
1679 "alpha_split_tfmode_frobsign (operands, gen_xordi3); DONE;")
1680
1681 (define_insn "copysign<mode>3"
1682 [(set (match_operand:FMODE 0 "register_operand" "=f")
1683 (unspec:FMODE [(match_operand:FMODE 1 "reg_or_0_operand" "fG")
1684 (match_operand:FMODE 2 "reg_or_0_operand" "fG")]
1685 UNSPEC_COPYSIGN))]
1686 "TARGET_FP"
1687 "cpys %R2,%R1,%0"
1688 [(set_attr "type" "fadd")])
1689
1690 (define_insn "*ncopysign<mode>3"
1691 [(set (match_operand:FMODE 0 "register_operand" "=f")
1692 (neg:FMODE
1693 (unspec:FMODE [(match_operand:FMODE 1 "reg_or_0_operand" "fG")
1694 (match_operand:FMODE 2 "reg_or_0_operand" "fG")]
1695 UNSPEC_COPYSIGN)))]
1696 "TARGET_FP"
1697 "cpysn %R2,%R1,%0"
1698 [(set_attr "type" "fadd")])
1699
1700 (define_insn "add<mode>3"
1701 [(set (match_operand:FMODE 0 "register_operand" "=f,&f")
1702 (plus:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "%fG,fG")
1703 (match_operand:FMODE 2 "reg_or_0_operand" "fG,fG")))]
1704 "TARGET_FP"
1705 "add<modesuffix>%/ %R1,%R2,%0"
1706 [(set_attr "type" "fadd")
1707 (set_attr "trap" "yes")
1708 (set_attr "round_suffix" "normal")
1709 (set_attr "trap_suffix" "u_su_sui")
1710 (set (attr "enabled")
1711 (cond [(eq_attr "alternative" "0")
1712 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
1713 ]
1714 (symbol_ref "true")))])
1715
1716 (define_insn "*adddf_ext1"
1717 [(set (match_operand:DF 0 "register_operand" "=f")
1718 (plus:DF (float_extend:DF
1719 (match_operand:SF 1 "reg_or_0_operand" "fG"))
1720 (match_operand:DF 2 "reg_or_0_operand" "fG")))]
1721 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1722 "add%-%/ %R1,%R2,%0"
1723 [(set_attr "type" "fadd")
1724 (set_attr "trap" "yes")
1725 (set_attr "round_suffix" "normal")
1726 (set_attr "trap_suffix" "u_su_sui")])
1727
1728 (define_insn "*adddf_ext2"
1729 [(set (match_operand:DF 0 "register_operand" "=f")
1730 (plus:DF (float_extend:DF
1731 (match_operand:SF 1 "reg_or_0_operand" "%fG"))
1732 (float_extend:DF
1733 (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
1734 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1735 "add%-%/ %R1,%R2,%0"
1736 [(set_attr "type" "fadd")
1737 (set_attr "trap" "yes")
1738 (set_attr "round_suffix" "normal")
1739 (set_attr "trap_suffix" "u_su_sui")])
1740
1741 (define_expand "addtf3"
1742 [(use (match_operand:TF 0 "register_operand"))
1743 (use (match_operand:TF 1 "general_operand"))
1744 (use (match_operand:TF 2 "general_operand"))]
1745 "TARGET_HAS_XFLOATING_LIBS"
1746 "alpha_emit_xfloating_arith (PLUS, operands); DONE;")
1747
1748 (define_insn "sub<mode>3"
1749 [(set (match_operand:FMODE 0 "register_operand" "=f,&f")
1750 (minus:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "fG,fG")
1751 (match_operand:FMODE 2 "reg_or_0_operand" "fG,fG")))]
1752 "TARGET_FP"
1753 "sub<modesuffix>%/ %R1,%R2,%0"
1754 [(set_attr "type" "fadd")
1755 (set_attr "trap" "yes")
1756 (set_attr "round_suffix" "normal")
1757 (set_attr "trap_suffix" "u_su_sui")
1758 (set (attr "enabled")
1759 (cond [(eq_attr "alternative" "0")
1760 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
1761 ]
1762 (symbol_ref "true")))])
1763
1764 (define_insn "*subdf_ext1"
1765 [(set (match_operand:DF 0 "register_operand" "=f")
1766 (minus:DF (float_extend:DF
1767 (match_operand:SF 1 "reg_or_0_operand" "fG"))
1768 (match_operand:DF 2 "reg_or_0_operand" "fG")))]
1769 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1770 "sub%-%/ %R1,%R2,%0"
1771 [(set_attr "type" "fadd")
1772 (set_attr "trap" "yes")
1773 (set_attr "round_suffix" "normal")
1774 (set_attr "trap_suffix" "u_su_sui")])
1775
1776 (define_insn "*subdf_ext2"
1777 [(set (match_operand:DF 0 "register_operand" "=f")
1778 (minus:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
1779 (float_extend:DF
1780 (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
1781 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1782 "sub%-%/ %R1,%R2,%0"
1783 [(set_attr "type" "fadd")
1784 (set_attr "trap" "yes")
1785 (set_attr "round_suffix" "normal")
1786 (set_attr "trap_suffix" "u_su_sui")])
1787
1788 (define_insn "*subdf_ext3"
1789 [(set (match_operand:DF 0 "register_operand" "=f")
1790 (minus:DF (float_extend:DF
1791 (match_operand:SF 1 "reg_or_0_operand" "fG"))
1792 (float_extend:DF
1793 (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
1794 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1795 "sub%-%/ %R1,%R2,%0"
1796 [(set_attr "type" "fadd")
1797 (set_attr "trap" "yes")
1798 (set_attr "round_suffix" "normal")
1799 (set_attr "trap_suffix" "u_su_sui")])
1800
1801 (define_expand "subtf3"
1802 [(use (match_operand:TF 0 "register_operand"))
1803 (use (match_operand:TF 1 "general_operand"))
1804 (use (match_operand:TF 2 "general_operand"))]
1805 "TARGET_HAS_XFLOATING_LIBS"
1806 "alpha_emit_xfloating_arith (MINUS, operands); DONE;")
1807
1808 (define_insn "mul<mode>3"
1809 [(set (match_operand:FMODE 0 "register_operand" "=f,&f")
1810 (mult:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "%fG,fG")
1811 (match_operand:FMODE 2 "reg_or_0_operand" "fG,fG")))]
1812 "TARGET_FP"
1813 "mul<modesuffix>%/ %R1,%R2,%0"
1814 [(set_attr "type" "fmul")
1815 (set_attr "trap" "yes")
1816 (set_attr "round_suffix" "normal")
1817 (set_attr "trap_suffix" "u_su_sui")
1818 (set (attr "enabled")
1819 (cond [(eq_attr "alternative" "0")
1820 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
1821 ]
1822 (symbol_ref "true")))])
1823
1824 (define_insn "*muldf_ext1"
1825 [(set (match_operand:DF 0 "register_operand" "=f")
1826 (mult:DF (float_extend:DF
1827 (match_operand:SF 1 "reg_or_0_operand" "fG"))
1828 (match_operand:DF 2 "reg_or_0_operand" "fG")))]
1829 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1830 "mul%-%/ %R1,%R2,%0"
1831 [(set_attr "type" "fmul")
1832 (set_attr "trap" "yes")
1833 (set_attr "round_suffix" "normal")
1834 (set_attr "trap_suffix" "u_su_sui")])
1835
1836 (define_insn "*muldf_ext2"
1837 [(set (match_operand:DF 0 "register_operand" "=f")
1838 (mult:DF (float_extend:DF
1839 (match_operand:SF 1 "reg_or_0_operand" "%fG"))
1840 (float_extend:DF
1841 (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
1842 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1843 "mul%-%/ %R1,%R2,%0"
1844 [(set_attr "type" "fmul")
1845 (set_attr "trap" "yes")
1846 (set_attr "round_suffix" "normal")
1847 (set_attr "trap_suffix" "u_su_sui")])
1848
1849 (define_expand "multf3"
1850 [(use (match_operand:TF 0 "register_operand"))
1851 (use (match_operand:TF 1 "general_operand"))
1852 (use (match_operand:TF 2 "general_operand"))]
1853 "TARGET_HAS_XFLOATING_LIBS"
1854 "alpha_emit_xfloating_arith (MULT, operands); DONE;")
1855
1856 (define_insn "div<mode>3"
1857 [(set (match_operand:FMODE 0 "register_operand" "=f,&f")
1858 (div:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "fG,fG")
1859 (match_operand:FMODE 2 "reg_or_0_operand" "fG,fG")))]
1860 "TARGET_FP"
1861 "div<modesuffix>%/ %R1,%R2,%0"
1862 [(set_attr "type" "fdiv")
1863 (set_attr "opsize" "<opmode>")
1864 (set_attr "trap" "yes")
1865 (set_attr "round_suffix" "normal")
1866 (set_attr "trap_suffix" "u_su_sui")
1867 (set (attr "enabled")
1868 (cond [(eq_attr "alternative" "0")
1869 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
1870 ]
1871 (symbol_ref "true")))])
1872
1873 (define_insn "*divdf_ext1"
1874 [(set (match_operand:DF 0 "register_operand" "=f")
1875 (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG"))
1876 (match_operand:DF 2 "reg_or_0_operand" "fG")))]
1877 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1878 "div%-%/ %R1,%R2,%0"
1879 [(set_attr "type" "fdiv")
1880 (set_attr "trap" "yes")
1881 (set_attr "round_suffix" "normal")
1882 (set_attr "trap_suffix" "u_su_sui")])
1883
1884 (define_insn "*divdf_ext2"
1885 [(set (match_operand:DF 0 "register_operand" "=f")
1886 (div:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
1887 (float_extend:DF
1888 (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
1889 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1890 "div%-%/ %R1,%R2,%0"
1891 [(set_attr "type" "fdiv")
1892 (set_attr "trap" "yes")
1893 (set_attr "round_suffix" "normal")
1894 (set_attr "trap_suffix" "u_su_sui")])
1895
1896 (define_insn "*divdf_ext3"
1897 [(set (match_operand:DF 0 "register_operand" "=f")
1898 (div:DF (float_extend:DF
1899 (match_operand:SF 1 "reg_or_0_operand" "fG"))
1900 (float_extend:DF
1901 (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
1902 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1903 "div%-%/ %R1,%R2,%0"
1904 [(set_attr "type" "fdiv")
1905 (set_attr "trap" "yes")
1906 (set_attr "round_suffix" "normal")
1907 (set_attr "trap_suffix" "u_su_sui")])
1908
1909 (define_expand "divtf3"
1910 [(use (match_operand:TF 0 "register_operand"))
1911 (use (match_operand:TF 1 "general_operand"))
1912 (use (match_operand:TF 2 "general_operand"))]
1913 "TARGET_HAS_XFLOATING_LIBS"
1914 "alpha_emit_xfloating_arith (DIV, operands); DONE;")
1915
1916 (define_insn "sqrt<mode>2"
1917 [(set (match_operand:FMODE 0 "register_operand" "=f,&f")
1918 (sqrt:FMODE (match_operand:FMODE 1 "reg_or_0_operand" "fG,fG")))]
1919 "TARGET_FP && TARGET_FIX"
1920 "sqrt<modesuffix>%/ %R1,%0"
1921 [(set_attr "type" "fsqrt")
1922 (set_attr "opsize" "<opmode>")
1923 (set_attr "trap" "yes")
1924 (set_attr "round_suffix" "normal")
1925 (set_attr "trap_suffix" "u_su_sui")
1926 (set (attr "enabled")
1927 (cond [(eq_attr "alternative" "0")
1928 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
1929 ]
1930 (symbol_ref "true")))])
1931
1932 ;; Define conversion operators between DFmode and SImode, using the cvtql
1933 ;; instruction. To allow combine et al to do useful things, we keep the
1934 ;; operation as a unit until after reload, at which point we split the
1935 ;; instructions.
1936 ;;
1937 ;; Note that we (attempt to) only consider this optimization when the
1938 ;; ultimate destination is memory. If we will be doing further integer
1939 ;; processing, it is cheaper to do the truncation in the int regs.
1940
1941 (define_insn "*cvtql"
1942 [(set (match_operand:SF 0 "register_operand" "=f")
1943 (unspec:SF [(match_operand:DI 1 "reg_or_0_operand" "fG")]
1944 UNSPEC_CVTQL))]
1945 "TARGET_FP"
1946 "cvtql%/ %R1,%0"
1947 [(set_attr "type" "fadd")
1948 (set_attr "trap" "yes")
1949 (set_attr "trap_suffix" "v_sv")])
1950
1951 (define_insn_and_split "*fix_truncdfsi_ieee"
1952 [(set (match_operand:SI 0 "memory_operand" "=m")
1953 (subreg:SI
1954 (match_operator:DI 4 "fix_operator"
1955 [(match_operand:DF 1 "reg_or_0_operand" "fG")]) 0))
1956 (clobber (match_scratch:DI 2 "=&f"))
1957 (clobber (match_scratch:SF 3 "=&f"))]
1958 "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
1959 "#"
1960 "&& reload_completed"
1961 [(set (match_dup 2) (match_op_dup 4 [(match_dup 1)]))
1962 (set (match_dup 3) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
1963 (set (match_dup 5) (match_dup 3))]
1964 {
1965 operands[5] = adjust_address (operands[0], SFmode, 0);
1966 }
1967 [(set_attr "type" "fadd")
1968 (set_attr "trap" "yes")])
1969
1970 (define_insn_and_split "*fix_truncdfsi_internal"
1971 [(set (match_operand:SI 0 "memory_operand" "=m")
1972 (subreg:SI
1973 (match_operator:DI 3 "fix_operator"
1974 [(match_operand:DF 1 "reg_or_0_operand" "fG")]) 0))
1975 (clobber (match_scratch:DI 2 "=f"))]
1976 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
1977 "#"
1978 "&& reload_completed"
1979 [(set (match_dup 2) (match_op_dup 3 [(match_dup 1)]))
1980 (set (match_dup 4) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
1981 (set (match_dup 5) (match_dup 4))]
1982 {
1983 operands[4] = gen_rtx_REG (SFmode, REGNO (operands[2]));
1984 operands[5] = adjust_address (operands[0], SFmode, 0);
1985 }
1986 [(set_attr "type" "fadd")
1987 (set_attr "trap" "yes")])
1988
1989 (define_insn "*fix_truncdfdi2"
1990 [(set (match_operand:DI 0 "reg_no_subreg_operand" "=f,&f")
1991 (match_operator:DI 2 "fix_operator"
1992 [(match_operand:DF 1 "reg_or_0_operand" "fG,fG")]))]
1993 "TARGET_FP"
1994 "cvt%-q%/ %R1,%0"
1995 [(set_attr "type" "fadd")
1996 (set_attr "trap" "yes")
1997 (set_attr "round_suffix" "c")
1998 (set_attr "trap_suffix" "v_sv_svi")
1999 (set (attr "enabled")
2000 (cond [(eq_attr "alternative" "0")
2001 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
2002 ]
2003 (symbol_ref "true")))])
2004
2005 (define_expand "fix_truncdfdi2"
2006 [(set (match_operand:DI 0 "reg_no_subreg_operand")
2007 (fix:DI (match_operand:DF 1 "reg_or_0_operand")))]
2008 "TARGET_FP")
2009
2010 (define_expand "fixuns_truncdfdi2"
2011 [(set (match_operand:DI 0 "reg_no_subreg_operand")
2012 (unsigned_fix:DI (match_operand:DF 1 "reg_or_0_operand")))]
2013 "TARGET_FP")
2014
2015 ;; Likewise between SFmode and SImode.
2016
2017 (define_insn_and_split "*fix_truncsfsi_ieee"
2018 [(set (match_operand:SI 0 "memory_operand" "=m")
2019 (subreg:SI
2020 (match_operator:DI 4 "fix_operator"
2021 [(float_extend:DF
2022 (match_operand:SF 1 "reg_or_0_operand" "fG"))]) 0))
2023 (clobber (match_scratch:DI 2 "=&f"))
2024 (clobber (match_scratch:SF 3 "=&f"))]
2025 "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2026 "#"
2027 "&& reload_completed"
2028 [(set (match_dup 2) (match_op_dup 4 [(float_extend:DF (match_dup 1))]))
2029 (set (match_dup 3) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
2030 (set (match_dup 5) (match_dup 3))]
2031 "operands[5] = adjust_address (operands[0], SFmode, 0);"
2032 [(set_attr "type" "fadd")
2033 (set_attr "trap" "yes")])
2034
2035 (define_insn_and_split "*fix_truncsfsi_internal"
2036 [(set (match_operand:SI 0 "memory_operand" "=m")
2037 (subreg:SI
2038 (match_operator:DI 3 "fix_operator"
2039 [(float_extend:DF
2040 (match_operand:SF 1 "reg_or_0_operand" "fG"))]) 0))
2041 (clobber (match_scratch:DI 2 "=f"))]
2042 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2043 "#"
2044 "&& reload_completed"
2045 [(set (match_dup 2) (match_op_dup 3 [(float_extend:DF (match_dup 1))]))
2046 (set (match_dup 4) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
2047 (set (match_dup 5) (match_dup 4))]
2048 {
2049 operands[4] = gen_rtx_REG (SFmode, REGNO (operands[2]));
2050 operands[5] = adjust_address (operands[0], SFmode, 0);
2051 }
2052 [(set_attr "type" "fadd")
2053 (set_attr "trap" "yes")])
2054
2055 (define_insn "*fix_truncsfdi2"
2056 [(set (match_operand:DI 0 "reg_no_subreg_operand" "=f,&f")
2057 (match_operator:DI 2 "fix_operator"
2058 [(float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG,fG"))]))]
2059 "TARGET_FP"
2060 "cvt%-q%/ %R1,%0"
2061 [(set_attr "type" "fadd")
2062 (set_attr "trap" "yes")
2063 (set_attr "round_suffix" "c")
2064 (set_attr "trap_suffix" "v_sv_svi")
2065 (set (attr "enabled")
2066 (cond [(eq_attr "alternative" "0")
2067 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
2068 ]
2069 (symbol_ref "true")))])
2070
2071 (define_expand "fix_truncsfdi2"
2072 [(set (match_operand:DI 0 "reg_no_subreg_operand")
2073 (fix:DI (float_extend:DF (match_operand:SF 1 "reg_or_0_operand"))))]
2074 "TARGET_FP")
2075
2076 (define_expand "fixuns_truncsfdi2"
2077 [(set (match_operand:DI 0 "reg_no_subreg_operand")
2078 (unsigned_fix:DI
2079 (float_extend:DF (match_operand:SF 1 "reg_or_0_operand"))))]
2080 "TARGET_FP")
2081
2082 (define_expand "fix_trunctfdi2"
2083 [(use (match_operand:DI 0 "register_operand"))
2084 (use (match_operand:TF 1 "general_operand"))]
2085 "TARGET_HAS_XFLOATING_LIBS"
2086 "alpha_emit_xfloating_cvt (FIX, operands); DONE;")
2087
2088 (define_expand "fixuns_trunctfdi2"
2089 [(use (match_operand:DI 0 "register_operand"))
2090 (use (match_operand:TF 1 "general_operand"))]
2091 "TARGET_HAS_XFLOATING_LIBS"
2092 "alpha_emit_xfloating_cvt (UNSIGNED_FIX, operands); DONE;")
2093
2094 (define_insn "floatdisf2"
2095 [(set (match_operand:SF 0 "register_operand" "=f,&f")
2096 (float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f,f")))]
2097 "TARGET_FP"
2098 "cvtq%,%/ %1,%0"
2099 [(set_attr "type" "fadd")
2100 (set_attr "trap" "yes")
2101 (set_attr "round_suffix" "normal")
2102 (set_attr "trap_suffix" "sui")
2103 (set (attr "enabled")
2104 (cond [(eq_attr "alternative" "0")
2105 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
2106 ]
2107 (symbol_ref "true")))])
2108
2109 (define_insn_and_split "*floatsisf2_ieee"
2110 [(set (match_operand:SF 0 "register_operand" "=&f")
2111 (float:SF (match_operand:SI 1 "memory_operand" "m")))
2112 (clobber (match_scratch:DI 2 "=&f"))
2113 (clobber (match_scratch:SF 3 "=&f"))]
2114 "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2115 "#"
2116 "&& reload_completed"
2117 [(set (match_dup 3) (match_dup 1))
2118 (set (match_dup 2) (unspec:DI [(match_dup 3)] UNSPEC_CVTLQ))
2119 (set (match_dup 0) (float:SF (match_dup 2)))]
2120 "operands[1] = adjust_address (operands[1], SFmode, 0);")
2121
2122 (define_insn_and_split "*floatsisf2"
2123 [(set (match_operand:SF 0 "register_operand" "=f")
2124 (float:SF (match_operand:SI 1 "memory_operand" "m")))]
2125 "TARGET_FP"
2126 "#"
2127 "&& reload_completed"
2128 [(set (match_dup 0) (match_dup 1))
2129 (set (match_dup 2) (unspec:DI [(match_dup 0)] UNSPEC_CVTLQ))
2130 (set (match_dup 0) (float:SF (match_dup 2)))]
2131 {
2132 operands[1] = adjust_address (operands[1], SFmode, 0);
2133 operands[2] = gen_rtx_REG (DImode, REGNO (operands[0]));
2134 })
2135
2136 (define_insn "floatdidf2"
2137 [(set (match_operand:DF 0 "register_operand" "=f,&f")
2138 (float:DF (match_operand:DI 1 "reg_no_subreg_operand" "f,f")))]
2139 "TARGET_FP"
2140 "cvtq%-%/ %1,%0"
2141 [(set_attr "type" "fadd")
2142 (set_attr "trap" "yes")
2143 (set_attr "round_suffix" "normal")
2144 (set_attr "trap_suffix" "sui")
2145 (set (attr "enabled")
2146 (cond [(eq_attr "alternative" "0")
2147 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
2148 ]
2149 (symbol_ref "true")))])
2150
2151 (define_insn_and_split "*floatsidf2_ieee"
2152 [(set (match_operand:DF 0 "register_operand" "=&f")
2153 (float:DF (match_operand:SI 1 "memory_operand" "m")))
2154 (clobber (match_scratch:DI 2 "=&f"))
2155 (clobber (match_scratch:SF 3 "=&f"))]
2156 "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2157 "#"
2158 "&& reload_completed"
2159 [(set (match_dup 3) (match_dup 1))
2160 (set (match_dup 2) (unspec:DI [(match_dup 3)] UNSPEC_CVTLQ))
2161 (set (match_dup 0) (float:DF (match_dup 2)))]
2162 "operands[1] = adjust_address (operands[1], SFmode, 0);")
2163
2164 (define_insn_and_split "*floatsidf2"
2165 [(set (match_operand:DF 0 "register_operand" "=f")
2166 (float:DF (match_operand:SI 1 "memory_operand" "m")))]
2167 "TARGET_FP"
2168 "#"
2169 "&& reload_completed"
2170 [(set (match_dup 3) (match_dup 1))
2171 (set (match_dup 2) (unspec:DI [(match_dup 3)] UNSPEC_CVTLQ))
2172 (set (match_dup 0) (float:DF (match_dup 2)))]
2173 {
2174 operands[1] = adjust_address (operands[1], SFmode, 0);
2175 operands[2] = gen_rtx_REG (DImode, REGNO (operands[0]));
2176 operands[3] = gen_rtx_REG (SFmode, REGNO (operands[0]));
2177 })
2178
2179 (define_expand "floatditf2"
2180 [(use (match_operand:TF 0 "register_operand"))
2181 (use (match_operand:DI 1 "general_operand"))]
2182 "TARGET_HAS_XFLOATING_LIBS"
2183 "alpha_emit_xfloating_cvt (FLOAT, operands); DONE;")
2184
2185 (define_expand "floatunsdisf2"
2186 [(use (match_operand:SF 0 "register_operand"))
2187 (use (match_operand:DI 1 "register_operand"))]
2188 "TARGET_FP"
2189 "alpha_emit_floatuns (operands); DONE;")
2190
2191 (define_expand "floatunsdidf2"
2192 [(use (match_operand:DF 0 "register_operand"))
2193 (use (match_operand:DI 1 "register_operand"))]
2194 "TARGET_FP"
2195 "alpha_emit_floatuns (operands); DONE;")
2196
2197 (define_expand "floatunsditf2"
2198 [(use (match_operand:TF 0 "register_operand"))
2199 (use (match_operand:DI 1 "general_operand"))]
2200 "TARGET_HAS_XFLOATING_LIBS"
2201 "alpha_emit_xfloating_cvt (UNSIGNED_FLOAT, operands); DONE;")
2202
2203 (define_expand "extendsfdf2"
2204 [(set (match_operand:DF 0 "register_operand")
2205 (float_extend:DF (match_operand:SF 1 "nonimmediate_operand")))]
2206 "TARGET_FP"
2207 {
2208 if (alpha_fptm >= ALPHA_FPTM_SU)
2209 operands[1] = force_reg (SFmode, operands[1]);
2210 })
2211
2212 ;; The Unicos/Mk assembler doesn't support cvtst, but we've already
2213 ;; asserted that alpha_fptm == ALPHA_FPTM_N.
2214
2215 (define_insn "*extendsfdf2_ieee"
2216 [(set (match_operand:DF 0 "register_operand" "=&f")
2217 (float_extend:DF (match_operand:SF 1 "register_operand" "f")))]
2218 "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2219 "cvtsts %1,%0"
2220 [(set_attr "type" "fadd")
2221 (set_attr "trap" "yes")])
2222
2223 (define_insn "*extendsfdf2_internal"
2224 [(set (match_operand:DF 0 "register_operand" "=f,f,m")
2225 (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,m,f")))]
2226 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2227 "@
2228 cpys %1,%1,%0
2229 ld%, %0,%1
2230 st%- %1,%0"
2231 [(set_attr "type" "fcpys,fld,fst")])
2232
2233 ;; Use register_operand for operand 1 to prevent compress_float_constant
2234 ;; from doing something silly. When optimizing we'll put things back
2235 ;; together anyway.
2236 (define_expand "extendsftf2"
2237 [(use (match_operand:TF 0 "register_operand"))
2238 (use (match_operand:SF 1 "register_operand"))]
2239 "TARGET_HAS_XFLOATING_LIBS"
2240 {
2241 rtx tmp = gen_reg_rtx (DFmode);
2242 emit_insn (gen_extendsfdf2 (tmp, operands[1]));
2243 emit_insn (gen_extenddftf2 (operands[0], tmp));
2244 DONE;
2245 })
2246
2247 (define_expand "extenddftf2"
2248 [(use (match_operand:TF 0 "register_operand"))
2249 (use (match_operand:DF 1 "register_operand"))]
2250 "TARGET_HAS_XFLOATING_LIBS"
2251 "alpha_emit_xfloating_cvt (FLOAT_EXTEND, operands); DONE;")
2252
2253 (define_insn "truncdfsf2"
2254 [(set (match_operand:SF 0 "register_operand" "=f,&f")
2255 (float_truncate:SF (match_operand:DF 1 "reg_or_0_operand" "fG,fG")))]
2256 "TARGET_FP"
2257 "cvt%-%,%/ %R1,%0"
2258 [(set_attr "type" "fadd")
2259 (set_attr "trap" "yes")
2260 (set_attr "round_suffix" "normal")
2261 (set_attr "trap_suffix" "u_su_sui")
2262 (set (attr "enabled")
2263 (cond [(eq_attr "alternative" "0")
2264 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
2265 ]
2266 (symbol_ref "true")))])
2267
2268 (define_expand "trunctfdf2"
2269 [(use (match_operand:DF 0 "register_operand"))
2270 (use (match_operand:TF 1 "general_operand"))]
2271 "TARGET_HAS_XFLOATING_LIBS"
2272 "alpha_emit_xfloating_cvt (FLOAT_TRUNCATE, operands); DONE;")
2273
2274 (define_expand "trunctfsf2"
2275 [(use (match_operand:SF 0 "register_operand"))
2276 (use (match_operand:TF 1 "general_operand"))]
2277 "TARGET_FP && TARGET_HAS_XFLOATING_LIBS"
2278 {
2279 rtx tmpf, sticky, arg, lo, hi;
2280
2281 tmpf = gen_reg_rtx (DFmode);
2282 sticky = gen_reg_rtx (DImode);
2283 arg = copy_to_mode_reg (TFmode, operands[1]);
2284 lo = gen_lowpart (DImode, arg);
2285 hi = gen_highpart (DImode, arg);
2286
2287 /* Convert the low word of the TFmode value into a sticky rounding bit,
2288 then or it into the low bit of the high word. This leaves the sticky
2289 bit at bit 48 of the fraction, which is representable in DFmode,
2290 which prevents rounding error in the final conversion to SFmode. */
2291
2292 emit_insn (gen_rtx_SET (sticky, gen_rtx_NE (DImode, lo, const0_rtx)));
2293 emit_insn (gen_iordi3 (hi, hi, sticky));
2294 emit_insn (gen_trunctfdf2 (tmpf, arg));
2295 emit_insn (gen_truncdfsf2 (operands[0], tmpf));
2296 DONE;
2297 })
2298
2300 ;; Next are all the integer comparisons, and conditional moves and branches
2301 ;; and some of the related define_expand's and define_split's.
2302
2303 (define_insn "*setcc_internal"
2304 [(set (match_operand 0 "register_operand" "=r")
2305 (match_operator 1 "alpha_comparison_operator"
2306 [(match_operand:DI 2 "register_operand" "r")
2307 (match_operand:DI 3 "reg_or_8bit_operand" "rI")]))]
2308 "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT
2309 && GET_MODE_SIZE (GET_MODE (operands[0])) <= 8
2310 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
2311 "cmp%C1 %2,%3,%0"
2312 [(set_attr "type" "icmp")])
2313
2314 ;; Yes, we can technically support reg_or_8bit_operand in operand 2,
2315 ;; but that's non-canonical rtl and allowing that causes inefficiencies
2316 ;; from cse on.
2317 (define_insn "*setcc_swapped_internal"
2318 [(set (match_operand 0 "register_operand" "=r")
2319 (match_operator 1 "alpha_swapped_comparison_operator"
2320 [(match_operand:DI 2 "register_operand" "r")
2321 (match_operand:DI 3 "reg_or_0_operand" "rJ")]))]
2322 "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT
2323 && GET_MODE_SIZE (GET_MODE (operands[0])) <= 8
2324 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
2325 "cmp%c1 %r3,%2,%0"
2326 [(set_attr "type" "icmp")])
2327
2328 ;; Use match_operator rather than ne directly so that we can match
2329 ;; multiple integer modes.
2330 (define_insn "*setne_internal"
2331 [(set (match_operand 0 "register_operand" "=r")
2332 (match_operator 1 "signed_comparison_operator"
2333 [(match_operand:DI 2 "register_operand" "r")
2334 (const_int 0)]))]
2335 "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT
2336 && GET_MODE_SIZE (GET_MODE (operands[0])) <= 8
2337 && GET_CODE (operands[1]) == NE
2338 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
2339 "cmpult $31,%2,%0"
2340 [(set_attr "type" "icmp")])
2341
2342 ;; The mode folding trick can't be used with const_int operands, since
2343 ;; reload needs to know the proper mode.
2344 ;;
2345 ;; Use add_operand instead of the more seemingly natural reg_or_8bit_operand
2346 ;; in order to create more pairs of constants. As long as we're allowing
2347 ;; two constants at the same time, and will have to reload one of them...
2348
2349 (define_insn "*mov<mode>cc_internal"
2350 [(set (match_operand:IMODE 0 "register_operand" "=r,r,r,r")
2351 (if_then_else:IMODE
2352 (match_operator 2 "signed_comparison_operator"
2353 [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
2354 (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
2355 (match_operand:IMODE 1 "add_operand" "rI,0,rI,0")
2356 (match_operand:IMODE 5 "add_operand" "0,rI,0,rI")))]
2357 "(operands[3] == const0_rtx) ^ (operands[4] == const0_rtx)"
2358 "@
2359 cmov%C2 %r3,%1,%0
2360 cmov%D2 %r3,%5,%0
2361 cmov%c2 %r4,%1,%0
2362 cmov%d2 %r4,%5,%0"
2363 [(set_attr "type" "icmov")])
2364
2365 (define_insn "*mov<mode>cc_lbc"
2366 [(set (match_operand:IMODE 0 "register_operand" "=r,r")
2367 (if_then_else:IMODE
2368 (eq (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
2369 (const_int 1)
2370 (const_int 0))
2371 (const_int 0))
2372 (match_operand:IMODE 1 "reg_or_8bit_operand" "rI,0")
2373 (match_operand:IMODE 3 "reg_or_8bit_operand" "0,rI")))]
2374 ""
2375 "@
2376 cmovlbc %r2,%1,%0
2377 cmovlbs %r2,%3,%0"
2378 [(set_attr "type" "icmov")])
2379
2380 (define_insn "*mov<mode>cc_lbs"
2381 [(set (match_operand:IMODE 0 "register_operand" "=r,r")
2382 (if_then_else:IMODE
2383 (ne (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
2384 (const_int 1)
2385 (const_int 0))
2386 (const_int 0))
2387 (match_operand:IMODE 1 "reg_or_8bit_operand" "rI,0")
2388 (match_operand:IMODE 3 "reg_or_8bit_operand" "0,rI")))]
2389 ""
2390 "@
2391 cmovlbs %r2,%1,%0
2392 cmovlbc %r2,%3,%0"
2393 [(set_attr "type" "icmov")])
2394
2395 ;; For ABS, we have two choices, depending on whether the input and output
2396 ;; registers are the same or not.
2397 (define_expand "absdi2"
2398 [(set (match_operand:DI 0 "register_operand")
2399 (abs:DI (match_operand:DI 1 "register_operand")))]
2400 ""
2401 {
2402 if (rtx_equal_p (operands[0], operands[1]))
2403 emit_insn (gen_absdi2_same (operands[0], gen_reg_rtx (DImode)));
2404 else
2405 emit_insn (gen_absdi2_diff (operands[0], operands[1]));
2406 DONE;
2407 })
2408
2409 (define_expand "absdi2_same"
2410 [(set (match_operand:DI 1 "register_operand")
2411 (neg:DI (match_operand:DI 0 "register_operand")))
2412 (set (match_dup 0)
2413 (if_then_else:DI (ge (match_dup 0) (const_int 0))
2414 (match_dup 0)
2415 (match_dup 1)))])
2416
2417 (define_expand "absdi2_diff"
2418 [(set (match_operand:DI 0 "register_operand")
2419 (neg:DI (match_operand:DI 1 "register_operand")))
2420 (set (match_dup 0)
2421 (if_then_else:DI (lt (match_dup 1) (const_int 0))
2422 (match_dup 0)
2423 (match_dup 1)))])
2424
2425 (define_split
2426 [(set (match_operand:DI 0 "register_operand")
2427 (abs:DI (match_dup 0)))
2428 (clobber (match_operand:DI 1 "register_operand"))]
2429 ""
2430 [(set (match_dup 1) (neg:DI (match_dup 0)))
2431 (set (match_dup 0) (if_then_else:DI (ge (match_dup 0) (const_int 0))
2432 (match_dup 0) (match_dup 1)))])
2433
2434 (define_split
2435 [(set (match_operand:DI 0 "register_operand")
2436 (abs:DI (match_operand:DI 1 "register_operand")))]
2437 "! rtx_equal_p (operands[0], operands[1])"
2438 [(set (match_dup 0) (neg:DI (match_dup 1)))
2439 (set (match_dup 0) (if_then_else:DI (lt (match_dup 1) (const_int 0))
2440 (match_dup 0) (match_dup 1)))])
2441
2442 (define_split
2443 [(set (match_operand:DI 0 "register_operand")
2444 (neg:DI (abs:DI (match_dup 0))))
2445 (clobber (match_operand:DI 1 "register_operand"))]
2446 ""
2447 [(set (match_dup 1) (neg:DI (match_dup 0)))
2448 (set (match_dup 0) (if_then_else:DI (le (match_dup 0) (const_int 0))
2449 (match_dup 0) (match_dup 1)))])
2450
2451 (define_split
2452 [(set (match_operand:DI 0 "register_operand")
2453 (neg:DI (abs:DI (match_operand:DI 1 "register_operand"))))]
2454 "! rtx_equal_p (operands[0], operands[1])"
2455 [(set (match_dup 0) (neg:DI (match_dup 1)))
2456 (set (match_dup 0) (if_then_else:DI (gt (match_dup 1) (const_int 0))
2457 (match_dup 0) (match_dup 1)))])
2458
2459 (define_insn "<code><mode>3"
2460 [(set (match_operand:I12MODE 0 "register_operand" "=r")
2461 (any_maxmin:I12MODE
2462 (match_operand:I12MODE 1 "reg_or_0_operand" "%rJ")
2463 (match_operand:I12MODE 2 "reg_or_8bit_operand" "rI")))]
2464 "TARGET_MAX"
2465 "<maxmin><vecmodesuffix> %r1,%2,%0"
2466 [(set_attr "type" "mvi")])
2467
2468 (define_expand "smaxdi3"
2469 [(set (match_dup 3)
2470 (le:DI (match_operand:DI 1 "reg_or_0_operand")
2471 (match_operand:DI 2 "reg_or_8bit_operand")))
2472 (set (match_operand:DI 0 "register_operand")
2473 (if_then_else:DI (eq (match_dup 3) (const_int 0))
2474 (match_dup 1) (match_dup 2)))]
2475 ""
2476 "operands[3] = gen_reg_rtx (DImode);")
2477
2478 (define_split
2479 [(set (match_operand:DI 0 "register_operand")
2480 (smax:DI (match_operand:DI 1 "reg_or_0_operand")
2481 (match_operand:DI 2 "reg_or_8bit_operand")))
2482 (clobber (match_operand:DI 3 "register_operand"))]
2483 "operands[2] != const0_rtx"
2484 [(set (match_dup 3) (le:DI (match_dup 1) (match_dup 2)))
2485 (set (match_dup 0) (if_then_else:DI (eq (match_dup 3) (const_int 0))
2486 (match_dup 1) (match_dup 2)))])
2487
2488 (define_insn "*smax_const0"
2489 [(set (match_operand:DI 0 "register_operand" "=r")
2490 (smax:DI (match_operand:DI 1 "register_operand" "0")
2491 (const_int 0)))]
2492 ""
2493 "cmovlt %0,0,%0"
2494 [(set_attr "type" "icmov")])
2495
2496 (define_expand "smindi3"
2497 [(set (match_dup 3)
2498 (lt:DI (match_operand:DI 1 "reg_or_0_operand")
2499 (match_operand:DI 2 "reg_or_8bit_operand")))
2500 (set (match_operand:DI 0 "register_operand")
2501 (if_then_else:DI (ne (match_dup 3) (const_int 0))
2502 (match_dup 1) (match_dup 2)))]
2503 ""
2504 "operands[3] = gen_reg_rtx (DImode);")
2505
2506 (define_split
2507 [(set (match_operand:DI 0 "register_operand")
2508 (smin:DI (match_operand:DI 1 "reg_or_0_operand")
2509 (match_operand:DI 2 "reg_or_8bit_operand")))
2510 (clobber (match_operand:DI 3 "register_operand"))]
2511 "operands[2] != const0_rtx"
2512 [(set (match_dup 3) (lt:DI (match_dup 1) (match_dup 2)))
2513 (set (match_dup 0) (if_then_else:DI (ne (match_dup 3) (const_int 0))
2514 (match_dup 1) (match_dup 2)))])
2515
2516 (define_insn "*smin_const0"
2517 [(set (match_operand:DI 0 "register_operand" "=r")
2518 (smin:DI (match_operand:DI 1 "register_operand" "0")
2519 (const_int 0)))]
2520 ""
2521 "cmovgt %0,0,%0"
2522 [(set_attr "type" "icmov")])
2523
2524 (define_expand "umaxdi3"
2525 [(set (match_dup 3)
2526 (leu:DI (match_operand:DI 1 "reg_or_0_operand")
2527 (match_operand:DI 2 "reg_or_8bit_operand")))
2528 (set (match_operand:DI 0 "register_operand")
2529 (if_then_else:DI (eq (match_dup 3) (const_int 0))
2530 (match_dup 1) (match_dup 2)))]
2531 ""
2532 "operands[3] = gen_reg_rtx (DImode);")
2533
2534 (define_split
2535 [(set (match_operand:DI 0 "register_operand")
2536 (umax:DI (match_operand:DI 1 "reg_or_0_operand")
2537 (match_operand:DI 2 "reg_or_8bit_operand")))
2538 (clobber (match_operand:DI 3 "register_operand"))]
2539 "operands[2] != const0_rtx"
2540 [(set (match_dup 3) (leu:DI (match_dup 1) (match_dup 2)))
2541 (set (match_dup 0) (if_then_else:DI (eq (match_dup 3) (const_int 0))
2542 (match_dup 1) (match_dup 2)))])
2543
2544 (define_expand "umindi3"
2545 [(set (match_dup 3)
2546 (ltu:DI (match_operand:DI 1 "reg_or_0_operand")
2547 (match_operand:DI 2 "reg_or_8bit_operand")))
2548 (set (match_operand:DI 0 "register_operand")
2549 (if_then_else:DI (ne (match_dup 3) (const_int 0))
2550 (match_dup 1) (match_dup 2)))]
2551 ""
2552 "operands[3] = gen_reg_rtx (DImode);")
2553
2554 (define_split
2555 [(set (match_operand:DI 0 "register_operand")
2556 (umin:DI (match_operand:DI 1 "reg_or_0_operand")
2557 (match_operand:DI 2 "reg_or_8bit_operand")))
2558 (clobber (match_operand:DI 3 "register_operand"))]
2559 "operands[2] != const0_rtx"
2560 [(set (match_dup 3) (ltu:DI (match_dup 1) (match_dup 2)))
2561 (set (match_dup 0) (if_then_else:DI (ne (match_dup 3) (const_int 0))
2562 (match_dup 1) (match_dup 2)))])
2563
2564 (define_insn "*bcc_normal"
2565 [(set (pc)
2566 (if_then_else
2567 (match_operator 1 "signed_comparison_operator"
2568 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
2569 (const_int 0)])
2570 (label_ref (match_operand 0))
2571 (pc)))]
2572 ""
2573 "b%C1 %r2,%0"
2574 [(set_attr "type" "ibr")])
2575
2576 (define_insn "*bcc_reverse"
2577 [(set (pc)
2578 (if_then_else
2579 (match_operator 1 "signed_comparison_operator"
2580 [(match_operand:DI 2 "register_operand" "r")
2581 (const_int 0)])
2582
2583 (pc)
2584 (label_ref (match_operand 0))))]
2585 ""
2586 "b%c1 %2,%0"
2587 [(set_attr "type" "ibr")])
2588
2589 (define_insn "*blbs_normal"
2590 [(set (pc)
2591 (if_then_else
2592 (ne (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
2593 (const_int 1)
2594 (const_int 0))
2595 (const_int 0))
2596 (label_ref (match_operand 0))
2597 (pc)))]
2598 ""
2599 "blbs %r1,%0"
2600 [(set_attr "type" "ibr")])
2601
2602 (define_insn "*blbc_normal"
2603 [(set (pc)
2604 (if_then_else
2605 (eq (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
2606 (const_int 1)
2607 (const_int 0))
2608 (const_int 0))
2609 (label_ref (match_operand 0))
2610 (pc)))]
2611 ""
2612 "blbc %r1,%0"
2613 [(set_attr "type" "ibr")])
2614
2615 (define_split
2616 [(parallel
2617 [(set (pc)
2618 (if_then_else
2619 (match_operator 1 "comparison_operator"
2620 [(zero_extract:DI (match_operand:DI 2 "register_operand")
2621 (const_int 1)
2622 (match_operand:DI 3 "const_int_operand"))
2623 (const_int 0)])
2624 (label_ref (match_operand 0))
2625 (pc)))
2626 (clobber (match_operand:DI 4 "register_operand"))])]
2627 "INTVAL (operands[3]) != 0"
2628 [(set (match_dup 4)
2629 (lshiftrt:DI (match_dup 2) (match_dup 3)))
2630 (set (pc)
2631 (if_then_else (match_op_dup 1
2632 [(zero_extract:DI (match_dup 4)
2633 (const_int 1)
2634 (const_int 0))
2635 (const_int 0)])
2636 (label_ref (match_dup 0))
2637 (pc)))]
2638 )
2639
2641 ;; The following are the corresponding floating-point insns. Recall
2642 ;; we need to have variants that expand the arguments from SFmode
2643 ;; to DFmode.
2644
2645 (define_insn "*cmpdf_internal"
2646 [(set (match_operand:DF 0 "register_operand" "=f,&f")
2647 (match_operator:DF 1 "alpha_fp_comparison_operator"
2648 [(match_operand:DF 2 "reg_or_0_operand" "fG,fG")
2649 (match_operand:DF 3 "reg_or_0_operand" "fG,fG")]))]
2650 "TARGET_FP"
2651 "cmp%-%C1%/ %R2,%R3,%0"
2652 [(set_attr "type" "fadd")
2653 (set_attr "trap" "yes")
2654 (set_attr "trap_suffix" "su")
2655 (set (attr "enabled")
2656 (cond [(eq_attr "alternative" "0")
2657 (symbol_ref "alpha_fptm < ALPHA_FPTM_SU")
2658 ]
2659 (symbol_ref "true")))])
2660
2661 (define_insn "*cmpdf_ext1"
2662 [(set (match_operand:DF 0 "register_operand" "=f")
2663 (match_operator:DF 1 "alpha_fp_comparison_operator"
2664 [(float_extend:DF
2665 (match_operand:SF 2 "reg_or_0_operand" "fG"))
2666 (match_operand:DF 3 "reg_or_0_operand" "fG")]))]
2667 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2668 "cmp%-%C1%/ %R2,%R3,%0"
2669 [(set_attr "type" "fadd")
2670 (set_attr "trap" "yes")
2671 (set_attr "trap_suffix" "su")])
2672
2673 (define_insn "*cmpdf_ext2"
2674 [(set (match_operand:DF 0 "register_operand" "=f")
2675 (match_operator:DF 1 "alpha_fp_comparison_operator"
2676 [(match_operand:DF 2 "reg_or_0_operand" "fG")
2677 (float_extend:DF
2678 (match_operand:SF 3 "reg_or_0_operand" "fG"))]))]
2679 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2680 "cmp%-%C1%/ %R2,%R3,%0"
2681 [(set_attr "type" "fadd")
2682 (set_attr "trap" "yes")
2683 (set_attr "trap_suffix" "su")])
2684
2685 (define_insn "*cmpdf_ext3"
2686 [(set (match_operand:DF 0 "register_operand" "=f")
2687 (match_operator:DF 1 "alpha_fp_comparison_operator"
2688 [(float_extend:DF
2689 (match_operand:SF 2 "reg_or_0_operand" "fG"))
2690 (float_extend:DF
2691 (match_operand:SF 3 "reg_or_0_operand" "fG"))]))]
2692 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2693 "cmp%-%C1%/ %R2,%R3,%0"
2694 [(set_attr "type" "fadd")
2695 (set_attr "trap" "yes")
2696 (set_attr "trap_suffix" "su")])
2697
2698 (define_insn "*mov<mode>cc_internal"
2699 [(set (match_operand:FMODE 0 "register_operand" "=f,f")
2700 (if_then_else:FMODE
2701 (match_operator 3 "signed_comparison_operator"
2702 [(match_operand:DF 4 "reg_or_0_operand" "fG,fG")
2703 (match_operand:DF 2 "const0_operand" "G,G")])
2704 (match_operand:FMODE 1 "reg_or_0_operand" "fG,0")
2705 (match_operand:FMODE 5 "reg_or_0_operand" "0,fG")))]
2706 "TARGET_FP"
2707 "@
2708 fcmov%C3 %R4,%R1,%0
2709 fcmov%D3 %R4,%R5,%0"
2710 [(set_attr "type" "fcmov")])
2711
2712 (define_insn "*movdfcc_ext1"
2713 [(set (match_operand:DF 0 "register_operand" "=f,f")
2714 (if_then_else:DF
2715 (match_operator 3 "signed_comparison_operator"
2716 [(match_operand:DF 4 "reg_or_0_operand" "fG,fG")
2717 (match_operand:DF 2 "const0_operand" "G,G")])
2718 (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG,0"))
2719 (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
2720 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2721 "@
2722 fcmov%C3 %R4,%R1,%0
2723 fcmov%D3 %R4,%R5,%0"
2724 [(set_attr "type" "fcmov")])
2725
2726 (define_insn "*movdfcc_ext2"
2727 [(set (match_operand:DF 0 "register_operand" "=f,f")
2728 (if_then_else:DF
2729 (match_operator 3 "signed_comparison_operator"
2730 [(float_extend:DF
2731 (match_operand:SF 4 "reg_or_0_operand" "fG,fG"))
2732 (match_operand:DF 2 "const0_operand" "G,G")])
2733 (match_operand:DF 1 "reg_or_0_operand" "fG,0")
2734 (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
2735 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2736 "@
2737 fcmov%C3 %R4,%R1,%0
2738 fcmov%D3 %R4,%R5,%0"
2739 [(set_attr "type" "fcmov")])
2740
2741 (define_insn "*movdfcc_ext3"
2742 [(set (match_operand:SF 0 "register_operand" "=f,f")
2743 (if_then_else:SF
2744 (match_operator 3 "signed_comparison_operator"
2745 [(float_extend:DF
2746 (match_operand:SF 4 "reg_or_0_operand" "fG,fG"))
2747 (match_operand:DF 2 "const0_operand" "G,G")])
2748 (match_operand:SF 1 "reg_or_0_operand" "fG,0")
2749 (match_operand:SF 5 "reg_or_0_operand" "0,fG")))]
2750 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2751 "@
2752 fcmov%C3 %R4,%R1,%0
2753 fcmov%D3 %R4,%R5,%0"
2754 [(set_attr "type" "fcmov")])
2755
2756 (define_insn "*movdfcc_ext4"
2757 [(set (match_operand:DF 0 "register_operand" "=f,f")
2758 (if_then_else:DF
2759 (match_operator 3 "signed_comparison_operator"
2760 [(float_extend:DF
2761 (match_operand:SF 4 "reg_or_0_operand" "fG,fG"))
2762 (match_operand:DF 2 "const0_operand" "G,G")])
2763 (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG,0"))
2764 (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
2765 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2766 "@
2767 fcmov%C3 %R4,%R1,%0
2768 fcmov%D3 %R4,%R5,%0"
2769 [(set_attr "type" "fcmov")])
2770
2771 (define_expand "smaxdf3"
2772 [(set (match_dup 3)
2773 (le:DF (match_operand:DF 1 "reg_or_0_operand")
2774 (match_operand:DF 2 "reg_or_0_operand")))
2775 (set (match_operand:DF 0 "register_operand")
2776 (if_then_else:DF (eq (match_dup 3) (match_dup 4))
2777 (match_dup 1) (match_dup 2)))]
2778 "TARGET_FP"
2779 {
2780 operands[3] = gen_reg_rtx (DFmode);
2781 operands[4] = CONST0_RTX (DFmode);
2782 })
2783
2784 (define_expand "smindf3"
2785 [(set (match_dup 3)
2786 (lt:DF (match_operand:DF 1 "reg_or_0_operand")
2787 (match_operand:DF 2 "reg_or_0_operand")))
2788 (set (match_operand:DF 0 "register_operand")
2789 (if_then_else:DF (ne (match_dup 3) (match_dup 4))
2790 (match_dup 1) (match_dup 2)))]
2791 "TARGET_FP"
2792 {
2793 operands[3] = gen_reg_rtx (DFmode);
2794 operands[4] = CONST0_RTX (DFmode);
2795 })
2796
2797 (define_expand "smaxsf3"
2798 [(set (match_dup 3)
2799 (le:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand"))
2800 (float_extend:DF (match_operand:SF 2 "reg_or_0_operand"))))
2801 (set (match_operand:SF 0 "register_operand")
2802 (if_then_else:SF (eq (match_dup 3) (match_dup 4))
2803 (match_dup 1) (match_dup 2)))]
2804 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2805 {
2806 operands[3] = gen_reg_rtx (DFmode);
2807 operands[4] = CONST0_RTX (DFmode);
2808 })
2809
2810 (define_expand "sminsf3"
2811 [(set (match_dup 3)
2812 (lt:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand"))
2813 (float_extend:DF (match_operand:SF 2 "reg_or_0_operand"))))
2814 (set (match_operand:SF 0 "register_operand")
2815 (if_then_else:SF (ne (match_dup 3) (match_dup 4))
2816 (match_dup 1) (match_dup 2)))]
2817 "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2818 {
2819 operands[3] = gen_reg_rtx (DFmode);
2820 operands[4] = CONST0_RTX (DFmode);
2821 })
2822
2823 (define_insn "*fbcc_normal"
2824 [(set (pc)
2825 (if_then_else
2826 (match_operator 1 "signed_comparison_operator"
2827 [(match_operand:DF 2 "reg_or_0_operand" "fG")
2828 (match_operand:DF 3 "const0_operand" "G")])
2829 (label_ref (match_operand 0))
2830 (pc)))]
2831 "TARGET_FP"
2832 "fb%C1 %R2,%0"
2833 [(set_attr "type" "fbr")])
2834
2835 (define_insn "*fbcc_ext_normal"
2836 [(set (pc)
2837 (if_then_else
2838 (match_operator 1 "signed_comparison_operator"
2839 [(float_extend:DF
2840 (match_operand:SF 2 "reg_or_0_operand" "fG"))
2841 (match_operand:DF 3 "const0_operand" "G")])
2842 (label_ref (match_operand 0))
2843 (pc)))]
2844 "TARGET_FP"
2845 "fb%C1 %R2,%0"
2846 [(set_attr "type" "fbr")])
2847
2849 ;; These are the main define_expand's used to make conditional branches
2850 ;; and compares.
2851
2852 (define_expand "cbranchdf4"
2853 [(use (match_operator 0 "alpha_cbranch_operator"
2854 [(match_operand:DF 1 "reg_or_0_operand")
2855 (match_operand:DF 2 "reg_or_0_operand")]))
2856 (use (match_operand 3))]
2857 "TARGET_FP"
2858 "alpha_emit_conditional_branch (operands, DFmode); DONE;")
2859
2860 (define_expand "cbranchtf4"
2861 [(use (match_operator 0 "alpha_cbranch_operator"
2862 [(match_operand:TF 1 "general_operand")
2863 (match_operand:TF 2 "general_operand")]))
2864 (use (match_operand 3))]
2865 "TARGET_HAS_XFLOATING_LIBS"
2866 "alpha_emit_conditional_branch (operands, TFmode); DONE;")
2867
2868 (define_expand "cbranchdi4"
2869 [(use (match_operator 0 "alpha_cbranch_operator"
2870 [(match_operand:DI 1 "general_operand")
2871 (match_operand:DI 2 "general_operand")]))
2872 (use (match_operand 3))]
2873 ""
2874 "alpha_emit_conditional_branch (operands, DImode); DONE;")
2875
2876 (define_expand "cstoredf4"
2877 [(use (match_operator:DI 1 "alpha_cbranch_operator"
2878 [(match_operand:DF 2 "reg_or_0_operand")
2879 (match_operand:DF 3 "reg_or_0_operand")]))
2880 (clobber (match_operand:DI 0 "register_operand"))]
2881 "TARGET_FP"
2882 {
2883 if (alpha_emit_setcc (operands, DFmode))
2884 DONE;
2885 else
2886 FAIL;
2887 })
2888
2889 (define_expand "cstoretf4"
2890 [(use (match_operator:DI 1 "alpha_cbranch_operator"
2891 [(match_operand:TF 2 "general_operand")
2892 (match_operand:TF 3 "general_operand")]))
2893 (clobber (match_operand:DI 0 "register_operand"))]
2894 "TARGET_HAS_XFLOATING_LIBS"
2895 {
2896 if (alpha_emit_setcc (operands, TFmode))
2897 DONE;
2898 else
2899 FAIL;
2900 })
2901
2902 (define_expand "cstoredi4"
2903 [(use (match_operator:DI 1 "alpha_cbranch_operator"
2904 [(match_operand:DI 2 "general_operand")
2905 (match_operand:DI 3 "general_operand")]))
2906 (clobber (match_operand:DI 0 "register_operand"))]
2907 ""
2908 {
2909 if (alpha_emit_setcc (operands, DImode))
2910 DONE;
2911 else
2912 FAIL;
2913 })
2914
2916 ;; These are the main define_expand's used to make conditional moves.
2917
2918 (define_expand "mov<mode>cc"
2919 [(set (match_operand:I48MODE 0 "register_operand")
2920 (if_then_else:I48MODE
2921 (match_operand 1 "comparison_operator")
2922 (match_operand:I48MODE 2 "reg_or_8bit_operand")
2923 (match_operand:I48MODE 3 "reg_or_8bit_operand")))]
2924 ""
2925 {
2926 operands[1] = alpha_emit_conditional_move (operands[1], <MODE>mode);
2927 if (operands[1] == 0)
2928 FAIL;
2929 })
2930
2931 (define_expand "mov<mode>cc"
2932 [(set (match_operand:FMODE 0 "register_operand")
2933 (if_then_else:FMODE
2934 (match_operand 1 "comparison_operator")
2935 (match_operand:FMODE 2 "reg_or_8bit_operand")
2936 (match_operand:FMODE 3 "reg_or_8bit_operand")))]
2937 ""
2938 {
2939 operands[1] = alpha_emit_conditional_move (operands[1], <MODE>mode);
2940 if (operands[1] == 0)
2941 FAIL;
2942 })
2943
2945 ;; These define_split definitions are used in cases when comparisons have
2946 ;; not be stated in the correct way and we need to reverse the second
2947 ;; comparison. For example, x >= 7 has to be done as x < 6 with the
2948 ;; comparison that tests the result being reversed. We have one define_split
2949 ;; for each use of a comparison. They do not match valid insns and need
2950 ;; not generate valid insns.
2951 ;;
2952 ;; We can also handle equality comparisons (and inequality comparisons in
2953 ;; cases where the resulting add cannot overflow) by doing an add followed by
2954 ;; a comparison with zero. This is faster since the addition takes one
2955 ;; less cycle than a compare when feeding into a conditional move.
2956 ;; For this case, we also have an SImode pattern since we can merge the add
2957 ;; and sign extend and the order doesn't matter.
2958 ;;
2959 ;; We do not do this for floating-point, since it isn't clear how the "wrong"
2960 ;; operation could have been generated.
2961
2962 (define_split
2963 [(set (match_operand:DI 0 "register_operand")
2964 (if_then_else:DI
2965 (match_operator 1 "comparison_operator"
2966 [(match_operand:DI 2 "reg_or_0_operand")
2967 (match_operand:DI 3 "reg_or_cint_operand")])
2968 (match_operand:DI 4 "reg_or_cint_operand")
2969 (match_operand:DI 5 "reg_or_cint_operand")))
2970 (clobber (match_operand:DI 6 "register_operand"))]
2971 "operands[3] != const0_rtx"
2972 [(set (match_dup 6) (match_dup 7))
2973 (set (match_dup 0)
2974 (if_then_else:DI (match_dup 8) (match_dup 4) (match_dup 5)))]
2975 {
2976 enum rtx_code code = GET_CODE (operands[1]);
2977 int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
2978
2979 /* If we are comparing for equality with a constant and that constant
2980 appears in the arm when the register equals the constant, use the
2981 register since that is more likely to match (and to produce better code
2982 if both would). */
2983
2984 if (code == EQ && CONST_INT_P (operands[3])
2985 && rtx_equal_p (operands[4], operands[3]))
2986 operands[4] = operands[2];
2987
2988 else if (code == NE && CONST_INT_P (operands[3])
2989 && rtx_equal_p (operands[5], operands[3]))
2990 operands[5] = operands[2];
2991
2992 if (code == NE || code == EQ
2993 || (extended_count (operands[2], DImode, unsignedp) >= 1
2994 && extended_count (operands[3], DImode, unsignedp) >= 1))
2995 {
2996 if (CONST_INT_P (operands[3]))
2997 operands[7] = gen_rtx_PLUS (DImode, operands[2],
2998 GEN_INT (- INTVAL (operands[3])));
2999 else
3000 operands[7] = gen_rtx_MINUS (DImode, operands[2], operands[3]);
3001
3002 operands[8] = gen_rtx_fmt_ee (code, VOIDmode, operands[6], const0_rtx);
3003 }
3004
3005 else if (code == EQ || code == LE || code == LT
3006 || code == LEU || code == LTU)
3007 {
3008 operands[7] = gen_rtx_fmt_ee (code, DImode, operands[2], operands[3]);
3009 operands[8] = gen_rtx_NE (VOIDmode, operands[6], const0_rtx);
3010 }
3011 else
3012 {
3013 operands[7] = gen_rtx_fmt_ee (reverse_condition (code), DImode,
3014 operands[2], operands[3]);
3015 operands[8] = gen_rtx_EQ (VOIDmode, operands[6], const0_rtx);
3016 }
3017 })
3018
3019 (define_split
3020 [(set (match_operand:DI 0 "register_operand")
3021 (if_then_else:DI
3022 (match_operator 1 "comparison_operator"
3023 [(match_operand:SI 2 "reg_or_0_operand")
3024 (match_operand:SI 3 "reg_or_cint_operand")])
3025 (match_operand:DI 4 "reg_or_8bit_operand")
3026 (match_operand:DI 5 "reg_or_8bit_operand")))
3027 (clobber (match_operand:DI 6 "register_operand"))]
3028 "operands[3] != const0_rtx
3029 && (GET_CODE (operands[1]) == EQ || GET_CODE (operands[1]) == NE)"
3030 [(set (match_dup 6) (match_dup 7))
3031 (set (match_dup 0)
3032 (if_then_else:DI (match_dup 8) (match_dup 4) (match_dup 5)))]
3033 {
3034 enum rtx_code code = GET_CODE (operands[1]);
3035 int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
3036 rtx tem;
3037
3038 if ((code != NE && code != EQ
3039 && ! (extended_count (operands[2], DImode, unsignedp) >= 1
3040 && extended_count (operands[3], DImode, unsignedp) >= 1)))
3041 FAIL;
3042
3043 if (CONST_INT_P (operands[3]))
3044 tem = gen_rtx_PLUS (SImode, operands[2],
3045 GEN_INT (- INTVAL (operands[3])));
3046 else
3047 tem = gen_rtx_MINUS (SImode, operands[2], operands[3]);
3048
3049 operands[7] = gen_rtx_SIGN_EXTEND (DImode, tem);
3050 operands[8] = gen_rtx_fmt_ee (GET_CODE (operands[1]), VOIDmode,
3051 operands[6], const0_rtx);
3052 })
3053
3054 ;; Prefer to use cmp and arithmetic when possible instead of a cmove.
3055
3056 (define_split
3057 [(set (match_operand 0 "register_operand")
3058 (if_then_else (match_operator 1 "signed_comparison_operator"
3059 [(match_operand:DI 2 "reg_or_0_operand")
3060 (const_int 0)])
3061 (match_operand 3 "const_int_operand")
3062 (match_operand 4 "const_int_operand")))]
3063 ""
3064 [(const_int 0)]
3065 {
3066 if (alpha_split_conditional_move (GET_CODE (operands[1]), operands[0],
3067 operands[2], operands[3], operands[4]))
3068 DONE;
3069 else
3070 FAIL;
3071 })
3072
3073 ;; ??? Why combine is allowed to create such non-canonical rtl, I don't know.
3074 ;; Oh well, we match it in movcc, so it must be partially our fault.
3075 (define_split
3076 [(set (match_operand 0 "register_operand")
3077 (if_then_else (match_operator 1 "signed_comparison_operator"
3078 [(const_int 0)
3079 (match_operand:DI 2 "reg_or_0_operand")])
3080 (match_operand 3 "const_int_operand")
3081 (match_operand 4 "const_int_operand")))]
3082 ""
3083 [(const_int 0)]
3084 {
3085 if (alpha_split_conditional_move (swap_condition (GET_CODE (operands[1])),
3086 operands[0], operands[2], operands[3],
3087 operands[4]))
3088 DONE;
3089 else
3090 FAIL;
3091 })
3092
3093 (define_insn_and_split "*cmp_sadd_di"
3094 [(set (match_operand:DI 0 "register_operand" "=r")
3095 (plus:DI (if_then_else:DI
3096 (match_operator 1 "alpha_zero_comparison_operator"
3097 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3098 (const_int 0)])
3099 (match_operand:DI 3 "const48_operand" "I")
3100 (const_int 0))
3101 (match_operand:DI 4 "sext_add_operand" "rIO")))
3102 (clobber (match_scratch:DI 5 "=r"))]
3103 ""
3104 "#"
3105 ""
3106 [(set (match_dup 5)
3107 (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
3108 (set (match_dup 0)
3109 (plus:DI (ashift:DI (match_dup 5) (match_dup 3))
3110 (match_dup 4)))]
3111 {
3112 operands[3] = GEN_INT (exact_log2 (INTVAL (operands [3])));
3113 if (can_create_pseudo_p ())
3114 operands[5] = gen_reg_rtx (DImode);
3115 else if (reg_overlap_mentioned_p (operands[5], operands[4]))
3116 operands[5] = operands[0];
3117 })
3118
3119 (define_insn_and_split "*cmp_sadd_si"
3120 [(set (match_operand:SI 0 "register_operand" "=r")
3121 (plus:SI (if_then_else:SI
3122 (match_operator 1 "alpha_zero_comparison_operator"
3123 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3124 (const_int 0)])
3125 (match_operand:SI 3 "const48_operand" "I")
3126 (const_int 0))
3127 (match_operand:SI 4 "sext_add_operand" "rIO")))
3128 (clobber (match_scratch:DI 5 "=r"))]
3129 ""
3130 "#"
3131 ""
3132 [(set (match_dup 5)
3133 (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
3134 (set (match_dup 0)
3135 (plus:SI (ashift:SI (match_dup 6) (match_dup 3))
3136 (match_dup 4)))]
3137 {
3138 operands[3] = GEN_INT (exact_log2 (INTVAL (operands [3])));
3139 if (can_create_pseudo_p ())
3140 operands[5] = gen_reg_rtx (DImode);
3141 else if (reg_overlap_mentioned_p (operands[5], operands[4]))
3142 operands[5] = gen_lowpart (DImode, operands[0]);
3143
3144 operands[6] = gen_lowpart (SImode, operands[5]);
3145 })
3146
3147 (define_insn_and_split "*cmp_sadd_sidi"
3148 [(set (match_operand:DI 0 "register_operand" "=r")
3149 (sign_extend:DI
3150 (plus:SI (if_then_else:SI
3151 (match_operator 1 "alpha_zero_comparison_operator"
3152 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3153 (const_int 0)])
3154 (match_operand:SI 3 "const48_operand" "I")
3155 (const_int 0))
3156 (match_operand:SI 4 "sext_add_operand" "rIO"))))
3157 (clobber (match_scratch:DI 5 "=r"))]
3158 ""
3159 "#"
3160 ""
3161 [(set (match_dup 5)
3162 (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
3163 (set (match_dup 0)
3164 (sign_extend:DI (plus:SI (ashift:SI (match_dup 6) (match_dup 3))
3165 (match_dup 4))))]
3166 {
3167 operands[3] = GEN_INT (exact_log2 (INTVAL (operands [3])));
3168 if (can_create_pseudo_p ())
3169 operands[5] = gen_reg_rtx (DImode);
3170 else if (reg_overlap_mentioned_p (operands[5], operands[4]))
3171 operands[5] = operands[0];
3172
3173 operands[6] = gen_lowpart (SImode, operands[5]);
3174 })
3175
3176 (define_insn_and_split "*cmp_ssub_di"
3177 [(set (match_operand:DI 0 "register_operand" "=r")
3178 (minus:DI (if_then_else:DI
3179 (match_operator 1 "alpha_zero_comparison_operator"
3180 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3181 (const_int 0)])
3182 (match_operand:DI 3 "const48_operand" "I")
3183 (const_int 0))
3184 (match_operand:DI 4 "reg_or_8bit_operand" "rI")))
3185 (clobber (match_scratch:DI 5 "=r"))]
3186 ""
3187 "#"
3188 ""
3189 [(set (match_dup 5)
3190 (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
3191 (set (match_dup 0)
3192 (minus:DI (ashift:DI (match_dup 5) (match_dup 3))
3193 (match_dup 4)))]
3194 {
3195 operands[3] = GEN_INT (exact_log2 (INTVAL (operands [3])));
3196 if (can_create_pseudo_p ())
3197 operands[5] = gen_reg_rtx (DImode);
3198 else if (reg_overlap_mentioned_p (operands[5], operands[4]))
3199 operands[5] = operands[0];
3200 })
3201
3202 (define_insn_and_split "*cmp_ssub_si"
3203 [(set (match_operand:SI 0 "register_operand" "=r")
3204 (minus:SI (if_then_else:SI
3205 (match_operator 1 "alpha_zero_comparison_operator"
3206 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3207 (const_int 0)])
3208 (match_operand:SI 3 "const48_operand" "I")
3209 (const_int 0))
3210 (match_operand:SI 4 "reg_or_8bit_operand" "rI")))
3211 (clobber (match_scratch:DI 5 "=r"))]
3212 ""
3213 "#"
3214 ""
3215 [(set (match_dup 5)
3216 (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
3217 (set (match_dup 0)
3218 (minus:SI (ashift:SI (match_dup 6) (match_dup 3))
3219 (match_dup 4)))]
3220 {
3221 operands[3] = GEN_INT (exact_log2 (INTVAL (operands [3])));
3222 if (can_create_pseudo_p ())
3223 operands[5] = gen_reg_rtx (DImode);
3224 else if (reg_overlap_mentioned_p (operands[5], operands[4]))
3225 operands[5] = gen_lowpart (DImode, operands[0]);
3226
3227 operands[6] = gen_lowpart (SImode, operands[5]);
3228 })
3229
3230 (define_insn_and_split "*cmp_ssub_sidi"
3231 [(set (match_operand:DI 0 "register_operand" "=r")
3232 (sign_extend:DI
3233 (minus:SI (if_then_else:SI
3234 (match_operator 1 "alpha_zero_comparison_operator"
3235 [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3236 (const_int 0)])
3237 (match_operand:SI 3 "const48_operand" "I")
3238 (const_int 0))
3239 (match_operand:SI 4 "reg_or_8bit_operand" "rI"))))
3240 (clobber (match_scratch:DI 5 "=r"))]
3241 ""
3242 "#"
3243 ""
3244 [(set (match_dup 5)
3245 (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
3246 (set (match_dup 0)
3247 (sign_extend:DI (minus:SI (ashift:SI (match_dup 6) (match_dup 3))
3248 (match_dup 4))))]
3249 {
3250 operands[3] = GEN_INT (exact_log2 (INTVAL (operands [3])));
3251 if (can_create_pseudo_p ())
3252 operands[5] = gen_reg_rtx (DImode);
3253 else if (reg_overlap_mentioned_p (operands[5], operands[4]))
3254 operands[5] = operands[0];
3255
3256 operands[6] = gen_lowpart (SImode, operands[5]);
3257 })
3258
3260 ;; Here are the CALL and unconditional branch insns. Calls on NT and OSF
3261 ;; work differently, so we have different patterns for each.
3262
3263 (define_expand "call"
3264 [(use (match_operand:DI 0))
3265 (use (match_operand 1))
3266 (use (match_operand 2))
3267 (use (match_operand 3))]
3268 ""
3269 {
3270 if (TARGET_ABI_OPEN_VMS)
3271 emit_call_insn (gen_call_vms (operands[0], operands[2]));
3272 else
3273 emit_call_insn (gen_call_osf (operands[0], operands[1]));
3274 DONE;
3275 })
3276
3277 (define_expand "sibcall"
3278 [(parallel [(call (mem:DI (match_operand 0))
3279 (match_operand 1))
3280 (unspec [(reg:DI 29)] UNSPEC_SIBCALL)])]
3281 "TARGET_ABI_OSF"
3282 {
3283 gcc_assert (MEM_P (operands[0]));
3284 operands[0] = XEXP (operands[0], 0);
3285 })
3286
3287 (define_expand "call_osf"
3288 [(parallel [(call (mem:DI (match_operand 0))
3289 (match_operand 1))
3290 (use (reg:DI 29))
3291 (clobber (reg:DI 26))])]
3292 ""
3293 {
3294 gcc_assert (MEM_P (operands[0]));
3295
3296 operands[0] = XEXP (operands[0], 0);
3297 if (! call_operand (operands[0], Pmode))
3298 operands[0] = copy_to_mode_reg (Pmode, operands[0]);
3299 })
3300
3301 ;;
3302 ;; call openvms/alpha
3303 ;; op 0: symbol ref for called function
3304 ;; op 1: next_arg_reg (argument information value for R25)
3305 ;;
3306 (define_expand "call_vms"
3307 [(parallel [(call (mem:DI (match_operand 0))
3308 (match_operand 1))
3309 (use (match_dup 2))
3310 (use (reg:DI 25))
3311 (use (reg:DI 26))
3312 (clobber (reg:DI 27))])]
3313 ""
3314 {
3315 gcc_assert (MEM_P (operands[0]));
3316
3317 operands[0] = XEXP (operands[0], 0);
3318
3319 /* Always load AI with argument information, then handle symbolic and
3320 indirect call differently. Load RA and set operands[2] to PV in
3321 both cases. */
3322
3323 emit_move_insn (gen_rtx_REG (DImode, 25), operands[1]);
3324 if (GET_CODE (operands[0]) == SYMBOL_REF)
3325 {
3326 operands[2] = const0_rtx;
3327 }
3328 else
3329 {
3330 emit_move_insn (gen_rtx_REG (Pmode, 26),
3331 gen_rtx_MEM (Pmode, plus_constant (Pmode,
3332 operands[0], 8)));
3333 operands[2] = operands[0];
3334 }
3335 })
3336
3337 (define_expand "call_value"
3338 [(use (match_operand 0))
3339 (use (match_operand:DI 1))
3340 (use (match_operand 2))
3341 (use (match_operand 3))
3342 (use (match_operand 4))]
3343 ""
3344 {
3345 if (TARGET_ABI_OPEN_VMS)
3346 emit_call_insn (gen_call_value_vms (operands[0], operands[1],
3347 operands[3]));
3348 else
3349 emit_call_insn (gen_call_value_osf (operands[0], operands[1],
3350 operands[2]));
3351 DONE;
3352 })
3353
3354 (define_expand "sibcall_value"
3355 [(parallel [(set (match_operand 0)
3356 (call (mem:DI (match_operand 1))
3357 (match_operand 2)))
3358 (unspec [(reg:DI 29)] UNSPEC_SIBCALL)])]
3359 "TARGET_ABI_OSF"
3360 {
3361 gcc_assert (MEM_P (operands[1]));
3362 operands[1] = XEXP (operands[1], 0);
3363 })
3364
3365 (define_expand "call_value_osf"
3366 [(parallel [(set (match_operand 0)
3367 (call (mem:DI (match_operand 1))
3368 (match_operand 2)))
3369 (use (reg:DI 29))
3370 (clobber (reg:DI 26))])]
3371 ""
3372 {
3373 gcc_assert (MEM_P (operands[1]));
3374
3375 operands[1] = XEXP (operands[1], 0);
3376 if (! call_operand (operands[1], Pmode))
3377 operands[1] = copy_to_mode_reg (Pmode, operands[1]);
3378 })
3379
3380 (define_expand "call_value_vms"
3381 [(parallel [(set (match_operand 0)
3382 (call (mem:DI (match_operand:DI 1))
3383 (match_operand 2)))
3384 (use (match_dup 3))
3385 (use (reg:DI 25))
3386 (use (reg:DI 26))
3387 (clobber (reg:DI 27))])]
3388 ""
3389 {
3390 gcc_assert (MEM_P (operands[1]));
3391
3392 operands[1] = XEXP (operands[1], 0);
3393
3394 /* Always load AI with argument information, then handle symbolic and
3395 indirect call differently. Load RA and set operands[3] to PV in
3396 both cases. */
3397
3398 emit_move_insn (gen_rtx_REG (DImode, 25), operands[2]);
3399 if (GET_CODE (operands[1]) == SYMBOL_REF)
3400 {
3401 operands[3] = const0_rtx;
3402 }
3403 else
3404 {
3405 emit_move_insn (gen_rtx_REG (Pmode, 26),
3406 gen_rtx_MEM (Pmode, plus_constant (Pmode,
3407 operands[1], 8)));
3408 operands[3] = operands[1];
3409 }
3410 })
3411
3412 (define_insn "*call_osf_1_er_noreturn"
3413 [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
3414 (match_operand 1))
3415 (use (reg:DI 29))
3416 (clobber (reg:DI 26))]
3417 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
3418 && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
3419 "@
3420 jsr $26,($27),0
3421 bsr $26,%0\t\t!samegp
3422 ldq $27,%0($29)\t\t!literal!%#\;jsr $26,($27),%0\t\t!lituse_jsr!%#"
3423 [(set_attr "type" "jsr")
3424 (set_attr "length" "*,*,8")])
3425
3426 (define_insn "*call_osf_1_er"
3427 [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
3428 (match_operand 1))
3429 (use (reg:DI 29))
3430 (clobber (reg:DI 26))]
3431 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
3432 "@
3433 jsr $26,(%0),0\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*
3434 bsr $26,%0\t\t!samegp
3435 ldq $27,%0($29)\t\t!literal!%#\;jsr $26,($27),%0\t\t!lituse_jsr!%#\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*"
3436 [(set_attr "type" "jsr")
3437 (set_attr "length" "12,*,16")])
3438
3439 ;; We must use peep2 instead of a split because we need accurate life
3440 ;; information for $gp. Consider the case of { bar(); while (1); }.
3441 (define_peephole2
3442 [(parallel [(call (mem:DI (match_operand:DI 0 "call_operand"))
3443 (match_operand 1))
3444 (use (reg:DI 29))
3445 (clobber (reg:DI 26))])]
3446 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
3447 && ! samegp_function_operand (operands[0], Pmode)
3448 && (peep2_regno_dead_p (1, 29)
3449 || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
3450 [(parallel [(call (mem:DI (match_dup 2))
3451 (match_dup 1))
3452 (use (reg:DI 29))
3453 (use (match_dup 0))
3454 (use (match_dup 3))
3455 (clobber (reg:DI 26))])]
3456 {
3457 if (CONSTANT_P (operands[0]))
3458 {
3459 operands[2] = gen_rtx_REG (Pmode, 27);
3460 operands[3] = GEN_INT (alpha_next_sequence_number++);
3461 emit_insn (gen_movdi_er_high_g (operands[2], pic_offset_table_rtx,
3462 operands[0], operands[3]));
3463 }
3464 else
3465 {
3466 operands[2] = operands[0];
3467 operands[0] = const0_rtx;
3468 operands[3] = const0_rtx;
3469 }
3470 })
3471
3472 (define_peephole2
3473 [(parallel [(call (mem:DI (match_operand:DI 0 "call_operand"))
3474 (match_operand 1))
3475 (use (reg:DI 29))
3476 (clobber (reg:DI 26))])]
3477 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
3478 && ! samegp_function_operand (operands[0], Pmode)
3479 && ! (peep2_regno_dead_p (1, 29)
3480 || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
3481 [(parallel [(call (mem:DI (match_dup 2))
3482 (match_dup 1))
3483 (set (match_dup 5)
3484 (unspec:DI [(match_dup 5) (match_dup 3)] UNSPEC_LDGP1))
3485 (use (match_dup 0))
3486 (use (match_dup 4))
3487 (clobber (reg:DI 26))])
3488 (set (match_dup 5)
3489 (unspec:DI [(match_dup 5) (match_dup 3)] UNSPEC_LDGP2))]
3490 {
3491 if (CONSTANT_P (operands[0]))
3492 {
3493 operands[2] = gen_rtx_REG (Pmode, 27);
3494 operands[4] = GEN_INT (alpha_next_sequence_number++);
3495 emit_insn (gen_movdi_er_high_g (operands[2], pic_offset_table_rtx,
3496 operands[0], operands[4]));
3497 }
3498 else
3499 {
3500 operands[2] = operands[0];
3501 operands[0] = const0_rtx;
3502 operands[4] = const0_rtx;
3503 }
3504 operands[3] = GEN_INT (alpha_next_sequence_number++);
3505 operands[5] = pic_offset_table_rtx;
3506 })
3507
3508 (define_insn "*call_osf_2_er_nogp"
3509 [(call (mem:DI (match_operand:DI 0 "register_operand" "c"))
3510 (match_operand 1))
3511 (use (reg:DI 29))
3512 (use (match_operand 2))
3513 (use (match_operand 3 "const_int_operand"))
3514 (clobber (reg:DI 26))]
3515 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
3516 "jsr $26,(%0),%2%J3"
3517 [(set_attr "type" "jsr")])
3518
3519 (define_insn "*call_osf_2_er"
3520 [(call (mem:DI (match_operand:DI 0 "register_operand" "c"))
3521 (match_operand 1))
3522 (set (reg:DI 29)
3523 (unspec:DI [(reg:DI 29) (match_operand 4 "const_int_operand")]
3524 UNSPEC_LDGP1))
3525 (use (match_operand 2))
3526 (use (match_operand 3 "const_int_operand"))
3527 (clobber (reg:DI 26))]
3528 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
3529 "jsr $26,(%0),%2%J3\;ldah $29,0($26)\t\t!gpdisp!%4"
3530 [(set_attr "type" "jsr")
3531 (set_attr "cannot_copy" "true")
3532 (set_attr "length" "8")])
3533
3534 (define_insn "*call_osf_1_noreturn"
3535 [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
3536 (match_operand 1))
3537 (use (reg:DI 29))
3538 (clobber (reg:DI 26))]
3539 "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
3540 && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
3541 "@
3542 jsr $26,($27),0
3543 bsr $26,$%0..ng
3544 jsr $26,%0"
3545 [(set_attr "type" "jsr")
3546 (set_attr "length" "*,*,8")])
3547
3548 (define_insn "*call_osf_1"
3549 [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
3550 (match_operand 1))
3551 (use (reg:DI 29))
3552 (clobber (reg:DI 26))]
3553 "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
3554 "@
3555 jsr $26,($27),0\;ldgp $29,0($26)
3556 bsr $26,$%0..ng
3557 jsr $26,%0\;ldgp $29,0($26)"
3558 [(set_attr "type" "jsr")
3559 (set_attr "length" "12,*,16")])
3560
3561 (define_insn "*sibcall_osf_1_er"
3562 [(call (mem:DI (match_operand:DI 0 "symbolic_operand" "R,s"))
3563 (match_operand 1))
3564 (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
3565 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
3566 "@
3567 br $31,%0\t\t!samegp
3568 ldq $27,%0($29)\t\t!literal!%#\;jmp $31,($27),%0\t\t!lituse_jsr!%#"
3569 [(set_attr "type" "jsr")
3570 (set_attr "length" "*,8")])
3571
3572 ;; Note that the DEC assembler expands "jmp foo" with $at, which
3573 ;; doesn't do what we want.
3574 (define_insn "*sibcall_osf_1"
3575 [(call (mem:DI (match_operand:DI 0 "symbolic_operand" "R,s"))
3576 (match_operand 1))
3577 (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
3578 "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
3579 "@
3580 br $31,$%0..ng
3581 lda $27,%0\;jmp $31,($27),%0"
3582 [(set_attr "type" "jsr")
3583 (set_attr "length" "*,8")])
3584
3585 ; GAS relies on the order and position of instructions output below in order
3586 ; to generate relocs for VMS link to potentially optimize the call.
3587 ; Please do not molest.
3588 (define_insn "*call_vms_1"
3589 [(call (mem:DI (match_operand:DI 0 "call_operand" "r,s"))
3590 (match_operand 1))
3591 (use (match_operand:DI 2 "nonmemory_operand" "r,n"))
3592 (use (reg:DI 25))
3593 (use (reg:DI 26))
3594 (clobber (reg:DI 27))]
3595 "TARGET_ABI_OPEN_VMS"
3596 {
3597 switch (which_alternative)
3598 {
3599 case 0:
3600 return "mov %2,$27\;jsr $26,0\;ldq $27,0($29)";
3601 case 1:
3602 operands [2] = alpha_use_linkage (operands [0], true, false);
3603 operands [3] = alpha_use_linkage (operands [0], false, false);
3604 return "ldq $26,%3\;ldq $27,%2\;jsr $26,%0\;ldq $27,0($29)";
3605 default:
3606 gcc_unreachable ();
3607 }
3608 }
3609 [(set_attr "type" "jsr")
3610 (set_attr "length" "12,16")])
3611
3612 ;; Call subroutine returning any type.
3613
3614 (define_expand "untyped_call"
3615 [(parallel [(call (match_operand 0)
3616 (const_int 0))
3617 (match_operand 1)
3618 (match_operand 2)])]
3619 ""
3620 {
3621 int i;
3622
3623 emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
3624
3625 for (i = 0; i < XVECLEN (operands[2], 0); i++)
3626 {
3627 rtx set = XVECEXP (operands[2], 0, i);
3628 emit_move_insn (SET_DEST (set), SET_SRC (set));
3629 }
3630
3631 /* The optimizer does not know that the call sets the function value
3632 registers we stored in the result block. We avoid problems by
3633 claiming that all hard registers are used and clobbered at this
3634 point. */
3635 emit_insn (gen_blockage ());
3636
3637 DONE;
3638 })
3639
3640 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
3641 ;; all of memory. This blocks insns from being moved across this point.
3642
3643 (define_insn "blockage"
3644 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
3645 ""
3646 ""
3647 [(set_attr "length" "0")
3648 (set_attr "type" "none")])
3649
3650 (define_insn "jump"
3651 [(set (pc)
3652 (label_ref (match_operand 0)))]
3653 ""
3654 "br $31,%l0"
3655 [(set_attr "type" "ibr")])
3656
3657 (define_expand "return"
3658 [(return)]
3659 "direct_return ()")
3660
3661 (define_insn "*return_internal"
3662 [(return)]
3663 "reload_completed"
3664 "ret $31,($26),1"
3665 [(set_attr "type" "ibr")])
3666
3667 (define_insn "indirect_jump"
3668 [(set (pc) (match_operand:DI 0 "register_operand" "r"))]
3669 ""
3670 "jmp $31,(%0),0"
3671 [(set_attr "type" "ibr")])
3672
3673 (define_expand "tablejump"
3674 [(parallel [(set (pc)
3675 (match_operand 0 "register_operand"))
3676 (use (label_ref:DI (match_operand 1)))])]
3677 ""
3678 {
3679 if (TARGET_ABI_OSF)
3680 {
3681 rtx dest = gen_reg_rtx (DImode);
3682 emit_insn (gen_extendsidi2 (dest, operands[0]));
3683 emit_insn (gen_adddi3 (dest, pic_offset_table_rtx, dest));
3684 operands[0] = dest;
3685 }
3686 })
3687
3688 (define_insn "*tablejump_internal"
3689 [(set (pc)
3690 (match_operand:DI 0 "register_operand" "r"))
3691 (use (label_ref (match_operand 1)))]
3692 ""
3693 "jmp $31,(%0),0"
3694 [(set_attr "type" "ibr")])
3695
3696 ;; Cache flush. Used by alpha_trampoline_init. 0x86 is PAL_imb, but we don't
3697 ;; want to have to include pal.h in our .s file.
3698 (define_insn "imb"
3699 [(unspec_volatile [(const_int 0)] UNSPECV_IMB)]
3700 ""
3701 "call_pal 0x86"
3702 [(set_attr "type" "callpal")])
3703
3704 (define_expand "clear_cache"
3705 [(match_operand:DI 0) ; region start
3706 (match_operand:DI 1)] ; region end
3707 ""
3708 {
3709 emit_insn (gen_imb ());
3710 DONE;
3711 })
3712
3713 ;; BUGCHK is documented common to OSF/1 and VMS PALcode.
3714 (define_insn "trap"
3715 [(trap_if (const_int 1) (const_int 0))
3716 (use (reg:DI 29))]
3717 ""
3718 "call_pal 0x81"
3719 [(set_attr "type" "callpal")])
3720
3721 ;; For userland, we load the thread pointer from the TCB.
3722 ;; For the kernel, we load the per-cpu private value.
3723
3724 (define_insn "get_thread_pointerdi"
3725 [(set (match_operand:DI 0 "register_operand" "=v")
3726 (unspec:DI [(const_int 0)] UNSPEC_TP))]
3727 "TARGET_ABI_OSF"
3728 {
3729 if (TARGET_TLS_KERNEL)
3730 return "call_pal 0x32";
3731 else
3732 return "call_pal 0x9e";
3733 }
3734 [(set_attr "type" "callpal")])
3735
3736 ;; For completeness, and possibly a __builtin function, here's how to
3737 ;; set the thread pointer. Since we don't describe enough of this
3738 ;; quantity for CSE, we have to use a volatile unspec, and then there's
3739 ;; not much point in creating an R16_REG register class.
3740
3741 (define_expand "set_thread_pointerdi"
3742 [(set (reg:DI 16) (match_operand:DI 0 "input_operand"))
3743 (unspec_volatile [(reg:DI 16)] UNSPECV_SET_TP)]
3744 "TARGET_ABI_OSF")
3745
3746 (define_insn "*set_tp"
3747 [(unspec_volatile [(reg:DI 16)] UNSPECV_SET_TP)]
3748 "TARGET_ABI_OSF"
3749 {
3750 if (TARGET_TLS_KERNEL)
3751 return "call_pal 0x31";
3752 else
3753 return "call_pal 0x9f";
3754 }
3755 [(set_attr "type" "callpal")])
3756
3757 ;; Special builtins for establishing and reverting VMS condition handlers.
3758
3759 (define_expand "builtin_establish_vms_condition_handler"
3760 [(set (reg:DI 0) (match_operand:DI 0 "register_operand"))
3761 (use (match_operand:DI 1 "address_operand"))]
3762 "TARGET_ABI_OPEN_VMS"
3763 {
3764 alpha_expand_builtin_establish_vms_condition_handler (operands[0],
3765 operands[1]);
3766 })
3767
3768 (define_expand "builtin_revert_vms_condition_handler"
3769 [(set (reg:DI 0) (match_operand:DI 0 "register_operand"))]
3770 "TARGET_ABI_OPEN_VMS"
3771 "alpha_expand_builtin_revert_vms_condition_handler (operands[0]);")
3772
3774 ;; Finally, we have the basic data motion insns. The byte and word insns
3775 ;; are done via define_expand. Start with the floating-point insns, since
3776 ;; they are simpler.
3777
3778 (define_expand "movsf"
3779 [(set (match_operand:SF 0 "nonimmediate_operand")
3780 (match_operand:SF 1 "general_operand"))]
3781 ""
3782 {
3783 if (MEM_P (operands[0])
3784 && ! reg_or_0_operand (operands[1], SFmode))
3785 operands[1] = force_reg (SFmode, operands[1]);
3786 })
3787
3788 (define_insn "*movsf"
3789 [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,*r,*r,m,m,f,*r")
3790 (match_operand:SF 1 "input_operand" "fG,m,*rG,m,fG,*r,*r,f"))]
3791 "register_operand (operands[0], SFmode)
3792 || reg_or_0_operand (operands[1], SFmode)"
3793 "@
3794 cpys %R1,%R1,%0
3795 ld%, %0,%1
3796 bis $31,%r1,%0
3797 ldl %0,%1
3798 st%, %R1,%0
3799 stl %r1,%0
3800 itofs %1,%0
3801 ftois %1,%0"
3802 [(set_attr "type" "fcpys,fld,ilog,ild,fst,ist,itof,ftoi")
3803 (set_attr "isa" "*,*,*,*,*,*,fix,fix")])
3804
3805 (define_expand "movdf"
3806 [(set (match_operand:DF 0 "nonimmediate_operand")
3807 (match_operand:DF 1 "general_operand"))]
3808 ""
3809 {
3810 if (MEM_P (operands[0])
3811 && ! reg_or_0_operand (operands[1], DFmode))
3812 operands[1] = force_reg (DFmode, operands[1]);
3813 })
3814
3815 (define_insn "*movdf"
3816 [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,*r,*r,m,m,f,*r")
3817 (match_operand:DF 1 "input_operand" "fG,m,*rG,m,fG,*r,*r,f"))]
3818 "register_operand (operands[0], DFmode)
3819 || reg_or_0_operand (operands[1], DFmode)"
3820 "@
3821 cpys %R1,%R1,%0
3822 ld%- %0,%1
3823 bis $31,%r1,%0
3824 ldq %0,%1
3825 st%- %R1,%0
3826 stq %r1,%0
3827 itoft %1,%0
3828 ftoit %1,%0"
3829 [(set_attr "type" "fcpys,fld,ilog,ild,fst,ist,itof,ftoi")
3830 (set_attr "isa" "*,*,*,*,*,*,fix,fix")])
3831
3832 ;; Subregs suck for register allocation. Pretend we can move TFmode
3833 ;; data between general registers until after reload.
3834 ;; ??? Is this still true now that we have the lower-subreg pass?
3835
3836 (define_expand "movtf"
3837 [(set (match_operand:TF 0 "nonimmediate_operand")
3838 (match_operand:TF 1 "general_operand"))]
3839 ""
3840 {
3841 if (MEM_P (operands[0])
3842 && ! reg_or_0_operand (operands[1], TFmode))
3843 operands[1] = force_reg (TFmode, operands[1]);
3844 })
3845
3846 (define_insn_and_split "*movtf_internal"
3847 [(set (match_operand:TF 0 "nonimmediate_operand" "=r,o")
3848 (match_operand:TF 1 "input_operand" "roG,rG"))]
3849 "register_operand (operands[0], TFmode)
3850 || reg_or_0_operand (operands[1], TFmode)"
3851 "#"
3852 "reload_completed"
3853 [(set (match_dup 0) (match_dup 2))
3854 (set (match_dup 1) (match_dup 3))]
3855 "alpha_split_tmode_pair (operands, TFmode, true);")
3856
3857 ;; We do two major things here: handle mem->mem and construct long
3858 ;; constants.
3859
3860 (define_expand "movsi"
3861 [(set (match_operand:SI 0 "nonimmediate_operand")
3862 (match_operand:SI 1 "general_operand"))]
3863 ""
3864 {
3865 if (alpha_expand_mov (SImode, operands))
3866 DONE;
3867 })
3868
3869 (define_insn "*movsi"
3870 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,m,r")
3871 (match_operand:SI 1 "input_operand" "rJ,K,L,n,m,rJ,s"))]
3872 "register_operand (operands[0], SImode)
3873 || reg_or_0_operand (operands[1], SImode)"
3874 "@
3875 bis $31,%r1,%0
3876 lda %0,%1($31)
3877 ldah %0,%h1($31)
3878 #
3879 ldl %0,%1
3880 stl %r1,%0
3881 lda %0,%1"
3882 [(set_attr "type" "ilog,iadd,iadd,multi,ild,ist,ldsym")
3883 (set_attr "isa" "*,*,*,*,*,*,vms")])
3884
3885 ;; Split a load of a large constant into the appropriate two-insn
3886 ;; sequence.
3887
3888 (define_split
3889 [(set (match_operand:SI 0 "register_operand")
3890 (match_operand:SI 1 "non_add_const_operand"))]
3891 ""
3892 [(const_int 0)]
3893 {
3894 if (alpha_split_const_mov (SImode, operands))
3895 DONE;
3896 else
3897 FAIL;
3898 })
3899
3900 (define_insn "*movdi_er_low_l"
3901 [(set (match_operand:DI 0 "register_operand" "=r")
3902 (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
3903 (match_operand:DI 2 "local_symbolic_operand")))]
3904 "TARGET_EXPLICIT_RELOCS"
3905 {
3906 if (true_regnum (operands[1]) == 29)
3907 return "lda %0,%2(%1)\t\t!gprel";
3908 else
3909 return "lda %0,%2(%1)\t\t!gprellow";
3910 }
3911 [(set_attr "usegp" "yes")])
3912
3913 (define_split
3914 [(set (match_operand:DI 0 "register_operand")
3915 (match_operand:DI 1 "small_symbolic_operand"))]
3916 "TARGET_EXPLICIT_RELOCS && reload_completed"
3917 [(set (match_dup 0)
3918 (lo_sum:DI (match_dup 2) (match_dup 1)))]
3919 "operands[2] = pic_offset_table_rtx;")
3920
3921 (define_split
3922 [(set (match_operand:DI 0 "register_operand")
3923 (match_operand:DI 1 "local_symbolic_operand"))]
3924 "TARGET_EXPLICIT_RELOCS && reload_completed"
3925 [(set (match_dup 0)
3926 (plus:DI (match_dup 2) (high:DI (match_dup 1))))
3927 (set (match_dup 0)
3928 (lo_sum:DI (match_dup 0) (match_dup 1)))]
3929 "operands[2] = pic_offset_table_rtx;")
3930
3931 (define_split
3932 [(match_operand 0 "some_small_symbolic_operand")]
3933 ""
3934 [(match_dup 0)]
3935 "operands[0] = split_small_symbolic_operand (operands[0]);")
3936
3937 ;; Accepts any symbolic, not just global, since function calls that
3938 ;; don't go via bsr still use !literal in hopes of linker relaxation.
3939 (define_insn "movdi_er_high_g"
3940 [(set (match_operand:DI 0 "register_operand" "=r")
3941 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
3942 (match_operand:DI 2 "symbolic_operand")
3943 (match_operand 3 "const_int_operand")]
3944 UNSPEC_LITERAL))]
3945 "TARGET_EXPLICIT_RELOCS"
3946 {
3947 if (INTVAL (operands[3]) == 0)
3948 return "ldq %0,%2(%1)\t\t!literal";
3949 else
3950 return "ldq %0,%2(%1)\t\t!literal!%3";
3951 }
3952 [(set_attr "type" "ldsym")
3953 (set_attr "cannot_copy" "true")])
3954
3955 (define_split
3956 [(set (match_operand:DI 0 "register_operand")
3957 (match_operand:DI 1 "global_symbolic_operand"))]
3958 "TARGET_EXPLICIT_RELOCS && reload_completed"
3959 [(set (match_dup 0)
3960 (unspec:DI [(match_dup 2)
3961 (match_dup 1)
3962 (const_int 0)] UNSPEC_LITERAL))]
3963 "operands[2] = pic_offset_table_rtx;")
3964
3965 (define_insn "movdi_er_tlsgd"
3966 [(set (match_operand:DI 0 "register_operand" "=r")
3967 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
3968 (match_operand:DI 2 "symbolic_operand")
3969 (match_operand 3 "const_int_operand")]
3970 UNSPEC_TLSGD))]
3971 "HAVE_AS_TLS"
3972 {
3973 if (INTVAL (operands[3]) == 0)
3974 return "lda %0,%2(%1)\t\t!tlsgd";
3975 else
3976 return "lda %0,%2(%1)\t\t!tlsgd!%3";
3977 }
3978 [(set_attr "cannot_copy" "true")])
3979
3980 (define_insn "movdi_er_tlsldm"
3981 [(set (match_operand:DI 0 "register_operand" "=r")
3982 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
3983 (match_operand 2 "const_int_operand")]
3984 UNSPEC_TLSLDM))]
3985 "HAVE_AS_TLS"
3986 {
3987 if (INTVAL (operands[2]) == 0)
3988 return "lda %0,%&(%1)\t\t!tlsldm";
3989 else
3990 return "lda %0,%&(%1)\t\t!tlsldm!%2";
3991 }
3992 [(set_attr "cannot_copy" "true")])
3993
3994 (define_insn "*movdi_er_gotdtp"
3995 [(set (match_operand:DI 0 "register_operand" "=r")
3996 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
3997 (match_operand:DI 2 "symbolic_operand")]
3998 UNSPEC_DTPREL))]
3999 "HAVE_AS_TLS"
4000 "ldq %0,%2(%1)\t\t!gotdtprel"
4001 [(set_attr "type" "ild")
4002 (set_attr "usegp" "yes")])
4003
4004 (define_split
4005 [(set (match_operand:DI 0 "register_operand")
4006 (match_operand:DI 1 "gotdtp_symbolic_operand"))]
4007 "HAVE_AS_TLS && reload_completed"
4008 [(set (match_dup 0)
4009 (unspec:DI [(match_dup 2)
4010 (match_dup 1)] UNSPEC_DTPREL))]
4011 {
4012 operands[1] = XVECEXP (XEXP (operands[1], 0), 0, 0);
4013 operands[2] = pic_offset_table_rtx;
4014 })
4015
4016 (define_insn "*movdi_er_gottp"
4017 [(set (match_operand:DI 0 "register_operand" "=r")
4018 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
4019 (match_operand:DI 2 "symbolic_operand")]
4020 UNSPEC_TPREL))]
4021 "HAVE_AS_TLS"
4022 "ldq %0,%2(%1)\t\t!gottprel"
4023 [(set_attr "type" "ild")
4024 (set_attr "usegp" "yes")])
4025
4026 (define_split
4027 [(set (match_operand:DI 0 "register_operand")
4028 (match_operand:DI 1 "gottp_symbolic_operand"))]
4029 "HAVE_AS_TLS && reload_completed"
4030 [(set (match_dup 0)
4031 (unspec:DI [(match_dup 2)
4032 (match_dup 1)] UNSPEC_TPREL))]
4033 {
4034 operands[1] = XVECEXP (XEXP (operands[1], 0), 0, 0);
4035 operands[2] = pic_offset_table_rtx;
4036 })
4037
4038 (define_insn "*movdi"
4039 [(set (match_operand:DI 0 "nonimmediate_operand"
4040 "=r,r,r,r,r,r,r,r, m, *f,*f, Q, r,*f")
4041 (match_operand:DI 1 "input_operand"
4042 "rJ,K,L,T,s,n,s,m,rJ,*fJ, Q,*f,*f, r"))]
4043 "register_operand (operands[0], DImode)
4044 || reg_or_0_operand (operands[1], DImode)"
4045 "@
4046 mov %r1,%0
4047 lda %0,%1($31)
4048 ldah %0,%h1($31)
4049 #
4050 #
4051 #
4052 lda %0,%1
4053 ldq%A1 %0,%1
4054 stq%A0 %r1,%0
4055 fmov %R1,%0
4056 ldt %0,%1
4057 stt %R1,%0
4058 ftoit %1,%0
4059 itoft %1,%0"
4060 [(set_attr "type" "ilog,iadd,iadd,iadd,ldsym,multi,ldsym,ild,ist,fcpys,fld,fst,ftoi,itof")
4061 (set_attr "isa" "*,*,*,er,er,*,ner,*,*,*,*,*,fix,fix")
4062 (set_attr "usegp" "*,*,*,yes,*,*,*,*,*,*,*,*,*,*")])
4063
4064 ;; VMS needs to set up "vms_base_regno" for unwinding. This move
4065 ;; often appears dead to the life analysis code, at which point we
4066 ;; die for emitting dead prologue instructions. Force this live.
4067
4068 (define_insn "force_movdi"
4069 [(set (match_operand:DI 0 "register_operand" "=r")
4070 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")]
4071 UNSPECV_FORCE_MOV))]
4072 ""
4073 "mov %1,%0"
4074 [(set_attr "type" "ilog")])
4075
4076 ;; We do three major things here: handle mem->mem, put 64-bit constants in
4077 ;; memory, and construct long 32-bit constants.
4078
4079 (define_expand "movdi"
4080 [(set (match_operand:DI 0 "nonimmediate_operand")
4081 (match_operand:DI 1 "general_operand"))]
4082 ""
4083 {
4084 if (alpha_expand_mov (DImode, operands))
4085 DONE;
4086 })
4087
4088 ;; Split a load of a large constant into the appropriate two-insn
4089 ;; sequence.
4090
4091 (define_split
4092 [(set (match_operand:DI 0 "register_operand")
4093 (match_operand:DI 1 "non_add_const_operand"))]
4094 ""
4095 [(const_int 0)]
4096 {
4097 if (alpha_split_const_mov (DImode, operands))
4098 DONE;
4099 else
4100 FAIL;
4101 })
4102
4103 ;; We need to prevent reload from splitting TImode moves, because it
4104 ;; might decide to overwrite a pointer with the value it points to.
4105 ;; In that case we have to do the loads in the appropriate order so
4106 ;; that the pointer is not destroyed too early.
4107
4108 (define_insn_and_split "*movti_internal"
4109 [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
4110 (match_operand:TI 1 "input_operand" "roJ,rJ"))]
4111 "(register_operand (operands[0], TImode)
4112 /* Prevent rematerialization of constants. */
4113 && ! CONSTANT_P (operands[1]))
4114 || reg_or_0_operand (operands[1], TImode)"
4115 "#"
4116 "reload_completed"
4117 [(set (match_dup 0) (match_dup 2))
4118 (set (match_dup 1) (match_dup 3))]
4119 "alpha_split_tmode_pair (operands, TImode, true);")
4120
4121 (define_expand "movti"
4122 [(set (match_operand:TI 0 "nonimmediate_operand")
4123 (match_operand:TI 1 "general_operand"))]
4124 ""
4125 {
4126 if (MEM_P (operands[0])
4127 && ! reg_or_0_operand (operands[1], TImode))
4128 operands[1] = force_reg (TImode, operands[1]);
4129
4130 if (operands[1] == const0_rtx)
4131 ;
4132 /* We must put 64-bit constants in memory. We could keep the
4133 32-bit constants in TImode and rely on the splitter, but
4134 this doesn't seem to be worth the pain. */
4135 else if (CONST_SCALAR_INT_P (operands[1]))
4136 {
4137 rtx in[2], out[2], target;
4138
4139 gcc_assert (can_create_pseudo_p ());
4140
4141 split_double (operands[1], &in[0], &in[1]);
4142
4143 if (in[0] == const0_rtx)
4144 out[0] = const0_rtx;
4145 else
4146 {
4147 out[0] = gen_reg_rtx (DImode);
4148 emit_insn (gen_movdi (out[0], in[0]));
4149 }
4150
4151 if (in[1] == const0_rtx)
4152 out[1] = const0_rtx;
4153 else
4154 {
4155 out[1] = gen_reg_rtx (DImode);
4156 emit_insn (gen_movdi (out[1], in[1]));
4157 }
4158
4159 if (!REG_P (operands[0]))
4160 target = gen_reg_rtx (TImode);
4161 else
4162 target = operands[0];
4163
4164 emit_insn (gen_movdi (operand_subword (target, 0, 0, TImode), out[0]));
4165 emit_insn (gen_movdi (operand_subword (target, 1, 0, TImode), out[1]));
4166
4167 if (target != operands[0])
4168 emit_insn (gen_rtx_SET (operands[0], target));
4169
4170 DONE;
4171 }
4172 })
4173
4174 ;; These are the partial-word cases.
4175 ;;
4176 ;; First we have the code to load an aligned word. Operand 0 is the register
4177 ;; in which to place the result. It's mode is QImode or HImode. Operand 1
4178 ;; is an SImode MEM at the low-order byte of the proper word. Operand 2 is the
4179 ;; number of bits within the word that the value is. Operand 3 is an SImode
4180 ;; scratch register. If operand 0 is a hard register, operand 3 may be the
4181 ;; same register. It is allowed to conflict with operand 1 as well.
4182
4183 (define_expand "aligned_loadqi"
4184 [(set (match_operand:SI 3 "register_operand")
4185 (match_operand:SI 1 "memory_operand"))
4186 (set (match_operand:DI 0 "register_operand")
4187 (zero_extract:DI (subreg:DI (match_dup 3) 0)
4188 (const_int 8)
4189 (match_operand:DI 2 "const_int_operand")))])
4190
4191 (define_expand "aligned_loadhi"
4192 [(set (match_operand:SI 3 "register_operand")
4193 (match_operand:SI 1 "memory_operand"))
4194 (set (match_operand:DI 0 "register_operand")
4195 (zero_extract:DI (subreg:DI (match_dup 3) 0)
4196 (const_int 16)
4197 (match_operand:DI 2 "const_int_operand")))])
4198
4199 ;; Similar for unaligned loads, where we use the sequence from the
4200 ;; Alpha Architecture manual. We have to distinguish between little-endian
4201 ;; and big-endian systems as the sequences are different.
4202 ;;
4203 ;; Operand 1 is the address. Operands 2 and 3 are temporaries, where
4204 ;; operand 3 can overlap the input and output registers.
4205
4206 (define_expand "unaligned_loadqi"
4207 [(set (match_operand:DI 2 "register_operand")
4208 (mem:DI (and:DI (match_operand:DI 1 "address_operand")
4209 (const_int -8))))
4210 (set (match_operand:DI 3 "register_operand")
4211 (match_dup 1))
4212 (set (match_operand:DI 0 "register_operand")
4213 (zero_extract:DI (match_dup 2)
4214 (const_int 8)
4215 (ashift:DI (match_dup 3) (const_int 3))))])
4216
4217 (define_expand "unaligned_loadhi"
4218 [(set (match_operand:DI 2 "register_operand")
4219 (mem:DI (and:DI (match_operand:DI 1 "address_operand")
4220 (const_int -8))))
4221 (set (match_operand:DI 3 "register_operand")
4222 (match_dup 1))
4223 (set (match_operand:DI 0 "register_operand")
4224 (zero_extract:DI (match_dup 2)
4225 (const_int 16)
4226 (ashift:DI (match_dup 3) (const_int 3))))])
4227
4228 ;; Storing an aligned byte or word requires two temporaries. Operand 0 is the
4229 ;; aligned SImode MEM. Operand 1 is the register containing the
4230 ;; byte or word to store. Operand 2 is the number of bits within the word that
4231 ;; the value should be placed. Operands 3 and 4 are SImode temporaries.
4232
4233 (define_expand "aligned_store"
4234 [(set (match_operand:SI 3 "register_operand")
4235 (match_operand:SI 0 "memory_operand"))
4236 (set (subreg:DI (match_dup 3) 0)
4237 (and:DI (subreg:DI (match_dup 3) 0) (match_dup 5)))
4238 (set (subreg:DI (match_operand:SI 4 "register_operand") 0)
4239 (ashift:DI (zero_extend:DI (match_operand 1 "register_operand"))
4240 (match_operand:DI 2 "const_int_operand")))
4241 (set (subreg:DI (match_dup 4) 0)
4242 (ior:DI (subreg:DI (match_dup 4) 0) (subreg:DI (match_dup 3) 0)))
4243 (set (match_dup 0) (match_dup 4))]
4244 ""
4245 {
4246 operands[5] = GEN_INT (~ (GET_MODE_MASK (GET_MODE (operands[1]))
4247 << INTVAL (operands[2])));
4248 })
4249
4250 ;; For the unaligned byte and halfword cases, we use code similar to that
4251 ;; in the ;; Architecture book, but reordered to lower the number of registers
4252 ;; required. Operand 0 is the address. Operand 1 is the data to store.
4253 ;; Operands 2, 3, and 4 are DImode temporaries, where operands 2 and 4 may
4254 ;; be the same temporary, if desired. If the address is in a register,
4255 ;; operand 2 can be that register.
4256
4257 (define_expand "@unaligned_store<mode>"
4258 [(set (match_operand:DI 3 "register_operand")
4259 (mem:DI (and:DI (match_operand:DI 0 "address_operand")
4260 (const_int -8))))
4261 (set (match_operand:DI 2 "register_operand")
4262 (match_dup 0))
4263 (set (match_dup 3)
4264 (and:DI (not:DI (ashift:DI (match_dup 5)
4265 (ashift:DI (match_dup 2) (const_int 3))))
4266 (match_dup 3)))
4267 (set (match_operand:DI 4 "register_operand")
4268 (ashift:DI (zero_extend:DI
4269 (match_operand:I12MODE 1 "register_operand"))
4270 (ashift:DI (match_dup 2) (const_int 3))))
4271 (set (match_dup 4) (ior:DI (match_dup 4) (match_dup 3)))
4272 (set (mem:DI (and:DI (match_dup 0) (const_int -8)))
4273 (match_dup 4))]
4274 ""
4275 "operands[5] = GEN_INT (GET_MODE_MASK (<MODE>mode));")
4276
4277 ;; Here are the define_expand's for QI and HI moves that use the above
4278 ;; patterns. We have the normal sets, plus the ones that need scratch
4279 ;; registers for reload.
4280
4281 (define_expand "mov<mode>"
4282 [(set (match_operand:I12MODE 0 "nonimmediate_operand")
4283 (match_operand:I12MODE 1 "general_operand"))]
4284 ""
4285 {
4286 if (TARGET_BWX
4287 ? alpha_expand_mov (<MODE>mode, operands)
4288 : alpha_expand_mov_nobwx (<MODE>mode, operands))
4289 DONE;
4290 })
4291
4292 (define_insn "*movqi"
4293 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,m")
4294 (match_operand:QI 1 "input_operand" "rJ,n,m,rJ"))]
4295 "register_operand (operands[0], QImode)
4296 || reg_or_0_operand (operands[1], QImode)"
4297 "@
4298 bis $31,%r1,%0
4299 lda %0,%L1($31)
4300 ldbu %0,%1
4301 stb %r1,%0"
4302 [(set_attr "type" "ilog,iadd,ild,ist")
4303 (set_attr "isa" "*,*,bwx,bwx")])
4304
4305 (define_insn "*movhi"
4306 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m")
4307 (match_operand:HI 1 "input_operand" "rJ,n,m,rJ"))]
4308 "register_operand (operands[0], HImode)
4309 || reg_or_0_operand (operands[1], HImode)"
4310 "@
4311 bis $31,%r1,%0
4312 lda %0,%L1($31)
4313 ldwu %0,%1
4314 stw %r1,%0"
4315 [(set_attr "type" "ilog,iadd,ild,ist")
4316 (set_attr "isa" "*,*,bwx,bwx")])
4317
4318 ;; We need to hook into the extra support that we have for HImode
4319 ;; reloads when BWX insns are not available.
4320 (define_expand "movcqi"
4321 [(set (match_operand:CQI 0 "nonimmediate_operand")
4322 (match_operand:CQI 1 "general_operand"))]
4323 "!TARGET_BWX"
4324 {
4325 if (GET_CODE (operands[0]) == CONCAT || GET_CODE (operands[1]) == CONCAT)
4326 ;
4327 else if (!any_memory_operand (operands[0], CQImode))
4328 {
4329 if (!any_memory_operand (operands[1], CQImode))
4330 {
4331 emit_move_insn (gen_lowpart (HImode, operands[0]),
4332 gen_lowpart (HImode, operands[1]));
4333 DONE;
4334 }
4335 if (aligned_memory_operand (operands[1], CQImode))
4336 {
4337 bool done;
4338 do_aligned1:
4339 operands[1] = gen_lowpart (HImode, operands[1]);
4340 do_aligned2:
4341 operands[0] = gen_lowpart (HImode, operands[0]);
4342 done = alpha_expand_mov_nobwx (HImode, operands);
4343 gcc_assert (done);
4344 DONE;
4345 }
4346 }
4347 else if (aligned_memory_operand (operands[0], CQImode))
4348 {
4349 if (MEM_P (operands[1]))
4350 {
4351 rtx x = gen_reg_rtx (HImode);
4352 emit_move_insn (gen_lowpart (CQImode, x), operands[1]);
4353 operands[1] = x;
4354 goto do_aligned2;
4355 }
4356 goto do_aligned1;
4357 }
4358
4359 gcc_assert (!reload_in_progress);
4360 emit_move_complex_parts (operands[0], operands[1]);
4361 DONE;
4362 })
4363
4364 ;; Here are the versions for reload.
4365 ;;
4366 ;; The aligned input case is recognized early in alpha_secondary_reload
4367 ;; in order to avoid allocating an unnecessary scratch register.
4368 ;;
4369 ;; Note that in the unaligned cases we know that the operand must not be
4370 ;; a pseudo-register because stack slots are always aligned references.
4371
4372 (define_expand "reload_in<mode>"
4373 [(parallel [(match_operand:RELOAD12 0 "register_operand" "=r")
4374 (match_operand:RELOAD12 1 "any_memory_operand" "m")
4375 (match_operand:TI 2 "register_operand" "=&r")])]
4376 "!TARGET_BWX"
4377 {
4378 rtx scratch, seq, addr;
4379 unsigned regno = REGNO (operands[2]);
4380
4381 /* It is possible that one of the registers we got for operands[2]
4382 might coincide with that of operands[0] (which is why we made
4383 it TImode). Pick the other one to use as our scratch. */
4384 if (regno == REGNO (operands[0]))
4385 regno++;
4386 scratch = gen_rtx_REG (DImode, regno);
4387
4388 addr = get_unaligned_address (operands[1]);
4389 operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
4390 seq = gen_unaligned_load<reloadmode> (operands[0], addr,
4391 scratch, operands[0]);
4392 alpha_set_memflags (seq, operands[1]);
4393
4394 emit_insn (seq);
4395 DONE;
4396 })
4397
4398 (define_expand "reload_out<mode>"
4399 [(parallel [(match_operand:RELOAD12 0 "any_memory_operand" "=m")
4400 (match_operand:RELOAD12 1 "register_operand" "r")
4401 (match_operand:TI 2 "register_operand" "=&r")])]
4402 "!TARGET_BWX"
4403 {
4404 unsigned regno = REGNO (operands[2]);
4405
4406 if (<MODE>mode == CQImode)
4407 {
4408 operands[0] = gen_lowpart (HImode, operands[0]);
4409 operands[1] = gen_lowpart (HImode, operands[1]);
4410 }
4411
4412 if (aligned_memory_operand (operands[0], <MODE>mode))
4413 {
4414 emit_insn (gen_reload_out<reloadmode>_aligned
4415 (operands[0], operands[1],
4416 gen_rtx_REG (SImode, regno),
4417 gen_rtx_REG (SImode, regno + 1)));
4418 }
4419 else
4420 {
4421 rtx addr = get_unaligned_address (operands[0]);
4422 rtx scratch1 = gen_rtx_REG (DImode, regno);
4423 rtx scratch2 = gen_rtx_REG (DImode, regno + 1);
4424 rtx scratch3 = scratch1;
4425 rtx seq;
4426
4427 if (REG_P (addr))
4428 scratch1 = addr;
4429
4430 seq = gen_unaligned_store<reloadmode> (addr, operands[1], scratch1,
4431 scratch2, scratch3);
4432 alpha_set_memflags (seq, operands[0]);
4433 emit_insn (seq);
4434 }
4435 DONE;
4436 })
4437
4438 ;; Helpers for the above. The way reload is structured, we can't
4439 ;; always get a proper address for a stack slot during reload_foo
4440 ;; expansion, so we must delay our address manipulations until after.
4441
4442 (define_insn_and_split "@reload_in<mode>_aligned"
4443 [(set (match_operand:I12MODE 0 "register_operand" "=r")
4444 (match_operand:I12MODE 1 "memory_operand" "m"))]
4445 "!TARGET_BWX && (reload_in_progress || reload_completed)"
4446 "#"
4447 "!TARGET_BWX && reload_completed"
4448 [(const_int 0)]
4449 {
4450 rtx aligned_mem, bitnum;
4451 get_aligned_mem (operands[1], &aligned_mem, &bitnum);
4452 emit_insn (gen_aligned_load<reloadmode>
4453 (gen_lowpart (DImode, operands[0]), aligned_mem, bitnum,
4454 gen_rtx_REG (SImode, REGNO (operands[0]))));
4455 DONE;
4456 })
4457
4458 (define_insn_and_split "reload_out<mode>_aligned"
4459 [(set (match_operand:I12MODE 0 "memory_operand" "=m")
4460 (match_operand:I12MODE 1 "register_operand" "r"))
4461 (clobber (match_operand:SI 2 "register_operand" "=&r"))
4462 (clobber (match_operand:SI 3 "register_operand" "=&r"))]
4463 "!TARGET_BWX && (reload_in_progress || reload_completed)"
4464 "#"
4465 "!TARGET_BWX && reload_completed"
4466 [(const_int 0)]
4467 {
4468 rtx aligned_mem, bitnum;
4469 get_aligned_mem (operands[0], &aligned_mem, &bitnum);
4470 emit_insn (gen_aligned_store (aligned_mem, operands[1], bitnum,
4471 operands[2], operands[3]));
4472 DONE;
4473 })
4474
4476 ;; Vector operations
4477
4478 (define_mode_iterator VEC [V8QI V4HI V2SI])
4479 (define_mode_iterator VEC12 [V8QI V4HI])
4480
4481 (define_expand "mov<mode>"
4482 [(set (match_operand:VEC 0 "nonimmediate_operand")
4483 (match_operand:VEC 1 "general_operand"))]
4484 ""
4485 {
4486 if (alpha_expand_mov (<MODE>mode, operands))
4487 DONE;
4488 })
4489
4490 (define_split
4491 [(set (match_operand:VEC 0 "register_operand")
4492 (match_operand:VEC 1 "non_zero_const_operand"))]
4493 ""
4494 [(const_int 0)]
4495 {
4496 if (alpha_split_const_mov (<MODE>mode, operands))
4497 DONE;
4498 else
4499 FAIL;
4500 })
4501
4502
4503 (define_expand "movmisalign<mode>"
4504 [(set (match_operand:VEC 0 "nonimmediate_operand")
4505 (match_operand:VEC 1 "general_operand"))]
4506 ""
4507 {
4508 alpha_expand_movmisalign (<MODE>mode, operands);
4509 DONE;
4510 })
4511
4512 (define_insn "*mov<mode>_fix"
4513 [(set (match_operand:VEC 0 "nonimmediate_operand" "=r,r,r,m,*f,*f,m,r,*f")
4514 (match_operand:VEC 1 "input_operand" "rW,i,m,rW,*fW,m,*f,*f,r"))]
4515 "register_operand (operands[0], <MODE>mode)
4516 || reg_or_0_operand (operands[1], <MODE>mode)"
4517 "@
4518 bis $31,%r1,%0
4519 #
4520 ldq %0,%1
4521 stq %r1,%0
4522 cpys %R1,%R1,%0
4523 ldt %0,%1
4524 stt %R1,%0
4525 ftoit %1,%0
4526 itoft %1,%0"
4527 [(set_attr "type" "ilog,multi,ild,ist,fcpys,fld,fst,ftoi,itof")
4528 (set_attr "isa" "*,*,*,*,*,*,*,fix,fix")])
4529
4530 (define_insn "<code><mode>3"
4531 [(set (match_operand:VEC12 0 "register_operand" "=r")
4532 (any_maxmin:VEC12
4533 (match_operand:VEC12 1 "reg_or_0_operand" "rW")
4534 (match_operand:VEC12 2 "reg_or_0_operand" "rW")))]
4535 "TARGET_MAX"
4536 "<maxmin><modesuffix> %r1,%r2,%0"
4537 [(set_attr "type" "mvi")])
4538
4539 (define_insn "one_cmpl<mode>2"
4540 [(set (match_operand:VEC 0 "register_operand" "=r")
4541 (not:VEC (match_operand:VEC 1 "register_operand" "r")))]
4542 ""
4543 "ornot $31,%1,%0"
4544 [(set_attr "type" "ilog")])
4545
4546 (define_insn "and<mode>3"
4547 [(set (match_operand:VEC 0 "register_operand" "=r")
4548 (and:VEC (match_operand:VEC 1 "register_operand" "r")
4549 (match_operand:VEC 2 "register_operand" "r")))]
4550 ""
4551 "and %1,%2,%0"
4552 [(set_attr "type" "ilog")])
4553
4554 (define_insn "*andnot<mode>3"
4555 [(set (match_operand:VEC 0 "register_operand" "=r")
4556 (and:VEC (not:VEC (match_operand:VEC 1 "register_operand" "r"))
4557 (match_operand:VEC 2 "register_operand" "r")))]
4558 ""
4559 "bic %2,%1,%0"
4560 [(set_attr "type" "ilog")])
4561
4562 (define_insn "ior<mode>3"
4563 [(set (match_operand:VEC 0 "register_operand" "=r")
4564 (ior:VEC (match_operand:VEC 1 "register_operand" "r")
4565 (match_operand:VEC 2 "register_operand" "r")))]
4566 ""
4567 "bis %1,%2,%0"
4568 [(set_attr "type" "ilog")])
4569
4570 (define_insn "*iornot<mode>3"
4571 [(set (match_operand:VEC 0 "register_operand" "=r")
4572 (ior:VEC (not:DI (match_operand:VEC 1 "register_operand" "r"))
4573 (match_operand:VEC 2 "register_operand" "r")))]
4574 ""
4575 "ornot %2,%1,%0"
4576 [(set_attr "type" "ilog")])
4577
4578 (define_insn "xor<mode>3"
4579 [(set (match_operand:VEC 0 "register_operand" "=r")
4580 (xor:VEC (match_operand:VEC 1 "register_operand" "r")
4581 (match_operand:VEC 2 "register_operand" "r")))]
4582 ""
4583 "xor %1,%2,%0"
4584 [(set_attr "type" "ilog")])
4585
4586 (define_insn "*xornot<mode>3"
4587 [(set (match_operand:VEC 0 "register_operand" "=r")
4588 (not:VEC (xor:VEC (match_operand:VEC 1 "register_operand" "r")
4589 (match_operand:VEC 2 "register_operand" "r"))))]
4590 ""
4591 "eqv %1,%2,%0"
4592 [(set_attr "type" "ilog")])
4593
4594 (define_expand "vec_shl_<mode>"
4595 [(set (match_operand:VEC 0 "register_operand")
4596 (ashift:DI (match_operand:VEC 1 "register_operand")
4597 (match_operand:DI 2 "reg_or_6bit_operand")))]
4598 ""
4599 {
4600 operands[0] = gen_lowpart (DImode, operands[0]);
4601 operands[1] = gen_lowpart (DImode, operands[1]);
4602 })
4603
4604 (define_expand "vec_shr_<mode>"
4605 [(set (match_operand:VEC 0 "register_operand")
4606 (lshiftrt:DI (match_operand:VEC 1 "register_operand")
4607 (match_operand:DI 2 "reg_or_6bit_operand")))]
4608 ""
4609 {
4610 operands[0] = gen_lowpart (DImode, operands[0]);
4611 operands[1] = gen_lowpart (DImode, operands[1]);
4612 })
4613
4615 ;; Bit field extract patterns which use ext[wlq][lh]
4616
4617 (define_expand "extvmisaligndi"
4618 [(set (match_operand:DI 0 "register_operand")
4619 (sign_extract:DI (match_operand:BLK 1 "memory_operand")
4620 (match_operand:DI 2 "const_int_operand")
4621 (match_operand:DI 3 "const_int_operand")))]
4622 ""
4623 {
4624 /* We can do 16, 32 and 64 bit fields, if aligned on byte boundaries. */
4625 if (INTVAL (operands[3]) % 8 != 0
4626 || (INTVAL (operands[2]) != 16
4627 && INTVAL (operands[2]) != 32
4628 && INTVAL (operands[2]) != 64))
4629 FAIL;
4630
4631 alpha_expand_unaligned_load (operands[0], operands[1],
4632 INTVAL (operands[2]) / 8,
4633 INTVAL (operands[3]) / 8, 1);
4634 DONE;
4635 })
4636
4637 (define_expand "extzvdi"
4638 [(set (match_operand:DI 0 "register_operand")
4639 (zero_extract:DI (match_operand:DI 1 "register_operand")
4640 (match_operand:DI 2 "const_int_operand")
4641 (match_operand:DI 3 "const_int_operand")))]
4642 ""
4643 {
4644 /* We can do 8, 16, 32 and 64 bit fields, if aligned on byte boundaries. */
4645 if (INTVAL (operands[3]) % 8 != 0
4646 || (INTVAL (operands[2]) != 8
4647 && INTVAL (operands[2]) != 16
4648 && INTVAL (operands[2]) != 32
4649 && INTVAL (operands[2]) != 64))
4650 FAIL;
4651 })
4652
4653 (define_expand "extzvmisaligndi"
4654 [(set (match_operand:DI 0 "register_operand")
4655 (zero_extract:DI (match_operand:BLK 1 "memory_operand")
4656 (match_operand:DI 2 "const_int_operand")
4657 (match_operand:DI 3 "const_int_operand")))]
4658 ""
4659 {
4660 /* We can do 16, 32 and 64 bit fields, if aligned on byte boundaries.
4661 We fail 8-bit fields, falling back on a simple byte load. */
4662 if (INTVAL (operands[3]) % 8 != 0
4663 || (INTVAL (operands[2]) != 16
4664 && INTVAL (operands[2]) != 32
4665 && INTVAL (operands[2]) != 64))
4666 FAIL;
4667
4668 alpha_expand_unaligned_load (operands[0], operands[1],
4669 INTVAL (operands[2]) / 8,
4670 INTVAL (operands[3]) / 8, 0);
4671 DONE;
4672 })
4673
4674 (define_expand "insvmisaligndi"
4675 [(set (zero_extract:DI (match_operand:BLK 0 "memory_operand")
4676 (match_operand:DI 1 "const_int_operand")
4677 (match_operand:DI 2 "const_int_operand"))
4678 (match_operand:DI 3 "register_operand"))]
4679 ""
4680 {
4681 /* We can do 16, 32 and 64 bit fields, if aligned on byte boundaries. */
4682 if (INTVAL (operands[2]) % 8 != 0
4683 || (INTVAL (operands[1]) != 16
4684 && INTVAL (operands[1]) != 32
4685 && INTVAL (operands[1]) != 64))
4686 FAIL;
4687
4688 alpha_expand_unaligned_store (operands[0], operands[3],
4689 INTVAL (operands[1]) / 8,
4690 INTVAL (operands[2]) / 8);
4691 DONE;
4692 })
4693
4694 ;; Block move/clear, see alpha.cc for more details.
4695 ;; Argument 0 is the destination
4696 ;; Argument 1 is the source
4697 ;; Argument 2 is the length
4698 ;; Argument 3 is the alignment
4699
4700 (define_expand "cpymemqi"
4701 [(parallel [(set (match_operand:BLK 0 "memory_operand")
4702 (match_operand:BLK 1 "memory_operand"))
4703 (use (match_operand:DI 2 "immediate_operand"))
4704 (use (match_operand:DI 3 "immediate_operand"))])]
4705 ""
4706 {
4707 if (alpha_expand_block_move (operands))
4708 DONE;
4709 else
4710 FAIL;
4711 })
4712
4713 (define_expand "cpymemdi"
4714 [(parallel [(set (match_operand:BLK 0 "memory_operand")
4715 (match_operand:BLK 1 "memory_operand"))
4716 (use (match_operand:DI 2 "immediate_operand"))
4717 (use (match_operand:DI 3 "immediate_operand"))
4718 (use (match_dup 4))
4719 (clobber (reg:DI 25))
4720 (clobber (reg:DI 16))
4721 (clobber (reg:DI 17))
4722 (clobber (reg:DI 18))
4723 (clobber (reg:DI 19))
4724 (clobber (reg:DI 20))
4725 (clobber (reg:DI 26))
4726 (clobber (reg:DI 27))])]
4727 "TARGET_ABI_OPEN_VMS"
4728 "operands[4] = gen_rtx_SYMBOL_REF (Pmode, \"OTS$MOVE\");")
4729
4730 (define_insn "*cpymemdi_1"
4731 [(set (match_operand:BLK 0 "memory_operand" "=m,m")
4732 (match_operand:BLK 1 "memory_operand" "m,m"))
4733 (use (match_operand:DI 2 "nonmemory_operand" "r,i"))
4734 (use (match_operand:DI 3 "immediate_operand"))
4735 (use (match_operand:DI 4 "call_operand" "i,i"))
4736 (clobber (reg:DI 25))
4737 (clobber (reg:DI 16))
4738 (clobber (reg:DI 17))
4739 (clobber (reg:DI 18))
4740 (clobber (reg:DI 19))
4741 (clobber (reg:DI 20))
4742 (clobber (reg:DI 26))
4743 (clobber (reg:DI 27))]
4744 "TARGET_ABI_OPEN_VMS"
4745 {
4746 operands [5] = alpha_use_linkage (operands [4], false, true);
4747 switch (which_alternative)
4748 {
4749 case 0:
4750 return "lda $16,%0\;bis $31,%2,$17\;lda $18,%1\;ldq $26,%5\;lda $25,3($31)\;jsr $26,%4\;ldq $27,0($29)";
4751 case 1:
4752 return "lda $16,%0\;lda $17,%2($31)\;lda $18,%1\;ldq $26,%5\;lda $25,3($31)\;jsr $26,%4\;ldq $27,0($29)";
4753 default:
4754 gcc_unreachable ();
4755 }
4756 }
4757 [(set_attr "type" "multi")
4758 (set_attr "length" "28")])
4759
4760 (define_expand "setmemqi"
4761 [(parallel [(set (match_operand:BLK 0 "memory_operand")
4762 (match_operand 2 "const_int_operand"))
4763 (use (match_operand:DI 1 "immediate_operand"))
4764 (use (match_operand:DI 3 "immediate_operand"))])]
4765 ""
4766 {
4767 /* If value to set is not zero, use the library routine. */
4768 if (operands[2] != const0_rtx)
4769 FAIL;
4770
4771 if (alpha_expand_block_clear (operands))
4772 DONE;
4773 else
4774 FAIL;
4775 })
4776
4777 (define_expand "setmemdi"
4778 [(parallel [(set (match_operand:BLK 0 "memory_operand")
4779 (match_operand 2 "const_int_operand"))
4780 (use (match_operand:DI 1 "immediate_operand"))
4781 (use (match_operand:DI 3 "immediate_operand"))
4782 (use (match_dup 4))
4783 (clobber (reg:DI 25))
4784 (clobber (reg:DI 16))
4785 (clobber (reg:DI 17))
4786 (clobber (reg:DI 26))
4787 (clobber (reg:DI 27))])]
4788 "TARGET_ABI_OPEN_VMS"
4789 {
4790 /* If value to set is not zero, use the library routine. */
4791 if (operands[2] != const0_rtx)
4792 FAIL;
4793
4794 operands[4] = gen_rtx_SYMBOL_REF (Pmode, "OTS$ZERO");
4795 })
4796
4797 (define_insn "*clrmemdi_1"
4798 [(set (match_operand:BLK 0 "memory_operand" "=m,m")
4799 (const_int 0))
4800 (use (match_operand:DI 1 "nonmemory_operand" "r,i"))
4801 (use (match_operand:DI 2 "immediate_operand"))
4802 (use (match_operand:DI 3 "call_operand" "i,i"))
4803 (clobber (reg:DI 25))
4804 (clobber (reg:DI 16))
4805 (clobber (reg:DI 17))
4806 (clobber (reg:DI 26))
4807 (clobber (reg:DI 27))]
4808 "TARGET_ABI_OPEN_VMS"
4809 {
4810 operands [4] = alpha_use_linkage (operands [3], false, true);
4811 switch (which_alternative)
4812 {
4813 case 0:
4814 return "lda $16,%0\;bis $31,%1,$17\;ldq $26,%4\;lda $25,2($31)\;jsr $26,%3\;ldq $27,0($29)";
4815 case 1:
4816 return "lda $16,%0\;lda $17,%1($31)\;ldq $26,%4\;lda $25,2($31)\;jsr $26,%3\;ldq $27,0($29)";
4817 default:
4818 gcc_unreachable ();
4819 }
4820 }
4821 [(set_attr "type" "multi")
4822 (set_attr "length" "24")])
4823
4824
4826 ;; Subroutine of stack space allocation. Perform a stack probe.
4827 (define_expand "stack_probe_internal"
4828 [(set (match_dup 1) (match_operand:DI 0 "const_int_operand"))]
4829 ""
4830 {
4831 operands[1] = gen_rtx_MEM (DImode, plus_constant (Pmode, stack_pointer_rtx,
4832 INTVAL (operands[0])));
4833 MEM_VOLATILE_P (operands[1]) = 1;
4834
4835 operands[0] = const0_rtx;
4836 })
4837
4838 ;; This is how we allocate stack space. If we are allocating a
4839 ;; constant amount of space and we know it is less than 4096
4840 ;; bytes, we need do nothing.
4841 ;;
4842 ;; If it is more than 4096 bytes, we need to probe the stack
4843 ;; periodically.
4844 (define_expand "allocate_stack"
4845 [(set (reg:DI 30)
4846 (plus:DI (reg:DI 30)
4847 (match_operand:DI 1 "reg_or_cint_operand")))
4848 (set (match_operand:DI 0 "register_operand" "=r")
4849 (match_dup 2))]
4850 ""
4851 {
4852 if (CONST_INT_P (operands[1])
4853 && INTVAL (operands[1]) < 32768)
4854 {
4855 if (INTVAL (operands[1]) >= 4096)
4856 {
4857 /* We do this the same way as in the prologue and generate explicit
4858 probes. Then we update the stack by the constant. */
4859
4860 int probed = 4096;
4861
4862 emit_insn (gen_stack_probe_internal (GEN_INT (- probed)));
4863 while (probed + 8192 < INTVAL (operands[1]))
4864 emit_insn (gen_stack_probe_internal
4865 (GEN_INT (- (probed += 8192))));
4866
4867 if (probed + 4096 < INTVAL (operands[1]))
4868 emit_insn (gen_stack_probe_internal
4869 (GEN_INT (- INTVAL(operands[1]))));
4870 }
4871
4872 operands[1] = GEN_INT (- INTVAL (operands[1]));
4873 operands[2] = virtual_stack_dynamic_rtx;
4874 }
4875 else
4876 {
4877 rtx_code_label *out_label = 0;
4878 rtx_code_label *loop_label = gen_label_rtx ();
4879 rtx want = gen_reg_rtx (Pmode);
4880 rtx tmp = gen_reg_rtx (Pmode);
4881 rtx memref, test;
4882
4883 emit_insn (gen_subdi3 (want, stack_pointer_rtx,
4884 force_reg (Pmode, operands[1])));
4885
4886 if (!CONST_INT_P (operands[1]))
4887 {
4888 rtx limit = GEN_INT (4096);
4889 out_label = gen_label_rtx ();
4890 test = gen_rtx_LTU (VOIDmode, operands[1], limit);
4891 emit_jump_insn
4892 (gen_cbranchdi4 (test, operands[1], limit, out_label));
4893 }
4894
4895 emit_insn (gen_adddi3 (tmp, stack_pointer_rtx, GEN_INT (-4096)));
4896 emit_label (loop_label);
4897 memref = gen_rtx_MEM (DImode, tmp);
4898 MEM_VOLATILE_P (memref) = 1;
4899 emit_move_insn (memref, const0_rtx);
4900 emit_insn (gen_adddi3 (tmp, tmp, GEN_INT(-8192)));
4901 test = gen_rtx_GTU (VOIDmode, tmp, want);
4902 emit_jump_insn (gen_cbranchdi4 (test, tmp, want, loop_label));
4903
4904 memref = gen_rtx_MEM (DImode, want);
4905 MEM_VOLATILE_P (memref) = 1;
4906 emit_move_insn (memref, const0_rtx);
4907
4908 if (out_label)
4909 emit_label (out_label);
4910
4911 emit_move_insn (stack_pointer_rtx, want);
4912 emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
4913 DONE;
4914 }
4915 })
4916
4917 ;; This is used by alpha_expand_prolog to do the same thing as above,
4918 ;; except we cannot at that time generate new basic blocks, so we hide
4919 ;; the loop in this one insn.
4920
4921 (define_insn "prologue_stack_probe_loop"
4922 [(unspec_volatile [(match_operand:DI 0 "register_operand" "r")
4923 (match_operand:DI 1 "register_operand" "r")]
4924 UNSPECV_PSPL)]
4925 ""
4926 {
4927 operands[2] = gen_label_rtx ();
4928 (*targetm.asm_out.internal_label) (asm_out_file, "L",
4929 CODE_LABEL_NUMBER (operands[2]));
4930
4931 return "stq $31,-8192(%1)\;subq %0,1,%0\;lda %1,-8192(%1)\;bne %0,%l2";
4932 }
4933 [(set_attr "length" "16")
4934 (set_attr "type" "multi")])
4935
4936 (define_expand "prologue"
4937 [(const_int 0)]
4938 ""
4939 {
4940 alpha_expand_prologue ();
4941 DONE;
4942 })
4943
4944 ;; These take care of emitting the ldgp insn in the prologue. This will be
4945 ;; an lda/ldah pair and we want to align them properly. So we have two
4946 ;; unspec_volatile insns, the first of which emits the ldgp assembler macro
4947 ;; and the second of which emits nothing. However, both are marked as type
4948 ;; IADD (the default) so the alignment code in alpha.cc does the right thing
4949 ;; with them.
4950
4951 (define_expand "prologue_ldgp"
4952 [(set (match_dup 0)
4953 (unspec_volatile:DI [(match_dup 1) (match_dup 2)] UNSPECV_LDGP1))
4954 (set (match_dup 0)
4955 (unspec_volatile:DI [(match_dup 0) (match_dup 2)] UNSPECV_PLDGP2))]
4956 ""
4957 {
4958 operands[0] = pic_offset_table_rtx;
4959 operands[1] = gen_rtx_REG (Pmode, 27);
4960 operands[2] = (TARGET_EXPLICIT_RELOCS
4961 ? GEN_INT (alpha_next_sequence_number++)
4962 : const0_rtx);
4963 })
4964
4965 (define_insn "*ldgp_er_1"
4966 [(set (match_operand:DI 0 "register_operand" "=r")
4967 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
4968 (match_operand 2 "const_int_operand")]
4969 UNSPECV_LDGP1))]
4970 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4971 "ldah %0,0(%1)\t\t!gpdisp!%2"
4972 [(set_attr "cannot_copy" "true")])
4973
4974 (define_insn "*ldgp_er_2"
4975 [(set (match_operand:DI 0 "register_operand" "=r")
4976 (unspec:DI [(match_operand:DI 1 "register_operand" "r")
4977 (match_operand 2 "const_int_operand")]
4978 UNSPEC_LDGP2))]
4979 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4980 "lda %0,0(%1)\t\t!gpdisp!%2"
4981 [(set_attr "cannot_copy" "true")])
4982
4983 (define_insn "*prologue_ldgp_er_2"
4984 [(set (match_operand:DI 0 "register_operand" "=r")
4985 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
4986 (match_operand 2 "const_int_operand")]
4987 UNSPECV_PLDGP2))]
4988 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4989 "lda %0,0(%1)\t\t!gpdisp!%2\n$%~..ng:"
4990 [(set_attr "cannot_copy" "true")])
4991
4992 (define_insn "*prologue_ldgp_1"
4993 [(set (match_operand:DI 0 "register_operand" "=r")
4994 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
4995 (match_operand 2 "const_int_operand")]
4996 UNSPECV_LDGP1))]
4997 ""
4998 "ldgp %0,0(%1)\n$%~..ng:"
4999 [(set_attr "cannot_copy" "true")])
5000
5001 (define_insn "*prologue_ldgp_2"
5002 [(set (match_operand:DI 0 "register_operand" "=r")
5003 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
5004 (match_operand 2 "const_int_operand")]
5005 UNSPECV_PLDGP2))]
5006 ""
5007 )
5008
5009 ;; The _mcount profiling hook has special calling conventions, and
5010 ;; does not clobber all the registers that a normal call would. So
5011 ;; hide the fact this is a call at all.
5012
5013 (define_insn "prologue_mcount"
5014 [(unspec_volatile [(const_int 0)] UNSPECV_MCOUNT)]
5015 ""
5016 {
5017 if (TARGET_EXPLICIT_RELOCS)
5018 /* Note that we cannot use a lituse_jsr reloc, since _mcount
5019 cannot be called via the PLT. */
5020 return "ldq $28,_mcount($29)\t\t!literal\;jsr $28,($28),_mcount";
5021 else
5022 return "lda $28,_mcount\;jsr $28,($28),_mcount";
5023 }
5024 [(set_attr "type" "multi")
5025 (set_attr "length" "8")])
5026
5027 (define_insn "init_fp"
5028 [(set (match_operand:DI 0 "register_operand" "=r")
5029 (match_operand:DI 1 "register_operand" "r"))
5030 (clobber (mem:BLK (match_operand:DI 2 "register_operand" "=r")))]
5031 ""
5032 "bis $31,%1,%0")
5033
5034 (define_expand "epilogue"
5035 [(return)]
5036 ""
5037 "alpha_expand_epilogue ();")
5038
5039 (define_expand "sibcall_epilogue"
5040 [(return)]
5041 "TARGET_ABI_OSF"
5042 {
5043 alpha_expand_epilogue ();
5044 DONE;
5045 })
5046
5047 (define_expand "builtin_longjmp"
5048 [(use (match_operand:DI 0 "register_operand" "r"))]
5049 "TARGET_ABI_OSF"
5050 {
5051 /* The elements of the buffer are, in order: */
5052 rtx fp = gen_rtx_MEM (Pmode, operands[0]);
5053 rtx lab = gen_rtx_MEM (Pmode, plus_constant (Pmode, operands[0], 8));
5054 rtx stack = gen_rtx_MEM (Pmode, plus_constant (Pmode, operands[0], 16));
5055 rtx pv = gen_rtx_REG (Pmode, 27);
5056
5057 /* This bit is the same as expand_builtin_longjmp. */
5058 emit_move_insn (hard_frame_pointer_rtx, fp);
5059 emit_move_insn (pv, lab);
5060 emit_stack_restore (SAVE_NONLOCAL, stack);
5061 emit_use (hard_frame_pointer_rtx);
5062 emit_use (stack_pointer_rtx);
5063
5064 /* Load the label we are jumping through into $27 so that we know
5065 where to look for it when we get back to setjmp's function for
5066 restoring the gp. */
5067 emit_jump_insn (gen_builtin_longjmp_internal (pv));
5068 emit_barrier ();
5069 DONE;
5070 })
5071
5072 ;; This is effectively a copy of indirect_jump, but constrained such
5073 ;; that register renaming cannot foil our cunning plan with $27.
5074 (define_insn "builtin_longjmp_internal"
5075 [(set (pc)
5076 (unspec_volatile [(match_operand:DI 0 "register_operand" "c")]
5077 UNSPECV_LONGJMP))]
5078 ""
5079 "jmp $31,(%0),0"
5080 [(set_attr "type" "ibr")])
5081
5082 (define_expand "builtin_setjmp_receiver"
5083 [(unspec_volatile [(label_ref (match_operand 0))] UNSPECV_SETJMPR)]
5084 "TARGET_ABI_OSF")
5085
5086 (define_insn_and_split "*builtin_setjmp_receiver_1"
5087 [(unspec_volatile [(match_operand 0)] UNSPECV_SETJMPR)]
5088 "TARGET_ABI_OSF"
5089 {
5090 if (TARGET_EXPLICIT_RELOCS)
5091 return "#";
5092 else
5093 return "br $27,$LSJ%=\n$LSJ%=:\;ldgp $29,0($27)";
5094 }
5095 "&& TARGET_EXPLICIT_RELOCS && reload_completed"
5096 [(set (match_dup 1)
5097 (unspec_volatile:DI [(match_dup 2) (match_dup 3)] UNSPECV_LDGP1))
5098 (set (match_dup 1)
5099 (unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_LDGP2))]
5100 {
5101 if (prev_nonnote_insn (curr_insn) != XEXP (operands[0], 0))
5102 emit_insn (gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, operands[0]),
5103 UNSPECV_SETJMPR_ER));
5104 operands[1] = pic_offset_table_rtx;
5105 operands[2] = gen_rtx_REG (Pmode, 27);
5106 operands[3] = GEN_INT (alpha_next_sequence_number++);
5107 }
5108 [(set_attr "length" "12")
5109 (set_attr "type" "multi")])
5110
5111 (define_insn "*builtin_setjmp_receiver_er_sl_1"
5112 [(unspec_volatile [(match_operand 0)] UNSPECV_SETJMPR_ER)]
5113 "TARGET_ABI_OSF && TARGET_EXPLICIT_RELOCS"
5114 "lda $27,$LSJ%=-%l0($27)\n$LSJ%=:")
5115
5116 ;; When flag_reorder_blocks_and_partition is in effect, compiler puts
5117 ;; exception landing pads in a cold section. To prevent inter-section offset
5118 ;; calculation, a jump to original landing pad is emitted in the place of the
5119 ;; original landing pad. Since landing pad is moved, RA-relative GP
5120 ;; calculation in the prologue of landing pad breaks. To solve this problem,
5121 ;; we use alternative GP load approach.
5122
5123 (define_expand "exception_receiver"
5124 [(unspec_volatile [(match_dup 0)] UNSPECV_EHR)]
5125 "TARGET_ABI_OSF"
5126 {
5127 if (flag_reorder_blocks_and_partition)
5128 operands[0] = copy_rtx (alpha_gp_save_rtx ());
5129 else
5130 operands[0] = const0_rtx;
5131 })
5132
5133 (define_insn "*exception_receiver_2"
5134 [(unspec_volatile [(match_operand:DI 0 "memory_operand" "m")] UNSPECV_EHR)]
5135 "TARGET_ABI_OSF && flag_reorder_blocks_and_partition"
5136 "ldq $29,%0"
5137 [(set_attr "type" "ild")])
5138
5139 (define_insn_and_split "*exception_receiver_1"
5140 [(unspec_volatile [(const_int 0)] UNSPECV_EHR)]
5141 "TARGET_ABI_OSF"
5142 {
5143 if (TARGET_EXPLICIT_RELOCS)
5144 return "#";
5145 else
5146 return "ldgp $29,0($26)";
5147 }
5148 "&& TARGET_EXPLICIT_RELOCS && reload_completed"
5149 [(set (match_dup 0)
5150 (unspec_volatile:DI [(match_dup 1) (match_dup 2)] UNSPECV_LDGP1))
5151 (set (match_dup 0)
5152 (unspec:DI [(match_dup 0) (match_dup 2)] UNSPEC_LDGP2))]
5153 {
5154 operands[0] = pic_offset_table_rtx;
5155 operands[1] = gen_rtx_REG (Pmode, 26);
5156 operands[2] = GEN_INT (alpha_next_sequence_number++);
5157 }
5158 [(set_attr "length" "8")
5159 (set_attr "type" "multi")])
5160
5161 (define_expand "nonlocal_goto_receiver"
5162 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
5163 (set (reg:DI 27) (mem:DI (reg:DI 29)))
5164 (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
5165 (use (reg:DI 27))]
5166 "TARGET_ABI_OPEN_VMS")
5167
5168 (define_insn "arg_home"
5169 [(unspec [(const_int 0)] UNSPEC_ARG_HOME)
5170 (use (reg:DI 1))
5171 (use (reg:DI 25))
5172 (use (reg:DI 16))
5173 (use (reg:DI 17))
5174 (use (reg:DI 18))
5175 (use (reg:DI 19))
5176 (use (reg:DI 20))
5177 (use (reg:DI 21))
5178 (use (reg:DI 48))
5179 (use (reg:DI 49))
5180 (use (reg:DI 50))
5181 (use (reg:DI 51))
5182 (use (reg:DI 52))
5183 (use (reg:DI 53))
5184 (clobber (mem:BLK (const_int 0)))
5185 (clobber (reg:DI 24))
5186 (clobber (reg:DI 25))
5187 (clobber (reg:DI 0))]
5188 "TARGET_ABI_OPEN_VMS"
5189 "lda $0,OTS$HOME_ARGS\;ldq $0,8($0)\;jsr $0,OTS$HOME_ARGS"
5190 [(set_attr "length" "16")
5191 (set_attr "type" "multi")])
5192
5193 ;; Prefetch data.
5194 ;;
5195 ;; On EV4, these instructions are nops -- no load occurs.
5196 ;;
5197 ;; On EV5, these instructions act as a normal load, and thus can trap
5198 ;; if the address is invalid. The OS may (or may not) handle this in
5199 ;; the entMM fault handler and suppress the fault. If so, then this
5200 ;; has the effect of a read prefetch instruction.
5201 ;;
5202 ;; On EV6, these become official prefetch instructions.
5203
5204 (define_insn "prefetch"
5205 [(prefetch (match_operand:DI 0 "address_operand" "p")
5206 (match_operand:DI 1 "const_int_operand" "n")
5207 (match_operand:DI 2 "const_int_operand" "n"))]
5208 "TARGET_FIXUP_EV5_PREFETCH || alpha_cpu == PROCESSOR_EV6"
5209 {
5210 /* Interpret "no temporal locality" as this data should be evicted once
5211 it is used. The "evict next" alternatives load the data into the cache
5212 and leave the LRU eviction counter pointing to that block. */
5213 static const char * const alt[2][2] = {
5214 {
5215 "ldq $31,%a0", /* read, evict next */
5216 "ldl $31,%a0", /* read, evict last */
5217 },
5218 {
5219 "ldt $f31,%a0", /* write, evict next */
5220 "lds $f31,%a0", /* write, evict last */
5221 }
5222 };
5223
5224 bool write = INTVAL (operands[1]) != 0;
5225 bool lru = INTVAL (operands[2]) != 0;
5226
5227 return alt[write][lru];
5228 }
5229 [(set_attr "type" "ild")])
5230
5231 ;; Close the trap shadow of preceding instructions. This is generated
5232 ;; by alpha_reorg.
5233
5234 (define_insn "trapb"
5235 [(unspec_volatile [(const_int 0)] UNSPECV_TRAPB)]
5236 ""
5237 "trapb"
5238 [(set_attr "type" "misc")])
5239
5240 ;; No-op instructions used by machine-dependent reorg to preserve
5241 ;; alignment for instruction issue.
5242 ;; The Unicos/Mk assembler does not support these opcodes.
5243
5244 (define_insn "nop"
5245 [(const_int 0)]
5246 ""
5247 "bis $31,$31,$31"
5248 [(set_attr "type" "ilog")])
5249
5250 (define_insn "fnop"
5251 [(const_int 1)]
5252 "TARGET_FP"
5253 "cpys $f31,$f31,$f31"
5254 [(set_attr "type" "fcpys")])
5255
5256 (define_insn "unop"
5257 [(const_int 2)]
5258 ""
5259 "ldq_u $31,0($30)")
5260
5261 (define_insn "realign"
5262 [(unspec_volatile [(match_operand 0 "immediate_operand" "i")]
5263 UNSPECV_REALIGN)]
5264 ""
5265 ".align %0 #realign")
5266
5268 ;; Instructions to be emitted from __builtins.
5269
5270 (define_insn "builtin_cmpbge"
5271 [(set (match_operand:DI 0 "register_operand" "=r")
5272 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rJ")
5273 (match_operand:DI 2 "reg_or_8bit_operand" "rI")]
5274 UNSPEC_CMPBGE))]
5275 ""
5276 "cmpbge %r1,%2,%0"
5277 ;; The EV6 data sheets list this as ILOG. OTOH, EV6 doesn't
5278 ;; actually differentiate between ILOG and ICMP in the schedule.
5279 [(set_attr "type" "icmp")])
5280
5281 (define_expand "extbl"
5282 [(match_operand:DI 0 "register_operand")
5283 (match_operand:DI 1 "reg_or_0_operand")
5284 (match_operand:DI 2 "reg_or_8bit_operand")]
5285 ""
5286 {
5287 emit_insn (gen_extxl (operands[0], operands[1], GEN_INT (8), operands[2]));
5288 DONE;
5289 })
5290
5291 (define_expand "extwl"
5292 [(match_operand:DI 0 "register_operand")
5293 (match_operand:DI 1 "reg_or_0_operand")
5294 (match_operand:DI 2 "reg_or_8bit_operand")]
5295 ""
5296 {
5297 emit_insn (gen_extxl (operands[0], operands[1], GEN_INT (16), operands[2]));
5298 DONE;
5299 })
5300
5301 (define_expand "extll"
5302 [(match_operand:DI 0 "register_operand")
5303 (match_operand:DI 1 "reg_or_0_operand")
5304 (match_operand:DI 2 "reg_or_8bit_operand")]
5305 ""
5306 {
5307 emit_insn (gen_extxl (operands[0], operands[1], GEN_INT (32), operands[2]));
5308 DONE;
5309 })
5310
5311 (define_expand "extql"
5312 [(match_operand:DI 0 "register_operand")
5313 (match_operand:DI 1 "reg_or_0_operand")
5314 (match_operand:DI 2 "reg_or_8bit_operand")]
5315 ""
5316 {
5317 emit_insn (gen_extxl (operands[0], operands[1], GEN_INT (64), operands[2]));
5318 DONE;
5319 })
5320
5321 (define_expand "builtin_insbl"
5322 [(match_operand:DI 0 "register_operand")
5323 (match_operand:DI 1 "register_operand")
5324 (match_operand:DI 2 "reg_or_8bit_operand")]
5325 ""
5326 {
5327 operands[1] = gen_lowpart (QImode, operands[1]);
5328 emit_insn (gen_insbl (operands[0], operands[1], operands[2]));
5329 DONE;
5330 })
5331
5332 (define_expand "builtin_inswl"
5333 [(match_operand:DI 0 "register_operand")
5334 (match_operand:DI 1 "register_operand")
5335 (match_operand:DI 2 "reg_or_8bit_operand")]
5336 ""
5337 {
5338 operands[1] = gen_lowpart (HImode, operands[1]);
5339 emit_insn (gen_inswl (operands[0], operands[1], operands[2]));
5340 DONE;
5341 })
5342
5343 (define_expand "builtin_insll"
5344 [(match_operand:DI 0 "register_operand")
5345 (match_operand:DI 1 "register_operand")
5346 (match_operand:DI 2 "reg_or_8bit_operand")]
5347 ""
5348 {
5349 operands[1] = gen_lowpart (SImode, operands[1]);
5350 emit_insn (gen_insll (operands[0], operands[1], operands[2]));
5351 DONE;
5352 })
5353
5354 (define_expand "inswh"
5355 [(match_operand:DI 0 "register_operand")
5356 (match_operand:DI 1 "register_operand")
5357 (match_operand:DI 2 "reg_or_8bit_operand")]
5358 ""
5359 {
5360 emit_insn (gen_insxh (operands[0], operands[1], GEN_INT (16), operands[2]));
5361 DONE;
5362 })
5363
5364 (define_expand "inslh"
5365 [(match_operand:DI 0 "register_operand")
5366 (match_operand:DI 1 "register_operand")
5367 (match_operand:DI 2 "reg_or_8bit_operand")]
5368 ""
5369 {
5370 emit_insn (gen_insxh (operands[0], operands[1], GEN_INT (32), operands[2]));
5371 DONE;
5372 })
5373
5374 (define_expand "insqh"
5375 [(match_operand:DI 0 "register_operand")
5376 (match_operand:DI 1 "register_operand")
5377 (match_operand:DI 2 "reg_or_8bit_operand")]
5378 ""
5379 {
5380 emit_insn (gen_insxh (operands[0], operands[1], GEN_INT (64), operands[2]));
5381 DONE;
5382 })
5383
5384 (define_expand "mskbl"
5385 [(match_operand:DI 0 "register_operand")
5386 (match_operand:DI 1 "reg_or_0_operand")
5387 (match_operand:DI 2 "reg_or_8bit_operand")]
5388 ""
5389 {
5390 rtx mask = GEN_INT (0xff);
5391 emit_insn (gen_mskxl (operands[0], operands[1], mask, operands[2]));
5392 DONE;
5393 })
5394
5395 (define_expand "mskwl"
5396 [(match_operand:DI 0 "register_operand")
5397 (match_operand:DI 1 "reg_or_0_operand")
5398 (match_operand:DI 2 "reg_or_8bit_operand")]
5399 ""
5400 {
5401 rtx mask = GEN_INT (0xffff);
5402 emit_insn (gen_mskxl (operands[0], operands[1], mask, operands[2]));
5403 DONE;
5404 })
5405
5406 (define_expand "mskll"
5407 [(match_operand:DI 0 "register_operand")
5408 (match_operand:DI 1 "reg_or_0_operand")
5409 (match_operand:DI 2 "reg_or_8bit_operand")]
5410 ""
5411 {
5412 rtx mask = gen_int_mode (0xffffffff, DImode);
5413 emit_insn (gen_mskxl (operands[0], operands[1], mask, operands[2]));
5414 DONE;
5415 })
5416
5417 (define_expand "mskql"
5418 [(match_operand:DI 0 "register_operand")
5419 (match_operand:DI 1 "reg_or_0_operand")
5420 (match_operand:DI 2 "reg_or_8bit_operand")]
5421 ""
5422 {
5423 rtx mask = constm1_rtx;
5424 emit_insn (gen_mskxl (operands[0], operands[1], mask, operands[2]));
5425 DONE;
5426 })
5427
5428 (define_expand "mskwh"
5429 [(match_operand:DI 0 "register_operand")
5430 (match_operand:DI 1 "register_operand")
5431 (match_operand:DI 2 "reg_or_8bit_operand")]
5432 ""
5433 {
5434 emit_insn (gen_mskxh (operands[0], operands[1], GEN_INT (16), operands[2]));
5435 DONE;
5436 })
5437
5438 (define_expand "msklh"
5439 [(match_operand:DI 0 "register_operand")
5440 (match_operand:DI 1 "register_operand")
5441 (match_operand:DI 2 "reg_or_8bit_operand")]
5442 ""
5443 {
5444 emit_insn (gen_mskxh (operands[0], operands[1], GEN_INT (32), operands[2]));
5445 DONE;
5446 })
5447
5448 (define_expand "mskqh"
5449 [(match_operand:DI 0 "register_operand")
5450 (match_operand:DI 1 "register_operand")
5451 (match_operand:DI 2 "reg_or_8bit_operand")]
5452 ""
5453 {
5454 emit_insn (gen_mskxh (operands[0], operands[1], GEN_INT (64), operands[2]));
5455 DONE;
5456 })
5457
5458 (define_expand "builtin_zap"
5459 [(set (match_operand:DI 0 "register_operand")
5460 (and:DI (unspec:DI
5461 [(match_operand:DI 2 "reg_or_cint_operand")]
5462 UNSPEC_ZAP)
5463 (match_operand:DI 1 "reg_or_cint_operand")))]
5464 ""
5465 {
5466 if (CONST_INT_P (operands[2]))
5467 {
5468 rtx mask = alpha_expand_zap_mask (INTVAL (operands[2]));
5469
5470 if (mask == const0_rtx)
5471 {
5472 emit_move_insn (operands[0], const0_rtx);
5473 DONE;
5474 }
5475 if (mask == constm1_rtx)
5476 {
5477 emit_move_insn (operands[0], operands[1]);
5478 DONE;
5479 }
5480
5481 operands[1] = force_reg (DImode, operands[1]);
5482 emit_insn (gen_anddi3 (operands[0], operands[1], mask));
5483 DONE;
5484 }
5485
5486 operands[1] = force_reg (DImode, operands[1]);
5487 operands[2] = gen_lowpart (QImode, operands[2]);
5488 })
5489
5490 (define_insn "*builtin_zap_1"
5491 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
5492 (and:DI (unspec:DI
5493 [(match_operand:QI 2 "reg_or_cint_operand" "n,n,r,r")]
5494 UNSPEC_ZAP)
5495 (match_operand:DI 1 "reg_or_cint_operand" "n,r,J,r")))]
5496 ""
5497 "@
5498 #
5499 #
5500 bis $31,$31,%0
5501 zap %r1,%2,%0"
5502 [(set_attr "type" "shift,shift,ilog,shift")])
5503
5504 (define_split
5505 [(set (match_operand:DI 0 "register_operand")
5506 (and:DI (unspec:DI
5507 [(match_operand:QI 2 "const_int_operand")]
5508 UNSPEC_ZAP)
5509 (match_operand:DI 1 "const_int_operand")))]
5510 ""
5511 [(const_int 0)]
5512 {
5513 rtx mask = alpha_expand_zap_mask (INTVAL (operands[2]));
5514
5515 operands[1] = gen_int_mode (INTVAL (operands[1]) & INTVAL (mask), DImode);
5516 emit_move_insn (operands[0], operands[1]);
5517 DONE;
5518 })
5519
5520 (define_split
5521 [(set (match_operand:DI 0 "register_operand")
5522 (and:DI (unspec:DI
5523 [(match_operand:QI 2 "const_int_operand")]
5524 UNSPEC_ZAP)
5525 (match_operand:DI 1 "register_operand")))]
5526 ""
5527 [(set (match_dup 0)
5528 (and:DI (match_dup 1) (match_dup 2)))]
5529 {
5530 operands[2] = alpha_expand_zap_mask (INTVAL (operands[2]));
5531 if (operands[2] == const0_rtx)
5532 {
5533 emit_move_insn (operands[0], const0_rtx);
5534 DONE;
5535 }
5536 if (operands[2] == constm1_rtx)
5537 {
5538 emit_move_insn (operands[0], operands[1]);
5539 DONE;
5540 }
5541 })
5542
5543 (define_expand "builtin_zapnot"
5544 [(set (match_operand:DI 0 "register_operand")
5545 (and:DI (unspec:DI
5546 [(not:QI (match_operand:DI 2 "reg_or_cint_operand"))]
5547 UNSPEC_ZAP)
5548 (match_operand:DI 1 "reg_or_cint_operand")))]
5549 ""
5550 {
5551 if (CONST_INT_P (operands[2]))
5552 {
5553 rtx mask = alpha_expand_zap_mask (~ INTVAL (operands[2]));
5554
5555 if (mask == const0_rtx)
5556 {
5557 emit_move_insn (operands[0], const0_rtx);
5558 DONE;
5559 }
5560 if (mask == constm1_rtx)
5561 {
5562 emit_move_insn (operands[0], operands[1]);
5563 DONE;
5564 }
5565
5566 operands[1] = force_reg (DImode, operands[1]);
5567 emit_insn (gen_anddi3 (operands[0], operands[1], mask));
5568 DONE;
5569 }
5570
5571 operands[1] = force_reg (DImode, operands[1]);
5572 operands[2] = gen_lowpart (QImode, operands[2]);
5573 })
5574
5575 (define_insn "*builtin_zapnot_1"
5576 [(set (match_operand:DI 0 "register_operand" "=r")
5577 (and:DI (unspec:DI
5578 [(not:QI (match_operand:QI 2 "register_operand" "r"))]
5579 UNSPEC_ZAP)
5580 (match_operand:DI 1 "reg_or_0_operand" "rJ")))]
5581 ""
5582 "zapnot %r1,%2,%0"
5583 [(set_attr "type" "shift")])
5584
5585 (define_insn "builtin_amask"
5586 [(set (match_operand:DI 0 "register_operand" "=r")
5587 (unspec:DI [(match_operand:DI 1 "reg_or_8bit_operand" "rI")]
5588 UNSPEC_AMASK))]
5589 ""
5590 "amask %1,%0"
5591 [(set_attr "type" "ilog")])
5592
5593 (define_insn "builtin_implver"
5594 [(set (match_operand:DI 0 "register_operand" "=r")
5595 (unspec:DI [(const_int 0)] UNSPEC_IMPLVER))]
5596 ""
5597 "implver %0"
5598 [(set_attr "type" "ilog")])
5599
5600 (define_insn "builtin_rpcc"
5601 [(set (match_operand:DI 0 "register_operand" "=r")
5602 (unspec_volatile:DI [(const_int 0)] UNSPECV_RPCC))]
5603 ""
5604 "rpcc %0"
5605 [(set_attr "type" "ilog")])
5606
5607 (define_expand "builtin_minub8"
5608 [(match_operand:DI 0 "register_operand")
5609 (match_operand:DI 1 "reg_or_0_operand")
5610 (match_operand:DI 2 "reg_or_0_operand")]
5611 "TARGET_MAX"
5612 {
5613 alpha_expand_builtin_vector_binop (gen_uminv8qi3, V8QImode, operands[0],
5614 operands[1], operands[2]);
5615 DONE;
5616 })
5617
5618 (define_expand "builtin_minsb8"
5619 [(match_operand:DI 0 "register_operand")
5620 (match_operand:DI 1 "reg_or_0_operand")
5621 (match_operand:DI 2 "reg_or_0_operand")]
5622 "TARGET_MAX"
5623 {
5624 alpha_expand_builtin_vector_binop (gen_sminv8qi3, V8QImode, operands[0],
5625 operands[1], operands[2]);
5626 DONE;
5627 })
5628
5629 (define_expand "builtin_minuw4"
5630 [(match_operand:DI 0 "register_operand")
5631 (match_operand:DI 1 "reg_or_0_operand")
5632 (match_operand:DI 2 "reg_or_0_operand")]
5633 "TARGET_MAX"
5634 {
5635 alpha_expand_builtin_vector_binop (gen_uminv4hi3, V4HImode, operands[0],
5636 operands[1], operands[2]);
5637 DONE;
5638 })
5639
5640 (define_expand "builtin_minsw4"
5641 [(match_operand:DI 0 "register_operand")
5642 (match_operand:DI 1 "reg_or_0_operand")
5643 (match_operand:DI 2 "reg_or_0_operand")]
5644 "TARGET_MAX"
5645 {
5646 alpha_expand_builtin_vector_binop (gen_sminv4hi3, V4HImode, operands[0],
5647 operands[1], operands[2]);
5648 DONE;
5649 })
5650
5651 (define_expand "builtin_maxub8"
5652 [(match_operand:DI 0 "register_operand")
5653 (match_operand:DI 1 "reg_or_0_operand")
5654 (match_operand:DI 2 "reg_or_0_operand")]
5655 "TARGET_MAX"
5656 {
5657 alpha_expand_builtin_vector_binop (gen_umaxv8qi3, V8QImode, operands[0],
5658 operands[1], operands[2]);
5659 DONE;
5660 })
5661
5662 (define_expand "builtin_maxsb8"
5663 [(match_operand:DI 0 "register_operand")
5664 (match_operand:DI 1 "reg_or_0_operand")
5665 (match_operand:DI 2 "reg_or_0_operand")]
5666 "TARGET_MAX"
5667 {
5668 alpha_expand_builtin_vector_binop (gen_smaxv8qi3, V8QImode, operands[0],
5669 operands[1], operands[2]);
5670 DONE;
5671 })
5672
5673 (define_expand "builtin_maxuw4"
5674 [(match_operand:DI 0 "register_operand")
5675 (match_operand:DI 1 "reg_or_0_operand")
5676 (match_operand:DI 2 "reg_or_0_operand")]
5677 "TARGET_MAX"
5678 {
5679 alpha_expand_builtin_vector_binop (gen_umaxv4hi3, V4HImode, operands[0],
5680 operands[1], operands[2]);
5681 DONE;
5682 })
5683
5684 (define_expand "builtin_maxsw4"
5685 [(match_operand:DI 0 "register_operand")
5686 (match_operand:DI 1 "reg_or_0_operand")
5687 (match_operand:DI 2 "reg_or_0_operand")]
5688 "TARGET_MAX"
5689 {
5690 alpha_expand_builtin_vector_binop (gen_smaxv4hi3, V4HImode, operands[0],
5691 operands[1], operands[2]);
5692 DONE;
5693 })
5694
5695 (define_insn "builtin_perr"
5696 [(set (match_operand:DI 0 "register_operand" "=r")
5697 (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "%rJ")
5698 (match_operand:DI 2 "reg_or_8bit_operand" "rJ")]
5699 UNSPEC_PERR))]
5700 "TARGET_MAX"
5701 "perr %r1,%r2,%0"
5702 [(set_attr "type" "mvi")])
5703
5704 (define_expand "builtin_pklb"
5705 [(set (match_operand:DI 0 "register_operand")
5706 (vec_concat:V8QI
5707 (vec_concat:V4QI
5708 (truncate:V2QI (match_operand:DI 1 "register_operand"))
5709 (match_dup 2))
5710 (match_dup 3)))]
5711 "TARGET_MAX"
5712 {
5713 operands[0] = gen_lowpart (V8QImode, operands[0]);
5714 operands[1] = gen_lowpart (V2SImode, operands[1]);
5715 operands[2] = CONST0_RTX (V2QImode);
5716 operands[3] = CONST0_RTX (V4QImode);
5717 })
5718
5719 (define_insn "*pklb"
5720 [(set (match_operand:V8QI 0 "register_operand" "=r")
5721 (vec_concat:V8QI
5722 (vec_concat:V4QI
5723 (truncate:V2QI (match_operand:V2SI 1 "register_operand" "r"))
5724 (match_operand:V2QI 2 "const0_operand"))
5725 (match_operand:V4QI 3 "const0_operand")))]
5726 "TARGET_MAX"
5727 "pklb %r1,%0"
5728 [(set_attr "type" "mvi")])
5729
5730 (define_expand "builtin_pkwb"
5731 [(set (match_operand:DI 0 "register_operand")
5732 (vec_concat:V8QI
5733 (truncate:V4QI (match_operand:DI 1 "register_operand"))
5734 (match_dup 2)))]
5735 "TARGET_MAX"
5736 {
5737 operands[0] = gen_lowpart (V8QImode, operands[0]);
5738 operands[1] = gen_lowpart (V4HImode, operands[1]);
5739 operands[2] = CONST0_RTX (V4QImode);
5740 })
5741
5742 (define_insn "*pkwb"
5743 [(set (match_operand:V8QI 0 "register_operand" "=r")
5744 (vec_concat:V8QI
5745 (truncate:V4QI (match_operand:V4HI 1 "register_operand" "r"))
5746 (match_operand:V4QI 2 "const0_operand")))]
5747 "TARGET_MAX"
5748 "pkwb %r1,%0"
5749 [(set_attr "type" "mvi")])
5750
5751 (define_expand "builtin_unpkbl"
5752 [(set (match_operand:DI 0 "register_operand")
5753 (zero_extend:V2SI
5754 (vec_select:V2QI (match_operand:DI 1 "register_operand")
5755 (parallel [(const_int 0) (const_int 1)]))))]
5756 "TARGET_MAX"
5757 {
5758 operands[0] = gen_lowpart (V2SImode, operands[0]);
5759 operands[1] = gen_lowpart (V8QImode, operands[1]);
5760 })
5761
5762 (define_insn "*unpkbl"
5763 [(set (match_operand:V2SI 0 "register_operand" "=r")
5764 (zero_extend:V2SI
5765 (vec_select:V2QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
5766 (parallel [(const_int 0) (const_int 1)]))))]
5767 "TARGET_MAX"
5768 "unpkbl %r1,%0"
5769 [(set_attr "type" "mvi")])
5770
5771 (define_expand "builtin_unpkbw"
5772 [(set (match_operand:DI 0 "register_operand")
5773 (zero_extend:V4HI
5774 (vec_select:V4QI (match_operand:DI 1 "register_operand")
5775 (parallel [(const_int 0)
5776 (const_int 1)
5777 (const_int 2)
5778 (const_int 3)]))))]
5779 "TARGET_MAX"
5780 {
5781 operands[0] = gen_lowpart (V4HImode, operands[0]);
5782 operands[1] = gen_lowpart (V8QImode, operands[1]);
5783 })
5784
5785 (define_insn "*unpkbw"
5786 [(set (match_operand:V4HI 0 "register_operand" "=r")
5787 (zero_extend:V4HI
5788 (vec_select:V4QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
5789 (parallel [(const_int 0)
5790 (const_int 1)
5791 (const_int 2)
5792 (const_int 3)]))))]
5793 "TARGET_MAX"
5794 "unpkbw %r1,%0"
5795 [(set_attr "type" "mvi")])
5796
5798 (include "sync.md")
5799
5801 ;; The call patterns are at the end of the file because their
5802 ;; wildcard operand0 interferes with nice recognition.
5803
5804 (define_insn "*call_value_osf_1_er_noreturn"
5805 [(set (match_operand 0)
5806 (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
5807 (match_operand 2)))
5808 (use (reg:DI 29))
5809 (clobber (reg:DI 26))]
5810 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
5811 && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
5812 "@
5813 jsr $26,($27),0
5814 bsr $26,%1\t\t!samegp
5815 ldq $27,%1($29)\t\t!literal!%#\;jsr $26,($27),%1\t\t!lituse_jsr!%#"
5816 [(set_attr "type" "jsr")
5817 (set_attr "length" "*,*,8")])
5818
5819 (define_insn "*call_value_osf_1_er"
5820 [(set (match_operand 0)
5821 (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
5822 (match_operand 2)))
5823 (use (reg:DI 29))
5824 (clobber (reg:DI 26))]
5825 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
5826 "@
5827 jsr $26,(%1),0\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*
5828 bsr $26,%1\t\t!samegp
5829 ldq $27,%1($29)\t\t!literal!%#\;jsr $26,($27),0\t\t!lituse_jsr!%#\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*"
5830 [(set_attr "type" "jsr")
5831 (set_attr "length" "12,*,16")])
5832
5833 ;; We must use peep2 instead of a split because we need accurate life
5834 ;; information for $gp. Consider the case of { bar(); while (1); }.
5835 (define_peephole2
5836 [(parallel [(set (match_operand 0)
5837 (call (mem:DI (match_operand:DI 1 "call_operand"))
5838 (match_operand 2)))
5839 (use (reg:DI 29))
5840 (clobber (reg:DI 26))])]
5841 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
5842 && ! samegp_function_operand (operands[1], Pmode)
5843 && (peep2_regno_dead_p (1, 29)
5844 || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
5845 [(parallel [(set (match_dup 0)
5846 (call (mem:DI (match_dup 3))
5847 (match_dup 2)))
5848 (use (reg:DI 29))
5849 (use (match_dup 1))
5850 (use (match_dup 4))
5851 (clobber (reg:DI 26))])]
5852 {
5853 if (CONSTANT_P (operands[1]))
5854 {
5855 operands[3] = gen_rtx_REG (Pmode, 27);
5856 operands[4] = GEN_INT (alpha_next_sequence_number++);
5857 emit_insn (gen_movdi_er_high_g (operands[3], pic_offset_table_rtx,
5858 operands[1], operands[4]));
5859 }
5860 else
5861 {
5862 operands[3] = operands[1];
5863 operands[1] = const0_rtx;
5864 operands[4] = const0_rtx;
5865 }
5866 })
5867
5868 (define_peephole2
5869 [(parallel [(set (match_operand 0)
5870 (call (mem:DI (match_operand:DI 1 "call_operand"))
5871 (match_operand 2)))
5872 (use (reg:DI 29))
5873 (clobber (reg:DI 26))])]
5874 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
5875 && ! samegp_function_operand (operands[1], Pmode)
5876 && ! (peep2_regno_dead_p (1, 29)
5877 || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
5878 [(parallel [(set (match_dup 0)
5879 (call (mem:DI (match_dup 3))
5880 (match_dup 2)))
5881 (set (match_dup 6)
5882 (unspec:DI [(match_dup 6) (match_dup 4)] UNSPEC_LDGP1))
5883 (use (match_dup 1))
5884 (use (match_dup 5))
5885 (clobber (reg:DI 26))])
5886 (set (match_dup 6)
5887 (unspec:DI [(match_dup 6) (match_dup 4)] UNSPEC_LDGP2))]
5888 {
5889 if (CONSTANT_P (operands[1]))
5890 {
5891 operands[3] = gen_rtx_REG (Pmode, 27);
5892 operands[5] = GEN_INT (alpha_next_sequence_number++);
5893 emit_insn (gen_movdi_er_high_g (operands[3], pic_offset_table_rtx,
5894 operands[1], operands[5]));
5895 }
5896 else
5897 {
5898 operands[3] = operands[1];
5899 operands[1] = const0_rtx;
5900 operands[5] = const0_rtx;
5901 }
5902 operands[4] = GEN_INT (alpha_next_sequence_number++);
5903 operands[6] = pic_offset_table_rtx;
5904 })
5905
5906 (define_insn "*call_value_osf_2_er_nogp"
5907 [(set (match_operand 0)
5908 (call (mem:DI (match_operand:DI 1 "register_operand" "c"))
5909 (match_operand 2)))
5910 (use (reg:DI 29))
5911 (use (match_operand 3))
5912 (use (match_operand 4))
5913 (clobber (reg:DI 26))]
5914 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
5915 "jsr $26,(%1),%3%J4"
5916 [(set_attr "type" "jsr")])
5917
5918 (define_insn "*call_value_osf_2_er"
5919 [(set (match_operand 0)
5920 (call (mem:DI (match_operand:DI 1 "register_operand" "c"))
5921 (match_operand 2)))
5922 (set (reg:DI 29)
5923 (unspec:DI [(reg:DI 29) (match_operand 5 "const_int_operand")]
5924 UNSPEC_LDGP1))
5925 (use (match_operand 3))
5926 (use (match_operand 4))
5927 (clobber (reg:DI 26))]
5928 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
5929 "jsr $26,(%1),%3%J4\;ldah $29,0($26)\t\t!gpdisp!%5"
5930 [(set_attr "type" "jsr")
5931 (set_attr "cannot_copy" "true")
5932 (set_attr "length" "8")])
5933
5934 (define_insn "*call_value_osf_1_noreturn"
5935 [(set (match_operand 0)
5936 (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
5937 (match_operand 2)))
5938 (use (reg:DI 29))
5939 (clobber (reg:DI 26))]
5940 "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
5941 && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
5942 "@
5943 jsr $26,($27),0
5944 bsr $26,$%1..ng
5945 jsr $26,%1"
5946 [(set_attr "type" "jsr")
5947 (set_attr "length" "*,*,8")])
5948
5949 (define_int_iterator TLS_CALL
5950 [UNSPEC_TLSGD_CALL
5951 UNSPEC_TLSLDM_CALL])
5952
5953 (define_int_attr tls
5954 [(UNSPEC_TLSGD_CALL "tlsgd")
5955 (UNSPEC_TLSLDM_CALL "tlsldm")])
5956
5957 (define_insn "call_value_osf_<tls>"
5958 [(set (match_operand 0)
5959 (call (mem:DI (match_operand:DI 1 "symbolic_operand"))
5960 (const_int 0)))
5961 (unspec [(match_operand:DI 2 "const_int_operand")] TLS_CALL)
5962 (use (reg:DI 29))
5963 (clobber (reg:DI 26))]
5964 "HAVE_AS_TLS"
5965 "ldq $27,%1($29)\t\t!literal!%2\;jsr $26,($27),%1\t\t!lituse_<tls>!%2\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*"
5966 [(set_attr "type" "jsr")
5967 (set_attr "cannot_copy" "true")
5968 (set_attr "length" "16")])
5969
5970 ;; We must use peep2 instead of a split because we need accurate life
5971 ;; information for $gp.
5972 (define_peephole2
5973 [(parallel
5974 [(set (match_operand 0)
5975 (call (mem:DI (match_operand:DI 1 "symbolic_operand"))
5976 (const_int 0)))
5977 (unspec [(match_operand:DI 2 "const_int_operand")] TLS_CALL)
5978 (use (reg:DI 29))
5979 (clobber (reg:DI 26))])]
5980 "HAVE_AS_TLS && reload_completed
5981 && peep2_regno_dead_p (1, 29)"
5982 [(set (match_dup 3)
5983 (unspec:DI [(match_dup 5)
5984 (match_dup 1)
5985 (match_dup 2)] UNSPEC_LITERAL))
5986 (parallel [(set (match_dup 0)
5987 (call (mem:DI (match_dup 3))
5988 (const_int 0)))
5989 (use (match_dup 5))
5990 (use (match_dup 1))
5991 (use (unspec [(match_dup 2)] TLS_CALL))
5992 (clobber (reg:DI 26))])
5993 (set (match_dup 5)
5994 (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP2))]
5995 {
5996 operands[3] = gen_rtx_REG (Pmode, 27);
5997 operands[4] = GEN_INT (alpha_next_sequence_number++);
5998 operands[5] = pic_offset_table_rtx;
5999 })
6000
6001 (define_peephole2
6002 [(parallel
6003 [(set (match_operand 0)
6004 (call (mem:DI (match_operand:DI 1 "symbolic_operand"))
6005 (const_int 0)))
6006 (unspec [(match_operand:DI 2 "const_int_operand")] TLS_CALL)
6007 (use (reg:DI 29))
6008 (clobber (reg:DI 26))])]
6009 "HAVE_AS_TLS && reload_completed
6010 && !peep2_regno_dead_p (1, 29)"
6011 [(set (match_dup 3)
6012 (unspec:DI [(match_dup 5)
6013 (match_dup 1)
6014 (match_dup 2)] UNSPEC_LITERAL))
6015 (parallel [(set (match_dup 0)
6016 (call (mem:DI (match_dup 3))
6017 (const_int 0)))
6018 (set (match_dup 5)
6019 (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP1))
6020 (use (match_dup 1))
6021 (use (unspec [(match_dup 2)] TLS_CALL))
6022 (clobber (reg:DI 26))])
6023 (set (match_dup 5)
6024 (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP2))]
6025 {
6026 operands[3] = gen_rtx_REG (Pmode, 27);
6027 operands[4] = GEN_INT (alpha_next_sequence_number++);
6028 operands[5] = pic_offset_table_rtx;
6029 })
6030
6031 (define_insn "*call_value_osf_1"
6032 [(set (match_operand 0)
6033 (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
6034 (match_operand 2)))
6035 (use (reg:DI 29))
6036 (clobber (reg:DI 26))]
6037 "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
6038 "@
6039 jsr $26,($27),0\;ldgp $29,0($26)
6040 bsr $26,$%1..ng
6041 jsr $26,%1\;ldgp $29,0($26)"
6042 [(set_attr "type" "jsr")
6043 (set_attr "length" "12,*,16")])
6044
6045 (define_insn "*sibcall_value_osf_1_er"
6046 [(set (match_operand 0)
6047 (call (mem:DI (match_operand:DI 1 "symbolic_operand" "R,s"))
6048 (match_operand 2)))
6049 (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
6050 "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
6051 "@
6052 br $31,%1\t\t!samegp
6053 ldq $27,%1($29)\t\t!literal!%#\;jmp $31,($27),%1\t\t!lituse_jsr!%#"
6054 [(set_attr "type" "jsr")
6055 (set_attr "length" "*,8")])
6056
6057 (define_insn "*sibcall_value_osf_1"
6058 [(set (match_operand 0)
6059 (call (mem:DI (match_operand:DI 1 "symbolic_operand" "R,s"))
6060 (match_operand 2)))
6061 (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
6062 "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
6063 "@
6064 br $31,$%1..ng
6065 lda $27,%1\;jmp $31,($27),%1"
6066 [(set_attr "type" "jsr")
6067 (set_attr "length" "*,8")])
6068
6069 ; GAS relies on the order and position of instructions output below in order
6070 ; to generate relocs for VMS link to potentially optimize the call.
6071 ; Please do not molest.
6072 (define_insn "*call_value_vms_1"
6073 [(set (match_operand 0)
6074 (call (mem:DI (match_operand:DI 1 "call_operand" "r,s"))
6075 (match_operand 2)))
6076 (use (match_operand:DI 3 "nonmemory_operand" "r,n"))
6077 (use (reg:DI 25))
6078 (use (reg:DI 26))
6079 (clobber (reg:DI 27))]
6080 "TARGET_ABI_OPEN_VMS"
6081 {
6082 switch (which_alternative)
6083 {
6084 case 0:
6085 return "mov %3,$27\;jsr $26,0\;ldq $27,0($29)";
6086 case 1:
6087 operands [3] = alpha_use_linkage (operands [1], true, false);
6088 operands [4] = alpha_use_linkage (operands [1], false, false);
6089 return "ldq $26,%4\;ldq $27,%3\;jsr $26,%1\;ldq $27,0($29)";
6090 default:
6091 gcc_unreachable ();
6092 }
6093 }
6094 [(set_attr "type" "jsr")
6095 (set_attr "length" "12,16")])
6096