alpha.md revision 1.1.1.1.4.2 1 1.1.1.1.4.2 yamt ;; Machine description for DEC Alpha for GNU C compiler
2 1.1.1.1.4.2 yamt ;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 1.1.1.1.4.2 yamt ;; 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
4 1.1.1.1.4.2 yamt ;; Free Software Foundation, Inc.
5 1.1.1.1.4.2 yamt ;; Contributed by Richard Kenner (kenner (a] vlsi1.ultra.nyu.edu)
6 1.1.1.1.4.2 yamt ;;
7 1.1.1.1.4.2 yamt ;; This file is part of GCC.
8 1.1.1.1.4.2 yamt ;;
9 1.1.1.1.4.2 yamt ;; GCC is free software; you can redistribute it and/or modify
10 1.1.1.1.4.2 yamt ;; it under the terms of the GNU General Public License as published by
11 1.1.1.1.4.2 yamt ;; the Free Software Foundation; either version 3, or (at your option)
12 1.1.1.1.4.2 yamt ;; any later version.
13 1.1.1.1.4.2 yamt ;;
14 1.1.1.1.4.2 yamt ;; GCC is distributed in the hope that it will be useful,
15 1.1.1.1.4.2 yamt ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 1.1.1.1.4.2 yamt ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 1.1.1.1.4.2 yamt ;; GNU General Public License for more details.
18 1.1.1.1.4.2 yamt ;;
19 1.1.1.1.4.2 yamt ;; You should have received a copy of the GNU General Public License
20 1.1.1.1.4.2 yamt ;; along with GCC; see the file COPYING3. If not see
21 1.1.1.1.4.2 yamt ;; <http://www.gnu.org/licenses/>.
22 1.1.1.1.4.2 yamt
23 1.1.1.1.4.2 yamt ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
24 1.1.1.1.4.2 yamt
25 1.1.1.1.4.2 yamt ;; Uses of UNSPEC in this file:
26 1.1.1.1.4.2 yamt
27 1.1.1.1.4.2 yamt (define_constants
28 1.1.1.1.4.2 yamt [(UNSPEC_ARG_HOME 0)
29 1.1.1.1.4.2 yamt (UNSPEC_LDGP1 1)
30 1.1.1.1.4.2 yamt (UNSPEC_INSXH 2)
31 1.1.1.1.4.2 yamt (UNSPEC_MSKXH 3)
32 1.1.1.1.4.2 yamt (UNSPEC_CVTQL 4)
33 1.1.1.1.4.2 yamt (UNSPEC_CVTLQ 5)
34 1.1.1.1.4.2 yamt (UNSPEC_UMK_LAUM 6)
35 1.1.1.1.4.2 yamt (UNSPEC_UMK_LALM 7)
36 1.1.1.1.4.2 yamt (UNSPEC_UMK_LAL 8)
37 1.1.1.1.4.2 yamt (UNSPEC_UMK_LOAD_CIW 9)
38 1.1.1.1.4.2 yamt (UNSPEC_LDGP2 10)
39 1.1.1.1.4.2 yamt (UNSPEC_LITERAL 11)
40 1.1.1.1.4.2 yamt (UNSPEC_LITUSE 12)
41 1.1.1.1.4.2 yamt (UNSPEC_SIBCALL 13)
42 1.1.1.1.4.2 yamt (UNSPEC_SYMBOL 14)
43 1.1.1.1.4.2 yamt
44 1.1.1.1.4.2 yamt ;; TLS Support
45 1.1.1.1.4.2 yamt (UNSPEC_TLSGD_CALL 15)
46 1.1.1.1.4.2 yamt (UNSPEC_TLSLDM_CALL 16)
47 1.1.1.1.4.2 yamt (UNSPEC_TLSGD 17)
48 1.1.1.1.4.2 yamt (UNSPEC_TLSLDM 18)
49 1.1.1.1.4.2 yamt (UNSPEC_DTPREL 19)
50 1.1.1.1.4.2 yamt (UNSPEC_TPREL 20)
51 1.1.1.1.4.2 yamt (UNSPEC_TP 21)
52 1.1.1.1.4.2 yamt
53 1.1.1.1.4.2 yamt ;; Builtins
54 1.1.1.1.4.2 yamt (UNSPEC_CMPBGE 22)
55 1.1.1.1.4.2 yamt (UNSPEC_ZAP 23)
56 1.1.1.1.4.2 yamt (UNSPEC_AMASK 24)
57 1.1.1.1.4.2 yamt (UNSPEC_IMPLVER 25)
58 1.1.1.1.4.2 yamt (UNSPEC_PERR 26)
59 1.1.1.1.4.2 yamt (UNSPEC_COPYSIGN 27)
60 1.1.1.1.4.2 yamt
61 1.1.1.1.4.2 yamt ;; Atomic operations
62 1.1.1.1.4.2 yamt (UNSPEC_MB 28)
63 1.1.1.1.4.2 yamt (UNSPEC_ATOMIC 31)
64 1.1.1.1.4.2 yamt (UNSPEC_CMPXCHG 32)
65 1.1.1.1.4.2 yamt (UNSPEC_XCHG 33)
66 1.1.1.1.4.2 yamt ])
67 1.1.1.1.4.2 yamt
68 1.1.1.1.4.2 yamt ;; UNSPEC_VOLATILE:
69 1.1.1.1.4.2 yamt
70 1.1.1.1.4.2 yamt (define_constants
71 1.1.1.1.4.2 yamt [(UNSPECV_IMB 0)
72 1.1.1.1.4.2 yamt (UNSPECV_BLOCKAGE 1)
73 1.1.1.1.4.2 yamt (UNSPECV_SETJMPR 2) ; builtin_setjmp_receiver
74 1.1.1.1.4.2 yamt (UNSPECV_LONGJMP 3) ; builtin_longjmp
75 1.1.1.1.4.2 yamt (UNSPECV_TRAPB 4)
76 1.1.1.1.4.2 yamt (UNSPECV_PSPL 5) ; prologue_stack_probe_loop
77 1.1.1.1.4.2 yamt (UNSPECV_REALIGN 6)
78 1.1.1.1.4.2 yamt (UNSPECV_EHR 7) ; exception_receiver
79 1.1.1.1.4.2 yamt (UNSPECV_MCOUNT 8)
80 1.1.1.1.4.2 yamt (UNSPECV_FORCE_MOV 9)
81 1.1.1.1.4.2 yamt (UNSPECV_LDGP1 10)
82 1.1.1.1.4.2 yamt (UNSPECV_PLDGP2 11) ; prologue ldgp
83 1.1.1.1.4.2 yamt (UNSPECV_SET_TP 12)
84 1.1.1.1.4.2 yamt (UNSPECV_RPCC 13)
85 1.1.1.1.4.2 yamt (UNSPECV_SETJMPR_ER 14) ; builtin_setjmp_receiver fragment
86 1.1.1.1.4.2 yamt (UNSPECV_LL 15) ; load-locked
87 1.1.1.1.4.2 yamt (UNSPECV_SC 16) ; store-conditional
88 1.1.1.1.4.2 yamt ])
89 1.1.1.1.4.2 yamt
90 1.1.1.1.4.2 yamt ;; On non-BWX targets, CQImode must be handled the similarly to HImode
91 1.1.1.1.4.2 yamt ;; when generating reloads.
92 1.1.1.1.4.2 yamt (define_mode_iterator RELOAD12 [QI HI CQI])
93 1.1.1.1.4.2 yamt (define_mode_attr reloadmode [(QI "qi") (HI "hi") (CQI "hi")])
94 1.1.1.1.4.2 yamt
95 1.1.1.1.4.2 yamt ;; Other mode iterators
96 1.1.1.1.4.2 yamt (define_mode_iterator I12MODE [QI HI])
97 1.1.1.1.4.2 yamt (define_mode_iterator I48MODE [SI DI])
98 1.1.1.1.4.2 yamt (define_mode_attr modesuffix [(SI "l") (DI "q")])
99 1.1.1.1.4.2 yamt
100 1.1.1.1.4.2 yamt ;; Where necessary, the suffixes _le and _be are used to distinguish between
101 1.1.1.1.4.2 yamt ;; little-endian and big-endian patterns.
102 1.1.1.1.4.2 yamt ;;
103 1.1.1.1.4.2 yamt ;; Note that the Unicos/Mk assembler does not support the following
104 1.1.1.1.4.2 yamt ;; opcodes: mov, fmov, nop, fnop, unop.
105 1.1.1.1.4.2 yamt
107 1.1.1.1.4.2 yamt ;; Processor type -- this attribute must exactly match the processor_type
108 1.1.1.1.4.2 yamt ;; enumeration in alpha.h.
109 1.1.1.1.4.2 yamt
110 1.1.1.1.4.2 yamt (define_attr "tune" "ev4,ev5,ev6"
111 1.1.1.1.4.2 yamt (const (symbol_ref "((enum attr_tune) alpha_tune)")))
112 1.1.1.1.4.2 yamt
113 1.1.1.1.4.2 yamt ;; Define an insn type attribute. This is used in function unit delay
114 1.1.1.1.4.2 yamt ;; computations, among other purposes. For the most part, we use the names
115 1.1.1.1.4.2 yamt ;; defined in the EV4 documentation, but add a few that we have to know about
116 1.1.1.1.4.2 yamt ;; separately.
117 1.1.1.1.4.2 yamt
118 1.1.1.1.4.2 yamt (define_attr "type"
119 1.1.1.1.4.2 yamt "ild,fld,ldsym,ist,fst,ibr,callpal,fbr,jsr,iadd,ilog,shift,icmov,fcmov,
120 1.1.1.1.4.2 yamt icmp,imul,fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,mb,ld_l,st_c,
121 1.1.1.1.4.2 yamt multi,none"
122 1.1.1.1.4.2 yamt (const_string "iadd"))
123 1.1.1.1.4.2 yamt
124 1.1.1.1.4.2 yamt ;; Describe a user's asm statement.
125 1.1.1.1.4.2 yamt (define_asm_attributes
126 1.1.1.1.4.2 yamt [(set_attr "type" "multi")])
127 1.1.1.1.4.2 yamt
128 1.1.1.1.4.2 yamt ;; Define the operand size an insn operates on. Used primarily by mul
129 1.1.1.1.4.2 yamt ;; and div operations that have size dependent timings.
130 1.1.1.1.4.2 yamt
131 1.1.1.1.4.2 yamt (define_attr "opsize" "si,di,udi"
132 1.1.1.1.4.2 yamt (const_string "di"))
133 1.1.1.1.4.2 yamt
134 1.1.1.1.4.2 yamt ;; The TRAP attribute marks instructions that may generate traps
135 1.1.1.1.4.2 yamt ;; (which are imprecise and may need a trapb if software completion
136 1.1.1.1.4.2 yamt ;; is desired).
137 1.1.1.1.4.2 yamt
138 1.1.1.1.4.2 yamt (define_attr "trap" "no,yes"
139 1.1.1.1.4.2 yamt (const_string "no"))
140 1.1.1.1.4.2 yamt
141 1.1.1.1.4.2 yamt ;; The ROUND_SUFFIX attribute marks which instructions require a
142 1.1.1.1.4.2 yamt ;; rounding-mode suffix. The value NONE indicates no suffix,
143 1.1.1.1.4.2 yamt ;; the value NORMAL indicates a suffix controlled by alpha_fprm.
144 1.1.1.1.4.2 yamt
145 1.1.1.1.4.2 yamt (define_attr "round_suffix" "none,normal,c"
146 1.1.1.1.4.2 yamt (const_string "none"))
147 1.1.1.1.4.2 yamt
148 1.1.1.1.4.2 yamt ;; The TRAP_SUFFIX attribute marks instructions requiring a trap-mode suffix:
149 1.1.1.1.4.2 yamt ;; NONE no suffix
150 1.1.1.1.4.2 yamt ;; SU accepts only /su (cmpt et al)
151 1.1.1.1.4.2 yamt ;; SUI accepts only /sui (cvtqt and cvtqs)
152 1.1.1.1.4.2 yamt ;; V_SV accepts /v and /sv (cvtql only)
153 1.1.1.1.4.2 yamt ;; V_SV_SVI accepts /v, /sv and /svi (cvttq only)
154 1.1.1.1.4.2 yamt ;; U_SU_SUI accepts /u, /su and /sui (most fp instructions)
155 1.1.1.1.4.2 yamt ;;
156 1.1.1.1.4.2 yamt ;; The actual suffix emitted is controlled by alpha_fptm.
157 1.1.1.1.4.2 yamt
158 1.1.1.1.4.2 yamt (define_attr "trap_suffix" "none,su,sui,v_sv,v_sv_svi,u_su_sui"
159 1.1.1.1.4.2 yamt (const_string "none"))
160 1.1.1.1.4.2 yamt
161 1.1.1.1.4.2 yamt ;; The length of an instruction sequence in bytes.
162 1.1.1.1.4.2 yamt
163 1.1.1.1.4.2 yamt (define_attr "length" ""
164 1.1.1.1.4.2 yamt (const_int 4))
165 1.1.1.1.4.2 yamt
166 1.1.1.1.4.2 yamt ;; The USEGP attribute marks instructions that have relocations that use
167 1.1.1.1.4.2 yamt ;; the GP.
168 1.1.1.1.4.2 yamt
169 1.1.1.1.4.2 yamt (define_attr "usegp" "no,yes"
170 1.1.1.1.4.2 yamt (cond [(eq_attr "type" "ldsym,jsr")
171 1.1.1.1.4.2 yamt (const_string "yes")
172 1.1.1.1.4.2 yamt (eq_attr "type" "ild,fld,ist,fst")
173 1.1.1.1.4.2 yamt (symbol_ref "((enum attr_usegp) alpha_find_lo_sum_using_gp (insn))")
174 1.1.1.1.4.2 yamt ]
175 1.1.1.1.4.2 yamt (const_string "no")))
176 1.1.1.1.4.2 yamt
177 1.1.1.1.4.2 yamt ;; The CANNOT_COPY attribute marks instructions with relocations that
178 1.1.1.1.4.2 yamt ;; cannot easily be duplicated. This includes insns with gpdisp relocs
179 1.1.1.1.4.2 yamt ;; since they have to stay in 1-1 correspondence with one another. This
180 1.1.1.1.4.2 yamt ;; also includes jsr insns, since they must stay in correspondence with
181 1.1.1.1.4.2 yamt ;; the immediately following gpdisp instructions.
182 1.1.1.1.4.2 yamt
183 1.1.1.1.4.2 yamt (define_attr "cannot_copy" "false,true"
184 1.1.1.1.4.2 yamt (const_string "false"))
185 1.1.1.1.4.2 yamt
187 1.1.1.1.4.2 yamt ;; Include scheduling descriptions.
188 1.1.1.1.4.2 yamt
189 1.1.1.1.4.2 yamt (include "ev4.md")
190 1.1.1.1.4.2 yamt (include "ev5.md")
191 1.1.1.1.4.2 yamt (include "ev6.md")
192 1.1.1.1.4.2 yamt
193 1.1.1.1.4.2 yamt
195 1.1.1.1.4.2 yamt ;; Operand and operator predicates and constraints
196 1.1.1.1.4.2 yamt
197 1.1.1.1.4.2 yamt (include "predicates.md")
198 1.1.1.1.4.2 yamt (include "constraints.md")
199 1.1.1.1.4.2 yamt
200 1.1.1.1.4.2 yamt
202 1.1.1.1.4.2 yamt ;; First define the arithmetic insns. Note that the 32-bit forms also
203 1.1.1.1.4.2 yamt ;; sign-extend.
204 1.1.1.1.4.2 yamt
205 1.1.1.1.4.2 yamt ;; Handle 32-64 bit extension from memory to a floating point register
206 1.1.1.1.4.2 yamt ;; specially, since this occurs frequently in int->double conversions.
207 1.1.1.1.4.2 yamt ;;
208 1.1.1.1.4.2 yamt ;; Note that while we must retain the =f case in the insn for reload's
209 1.1.1.1.4.2 yamt ;; benefit, it should be eliminated after reload, so we should never emit
210 1.1.1.1.4.2 yamt ;; code for that case. But we don't reject the possibility.
211 1.1.1.1.4.2 yamt
212 1.1.1.1.4.2 yamt (define_expand "extendsidi2"
213 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
214 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
215 1.1.1.1.4.2 yamt ""
216 1.1.1.1.4.2 yamt "")
217 1.1.1.1.4.2 yamt
218 1.1.1.1.4.2 yamt (define_insn "*cvtlq"
219 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=f")
220 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:SF 1 "reg_or_0_operand" "fG")]
221 1.1.1.1.4.2 yamt UNSPEC_CVTLQ))]
222 1.1.1.1.4.2 yamt ""
223 1.1.1.1.4.2 yamt "cvtlq %1,%0"
224 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
225 1.1.1.1.4.2 yamt
226 1.1.1.1.4.2 yamt (define_insn "*extendsidi2_1"
227 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r,!*f")
228 1.1.1.1.4.2 yamt (sign_extend:DI
229 1.1.1.1.4.2 yamt (match_operand:SI 1 "nonimmediate_operand" "r,m,m")))]
230 1.1.1.1.4.2 yamt ""
231 1.1.1.1.4.2 yamt "@
232 1.1.1.1.4.2 yamt addl $31,%1,%0
233 1.1.1.1.4.2 yamt ldl %0,%1
234 1.1.1.1.4.2 yamt lds %0,%1\;cvtlq %0,%0"
235 1.1.1.1.4.2 yamt [(set_attr "type" "iadd,ild,fld")
236 1.1.1.1.4.2 yamt (set_attr "length" "*,*,8")])
237 1.1.1.1.4.2 yamt
238 1.1.1.1.4.2 yamt (define_split
239 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "hard_fp_register_operand" "")
240 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 1 "memory_operand" "")))]
241 1.1.1.1.4.2 yamt "reload_completed"
242 1.1.1.1.4.2 yamt [(set (match_dup 2) (match_dup 1))
243 1.1.1.1.4.2 yamt (set (match_dup 0) (unspec:DI [(match_dup 2)] UNSPEC_CVTLQ))]
244 1.1.1.1.4.2 yamt {
245 1.1.1.1.4.2 yamt operands[1] = adjust_address (operands[1], SFmode, 0);
246 1.1.1.1.4.2 yamt operands[2] = gen_rtx_REG (SFmode, REGNO (operands[0]));
247 1.1.1.1.4.2 yamt })
248 1.1.1.1.4.2 yamt
249 1.1.1.1.4.2 yamt ;; Optimize sign-extension of SImode loads. This shows up in the wake of
250 1.1.1.1.4.2 yamt ;; reload when converting fp->int.
251 1.1.1.1.4.2 yamt
252 1.1.1.1.4.2 yamt (define_peephole2
253 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "hard_int_register_operand" "")
254 1.1.1.1.4.2 yamt (match_operand:SI 1 "memory_operand" ""))
255 1.1.1.1.4.2 yamt (set (match_operand:DI 2 "hard_int_register_operand" "")
256 1.1.1.1.4.2 yamt (sign_extend:DI (match_dup 0)))]
257 1.1.1.1.4.2 yamt "true_regnum (operands[0]) == true_regnum (operands[2])
258 1.1.1.1.4.2 yamt || peep2_reg_dead_p (2, operands[0])"
259 1.1.1.1.4.2 yamt [(set (match_dup 2)
260 1.1.1.1.4.2 yamt (sign_extend:DI (match_dup 1)))]
261 1.1.1.1.4.2 yamt "")
262 1.1.1.1.4.2 yamt
263 1.1.1.1.4.2 yamt (define_insn "addsi3"
264 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
265 1.1.1.1.4.2 yamt (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ,rJ,rJ")
266 1.1.1.1.4.2 yamt (match_operand:SI 2 "add_operand" "rI,O,K,L")))]
267 1.1.1.1.4.2 yamt ""
268 1.1.1.1.4.2 yamt "@
269 1.1.1.1.4.2 yamt addl %r1,%2,%0
270 1.1.1.1.4.2 yamt subl %r1,%n2,%0
271 1.1.1.1.4.2 yamt lda %0,%2(%r1)
272 1.1.1.1.4.2 yamt ldah %0,%h2(%r1)")
273 1.1.1.1.4.2 yamt
274 1.1.1.1.4.2 yamt (define_split
275 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "")
276 1.1.1.1.4.2 yamt (plus:SI (match_operand:SI 1 "register_operand" "")
277 1.1.1.1.4.2 yamt (match_operand:SI 2 "const_int_operand" "")))]
278 1.1.1.1.4.2 yamt "! add_operand (operands[2], SImode)"
279 1.1.1.1.4.2 yamt [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
280 1.1.1.1.4.2 yamt (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
281 1.1.1.1.4.2 yamt {
282 1.1.1.1.4.2 yamt HOST_WIDE_INT val = INTVAL (operands[2]);
283 1.1.1.1.4.2 yamt HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000);
284 1.1.1.1.4.2 yamt HOST_WIDE_INT rest = val - low;
285 1.1.1.1.4.2 yamt
286 1.1.1.1.4.2 yamt operands[3] = GEN_INT (rest);
287 1.1.1.1.4.2 yamt operands[4] = GEN_INT (low);
288 1.1.1.1.4.2 yamt })
289 1.1.1.1.4.2 yamt
290 1.1.1.1.4.2 yamt (define_insn "*addsi_se"
291 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
292 1.1.1.1.4.2 yamt (sign_extend:DI
293 1.1.1.1.4.2 yamt (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
294 1.1.1.1.4.2 yamt (match_operand:SI 2 "sext_add_operand" "rI,O"))))]
295 1.1.1.1.4.2 yamt ""
296 1.1.1.1.4.2 yamt "@
297 1.1.1.1.4.2 yamt addl %r1,%2,%0
298 1.1.1.1.4.2 yamt subl %r1,%n2,%0")
299 1.1.1.1.4.2 yamt
300 1.1.1.1.4.2 yamt (define_insn "*addsi_se2"
301 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
302 1.1.1.1.4.2 yamt (sign_extend:DI
303 1.1.1.1.4.2 yamt (subreg:SI (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
304 1.1.1.1.4.2 yamt (match_operand:DI 2 "sext_add_operand" "rI,O"))
305 1.1.1.1.4.2 yamt 0)))]
306 1.1.1.1.4.2 yamt ""
307 1.1.1.1.4.2 yamt "@
308 1.1.1.1.4.2 yamt addl %r1,%2,%0
309 1.1.1.1.4.2 yamt subl %r1,%n2,%0")
310 1.1.1.1.4.2 yamt
311 1.1.1.1.4.2 yamt (define_split
312 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
313 1.1.1.1.4.2 yamt (sign_extend:DI
314 1.1.1.1.4.2 yamt (plus:SI (match_operand:SI 1 "reg_not_elim_operand" "")
315 1.1.1.1.4.2 yamt (match_operand:SI 2 "const_int_operand" ""))))
316 1.1.1.1.4.2 yamt (clobber (match_operand:SI 3 "reg_not_elim_operand" ""))]
317 1.1.1.1.4.2 yamt "! sext_add_operand (operands[2], SImode) && INTVAL (operands[2]) > 0
318 1.1.1.1.4.2 yamt && INTVAL (operands[2]) % 4 == 0"
319 1.1.1.1.4.2 yamt [(set (match_dup 3) (match_dup 4))
320 1.1.1.1.4.2 yamt (set (match_dup 0) (sign_extend:DI (plus:SI (mult:SI (match_dup 3)
321 1.1.1.1.4.2 yamt (match_dup 5))
322 1.1.1.1.4.2 yamt (match_dup 1))))]
323 1.1.1.1.4.2 yamt {
324 1.1.1.1.4.2 yamt HOST_WIDE_INT val = INTVAL (operands[2]) / 4;
325 1.1.1.1.4.2 yamt int mult = 4;
326 1.1.1.1.4.2 yamt
327 1.1.1.1.4.2 yamt if (val % 2 == 0)
328 1.1.1.1.4.2 yamt val /= 2, mult = 8;
329 1.1.1.1.4.2 yamt
330 1.1.1.1.4.2 yamt operands[4] = GEN_INT (val);
331 1.1.1.1.4.2 yamt operands[5] = GEN_INT (mult);
332 1.1.1.1.4.2 yamt })
333 1.1.1.1.4.2 yamt
334 1.1.1.1.4.2 yamt (define_split
335 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
336 1.1.1.1.4.2 yamt (sign_extend:DI
337 1.1.1.1.4.2 yamt (plus:SI (match_operator:SI 1 "comparison_operator"
338 1.1.1.1.4.2 yamt [(match_operand 2 "" "")
339 1.1.1.1.4.2 yamt (match_operand 3 "" "")])
340 1.1.1.1.4.2 yamt (match_operand:SI 4 "add_operand" ""))))
341 1.1.1.1.4.2 yamt (clobber (match_operand:DI 5 "register_operand" ""))]
342 1.1.1.1.4.2 yamt ""
343 1.1.1.1.4.2 yamt [(set (match_dup 5) (match_dup 6))
344 1.1.1.1.4.2 yamt (set (match_dup 0) (sign_extend:DI (plus:SI (match_dup 7) (match_dup 4))))]
345 1.1.1.1.4.2 yamt {
346 1.1.1.1.4.2 yamt operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[1]), DImode,
347 1.1.1.1.4.2 yamt operands[2], operands[3]);
348 1.1.1.1.4.2 yamt operands[7] = gen_lowpart (SImode, operands[5]);
349 1.1.1.1.4.2 yamt })
350 1.1.1.1.4.2 yamt
351 1.1.1.1.4.2 yamt (define_insn "addvsi3"
352 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
353 1.1.1.1.4.2 yamt (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
354 1.1.1.1.4.2 yamt (match_operand:SI 2 "sext_add_operand" "rI,O")))
355 1.1.1.1.4.2 yamt (trap_if (ne (plus:DI (sign_extend:DI (match_dup 1))
356 1.1.1.1.4.2 yamt (sign_extend:DI (match_dup 2)))
357 1.1.1.1.4.2 yamt (sign_extend:DI (plus:SI (match_dup 1)
358 1.1.1.1.4.2 yamt (match_dup 2))))
359 1.1.1.1.4.2 yamt (const_int 0))]
360 1.1.1.1.4.2 yamt ""
361 1.1.1.1.4.2 yamt "@
362 1.1.1.1.4.2 yamt addlv %r1,%2,%0
363 1.1.1.1.4.2 yamt sublv %r1,%n2,%0")
364 1.1.1.1.4.2 yamt
365 1.1.1.1.4.2 yamt (define_expand "adddi3"
366 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
367 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "")
368 1.1.1.1.4.2 yamt (match_operand:DI 2 "add_operand" "")))]
369 1.1.1.1.4.2 yamt ""
370 1.1.1.1.4.2 yamt "")
371 1.1.1.1.4.2 yamt
372 1.1.1.1.4.2 yamt (define_insn "*adddi_er_lo16_dtp"
373 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
374 1.1.1.1.4.2 yamt (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
375 1.1.1.1.4.2 yamt (match_operand:DI 2 "dtp16_symbolic_operand" "")))]
376 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
377 1.1.1.1.4.2 yamt "lda %0,%2(%1)\t\t!dtprel")
378 1.1.1.1.4.2 yamt
379 1.1.1.1.4.2 yamt (define_insn "*adddi_er_hi32_dtp"
380 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
381 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "r")
382 1.1.1.1.4.2 yamt (high:DI (match_operand:DI 2 "dtp32_symbolic_operand" ""))))]
383 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
384 1.1.1.1.4.2 yamt "ldah %0,%2(%1)\t\t!dtprelhi")
385 1.1.1.1.4.2 yamt
386 1.1.1.1.4.2 yamt (define_insn "*adddi_er_lo32_dtp"
387 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
388 1.1.1.1.4.2 yamt (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
389 1.1.1.1.4.2 yamt (match_operand:DI 2 "dtp32_symbolic_operand" "")))]
390 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
391 1.1.1.1.4.2 yamt "lda %0,%2(%1)\t\t!dtprello")
392 1.1.1.1.4.2 yamt
393 1.1.1.1.4.2 yamt (define_insn "*adddi_er_lo16_tp"
394 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
395 1.1.1.1.4.2 yamt (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
396 1.1.1.1.4.2 yamt (match_operand:DI 2 "tp16_symbolic_operand" "")))]
397 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
398 1.1.1.1.4.2 yamt "lda %0,%2(%1)\t\t!tprel")
399 1.1.1.1.4.2 yamt
400 1.1.1.1.4.2 yamt (define_insn "*adddi_er_hi32_tp"
401 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
402 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "r")
403 1.1.1.1.4.2 yamt (high:DI (match_operand:DI 2 "tp32_symbolic_operand" ""))))]
404 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
405 1.1.1.1.4.2 yamt "ldah %0,%2(%1)\t\t!tprelhi")
406 1.1.1.1.4.2 yamt
407 1.1.1.1.4.2 yamt (define_insn "*adddi_er_lo32_tp"
408 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
409 1.1.1.1.4.2 yamt (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
410 1.1.1.1.4.2 yamt (match_operand:DI 2 "tp32_symbolic_operand" "")))]
411 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
412 1.1.1.1.4.2 yamt "lda %0,%2(%1)\t\t!tprello")
413 1.1.1.1.4.2 yamt
414 1.1.1.1.4.2 yamt (define_insn "*adddi_er_high_l"
415 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
416 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "r")
417 1.1.1.1.4.2 yamt (high:DI (match_operand:DI 2 "local_symbolic_operand" ""))))]
418 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && reload_completed"
419 1.1.1.1.4.2 yamt "ldah %0,%2(%1)\t\t!gprelhigh"
420 1.1.1.1.4.2 yamt [(set_attr "usegp" "yes")])
421 1.1.1.1.4.2 yamt
422 1.1.1.1.4.2 yamt (define_split
423 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
424 1.1.1.1.4.2 yamt (high:DI (match_operand:DI 1 "local_symbolic_operand" "")))]
425 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && reload_completed"
426 1.1.1.1.4.2 yamt [(set (match_dup 0)
427 1.1.1.1.4.2 yamt (plus:DI (match_dup 2) (high:DI (match_dup 1))))]
428 1.1.1.1.4.2 yamt "operands[2] = pic_offset_table_rtx;")
429 1.1.1.1.4.2 yamt
430 1.1.1.1.4.2 yamt ;; We used to expend quite a lot of effort choosing addq/subq/lda.
431 1.1.1.1.4.2 yamt ;; With complications like
432 1.1.1.1.4.2 yamt ;;
433 1.1.1.1.4.2 yamt ;; The NT stack unwind code can't handle a subq to adjust the stack
434 1.1.1.1.4.2 yamt ;; (that's a bug, but not one we can do anything about). As of NT4.0 SP3,
435 1.1.1.1.4.2 yamt ;; the exception handling code will loop if a subq is used and an
436 1.1.1.1.4.2 yamt ;; exception occurs.
437 1.1.1.1.4.2 yamt ;;
438 1.1.1.1.4.2 yamt ;; The 19980616 change to emit prologues as RTL also confused some
439 1.1.1.1.4.2 yamt ;; versions of GDB, which also interprets prologues. This has been
440 1.1.1.1.4.2 yamt ;; fixed as of GDB 4.18, but it does not harm to unconditionally
441 1.1.1.1.4.2 yamt ;; use lda here.
442 1.1.1.1.4.2 yamt ;;
443 1.1.1.1.4.2 yamt ;; and the fact that the three insns schedule exactly the same, it's
444 1.1.1.1.4.2 yamt ;; just not worth the effort.
445 1.1.1.1.4.2 yamt
446 1.1.1.1.4.2 yamt (define_insn "*adddi_internal"
447 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r,r")
448 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "%r,r,r")
449 1.1.1.1.4.2 yamt (match_operand:DI 2 "add_operand" "r,K,L")))]
450 1.1.1.1.4.2 yamt ""
451 1.1.1.1.4.2 yamt "@
452 1.1.1.1.4.2 yamt addq %1,%2,%0
453 1.1.1.1.4.2 yamt lda %0,%2(%1)
454 1.1.1.1.4.2 yamt ldah %0,%h2(%1)")
455 1.1.1.1.4.2 yamt
456 1.1.1.1.4.2 yamt ;; ??? Allow large constants when basing off the frame pointer or some
457 1.1.1.1.4.2 yamt ;; virtual register that may eliminate to the frame pointer. This is
458 1.1.1.1.4.2 yamt ;; done because register elimination offsets will change the hi/lo split,
459 1.1.1.1.4.2 yamt ;; and if we split before reload, we will require additional instructions.
460 1.1.1.1.4.2 yamt
461 1.1.1.1.4.2 yamt (define_insn "*adddi_fp_hack"
462 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r,r")
463 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "reg_no_subreg_operand" "r,r,r")
464 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "K,L,n")))]
465 1.1.1.1.4.2 yamt "NONSTRICT_REG_OK_FP_BASE_P (operands[1])
466 1.1.1.1.4.2 yamt && INTVAL (operands[2]) >= 0
467 1.1.1.1.4.2 yamt /* This is the largest constant an lda+ldah pair can add, minus
468 1.1.1.1.4.2 yamt an upper bound on the displacement between SP and AP during
469 1.1.1.1.4.2 yamt register elimination. See INITIAL_ELIMINATION_OFFSET. */
470 1.1.1.1.4.2 yamt && INTVAL (operands[2])
471 1.1.1.1.4.2 yamt < (0x7fff8000
472 1.1.1.1.4.2 yamt - FIRST_PSEUDO_REGISTER * UNITS_PER_WORD
473 1.1.1.1.4.2 yamt - ALPHA_ROUND(crtl->outgoing_args_size)
474 1.1.1.1.4.2 yamt - (ALPHA_ROUND (get_frame_size ()
475 1.1.1.1.4.2 yamt + max_reg_num () * UNITS_PER_WORD
476 1.1.1.1.4.2 yamt + crtl->args.pretend_args_size)
477 1.1.1.1.4.2 yamt - crtl->args.pretend_args_size))"
478 1.1.1.1.4.2 yamt "@
479 1.1.1.1.4.2 yamt lda %0,%2(%1)
480 1.1.1.1.4.2 yamt ldah %0,%h2(%1)
481 1.1.1.1.4.2 yamt #")
482 1.1.1.1.4.2 yamt
483 1.1.1.1.4.2 yamt ;; Don't do this if we are adjusting SP since we don't want to do it
484 1.1.1.1.4.2 yamt ;; in two steps. Don't split FP sources for the reason listed above.
485 1.1.1.1.4.2 yamt (define_split
486 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
487 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "")
488 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "")))]
489 1.1.1.1.4.2 yamt "! add_operand (operands[2], DImode)
490 1.1.1.1.4.2 yamt && operands[0] != stack_pointer_rtx
491 1.1.1.1.4.2 yamt && operands[1] != frame_pointer_rtx
492 1.1.1.1.4.2 yamt && operands[1] != arg_pointer_rtx"
493 1.1.1.1.4.2 yamt [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 3)))
494 1.1.1.1.4.2 yamt (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 4)))]
495 1.1.1.1.4.2 yamt {
496 1.1.1.1.4.2 yamt HOST_WIDE_INT val = INTVAL (operands[2]);
497 1.1.1.1.4.2 yamt HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000);
498 1.1.1.1.4.2 yamt HOST_WIDE_INT rest = val - low;
499 1.1.1.1.4.2 yamt rtx rest_rtx = GEN_INT (rest);
500 1.1.1.1.4.2 yamt
501 1.1.1.1.4.2 yamt operands[4] = GEN_INT (low);
502 1.1.1.1.4.2 yamt if (satisfies_constraint_L (rest_rtx))
503 1.1.1.1.4.2 yamt operands[3] = rest_rtx;
504 1.1.1.1.4.2 yamt else if (can_create_pseudo_p ())
505 1.1.1.1.4.2 yamt {
506 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
507 1.1.1.1.4.2 yamt emit_move_insn (operands[3], operands[2]);
508 1.1.1.1.4.2 yamt emit_insn (gen_adddi3 (operands[0], operands[1], operands[3]));
509 1.1.1.1.4.2 yamt DONE;
510 1.1.1.1.4.2 yamt }
511 1.1.1.1.4.2 yamt else
512 1.1.1.1.4.2 yamt FAIL;
513 1.1.1.1.4.2 yamt })
514 1.1.1.1.4.2 yamt
515 1.1.1.1.4.2 yamt (define_insn "*saddl"
516 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
517 1.1.1.1.4.2 yamt (plus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r")
518 1.1.1.1.4.2 yamt (match_operand:SI 2 "const48_operand" "I,I"))
519 1.1.1.1.4.2 yamt (match_operand:SI 3 "sext_add_operand" "rI,O")))]
520 1.1.1.1.4.2 yamt ""
521 1.1.1.1.4.2 yamt "@
522 1.1.1.1.4.2 yamt s%2addl %1,%3,%0
523 1.1.1.1.4.2 yamt s%2subl %1,%n3,%0")
524 1.1.1.1.4.2 yamt
525 1.1.1.1.4.2 yamt (define_insn "*saddl_se"
526 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
527 1.1.1.1.4.2 yamt (sign_extend:DI
528 1.1.1.1.4.2 yamt (plus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r")
529 1.1.1.1.4.2 yamt (match_operand:SI 2 "const48_operand" "I,I"))
530 1.1.1.1.4.2 yamt (match_operand:SI 3 "sext_add_operand" "rI,O"))))]
531 1.1.1.1.4.2 yamt ""
532 1.1.1.1.4.2 yamt "@
533 1.1.1.1.4.2 yamt s%2addl %1,%3,%0
534 1.1.1.1.4.2 yamt s%2subl %1,%n3,%0")
535 1.1.1.1.4.2 yamt
536 1.1.1.1.4.2 yamt (define_split
537 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
538 1.1.1.1.4.2 yamt (sign_extend:DI
539 1.1.1.1.4.2 yamt (plus:SI (mult:SI (match_operator:SI 1 "comparison_operator"
540 1.1.1.1.4.2 yamt [(match_operand 2 "" "")
541 1.1.1.1.4.2 yamt (match_operand 3 "" "")])
542 1.1.1.1.4.2 yamt (match_operand:SI 4 "const48_operand" ""))
543 1.1.1.1.4.2 yamt (match_operand:SI 5 "sext_add_operand" ""))))
544 1.1.1.1.4.2 yamt (clobber (match_operand:DI 6 "reg_not_elim_operand" ""))]
545 1.1.1.1.4.2 yamt ""
546 1.1.1.1.4.2 yamt [(set (match_dup 6) (match_dup 7))
547 1.1.1.1.4.2 yamt (set (match_dup 0)
548 1.1.1.1.4.2 yamt (sign_extend:DI (plus:SI (mult:SI (match_dup 8) (match_dup 4))
549 1.1.1.1.4.2 yamt (match_dup 5))))]
550 1.1.1.1.4.2 yamt {
551 1.1.1.1.4.2 yamt operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[1]), DImode,
552 1.1.1.1.4.2 yamt operands[2], operands[3]);
553 1.1.1.1.4.2 yamt operands[8] = gen_lowpart (SImode, operands[6]);
554 1.1.1.1.4.2 yamt })
555 1.1.1.1.4.2 yamt
556 1.1.1.1.4.2 yamt (define_insn "*saddq"
557 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
558 1.1.1.1.4.2 yamt (plus:DI (mult:DI (match_operand:DI 1 "reg_not_elim_operand" "r,r")
559 1.1.1.1.4.2 yamt (match_operand:DI 2 "const48_operand" "I,I"))
560 1.1.1.1.4.2 yamt (match_operand:DI 3 "sext_add_operand" "rI,O")))]
561 1.1.1.1.4.2 yamt ""
562 1.1.1.1.4.2 yamt "@
563 1.1.1.1.4.2 yamt s%2addq %1,%3,%0
564 1.1.1.1.4.2 yamt s%2subq %1,%n3,%0")
565 1.1.1.1.4.2 yamt
566 1.1.1.1.4.2 yamt (define_insn "addvdi3"
567 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
568 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
569 1.1.1.1.4.2 yamt (match_operand:DI 2 "sext_add_operand" "rI,O")))
570 1.1.1.1.4.2 yamt (trap_if (ne (plus:TI (sign_extend:TI (match_dup 1))
571 1.1.1.1.4.2 yamt (sign_extend:TI (match_dup 2)))
572 1.1.1.1.4.2 yamt (sign_extend:TI (plus:DI (match_dup 1)
573 1.1.1.1.4.2 yamt (match_dup 2))))
574 1.1.1.1.4.2 yamt (const_int 0))]
575 1.1.1.1.4.2 yamt ""
576 1.1.1.1.4.2 yamt "@
577 1.1.1.1.4.2 yamt addqv %r1,%2,%0
578 1.1.1.1.4.2 yamt subqv %r1,%n2,%0")
579 1.1.1.1.4.2 yamt
580 1.1.1.1.4.2 yamt (define_insn "negsi2"
581 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
582 1.1.1.1.4.2 yamt (neg:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI")))]
583 1.1.1.1.4.2 yamt ""
584 1.1.1.1.4.2 yamt "subl $31,%1,%0")
585 1.1.1.1.4.2 yamt
586 1.1.1.1.4.2 yamt (define_insn "*negsi_se"
587 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
588 1.1.1.1.4.2 yamt (sign_extend:DI (neg:SI
589 1.1.1.1.4.2 yamt (match_operand:SI 1 "reg_or_8bit_operand" "rI"))))]
590 1.1.1.1.4.2 yamt ""
591 1.1.1.1.4.2 yamt "subl $31,%1,%0")
592 1.1.1.1.4.2 yamt
593 1.1.1.1.4.2 yamt (define_insn "negvsi2"
594 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
595 1.1.1.1.4.2 yamt (neg:SI (match_operand:SI 1 "register_operand" "r")))
596 1.1.1.1.4.2 yamt (trap_if (ne (neg:DI (sign_extend:DI (match_dup 1)))
597 1.1.1.1.4.2 yamt (sign_extend:DI (neg:SI (match_dup 1))))
598 1.1.1.1.4.2 yamt (const_int 0))]
599 1.1.1.1.4.2 yamt ""
600 1.1.1.1.4.2 yamt "sublv $31,%1,%0")
601 1.1.1.1.4.2 yamt
602 1.1.1.1.4.2 yamt (define_insn "negdi2"
603 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
604 1.1.1.1.4.2 yamt (neg:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")))]
605 1.1.1.1.4.2 yamt ""
606 1.1.1.1.4.2 yamt "subq $31,%1,%0")
607 1.1.1.1.4.2 yamt
608 1.1.1.1.4.2 yamt (define_insn "negvdi2"
609 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
610 1.1.1.1.4.2 yamt (neg:DI (match_operand:DI 1 "register_operand" "r")))
611 1.1.1.1.4.2 yamt (trap_if (ne (neg:TI (sign_extend:TI (match_dup 1)))
612 1.1.1.1.4.2 yamt (sign_extend:TI (neg:DI (match_dup 1))))
613 1.1.1.1.4.2 yamt (const_int 0))]
614 1.1.1.1.4.2 yamt ""
615 1.1.1.1.4.2 yamt "subqv $31,%1,%0")
616 1.1.1.1.4.2 yamt
617 1.1.1.1.4.2 yamt (define_insn "subsi3"
618 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
619 1.1.1.1.4.2 yamt (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
620 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "rI")))]
621 1.1.1.1.4.2 yamt ""
622 1.1.1.1.4.2 yamt "subl %r1,%2,%0")
623 1.1.1.1.4.2 yamt
624 1.1.1.1.4.2 yamt (define_insn "*subsi_se"
625 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
626 1.1.1.1.4.2 yamt (sign_extend:DI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
627 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))]
628 1.1.1.1.4.2 yamt ""
629 1.1.1.1.4.2 yamt "subl %r1,%2,%0")
630 1.1.1.1.4.2 yamt
631 1.1.1.1.4.2 yamt (define_insn "*subsi_se2"
632 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
633 1.1.1.1.4.2 yamt (sign_extend:DI
634 1.1.1.1.4.2 yamt (subreg:SI (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
635 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI"))
636 1.1.1.1.4.2 yamt 0)))]
637 1.1.1.1.4.2 yamt ""
638 1.1.1.1.4.2 yamt "subl %r1,%2,%0")
639 1.1.1.1.4.2 yamt
640 1.1.1.1.4.2 yamt (define_insn "subvsi3"
641 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
642 1.1.1.1.4.2 yamt (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
643 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "rI")))
644 1.1.1.1.4.2 yamt (trap_if (ne (minus:DI (sign_extend:DI (match_dup 1))
645 1.1.1.1.4.2 yamt (sign_extend:DI (match_dup 2)))
646 1.1.1.1.4.2 yamt (sign_extend:DI (minus:SI (match_dup 1)
647 1.1.1.1.4.2 yamt (match_dup 2))))
648 1.1.1.1.4.2 yamt (const_int 0))]
649 1.1.1.1.4.2 yamt ""
650 1.1.1.1.4.2 yamt "sublv %r1,%2,%0")
651 1.1.1.1.4.2 yamt
652 1.1.1.1.4.2 yamt (define_insn "subdi3"
653 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
654 1.1.1.1.4.2 yamt (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
655 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")))]
656 1.1.1.1.4.2 yamt ""
657 1.1.1.1.4.2 yamt "subq %r1,%2,%0")
658 1.1.1.1.4.2 yamt
659 1.1.1.1.4.2 yamt (define_insn "*ssubl"
660 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
661 1.1.1.1.4.2 yamt (minus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r")
662 1.1.1.1.4.2 yamt (match_operand:SI 2 "const48_operand" "I"))
663 1.1.1.1.4.2 yamt (match_operand:SI 3 "reg_or_8bit_operand" "rI")))]
664 1.1.1.1.4.2 yamt ""
665 1.1.1.1.4.2 yamt "s%2subl %1,%3,%0")
666 1.1.1.1.4.2 yamt
667 1.1.1.1.4.2 yamt (define_insn "*ssubl_se"
668 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
669 1.1.1.1.4.2 yamt (sign_extend:DI
670 1.1.1.1.4.2 yamt (minus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r")
671 1.1.1.1.4.2 yamt (match_operand:SI 2 "const48_operand" "I"))
672 1.1.1.1.4.2 yamt (match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
673 1.1.1.1.4.2 yamt ""
674 1.1.1.1.4.2 yamt "s%2subl %1,%3,%0")
675 1.1.1.1.4.2 yamt
676 1.1.1.1.4.2 yamt (define_insn "*ssubq"
677 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
678 1.1.1.1.4.2 yamt (minus:DI (mult:DI (match_operand:DI 1 "reg_not_elim_operand" "r")
679 1.1.1.1.4.2 yamt (match_operand:DI 2 "const48_operand" "I"))
680 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")))]
681 1.1.1.1.4.2 yamt ""
682 1.1.1.1.4.2 yamt "s%2subq %1,%3,%0")
683 1.1.1.1.4.2 yamt
684 1.1.1.1.4.2 yamt (define_insn "subvdi3"
685 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
686 1.1.1.1.4.2 yamt (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
687 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")))
688 1.1.1.1.4.2 yamt (trap_if (ne (minus:TI (sign_extend:TI (match_dup 1))
689 1.1.1.1.4.2 yamt (sign_extend:TI (match_dup 2)))
690 1.1.1.1.4.2 yamt (sign_extend:TI (minus:DI (match_dup 1)
691 1.1.1.1.4.2 yamt (match_dup 2))))
692 1.1.1.1.4.2 yamt (const_int 0))]
693 1.1.1.1.4.2 yamt ""
694 1.1.1.1.4.2 yamt "subqv %r1,%2,%0")
695 1.1.1.1.4.2 yamt
696 1.1.1.1.4.2 yamt ;; The Unicos/Mk assembler doesn't support mull.
697 1.1.1.1.4.2 yamt
698 1.1.1.1.4.2 yamt (define_insn "mulsi3"
699 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
700 1.1.1.1.4.2 yamt (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
701 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "rI")))]
702 1.1.1.1.4.2 yamt "!TARGET_ABI_UNICOSMK"
703 1.1.1.1.4.2 yamt "mull %r1,%2,%0"
704 1.1.1.1.4.2 yamt [(set_attr "type" "imul")
705 1.1.1.1.4.2 yamt (set_attr "opsize" "si")])
706 1.1.1.1.4.2 yamt
707 1.1.1.1.4.2 yamt (define_insn "*mulsi_se"
708 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
709 1.1.1.1.4.2 yamt (sign_extend:DI
710 1.1.1.1.4.2 yamt (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
711 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))]
712 1.1.1.1.4.2 yamt "!TARGET_ABI_UNICOSMK"
713 1.1.1.1.4.2 yamt "mull %r1,%2,%0"
714 1.1.1.1.4.2 yamt [(set_attr "type" "imul")
715 1.1.1.1.4.2 yamt (set_attr "opsize" "si")])
716 1.1.1.1.4.2 yamt
717 1.1.1.1.4.2 yamt (define_insn "mulvsi3"
718 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
719 1.1.1.1.4.2 yamt (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
720 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "rI")))
721 1.1.1.1.4.2 yamt (trap_if (ne (mult:DI (sign_extend:DI (match_dup 1))
722 1.1.1.1.4.2 yamt (sign_extend:DI (match_dup 2)))
723 1.1.1.1.4.2 yamt (sign_extend:DI (mult:SI (match_dup 1)
724 1.1.1.1.4.2 yamt (match_dup 2))))
725 1.1.1.1.4.2 yamt (const_int 0))]
726 1.1.1.1.4.2 yamt "!TARGET_ABI_UNICOSMK"
727 1.1.1.1.4.2 yamt "mullv %r1,%2,%0"
728 1.1.1.1.4.2 yamt [(set_attr "type" "imul")
729 1.1.1.1.4.2 yamt (set_attr "opsize" "si")])
730 1.1.1.1.4.2 yamt
731 1.1.1.1.4.2 yamt (define_insn "muldi3"
732 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
733 1.1.1.1.4.2 yamt (mult:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ")
734 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")))]
735 1.1.1.1.4.2 yamt ""
736 1.1.1.1.4.2 yamt "mulq %r1,%2,%0"
737 1.1.1.1.4.2 yamt [(set_attr "type" "imul")])
738 1.1.1.1.4.2 yamt
739 1.1.1.1.4.2 yamt (define_insn "mulvdi3"
740 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
741 1.1.1.1.4.2 yamt (mult:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ")
742 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")))
743 1.1.1.1.4.2 yamt (trap_if (ne (mult:TI (sign_extend:TI (match_dup 1))
744 1.1.1.1.4.2 yamt (sign_extend:TI (match_dup 2)))
745 1.1.1.1.4.2 yamt (sign_extend:TI (mult:DI (match_dup 1)
746 1.1.1.1.4.2 yamt (match_dup 2))))
747 1.1.1.1.4.2 yamt (const_int 0))]
748 1.1.1.1.4.2 yamt ""
749 1.1.1.1.4.2 yamt "mulqv %r1,%2,%0"
750 1.1.1.1.4.2 yamt [(set_attr "type" "imul")])
751 1.1.1.1.4.2 yamt
752 1.1.1.1.4.2 yamt (define_expand "umuldi3_highpart"
753 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
754 1.1.1.1.4.2 yamt (truncate:DI
755 1.1.1.1.4.2 yamt (lshiftrt:TI
756 1.1.1.1.4.2 yamt (mult:TI (zero_extend:TI
757 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" ""))
758 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" ""))
759 1.1.1.1.4.2 yamt (const_int 64))))]
760 1.1.1.1.4.2 yamt ""
761 1.1.1.1.4.2 yamt {
762 1.1.1.1.4.2 yamt if (REG_P (operands[2]))
763 1.1.1.1.4.2 yamt operands[2] = gen_rtx_ZERO_EXTEND (TImode, operands[2]);
764 1.1.1.1.4.2 yamt })
765 1.1.1.1.4.2 yamt
766 1.1.1.1.4.2 yamt (define_insn "*umuldi3_highpart_reg"
767 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
768 1.1.1.1.4.2 yamt (truncate:DI
769 1.1.1.1.4.2 yamt (lshiftrt:TI
770 1.1.1.1.4.2 yamt (mult:TI (zero_extend:TI
771 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "r"))
772 1.1.1.1.4.2 yamt (zero_extend:TI
773 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "r")))
774 1.1.1.1.4.2 yamt (const_int 64))))]
775 1.1.1.1.4.2 yamt ""
776 1.1.1.1.4.2 yamt "umulh %1,%2,%0"
777 1.1.1.1.4.2 yamt [(set_attr "type" "imul")
778 1.1.1.1.4.2 yamt (set_attr "opsize" "udi")])
779 1.1.1.1.4.2 yamt
780 1.1.1.1.4.2 yamt (define_insn "*umuldi3_highpart_const"
781 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
782 1.1.1.1.4.2 yamt (truncate:DI
783 1.1.1.1.4.2 yamt (lshiftrt:TI
784 1.1.1.1.4.2 yamt (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "r"))
785 1.1.1.1.4.2 yamt (match_operand:TI 2 "cint8_operand" "I"))
786 1.1.1.1.4.2 yamt (const_int 64))))]
787 1.1.1.1.4.2 yamt ""
788 1.1.1.1.4.2 yamt "umulh %1,%2,%0"
789 1.1.1.1.4.2 yamt [(set_attr "type" "imul")
790 1.1.1.1.4.2 yamt (set_attr "opsize" "udi")])
791 1.1.1.1.4.2 yamt
793 1.1.1.1.4.2 yamt ;; The divide and remainder operations take their inputs from r24 and
794 1.1.1.1.4.2 yamt ;; r25, put their output in r27, and clobber r23 and r28 on all
795 1.1.1.1.4.2 yamt ;; systems except Unicos/Mk. On Unicos, the standard library provides
796 1.1.1.1.4.2 yamt ;; subroutines which use the standard calling convention and work on
797 1.1.1.1.4.2 yamt ;; DImode operands.
798 1.1.1.1.4.2 yamt
799 1.1.1.1.4.2 yamt ;; ??? Force sign-extension here because some versions of OSF/1 and
800 1.1.1.1.4.2 yamt ;; Interix/NT don't do the right thing if the inputs are not properly
801 1.1.1.1.4.2 yamt ;; sign-extended. But Linux, for instance, does not have this
802 1.1.1.1.4.2 yamt ;; problem. Is it worth the complication here to eliminate the sign
803 1.1.1.1.4.2 yamt ;; extension?
804 1.1.1.1.4.2 yamt
805 1.1.1.1.4.2 yamt (define_expand "divsi3"
806 1.1.1.1.4.2 yamt [(set (match_dup 3)
807 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))
808 1.1.1.1.4.2 yamt (set (match_dup 4)
809 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "")))
810 1.1.1.1.4.2 yamt (parallel [(set (match_dup 5)
811 1.1.1.1.4.2 yamt (sign_extend:DI (div:SI (match_dup 3) (match_dup 4))))
812 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
813 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])
814 1.1.1.1.4.2 yamt (set (match_operand:SI 0 "nonimmediate_operand" "")
815 1.1.1.1.4.2 yamt (subreg:SI (match_dup 5) 0))]
816 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
817 1.1.1.1.4.2 yamt {
818 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
819 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
820 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
821 1.1.1.1.4.2 yamt })
822 1.1.1.1.4.2 yamt
823 1.1.1.1.4.2 yamt (define_expand "udivsi3"
824 1.1.1.1.4.2 yamt [(set (match_dup 3)
825 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))
826 1.1.1.1.4.2 yamt (set (match_dup 4)
827 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "")))
828 1.1.1.1.4.2 yamt (parallel [(set (match_dup 5)
829 1.1.1.1.4.2 yamt (sign_extend:DI (udiv:SI (match_dup 3) (match_dup 4))))
830 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
831 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])
832 1.1.1.1.4.2 yamt (set (match_operand:SI 0 "nonimmediate_operand" "")
833 1.1.1.1.4.2 yamt (subreg:SI (match_dup 5) 0))]
834 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
835 1.1.1.1.4.2 yamt {
836 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
837 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
838 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
839 1.1.1.1.4.2 yamt })
840 1.1.1.1.4.2 yamt
841 1.1.1.1.4.2 yamt (define_expand "modsi3"
842 1.1.1.1.4.2 yamt [(set (match_dup 3)
843 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))
844 1.1.1.1.4.2 yamt (set (match_dup 4)
845 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "")))
846 1.1.1.1.4.2 yamt (parallel [(set (match_dup 5)
847 1.1.1.1.4.2 yamt (sign_extend:DI (mod:SI (match_dup 3) (match_dup 4))))
848 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
849 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])
850 1.1.1.1.4.2 yamt (set (match_operand:SI 0 "nonimmediate_operand" "")
851 1.1.1.1.4.2 yamt (subreg:SI (match_dup 5) 0))]
852 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
853 1.1.1.1.4.2 yamt {
854 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
855 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
856 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
857 1.1.1.1.4.2 yamt })
858 1.1.1.1.4.2 yamt
859 1.1.1.1.4.2 yamt (define_expand "umodsi3"
860 1.1.1.1.4.2 yamt [(set (match_dup 3)
861 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))
862 1.1.1.1.4.2 yamt (set (match_dup 4)
863 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "")))
864 1.1.1.1.4.2 yamt (parallel [(set (match_dup 5)
865 1.1.1.1.4.2 yamt (sign_extend:DI (umod:SI (match_dup 3) (match_dup 4))))
866 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
867 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])
868 1.1.1.1.4.2 yamt (set (match_operand:SI 0 "nonimmediate_operand" "")
869 1.1.1.1.4.2 yamt (subreg:SI (match_dup 5) 0))]
870 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
871 1.1.1.1.4.2 yamt {
872 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
873 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
874 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
875 1.1.1.1.4.2 yamt })
876 1.1.1.1.4.2 yamt
877 1.1.1.1.4.2 yamt (define_expand "divdi3"
878 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:DI 0 "register_operand" "")
879 1.1.1.1.4.2 yamt (div:DI (match_operand:DI 1 "register_operand" "")
880 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "")))
881 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
882 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])]
883 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
884 1.1.1.1.4.2 yamt "")
885 1.1.1.1.4.2 yamt
886 1.1.1.1.4.2 yamt (define_expand "udivdi3"
887 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:DI 0 "register_operand" "")
888 1.1.1.1.4.2 yamt (udiv:DI (match_operand:DI 1 "register_operand" "")
889 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "")))
890 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
891 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])]
892 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
893 1.1.1.1.4.2 yamt "")
894 1.1.1.1.4.2 yamt
895 1.1.1.1.4.2 yamt (define_expand "moddi3"
896 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
897 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "register_operand" ""))
898 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))]
899 1.1.1.1.4.2 yamt "!TARGET_ABI_OPEN_VMS"
900 1.1.1.1.4.2 yamt {
901 1.1.1.1.4.2 yamt if (TARGET_ABI_UNICOSMK)
902 1.1.1.1.4.2 yamt emit_insn (gen_moddi3_umk (operands[0], operands[1], operands[2]));
903 1.1.1.1.4.2 yamt else
904 1.1.1.1.4.2 yamt emit_insn (gen_moddi3_dft (operands[0], operands[1], operands[2]));
905 1.1.1.1.4.2 yamt DONE;
906 1.1.1.1.4.2 yamt })
907 1.1.1.1.4.2 yamt
908 1.1.1.1.4.2 yamt (define_expand "moddi3_dft"
909 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:DI 0 "register_operand" "")
910 1.1.1.1.4.2 yamt (mod:DI (match_operand:DI 1 "register_operand" "")
911 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "")))
912 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
913 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])]
914 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
915 1.1.1.1.4.2 yamt "")
916 1.1.1.1.4.2 yamt
917 1.1.1.1.4.2 yamt ;; On Unicos/Mk, we do as the system's C compiler does:
918 1.1.1.1.4.2 yamt ;; compute the quotient, multiply and subtract.
919 1.1.1.1.4.2 yamt
920 1.1.1.1.4.2 yamt (define_expand "moddi3_umk"
921 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
922 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "register_operand" ""))
923 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))]
924 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
925 1.1.1.1.4.2 yamt {
926 1.1.1.1.4.2 yamt rtx div, mul = gen_reg_rtx (DImode);
927 1.1.1.1.4.2 yamt
928 1.1.1.1.4.2 yamt div = expand_binop (DImode, sdiv_optab, operands[1], operands[2],
929 1.1.1.1.4.2 yamt NULL_RTX, 0, OPTAB_LIB);
930 1.1.1.1.4.2 yamt div = force_reg (DImode, div);
931 1.1.1.1.4.2 yamt emit_insn (gen_muldi3 (mul, operands[2], div));
932 1.1.1.1.4.2 yamt emit_insn (gen_subdi3 (operands[0], operands[1], mul));
933 1.1.1.1.4.2 yamt DONE;
934 1.1.1.1.4.2 yamt })
935 1.1.1.1.4.2 yamt
936 1.1.1.1.4.2 yamt (define_expand "umoddi3"
937 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
938 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "register_operand" ""))
939 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))]
940 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS"
941 1.1.1.1.4.2 yamt {
942 1.1.1.1.4.2 yamt if (TARGET_ABI_UNICOSMK)
943 1.1.1.1.4.2 yamt emit_insn (gen_umoddi3_umk (operands[0], operands[1], operands[2]));
944 1.1.1.1.4.2 yamt else
945 1.1.1.1.4.2 yamt emit_insn (gen_umoddi3_dft (operands[0], operands[1], operands[2]));
946 1.1.1.1.4.2 yamt DONE;
947 1.1.1.1.4.2 yamt })
948 1.1.1.1.4.2 yamt
949 1.1.1.1.4.2 yamt (define_expand "umoddi3_dft"
950 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:DI 0 "register_operand" "")
951 1.1.1.1.4.2 yamt (umod:DI (match_operand:DI 1 "register_operand" "")
952 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "")))
953 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
954 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])]
955 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
956 1.1.1.1.4.2 yamt "")
957 1.1.1.1.4.2 yamt
958 1.1.1.1.4.2 yamt (define_expand "umoddi3_umk"
959 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
960 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "register_operand" ""))
961 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))]
962 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
963 1.1.1.1.4.2 yamt {
964 1.1.1.1.4.2 yamt rtx div, mul = gen_reg_rtx (DImode);
965 1.1.1.1.4.2 yamt
966 1.1.1.1.4.2 yamt div = expand_binop (DImode, udiv_optab, operands[1], operands[2],
967 1.1.1.1.4.2 yamt NULL_RTX, 1, OPTAB_LIB);
968 1.1.1.1.4.2 yamt div = force_reg (DImode, div);
969 1.1.1.1.4.2 yamt emit_insn (gen_muldi3 (mul, operands[2], div));
970 1.1.1.1.4.2 yamt emit_insn (gen_subdi3 (operands[0], operands[1], mul));
971 1.1.1.1.4.2 yamt DONE;
972 1.1.1.1.4.2 yamt })
973 1.1.1.1.4.2 yamt
974 1.1.1.1.4.2 yamt ;; Lengths of 8 for ldq $t12,__divq($gp); jsr $t9,($t12),__divq as
975 1.1.1.1.4.2 yamt ;; expanded by the assembler.
976 1.1.1.1.4.2 yamt
977 1.1.1.1.4.2 yamt (define_insn_and_split "*divmodsi_internal_er"
978 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=c")
979 1.1.1.1.4.2 yamt (sign_extend:DI (match_operator:SI 3 "divmod_operator"
980 1.1.1.1.4.2 yamt [(match_operand:DI 1 "register_operand" "a")
981 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "b")])))
982 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
983 1.1.1.1.4.2 yamt (clobber (reg:DI 28))]
984 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
985 1.1.1.1.4.2 yamt "#"
986 1.1.1.1.4.2 yamt "&& reload_completed"
987 1.1.1.1.4.2 yamt [(parallel [(set (match_dup 0)
988 1.1.1.1.4.2 yamt (sign_extend:DI (match_dup 3)))
989 1.1.1.1.4.2 yamt (use (match_dup 0))
990 1.1.1.1.4.2 yamt (use (match_dup 4))
991 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
992 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])]
993 1.1.1.1.4.2 yamt {
994 1.1.1.1.4.2 yamt const char *str;
995 1.1.1.1.4.2 yamt switch (GET_CODE (operands[3]))
996 1.1.1.1.4.2 yamt {
997 1.1.1.1.4.2 yamt case DIV:
998 1.1.1.1.4.2 yamt str = "__divl";
999 1.1.1.1.4.2 yamt break;
1000 1.1.1.1.4.2 yamt case UDIV:
1001 1.1.1.1.4.2 yamt str = "__divlu";
1002 1.1.1.1.4.2 yamt break;
1003 1.1.1.1.4.2 yamt case MOD:
1004 1.1.1.1.4.2 yamt str = "__reml";
1005 1.1.1.1.4.2 yamt break;
1006 1.1.1.1.4.2 yamt case UMOD:
1007 1.1.1.1.4.2 yamt str = "__remlu";
1008 1.1.1.1.4.2 yamt break;
1009 1.1.1.1.4.2 yamt default:
1010 1.1.1.1.4.2 yamt gcc_unreachable ();
1011 1.1.1.1.4.2 yamt }
1012 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
1013 1.1.1.1.4.2 yamt emit_insn (gen_movdi_er_high_g (operands[0], pic_offset_table_rtx,
1014 1.1.1.1.4.2 yamt gen_rtx_SYMBOL_REF (DImode, str),
1015 1.1.1.1.4.2 yamt operands[4]));
1016 1.1.1.1.4.2 yamt }
1017 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
1018 1.1.1.1.4.2 yamt (set_attr "length" "8")])
1019 1.1.1.1.4.2 yamt
1020 1.1.1.1.4.2 yamt (define_insn "*divmodsi_internal_er_1"
1021 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=c")
1022 1.1.1.1.4.2 yamt (sign_extend:DI (match_operator:SI 3 "divmod_operator"
1023 1.1.1.1.4.2 yamt [(match_operand:DI 1 "register_operand" "a")
1024 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "b")])))
1025 1.1.1.1.4.2 yamt (use (match_operand:DI 4 "register_operand" "c"))
1026 1.1.1.1.4.2 yamt (use (match_operand 5 "const_int_operand" ""))
1027 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
1028 1.1.1.1.4.2 yamt (clobber (reg:DI 28))]
1029 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
1030 1.1.1.1.4.2 yamt "jsr $23,($27),__%E3%j5"
1031 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
1032 1.1.1.1.4.2 yamt (set_attr "length" "4")])
1033 1.1.1.1.4.2 yamt
1034 1.1.1.1.4.2 yamt (define_insn "*divmodsi_internal"
1035 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=c")
1036 1.1.1.1.4.2 yamt (sign_extend:DI (match_operator:SI 3 "divmod_operator"
1037 1.1.1.1.4.2 yamt [(match_operand:DI 1 "register_operand" "a")
1038 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "b")])))
1039 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
1040 1.1.1.1.4.2 yamt (clobber (reg:DI 28))]
1041 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
1042 1.1.1.1.4.2 yamt "%E3 %1,%2,%0"
1043 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
1044 1.1.1.1.4.2 yamt (set_attr "length" "8")])
1045 1.1.1.1.4.2 yamt
1046 1.1.1.1.4.2 yamt (define_insn_and_split "*divmoddi_internal_er"
1047 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=c")
1048 1.1.1.1.4.2 yamt (match_operator:DI 3 "divmod_operator"
1049 1.1.1.1.4.2 yamt [(match_operand:DI 1 "register_operand" "a")
1050 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "b")]))
1051 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
1052 1.1.1.1.4.2 yamt (clobber (reg:DI 28))]
1053 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
1054 1.1.1.1.4.2 yamt "#"
1055 1.1.1.1.4.2 yamt "&& reload_completed"
1056 1.1.1.1.4.2 yamt [(parallel [(set (match_dup 0) (match_dup 3))
1057 1.1.1.1.4.2 yamt (use (match_dup 0))
1058 1.1.1.1.4.2 yamt (use (match_dup 4))
1059 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
1060 1.1.1.1.4.2 yamt (clobber (reg:DI 28))])]
1061 1.1.1.1.4.2 yamt {
1062 1.1.1.1.4.2 yamt const char *str;
1063 1.1.1.1.4.2 yamt switch (GET_CODE (operands[3]))
1064 1.1.1.1.4.2 yamt {
1065 1.1.1.1.4.2 yamt case DIV:
1066 1.1.1.1.4.2 yamt str = "__divq";
1067 1.1.1.1.4.2 yamt break;
1068 1.1.1.1.4.2 yamt case UDIV:
1069 1.1.1.1.4.2 yamt str = "__divqu";
1070 1.1.1.1.4.2 yamt break;
1071 1.1.1.1.4.2 yamt case MOD:
1072 1.1.1.1.4.2 yamt str = "__remq";
1073 1.1.1.1.4.2 yamt break;
1074 1.1.1.1.4.2 yamt case UMOD:
1075 1.1.1.1.4.2 yamt str = "__remqu";
1076 1.1.1.1.4.2 yamt break;
1077 1.1.1.1.4.2 yamt default:
1078 1.1.1.1.4.2 yamt gcc_unreachable ();
1079 1.1.1.1.4.2 yamt }
1080 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
1081 1.1.1.1.4.2 yamt emit_insn (gen_movdi_er_high_g (operands[0], pic_offset_table_rtx,
1082 1.1.1.1.4.2 yamt gen_rtx_SYMBOL_REF (DImode, str),
1083 1.1.1.1.4.2 yamt operands[4]));
1084 1.1.1.1.4.2 yamt }
1085 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
1086 1.1.1.1.4.2 yamt (set_attr "length" "8")])
1087 1.1.1.1.4.2 yamt
1088 1.1.1.1.4.2 yamt (define_insn "*divmoddi_internal_er_1"
1089 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=c")
1090 1.1.1.1.4.2 yamt (match_operator:DI 3 "divmod_operator"
1091 1.1.1.1.4.2 yamt [(match_operand:DI 1 "register_operand" "a")
1092 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "b")]))
1093 1.1.1.1.4.2 yamt (use (match_operand:DI 4 "register_operand" "c"))
1094 1.1.1.1.4.2 yamt (use (match_operand 5 "const_int_operand" ""))
1095 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
1096 1.1.1.1.4.2 yamt (clobber (reg:DI 28))]
1097 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
1098 1.1.1.1.4.2 yamt "jsr $23,($27),__%E3%j5"
1099 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
1100 1.1.1.1.4.2 yamt (set_attr "length" "4")])
1101 1.1.1.1.4.2 yamt
1102 1.1.1.1.4.2 yamt (define_insn "*divmoddi_internal"
1103 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=c")
1104 1.1.1.1.4.2 yamt (match_operator:DI 3 "divmod_operator"
1105 1.1.1.1.4.2 yamt [(match_operand:DI 1 "register_operand" "a")
1106 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "b")]))
1107 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
1108 1.1.1.1.4.2 yamt (clobber (reg:DI 28))]
1109 1.1.1.1.4.2 yamt "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"
1110 1.1.1.1.4.2 yamt "%E3 %1,%2,%0"
1111 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
1112 1.1.1.1.4.2 yamt (set_attr "length" "8")])
1113 1.1.1.1.4.2 yamt
1115 1.1.1.1.4.2 yamt ;; Next are the basic logical operations. We only expose the DImode operations
1116 1.1.1.1.4.2 yamt ;; to the rtl expanders, but SImode versions exist for combine as well as for
1117 1.1.1.1.4.2 yamt ;; the atomic operation splitters.
1118 1.1.1.1.4.2 yamt
1119 1.1.1.1.4.2 yamt (define_insn "*andsi_internal"
1120 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r,r")
1121 1.1.1.1.4.2 yamt (and:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ,rJ")
1122 1.1.1.1.4.2 yamt (match_operand:SI 2 "and_operand" "rI,N,MH")))]
1123 1.1.1.1.4.2 yamt ""
1124 1.1.1.1.4.2 yamt "@
1125 1.1.1.1.4.2 yamt and %r1,%2,%0
1126 1.1.1.1.4.2 yamt bic %r1,%N2,%0
1127 1.1.1.1.4.2 yamt zapnot %r1,%m2,%0"
1128 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ilog,shift")])
1129 1.1.1.1.4.2 yamt
1130 1.1.1.1.4.2 yamt (define_insn "anddi3"
1131 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r,r")
1132 1.1.1.1.4.2 yamt (and:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ,rJ")
1133 1.1.1.1.4.2 yamt (match_operand:DI 2 "and_operand" "rI,N,MH")))]
1134 1.1.1.1.4.2 yamt ""
1135 1.1.1.1.4.2 yamt "@
1136 1.1.1.1.4.2 yamt and %r1,%2,%0
1137 1.1.1.1.4.2 yamt bic %r1,%N2,%0
1138 1.1.1.1.4.2 yamt zapnot %r1,%m2,%0"
1139 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ilog,shift")])
1140 1.1.1.1.4.2 yamt
1141 1.1.1.1.4.2 yamt ;; There are times when we can split an AND into two AND insns. This occurs
1142 1.1.1.1.4.2 yamt ;; when we can first clear any bytes and then clear anything else. For
1143 1.1.1.1.4.2 yamt ;; example "I & 0xffff07" is "(I & 0xffffff) & 0xffffffffffffff07".
1144 1.1.1.1.4.2 yamt ;; Only do this when running on 64-bit host since the computations are
1145 1.1.1.1.4.2 yamt ;; too messy otherwise.
1146 1.1.1.1.4.2 yamt
1147 1.1.1.1.4.2 yamt (define_split
1148 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
1149 1.1.1.1.4.2 yamt (and:DI (match_operand:DI 1 "register_operand" "")
1150 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "")))]
1151 1.1.1.1.4.2 yamt "HOST_BITS_PER_WIDE_INT == 64 && ! and_operand (operands[2], DImode)"
1152 1.1.1.1.4.2 yamt [(set (match_dup 0) (and:DI (match_dup 1) (match_dup 3)))
1153 1.1.1.1.4.2 yamt (set (match_dup 0) (and:DI (match_dup 0) (match_dup 4)))]
1154 1.1.1.1.4.2 yamt {
1155 1.1.1.1.4.2 yamt unsigned HOST_WIDE_INT mask1 = INTVAL (operands[2]);
1156 1.1.1.1.4.2 yamt unsigned HOST_WIDE_INT mask2 = mask1;
1157 1.1.1.1.4.2 yamt int i;
1158 1.1.1.1.4.2 yamt
1159 1.1.1.1.4.2 yamt /* For each byte that isn't all zeros, make it all ones. */
1160 1.1.1.1.4.2 yamt for (i = 0; i < 64; i += 8)
1161 1.1.1.1.4.2 yamt if ((mask1 & ((HOST_WIDE_INT) 0xff << i)) != 0)
1162 1.1.1.1.4.2 yamt mask1 |= (HOST_WIDE_INT) 0xff << i;
1163 1.1.1.1.4.2 yamt
1164 1.1.1.1.4.2 yamt /* Now turn on any bits we've just turned off. */
1165 1.1.1.1.4.2 yamt mask2 |= ~ mask1;
1166 1.1.1.1.4.2 yamt
1167 1.1.1.1.4.2 yamt operands[3] = GEN_INT (mask1);
1168 1.1.1.1.4.2 yamt operands[4] = GEN_INT (mask2);
1169 1.1.1.1.4.2 yamt })
1170 1.1.1.1.4.2 yamt
1171 1.1.1.1.4.2 yamt (define_expand "zero_extendqihi2"
1172 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "")
1173 1.1.1.1.4.2 yamt (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]
1174 1.1.1.1.4.2 yamt ""
1175 1.1.1.1.4.2 yamt {
1176 1.1.1.1.4.2 yamt if (! TARGET_BWX)
1177 1.1.1.1.4.2 yamt operands[1] = force_reg (QImode, operands[1]);
1178 1.1.1.1.4.2 yamt })
1179 1.1.1.1.4.2 yamt
1180 1.1.1.1.4.2 yamt (define_insn "*zero_extendqihi2_bwx"
1181 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r,r")
1182 1.1.1.1.4.2 yamt (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
1183 1.1.1.1.4.2 yamt "TARGET_BWX"
1184 1.1.1.1.4.2 yamt "@
1185 1.1.1.1.4.2 yamt and %1,0xff,%0
1186 1.1.1.1.4.2 yamt ldbu %0,%1"
1187 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ild")])
1188 1.1.1.1.4.2 yamt
1189 1.1.1.1.4.2 yamt (define_insn "*zero_extendqihi2_nobwx"
1190 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r")
1191 1.1.1.1.4.2 yamt (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))]
1192 1.1.1.1.4.2 yamt "! TARGET_BWX"
1193 1.1.1.1.4.2 yamt "and %1,0xff,%0"
1194 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1195 1.1.1.1.4.2 yamt
1196 1.1.1.1.4.2 yamt (define_expand "zero_extendqisi2"
1197 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "")
1198 1.1.1.1.4.2 yamt (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
1199 1.1.1.1.4.2 yamt ""
1200 1.1.1.1.4.2 yamt {
1201 1.1.1.1.4.2 yamt if (! TARGET_BWX)
1202 1.1.1.1.4.2 yamt operands[1] = force_reg (QImode, operands[1]);
1203 1.1.1.1.4.2 yamt })
1204 1.1.1.1.4.2 yamt
1205 1.1.1.1.4.2 yamt (define_insn "*zero_extendqisi2_bwx"
1206 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
1207 1.1.1.1.4.2 yamt (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
1208 1.1.1.1.4.2 yamt "TARGET_BWX"
1209 1.1.1.1.4.2 yamt "@
1210 1.1.1.1.4.2 yamt and %1,0xff,%0
1211 1.1.1.1.4.2 yamt ldbu %0,%1"
1212 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ild")])
1213 1.1.1.1.4.2 yamt
1214 1.1.1.1.4.2 yamt (define_insn "*zero_extendqisi2_nobwx"
1215 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1216 1.1.1.1.4.2 yamt (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))]
1217 1.1.1.1.4.2 yamt "! TARGET_BWX"
1218 1.1.1.1.4.2 yamt "and %1,0xff,%0"
1219 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1220 1.1.1.1.4.2 yamt
1221 1.1.1.1.4.2 yamt (define_expand "zero_extendqidi2"
1222 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
1223 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "")))]
1224 1.1.1.1.4.2 yamt ""
1225 1.1.1.1.4.2 yamt {
1226 1.1.1.1.4.2 yamt if (! TARGET_BWX)
1227 1.1.1.1.4.2 yamt operands[1] = force_reg (QImode, operands[1]);
1228 1.1.1.1.4.2 yamt })
1229 1.1.1.1.4.2 yamt
1230 1.1.1.1.4.2 yamt (define_insn "*zero_extendqidi2_bwx"
1231 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
1232 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
1233 1.1.1.1.4.2 yamt "TARGET_BWX"
1234 1.1.1.1.4.2 yamt "@
1235 1.1.1.1.4.2 yamt and %1,0xff,%0
1236 1.1.1.1.4.2 yamt ldbu %0,%1"
1237 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ild")])
1238 1.1.1.1.4.2 yamt
1239 1.1.1.1.4.2 yamt (define_insn "*zero_extendqidi2_nobwx"
1240 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1241 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
1242 1.1.1.1.4.2 yamt "! TARGET_BWX"
1243 1.1.1.1.4.2 yamt "and %1,0xff,%0"
1244 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1245 1.1.1.1.4.2 yamt
1246 1.1.1.1.4.2 yamt (define_expand "zero_extendhisi2"
1247 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "")
1248 1.1.1.1.4.2 yamt (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
1249 1.1.1.1.4.2 yamt ""
1250 1.1.1.1.4.2 yamt {
1251 1.1.1.1.4.2 yamt if (! TARGET_BWX)
1252 1.1.1.1.4.2 yamt operands[1] = force_reg (HImode, operands[1]);
1253 1.1.1.1.4.2 yamt })
1254 1.1.1.1.4.2 yamt
1255 1.1.1.1.4.2 yamt (define_insn "*zero_extendhisi2_bwx"
1256 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
1257 1.1.1.1.4.2 yamt (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
1258 1.1.1.1.4.2 yamt "TARGET_BWX"
1259 1.1.1.1.4.2 yamt "@
1260 1.1.1.1.4.2 yamt zapnot %1,3,%0
1261 1.1.1.1.4.2 yamt ldwu %0,%1"
1262 1.1.1.1.4.2 yamt [(set_attr "type" "shift,ild")])
1263 1.1.1.1.4.2 yamt
1264 1.1.1.1.4.2 yamt (define_insn "*zero_extendhisi2_nobwx"
1265 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1266 1.1.1.1.4.2 yamt (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))]
1267 1.1.1.1.4.2 yamt "! TARGET_BWX"
1268 1.1.1.1.4.2 yamt "zapnot %1,3,%0"
1269 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1270 1.1.1.1.4.2 yamt
1271 1.1.1.1.4.2 yamt (define_expand "zero_extendhidi2"
1272 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
1273 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:HI 1 "nonimmediate_operand" "")))]
1274 1.1.1.1.4.2 yamt ""
1275 1.1.1.1.4.2 yamt {
1276 1.1.1.1.4.2 yamt if (! TARGET_BWX)
1277 1.1.1.1.4.2 yamt operands[1] = force_reg (HImode, operands[1]);
1278 1.1.1.1.4.2 yamt })
1279 1.1.1.1.4.2 yamt
1280 1.1.1.1.4.2 yamt (define_insn "*zero_extendhidi2_bwx"
1281 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
1282 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
1283 1.1.1.1.4.2 yamt "TARGET_BWX"
1284 1.1.1.1.4.2 yamt "@
1285 1.1.1.1.4.2 yamt zapnot %1,3,%0
1286 1.1.1.1.4.2 yamt ldwu %0,%1"
1287 1.1.1.1.4.2 yamt [(set_attr "type" "shift,ild")])
1288 1.1.1.1.4.2 yamt
1289 1.1.1.1.4.2 yamt (define_insn "*zero_extendhidi2_nobwx"
1290 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1291 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
1292 1.1.1.1.4.2 yamt ""
1293 1.1.1.1.4.2 yamt "zapnot %1,3,%0"
1294 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1295 1.1.1.1.4.2 yamt
1296 1.1.1.1.4.2 yamt (define_insn "zero_extendsidi2"
1297 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1298 1.1.1.1.4.2 yamt (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
1299 1.1.1.1.4.2 yamt ""
1300 1.1.1.1.4.2 yamt "zapnot %1,15,%0"
1301 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1302 1.1.1.1.4.2 yamt
1303 1.1.1.1.4.2 yamt (define_insn "*andnotsi3"
1304 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1305 1.1.1.1.4.2 yamt (and:SI (not:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI"))
1306 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_0_operand" "rJ")))]
1307 1.1.1.1.4.2 yamt ""
1308 1.1.1.1.4.2 yamt "bic %r2,%1,%0"
1309 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1310 1.1.1.1.4.2 yamt
1311 1.1.1.1.4.2 yamt (define_insn "andnotdi3"
1312 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1313 1.1.1.1.4.2 yamt (and:DI (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI"))
1314 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "rJ")))]
1315 1.1.1.1.4.2 yamt ""
1316 1.1.1.1.4.2 yamt "bic %r2,%1,%0"
1317 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1318 1.1.1.1.4.2 yamt
1319 1.1.1.1.4.2 yamt (define_insn "*iorsi_internal"
1320 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
1321 1.1.1.1.4.2 yamt (ior:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
1322 1.1.1.1.4.2 yamt (match_operand:SI 2 "or_operand" "rI,N")))]
1323 1.1.1.1.4.2 yamt ""
1324 1.1.1.1.4.2 yamt "@
1325 1.1.1.1.4.2 yamt bis %r1,%2,%0
1326 1.1.1.1.4.2 yamt ornot %r1,%N2,%0"
1327 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1328 1.1.1.1.4.2 yamt
1329 1.1.1.1.4.2 yamt (define_insn "iordi3"
1330 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
1331 1.1.1.1.4.2 yamt (ior:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
1332 1.1.1.1.4.2 yamt (match_operand:DI 2 "or_operand" "rI,N")))]
1333 1.1.1.1.4.2 yamt ""
1334 1.1.1.1.4.2 yamt "@
1335 1.1.1.1.4.2 yamt bis %r1,%2,%0
1336 1.1.1.1.4.2 yamt ornot %r1,%N2,%0"
1337 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1338 1.1.1.1.4.2 yamt
1339 1.1.1.1.4.2 yamt (define_insn "*one_cmplsi_internal"
1340 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1341 1.1.1.1.4.2 yamt (not:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI")))]
1342 1.1.1.1.4.2 yamt ""
1343 1.1.1.1.4.2 yamt "ornot $31,%1,%0"
1344 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1345 1.1.1.1.4.2 yamt
1346 1.1.1.1.4.2 yamt (define_insn "one_cmpldi2"
1347 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1348 1.1.1.1.4.2 yamt (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")))]
1349 1.1.1.1.4.2 yamt ""
1350 1.1.1.1.4.2 yamt "ornot $31,%1,%0"
1351 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1352 1.1.1.1.4.2 yamt
1353 1.1.1.1.4.2 yamt (define_insn "*iornotsi3"
1354 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1355 1.1.1.1.4.2 yamt (ior:SI (not:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI"))
1356 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_0_operand" "rJ")))]
1357 1.1.1.1.4.2 yamt ""
1358 1.1.1.1.4.2 yamt "ornot %r2,%1,%0"
1359 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1360 1.1.1.1.4.2 yamt
1361 1.1.1.1.4.2 yamt (define_insn "*iornotdi3"
1362 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1363 1.1.1.1.4.2 yamt (ior:DI (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI"))
1364 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "rJ")))]
1365 1.1.1.1.4.2 yamt ""
1366 1.1.1.1.4.2 yamt "ornot %r2,%1,%0"
1367 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1368 1.1.1.1.4.2 yamt
1369 1.1.1.1.4.2 yamt (define_insn "*xorsi_internal"
1370 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
1371 1.1.1.1.4.2 yamt (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
1372 1.1.1.1.4.2 yamt (match_operand:SI 2 "or_operand" "rI,N")))]
1373 1.1.1.1.4.2 yamt ""
1374 1.1.1.1.4.2 yamt "@
1375 1.1.1.1.4.2 yamt xor %r1,%2,%0
1376 1.1.1.1.4.2 yamt eqv %r1,%N2,%0"
1377 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1378 1.1.1.1.4.2 yamt
1379 1.1.1.1.4.2 yamt (define_insn "xordi3"
1380 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
1381 1.1.1.1.4.2 yamt (xor:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
1382 1.1.1.1.4.2 yamt (match_operand:DI 2 "or_operand" "rI,N")))]
1383 1.1.1.1.4.2 yamt ""
1384 1.1.1.1.4.2 yamt "@
1385 1.1.1.1.4.2 yamt xor %r1,%2,%0
1386 1.1.1.1.4.2 yamt eqv %r1,%N2,%0"
1387 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1388 1.1.1.1.4.2 yamt
1389 1.1.1.1.4.2 yamt (define_insn "*xornotsi3"
1390 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1391 1.1.1.1.4.2 yamt (not:SI (xor:SI (match_operand:SI 1 "register_operand" "%rJ")
1392 1.1.1.1.4.2 yamt (match_operand:SI 2 "register_operand" "rI"))))]
1393 1.1.1.1.4.2 yamt ""
1394 1.1.1.1.4.2 yamt "eqv %r1,%2,%0"
1395 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1396 1.1.1.1.4.2 yamt
1397 1.1.1.1.4.2 yamt (define_insn "*xornotdi3"
1398 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1399 1.1.1.1.4.2 yamt (not:DI (xor:DI (match_operand:DI 1 "register_operand" "%rJ")
1400 1.1.1.1.4.2 yamt (match_operand:DI 2 "register_operand" "rI"))))]
1401 1.1.1.1.4.2 yamt ""
1402 1.1.1.1.4.2 yamt "eqv %r1,%2,%0"
1403 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
1404 1.1.1.1.4.2 yamt
1406 1.1.1.1.4.2 yamt ;; Handle FFS and related insns iff we support CIX.
1407 1.1.1.1.4.2 yamt
1408 1.1.1.1.4.2 yamt (define_expand "ffsdi2"
1409 1.1.1.1.4.2 yamt [(set (match_dup 2)
1410 1.1.1.1.4.2 yamt (ctz:DI (match_operand:DI 1 "register_operand" "")))
1411 1.1.1.1.4.2 yamt (set (match_dup 3)
1412 1.1.1.1.4.2 yamt (plus:DI (match_dup 2) (const_int 1)))
1413 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1414 1.1.1.1.4.2 yamt (if_then_else:DI (eq (match_dup 1) (const_int 0))
1415 1.1.1.1.4.2 yamt (const_int 0) (match_dup 3)))]
1416 1.1.1.1.4.2 yamt "TARGET_CIX"
1417 1.1.1.1.4.2 yamt {
1418 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
1419 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
1420 1.1.1.1.4.2 yamt })
1421 1.1.1.1.4.2 yamt
1422 1.1.1.1.4.2 yamt (define_insn "clzdi2"
1423 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1424 1.1.1.1.4.2 yamt (clz:DI (match_operand:DI 1 "register_operand" "r")))]
1425 1.1.1.1.4.2 yamt "TARGET_CIX"
1426 1.1.1.1.4.2 yamt "ctlz %1,%0"
1427 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
1428 1.1.1.1.4.2 yamt
1429 1.1.1.1.4.2 yamt (define_insn "ctzdi2"
1430 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1431 1.1.1.1.4.2 yamt (ctz:DI (match_operand:DI 1 "register_operand" "r")))]
1432 1.1.1.1.4.2 yamt "TARGET_CIX"
1433 1.1.1.1.4.2 yamt "cttz %1,%0"
1434 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
1435 1.1.1.1.4.2 yamt
1436 1.1.1.1.4.2 yamt (define_insn "popcountdi2"
1437 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1438 1.1.1.1.4.2 yamt (popcount:DI (match_operand:DI 1 "register_operand" "r")))]
1439 1.1.1.1.4.2 yamt "TARGET_CIX"
1440 1.1.1.1.4.2 yamt "ctpop %1,%0"
1441 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
1442 1.1.1.1.4.2 yamt
1443 1.1.1.1.4.2 yamt (define_expand "bswapsi2"
1444 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "")
1445 1.1.1.1.4.2 yamt (bswap:SI (match_operand:SI 1 "register_operand" "")))]
1446 1.1.1.1.4.2 yamt "!optimize_size"
1447 1.1.1.1.4.2 yamt {
1448 1.1.1.1.4.2 yamt rtx t0, t1;
1449 1.1.1.1.4.2 yamt
1450 1.1.1.1.4.2 yamt t0 = gen_reg_rtx (DImode);
1451 1.1.1.1.4.2 yamt t1 = gen_reg_rtx (DImode);
1452 1.1.1.1.4.2 yamt
1453 1.1.1.1.4.2 yamt emit_insn (gen_insxh (t0, gen_lowpart (DImode, operands[1]),
1454 1.1.1.1.4.2 yamt GEN_INT (32), GEN_INT (WORDS_BIG_ENDIAN ? 0 : 7)));
1455 1.1.1.1.4.2 yamt emit_insn (gen_inswl_const (t1, gen_lowpart (HImode, operands[1]),
1456 1.1.1.1.4.2 yamt GEN_INT (24)));
1457 1.1.1.1.4.2 yamt emit_insn (gen_iordi3 (t1, t0, t1));
1458 1.1.1.1.4.2 yamt emit_insn (gen_lshrdi3 (t0, t1, GEN_INT (16)));
1459 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (t1, t1, alpha_expand_zap_mask (0x5)));
1460 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (t0, t0, alpha_expand_zap_mask (0xa)));
1461 1.1.1.1.4.2 yamt emit_insn (gen_addsi3 (operands[0], gen_lowpart (SImode, t0),
1462 1.1.1.1.4.2 yamt gen_lowpart (SImode, t1)));
1463 1.1.1.1.4.2 yamt DONE;
1464 1.1.1.1.4.2 yamt })
1465 1.1.1.1.4.2 yamt
1466 1.1.1.1.4.2 yamt (define_expand "bswapdi2"
1467 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
1468 1.1.1.1.4.2 yamt (bswap:DI (match_operand:DI 1 "register_operand" "")))]
1469 1.1.1.1.4.2 yamt "!optimize_size"
1470 1.1.1.1.4.2 yamt {
1471 1.1.1.1.4.2 yamt rtx t0, t1;
1472 1.1.1.1.4.2 yamt
1473 1.1.1.1.4.2 yamt t0 = gen_reg_rtx (DImode);
1474 1.1.1.1.4.2 yamt t1 = gen_reg_rtx (DImode);
1475 1.1.1.1.4.2 yamt
1476 1.1.1.1.4.2 yamt /* This method of shifting and masking is not specific to Alpha, but
1477 1.1.1.1.4.2 yamt is only profitable on Alpha because of our handy byte zap insn. */
1478 1.1.1.1.4.2 yamt
1479 1.1.1.1.4.2 yamt emit_insn (gen_lshrdi3 (t0, operands[1], GEN_INT (32)));
1480 1.1.1.1.4.2 yamt emit_insn (gen_ashldi3 (t1, operands[1], GEN_INT (32)));
1481 1.1.1.1.4.2 yamt emit_insn (gen_iordi3 (t1, t0, t1));
1482 1.1.1.1.4.2 yamt
1483 1.1.1.1.4.2 yamt emit_insn (gen_lshrdi3 (t0, t1, GEN_INT (16)));
1484 1.1.1.1.4.2 yamt emit_insn (gen_ashldi3 (t1, t1, GEN_INT (16)));
1485 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (t0, t0, alpha_expand_zap_mask (0xcc)));
1486 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (t1, t1, alpha_expand_zap_mask (0x33)));
1487 1.1.1.1.4.2 yamt emit_insn (gen_iordi3 (t1, t0, t1));
1488 1.1.1.1.4.2 yamt
1489 1.1.1.1.4.2 yamt emit_insn (gen_lshrdi3 (t0, t1, GEN_INT (8)));
1490 1.1.1.1.4.2 yamt emit_insn (gen_ashldi3 (t1, t1, GEN_INT (8)));
1491 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (t0, t0, alpha_expand_zap_mask (0xaa)));
1492 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (t1, t1, alpha_expand_zap_mask (0x55)));
1493 1.1.1.1.4.2 yamt emit_insn (gen_iordi3 (operands[0], t0, t1));
1494 1.1.1.1.4.2 yamt DONE;
1495 1.1.1.1.4.2 yamt })
1496 1.1.1.1.4.2 yamt
1498 1.1.1.1.4.2 yamt ;; Next come the shifts and the various extract and insert operations.
1499 1.1.1.1.4.2 yamt
1500 1.1.1.1.4.2 yamt (define_insn "ashldi3"
1501 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
1502 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ,rJ")
1503 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_6bit_operand" "P,rS")))]
1504 1.1.1.1.4.2 yamt ""
1505 1.1.1.1.4.2 yamt {
1506 1.1.1.1.4.2 yamt switch (which_alternative)
1507 1.1.1.1.4.2 yamt {
1508 1.1.1.1.4.2 yamt case 0:
1509 1.1.1.1.4.2 yamt if (operands[2] == const1_rtx)
1510 1.1.1.1.4.2 yamt return "addq %r1,%r1,%0";
1511 1.1.1.1.4.2 yamt else
1512 1.1.1.1.4.2 yamt return "s%P2addq %r1,0,%0";
1513 1.1.1.1.4.2 yamt case 1:
1514 1.1.1.1.4.2 yamt return "sll %r1,%2,%0";
1515 1.1.1.1.4.2 yamt default:
1516 1.1.1.1.4.2 yamt gcc_unreachable ();
1517 1.1.1.1.4.2 yamt }
1518 1.1.1.1.4.2 yamt }
1519 1.1.1.1.4.2 yamt [(set_attr "type" "iadd,shift")])
1520 1.1.1.1.4.2 yamt
1521 1.1.1.1.4.2 yamt (define_insn "*ashldi_se"
1522 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1523 1.1.1.1.4.2 yamt (sign_extend:DI
1524 1.1.1.1.4.2 yamt (subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1525 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "P"))
1526 1.1.1.1.4.2 yamt 0)))]
1527 1.1.1.1.4.2 yamt "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 3"
1528 1.1.1.1.4.2 yamt {
1529 1.1.1.1.4.2 yamt if (operands[2] == const1_rtx)
1530 1.1.1.1.4.2 yamt return "addl %r1,%r1,%0";
1531 1.1.1.1.4.2 yamt else
1532 1.1.1.1.4.2 yamt return "s%P2addl %r1,0,%0";
1533 1.1.1.1.4.2 yamt }
1534 1.1.1.1.4.2 yamt [(set_attr "type" "iadd")])
1535 1.1.1.1.4.2 yamt
1536 1.1.1.1.4.2 yamt (define_insn "lshrdi3"
1537 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1538 1.1.1.1.4.2 yamt (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1539 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_6bit_operand" "rS")))]
1540 1.1.1.1.4.2 yamt ""
1541 1.1.1.1.4.2 yamt "srl %r1,%2,%0"
1542 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1543 1.1.1.1.4.2 yamt
1544 1.1.1.1.4.2 yamt (define_insn "ashrdi3"
1545 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1546 1.1.1.1.4.2 yamt (ashiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1547 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_6bit_operand" "rS")))]
1548 1.1.1.1.4.2 yamt ""
1549 1.1.1.1.4.2 yamt "sra %r1,%2,%0"
1550 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1551 1.1.1.1.4.2 yamt
1552 1.1.1.1.4.2 yamt (define_expand "extendqihi2"
1553 1.1.1.1.4.2 yamt [(set (match_dup 2)
1554 1.1.1.1.4.2 yamt (ashift:DI (match_operand:QI 1 "some_operand" "")
1555 1.1.1.1.4.2 yamt (const_int 56)))
1556 1.1.1.1.4.2 yamt (set (match_operand:HI 0 "register_operand" "")
1557 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 2)
1558 1.1.1.1.4.2 yamt (const_int 56)))]
1559 1.1.1.1.4.2 yamt ""
1560 1.1.1.1.4.2 yamt {
1561 1.1.1.1.4.2 yamt if (TARGET_BWX)
1562 1.1.1.1.4.2 yamt {
1563 1.1.1.1.4.2 yamt emit_insn (gen_extendqihi2x (operands[0],
1564 1.1.1.1.4.2 yamt force_reg (QImode, operands[1])));
1565 1.1.1.1.4.2 yamt DONE;
1566 1.1.1.1.4.2 yamt }
1567 1.1.1.1.4.2 yamt
1568 1.1.1.1.4.2 yamt /* If we have an unaligned MEM, extend to DImode (which we do
1569 1.1.1.1.4.2 yamt specially) and then copy to the result. */
1570 1.1.1.1.4.2 yamt if (unaligned_memory_operand (operands[1], HImode))
1571 1.1.1.1.4.2 yamt {
1572 1.1.1.1.4.2 yamt rtx temp = gen_reg_rtx (DImode);
1573 1.1.1.1.4.2 yamt
1574 1.1.1.1.4.2 yamt emit_insn (gen_extendqidi2 (temp, operands[1]));
1575 1.1.1.1.4.2 yamt emit_move_insn (operands[0], gen_lowpart (HImode, temp));
1576 1.1.1.1.4.2 yamt DONE;
1577 1.1.1.1.4.2 yamt }
1578 1.1.1.1.4.2 yamt
1579 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
1580 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, force_reg (QImode, operands[1]));
1581 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
1582 1.1.1.1.4.2 yamt })
1583 1.1.1.1.4.2 yamt
1584 1.1.1.1.4.2 yamt (define_insn "extendqidi2x"
1585 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1586 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:QI 1 "register_operand" "r")))]
1587 1.1.1.1.4.2 yamt "TARGET_BWX"
1588 1.1.1.1.4.2 yamt "sextb %1,%0"
1589 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1590 1.1.1.1.4.2 yamt
1591 1.1.1.1.4.2 yamt (define_insn "extendhidi2x"
1592 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1593 1.1.1.1.4.2 yamt (sign_extend:DI (match_operand:HI 1 "register_operand" "r")))]
1594 1.1.1.1.4.2 yamt "TARGET_BWX"
1595 1.1.1.1.4.2 yamt "sextw %1,%0"
1596 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1597 1.1.1.1.4.2 yamt
1598 1.1.1.1.4.2 yamt (define_insn "extendqisi2x"
1599 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1600 1.1.1.1.4.2 yamt (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))]
1601 1.1.1.1.4.2 yamt "TARGET_BWX"
1602 1.1.1.1.4.2 yamt "sextb %1,%0"
1603 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1604 1.1.1.1.4.2 yamt
1605 1.1.1.1.4.2 yamt (define_insn "extendhisi2x"
1606 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
1607 1.1.1.1.4.2 yamt (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))]
1608 1.1.1.1.4.2 yamt "TARGET_BWX"
1609 1.1.1.1.4.2 yamt "sextw %1,%0"
1610 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1611 1.1.1.1.4.2 yamt
1612 1.1.1.1.4.2 yamt (define_insn "extendqihi2x"
1613 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r")
1614 1.1.1.1.4.2 yamt (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))]
1615 1.1.1.1.4.2 yamt "TARGET_BWX"
1616 1.1.1.1.4.2 yamt "sextb %1,%0"
1617 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1618 1.1.1.1.4.2 yamt
1619 1.1.1.1.4.2 yamt (define_expand "extendqisi2"
1620 1.1.1.1.4.2 yamt [(set (match_dup 2)
1621 1.1.1.1.4.2 yamt (ashift:DI (match_operand:QI 1 "some_operand" "")
1622 1.1.1.1.4.2 yamt (const_int 56)))
1623 1.1.1.1.4.2 yamt (set (match_operand:SI 0 "register_operand" "")
1624 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 2)
1625 1.1.1.1.4.2 yamt (const_int 56)))]
1626 1.1.1.1.4.2 yamt ""
1627 1.1.1.1.4.2 yamt {
1628 1.1.1.1.4.2 yamt if (TARGET_BWX)
1629 1.1.1.1.4.2 yamt {
1630 1.1.1.1.4.2 yamt emit_insn (gen_extendqisi2x (operands[0],
1631 1.1.1.1.4.2 yamt force_reg (QImode, operands[1])));
1632 1.1.1.1.4.2 yamt DONE;
1633 1.1.1.1.4.2 yamt }
1634 1.1.1.1.4.2 yamt
1635 1.1.1.1.4.2 yamt /* If we have an unaligned MEM, extend to a DImode form of
1636 1.1.1.1.4.2 yamt the result (which we do specially). */
1637 1.1.1.1.4.2 yamt if (unaligned_memory_operand (operands[1], QImode))
1638 1.1.1.1.4.2 yamt {
1639 1.1.1.1.4.2 yamt rtx temp = gen_reg_rtx (DImode);
1640 1.1.1.1.4.2 yamt
1641 1.1.1.1.4.2 yamt emit_insn (gen_extendqidi2 (temp, operands[1]));
1642 1.1.1.1.4.2 yamt emit_move_insn (operands[0], gen_lowpart (SImode, temp));
1643 1.1.1.1.4.2 yamt DONE;
1644 1.1.1.1.4.2 yamt }
1645 1.1.1.1.4.2 yamt
1646 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
1647 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, force_reg (QImode, operands[1]));
1648 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
1649 1.1.1.1.4.2 yamt })
1650 1.1.1.1.4.2 yamt
1651 1.1.1.1.4.2 yamt (define_expand "extendqidi2"
1652 1.1.1.1.4.2 yamt [(set (match_dup 2)
1653 1.1.1.1.4.2 yamt (ashift:DI (match_operand:QI 1 "some_operand" "")
1654 1.1.1.1.4.2 yamt (const_int 56)))
1655 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1656 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 2)
1657 1.1.1.1.4.2 yamt (const_int 56)))]
1658 1.1.1.1.4.2 yamt ""
1659 1.1.1.1.4.2 yamt {
1660 1.1.1.1.4.2 yamt if (TARGET_BWX)
1661 1.1.1.1.4.2 yamt {
1662 1.1.1.1.4.2 yamt emit_insn (gen_extendqidi2x (operands[0],
1663 1.1.1.1.4.2 yamt force_reg (QImode, operands[1])));
1664 1.1.1.1.4.2 yamt DONE;
1665 1.1.1.1.4.2 yamt }
1666 1.1.1.1.4.2 yamt
1667 1.1.1.1.4.2 yamt if (unaligned_memory_operand (operands[1], QImode))
1668 1.1.1.1.4.2 yamt {
1669 1.1.1.1.4.2 yamt rtx seq = gen_unaligned_extendqidi (operands[0], XEXP (operands[1], 0));
1670 1.1.1.1.4.2 yamt alpha_set_memflags (seq, operands[1]);
1671 1.1.1.1.4.2 yamt emit_insn (seq);
1672 1.1.1.1.4.2 yamt DONE;
1673 1.1.1.1.4.2 yamt }
1674 1.1.1.1.4.2 yamt
1675 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, force_reg (QImode, operands[1]));
1676 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
1677 1.1.1.1.4.2 yamt })
1678 1.1.1.1.4.2 yamt
1679 1.1.1.1.4.2 yamt (define_expand "extendhisi2"
1680 1.1.1.1.4.2 yamt [(set (match_dup 2)
1681 1.1.1.1.4.2 yamt (ashift:DI (match_operand:HI 1 "some_operand" "")
1682 1.1.1.1.4.2 yamt (const_int 48)))
1683 1.1.1.1.4.2 yamt (set (match_operand:SI 0 "register_operand" "")
1684 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 2)
1685 1.1.1.1.4.2 yamt (const_int 48)))]
1686 1.1.1.1.4.2 yamt ""
1687 1.1.1.1.4.2 yamt {
1688 1.1.1.1.4.2 yamt if (TARGET_BWX)
1689 1.1.1.1.4.2 yamt {
1690 1.1.1.1.4.2 yamt emit_insn (gen_extendhisi2x (operands[0],
1691 1.1.1.1.4.2 yamt force_reg (HImode, operands[1])));
1692 1.1.1.1.4.2 yamt DONE;
1693 1.1.1.1.4.2 yamt }
1694 1.1.1.1.4.2 yamt
1695 1.1.1.1.4.2 yamt /* If we have an unaligned MEM, extend to a DImode form of
1696 1.1.1.1.4.2 yamt the result (which we do specially). */
1697 1.1.1.1.4.2 yamt if (unaligned_memory_operand (operands[1], HImode))
1698 1.1.1.1.4.2 yamt {
1699 1.1.1.1.4.2 yamt rtx temp = gen_reg_rtx (DImode);
1700 1.1.1.1.4.2 yamt
1701 1.1.1.1.4.2 yamt emit_insn (gen_extendhidi2 (temp, operands[1]));
1702 1.1.1.1.4.2 yamt emit_move_insn (operands[0], gen_lowpart (SImode, temp));
1703 1.1.1.1.4.2 yamt DONE;
1704 1.1.1.1.4.2 yamt }
1705 1.1.1.1.4.2 yamt
1706 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
1707 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, force_reg (HImode, operands[1]));
1708 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
1709 1.1.1.1.4.2 yamt })
1710 1.1.1.1.4.2 yamt
1711 1.1.1.1.4.2 yamt (define_expand "extendhidi2"
1712 1.1.1.1.4.2 yamt [(set (match_dup 2)
1713 1.1.1.1.4.2 yamt (ashift:DI (match_operand:HI 1 "some_operand" "")
1714 1.1.1.1.4.2 yamt (const_int 48)))
1715 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1716 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 2)
1717 1.1.1.1.4.2 yamt (const_int 48)))]
1718 1.1.1.1.4.2 yamt ""
1719 1.1.1.1.4.2 yamt {
1720 1.1.1.1.4.2 yamt if (TARGET_BWX)
1721 1.1.1.1.4.2 yamt {
1722 1.1.1.1.4.2 yamt emit_insn (gen_extendhidi2x (operands[0],
1723 1.1.1.1.4.2 yamt force_reg (HImode, operands[1])));
1724 1.1.1.1.4.2 yamt DONE;
1725 1.1.1.1.4.2 yamt }
1726 1.1.1.1.4.2 yamt
1727 1.1.1.1.4.2 yamt if (unaligned_memory_operand (operands[1], HImode))
1728 1.1.1.1.4.2 yamt {
1729 1.1.1.1.4.2 yamt rtx seq = gen_unaligned_extendhidi (operands[0], XEXP (operands[1], 0));
1730 1.1.1.1.4.2 yamt
1731 1.1.1.1.4.2 yamt alpha_set_memflags (seq, operands[1]);
1732 1.1.1.1.4.2 yamt emit_insn (seq);
1733 1.1.1.1.4.2 yamt DONE;
1734 1.1.1.1.4.2 yamt }
1735 1.1.1.1.4.2 yamt
1736 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, force_reg (HImode, operands[1]));
1737 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
1738 1.1.1.1.4.2 yamt })
1739 1.1.1.1.4.2 yamt
1740 1.1.1.1.4.2 yamt ;; Here's how we sign extend an unaligned byte and halfword. Doing this
1741 1.1.1.1.4.2 yamt ;; as a pattern saves one instruction. The code is similar to that for
1742 1.1.1.1.4.2 yamt ;; the unaligned loads (see below).
1743 1.1.1.1.4.2 yamt ;;
1744 1.1.1.1.4.2 yamt ;; Operand 1 is the address, operand 0 is the result.
1745 1.1.1.1.4.2 yamt (define_expand "unaligned_extendqidi"
1746 1.1.1.1.4.2 yamt [(use (match_operand:QI 0 "register_operand" ""))
1747 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "address_operand" ""))]
1748 1.1.1.1.4.2 yamt ""
1749 1.1.1.1.4.2 yamt {
1750 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
1751 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
1752 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_extendqidi_be (operands[0], operands[1]));
1753 1.1.1.1.4.2 yamt else
1754 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_extendqidi_le (operands[0], operands[1]));
1755 1.1.1.1.4.2 yamt DONE;
1756 1.1.1.1.4.2 yamt })
1757 1.1.1.1.4.2 yamt
1758 1.1.1.1.4.2 yamt (define_expand "unaligned_extendqidi_le"
1759 1.1.1.1.4.2 yamt [(set (match_dup 3)
1760 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
1761 1.1.1.1.4.2 yamt (set (match_dup 4)
1762 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3)
1763 1.1.1.1.4.2 yamt (minus:DI (const_int 64)
1764 1.1.1.1.4.2 yamt (ashift:DI
1765 1.1.1.1.4.2 yamt (and:DI (match_dup 2) (const_int 7))
1766 1.1.1.1.4.2 yamt (const_int 3)))))
1767 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1768 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 4) (const_int 56)))]
1769 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1770 1.1.1.1.4.2 yamt {
1771 1.1.1.1.4.2 yamt operands[2] = get_unaligned_offset (operands[1], 1);
1772 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
1773 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
1774 1.1.1.1.4.2 yamt })
1775 1.1.1.1.4.2 yamt
1776 1.1.1.1.4.2 yamt (define_expand "unaligned_extendqidi_be"
1777 1.1.1.1.4.2 yamt [(set (match_dup 3)
1778 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
1779 1.1.1.1.4.2 yamt (set (match_dup 4)
1780 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3)
1781 1.1.1.1.4.2 yamt (ashift:DI
1782 1.1.1.1.4.2 yamt (and:DI
1783 1.1.1.1.4.2 yamt (plus:DI (match_dup 2) (const_int 1))
1784 1.1.1.1.4.2 yamt (const_int 7))
1785 1.1.1.1.4.2 yamt (const_int 3))))
1786 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1787 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 4) (const_int 56)))]
1788 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1789 1.1.1.1.4.2 yamt {
1790 1.1.1.1.4.2 yamt operands[2] = get_unaligned_offset (operands[1], -1);
1791 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
1792 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
1793 1.1.1.1.4.2 yamt })
1794 1.1.1.1.4.2 yamt
1795 1.1.1.1.4.2 yamt (define_expand "unaligned_extendhidi"
1796 1.1.1.1.4.2 yamt [(use (match_operand:QI 0 "register_operand" ""))
1797 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "address_operand" ""))]
1798 1.1.1.1.4.2 yamt ""
1799 1.1.1.1.4.2 yamt {
1800 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
1801 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
1802 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_extendhidi_be (operands[0], operands[1]));
1803 1.1.1.1.4.2 yamt else
1804 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_extendhidi_le (operands[0], operands[1]));
1805 1.1.1.1.4.2 yamt DONE;
1806 1.1.1.1.4.2 yamt })
1807 1.1.1.1.4.2 yamt
1808 1.1.1.1.4.2 yamt (define_expand "unaligned_extendhidi_le"
1809 1.1.1.1.4.2 yamt [(set (match_dup 3)
1810 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
1811 1.1.1.1.4.2 yamt (set (match_dup 4)
1812 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3)
1813 1.1.1.1.4.2 yamt (minus:DI (const_int 64)
1814 1.1.1.1.4.2 yamt (ashift:DI
1815 1.1.1.1.4.2 yamt (and:DI (match_dup 2) (const_int 7))
1816 1.1.1.1.4.2 yamt (const_int 3)))))
1817 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1818 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 4) (const_int 48)))]
1819 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1820 1.1.1.1.4.2 yamt {
1821 1.1.1.1.4.2 yamt operands[2] = get_unaligned_offset (operands[1], 2);
1822 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
1823 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
1824 1.1.1.1.4.2 yamt })
1825 1.1.1.1.4.2 yamt
1826 1.1.1.1.4.2 yamt (define_expand "unaligned_extendhidi_be"
1827 1.1.1.1.4.2 yamt [(set (match_dup 3)
1828 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
1829 1.1.1.1.4.2 yamt (set (match_dup 4)
1830 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3)
1831 1.1.1.1.4.2 yamt (ashift:DI
1832 1.1.1.1.4.2 yamt (and:DI
1833 1.1.1.1.4.2 yamt (plus:DI (match_dup 2) (const_int 1))
1834 1.1.1.1.4.2 yamt (const_int 7))
1835 1.1.1.1.4.2 yamt (const_int 3))))
1836 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
1837 1.1.1.1.4.2 yamt (ashiftrt:DI (match_dup 4) (const_int 48)))]
1838 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1839 1.1.1.1.4.2 yamt {
1840 1.1.1.1.4.2 yamt operands[2] = get_unaligned_offset (operands[1], -1);
1841 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
1842 1.1.1.1.4.2 yamt operands[4] = gen_reg_rtx (DImode);
1843 1.1.1.1.4.2 yamt })
1844 1.1.1.1.4.2 yamt
1845 1.1.1.1.4.2 yamt (define_insn "*extxl_const"
1846 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1847 1.1.1.1.4.2 yamt (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1848 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_width_operand" "n")
1849 1.1.1.1.4.2 yamt (match_operand:DI 3 "mul8_operand" "I")))]
1850 1.1.1.1.4.2 yamt ""
1851 1.1.1.1.4.2 yamt "ext%M2l %r1,%s3,%0"
1852 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1853 1.1.1.1.4.2 yamt
1854 1.1.1.1.4.2 yamt (define_insn "extxl_le"
1855 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1856 1.1.1.1.4.2 yamt (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1857 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_width_operand" "n")
1858 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 3 "reg_or_8bit_operand" "rI")
1859 1.1.1.1.4.2 yamt (const_int 3))))]
1860 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1861 1.1.1.1.4.2 yamt "ext%M2l %r1,%3,%0"
1862 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1863 1.1.1.1.4.2 yamt
1864 1.1.1.1.4.2 yamt (define_insn "extxl_be"
1865 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1866 1.1.1.1.4.2 yamt (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1867 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_width_operand" "n")
1868 1.1.1.1.4.2 yamt (minus:DI
1869 1.1.1.1.4.2 yamt (const_int 56)
1870 1.1.1.1.4.2 yamt (ashift:DI
1871 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")
1872 1.1.1.1.4.2 yamt (const_int 3)))))]
1873 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1874 1.1.1.1.4.2 yamt "ext%M2l %r1,%3,%0"
1875 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1876 1.1.1.1.4.2 yamt
1877 1.1.1.1.4.2 yamt ;; Combine has some strange notion of preserving existing undefined behavior
1878 1.1.1.1.4.2 yamt ;; in shifts larger than a word size. So capture these patterns that it
1879 1.1.1.1.4.2 yamt ;; should have turned into zero_extracts.
1880 1.1.1.1.4.2 yamt
1881 1.1.1.1.4.2 yamt (define_insn "*extxl_1_le"
1882 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1883 1.1.1.1.4.2 yamt (and:DI (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1884 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1885 1.1.1.1.4.2 yamt (const_int 3)))
1886 1.1.1.1.4.2 yamt (match_operand:DI 3 "mode_mask_operand" "n")))]
1887 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1888 1.1.1.1.4.2 yamt "ext%U3l %1,%2,%0"
1889 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1890 1.1.1.1.4.2 yamt
1891 1.1.1.1.4.2 yamt (define_insn "*extxl_1_be"
1892 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1893 1.1.1.1.4.2 yamt (and:DI (lshiftrt:DI
1894 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")
1895 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
1896 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1897 1.1.1.1.4.2 yamt (const_int 3))))
1898 1.1.1.1.4.2 yamt (match_operand:DI 3 "mode_mask_operand" "n")))]
1899 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1900 1.1.1.1.4.2 yamt "ext%U3l %1,%2,%0"
1901 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1902 1.1.1.1.4.2 yamt
1903 1.1.1.1.4.2 yamt (define_insn "*extql_2_le"
1904 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1905 1.1.1.1.4.2 yamt (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1906 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1907 1.1.1.1.4.2 yamt (const_int 3))))]
1908 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1909 1.1.1.1.4.2 yamt "extql %1,%2,%0"
1910 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1911 1.1.1.1.4.2 yamt
1912 1.1.1.1.4.2 yamt (define_insn "*extql_2_be"
1913 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1914 1.1.1.1.4.2 yamt (lshiftrt:DI
1915 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")
1916 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
1917 1.1.1.1.4.2 yamt (ashift:DI
1918 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1919 1.1.1.1.4.2 yamt (const_int 3)))))]
1920 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1921 1.1.1.1.4.2 yamt "extql %1,%2,%0"
1922 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1923 1.1.1.1.4.2 yamt
1924 1.1.1.1.4.2 yamt (define_insn "extqh_le"
1925 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1926 1.1.1.1.4.2 yamt (ashift:DI
1927 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")
1928 1.1.1.1.4.2 yamt (minus:DI (const_int 64)
1929 1.1.1.1.4.2 yamt (ashift:DI
1930 1.1.1.1.4.2 yamt (and:DI
1931 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1932 1.1.1.1.4.2 yamt (const_int 7))
1933 1.1.1.1.4.2 yamt (const_int 3)))))]
1934 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1935 1.1.1.1.4.2 yamt "extqh %r1,%2,%0"
1936 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1937 1.1.1.1.4.2 yamt
1938 1.1.1.1.4.2 yamt (define_insn "extqh_be"
1939 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1940 1.1.1.1.4.2 yamt (ashift:DI
1941 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")
1942 1.1.1.1.4.2 yamt (ashift:DI
1943 1.1.1.1.4.2 yamt (and:DI
1944 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1945 1.1.1.1.4.2 yamt (const_int 1))
1946 1.1.1.1.4.2 yamt (const_int 7))
1947 1.1.1.1.4.2 yamt (const_int 3))))]
1948 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1949 1.1.1.1.4.2 yamt "extqh %r1,%2,%0"
1950 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1951 1.1.1.1.4.2 yamt
1952 1.1.1.1.4.2 yamt (define_insn "extlh_le"
1953 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1954 1.1.1.1.4.2 yamt (ashift:DI
1955 1.1.1.1.4.2 yamt (and:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1956 1.1.1.1.4.2 yamt (const_int 2147483647))
1957 1.1.1.1.4.2 yamt (minus:DI (const_int 64)
1958 1.1.1.1.4.2 yamt (ashift:DI
1959 1.1.1.1.4.2 yamt (and:DI
1960 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1961 1.1.1.1.4.2 yamt (const_int 7))
1962 1.1.1.1.4.2 yamt (const_int 3)))))]
1963 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1964 1.1.1.1.4.2 yamt "extlh %r1,%2,%0"
1965 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1966 1.1.1.1.4.2 yamt
1967 1.1.1.1.4.2 yamt (define_insn "extlh_be"
1968 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1969 1.1.1.1.4.2 yamt (and:DI
1970 1.1.1.1.4.2 yamt (ashift:DI
1971 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")
1972 1.1.1.1.4.2 yamt (ashift:DI
1973 1.1.1.1.4.2 yamt (and:DI
1974 1.1.1.1.4.2 yamt (plus:DI
1975 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1976 1.1.1.1.4.2 yamt (const_int 1))
1977 1.1.1.1.4.2 yamt (const_int 7))
1978 1.1.1.1.4.2 yamt (const_int 3)))
1979 1.1.1.1.4.2 yamt (const_int 2147483647)))]
1980 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
1981 1.1.1.1.4.2 yamt "extlh %r1,%2,%0"
1982 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1983 1.1.1.1.4.2 yamt
1984 1.1.1.1.4.2 yamt (define_insn "extwh_le"
1985 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
1986 1.1.1.1.4.2 yamt (ashift:DI
1987 1.1.1.1.4.2 yamt (and:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1988 1.1.1.1.4.2 yamt (const_int 65535))
1989 1.1.1.1.4.2 yamt (minus:DI (const_int 64)
1990 1.1.1.1.4.2 yamt (ashift:DI
1991 1.1.1.1.4.2 yamt (and:DI
1992 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")
1993 1.1.1.1.4.2 yamt (const_int 7))
1994 1.1.1.1.4.2 yamt (const_int 3)))))]
1995 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
1996 1.1.1.1.4.2 yamt "extwh %r1,%2,%0"
1997 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
1998 1.1.1.1.4.2 yamt
1999 1.1.1.1.4.2 yamt (define_insn "extwh_be"
2000 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2001 1.1.1.1.4.2 yamt (and:DI
2002 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
2003 1.1.1.1.4.2 yamt (ashift:DI
2004 1.1.1.1.4.2 yamt (and:DI
2005 1.1.1.1.4.2 yamt (plus:DI
2006 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2007 1.1.1.1.4.2 yamt (const_int 1))
2008 1.1.1.1.4.2 yamt (const_int 7))
2009 1.1.1.1.4.2 yamt (const_int 3)))
2010 1.1.1.1.4.2 yamt (const_int 65535)))]
2011 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
2012 1.1.1.1.4.2 yamt "extwh %r1,%2,%0"
2013 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2014 1.1.1.1.4.2 yamt
2015 1.1.1.1.4.2 yamt ;; This converts an extXl into an extXh with an appropriate adjustment
2016 1.1.1.1.4.2 yamt ;; to the address calculation.
2017 1.1.1.1.4.2 yamt
2018 1.1.1.1.4.2 yamt ;;(define_split
2019 1.1.1.1.4.2 yamt ;; [(set (match_operand:DI 0 "register_operand" "")
2020 1.1.1.1.4.2 yamt ;; (ashift:DI (zero_extract:DI (match_operand:DI 1 "register_operand" "")
2021 1.1.1.1.4.2 yamt ;; (match_operand:DI 2 "mode_width_operand" "")
2022 1.1.1.1.4.2 yamt ;; (ashift:DI (match_operand:DI 3 "" "")
2023 1.1.1.1.4.2 yamt ;; (const_int 3)))
2024 1.1.1.1.4.2 yamt ;; (match_operand:DI 4 "const_int_operand" "")))
2025 1.1.1.1.4.2 yamt ;; (clobber (match_operand:DI 5 "register_operand" ""))]
2026 1.1.1.1.4.2 yamt ;; "INTVAL (operands[4]) == 64 - INTVAL (operands[2])"
2027 1.1.1.1.4.2 yamt ;; [(set (match_dup 5) (match_dup 6))
2028 1.1.1.1.4.2 yamt ;; (set (match_dup 0)
2029 1.1.1.1.4.2 yamt ;; (ashift:DI (zero_extract:DI (match_dup 1) (match_dup 2)
2030 1.1.1.1.4.2 yamt ;; (ashift:DI (plus:DI (match_dup 5)
2031 1.1.1.1.4.2 yamt ;; (match_dup 7))
2032 1.1.1.1.4.2 yamt ;; (const_int 3)))
2033 1.1.1.1.4.2 yamt ;; (match_dup 4)))]
2034 1.1.1.1.4.2 yamt ;; "
2035 1.1.1.1.4.2 yamt ;;{
2036 1.1.1.1.4.2 yamt ;; operands[6] = plus_constant (operands[3],
2037 1.1.1.1.4.2 yamt ;; INTVAL (operands[2]) / BITS_PER_UNIT);
2038 1.1.1.1.4.2 yamt ;; operands[7] = GEN_INT (- INTVAL (operands[2]) / BITS_PER_UNIT);
2039 1.1.1.1.4.2 yamt ;;}")
2040 1.1.1.1.4.2 yamt
2041 1.1.1.1.4.2 yamt (define_insn "*insbl_const"
2042 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2043 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r"))
2044 1.1.1.1.4.2 yamt (match_operand:DI 2 "mul8_operand" "I")))]
2045 1.1.1.1.4.2 yamt ""
2046 1.1.1.1.4.2 yamt "insbl %1,%s2,%0"
2047 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2048 1.1.1.1.4.2 yamt
2049 1.1.1.1.4.2 yamt (define_insn "inswl_const"
2050 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2051 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r"))
2052 1.1.1.1.4.2 yamt (match_operand:DI 2 "mul8_operand" "I")))]
2053 1.1.1.1.4.2 yamt ""
2054 1.1.1.1.4.2 yamt "inswl %1,%s2,%0"
2055 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2056 1.1.1.1.4.2 yamt
2057 1.1.1.1.4.2 yamt (define_insn "*insll_const"
2058 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2059 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
2060 1.1.1.1.4.2 yamt (match_operand:DI 2 "mul8_operand" "I")))]
2061 1.1.1.1.4.2 yamt ""
2062 1.1.1.1.4.2 yamt "insll %1,%s2,%0"
2063 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2064 1.1.1.1.4.2 yamt
2065 1.1.1.1.4.2 yamt (define_insn "insbl_le"
2066 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2067 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r"))
2068 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2069 1.1.1.1.4.2 yamt (const_int 3))))]
2070 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
2071 1.1.1.1.4.2 yamt "insbl %1,%2,%0"
2072 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2073 1.1.1.1.4.2 yamt
2074 1.1.1.1.4.2 yamt (define_insn "insbl_be"
2075 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2076 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r"))
2077 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
2078 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2079 1.1.1.1.4.2 yamt (const_int 3)))))]
2080 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
2081 1.1.1.1.4.2 yamt "insbl %1,%2,%0"
2082 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2083 1.1.1.1.4.2 yamt
2084 1.1.1.1.4.2 yamt (define_insn "inswl_le"
2085 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2086 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r"))
2087 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2088 1.1.1.1.4.2 yamt (const_int 3))))]
2089 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
2090 1.1.1.1.4.2 yamt "inswl %1,%2,%0"
2091 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2092 1.1.1.1.4.2 yamt
2093 1.1.1.1.4.2 yamt (define_insn "inswl_be"
2094 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2095 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r"))
2096 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
2097 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2098 1.1.1.1.4.2 yamt (const_int 3)))))]
2099 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
2100 1.1.1.1.4.2 yamt "inswl %1,%2,%0"
2101 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2102 1.1.1.1.4.2 yamt
2103 1.1.1.1.4.2 yamt (define_insn "insll_le"
2104 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2105 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
2106 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2107 1.1.1.1.4.2 yamt (const_int 3))))]
2108 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
2109 1.1.1.1.4.2 yamt "insll %1,%2,%0"
2110 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2111 1.1.1.1.4.2 yamt
2112 1.1.1.1.4.2 yamt (define_insn "insll_be"
2113 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2114 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
2115 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
2116 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2117 1.1.1.1.4.2 yamt (const_int 3)))))]
2118 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
2119 1.1.1.1.4.2 yamt "insll %1,%2,%0"
2120 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2121 1.1.1.1.4.2 yamt
2122 1.1.1.1.4.2 yamt (define_insn "insql_le"
2123 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2124 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 1 "register_operand" "r")
2125 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2126 1.1.1.1.4.2 yamt (const_int 3))))]
2127 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
2128 1.1.1.1.4.2 yamt "insql %1,%2,%0"
2129 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2130 1.1.1.1.4.2 yamt
2131 1.1.1.1.4.2 yamt (define_insn "insql_be"
2132 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2133 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 1 "register_operand" "r")
2134 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
2135 1.1.1.1.4.2 yamt (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
2136 1.1.1.1.4.2 yamt (const_int 3)))))]
2137 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
2138 1.1.1.1.4.2 yamt "insql %1,%2,%0"
2139 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2140 1.1.1.1.4.2 yamt
2141 1.1.1.1.4.2 yamt ;; Combine has this sometimes habit of moving the and outside of the
2142 1.1.1.1.4.2 yamt ;; shift, making life more interesting.
2143 1.1.1.1.4.2 yamt
2144 1.1.1.1.4.2 yamt (define_insn "*insxl"
2145 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2146 1.1.1.1.4.2 yamt (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
2147 1.1.1.1.4.2 yamt (match_operand:DI 2 "mul8_operand" "I"))
2148 1.1.1.1.4.2 yamt (match_operand:DI 3 "immediate_operand" "i")))]
2149 1.1.1.1.4.2 yamt "HOST_BITS_PER_WIDE_INT == 64
2150 1.1.1.1.4.2 yamt && CONST_INT_P (operands[3])
2151 1.1.1.1.4.2 yamt && (((unsigned HOST_WIDE_INT) 0xff << INTVAL (operands[2])
2152 1.1.1.1.4.2 yamt == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
2153 1.1.1.1.4.2 yamt || ((unsigned HOST_WIDE_INT) 0xffff << INTVAL (operands[2])
2154 1.1.1.1.4.2 yamt == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
2155 1.1.1.1.4.2 yamt || ((unsigned HOST_WIDE_INT) 0xffffffff << INTVAL (operands[2])
2156 1.1.1.1.4.2 yamt == (unsigned HOST_WIDE_INT) INTVAL (operands[3])))"
2157 1.1.1.1.4.2 yamt {
2158 1.1.1.1.4.2 yamt #if HOST_BITS_PER_WIDE_INT == 64
2159 1.1.1.1.4.2 yamt if ((unsigned HOST_WIDE_INT) 0xff << INTVAL (operands[2])
2160 1.1.1.1.4.2 yamt == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
2161 1.1.1.1.4.2 yamt return "insbl %1,%s2,%0";
2162 1.1.1.1.4.2 yamt if ((unsigned HOST_WIDE_INT) 0xffff << INTVAL (operands[2])
2163 1.1.1.1.4.2 yamt == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
2164 1.1.1.1.4.2 yamt return "inswl %1,%s2,%0";
2165 1.1.1.1.4.2 yamt if ((unsigned HOST_WIDE_INT) 0xffffffff << INTVAL (operands[2])
2166 1.1.1.1.4.2 yamt == (unsigned HOST_WIDE_INT) INTVAL (operands[3]))
2167 1.1.1.1.4.2 yamt return "insll %1,%s2,%0";
2168 1.1.1.1.4.2 yamt #endif
2169 1.1.1.1.4.2 yamt gcc_unreachable ();
2170 1.1.1.1.4.2 yamt }
2171 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2172 1.1.1.1.4.2 yamt
2173 1.1.1.1.4.2 yamt ;; We do not include the insXh insns because they are complex to express
2174 1.1.1.1.4.2 yamt ;; and it does not appear that we would ever want to generate them.
2175 1.1.1.1.4.2 yamt ;;
2176 1.1.1.1.4.2 yamt ;; Since we need them for block moves, though, cop out and use unspec.
2177 1.1.1.1.4.2 yamt
2178 1.1.1.1.4.2 yamt (define_insn "insxh"
2179 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2180 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
2181 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_width_operand" "n")
2182 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")]
2183 1.1.1.1.4.2 yamt UNSPEC_INSXH))]
2184 1.1.1.1.4.2 yamt ""
2185 1.1.1.1.4.2 yamt "ins%M2h %1,%3,%0"
2186 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2187 1.1.1.1.4.2 yamt
2188 1.1.1.1.4.2 yamt (define_insn "mskxl_le"
2189 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2190 1.1.1.1.4.2 yamt (and:DI (not:DI (ashift:DI
2191 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_mask_operand" "n")
2192 1.1.1.1.4.2 yamt (ashift:DI
2193 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")
2194 1.1.1.1.4.2 yamt (const_int 3))))
2195 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")))]
2196 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
2197 1.1.1.1.4.2 yamt "msk%U2l %r1,%3,%0"
2198 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2199 1.1.1.1.4.2 yamt
2200 1.1.1.1.4.2 yamt (define_insn "mskxl_be"
2201 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2202 1.1.1.1.4.2 yamt (and:DI (not:DI (ashift:DI
2203 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_mask_operand" "n")
2204 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
2205 1.1.1.1.4.2 yamt (ashift:DI
2206 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")
2207 1.1.1.1.4.2 yamt (const_int 3)))))
2208 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")))]
2209 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
2210 1.1.1.1.4.2 yamt "msk%U2l %r1,%3,%0"
2211 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2212 1.1.1.1.4.2 yamt
2213 1.1.1.1.4.2 yamt ;; We do not include the mskXh insns because it does not appear we would
2214 1.1.1.1.4.2 yamt ;; ever generate one.
2215 1.1.1.1.4.2 yamt ;;
2216 1.1.1.1.4.2 yamt ;; Again, we do for block moves and we use unspec again.
2217 1.1.1.1.4.2 yamt
2218 1.1.1.1.4.2 yamt (define_insn "mskxh"
2219 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2220 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
2221 1.1.1.1.4.2 yamt (match_operand:DI 2 "mode_width_operand" "n")
2222 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")]
2223 1.1.1.1.4.2 yamt UNSPEC_MSKXH))]
2224 1.1.1.1.4.2 yamt ""
2225 1.1.1.1.4.2 yamt "msk%M2h %1,%3,%0"
2226 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
2227 1.1.1.1.4.2 yamt
2228 1.1.1.1.4.2 yamt ;; Prefer AND + NE over LSHIFTRT + AND.
2229 1.1.1.1.4.2 yamt
2230 1.1.1.1.4.2 yamt (define_insn_and_split "*ze_and_ne"
2231 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
2232 1.1.1.1.4.2 yamt (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
2233 1.1.1.1.4.2 yamt (const_int 1)
2234 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "I")))]
2235 1.1.1.1.4.2 yamt "(unsigned HOST_WIDE_INT) INTVAL (operands[2]) < 8"
2236 1.1.1.1.4.2 yamt "#"
2237 1.1.1.1.4.2 yamt "(unsigned HOST_WIDE_INT) INTVAL (operands[2]) < 8"
2238 1.1.1.1.4.2 yamt [(set (match_dup 0)
2239 1.1.1.1.4.2 yamt (and:DI (match_dup 1) (match_dup 3)))
2240 1.1.1.1.4.2 yamt (set (match_dup 0)
2241 1.1.1.1.4.2 yamt (ne:DI (match_dup 0) (const_int 0)))]
2242 1.1.1.1.4.2 yamt "operands[3] = GEN_INT (1 << INTVAL (operands[2]));")
2243 1.1.1.1.4.2 yamt
2245 1.1.1.1.4.2 yamt ;; Floating-point operations. All the double-precision insns can extend
2246 1.1.1.1.4.2 yamt ;; from single, so indicate that. The exception are the ones that simply
2247 1.1.1.1.4.2 yamt ;; play with the sign bits; it's not clear what to do there.
2248 1.1.1.1.4.2 yamt
2249 1.1.1.1.4.2 yamt (define_insn "abssf2"
2250 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2251 1.1.1.1.4.2 yamt (abs:SF (match_operand:SF 1 "reg_or_0_operand" "fG")))]
2252 1.1.1.1.4.2 yamt "TARGET_FP"
2253 1.1.1.1.4.2 yamt "cpys $f31,%R1,%0"
2254 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys")])
2255 1.1.1.1.4.2 yamt
2256 1.1.1.1.4.2 yamt (define_insn "*nabssf2"
2257 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2258 1.1.1.1.4.2 yamt (neg:SF (abs:SF (match_operand:SF 1 "reg_or_0_operand" "fG"))))]
2259 1.1.1.1.4.2 yamt "TARGET_FP"
2260 1.1.1.1.4.2 yamt "cpysn $f31,%R1,%0"
2261 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2262 1.1.1.1.4.2 yamt
2263 1.1.1.1.4.2 yamt (define_insn "absdf2"
2264 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2265 1.1.1.1.4.2 yamt (abs:DF (match_operand:DF 1 "reg_or_0_operand" "fG")))]
2266 1.1.1.1.4.2 yamt "TARGET_FP"
2267 1.1.1.1.4.2 yamt "cpys $f31,%R1,%0"
2268 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys")])
2269 1.1.1.1.4.2 yamt
2270 1.1.1.1.4.2 yamt (define_insn "*nabsdf2"
2271 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2272 1.1.1.1.4.2 yamt (neg:DF (abs:DF (match_operand:DF 1 "reg_or_0_operand" "fG"))))]
2273 1.1.1.1.4.2 yamt "TARGET_FP"
2274 1.1.1.1.4.2 yamt "cpysn $f31,%R1,%0"
2275 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2276 1.1.1.1.4.2 yamt
2277 1.1.1.1.4.2 yamt (define_expand "abstf2"
2278 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:TF 0 "register_operand" "")
2279 1.1.1.1.4.2 yamt (abs:TF (match_operand:TF 1 "reg_or_0_operand" "")))
2280 1.1.1.1.4.2 yamt (use (match_dup 2))])]
2281 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2282 1.1.1.1.4.2 yamt {
2283 1.1.1.1.4.2 yamt #if HOST_BITS_PER_WIDE_INT >= 64
2284 1.1.1.1.4.2 yamt operands[2] = force_reg (DImode, GEN_INT ((HOST_WIDE_INT) 1 << 63));
2285 1.1.1.1.4.2 yamt #else
2286 1.1.1.1.4.2 yamt operands[2] = force_reg (DImode, immed_double_const (0, 0x80000000, DImode));
2287 1.1.1.1.4.2 yamt #endif
2288 1.1.1.1.4.2 yamt })
2289 1.1.1.1.4.2 yamt
2290 1.1.1.1.4.2 yamt (define_insn_and_split "*abstf_internal"
2291 1.1.1.1.4.2 yamt [(set (match_operand:TF 0 "register_operand" "=r")
2292 1.1.1.1.4.2 yamt (abs:TF (match_operand:TF 1 "reg_or_0_operand" "rG")))
2293 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" "r"))]
2294 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2295 1.1.1.1.4.2 yamt "#"
2296 1.1.1.1.4.2 yamt "&& reload_completed"
2297 1.1.1.1.4.2 yamt [(const_int 0)]
2298 1.1.1.1.4.2 yamt "alpha_split_tfmode_frobsign (operands, gen_andnotdi3); DONE;")
2299 1.1.1.1.4.2 yamt
2300 1.1.1.1.4.2 yamt (define_insn "negsf2"
2301 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2302 1.1.1.1.4.2 yamt (neg:SF (match_operand:SF 1 "reg_or_0_operand" "fG")))]
2303 1.1.1.1.4.2 yamt "TARGET_FP"
2304 1.1.1.1.4.2 yamt "cpysn %R1,%R1,%0"
2305 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2306 1.1.1.1.4.2 yamt
2307 1.1.1.1.4.2 yamt (define_insn "negdf2"
2308 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2309 1.1.1.1.4.2 yamt (neg:DF (match_operand:DF 1 "reg_or_0_operand" "fG")))]
2310 1.1.1.1.4.2 yamt "TARGET_FP"
2311 1.1.1.1.4.2 yamt "cpysn %R1,%R1,%0"
2312 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2313 1.1.1.1.4.2 yamt
2314 1.1.1.1.4.2 yamt (define_expand "negtf2"
2315 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:TF 0 "register_operand" "")
2316 1.1.1.1.4.2 yamt (neg:TF (match_operand:TF 1 "reg_or_0_operand" "")))
2317 1.1.1.1.4.2 yamt (use (match_dup 2))])]
2318 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2319 1.1.1.1.4.2 yamt {
2320 1.1.1.1.4.2 yamt #if HOST_BITS_PER_WIDE_INT >= 64
2321 1.1.1.1.4.2 yamt operands[2] = force_reg (DImode, GEN_INT ((HOST_WIDE_INT) 1 << 63));
2322 1.1.1.1.4.2 yamt #else
2323 1.1.1.1.4.2 yamt operands[2] = force_reg (DImode, immed_double_const (0, 0x80000000, DImode));
2324 1.1.1.1.4.2 yamt #endif
2325 1.1.1.1.4.2 yamt })
2326 1.1.1.1.4.2 yamt
2327 1.1.1.1.4.2 yamt (define_insn_and_split "*negtf_internal"
2328 1.1.1.1.4.2 yamt [(set (match_operand:TF 0 "register_operand" "=r")
2329 1.1.1.1.4.2 yamt (neg:TF (match_operand:TF 1 "reg_or_0_operand" "rG")))
2330 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" "r"))]
2331 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2332 1.1.1.1.4.2 yamt "#"
2333 1.1.1.1.4.2 yamt "&& reload_completed"
2334 1.1.1.1.4.2 yamt [(const_int 0)]
2335 1.1.1.1.4.2 yamt "alpha_split_tfmode_frobsign (operands, gen_xordi3); DONE;")
2336 1.1.1.1.4.2 yamt
2337 1.1.1.1.4.2 yamt (define_insn "copysignsf3"
2338 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2339 1.1.1.1.4.2 yamt (unspec:SF [(match_operand:SF 1 "reg_or_0_operand" "fG")
2340 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")]
2341 1.1.1.1.4.2 yamt UNSPEC_COPYSIGN))]
2342 1.1.1.1.4.2 yamt "TARGET_FP"
2343 1.1.1.1.4.2 yamt "cpys %R2,%R1,%0"
2344 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2345 1.1.1.1.4.2 yamt
2346 1.1.1.1.4.2 yamt (define_insn "*ncopysignsf3"
2347 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2348 1.1.1.1.4.2 yamt (neg:SF (unspec:SF [(match_operand:SF 1 "reg_or_0_operand" "fG")
2349 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")]
2350 1.1.1.1.4.2 yamt UNSPEC_COPYSIGN)))]
2351 1.1.1.1.4.2 yamt "TARGET_FP"
2352 1.1.1.1.4.2 yamt "cpysn %R2,%R1,%0"
2353 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2354 1.1.1.1.4.2 yamt
2355 1.1.1.1.4.2 yamt (define_insn "copysigndf3"
2356 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2357 1.1.1.1.4.2 yamt (unspec:DF [(match_operand:DF 1 "reg_or_0_operand" "fG")
2358 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")]
2359 1.1.1.1.4.2 yamt UNSPEC_COPYSIGN))]
2360 1.1.1.1.4.2 yamt "TARGET_FP"
2361 1.1.1.1.4.2 yamt "cpys %R2,%R1,%0"
2362 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2363 1.1.1.1.4.2 yamt
2364 1.1.1.1.4.2 yamt (define_insn "*ncopysigndf3"
2365 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2366 1.1.1.1.4.2 yamt (neg:DF (unspec:DF [(match_operand:DF 1 "reg_or_0_operand" "fG")
2367 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")]
2368 1.1.1.1.4.2 yamt UNSPEC_COPYSIGN)))]
2369 1.1.1.1.4.2 yamt "TARGET_FP"
2370 1.1.1.1.4.2 yamt "cpysn %R2,%R1,%0"
2371 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")])
2372 1.1.1.1.4.2 yamt
2373 1.1.1.1.4.2 yamt (define_insn "*addsf_ieee"
2374 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
2375 1.1.1.1.4.2 yamt (plus:SF (match_operand:SF 1 "reg_or_0_operand" "%fG")
2376 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
2377 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2378 1.1.1.1.4.2 yamt "add%,%/ %R1,%R2,%0"
2379 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2380 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2381 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2382 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2383 1.1.1.1.4.2 yamt
2384 1.1.1.1.4.2 yamt (define_insn "addsf3"
2385 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2386 1.1.1.1.4.2 yamt (plus:SF (match_operand:SF 1 "reg_or_0_operand" "%fG")
2387 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
2388 1.1.1.1.4.2 yamt "TARGET_FP"
2389 1.1.1.1.4.2 yamt "add%,%/ %R1,%R2,%0"
2390 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2391 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2392 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2393 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2394 1.1.1.1.4.2 yamt
2395 1.1.1.1.4.2 yamt (define_insn "*adddf_ieee"
2396 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
2397 1.1.1.1.4.2 yamt (plus:DF (match_operand:DF 1 "reg_or_0_operand" "%fG")
2398 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2399 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2400 1.1.1.1.4.2 yamt "add%-%/ %R1,%R2,%0"
2401 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2402 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2403 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2404 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2405 1.1.1.1.4.2 yamt
2406 1.1.1.1.4.2 yamt (define_insn "adddf3"
2407 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2408 1.1.1.1.4.2 yamt (plus:DF (match_operand:DF 1 "reg_or_0_operand" "%fG")
2409 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2410 1.1.1.1.4.2 yamt "TARGET_FP"
2411 1.1.1.1.4.2 yamt "add%-%/ %R1,%R2,%0"
2412 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2413 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2414 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2415 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2416 1.1.1.1.4.2 yamt
2417 1.1.1.1.4.2 yamt (define_insn "*adddf_ext1"
2418 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2419 1.1.1.1.4.2 yamt (plus:DF (float_extend:DF
2420 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG"))
2421 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2422 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2423 1.1.1.1.4.2 yamt "add%-%/ %R1,%R2,%0"
2424 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2425 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2426 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2427 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2428 1.1.1.1.4.2 yamt
2429 1.1.1.1.4.2 yamt (define_insn "*adddf_ext2"
2430 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2431 1.1.1.1.4.2 yamt (plus:DF (float_extend:DF
2432 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "%fG"))
2433 1.1.1.1.4.2 yamt (float_extend:DF
2434 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
2435 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2436 1.1.1.1.4.2 yamt "add%-%/ %R1,%R2,%0"
2437 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2438 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2439 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2440 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2441 1.1.1.1.4.2 yamt
2442 1.1.1.1.4.2 yamt (define_expand "addtf3"
2443 1.1.1.1.4.2 yamt [(use (match_operand 0 "register_operand" ""))
2444 1.1.1.1.4.2 yamt (use (match_operand 1 "general_operand" ""))
2445 1.1.1.1.4.2 yamt (use (match_operand 2 "general_operand" ""))]
2446 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2447 1.1.1.1.4.2 yamt "alpha_emit_xfloating_arith (PLUS, operands); DONE;")
2448 1.1.1.1.4.2 yamt
2449 1.1.1.1.4.2 yamt ;; Define conversion operators between DFmode and SImode, using the cvtql
2450 1.1.1.1.4.2 yamt ;; instruction. To allow combine et al to do useful things, we keep the
2451 1.1.1.1.4.2 yamt ;; operation as a unit until after reload, at which point we split the
2452 1.1.1.1.4.2 yamt ;; instructions.
2453 1.1.1.1.4.2 yamt ;;
2454 1.1.1.1.4.2 yamt ;; Note that we (attempt to) only consider this optimization when the
2455 1.1.1.1.4.2 yamt ;; ultimate destination is memory. If we will be doing further integer
2456 1.1.1.1.4.2 yamt ;; processing, it is cheaper to do the truncation in the int regs.
2457 1.1.1.1.4.2 yamt
2458 1.1.1.1.4.2 yamt (define_insn "*cvtql"
2459 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2460 1.1.1.1.4.2 yamt (unspec:SF [(match_operand:DI 1 "reg_or_0_operand" "fG")]
2461 1.1.1.1.4.2 yamt UNSPEC_CVTQL))]
2462 1.1.1.1.4.2 yamt "TARGET_FP"
2463 1.1.1.1.4.2 yamt "cvtql%/ %R1,%0"
2464 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2465 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2466 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "v_sv")])
2467 1.1.1.1.4.2 yamt
2468 1.1.1.1.4.2 yamt (define_insn_and_split "*fix_truncdfsi_ieee"
2469 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "memory_operand" "=m")
2470 1.1.1.1.4.2 yamt (subreg:SI
2471 1.1.1.1.4.2 yamt (match_operator:DI 4 "fix_operator"
2472 1.1.1.1.4.2 yamt [(match_operand:DF 1 "reg_or_0_operand" "fG")]) 0))
2473 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 2 "=&f"))
2474 1.1.1.1.4.2 yamt (clobber (match_scratch:SF 3 "=&f"))]
2475 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2476 1.1.1.1.4.2 yamt "#"
2477 1.1.1.1.4.2 yamt "&& reload_completed"
2478 1.1.1.1.4.2 yamt [(set (match_dup 2) (match_op_dup 4 [(match_dup 1)]))
2479 1.1.1.1.4.2 yamt (set (match_dup 3) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
2480 1.1.1.1.4.2 yamt (set (match_dup 5) (match_dup 3))]
2481 1.1.1.1.4.2 yamt {
2482 1.1.1.1.4.2 yamt operands[5] = adjust_address (operands[0], SFmode, 0);
2483 1.1.1.1.4.2 yamt }
2484 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2485 1.1.1.1.4.2 yamt (set_attr "trap" "yes")])
2486 1.1.1.1.4.2 yamt
2487 1.1.1.1.4.2 yamt (define_insn_and_split "*fix_truncdfsi_internal"
2488 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "memory_operand" "=m")
2489 1.1.1.1.4.2 yamt (subreg:SI
2490 1.1.1.1.4.2 yamt (match_operator:DI 3 "fix_operator"
2491 1.1.1.1.4.2 yamt [(match_operand:DF 1 "reg_or_0_operand" "fG")]) 0))
2492 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 2 "=f"))]
2493 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2494 1.1.1.1.4.2 yamt "#"
2495 1.1.1.1.4.2 yamt "&& reload_completed"
2496 1.1.1.1.4.2 yamt [(set (match_dup 2) (match_op_dup 3 [(match_dup 1)]))
2497 1.1.1.1.4.2 yamt (set (match_dup 4) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
2498 1.1.1.1.4.2 yamt (set (match_dup 5) (match_dup 4))]
2499 1.1.1.1.4.2 yamt {
2500 1.1.1.1.4.2 yamt operands[4] = gen_rtx_REG (SFmode, REGNO (operands[2]));
2501 1.1.1.1.4.2 yamt operands[5] = adjust_address (operands[0], SFmode, 0);
2502 1.1.1.1.4.2 yamt }
2503 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2504 1.1.1.1.4.2 yamt (set_attr "trap" "yes")])
2505 1.1.1.1.4.2 yamt
2506 1.1.1.1.4.2 yamt (define_insn "*fix_truncdfdi_ieee"
2507 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "=&f")
2508 1.1.1.1.4.2 yamt (match_operator:DI 2 "fix_operator"
2509 1.1.1.1.4.2 yamt [(match_operand:DF 1 "reg_or_0_operand" "fG")]))]
2510 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2511 1.1.1.1.4.2 yamt "cvt%-q%/ %R1,%0"
2512 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2513 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2514 1.1.1.1.4.2 yamt (set_attr "round_suffix" "c")
2515 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "v_sv_svi")])
2516 1.1.1.1.4.2 yamt
2517 1.1.1.1.4.2 yamt (define_insn "*fix_truncdfdi2"
2518 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "=f")
2519 1.1.1.1.4.2 yamt (match_operator:DI 2 "fix_operator"
2520 1.1.1.1.4.2 yamt [(match_operand:DF 1 "reg_or_0_operand" "fG")]))]
2521 1.1.1.1.4.2 yamt "TARGET_FP"
2522 1.1.1.1.4.2 yamt "cvt%-q%/ %R1,%0"
2523 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2524 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2525 1.1.1.1.4.2 yamt (set_attr "round_suffix" "c")
2526 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "v_sv_svi")])
2527 1.1.1.1.4.2 yamt
2528 1.1.1.1.4.2 yamt (define_expand "fix_truncdfdi2"
2529 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "")
2530 1.1.1.1.4.2 yamt (fix:DI (match_operand:DF 1 "reg_or_0_operand" "")))]
2531 1.1.1.1.4.2 yamt "TARGET_FP"
2532 1.1.1.1.4.2 yamt "")
2533 1.1.1.1.4.2 yamt
2534 1.1.1.1.4.2 yamt (define_expand "fixuns_truncdfdi2"
2535 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "")
2536 1.1.1.1.4.2 yamt (unsigned_fix:DI (match_operand:DF 1 "reg_or_0_operand" "")))]
2537 1.1.1.1.4.2 yamt "TARGET_FP"
2538 1.1.1.1.4.2 yamt "")
2539 1.1.1.1.4.2 yamt
2540 1.1.1.1.4.2 yamt ;; Likewise between SFmode and SImode.
2541 1.1.1.1.4.2 yamt
2542 1.1.1.1.4.2 yamt (define_insn_and_split "*fix_truncsfsi_ieee"
2543 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "memory_operand" "=m")
2544 1.1.1.1.4.2 yamt (subreg:SI
2545 1.1.1.1.4.2 yamt (match_operator:DI 4 "fix_operator"
2546 1.1.1.1.4.2 yamt [(float_extend:DF
2547 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG"))]) 0))
2548 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 2 "=&f"))
2549 1.1.1.1.4.2 yamt (clobber (match_scratch:SF 3 "=&f"))]
2550 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2551 1.1.1.1.4.2 yamt "#"
2552 1.1.1.1.4.2 yamt "&& reload_completed"
2553 1.1.1.1.4.2 yamt [(set (match_dup 2) (match_op_dup 4 [(float_extend:DF (match_dup 1))]))
2554 1.1.1.1.4.2 yamt (set (match_dup 3) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
2555 1.1.1.1.4.2 yamt (set (match_dup 5) (match_dup 3))]
2556 1.1.1.1.4.2 yamt {
2557 1.1.1.1.4.2 yamt operands[5] = adjust_address (operands[0], SFmode, 0);
2558 1.1.1.1.4.2 yamt }
2559 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2560 1.1.1.1.4.2 yamt (set_attr "trap" "yes")])
2561 1.1.1.1.4.2 yamt
2562 1.1.1.1.4.2 yamt (define_insn_and_split "*fix_truncsfsi_internal"
2563 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "memory_operand" "=m")
2564 1.1.1.1.4.2 yamt (subreg:SI
2565 1.1.1.1.4.2 yamt (match_operator:DI 3 "fix_operator"
2566 1.1.1.1.4.2 yamt [(float_extend:DF
2567 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG"))]) 0))
2568 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 2 "=f"))]
2569 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2570 1.1.1.1.4.2 yamt "#"
2571 1.1.1.1.4.2 yamt "&& reload_completed"
2572 1.1.1.1.4.2 yamt [(set (match_dup 2) (match_op_dup 3 [(float_extend:DF (match_dup 1))]))
2573 1.1.1.1.4.2 yamt (set (match_dup 4) (unspec:SF [(match_dup 2)] UNSPEC_CVTQL))
2574 1.1.1.1.4.2 yamt (set (match_dup 5) (match_dup 4))]
2575 1.1.1.1.4.2 yamt {
2576 1.1.1.1.4.2 yamt operands[4] = gen_rtx_REG (SFmode, REGNO (operands[2]));
2577 1.1.1.1.4.2 yamt operands[5] = adjust_address (operands[0], SFmode, 0);
2578 1.1.1.1.4.2 yamt }
2579 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2580 1.1.1.1.4.2 yamt (set_attr "trap" "yes")])
2581 1.1.1.1.4.2 yamt
2582 1.1.1.1.4.2 yamt (define_insn "*fix_truncsfdi_ieee"
2583 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "=&f")
2584 1.1.1.1.4.2 yamt (match_operator:DI 2 "fix_operator"
2585 1.1.1.1.4.2 yamt [(float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG"))]))]
2586 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2587 1.1.1.1.4.2 yamt "cvt%-q%/ %R1,%0"
2588 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2589 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2590 1.1.1.1.4.2 yamt (set_attr "round_suffix" "c")
2591 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "v_sv_svi")])
2592 1.1.1.1.4.2 yamt
2593 1.1.1.1.4.2 yamt (define_insn "*fix_truncsfdi2"
2594 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "=f")
2595 1.1.1.1.4.2 yamt (match_operator:DI 2 "fix_operator"
2596 1.1.1.1.4.2 yamt [(float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG"))]))]
2597 1.1.1.1.4.2 yamt "TARGET_FP"
2598 1.1.1.1.4.2 yamt "cvt%-q%/ %R1,%0"
2599 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2600 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2601 1.1.1.1.4.2 yamt (set_attr "round_suffix" "c")
2602 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "v_sv_svi")])
2603 1.1.1.1.4.2 yamt
2604 1.1.1.1.4.2 yamt (define_expand "fix_truncsfdi2"
2605 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "")
2606 1.1.1.1.4.2 yamt (fix:DI (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" ""))))]
2607 1.1.1.1.4.2 yamt "TARGET_FP"
2608 1.1.1.1.4.2 yamt "")
2609 1.1.1.1.4.2 yamt
2610 1.1.1.1.4.2 yamt (define_expand "fixuns_truncsfdi2"
2611 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "reg_no_subreg_operand" "")
2612 1.1.1.1.4.2 yamt (unsigned_fix:DI
2613 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" ""))))]
2614 1.1.1.1.4.2 yamt "TARGET_FP"
2615 1.1.1.1.4.2 yamt "")
2616 1.1.1.1.4.2 yamt
2617 1.1.1.1.4.2 yamt (define_expand "fix_trunctfdi2"
2618 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
2619 1.1.1.1.4.2 yamt (use (match_operand:TF 1 "general_operand" ""))]
2620 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2621 1.1.1.1.4.2 yamt "alpha_emit_xfloating_cvt (FIX, operands); DONE;")
2622 1.1.1.1.4.2 yamt
2623 1.1.1.1.4.2 yamt (define_expand "fixuns_trunctfdi2"
2624 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
2625 1.1.1.1.4.2 yamt (use (match_operand:TF 1 "general_operand" ""))]
2626 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2627 1.1.1.1.4.2 yamt "alpha_emit_xfloating_cvt (UNSIGNED_FIX, operands); DONE;")
2628 1.1.1.1.4.2 yamt
2629 1.1.1.1.4.2 yamt (define_insn "*floatdisf_ieee"
2630 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
2631 1.1.1.1.4.2 yamt (float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
2632 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2633 1.1.1.1.4.2 yamt "cvtq%,%/ %1,%0"
2634 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2635 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2636 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2637 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "sui")])
2638 1.1.1.1.4.2 yamt
2639 1.1.1.1.4.2 yamt (define_insn "floatdisf2"
2640 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2641 1.1.1.1.4.2 yamt (float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
2642 1.1.1.1.4.2 yamt "TARGET_FP"
2643 1.1.1.1.4.2 yamt "cvtq%,%/ %1,%0"
2644 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2645 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2646 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2647 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "sui")])
2648 1.1.1.1.4.2 yamt
2649 1.1.1.1.4.2 yamt (define_insn_and_split "*floatsisf2_ieee"
2650 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
2651 1.1.1.1.4.2 yamt (float:SF (match_operand:SI 1 "memory_operand" "m")))
2652 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 2 "=&f"))
2653 1.1.1.1.4.2 yamt (clobber (match_scratch:SF 3 "=&f"))]
2654 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2655 1.1.1.1.4.2 yamt "#"
2656 1.1.1.1.4.2 yamt "&& reload_completed"
2657 1.1.1.1.4.2 yamt [(set (match_dup 3) (match_dup 1))
2658 1.1.1.1.4.2 yamt (set (match_dup 2) (unspec:DI [(match_dup 3)] UNSPEC_CVTLQ))
2659 1.1.1.1.4.2 yamt (set (match_dup 0) (float:SF (match_dup 2)))]
2660 1.1.1.1.4.2 yamt {
2661 1.1.1.1.4.2 yamt operands[1] = adjust_address (operands[1], SFmode, 0);
2662 1.1.1.1.4.2 yamt })
2663 1.1.1.1.4.2 yamt
2664 1.1.1.1.4.2 yamt (define_insn_and_split "*floatsisf2"
2665 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2666 1.1.1.1.4.2 yamt (float:SF (match_operand:SI 1 "memory_operand" "m")))]
2667 1.1.1.1.4.2 yamt "TARGET_FP"
2668 1.1.1.1.4.2 yamt "#"
2669 1.1.1.1.4.2 yamt "&& reload_completed"
2670 1.1.1.1.4.2 yamt [(set (match_dup 0) (match_dup 1))
2671 1.1.1.1.4.2 yamt (set (match_dup 2) (unspec:DI [(match_dup 0)] UNSPEC_CVTLQ))
2672 1.1.1.1.4.2 yamt (set (match_dup 0) (float:SF (match_dup 2)))]
2673 1.1.1.1.4.2 yamt {
2674 1.1.1.1.4.2 yamt operands[1] = adjust_address (operands[1], SFmode, 0);
2675 1.1.1.1.4.2 yamt operands[2] = gen_rtx_REG (DImode, REGNO (operands[0]));
2676 1.1.1.1.4.2 yamt })
2677 1.1.1.1.4.2 yamt
2678 1.1.1.1.4.2 yamt (define_insn "*floatdidf_ieee"
2679 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
2680 1.1.1.1.4.2 yamt (float:DF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
2681 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2682 1.1.1.1.4.2 yamt "cvtq%-%/ %1,%0"
2683 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2684 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2685 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2686 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "sui")])
2687 1.1.1.1.4.2 yamt
2688 1.1.1.1.4.2 yamt (define_insn "floatdidf2"
2689 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2690 1.1.1.1.4.2 yamt (float:DF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
2691 1.1.1.1.4.2 yamt "TARGET_FP"
2692 1.1.1.1.4.2 yamt "cvtq%-%/ %1,%0"
2693 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2694 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2695 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2696 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "sui")])
2697 1.1.1.1.4.2 yamt
2698 1.1.1.1.4.2 yamt (define_insn_and_split "*floatsidf2_ieee"
2699 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
2700 1.1.1.1.4.2 yamt (float:DF (match_operand:SI 1 "memory_operand" "m")))
2701 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 2 "=&f"))
2702 1.1.1.1.4.2 yamt (clobber (match_scratch:SF 3 "=&f"))]
2703 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2704 1.1.1.1.4.2 yamt "#"
2705 1.1.1.1.4.2 yamt "&& reload_completed"
2706 1.1.1.1.4.2 yamt [(set (match_dup 3) (match_dup 1))
2707 1.1.1.1.4.2 yamt (set (match_dup 2) (unspec:DI [(match_dup 3)] UNSPEC_CVTLQ))
2708 1.1.1.1.4.2 yamt (set (match_dup 0) (float:DF (match_dup 2)))]
2709 1.1.1.1.4.2 yamt {
2710 1.1.1.1.4.2 yamt operands[1] = adjust_address (operands[1], SFmode, 0);
2711 1.1.1.1.4.2 yamt })
2712 1.1.1.1.4.2 yamt
2713 1.1.1.1.4.2 yamt (define_insn_and_split "*floatsidf2"
2714 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2715 1.1.1.1.4.2 yamt (float:DF (match_operand:SI 1 "memory_operand" "m")))]
2716 1.1.1.1.4.2 yamt "TARGET_FP"
2717 1.1.1.1.4.2 yamt "#"
2718 1.1.1.1.4.2 yamt "&& reload_completed"
2719 1.1.1.1.4.2 yamt [(set (match_dup 3) (match_dup 1))
2720 1.1.1.1.4.2 yamt (set (match_dup 2) (unspec:DI [(match_dup 3)] UNSPEC_CVTLQ))
2721 1.1.1.1.4.2 yamt (set (match_dup 0) (float:DF (match_dup 2)))]
2722 1.1.1.1.4.2 yamt {
2723 1.1.1.1.4.2 yamt operands[1] = adjust_address (operands[1], SFmode, 0);
2724 1.1.1.1.4.2 yamt operands[2] = gen_rtx_REG (DImode, REGNO (operands[0]));
2725 1.1.1.1.4.2 yamt operands[3] = gen_rtx_REG (SFmode, REGNO (operands[0]));
2726 1.1.1.1.4.2 yamt })
2727 1.1.1.1.4.2 yamt
2728 1.1.1.1.4.2 yamt (define_expand "floatditf2"
2729 1.1.1.1.4.2 yamt [(use (match_operand:TF 0 "register_operand" ""))
2730 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "general_operand" ""))]
2731 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2732 1.1.1.1.4.2 yamt "alpha_emit_xfloating_cvt (FLOAT, operands); DONE;")
2733 1.1.1.1.4.2 yamt
2734 1.1.1.1.4.2 yamt (define_expand "floatunsdisf2"
2735 1.1.1.1.4.2 yamt [(use (match_operand:SF 0 "register_operand" ""))
2736 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "register_operand" ""))]
2737 1.1.1.1.4.2 yamt "TARGET_FP"
2738 1.1.1.1.4.2 yamt "alpha_emit_floatuns (operands); DONE;")
2739 1.1.1.1.4.2 yamt
2740 1.1.1.1.4.2 yamt (define_expand "floatunsdidf2"
2741 1.1.1.1.4.2 yamt [(use (match_operand:DF 0 "register_operand" ""))
2742 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "register_operand" ""))]
2743 1.1.1.1.4.2 yamt "TARGET_FP"
2744 1.1.1.1.4.2 yamt "alpha_emit_floatuns (operands); DONE;")
2745 1.1.1.1.4.2 yamt
2746 1.1.1.1.4.2 yamt (define_expand "floatunsditf2"
2747 1.1.1.1.4.2 yamt [(use (match_operand:TF 0 "register_operand" ""))
2748 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "general_operand" ""))]
2749 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2750 1.1.1.1.4.2 yamt "alpha_emit_xfloating_cvt (UNSIGNED_FLOAT, operands); DONE;")
2751 1.1.1.1.4.2 yamt
2752 1.1.1.1.4.2 yamt (define_expand "extendsfdf2"
2753 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "")
2754 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "")))]
2755 1.1.1.1.4.2 yamt "TARGET_FP"
2756 1.1.1.1.4.2 yamt {
2757 1.1.1.1.4.2 yamt if (alpha_fptm >= ALPHA_FPTM_SU)
2758 1.1.1.1.4.2 yamt operands[1] = force_reg (SFmode, operands[1]);
2759 1.1.1.1.4.2 yamt })
2760 1.1.1.1.4.2 yamt
2761 1.1.1.1.4.2 yamt ;; The Unicos/Mk assembler doesn't support cvtst, but we've already
2762 1.1.1.1.4.2 yamt ;; asserted that alpha_fptm == ALPHA_FPTM_N.
2763 1.1.1.1.4.2 yamt
2764 1.1.1.1.4.2 yamt (define_insn "*extendsfdf2_ieee"
2765 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
2766 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 1 "register_operand" "f")))]
2767 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2768 1.1.1.1.4.2 yamt "cvtsts %1,%0"
2769 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2770 1.1.1.1.4.2 yamt (set_attr "trap" "yes")])
2771 1.1.1.1.4.2 yamt
2772 1.1.1.1.4.2 yamt (define_insn "*extendsfdf2_internal"
2773 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f,f,m")
2774 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,m,f")))]
2775 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2776 1.1.1.1.4.2 yamt "@
2777 1.1.1.1.4.2 yamt cpys %1,%1,%0
2778 1.1.1.1.4.2 yamt ld%, %0,%1
2779 1.1.1.1.4.2 yamt st%- %1,%0"
2780 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys,fld,fst")])
2781 1.1.1.1.4.2 yamt
2782 1.1.1.1.4.2 yamt ;; Use register_operand for operand 1 to prevent compress_float_constant
2783 1.1.1.1.4.2 yamt ;; from doing something silly. When optimizing we'll put things back
2784 1.1.1.1.4.2 yamt ;; together anyway.
2785 1.1.1.1.4.2 yamt (define_expand "extendsftf2"
2786 1.1.1.1.4.2 yamt [(use (match_operand:TF 0 "register_operand" ""))
2787 1.1.1.1.4.2 yamt (use (match_operand:SF 1 "register_operand" ""))]
2788 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2789 1.1.1.1.4.2 yamt {
2790 1.1.1.1.4.2 yamt rtx tmp = gen_reg_rtx (DFmode);
2791 1.1.1.1.4.2 yamt emit_insn (gen_extendsfdf2 (tmp, operands[1]));
2792 1.1.1.1.4.2 yamt emit_insn (gen_extenddftf2 (operands[0], tmp));
2793 1.1.1.1.4.2 yamt DONE;
2794 1.1.1.1.4.2 yamt })
2795 1.1.1.1.4.2 yamt
2796 1.1.1.1.4.2 yamt (define_expand "extenddftf2"
2797 1.1.1.1.4.2 yamt [(use (match_operand:TF 0 "register_operand" ""))
2798 1.1.1.1.4.2 yamt (use (match_operand:DF 1 "register_operand" ""))]
2799 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2800 1.1.1.1.4.2 yamt "alpha_emit_xfloating_cvt (FLOAT_EXTEND, operands); DONE;")
2801 1.1.1.1.4.2 yamt
2802 1.1.1.1.4.2 yamt (define_insn "*truncdfsf2_ieee"
2803 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
2804 1.1.1.1.4.2 yamt (float_truncate:SF (match_operand:DF 1 "reg_or_0_operand" "fG")))]
2805 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2806 1.1.1.1.4.2 yamt "cvt%-%,%/ %R1,%0"
2807 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2808 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2809 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2810 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2811 1.1.1.1.4.2 yamt
2812 1.1.1.1.4.2 yamt (define_insn "truncdfsf2"
2813 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2814 1.1.1.1.4.2 yamt (float_truncate:SF (match_operand:DF 1 "reg_or_0_operand" "fG")))]
2815 1.1.1.1.4.2 yamt "TARGET_FP"
2816 1.1.1.1.4.2 yamt "cvt%-%,%/ %R1,%0"
2817 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
2818 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2819 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2820 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2821 1.1.1.1.4.2 yamt
2822 1.1.1.1.4.2 yamt (define_expand "trunctfdf2"
2823 1.1.1.1.4.2 yamt [(use (match_operand:DF 0 "register_operand" ""))
2824 1.1.1.1.4.2 yamt (use (match_operand:TF 1 "general_operand" ""))]
2825 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2826 1.1.1.1.4.2 yamt "alpha_emit_xfloating_cvt (FLOAT_TRUNCATE, operands); DONE;")
2827 1.1.1.1.4.2 yamt
2828 1.1.1.1.4.2 yamt (define_expand "trunctfsf2"
2829 1.1.1.1.4.2 yamt [(use (match_operand:SF 0 "register_operand" ""))
2830 1.1.1.1.4.2 yamt (use (match_operand:TF 1 "general_operand" ""))]
2831 1.1.1.1.4.2 yamt "TARGET_FP && TARGET_HAS_XFLOATING_LIBS"
2832 1.1.1.1.4.2 yamt {
2833 1.1.1.1.4.2 yamt rtx tmpf, sticky, arg, lo, hi;
2834 1.1.1.1.4.2 yamt
2835 1.1.1.1.4.2 yamt tmpf = gen_reg_rtx (DFmode);
2836 1.1.1.1.4.2 yamt sticky = gen_reg_rtx (DImode);
2837 1.1.1.1.4.2 yamt arg = copy_to_mode_reg (TFmode, operands[1]);
2838 1.1.1.1.4.2 yamt lo = gen_lowpart (DImode, arg);
2839 1.1.1.1.4.2 yamt hi = gen_highpart (DImode, arg);
2840 1.1.1.1.4.2 yamt
2841 1.1.1.1.4.2 yamt /* Convert the low word of the TFmode value into a sticky rounding bit,
2842 1.1.1.1.4.2 yamt then or it into the low bit of the high word. This leaves the sticky
2843 1.1.1.1.4.2 yamt bit at bit 48 of the fraction, which is representable in DFmode,
2844 1.1.1.1.4.2 yamt which prevents rounding error in the final conversion to SFmode. */
2845 1.1.1.1.4.2 yamt
2846 1.1.1.1.4.2 yamt emit_insn (gen_rtx_SET (VOIDmode, sticky,
2847 1.1.1.1.4.2 yamt gen_rtx_NE (DImode, lo, const0_rtx)));
2848 1.1.1.1.4.2 yamt emit_insn (gen_iordi3 (hi, hi, sticky));
2849 1.1.1.1.4.2 yamt emit_insn (gen_trunctfdf2 (tmpf, arg));
2850 1.1.1.1.4.2 yamt emit_insn (gen_truncdfsf2 (operands[0], tmpf));
2851 1.1.1.1.4.2 yamt DONE;
2852 1.1.1.1.4.2 yamt })
2853 1.1.1.1.4.2 yamt
2854 1.1.1.1.4.2 yamt (define_insn "*divsf3_ieee"
2855 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
2856 1.1.1.1.4.2 yamt (div:SF (match_operand:SF 1 "reg_or_0_operand" "fG")
2857 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
2858 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2859 1.1.1.1.4.2 yamt "div%,%/ %R1,%R2,%0"
2860 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2861 1.1.1.1.4.2 yamt (set_attr "opsize" "si")
2862 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2863 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2864 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2865 1.1.1.1.4.2 yamt
2866 1.1.1.1.4.2 yamt (define_insn "divsf3"
2867 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2868 1.1.1.1.4.2 yamt (div:SF (match_operand:SF 1 "reg_or_0_operand" "fG")
2869 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
2870 1.1.1.1.4.2 yamt "TARGET_FP"
2871 1.1.1.1.4.2 yamt "div%,%/ %R1,%R2,%0"
2872 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2873 1.1.1.1.4.2 yamt (set_attr "opsize" "si")
2874 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2875 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2876 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2877 1.1.1.1.4.2 yamt
2878 1.1.1.1.4.2 yamt (define_insn "*divdf3_ieee"
2879 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
2880 1.1.1.1.4.2 yamt (div:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
2881 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2882 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2883 1.1.1.1.4.2 yamt "div%-%/ %R1,%R2,%0"
2884 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2885 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2886 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2887 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2888 1.1.1.1.4.2 yamt
2889 1.1.1.1.4.2 yamt (define_insn "divdf3"
2890 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2891 1.1.1.1.4.2 yamt (div:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
2892 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2893 1.1.1.1.4.2 yamt "TARGET_FP"
2894 1.1.1.1.4.2 yamt "div%-%/ %R1,%R2,%0"
2895 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2896 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2897 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2898 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2899 1.1.1.1.4.2 yamt
2900 1.1.1.1.4.2 yamt (define_insn "*divdf_ext1"
2901 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2902 1.1.1.1.4.2 yamt (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG"))
2903 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2904 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2905 1.1.1.1.4.2 yamt "div%-%/ %R1,%R2,%0"
2906 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2907 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2908 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2909 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2910 1.1.1.1.4.2 yamt
2911 1.1.1.1.4.2 yamt (define_insn "*divdf_ext2"
2912 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2913 1.1.1.1.4.2 yamt (div:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
2914 1.1.1.1.4.2 yamt (float_extend:DF
2915 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
2916 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2917 1.1.1.1.4.2 yamt "div%-%/ %R1,%R2,%0"
2918 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2919 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2920 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2921 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2922 1.1.1.1.4.2 yamt
2923 1.1.1.1.4.2 yamt (define_insn "*divdf_ext3"
2924 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2925 1.1.1.1.4.2 yamt (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG"))
2926 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
2927 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2928 1.1.1.1.4.2 yamt "div%-%/ %R1,%R2,%0"
2929 1.1.1.1.4.2 yamt [(set_attr "type" "fdiv")
2930 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2931 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2932 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2933 1.1.1.1.4.2 yamt
2934 1.1.1.1.4.2 yamt (define_expand "divtf3"
2935 1.1.1.1.4.2 yamt [(use (match_operand 0 "register_operand" ""))
2936 1.1.1.1.4.2 yamt (use (match_operand 1 "general_operand" ""))
2937 1.1.1.1.4.2 yamt (use (match_operand 2 "general_operand" ""))]
2938 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
2939 1.1.1.1.4.2 yamt "alpha_emit_xfloating_arith (DIV, operands); DONE;")
2940 1.1.1.1.4.2 yamt
2941 1.1.1.1.4.2 yamt (define_insn "*mulsf3_ieee"
2942 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
2943 1.1.1.1.4.2 yamt (mult:SF (match_operand:SF 1 "reg_or_0_operand" "%fG")
2944 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
2945 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2946 1.1.1.1.4.2 yamt "mul%,%/ %R1,%R2,%0"
2947 1.1.1.1.4.2 yamt [(set_attr "type" "fmul")
2948 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2949 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2950 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2951 1.1.1.1.4.2 yamt
2952 1.1.1.1.4.2 yamt (define_insn "mulsf3"
2953 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
2954 1.1.1.1.4.2 yamt (mult:SF (match_operand:SF 1 "reg_or_0_operand" "%fG")
2955 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
2956 1.1.1.1.4.2 yamt "TARGET_FP"
2957 1.1.1.1.4.2 yamt "mul%,%/ %R1,%R2,%0"
2958 1.1.1.1.4.2 yamt [(set_attr "type" "fmul")
2959 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2960 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2961 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2962 1.1.1.1.4.2 yamt
2963 1.1.1.1.4.2 yamt (define_insn "*muldf3_ieee"
2964 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
2965 1.1.1.1.4.2 yamt (mult:DF (match_operand:DF 1 "reg_or_0_operand" "%fG")
2966 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2967 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
2968 1.1.1.1.4.2 yamt "mul%-%/ %R1,%R2,%0"
2969 1.1.1.1.4.2 yamt [(set_attr "type" "fmul")
2970 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2971 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2972 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2973 1.1.1.1.4.2 yamt
2974 1.1.1.1.4.2 yamt (define_insn "muldf3"
2975 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2976 1.1.1.1.4.2 yamt (mult:DF (match_operand:DF 1 "reg_or_0_operand" "%fG")
2977 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2978 1.1.1.1.4.2 yamt "TARGET_FP"
2979 1.1.1.1.4.2 yamt "mul%-%/ %R1,%R2,%0"
2980 1.1.1.1.4.2 yamt [(set_attr "type" "fmul")
2981 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2982 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2983 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2984 1.1.1.1.4.2 yamt
2985 1.1.1.1.4.2 yamt (define_insn "*muldf_ext1"
2986 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2987 1.1.1.1.4.2 yamt (mult:DF (float_extend:DF
2988 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG"))
2989 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
2990 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
2991 1.1.1.1.4.2 yamt "mul%-%/ %R1,%R2,%0"
2992 1.1.1.1.4.2 yamt [(set_attr "type" "fmul")
2993 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
2994 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
2995 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
2996 1.1.1.1.4.2 yamt
2997 1.1.1.1.4.2 yamt (define_insn "*muldf_ext2"
2998 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
2999 1.1.1.1.4.2 yamt (mult:DF (float_extend:DF
3000 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "%fG"))
3001 1.1.1.1.4.2 yamt (float_extend:DF
3002 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
3003 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3004 1.1.1.1.4.2 yamt "mul%-%/ %R1,%R2,%0"
3005 1.1.1.1.4.2 yamt [(set_attr "type" "fmul")
3006 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3007 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3008 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3009 1.1.1.1.4.2 yamt
3010 1.1.1.1.4.2 yamt (define_expand "multf3"
3011 1.1.1.1.4.2 yamt [(use (match_operand 0 "register_operand" ""))
3012 1.1.1.1.4.2 yamt (use (match_operand 1 "general_operand" ""))
3013 1.1.1.1.4.2 yamt (use (match_operand 2 "general_operand" ""))]
3014 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
3015 1.1.1.1.4.2 yamt "alpha_emit_xfloating_arith (MULT, operands); DONE;")
3016 1.1.1.1.4.2 yamt
3017 1.1.1.1.4.2 yamt (define_insn "*subsf3_ieee"
3018 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
3019 1.1.1.1.4.2 yamt (minus:SF (match_operand:SF 1 "reg_or_0_operand" "fG")
3020 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
3021 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
3022 1.1.1.1.4.2 yamt "sub%,%/ %R1,%R2,%0"
3023 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3024 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3025 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3026 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3027 1.1.1.1.4.2 yamt
3028 1.1.1.1.4.2 yamt (define_insn "subsf3"
3029 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
3030 1.1.1.1.4.2 yamt (minus:SF (match_operand:SF 1 "reg_or_0_operand" "fG")
3031 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG")))]
3032 1.1.1.1.4.2 yamt "TARGET_FP"
3033 1.1.1.1.4.2 yamt "sub%,%/ %R1,%R2,%0"
3034 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3035 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3036 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3037 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3038 1.1.1.1.4.2 yamt
3039 1.1.1.1.4.2 yamt (define_insn "*subdf3_ieee"
3040 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
3041 1.1.1.1.4.2 yamt (minus:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
3042 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
3043 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
3044 1.1.1.1.4.2 yamt "sub%-%/ %R1,%R2,%0"
3045 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3046 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3047 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3048 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3049 1.1.1.1.4.2 yamt
3050 1.1.1.1.4.2 yamt (define_insn "subdf3"
3051 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3052 1.1.1.1.4.2 yamt (minus:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
3053 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
3054 1.1.1.1.4.2 yamt "TARGET_FP"
3055 1.1.1.1.4.2 yamt "sub%-%/ %R1,%R2,%0"
3056 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3057 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3058 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3059 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3060 1.1.1.1.4.2 yamt
3061 1.1.1.1.4.2 yamt (define_insn "*subdf_ext1"
3062 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3063 1.1.1.1.4.2 yamt (minus:DF (float_extend:DF
3064 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG"))
3065 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "fG")))]
3066 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3067 1.1.1.1.4.2 yamt "sub%-%/ %R1,%R2,%0"
3068 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3069 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3070 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3071 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3072 1.1.1.1.4.2 yamt
3073 1.1.1.1.4.2 yamt (define_insn "*subdf_ext2"
3074 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3075 1.1.1.1.4.2 yamt (minus:DF (match_operand:DF 1 "reg_or_0_operand" "fG")
3076 1.1.1.1.4.2 yamt (float_extend:DF
3077 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
3078 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3079 1.1.1.1.4.2 yamt "sub%-%/ %R1,%R2,%0"
3080 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3081 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3082 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3083 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3084 1.1.1.1.4.2 yamt
3085 1.1.1.1.4.2 yamt (define_insn "*subdf_ext3"
3086 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3087 1.1.1.1.4.2 yamt (minus:DF (float_extend:DF
3088 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG"))
3089 1.1.1.1.4.2 yamt (float_extend:DF
3090 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))))]
3091 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3092 1.1.1.1.4.2 yamt "sub%-%/ %R1,%R2,%0"
3093 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3094 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3095 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3096 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3097 1.1.1.1.4.2 yamt
3098 1.1.1.1.4.2 yamt (define_expand "subtf3"
3099 1.1.1.1.4.2 yamt [(use (match_operand 0 "register_operand" ""))
3100 1.1.1.1.4.2 yamt (use (match_operand 1 "general_operand" ""))
3101 1.1.1.1.4.2 yamt (use (match_operand 2 "general_operand" ""))]
3102 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
3103 1.1.1.1.4.2 yamt "alpha_emit_xfloating_arith (MINUS, operands); DONE;")
3104 1.1.1.1.4.2 yamt
3105 1.1.1.1.4.2 yamt (define_insn "*sqrtsf2_ieee"
3106 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=&f")
3107 1.1.1.1.4.2 yamt (sqrt:SF (match_operand:SF 1 "reg_or_0_operand" "fG")))]
3108 1.1.1.1.4.2 yamt "TARGET_FP && TARGET_FIX && alpha_fptm >= ALPHA_FPTM_SU"
3109 1.1.1.1.4.2 yamt "sqrt%,%/ %R1,%0"
3110 1.1.1.1.4.2 yamt [(set_attr "type" "fsqrt")
3111 1.1.1.1.4.2 yamt (set_attr "opsize" "si")
3112 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3113 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3114 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3115 1.1.1.1.4.2 yamt
3116 1.1.1.1.4.2 yamt (define_insn "sqrtsf2"
3117 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f")
3118 1.1.1.1.4.2 yamt (sqrt:SF (match_operand:SF 1 "reg_or_0_operand" "fG")))]
3119 1.1.1.1.4.2 yamt "TARGET_FP && TARGET_FIX"
3120 1.1.1.1.4.2 yamt "sqrt%,%/ %R1,%0"
3121 1.1.1.1.4.2 yamt [(set_attr "type" "fsqrt")
3122 1.1.1.1.4.2 yamt (set_attr "opsize" "si")
3123 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3124 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3125 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3126 1.1.1.1.4.2 yamt
3127 1.1.1.1.4.2 yamt (define_insn "*sqrtdf2_ieee"
3128 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
3129 1.1.1.1.4.2 yamt (sqrt:DF (match_operand:DF 1 "reg_or_0_operand" "fG")))]
3130 1.1.1.1.4.2 yamt "TARGET_FP && TARGET_FIX && alpha_fptm >= ALPHA_FPTM_SU"
3131 1.1.1.1.4.2 yamt "sqrt%-%/ %R1,%0"
3132 1.1.1.1.4.2 yamt [(set_attr "type" "fsqrt")
3133 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3134 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3135 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3136 1.1.1.1.4.2 yamt
3137 1.1.1.1.4.2 yamt (define_insn "sqrtdf2"
3138 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3139 1.1.1.1.4.2 yamt (sqrt:DF (match_operand:DF 1 "reg_or_0_operand" "fG")))]
3140 1.1.1.1.4.2 yamt "TARGET_FP && TARGET_FIX"
3141 1.1.1.1.4.2 yamt "sqrt%-%/ %R1,%0"
3142 1.1.1.1.4.2 yamt [(set_attr "type" "fsqrt")
3143 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3144 1.1.1.1.4.2 yamt (set_attr "round_suffix" "normal")
3145 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "u_su_sui")])
3146 1.1.1.1.4.2 yamt
3148 1.1.1.1.4.2 yamt ;; Next are all the integer comparisons, and conditional moves and branches
3149 1.1.1.1.4.2 yamt ;; and some of the related define_expand's and define_split's.
3150 1.1.1.1.4.2 yamt
3151 1.1.1.1.4.2 yamt (define_insn "*setcc_internal"
3152 1.1.1.1.4.2 yamt [(set (match_operand 0 "register_operand" "=r")
3153 1.1.1.1.4.2 yamt (match_operator 1 "alpha_comparison_operator"
3154 1.1.1.1.4.2 yamt [(match_operand:DI 2 "register_operand" "r")
3155 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "rI")]))]
3156 1.1.1.1.4.2 yamt "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT
3157 1.1.1.1.4.2 yamt && GET_MODE_SIZE (GET_MODE (operands[0])) <= 8
3158 1.1.1.1.4.2 yamt && GET_MODE (operands[0]) == GET_MODE (operands[1])"
3159 1.1.1.1.4.2 yamt "cmp%C1 %2,%3,%0"
3160 1.1.1.1.4.2 yamt [(set_attr "type" "icmp")])
3161 1.1.1.1.4.2 yamt
3162 1.1.1.1.4.2 yamt ;; Yes, we can technically support reg_or_8bit_operand in operand 2,
3163 1.1.1.1.4.2 yamt ;; but that's non-canonical rtl and allowing that causes inefficiencies
3164 1.1.1.1.4.2 yamt ;; from cse on.
3165 1.1.1.1.4.2 yamt (define_insn "*setcc_swapped_internal"
3166 1.1.1.1.4.2 yamt [(set (match_operand 0 "register_operand" "=r")
3167 1.1.1.1.4.2 yamt (match_operator 1 "alpha_swapped_comparison_operator"
3168 1.1.1.1.4.2 yamt [(match_operand:DI 2 "register_operand" "r")
3169 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_0_operand" "rJ")]))]
3170 1.1.1.1.4.2 yamt "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT
3171 1.1.1.1.4.2 yamt && GET_MODE_SIZE (GET_MODE (operands[0])) <= 8
3172 1.1.1.1.4.2 yamt && GET_MODE (operands[0]) == GET_MODE (operands[1])"
3173 1.1.1.1.4.2 yamt "cmp%c1 %r3,%2,%0"
3174 1.1.1.1.4.2 yamt [(set_attr "type" "icmp")])
3175 1.1.1.1.4.2 yamt
3176 1.1.1.1.4.2 yamt ;; Use match_operator rather than ne directly so that we can match
3177 1.1.1.1.4.2 yamt ;; multiple integer modes.
3178 1.1.1.1.4.2 yamt (define_insn "*setne_internal"
3179 1.1.1.1.4.2 yamt [(set (match_operand 0 "register_operand" "=r")
3180 1.1.1.1.4.2 yamt (match_operator 1 "signed_comparison_operator"
3181 1.1.1.1.4.2 yamt [(match_operand:DI 2 "register_operand" "r")
3182 1.1.1.1.4.2 yamt (const_int 0)]))]
3183 1.1.1.1.4.2 yamt "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT
3184 1.1.1.1.4.2 yamt && GET_MODE_SIZE (GET_MODE (operands[0])) <= 8
3185 1.1.1.1.4.2 yamt && GET_CODE (operands[1]) == NE
3186 1.1.1.1.4.2 yamt && GET_MODE (operands[0]) == GET_MODE (operands[1])"
3187 1.1.1.1.4.2 yamt "cmpult $31,%2,%0"
3188 1.1.1.1.4.2 yamt [(set_attr "type" "icmp")])
3189 1.1.1.1.4.2 yamt
3190 1.1.1.1.4.2 yamt ;; The mode folding trick can't be used with const_int operands, since
3191 1.1.1.1.4.2 yamt ;; reload needs to know the proper mode.
3192 1.1.1.1.4.2 yamt ;;
3193 1.1.1.1.4.2 yamt ;; Use add_operand instead of the more seemingly natural reg_or_8bit_operand
3194 1.1.1.1.4.2 yamt ;; in order to create more pairs of constants. As long as we're allowing
3195 1.1.1.1.4.2 yamt ;; two constants at the same time, and will have to reload one of them...
3196 1.1.1.1.4.2 yamt
3197 1.1.1.1.4.2 yamt (define_insn "*movqicc_internal"
3198 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r,r,r,r")
3199 1.1.1.1.4.2 yamt (if_then_else:QI
3200 1.1.1.1.4.2 yamt (match_operator 2 "signed_comparison_operator"
3201 1.1.1.1.4.2 yamt [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
3202 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
3203 1.1.1.1.4.2 yamt (match_operand:QI 1 "add_operand" "rI,0,rI,0")
3204 1.1.1.1.4.2 yamt (match_operand:QI 5 "add_operand" "0,rI,0,rI")))]
3205 1.1.1.1.4.2 yamt "(operands[3] == const0_rtx) ^ (operands[4] == const0_rtx)"
3206 1.1.1.1.4.2 yamt "@
3207 1.1.1.1.4.2 yamt cmov%C2 %r3,%1,%0
3208 1.1.1.1.4.2 yamt cmov%D2 %r3,%5,%0
3209 1.1.1.1.4.2 yamt cmov%c2 %r4,%1,%0
3210 1.1.1.1.4.2 yamt cmov%d2 %r4,%5,%0"
3211 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3212 1.1.1.1.4.2 yamt
3213 1.1.1.1.4.2 yamt (define_insn "*movhicc_internal"
3214 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r,r,r,r")
3215 1.1.1.1.4.2 yamt (if_then_else:HI
3216 1.1.1.1.4.2 yamt (match_operator 2 "signed_comparison_operator"
3217 1.1.1.1.4.2 yamt [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
3218 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
3219 1.1.1.1.4.2 yamt (match_operand:HI 1 "add_operand" "rI,0,rI,0")
3220 1.1.1.1.4.2 yamt (match_operand:HI 5 "add_operand" "0,rI,0,rI")))]
3221 1.1.1.1.4.2 yamt "(operands[3] == const0_rtx) ^ (operands[4] == const0_rtx)"
3222 1.1.1.1.4.2 yamt "@
3223 1.1.1.1.4.2 yamt cmov%C2 %r3,%1,%0
3224 1.1.1.1.4.2 yamt cmov%D2 %r3,%5,%0
3225 1.1.1.1.4.2 yamt cmov%c2 %r4,%1,%0
3226 1.1.1.1.4.2 yamt cmov%d2 %r4,%5,%0"
3227 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3228 1.1.1.1.4.2 yamt
3229 1.1.1.1.4.2 yamt (define_insn "*movsicc_internal"
3230 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
3231 1.1.1.1.4.2 yamt (if_then_else:SI
3232 1.1.1.1.4.2 yamt (match_operator 2 "signed_comparison_operator"
3233 1.1.1.1.4.2 yamt [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
3234 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
3235 1.1.1.1.4.2 yamt (match_operand:SI 1 "add_operand" "rI,0,rI,0")
3236 1.1.1.1.4.2 yamt (match_operand:SI 5 "add_operand" "0,rI,0,rI")))]
3237 1.1.1.1.4.2 yamt "(operands[3] == const0_rtx) ^ (operands[4] == const0_rtx)"
3238 1.1.1.1.4.2 yamt "@
3239 1.1.1.1.4.2 yamt cmov%C2 %r3,%1,%0
3240 1.1.1.1.4.2 yamt cmov%D2 %r3,%5,%0
3241 1.1.1.1.4.2 yamt cmov%c2 %r4,%1,%0
3242 1.1.1.1.4.2 yamt cmov%d2 %r4,%5,%0"
3243 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3244 1.1.1.1.4.2 yamt
3245 1.1.1.1.4.2 yamt (define_insn "*movdicc_internal"
3246 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
3247 1.1.1.1.4.2 yamt (if_then_else:DI
3248 1.1.1.1.4.2 yamt (match_operator 2 "signed_comparison_operator"
3249 1.1.1.1.4.2 yamt [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
3250 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
3251 1.1.1.1.4.2 yamt (match_operand:DI 1 "add_operand" "rI,0,rI,0")
3252 1.1.1.1.4.2 yamt (match_operand:DI 5 "add_operand" "0,rI,0,rI")))]
3253 1.1.1.1.4.2 yamt "(operands[3] == const0_rtx) ^ (operands[4] == const0_rtx)"
3254 1.1.1.1.4.2 yamt "@
3255 1.1.1.1.4.2 yamt cmov%C2 %r3,%1,%0
3256 1.1.1.1.4.2 yamt cmov%D2 %r3,%5,%0
3257 1.1.1.1.4.2 yamt cmov%c2 %r4,%1,%0
3258 1.1.1.1.4.2 yamt cmov%d2 %r4,%5,%0"
3259 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3260 1.1.1.1.4.2 yamt
3261 1.1.1.1.4.2 yamt (define_insn "*movqicc_lbc"
3262 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r,r")
3263 1.1.1.1.4.2 yamt (if_then_else:QI
3264 1.1.1.1.4.2 yamt (eq (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3265 1.1.1.1.4.2 yamt (const_int 1)
3266 1.1.1.1.4.2 yamt (const_int 0))
3267 1.1.1.1.4.2 yamt (const_int 0))
3268 1.1.1.1.4.2 yamt (match_operand:QI 1 "reg_or_8bit_operand" "rI,0")
3269 1.1.1.1.4.2 yamt (match_operand:QI 3 "reg_or_8bit_operand" "0,rI")))]
3270 1.1.1.1.4.2 yamt ""
3271 1.1.1.1.4.2 yamt "@
3272 1.1.1.1.4.2 yamt cmovlbc %r2,%1,%0
3273 1.1.1.1.4.2 yamt cmovlbs %r2,%3,%0"
3274 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3275 1.1.1.1.4.2 yamt
3276 1.1.1.1.4.2 yamt (define_insn "*movhicc_lbc"
3277 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r,r")
3278 1.1.1.1.4.2 yamt (if_then_else:HI
3279 1.1.1.1.4.2 yamt (eq (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3280 1.1.1.1.4.2 yamt (const_int 1)
3281 1.1.1.1.4.2 yamt (const_int 0))
3282 1.1.1.1.4.2 yamt (const_int 0))
3283 1.1.1.1.4.2 yamt (match_operand:HI 1 "reg_or_8bit_operand" "rI,0")
3284 1.1.1.1.4.2 yamt (match_operand:HI 3 "reg_or_8bit_operand" "0,rI")))]
3285 1.1.1.1.4.2 yamt ""
3286 1.1.1.1.4.2 yamt "@
3287 1.1.1.1.4.2 yamt cmovlbc %r2,%1,%0
3288 1.1.1.1.4.2 yamt cmovlbs %r2,%3,%0"
3289 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3290 1.1.1.1.4.2 yamt
3291 1.1.1.1.4.2 yamt (define_insn "*movsicc_lbc"
3292 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
3293 1.1.1.1.4.2 yamt (if_then_else:SI
3294 1.1.1.1.4.2 yamt (eq (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3295 1.1.1.1.4.2 yamt (const_int 1)
3296 1.1.1.1.4.2 yamt (const_int 0))
3297 1.1.1.1.4.2 yamt (const_int 0))
3298 1.1.1.1.4.2 yamt (match_operand:SI 1 "reg_or_8bit_operand" "rI,0")
3299 1.1.1.1.4.2 yamt (match_operand:SI 3 "reg_or_8bit_operand" "0,rI")))]
3300 1.1.1.1.4.2 yamt ""
3301 1.1.1.1.4.2 yamt "@
3302 1.1.1.1.4.2 yamt cmovlbc %r2,%1,%0
3303 1.1.1.1.4.2 yamt cmovlbs %r2,%3,%0"
3304 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3305 1.1.1.1.4.2 yamt
3306 1.1.1.1.4.2 yamt (define_insn "*movdicc_lbc"
3307 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
3308 1.1.1.1.4.2 yamt (if_then_else:DI
3309 1.1.1.1.4.2 yamt (eq (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3310 1.1.1.1.4.2 yamt (const_int 1)
3311 1.1.1.1.4.2 yamt (const_int 0))
3312 1.1.1.1.4.2 yamt (const_int 0))
3313 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_8bit_operand" "rI,0")
3314 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "0,rI")))]
3315 1.1.1.1.4.2 yamt ""
3316 1.1.1.1.4.2 yamt "@
3317 1.1.1.1.4.2 yamt cmovlbc %r2,%1,%0
3318 1.1.1.1.4.2 yamt cmovlbs %r2,%3,%0"
3319 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3320 1.1.1.1.4.2 yamt
3321 1.1.1.1.4.2 yamt (define_insn "*movqicc_lbs"
3322 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r,r")
3323 1.1.1.1.4.2 yamt (if_then_else:QI
3324 1.1.1.1.4.2 yamt (ne (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3325 1.1.1.1.4.2 yamt (const_int 1)
3326 1.1.1.1.4.2 yamt (const_int 0))
3327 1.1.1.1.4.2 yamt (const_int 0))
3328 1.1.1.1.4.2 yamt (match_operand:QI 1 "reg_or_8bit_operand" "rI,0")
3329 1.1.1.1.4.2 yamt (match_operand:QI 3 "reg_or_8bit_operand" "0,rI")))]
3330 1.1.1.1.4.2 yamt ""
3331 1.1.1.1.4.2 yamt "@
3332 1.1.1.1.4.2 yamt cmovlbs %r2,%1,%0
3333 1.1.1.1.4.2 yamt cmovlbc %r2,%3,%0"
3334 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3335 1.1.1.1.4.2 yamt
3336 1.1.1.1.4.2 yamt (define_insn "*movhicc_lbs"
3337 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r,r")
3338 1.1.1.1.4.2 yamt (if_then_else:HI
3339 1.1.1.1.4.2 yamt (ne (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3340 1.1.1.1.4.2 yamt (const_int 1)
3341 1.1.1.1.4.2 yamt (const_int 0))
3342 1.1.1.1.4.2 yamt (const_int 0))
3343 1.1.1.1.4.2 yamt (match_operand:HI 1 "reg_or_8bit_operand" "rI,0")
3344 1.1.1.1.4.2 yamt (match_operand:HI 3 "reg_or_8bit_operand" "0,rI")))]
3345 1.1.1.1.4.2 yamt ""
3346 1.1.1.1.4.2 yamt "@
3347 1.1.1.1.4.2 yamt cmovlbs %r2,%1,%0
3348 1.1.1.1.4.2 yamt cmovlbc %r2,%3,%0"
3349 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3350 1.1.1.1.4.2 yamt
3351 1.1.1.1.4.2 yamt (define_insn "*movsicc_lbs"
3352 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r,r")
3353 1.1.1.1.4.2 yamt (if_then_else:SI
3354 1.1.1.1.4.2 yamt (ne (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3355 1.1.1.1.4.2 yamt (const_int 1)
3356 1.1.1.1.4.2 yamt (const_int 0))
3357 1.1.1.1.4.2 yamt (const_int 0))
3358 1.1.1.1.4.2 yamt (match_operand:SI 1 "reg_or_8bit_operand" "rI,0")
3359 1.1.1.1.4.2 yamt (match_operand:SI 3 "reg_or_8bit_operand" "0,rI")))]
3360 1.1.1.1.4.2 yamt ""
3361 1.1.1.1.4.2 yamt "@
3362 1.1.1.1.4.2 yamt cmovlbs %r2,%1,%0
3363 1.1.1.1.4.2 yamt cmovlbc %r2,%3,%0"
3364 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3365 1.1.1.1.4.2 yamt
3366 1.1.1.1.4.2 yamt (define_insn "*movdicc_lbs"
3367 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r")
3368 1.1.1.1.4.2 yamt (if_then_else:DI
3369 1.1.1.1.4.2 yamt (ne (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
3370 1.1.1.1.4.2 yamt (const_int 1)
3371 1.1.1.1.4.2 yamt (const_int 0))
3372 1.1.1.1.4.2 yamt (const_int 0))
3373 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_8bit_operand" "rI,0")
3374 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "0,rI")))]
3375 1.1.1.1.4.2 yamt ""
3376 1.1.1.1.4.2 yamt "@
3377 1.1.1.1.4.2 yamt cmovlbs %r2,%1,%0
3378 1.1.1.1.4.2 yamt cmovlbc %r2,%3,%0"
3379 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3380 1.1.1.1.4.2 yamt
3381 1.1.1.1.4.2 yamt ;; For ABS, we have two choices, depending on whether the input and output
3382 1.1.1.1.4.2 yamt ;; registers are the same or not.
3383 1.1.1.1.4.2 yamt (define_expand "absdi2"
3384 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3385 1.1.1.1.4.2 yamt (abs:DI (match_operand:DI 1 "register_operand" "")))]
3386 1.1.1.1.4.2 yamt ""
3387 1.1.1.1.4.2 yamt {
3388 1.1.1.1.4.2 yamt if (rtx_equal_p (operands[0], operands[1]))
3389 1.1.1.1.4.2 yamt emit_insn (gen_absdi2_same (operands[0], gen_reg_rtx (DImode)));
3390 1.1.1.1.4.2 yamt else
3391 1.1.1.1.4.2 yamt emit_insn (gen_absdi2_diff (operands[0], operands[1]));
3392 1.1.1.1.4.2 yamt DONE;
3393 1.1.1.1.4.2 yamt })
3394 1.1.1.1.4.2 yamt
3395 1.1.1.1.4.2 yamt (define_expand "absdi2_same"
3396 1.1.1.1.4.2 yamt [(set (match_operand:DI 1 "register_operand" "")
3397 1.1.1.1.4.2 yamt (neg:DI (match_operand:DI 0 "register_operand" "")))
3398 1.1.1.1.4.2 yamt (set (match_dup 0)
3399 1.1.1.1.4.2 yamt (if_then_else:DI (ge (match_dup 0) (const_int 0))
3400 1.1.1.1.4.2 yamt (match_dup 0)
3401 1.1.1.1.4.2 yamt (match_dup 1)))]
3402 1.1.1.1.4.2 yamt ""
3403 1.1.1.1.4.2 yamt "")
3404 1.1.1.1.4.2 yamt
3405 1.1.1.1.4.2 yamt (define_expand "absdi2_diff"
3406 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3407 1.1.1.1.4.2 yamt (neg:DI (match_operand:DI 1 "register_operand" "")))
3408 1.1.1.1.4.2 yamt (set (match_dup 0)
3409 1.1.1.1.4.2 yamt (if_then_else:DI (lt (match_dup 1) (const_int 0))
3410 1.1.1.1.4.2 yamt (match_dup 0)
3411 1.1.1.1.4.2 yamt (match_dup 1)))]
3412 1.1.1.1.4.2 yamt ""
3413 1.1.1.1.4.2 yamt "")
3414 1.1.1.1.4.2 yamt
3415 1.1.1.1.4.2 yamt (define_split
3416 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3417 1.1.1.1.4.2 yamt (abs:DI (match_dup 0)))
3418 1.1.1.1.4.2 yamt (clobber (match_operand:DI 1 "register_operand" ""))]
3419 1.1.1.1.4.2 yamt ""
3420 1.1.1.1.4.2 yamt [(set (match_dup 1) (neg:DI (match_dup 0)))
3421 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (ge (match_dup 0) (const_int 0))
3422 1.1.1.1.4.2 yamt (match_dup 0) (match_dup 1)))]
3423 1.1.1.1.4.2 yamt "")
3424 1.1.1.1.4.2 yamt
3425 1.1.1.1.4.2 yamt (define_split
3426 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3427 1.1.1.1.4.2 yamt (abs:DI (match_operand:DI 1 "register_operand" "")))]
3428 1.1.1.1.4.2 yamt "! rtx_equal_p (operands[0], operands[1])"
3429 1.1.1.1.4.2 yamt [(set (match_dup 0) (neg:DI (match_dup 1)))
3430 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (lt (match_dup 1) (const_int 0))
3431 1.1.1.1.4.2 yamt (match_dup 0) (match_dup 1)))]
3432 1.1.1.1.4.2 yamt "")
3433 1.1.1.1.4.2 yamt
3434 1.1.1.1.4.2 yamt (define_split
3435 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3436 1.1.1.1.4.2 yamt (neg:DI (abs:DI (match_dup 0))))
3437 1.1.1.1.4.2 yamt (clobber (match_operand:DI 1 "register_operand" ""))]
3438 1.1.1.1.4.2 yamt ""
3439 1.1.1.1.4.2 yamt [(set (match_dup 1) (neg:DI (match_dup 0)))
3440 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (le (match_dup 0) (const_int 0))
3441 1.1.1.1.4.2 yamt (match_dup 0) (match_dup 1)))]
3442 1.1.1.1.4.2 yamt "")
3443 1.1.1.1.4.2 yamt
3444 1.1.1.1.4.2 yamt (define_split
3445 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3446 1.1.1.1.4.2 yamt (neg:DI (abs:DI (match_operand:DI 1 "register_operand" ""))))]
3447 1.1.1.1.4.2 yamt "! rtx_equal_p (operands[0], operands[1])"
3448 1.1.1.1.4.2 yamt [(set (match_dup 0) (neg:DI (match_dup 1)))
3449 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (gt (match_dup 1) (const_int 0))
3450 1.1.1.1.4.2 yamt (match_dup 0) (match_dup 1)))]
3451 1.1.1.1.4.2 yamt "")
3452 1.1.1.1.4.2 yamt
3453 1.1.1.1.4.2 yamt (define_insn "sminqi3"
3454 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r")
3455 1.1.1.1.4.2 yamt (smin:QI (match_operand:QI 1 "reg_or_0_operand" "%rJ")
3456 1.1.1.1.4.2 yamt (match_operand:QI 2 "reg_or_8bit_operand" "rI")))]
3457 1.1.1.1.4.2 yamt "TARGET_MAX"
3458 1.1.1.1.4.2 yamt "minsb8 %r1,%2,%0"
3459 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3460 1.1.1.1.4.2 yamt
3461 1.1.1.1.4.2 yamt (define_insn "uminqi3"
3462 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r")
3463 1.1.1.1.4.2 yamt (umin:QI (match_operand:QI 1 "reg_or_0_operand" "%rJ")
3464 1.1.1.1.4.2 yamt (match_operand:QI 2 "reg_or_8bit_operand" "rI")))]
3465 1.1.1.1.4.2 yamt "TARGET_MAX"
3466 1.1.1.1.4.2 yamt "minub8 %r1,%2,%0"
3467 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3468 1.1.1.1.4.2 yamt
3469 1.1.1.1.4.2 yamt (define_insn "smaxqi3"
3470 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r")
3471 1.1.1.1.4.2 yamt (smax:QI (match_operand:QI 1 "reg_or_0_operand" "%rJ")
3472 1.1.1.1.4.2 yamt (match_operand:QI 2 "reg_or_8bit_operand" "rI")))]
3473 1.1.1.1.4.2 yamt "TARGET_MAX"
3474 1.1.1.1.4.2 yamt "maxsb8 %r1,%2,%0"
3475 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3476 1.1.1.1.4.2 yamt
3477 1.1.1.1.4.2 yamt (define_insn "umaxqi3"
3478 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r")
3479 1.1.1.1.4.2 yamt (umax:QI (match_operand:QI 1 "reg_or_0_operand" "%rJ")
3480 1.1.1.1.4.2 yamt (match_operand:QI 2 "reg_or_8bit_operand" "rI")))]
3481 1.1.1.1.4.2 yamt "TARGET_MAX"
3482 1.1.1.1.4.2 yamt "maxub8 %r1,%2,%0"
3483 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3484 1.1.1.1.4.2 yamt
3485 1.1.1.1.4.2 yamt (define_insn "sminhi3"
3486 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r")
3487 1.1.1.1.4.2 yamt (smin:HI (match_operand:HI 1 "reg_or_0_operand" "%rJ")
3488 1.1.1.1.4.2 yamt (match_operand:HI 2 "reg_or_8bit_operand" "rI")))]
3489 1.1.1.1.4.2 yamt "TARGET_MAX"
3490 1.1.1.1.4.2 yamt "minsw4 %r1,%2,%0"
3491 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3492 1.1.1.1.4.2 yamt
3493 1.1.1.1.4.2 yamt (define_insn "uminhi3"
3494 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r")
3495 1.1.1.1.4.2 yamt (umin:HI (match_operand:HI 1 "reg_or_0_operand" "%rJ")
3496 1.1.1.1.4.2 yamt (match_operand:HI 2 "reg_or_8bit_operand" "rI")))]
3497 1.1.1.1.4.2 yamt "TARGET_MAX"
3498 1.1.1.1.4.2 yamt "minuw4 %r1,%2,%0"
3499 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3500 1.1.1.1.4.2 yamt
3501 1.1.1.1.4.2 yamt (define_insn "smaxhi3"
3502 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r")
3503 1.1.1.1.4.2 yamt (smax:HI (match_operand:HI 1 "reg_or_0_operand" "%rJ")
3504 1.1.1.1.4.2 yamt (match_operand:HI 2 "reg_or_8bit_operand" "rI")))]
3505 1.1.1.1.4.2 yamt "TARGET_MAX"
3506 1.1.1.1.4.2 yamt "maxsw4 %r1,%2,%0"
3507 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3508 1.1.1.1.4.2 yamt
3509 1.1.1.1.4.2 yamt (define_insn "umaxhi3"
3510 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r")
3511 1.1.1.1.4.2 yamt (umax:HI (match_operand:HI 1 "reg_or_0_operand" "%rJ")
3512 1.1.1.1.4.2 yamt (match_operand:HI 2 "reg_or_8bit_operand" "rI")))]
3513 1.1.1.1.4.2 yamt "TARGET_MAX"
3514 1.1.1.1.4.2 yamt "maxuw4 %r1,%2,%0"
3515 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
3516 1.1.1.1.4.2 yamt
3517 1.1.1.1.4.2 yamt (define_expand "smaxdi3"
3518 1.1.1.1.4.2 yamt [(set (match_dup 3)
3519 1.1.1.1.4.2 yamt (le:DI (match_operand:DI 1 "reg_or_0_operand" "")
3520 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3521 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
3522 1.1.1.1.4.2 yamt (if_then_else:DI (eq (match_dup 3) (const_int 0))
3523 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3524 1.1.1.1.4.2 yamt ""
3525 1.1.1.1.4.2 yamt { operands[3] = gen_reg_rtx (DImode); })
3526 1.1.1.1.4.2 yamt
3527 1.1.1.1.4.2 yamt (define_split
3528 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3529 1.1.1.1.4.2 yamt (smax:DI (match_operand:DI 1 "reg_or_0_operand" "")
3530 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3531 1.1.1.1.4.2 yamt (clobber (match_operand:DI 3 "register_operand" ""))]
3532 1.1.1.1.4.2 yamt "operands[2] != const0_rtx"
3533 1.1.1.1.4.2 yamt [(set (match_dup 3) (le:DI (match_dup 1) (match_dup 2)))
3534 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (eq (match_dup 3) (const_int 0))
3535 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3536 1.1.1.1.4.2 yamt "")
3537 1.1.1.1.4.2 yamt
3538 1.1.1.1.4.2 yamt (define_insn "*smax_const0"
3539 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
3540 1.1.1.1.4.2 yamt (smax:DI (match_operand:DI 1 "register_operand" "0")
3541 1.1.1.1.4.2 yamt (const_int 0)))]
3542 1.1.1.1.4.2 yamt ""
3543 1.1.1.1.4.2 yamt "cmovlt %0,0,%0"
3544 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3545 1.1.1.1.4.2 yamt
3546 1.1.1.1.4.2 yamt (define_expand "smindi3"
3547 1.1.1.1.4.2 yamt [(set (match_dup 3)
3548 1.1.1.1.4.2 yamt (lt:DI (match_operand:DI 1 "reg_or_0_operand" "")
3549 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3550 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
3551 1.1.1.1.4.2 yamt (if_then_else:DI (ne (match_dup 3) (const_int 0))
3552 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3553 1.1.1.1.4.2 yamt ""
3554 1.1.1.1.4.2 yamt { operands[3] = gen_reg_rtx (DImode); })
3555 1.1.1.1.4.2 yamt
3556 1.1.1.1.4.2 yamt (define_split
3557 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3558 1.1.1.1.4.2 yamt (smin:DI (match_operand:DI 1 "reg_or_0_operand" "")
3559 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3560 1.1.1.1.4.2 yamt (clobber (match_operand:DI 3 "register_operand" ""))]
3561 1.1.1.1.4.2 yamt "operands[2] != const0_rtx"
3562 1.1.1.1.4.2 yamt [(set (match_dup 3) (lt:DI (match_dup 1) (match_dup 2)))
3563 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (ne (match_dup 3) (const_int 0))
3564 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3565 1.1.1.1.4.2 yamt "")
3566 1.1.1.1.4.2 yamt
3567 1.1.1.1.4.2 yamt (define_insn "*smin_const0"
3568 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
3569 1.1.1.1.4.2 yamt (smin:DI (match_operand:DI 1 "register_operand" "0")
3570 1.1.1.1.4.2 yamt (const_int 0)))]
3571 1.1.1.1.4.2 yamt ""
3572 1.1.1.1.4.2 yamt "cmovgt %0,0,%0"
3573 1.1.1.1.4.2 yamt [(set_attr "type" "icmov")])
3574 1.1.1.1.4.2 yamt
3575 1.1.1.1.4.2 yamt (define_expand "umaxdi3"
3576 1.1.1.1.4.2 yamt [(set (match_dup 3)
3577 1.1.1.1.4.2 yamt (leu:DI (match_operand:DI 1 "reg_or_0_operand" "")
3578 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3579 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
3580 1.1.1.1.4.2 yamt (if_then_else:DI (eq (match_dup 3) (const_int 0))
3581 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3582 1.1.1.1.4.2 yamt ""
3583 1.1.1.1.4.2 yamt "operands[3] = gen_reg_rtx (DImode);")
3584 1.1.1.1.4.2 yamt
3585 1.1.1.1.4.2 yamt (define_split
3586 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3587 1.1.1.1.4.2 yamt (umax:DI (match_operand:DI 1 "reg_or_0_operand" "")
3588 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3589 1.1.1.1.4.2 yamt (clobber (match_operand:DI 3 "register_operand" ""))]
3590 1.1.1.1.4.2 yamt "operands[2] != const0_rtx"
3591 1.1.1.1.4.2 yamt [(set (match_dup 3) (leu:DI (match_dup 1) (match_dup 2)))
3592 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (eq (match_dup 3) (const_int 0))
3593 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3594 1.1.1.1.4.2 yamt "")
3595 1.1.1.1.4.2 yamt
3596 1.1.1.1.4.2 yamt (define_expand "umindi3"
3597 1.1.1.1.4.2 yamt [(set (match_dup 3)
3598 1.1.1.1.4.2 yamt (ltu:DI (match_operand:DI 1 "reg_or_0_operand" "")
3599 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3600 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
3601 1.1.1.1.4.2 yamt (if_then_else:DI (ne (match_dup 3) (const_int 0))
3602 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3603 1.1.1.1.4.2 yamt ""
3604 1.1.1.1.4.2 yamt "operands[3] = gen_reg_rtx (DImode);")
3605 1.1.1.1.4.2 yamt
3606 1.1.1.1.4.2 yamt (define_split
3607 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3608 1.1.1.1.4.2 yamt (umin:DI (match_operand:DI 1 "reg_or_0_operand" "")
3609 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")))
3610 1.1.1.1.4.2 yamt (clobber (match_operand:DI 3 "register_operand" ""))]
3611 1.1.1.1.4.2 yamt "operands[2] != const0_rtx"
3612 1.1.1.1.4.2 yamt [(set (match_dup 3) (ltu:DI (match_dup 1) (match_dup 2)))
3613 1.1.1.1.4.2 yamt (set (match_dup 0) (if_then_else:DI (ne (match_dup 3) (const_int 0))
3614 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3615 1.1.1.1.4.2 yamt "")
3616 1.1.1.1.4.2 yamt
3617 1.1.1.1.4.2 yamt (define_insn "*bcc_normal"
3618 1.1.1.1.4.2 yamt [(set (pc)
3619 1.1.1.1.4.2 yamt (if_then_else
3620 1.1.1.1.4.2 yamt (match_operator 1 "signed_comparison_operator"
3621 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
3622 1.1.1.1.4.2 yamt (const_int 0)])
3623 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))
3624 1.1.1.1.4.2 yamt (pc)))]
3625 1.1.1.1.4.2 yamt ""
3626 1.1.1.1.4.2 yamt "b%C1 %r2,%0"
3627 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
3628 1.1.1.1.4.2 yamt
3629 1.1.1.1.4.2 yamt (define_insn "*bcc_reverse"
3630 1.1.1.1.4.2 yamt [(set (pc)
3631 1.1.1.1.4.2 yamt (if_then_else
3632 1.1.1.1.4.2 yamt (match_operator 1 "signed_comparison_operator"
3633 1.1.1.1.4.2 yamt [(match_operand:DI 2 "register_operand" "r")
3634 1.1.1.1.4.2 yamt (const_int 0)])
3635 1.1.1.1.4.2 yamt
3636 1.1.1.1.4.2 yamt (pc)
3637 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))))]
3638 1.1.1.1.4.2 yamt ""
3639 1.1.1.1.4.2 yamt "b%c1 %2,%0"
3640 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
3641 1.1.1.1.4.2 yamt
3642 1.1.1.1.4.2 yamt (define_insn "*blbs_normal"
3643 1.1.1.1.4.2 yamt [(set (pc)
3644 1.1.1.1.4.2 yamt (if_then_else
3645 1.1.1.1.4.2 yamt (ne (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
3646 1.1.1.1.4.2 yamt (const_int 1)
3647 1.1.1.1.4.2 yamt (const_int 0))
3648 1.1.1.1.4.2 yamt (const_int 0))
3649 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))
3650 1.1.1.1.4.2 yamt (pc)))]
3651 1.1.1.1.4.2 yamt ""
3652 1.1.1.1.4.2 yamt "blbs %r1,%0"
3653 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
3654 1.1.1.1.4.2 yamt
3655 1.1.1.1.4.2 yamt (define_insn "*blbc_normal"
3656 1.1.1.1.4.2 yamt [(set (pc)
3657 1.1.1.1.4.2 yamt (if_then_else
3658 1.1.1.1.4.2 yamt (eq (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
3659 1.1.1.1.4.2 yamt (const_int 1)
3660 1.1.1.1.4.2 yamt (const_int 0))
3661 1.1.1.1.4.2 yamt (const_int 0))
3662 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))
3663 1.1.1.1.4.2 yamt (pc)))]
3664 1.1.1.1.4.2 yamt ""
3665 1.1.1.1.4.2 yamt "blbc %r1,%0"
3666 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
3667 1.1.1.1.4.2 yamt
3668 1.1.1.1.4.2 yamt (define_split
3669 1.1.1.1.4.2 yamt [(parallel
3670 1.1.1.1.4.2 yamt [(set (pc)
3671 1.1.1.1.4.2 yamt (if_then_else
3672 1.1.1.1.4.2 yamt (match_operator 1 "comparison_operator"
3673 1.1.1.1.4.2 yamt [(zero_extract:DI (match_operand:DI 2 "register_operand" "")
3674 1.1.1.1.4.2 yamt (const_int 1)
3675 1.1.1.1.4.2 yamt (match_operand:DI 3 "const_int_operand" ""))
3676 1.1.1.1.4.2 yamt (const_int 0)])
3677 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))
3678 1.1.1.1.4.2 yamt (pc)))
3679 1.1.1.1.4.2 yamt (clobber (match_operand:DI 4 "register_operand" ""))])]
3680 1.1.1.1.4.2 yamt "INTVAL (operands[3]) != 0"
3681 1.1.1.1.4.2 yamt [(set (match_dup 4)
3682 1.1.1.1.4.2 yamt (lshiftrt:DI (match_dup 2) (match_dup 3)))
3683 1.1.1.1.4.2 yamt (set (pc)
3684 1.1.1.1.4.2 yamt (if_then_else (match_op_dup 1
3685 1.1.1.1.4.2 yamt [(zero_extract:DI (match_dup 4)
3686 1.1.1.1.4.2 yamt (const_int 1)
3687 1.1.1.1.4.2 yamt (const_int 0))
3688 1.1.1.1.4.2 yamt (const_int 0)])
3689 1.1.1.1.4.2 yamt (label_ref (match_dup 0))
3690 1.1.1.1.4.2 yamt (pc)))]
3691 1.1.1.1.4.2 yamt "")
3692 1.1.1.1.4.2 yamt
3694 1.1.1.1.4.2 yamt ;; The following are the corresponding floating-point insns. Recall
3695 1.1.1.1.4.2 yamt ;; we need to have variants that expand the arguments from SFmode
3696 1.1.1.1.4.2 yamt ;; to DFmode.
3697 1.1.1.1.4.2 yamt
3698 1.1.1.1.4.2 yamt (define_insn "*cmpdf_ieee"
3699 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=&f")
3700 1.1.1.1.4.2 yamt (match_operator:DF 1 "alpha_fp_comparison_operator"
3701 1.1.1.1.4.2 yamt [(match_operand:DF 2 "reg_or_0_operand" "fG")
3702 1.1.1.1.4.2 yamt (match_operand:DF 3 "reg_or_0_operand" "fG")]))]
3703 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm >= ALPHA_FPTM_SU"
3704 1.1.1.1.4.2 yamt "cmp%-%C1%/ %R2,%R3,%0"
3705 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3706 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3707 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "su")])
3708 1.1.1.1.4.2 yamt
3709 1.1.1.1.4.2 yamt (define_insn "*cmpdf_internal"
3710 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3711 1.1.1.1.4.2 yamt (match_operator:DF 1 "alpha_fp_comparison_operator"
3712 1.1.1.1.4.2 yamt [(match_operand:DF 2 "reg_or_0_operand" "fG")
3713 1.1.1.1.4.2 yamt (match_operand:DF 3 "reg_or_0_operand" "fG")]))]
3714 1.1.1.1.4.2 yamt "TARGET_FP"
3715 1.1.1.1.4.2 yamt "cmp%-%C1%/ %R2,%R3,%0"
3716 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3717 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3718 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "su")])
3719 1.1.1.1.4.2 yamt
3720 1.1.1.1.4.2 yamt (define_insn "*cmpdf_ext1"
3721 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3722 1.1.1.1.4.2 yamt (match_operator:DF 1 "alpha_fp_comparison_operator"
3723 1.1.1.1.4.2 yamt [(float_extend:DF
3724 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))
3725 1.1.1.1.4.2 yamt (match_operand:DF 3 "reg_or_0_operand" "fG")]))]
3726 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3727 1.1.1.1.4.2 yamt "cmp%-%C1%/ %R2,%R3,%0"
3728 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3729 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3730 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "su")])
3731 1.1.1.1.4.2 yamt
3732 1.1.1.1.4.2 yamt (define_insn "*cmpdf_ext2"
3733 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3734 1.1.1.1.4.2 yamt (match_operator:DF 1 "alpha_fp_comparison_operator"
3735 1.1.1.1.4.2 yamt [(match_operand:DF 2 "reg_or_0_operand" "fG")
3736 1.1.1.1.4.2 yamt (float_extend:DF
3737 1.1.1.1.4.2 yamt (match_operand:SF 3 "reg_or_0_operand" "fG"))]))]
3738 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3739 1.1.1.1.4.2 yamt "cmp%-%C1%/ %R2,%R3,%0"
3740 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3741 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3742 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "su")])
3743 1.1.1.1.4.2 yamt
3744 1.1.1.1.4.2 yamt (define_insn "*cmpdf_ext3"
3745 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f")
3746 1.1.1.1.4.2 yamt (match_operator:DF 1 "alpha_fp_comparison_operator"
3747 1.1.1.1.4.2 yamt [(float_extend:DF
3748 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))
3749 1.1.1.1.4.2 yamt (float_extend:DF
3750 1.1.1.1.4.2 yamt (match_operand:SF 3 "reg_or_0_operand" "fG"))]))]
3751 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3752 1.1.1.1.4.2 yamt "cmp%-%C1%/ %R2,%R3,%0"
3753 1.1.1.1.4.2 yamt [(set_attr "type" "fadd")
3754 1.1.1.1.4.2 yamt (set_attr "trap" "yes")
3755 1.1.1.1.4.2 yamt (set_attr "trap_suffix" "su")])
3756 1.1.1.1.4.2 yamt
3757 1.1.1.1.4.2 yamt (define_insn "*movdfcc_internal"
3758 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f,f")
3759 1.1.1.1.4.2 yamt (if_then_else:DF
3760 1.1.1.1.4.2 yamt (match_operator 3 "signed_comparison_operator"
3761 1.1.1.1.4.2 yamt [(match_operand:DF 4 "reg_or_0_operand" "fG,fG")
3762 1.1.1.1.4.2 yamt (match_operand:DF 2 "const0_operand" "G,G")])
3763 1.1.1.1.4.2 yamt (match_operand:DF 1 "reg_or_0_operand" "fG,0")
3764 1.1.1.1.4.2 yamt (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
3765 1.1.1.1.4.2 yamt "TARGET_FP"
3766 1.1.1.1.4.2 yamt "@
3767 1.1.1.1.4.2 yamt fcmov%C3 %R4,%R1,%0
3768 1.1.1.1.4.2 yamt fcmov%D3 %R4,%R5,%0"
3769 1.1.1.1.4.2 yamt [(set_attr "type" "fcmov")])
3770 1.1.1.1.4.2 yamt
3771 1.1.1.1.4.2 yamt (define_insn "*movsfcc_internal"
3772 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f,f")
3773 1.1.1.1.4.2 yamt (if_then_else:SF
3774 1.1.1.1.4.2 yamt (match_operator 3 "signed_comparison_operator"
3775 1.1.1.1.4.2 yamt [(match_operand:DF 4 "reg_or_0_operand" "fG,fG")
3776 1.1.1.1.4.2 yamt (match_operand:DF 2 "const0_operand" "G,G")])
3777 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG,0")
3778 1.1.1.1.4.2 yamt (match_operand:SF 5 "reg_or_0_operand" "0,fG")))]
3779 1.1.1.1.4.2 yamt "TARGET_FP"
3780 1.1.1.1.4.2 yamt "@
3781 1.1.1.1.4.2 yamt fcmov%C3 %R4,%R1,%0
3782 1.1.1.1.4.2 yamt fcmov%D3 %R4,%R5,%0"
3783 1.1.1.1.4.2 yamt [(set_attr "type" "fcmov")])
3784 1.1.1.1.4.2 yamt
3785 1.1.1.1.4.2 yamt (define_insn "*movdfcc_ext1"
3786 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f,f")
3787 1.1.1.1.4.2 yamt (if_then_else:DF
3788 1.1.1.1.4.2 yamt (match_operator 3 "signed_comparison_operator"
3789 1.1.1.1.4.2 yamt [(match_operand:DF 4 "reg_or_0_operand" "fG,fG")
3790 1.1.1.1.4.2 yamt (match_operand:DF 2 "const0_operand" "G,G")])
3791 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG,0"))
3792 1.1.1.1.4.2 yamt (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
3793 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3794 1.1.1.1.4.2 yamt "@
3795 1.1.1.1.4.2 yamt fcmov%C3 %R4,%R1,%0
3796 1.1.1.1.4.2 yamt fcmov%D3 %R4,%R5,%0"
3797 1.1.1.1.4.2 yamt [(set_attr "type" "fcmov")])
3798 1.1.1.1.4.2 yamt
3799 1.1.1.1.4.2 yamt (define_insn "*movdfcc_ext2"
3800 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f,f")
3801 1.1.1.1.4.2 yamt (if_then_else:DF
3802 1.1.1.1.4.2 yamt (match_operator 3 "signed_comparison_operator"
3803 1.1.1.1.4.2 yamt [(float_extend:DF
3804 1.1.1.1.4.2 yamt (match_operand:SF 4 "reg_or_0_operand" "fG,fG"))
3805 1.1.1.1.4.2 yamt (match_operand:DF 2 "const0_operand" "G,G")])
3806 1.1.1.1.4.2 yamt (match_operand:DF 1 "reg_or_0_operand" "fG,0")
3807 1.1.1.1.4.2 yamt (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
3808 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3809 1.1.1.1.4.2 yamt "@
3810 1.1.1.1.4.2 yamt fcmov%C3 %R4,%R1,%0
3811 1.1.1.1.4.2 yamt fcmov%D3 %R4,%R5,%0"
3812 1.1.1.1.4.2 yamt [(set_attr "type" "fcmov")])
3813 1.1.1.1.4.2 yamt
3814 1.1.1.1.4.2 yamt (define_insn "*movdfcc_ext3"
3815 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "=f,f")
3816 1.1.1.1.4.2 yamt (if_then_else:SF
3817 1.1.1.1.4.2 yamt (match_operator 3 "signed_comparison_operator"
3818 1.1.1.1.4.2 yamt [(float_extend:DF
3819 1.1.1.1.4.2 yamt (match_operand:SF 4 "reg_or_0_operand" "fG,fG"))
3820 1.1.1.1.4.2 yamt (match_operand:DF 2 "const0_operand" "G,G")])
3821 1.1.1.1.4.2 yamt (match_operand:SF 1 "reg_or_0_operand" "fG,0")
3822 1.1.1.1.4.2 yamt (match_operand:SF 5 "reg_or_0_operand" "0,fG")))]
3823 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3824 1.1.1.1.4.2 yamt "@
3825 1.1.1.1.4.2 yamt fcmov%C3 %R4,%R1,%0
3826 1.1.1.1.4.2 yamt fcmov%D3 %R4,%R5,%0"
3827 1.1.1.1.4.2 yamt [(set_attr "type" "fcmov")])
3828 1.1.1.1.4.2 yamt
3829 1.1.1.1.4.2 yamt (define_insn "*movdfcc_ext4"
3830 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "=f,f")
3831 1.1.1.1.4.2 yamt (if_then_else:DF
3832 1.1.1.1.4.2 yamt (match_operator 3 "signed_comparison_operator"
3833 1.1.1.1.4.2 yamt [(float_extend:DF
3834 1.1.1.1.4.2 yamt (match_operand:SF 4 "reg_or_0_operand" "fG,fG"))
3835 1.1.1.1.4.2 yamt (match_operand:DF 2 "const0_operand" "G,G")])
3836 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" "fG,0"))
3837 1.1.1.1.4.2 yamt (match_operand:DF 5 "reg_or_0_operand" "0,fG")))]
3838 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3839 1.1.1.1.4.2 yamt "@
3840 1.1.1.1.4.2 yamt fcmov%C3 %R4,%R1,%0
3841 1.1.1.1.4.2 yamt fcmov%D3 %R4,%R5,%0"
3842 1.1.1.1.4.2 yamt [(set_attr "type" "fcmov")])
3843 1.1.1.1.4.2 yamt
3844 1.1.1.1.4.2 yamt (define_expand "smaxdf3"
3845 1.1.1.1.4.2 yamt [(set (match_dup 3)
3846 1.1.1.1.4.2 yamt (le:DF (match_operand:DF 1 "reg_or_0_operand" "")
3847 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "")))
3848 1.1.1.1.4.2 yamt (set (match_operand:DF 0 "register_operand" "")
3849 1.1.1.1.4.2 yamt (if_then_else:DF (eq (match_dup 3) (match_dup 4))
3850 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3851 1.1.1.1.4.2 yamt "TARGET_FP"
3852 1.1.1.1.4.2 yamt {
3853 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DFmode);
3854 1.1.1.1.4.2 yamt operands[4] = CONST0_RTX (DFmode);
3855 1.1.1.1.4.2 yamt })
3856 1.1.1.1.4.2 yamt
3857 1.1.1.1.4.2 yamt (define_expand "smindf3"
3858 1.1.1.1.4.2 yamt [(set (match_dup 3)
3859 1.1.1.1.4.2 yamt (lt:DF (match_operand:DF 1 "reg_or_0_operand" "")
3860 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "")))
3861 1.1.1.1.4.2 yamt (set (match_operand:DF 0 "register_operand" "")
3862 1.1.1.1.4.2 yamt (if_then_else:DF (ne (match_dup 3) (match_dup 4))
3863 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3864 1.1.1.1.4.2 yamt "TARGET_FP"
3865 1.1.1.1.4.2 yamt {
3866 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DFmode);
3867 1.1.1.1.4.2 yamt operands[4] = CONST0_RTX (DFmode);
3868 1.1.1.1.4.2 yamt })
3869 1.1.1.1.4.2 yamt
3870 1.1.1.1.4.2 yamt (define_expand "smaxsf3"
3871 1.1.1.1.4.2 yamt [(set (match_dup 3)
3872 1.1.1.1.4.2 yamt (le:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" ""))
3873 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 2 "reg_or_0_operand" ""))))
3874 1.1.1.1.4.2 yamt (set (match_operand:SF 0 "register_operand" "")
3875 1.1.1.1.4.2 yamt (if_then_else:SF (eq (match_dup 3) (match_dup 4))
3876 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3877 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3878 1.1.1.1.4.2 yamt {
3879 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DFmode);
3880 1.1.1.1.4.2 yamt operands[4] = CONST0_RTX (DFmode);
3881 1.1.1.1.4.2 yamt })
3882 1.1.1.1.4.2 yamt
3883 1.1.1.1.4.2 yamt (define_expand "sminsf3"
3884 1.1.1.1.4.2 yamt [(set (match_dup 3)
3885 1.1.1.1.4.2 yamt (lt:DF (float_extend:DF (match_operand:SF 1 "reg_or_0_operand" ""))
3886 1.1.1.1.4.2 yamt (float_extend:DF (match_operand:SF 2 "reg_or_0_operand" ""))))
3887 1.1.1.1.4.2 yamt (set (match_operand:SF 0 "register_operand" "")
3888 1.1.1.1.4.2 yamt (if_then_else:SF (ne (match_dup 3) (match_dup 4))
3889 1.1.1.1.4.2 yamt (match_dup 1) (match_dup 2)))]
3890 1.1.1.1.4.2 yamt "TARGET_FP && alpha_fptm < ALPHA_FPTM_SU"
3891 1.1.1.1.4.2 yamt {
3892 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DFmode);
3893 1.1.1.1.4.2 yamt operands[4] = CONST0_RTX (DFmode);
3894 1.1.1.1.4.2 yamt })
3895 1.1.1.1.4.2 yamt
3896 1.1.1.1.4.2 yamt (define_insn "*fbcc_normal"
3897 1.1.1.1.4.2 yamt [(set (pc)
3898 1.1.1.1.4.2 yamt (if_then_else
3899 1.1.1.1.4.2 yamt (match_operator 1 "signed_comparison_operator"
3900 1.1.1.1.4.2 yamt [(match_operand:DF 2 "reg_or_0_operand" "fG")
3901 1.1.1.1.4.2 yamt (match_operand:DF 3 "const0_operand" "G")])
3902 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))
3903 1.1.1.1.4.2 yamt (pc)))]
3904 1.1.1.1.4.2 yamt "TARGET_FP"
3905 1.1.1.1.4.2 yamt "fb%C1 %R2,%0"
3906 1.1.1.1.4.2 yamt [(set_attr "type" "fbr")])
3907 1.1.1.1.4.2 yamt
3908 1.1.1.1.4.2 yamt (define_insn "*fbcc_ext_normal"
3909 1.1.1.1.4.2 yamt [(set (pc)
3910 1.1.1.1.4.2 yamt (if_then_else
3911 1.1.1.1.4.2 yamt (match_operator 1 "signed_comparison_operator"
3912 1.1.1.1.4.2 yamt [(float_extend:DF
3913 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_0_operand" "fG"))
3914 1.1.1.1.4.2 yamt (match_operand:DF 3 "const0_operand" "G")])
3915 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" ""))
3916 1.1.1.1.4.2 yamt (pc)))]
3917 1.1.1.1.4.2 yamt "TARGET_FP"
3918 1.1.1.1.4.2 yamt "fb%C1 %R2,%0"
3919 1.1.1.1.4.2 yamt [(set_attr "type" "fbr")])
3920 1.1.1.1.4.2 yamt
3922 1.1.1.1.4.2 yamt ;; These are the main define_expand's used to make conditional branches
3923 1.1.1.1.4.2 yamt ;; and compares.
3924 1.1.1.1.4.2 yamt
3925 1.1.1.1.4.2 yamt (define_expand "cbranchdf4"
3926 1.1.1.1.4.2 yamt [(use (match_operator 0 "alpha_cbranch_operator"
3927 1.1.1.1.4.2 yamt [(match_operand:DF 1 "reg_or_0_operand" "")
3928 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_0_operand" "")]))
3929 1.1.1.1.4.2 yamt (use (match_operand 3 ""))]
3930 1.1.1.1.4.2 yamt "TARGET_FP"
3931 1.1.1.1.4.2 yamt { alpha_emit_conditional_branch (operands, DFmode); DONE; })
3932 1.1.1.1.4.2 yamt
3933 1.1.1.1.4.2 yamt (define_expand "cbranchtf4"
3934 1.1.1.1.4.2 yamt [(use (match_operator 0 "alpha_cbranch_operator"
3935 1.1.1.1.4.2 yamt [(match_operand:TF 1 "general_operand")
3936 1.1.1.1.4.2 yamt (match_operand:TF 2 "general_operand")]))
3937 1.1.1.1.4.2 yamt (use (match_operand 3 ""))]
3938 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
3939 1.1.1.1.4.2 yamt { alpha_emit_conditional_branch (operands, TFmode); DONE; })
3940 1.1.1.1.4.2 yamt
3941 1.1.1.1.4.2 yamt (define_expand "cbranchdi4"
3942 1.1.1.1.4.2 yamt [(use (match_operator 0 "alpha_cbranch_operator"
3943 1.1.1.1.4.2 yamt [(match_operand:DI 1 "some_operand")
3944 1.1.1.1.4.2 yamt (match_operand:DI 2 "some_operand")]))
3945 1.1.1.1.4.2 yamt (use (match_operand 3 ""))]
3946 1.1.1.1.4.2 yamt ""
3947 1.1.1.1.4.2 yamt { alpha_emit_conditional_branch (operands, DImode); DONE; })
3948 1.1.1.1.4.2 yamt
3949 1.1.1.1.4.2 yamt (define_expand "cstoredf4"
3950 1.1.1.1.4.2 yamt [(use (match_operator:DI 1 "alpha_cbranch_operator"
3951 1.1.1.1.4.2 yamt [(match_operand:DF 2 "reg_or_0_operand")
3952 1.1.1.1.4.2 yamt (match_operand:DF 3 "reg_or_0_operand")]))
3953 1.1.1.1.4.2 yamt (clobber (match_operand:DI 0 "register_operand"))]
3954 1.1.1.1.4.2 yamt "TARGET_FP"
3955 1.1.1.1.4.2 yamt { if (!alpha_emit_setcc (operands, DFmode)) FAIL; else DONE; })
3956 1.1.1.1.4.2 yamt
3957 1.1.1.1.4.2 yamt (define_expand "cstoretf4"
3958 1.1.1.1.4.2 yamt [(use (match_operator:DI 1 "alpha_cbranch_operator"
3959 1.1.1.1.4.2 yamt [(match_operand:TF 2 "general_operand")
3960 1.1.1.1.4.2 yamt (match_operand:TF 3 "general_operand")]))
3961 1.1.1.1.4.2 yamt (clobber (match_operand:DI 0 "register_operand"))]
3962 1.1.1.1.4.2 yamt "TARGET_HAS_XFLOATING_LIBS"
3963 1.1.1.1.4.2 yamt { if (!alpha_emit_setcc (operands, TFmode)) FAIL; else DONE; })
3964 1.1.1.1.4.2 yamt
3965 1.1.1.1.4.2 yamt (define_expand "cstoredi4"
3966 1.1.1.1.4.2 yamt [(use (match_operator:DI 1 "alpha_cbranch_operator"
3967 1.1.1.1.4.2 yamt [(match_operand:DI 2 "some_operand")
3968 1.1.1.1.4.2 yamt (match_operand:DI 3 "some_operand")]))
3969 1.1.1.1.4.2 yamt (clobber (match_operand:DI 0 "register_operand"))]
3970 1.1.1.1.4.2 yamt ""
3971 1.1.1.1.4.2 yamt { if (!alpha_emit_setcc (operands, DImode)) FAIL; else DONE; })
3972 1.1.1.1.4.2 yamt
3974 1.1.1.1.4.2 yamt ;; These are the main define_expand's used to make conditional moves.
3975 1.1.1.1.4.2 yamt
3976 1.1.1.1.4.2 yamt (define_expand "movsicc"
3977 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "")
3978 1.1.1.1.4.2 yamt (if_then_else:SI (match_operand 1 "comparison_operator" "")
3979 1.1.1.1.4.2 yamt (match_operand:SI 2 "reg_or_8bit_operand" "")
3980 1.1.1.1.4.2 yamt (match_operand:SI 3 "reg_or_8bit_operand" "")))]
3981 1.1.1.1.4.2 yamt ""
3982 1.1.1.1.4.2 yamt {
3983 1.1.1.1.4.2 yamt if ((operands[1] = alpha_emit_conditional_move (operands[1], SImode)) == 0)
3984 1.1.1.1.4.2 yamt FAIL;
3985 1.1.1.1.4.2 yamt })
3986 1.1.1.1.4.2 yamt
3987 1.1.1.1.4.2 yamt (define_expand "movdicc"
3988 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
3989 1.1.1.1.4.2 yamt (if_then_else:DI (match_operand 1 "comparison_operator" "")
3990 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")
3991 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_8bit_operand" "")))]
3992 1.1.1.1.4.2 yamt ""
3993 1.1.1.1.4.2 yamt {
3994 1.1.1.1.4.2 yamt if ((operands[1] = alpha_emit_conditional_move (operands[1], DImode)) == 0)
3995 1.1.1.1.4.2 yamt FAIL;
3996 1.1.1.1.4.2 yamt })
3997 1.1.1.1.4.2 yamt
3998 1.1.1.1.4.2 yamt (define_expand "movsfcc"
3999 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "register_operand" "")
4000 1.1.1.1.4.2 yamt (if_then_else:SF (match_operand 1 "comparison_operator" "")
4001 1.1.1.1.4.2 yamt (match_operand:SF 2 "reg_or_8bit_operand" "")
4002 1.1.1.1.4.2 yamt (match_operand:SF 3 "reg_or_8bit_operand" "")))]
4003 1.1.1.1.4.2 yamt ""
4004 1.1.1.1.4.2 yamt {
4005 1.1.1.1.4.2 yamt if ((operands[1] = alpha_emit_conditional_move (operands[1], SFmode)) == 0)
4006 1.1.1.1.4.2 yamt FAIL;
4007 1.1.1.1.4.2 yamt })
4008 1.1.1.1.4.2 yamt
4009 1.1.1.1.4.2 yamt (define_expand "movdfcc"
4010 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "register_operand" "")
4011 1.1.1.1.4.2 yamt (if_then_else:DF (match_operand 1 "comparison_operator" "")
4012 1.1.1.1.4.2 yamt (match_operand:DF 2 "reg_or_8bit_operand" "")
4013 1.1.1.1.4.2 yamt (match_operand:DF 3 "reg_or_8bit_operand" "")))]
4014 1.1.1.1.4.2 yamt ""
4015 1.1.1.1.4.2 yamt {
4016 1.1.1.1.4.2 yamt if ((operands[1] = alpha_emit_conditional_move (operands[1], DFmode)) == 0)
4017 1.1.1.1.4.2 yamt FAIL;
4018 1.1.1.1.4.2 yamt })
4019 1.1.1.1.4.2 yamt
4021 1.1.1.1.4.2 yamt ;; These define_split definitions are used in cases when comparisons have
4022 1.1.1.1.4.2 yamt ;; not be stated in the correct way and we need to reverse the second
4023 1.1.1.1.4.2 yamt ;; comparison. For example, x >= 7 has to be done as x < 6 with the
4024 1.1.1.1.4.2 yamt ;; comparison that tests the result being reversed. We have one define_split
4025 1.1.1.1.4.2 yamt ;; for each use of a comparison. They do not match valid insns and need
4026 1.1.1.1.4.2 yamt ;; not generate valid insns.
4027 1.1.1.1.4.2 yamt ;;
4028 1.1.1.1.4.2 yamt ;; We can also handle equality comparisons (and inequality comparisons in
4029 1.1.1.1.4.2 yamt ;; cases where the resulting add cannot overflow) by doing an add followed by
4030 1.1.1.1.4.2 yamt ;; a comparison with zero. This is faster since the addition takes one
4031 1.1.1.1.4.2 yamt ;; less cycle than a compare when feeding into a conditional move.
4032 1.1.1.1.4.2 yamt ;; For this case, we also have an SImode pattern since we can merge the add
4033 1.1.1.1.4.2 yamt ;; and sign extend and the order doesn't matter.
4034 1.1.1.1.4.2 yamt ;;
4035 1.1.1.1.4.2 yamt ;; We do not do this for floating-point, since it isn't clear how the "wrong"
4036 1.1.1.1.4.2 yamt ;; operation could have been generated.
4037 1.1.1.1.4.2 yamt
4038 1.1.1.1.4.2 yamt (define_split
4039 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
4040 1.1.1.1.4.2 yamt (if_then_else:DI
4041 1.1.1.1.4.2 yamt (match_operator 1 "comparison_operator"
4042 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "")
4043 1.1.1.1.4.2 yamt (match_operand:DI 3 "reg_or_cint_operand" "")])
4044 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_cint_operand" "")
4045 1.1.1.1.4.2 yamt (match_operand:DI 5 "reg_or_cint_operand" "")))
4046 1.1.1.1.4.2 yamt (clobber (match_operand:DI 6 "register_operand" ""))]
4047 1.1.1.1.4.2 yamt "operands[3] != const0_rtx"
4048 1.1.1.1.4.2 yamt [(set (match_dup 6) (match_dup 7))
4049 1.1.1.1.4.2 yamt (set (match_dup 0)
4050 1.1.1.1.4.2 yamt (if_then_else:DI (match_dup 8) (match_dup 4) (match_dup 5)))]
4051 1.1.1.1.4.2 yamt {
4052 1.1.1.1.4.2 yamt enum rtx_code code = GET_CODE (operands[1]);
4053 1.1.1.1.4.2 yamt int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
4054 1.1.1.1.4.2 yamt
4055 1.1.1.1.4.2 yamt /* If we are comparing for equality with a constant and that constant
4056 1.1.1.1.4.2 yamt appears in the arm when the register equals the constant, use the
4057 1.1.1.1.4.2 yamt register since that is more likely to match (and to produce better code
4058 1.1.1.1.4.2 yamt if both would). */
4059 1.1.1.1.4.2 yamt
4060 1.1.1.1.4.2 yamt if (code == EQ && CONST_INT_P (operands[3])
4061 1.1.1.1.4.2 yamt && rtx_equal_p (operands[4], operands[3]))
4062 1.1.1.1.4.2 yamt operands[4] = operands[2];
4063 1.1.1.1.4.2 yamt
4064 1.1.1.1.4.2 yamt else if (code == NE && CONST_INT_P (operands[3])
4065 1.1.1.1.4.2 yamt && rtx_equal_p (operands[5], operands[3]))
4066 1.1.1.1.4.2 yamt operands[5] = operands[2];
4067 1.1.1.1.4.2 yamt
4068 1.1.1.1.4.2 yamt if (code == NE || code == EQ
4069 1.1.1.1.4.2 yamt || (extended_count (operands[2], DImode, unsignedp) >= 1
4070 1.1.1.1.4.2 yamt && extended_count (operands[3], DImode, unsignedp) >= 1))
4071 1.1.1.1.4.2 yamt {
4072 1.1.1.1.4.2 yamt if (CONST_INT_P (operands[3]))
4073 1.1.1.1.4.2 yamt operands[7] = gen_rtx_PLUS (DImode, operands[2],
4074 1.1.1.1.4.2 yamt GEN_INT (- INTVAL (operands[3])));
4075 1.1.1.1.4.2 yamt else
4076 1.1.1.1.4.2 yamt operands[7] = gen_rtx_MINUS (DImode, operands[2], operands[3]);
4077 1.1.1.1.4.2 yamt
4078 1.1.1.1.4.2 yamt operands[8] = gen_rtx_fmt_ee (code, VOIDmode, operands[6], const0_rtx);
4079 1.1.1.1.4.2 yamt }
4080 1.1.1.1.4.2 yamt
4081 1.1.1.1.4.2 yamt else if (code == EQ || code == LE || code == LT
4082 1.1.1.1.4.2 yamt || code == LEU || code == LTU)
4083 1.1.1.1.4.2 yamt {
4084 1.1.1.1.4.2 yamt operands[7] = gen_rtx_fmt_ee (code, DImode, operands[2], operands[3]);
4085 1.1.1.1.4.2 yamt operands[8] = gen_rtx_NE (VOIDmode, operands[6], const0_rtx);
4086 1.1.1.1.4.2 yamt }
4087 1.1.1.1.4.2 yamt else
4088 1.1.1.1.4.2 yamt {
4089 1.1.1.1.4.2 yamt operands[7] = gen_rtx_fmt_ee (reverse_condition (code), DImode,
4090 1.1.1.1.4.2 yamt operands[2], operands[3]);
4091 1.1.1.1.4.2 yamt operands[8] = gen_rtx_EQ (VOIDmode, operands[6], const0_rtx);
4092 1.1.1.1.4.2 yamt }
4093 1.1.1.1.4.2 yamt })
4094 1.1.1.1.4.2 yamt
4095 1.1.1.1.4.2 yamt (define_split
4096 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
4097 1.1.1.1.4.2 yamt (if_then_else:DI
4098 1.1.1.1.4.2 yamt (match_operator 1 "comparison_operator"
4099 1.1.1.1.4.2 yamt [(match_operand:SI 2 "reg_or_0_operand" "")
4100 1.1.1.1.4.2 yamt (match_operand:SI 3 "reg_or_cint_operand" "")])
4101 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_8bit_operand" "")
4102 1.1.1.1.4.2 yamt (match_operand:DI 5 "reg_or_8bit_operand" "")))
4103 1.1.1.1.4.2 yamt (clobber (match_operand:DI 6 "register_operand" ""))]
4104 1.1.1.1.4.2 yamt "operands[3] != const0_rtx
4105 1.1.1.1.4.2 yamt && (GET_CODE (operands[1]) == EQ || GET_CODE (operands[1]) == NE)"
4106 1.1.1.1.4.2 yamt [(set (match_dup 6) (match_dup 7))
4107 1.1.1.1.4.2 yamt (set (match_dup 0)
4108 1.1.1.1.4.2 yamt (if_then_else:DI (match_dup 8) (match_dup 4) (match_dup 5)))]
4109 1.1.1.1.4.2 yamt {
4110 1.1.1.1.4.2 yamt enum rtx_code code = GET_CODE (operands[1]);
4111 1.1.1.1.4.2 yamt int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
4112 1.1.1.1.4.2 yamt rtx tem;
4113 1.1.1.1.4.2 yamt
4114 1.1.1.1.4.2 yamt if ((code != NE && code != EQ
4115 1.1.1.1.4.2 yamt && ! (extended_count (operands[2], DImode, unsignedp) >= 1
4116 1.1.1.1.4.2 yamt && extended_count (operands[3], DImode, unsignedp) >= 1)))
4117 1.1.1.1.4.2 yamt FAIL;
4118 1.1.1.1.4.2 yamt
4119 1.1.1.1.4.2 yamt if (CONST_INT_P (operands[3]))
4120 1.1.1.1.4.2 yamt tem = gen_rtx_PLUS (SImode, operands[2],
4121 1.1.1.1.4.2 yamt GEN_INT (- INTVAL (operands[3])));
4122 1.1.1.1.4.2 yamt else
4123 1.1.1.1.4.2 yamt tem = gen_rtx_MINUS (SImode, operands[2], operands[3]);
4124 1.1.1.1.4.2 yamt
4125 1.1.1.1.4.2 yamt operands[7] = gen_rtx_SIGN_EXTEND (DImode, tem);
4126 1.1.1.1.4.2 yamt operands[8] = gen_rtx_fmt_ee (GET_CODE (operands[1]), VOIDmode,
4127 1.1.1.1.4.2 yamt operands[6], const0_rtx);
4128 1.1.1.1.4.2 yamt })
4129 1.1.1.1.4.2 yamt
4130 1.1.1.1.4.2 yamt ;; Prefer to use cmp and arithmetic when possible instead of a cmove.
4131 1.1.1.1.4.2 yamt
4132 1.1.1.1.4.2 yamt (define_split
4133 1.1.1.1.4.2 yamt [(set (match_operand 0 "register_operand" "")
4134 1.1.1.1.4.2 yamt (if_then_else (match_operator 1 "signed_comparison_operator"
4135 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "")
4136 1.1.1.1.4.2 yamt (const_int 0)])
4137 1.1.1.1.4.2 yamt (match_operand 3 "const_int_operand" "")
4138 1.1.1.1.4.2 yamt (match_operand 4 "const_int_operand" "")))]
4139 1.1.1.1.4.2 yamt ""
4140 1.1.1.1.4.2 yamt [(const_int 0)]
4141 1.1.1.1.4.2 yamt {
4142 1.1.1.1.4.2 yamt if (alpha_split_conditional_move (GET_CODE (operands[1]), operands[0],
4143 1.1.1.1.4.2 yamt operands[2], operands[3], operands[4]))
4144 1.1.1.1.4.2 yamt DONE;
4145 1.1.1.1.4.2 yamt else
4146 1.1.1.1.4.2 yamt FAIL;
4147 1.1.1.1.4.2 yamt })
4148 1.1.1.1.4.2 yamt
4149 1.1.1.1.4.2 yamt ;; ??? Why combine is allowed to create such non-canonical rtl, I don't know.
4150 1.1.1.1.4.2 yamt ;; Oh well, we match it in movcc, so it must be partially our fault.
4151 1.1.1.1.4.2 yamt (define_split
4152 1.1.1.1.4.2 yamt [(set (match_operand 0 "register_operand" "")
4153 1.1.1.1.4.2 yamt (if_then_else (match_operator 1 "signed_comparison_operator"
4154 1.1.1.1.4.2 yamt [(const_int 0)
4155 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")])
4156 1.1.1.1.4.2 yamt (match_operand 3 "const_int_operand" "")
4157 1.1.1.1.4.2 yamt (match_operand 4 "const_int_operand" "")))]
4158 1.1.1.1.4.2 yamt ""
4159 1.1.1.1.4.2 yamt [(const_int 0)]
4160 1.1.1.1.4.2 yamt {
4161 1.1.1.1.4.2 yamt if (alpha_split_conditional_move (swap_condition (GET_CODE (operands[1])),
4162 1.1.1.1.4.2 yamt operands[0], operands[2], operands[3],
4163 1.1.1.1.4.2 yamt operands[4]))
4164 1.1.1.1.4.2 yamt DONE;
4165 1.1.1.1.4.2 yamt else
4166 1.1.1.1.4.2 yamt FAIL;
4167 1.1.1.1.4.2 yamt })
4168 1.1.1.1.4.2 yamt
4169 1.1.1.1.4.2 yamt (define_insn_and_split "*cmp_sadd_di"
4170 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
4171 1.1.1.1.4.2 yamt (plus:DI (if_then_else:DI
4172 1.1.1.1.4.2 yamt (match_operator 1 "alpha_zero_comparison_operator"
4173 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
4174 1.1.1.1.4.2 yamt (const_int 0)])
4175 1.1.1.1.4.2 yamt (match_operand:DI 3 "const48_operand" "I")
4176 1.1.1.1.4.2 yamt (const_int 0))
4177 1.1.1.1.4.2 yamt (match_operand:DI 4 "sext_add_operand" "rIO")))
4178 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 5 "=r"))]
4179 1.1.1.1.4.2 yamt ""
4180 1.1.1.1.4.2 yamt "#"
4181 1.1.1.1.4.2 yamt ""
4182 1.1.1.1.4.2 yamt [(set (match_dup 5)
4183 1.1.1.1.4.2 yamt (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
4184 1.1.1.1.4.2 yamt (set (match_dup 0)
4185 1.1.1.1.4.2 yamt (plus:DI (mult:DI (match_dup 5) (match_dup 3))
4186 1.1.1.1.4.2 yamt (match_dup 4)))]
4187 1.1.1.1.4.2 yamt {
4188 1.1.1.1.4.2 yamt if (can_create_pseudo_p ())
4189 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
4190 1.1.1.1.4.2 yamt else if (reg_overlap_mentioned_p (operands[5], operands[4]))
4191 1.1.1.1.4.2 yamt operands[5] = operands[0];
4192 1.1.1.1.4.2 yamt })
4193 1.1.1.1.4.2 yamt
4194 1.1.1.1.4.2 yamt (define_insn_and_split "*cmp_sadd_si"
4195 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
4196 1.1.1.1.4.2 yamt (plus:SI (if_then_else:SI
4197 1.1.1.1.4.2 yamt (match_operator 1 "alpha_zero_comparison_operator"
4198 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
4199 1.1.1.1.4.2 yamt (const_int 0)])
4200 1.1.1.1.4.2 yamt (match_operand:SI 3 "const48_operand" "I")
4201 1.1.1.1.4.2 yamt (const_int 0))
4202 1.1.1.1.4.2 yamt (match_operand:SI 4 "sext_add_operand" "rIO")))
4203 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 5 "=r"))]
4204 1.1.1.1.4.2 yamt ""
4205 1.1.1.1.4.2 yamt "#"
4206 1.1.1.1.4.2 yamt ""
4207 1.1.1.1.4.2 yamt [(set (match_dup 5)
4208 1.1.1.1.4.2 yamt (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
4209 1.1.1.1.4.2 yamt (set (match_dup 0)
4210 1.1.1.1.4.2 yamt (plus:SI (mult:SI (match_dup 6) (match_dup 3))
4211 1.1.1.1.4.2 yamt (match_dup 4)))]
4212 1.1.1.1.4.2 yamt {
4213 1.1.1.1.4.2 yamt if (can_create_pseudo_p ())
4214 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
4215 1.1.1.1.4.2 yamt else if (reg_overlap_mentioned_p (operands[5], operands[4]))
4216 1.1.1.1.4.2 yamt operands[5] = gen_lowpart (DImode, operands[0]);
4217 1.1.1.1.4.2 yamt
4218 1.1.1.1.4.2 yamt operands[6] = gen_lowpart (SImode, operands[5]);
4219 1.1.1.1.4.2 yamt })
4220 1.1.1.1.4.2 yamt
4221 1.1.1.1.4.2 yamt (define_insn_and_split "*cmp_sadd_sidi"
4222 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
4223 1.1.1.1.4.2 yamt (sign_extend:DI
4224 1.1.1.1.4.2 yamt (plus:SI (if_then_else:SI
4225 1.1.1.1.4.2 yamt (match_operator 1 "alpha_zero_comparison_operator"
4226 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
4227 1.1.1.1.4.2 yamt (const_int 0)])
4228 1.1.1.1.4.2 yamt (match_operand:SI 3 "const48_operand" "I")
4229 1.1.1.1.4.2 yamt (const_int 0))
4230 1.1.1.1.4.2 yamt (match_operand:SI 4 "sext_add_operand" "rIO"))))
4231 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 5 "=r"))]
4232 1.1.1.1.4.2 yamt ""
4233 1.1.1.1.4.2 yamt "#"
4234 1.1.1.1.4.2 yamt ""
4235 1.1.1.1.4.2 yamt [(set (match_dup 5)
4236 1.1.1.1.4.2 yamt (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
4237 1.1.1.1.4.2 yamt (set (match_dup 0)
4238 1.1.1.1.4.2 yamt (sign_extend:DI (plus:SI (mult:SI (match_dup 6) (match_dup 3))
4239 1.1.1.1.4.2 yamt (match_dup 4))))]
4240 1.1.1.1.4.2 yamt {
4241 1.1.1.1.4.2 yamt if (can_create_pseudo_p ())
4242 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
4243 1.1.1.1.4.2 yamt else if (reg_overlap_mentioned_p (operands[5], operands[4]))
4244 1.1.1.1.4.2 yamt operands[5] = operands[0];
4245 1.1.1.1.4.2 yamt
4246 1.1.1.1.4.2 yamt operands[6] = gen_lowpart (SImode, operands[5]);
4247 1.1.1.1.4.2 yamt })
4248 1.1.1.1.4.2 yamt
4249 1.1.1.1.4.2 yamt (define_insn_and_split "*cmp_ssub_di"
4250 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
4251 1.1.1.1.4.2 yamt (minus:DI (if_then_else:DI
4252 1.1.1.1.4.2 yamt (match_operator 1 "alpha_zero_comparison_operator"
4253 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
4254 1.1.1.1.4.2 yamt (const_int 0)])
4255 1.1.1.1.4.2 yamt (match_operand:DI 3 "const48_operand" "I")
4256 1.1.1.1.4.2 yamt (const_int 0))
4257 1.1.1.1.4.2 yamt (match_operand:DI 4 "reg_or_8bit_operand" "rI")))
4258 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 5 "=r"))]
4259 1.1.1.1.4.2 yamt ""
4260 1.1.1.1.4.2 yamt "#"
4261 1.1.1.1.4.2 yamt ""
4262 1.1.1.1.4.2 yamt [(set (match_dup 5)
4263 1.1.1.1.4.2 yamt (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
4264 1.1.1.1.4.2 yamt (set (match_dup 0)
4265 1.1.1.1.4.2 yamt (minus:DI (mult:DI (match_dup 5) (match_dup 3))
4266 1.1.1.1.4.2 yamt (match_dup 4)))]
4267 1.1.1.1.4.2 yamt {
4268 1.1.1.1.4.2 yamt if (can_create_pseudo_p ())
4269 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
4270 1.1.1.1.4.2 yamt else if (reg_overlap_mentioned_p (operands[5], operands[4]))
4271 1.1.1.1.4.2 yamt operands[5] = operands[0];
4272 1.1.1.1.4.2 yamt })
4273 1.1.1.1.4.2 yamt
4274 1.1.1.1.4.2 yamt (define_insn_and_split "*cmp_ssub_si"
4275 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "=r")
4276 1.1.1.1.4.2 yamt (minus:SI (if_then_else:SI
4277 1.1.1.1.4.2 yamt (match_operator 1 "alpha_zero_comparison_operator"
4278 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
4279 1.1.1.1.4.2 yamt (const_int 0)])
4280 1.1.1.1.4.2 yamt (match_operand:SI 3 "const48_operand" "I")
4281 1.1.1.1.4.2 yamt (const_int 0))
4282 1.1.1.1.4.2 yamt (match_operand:SI 4 "reg_or_8bit_operand" "rI")))
4283 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 5 "=r"))]
4284 1.1.1.1.4.2 yamt ""
4285 1.1.1.1.4.2 yamt "#"
4286 1.1.1.1.4.2 yamt ""
4287 1.1.1.1.4.2 yamt [(set (match_dup 5)
4288 1.1.1.1.4.2 yamt (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
4289 1.1.1.1.4.2 yamt (set (match_dup 0)
4290 1.1.1.1.4.2 yamt (minus:SI (mult:SI (match_dup 6) (match_dup 3))
4291 1.1.1.1.4.2 yamt (match_dup 4)))]
4292 1.1.1.1.4.2 yamt {
4293 1.1.1.1.4.2 yamt if (can_create_pseudo_p ())
4294 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
4295 1.1.1.1.4.2 yamt else if (reg_overlap_mentioned_p (operands[5], operands[4]))
4296 1.1.1.1.4.2 yamt operands[5] = gen_lowpart (DImode, operands[0]);
4297 1.1.1.1.4.2 yamt
4298 1.1.1.1.4.2 yamt operands[6] = gen_lowpart (SImode, operands[5]);
4299 1.1.1.1.4.2 yamt })
4300 1.1.1.1.4.2 yamt
4301 1.1.1.1.4.2 yamt (define_insn_and_split "*cmp_ssub_sidi"
4302 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
4303 1.1.1.1.4.2 yamt (sign_extend:DI
4304 1.1.1.1.4.2 yamt (minus:SI (if_then_else:SI
4305 1.1.1.1.4.2 yamt (match_operator 1 "alpha_zero_comparison_operator"
4306 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_0_operand" "rJ")
4307 1.1.1.1.4.2 yamt (const_int 0)])
4308 1.1.1.1.4.2 yamt (match_operand:SI 3 "const48_operand" "I")
4309 1.1.1.1.4.2 yamt (const_int 0))
4310 1.1.1.1.4.2 yamt (match_operand:SI 4 "reg_or_8bit_operand" "rI"))))
4311 1.1.1.1.4.2 yamt (clobber (match_scratch:DI 5 "=r"))]
4312 1.1.1.1.4.2 yamt ""
4313 1.1.1.1.4.2 yamt "#"
4314 1.1.1.1.4.2 yamt ""
4315 1.1.1.1.4.2 yamt [(set (match_dup 5)
4316 1.1.1.1.4.2 yamt (match_op_dup:DI 1 [(match_dup 2) (const_int 0)]))
4317 1.1.1.1.4.2 yamt (set (match_dup 0)
4318 1.1.1.1.4.2 yamt (sign_extend:DI (minus:SI (mult:SI (match_dup 6) (match_dup 3))
4319 1.1.1.1.4.2 yamt (match_dup 4))))]
4320 1.1.1.1.4.2 yamt {
4321 1.1.1.1.4.2 yamt if (can_create_pseudo_p ())
4322 1.1.1.1.4.2 yamt operands[5] = gen_reg_rtx (DImode);
4323 1.1.1.1.4.2 yamt else if (reg_overlap_mentioned_p (operands[5], operands[4]))
4324 1.1.1.1.4.2 yamt operands[5] = operands[0];
4325 1.1.1.1.4.2 yamt
4326 1.1.1.1.4.2 yamt operands[6] = gen_lowpart (SImode, operands[5]);
4327 1.1.1.1.4.2 yamt })
4328 1.1.1.1.4.2 yamt
4330 1.1.1.1.4.2 yamt ;; Here are the CALL and unconditional branch insns. Calls on NT and OSF
4331 1.1.1.1.4.2 yamt ;; work differently, so we have different patterns for each.
4332 1.1.1.1.4.2 yamt
4333 1.1.1.1.4.2 yamt ;; On Unicos/Mk a call information word (CIW) must be generated for each
4334 1.1.1.1.4.2 yamt ;; call. The CIW contains information about arguments passed in registers
4335 1.1.1.1.4.2 yamt ;; and is stored in the caller's SSIB. Its offset relative to the beginning
4336 1.1.1.1.4.2 yamt ;; of the SSIB is passed in $25. Handling this properly is quite complicated
4337 1.1.1.1.4.2 yamt ;; in the presence of inlining since the CIWs for calls performed by the
4338 1.1.1.1.4.2 yamt ;; inlined function must be stored in the SSIB of the function it is inlined
4339 1.1.1.1.4.2 yamt ;; into as well. We encode the CIW in an unspec and append it to the list
4340 1.1.1.1.4.2 yamt ;; of the CIWs for the current function only when the instruction for loading
4341 1.1.1.1.4.2 yamt ;; $25 is generated.
4342 1.1.1.1.4.2 yamt
4343 1.1.1.1.4.2 yamt (define_expand "call"
4344 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "" ""))
4345 1.1.1.1.4.2 yamt (use (match_operand 1 "" ""))
4346 1.1.1.1.4.2 yamt (use (match_operand 2 "" ""))
4347 1.1.1.1.4.2 yamt (use (match_operand 3 "" ""))]
4348 1.1.1.1.4.2 yamt ""
4349 1.1.1.1.4.2 yamt {
4350 1.1.1.1.4.2 yamt if (TARGET_ABI_WINDOWS_NT)
4351 1.1.1.1.4.2 yamt emit_call_insn (gen_call_nt (operands[0], operands[1]));
4352 1.1.1.1.4.2 yamt else if (TARGET_ABI_OPEN_VMS)
4353 1.1.1.1.4.2 yamt emit_call_insn (gen_call_vms (operands[0], operands[2]));
4354 1.1.1.1.4.2 yamt else if (TARGET_ABI_UNICOSMK)
4355 1.1.1.1.4.2 yamt emit_call_insn (gen_call_umk (operands[0], operands[2]));
4356 1.1.1.1.4.2 yamt else
4357 1.1.1.1.4.2 yamt emit_call_insn (gen_call_osf (operands[0], operands[1]));
4358 1.1.1.1.4.2 yamt DONE;
4359 1.1.1.1.4.2 yamt })
4360 1.1.1.1.4.2 yamt
4361 1.1.1.1.4.2 yamt (define_expand "sibcall"
4362 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand 0 "" ""))
4363 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4364 1.1.1.1.4.2 yamt (unspec [(reg:DI 29)] UNSPEC_SIBCALL)])]
4365 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
4366 1.1.1.1.4.2 yamt {
4367 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[0]));
4368 1.1.1.1.4.2 yamt operands[0] = XEXP (operands[0], 0);
4369 1.1.1.1.4.2 yamt })
4370 1.1.1.1.4.2 yamt
4371 1.1.1.1.4.2 yamt (define_expand "call_osf"
4372 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand 0 "" ""))
4373 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4374 1.1.1.1.4.2 yamt (use (reg:DI 29))
4375 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4376 1.1.1.1.4.2 yamt ""
4377 1.1.1.1.4.2 yamt {
4378 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[0]));
4379 1.1.1.1.4.2 yamt
4380 1.1.1.1.4.2 yamt operands[0] = XEXP (operands[0], 0);
4381 1.1.1.1.4.2 yamt if (! call_operand (operands[0], Pmode))
4382 1.1.1.1.4.2 yamt operands[0] = copy_to_mode_reg (Pmode, operands[0]);
4383 1.1.1.1.4.2 yamt })
4384 1.1.1.1.4.2 yamt
4385 1.1.1.1.4.2 yamt (define_expand "call_nt"
4386 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand 0 "" ""))
4387 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4388 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4389 1.1.1.1.4.2 yamt ""
4390 1.1.1.1.4.2 yamt {
4391 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[0]));
4392 1.1.1.1.4.2 yamt
4393 1.1.1.1.4.2 yamt operands[0] = XEXP (operands[0], 0);
4394 1.1.1.1.4.2 yamt if (GET_CODE (operands[0]) != SYMBOL_REF && !REG_P (operands[0]))
4395 1.1.1.1.4.2 yamt operands[0] = force_reg (DImode, operands[0]);
4396 1.1.1.1.4.2 yamt })
4397 1.1.1.1.4.2 yamt
4398 1.1.1.1.4.2 yamt ;; Calls on Unicos/Mk are always indirect.
4399 1.1.1.1.4.2 yamt ;; op 0: symbol ref for called function
4400 1.1.1.1.4.2 yamt ;; op 1: CIW for $25 represented by an unspec
4401 1.1.1.1.4.2 yamt
4402 1.1.1.1.4.2 yamt (define_expand "call_umk"
4403 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand 0 "" ""))
4404 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4405 1.1.1.1.4.2 yamt (use (reg:DI 25))
4406 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4407 1.1.1.1.4.2 yamt ""
4408 1.1.1.1.4.2 yamt {
4409 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[0]));
4410 1.1.1.1.4.2 yamt
4411 1.1.1.1.4.2 yamt /* Always load the address of the called function into a register;
4412 1.1.1.1.4.2 yamt load the CIW in $25. */
4413 1.1.1.1.4.2 yamt
4414 1.1.1.1.4.2 yamt operands[0] = XEXP (operands[0], 0);
4415 1.1.1.1.4.2 yamt if (!REG_P (operands[0]))
4416 1.1.1.1.4.2 yamt operands[0] = force_reg (DImode, operands[0]);
4417 1.1.1.1.4.2 yamt
4418 1.1.1.1.4.2 yamt emit_move_insn (gen_rtx_REG (DImode, 25), operands[1]);
4419 1.1.1.1.4.2 yamt })
4420 1.1.1.1.4.2 yamt
4421 1.1.1.1.4.2 yamt ;;
4422 1.1.1.1.4.2 yamt ;; call openvms/alpha
4423 1.1.1.1.4.2 yamt ;; op 0: symbol ref for called function
4424 1.1.1.1.4.2 yamt ;; op 1: next_arg_reg (argument information value for R25)
4425 1.1.1.1.4.2 yamt ;;
4426 1.1.1.1.4.2 yamt (define_expand "call_vms"
4427 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand 0 "" ""))
4428 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4429 1.1.1.1.4.2 yamt (use (match_dup 2))
4430 1.1.1.1.4.2 yamt (use (reg:DI 25))
4431 1.1.1.1.4.2 yamt (use (reg:DI 26))
4432 1.1.1.1.4.2 yamt (clobber (reg:DI 27))])]
4433 1.1.1.1.4.2 yamt ""
4434 1.1.1.1.4.2 yamt {
4435 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[0]));
4436 1.1.1.1.4.2 yamt
4437 1.1.1.1.4.2 yamt operands[0] = XEXP (operands[0], 0);
4438 1.1.1.1.4.2 yamt
4439 1.1.1.1.4.2 yamt /* Always load AI with argument information, then handle symbolic and
4440 1.1.1.1.4.2 yamt indirect call differently. Load RA and set operands[2] to PV in
4441 1.1.1.1.4.2 yamt both cases. */
4442 1.1.1.1.4.2 yamt
4443 1.1.1.1.4.2 yamt emit_move_insn (gen_rtx_REG (DImode, 25), operands[1]);
4444 1.1.1.1.4.2 yamt if (GET_CODE (operands[0]) == SYMBOL_REF)
4445 1.1.1.1.4.2 yamt {
4446 1.1.1.1.4.2 yamt alpha_need_linkage (XSTR (operands[0], 0), 0);
4447 1.1.1.1.4.2 yamt
4448 1.1.1.1.4.2 yamt operands[2] = const0_rtx;
4449 1.1.1.1.4.2 yamt }
4450 1.1.1.1.4.2 yamt else
4451 1.1.1.1.4.2 yamt {
4452 1.1.1.1.4.2 yamt emit_move_insn (gen_rtx_REG (Pmode, 26),
4453 1.1.1.1.4.2 yamt gen_rtx_MEM (Pmode, plus_constant (operands[0], 8)));
4454 1.1.1.1.4.2 yamt operands[2] = operands[0];
4455 1.1.1.1.4.2 yamt }
4456 1.1.1.1.4.2 yamt
4457 1.1.1.1.4.2 yamt })
4458 1.1.1.1.4.2 yamt
4459 1.1.1.1.4.2 yamt (define_expand "call_value"
4460 1.1.1.1.4.2 yamt [(use (match_operand 0 "" ""))
4461 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "" ""))
4462 1.1.1.1.4.2 yamt (use (match_operand 2 "" ""))
4463 1.1.1.1.4.2 yamt (use (match_operand 3 "" ""))
4464 1.1.1.1.4.2 yamt (use (match_operand 4 "" ""))]
4465 1.1.1.1.4.2 yamt ""
4466 1.1.1.1.4.2 yamt {
4467 1.1.1.1.4.2 yamt if (TARGET_ABI_WINDOWS_NT)
4468 1.1.1.1.4.2 yamt emit_call_insn (gen_call_value_nt (operands[0], operands[1], operands[2]));
4469 1.1.1.1.4.2 yamt else if (TARGET_ABI_OPEN_VMS)
4470 1.1.1.1.4.2 yamt emit_call_insn (gen_call_value_vms (operands[0], operands[1],
4471 1.1.1.1.4.2 yamt operands[3]));
4472 1.1.1.1.4.2 yamt else if (TARGET_ABI_UNICOSMK)
4473 1.1.1.1.4.2 yamt emit_call_insn (gen_call_value_umk (operands[0], operands[1],
4474 1.1.1.1.4.2 yamt operands[3]));
4475 1.1.1.1.4.2 yamt else
4476 1.1.1.1.4.2 yamt emit_call_insn (gen_call_value_osf (operands[0], operands[1],
4477 1.1.1.1.4.2 yamt operands[2]));
4478 1.1.1.1.4.2 yamt DONE;
4479 1.1.1.1.4.2 yamt })
4480 1.1.1.1.4.2 yamt
4481 1.1.1.1.4.2 yamt (define_expand "sibcall_value"
4482 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
4483 1.1.1.1.4.2 yamt (call (mem:DI (match_operand 1 "" ""))
4484 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
4485 1.1.1.1.4.2 yamt (unspec [(reg:DI 29)] UNSPEC_SIBCALL)])]
4486 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
4487 1.1.1.1.4.2 yamt {
4488 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[1]));
4489 1.1.1.1.4.2 yamt operands[1] = XEXP (operands[1], 0);
4490 1.1.1.1.4.2 yamt })
4491 1.1.1.1.4.2 yamt
4492 1.1.1.1.4.2 yamt (define_expand "call_value_osf"
4493 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
4494 1.1.1.1.4.2 yamt (call (mem:DI (match_operand 1 "" ""))
4495 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
4496 1.1.1.1.4.2 yamt (use (reg:DI 29))
4497 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4498 1.1.1.1.4.2 yamt ""
4499 1.1.1.1.4.2 yamt {
4500 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[1]));
4501 1.1.1.1.4.2 yamt
4502 1.1.1.1.4.2 yamt operands[1] = XEXP (operands[1], 0);
4503 1.1.1.1.4.2 yamt if (! call_operand (operands[1], Pmode))
4504 1.1.1.1.4.2 yamt operands[1] = copy_to_mode_reg (Pmode, operands[1]);
4505 1.1.1.1.4.2 yamt })
4506 1.1.1.1.4.2 yamt
4507 1.1.1.1.4.2 yamt (define_expand "call_value_nt"
4508 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
4509 1.1.1.1.4.2 yamt (call (mem:DI (match_operand 1 "" ""))
4510 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
4511 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4512 1.1.1.1.4.2 yamt ""
4513 1.1.1.1.4.2 yamt {
4514 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[1]));
4515 1.1.1.1.4.2 yamt
4516 1.1.1.1.4.2 yamt operands[1] = XEXP (operands[1], 0);
4517 1.1.1.1.4.2 yamt if (GET_CODE (operands[1]) != SYMBOL_REF && !REG_P (operands[1]))
4518 1.1.1.1.4.2 yamt operands[1] = force_reg (DImode, operands[1]);
4519 1.1.1.1.4.2 yamt })
4520 1.1.1.1.4.2 yamt
4521 1.1.1.1.4.2 yamt (define_expand "call_value_vms"
4522 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
4523 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "" ""))
4524 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
4525 1.1.1.1.4.2 yamt (use (match_dup 3))
4526 1.1.1.1.4.2 yamt (use (reg:DI 25))
4527 1.1.1.1.4.2 yamt (use (reg:DI 26))
4528 1.1.1.1.4.2 yamt (clobber (reg:DI 27))])]
4529 1.1.1.1.4.2 yamt ""
4530 1.1.1.1.4.2 yamt {
4531 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[1]));
4532 1.1.1.1.4.2 yamt
4533 1.1.1.1.4.2 yamt operands[1] = XEXP (operands[1], 0);
4534 1.1.1.1.4.2 yamt
4535 1.1.1.1.4.2 yamt /* Always load AI with argument information, then handle symbolic and
4536 1.1.1.1.4.2 yamt indirect call differently. Load RA and set operands[3] to PV in
4537 1.1.1.1.4.2 yamt both cases. */
4538 1.1.1.1.4.2 yamt
4539 1.1.1.1.4.2 yamt emit_move_insn (gen_rtx_REG (DImode, 25), operands[2]);
4540 1.1.1.1.4.2 yamt if (GET_CODE (operands[1]) == SYMBOL_REF)
4541 1.1.1.1.4.2 yamt {
4542 1.1.1.1.4.2 yamt alpha_need_linkage (XSTR (operands[1], 0), 0);
4543 1.1.1.1.4.2 yamt
4544 1.1.1.1.4.2 yamt operands[3] = const0_rtx;
4545 1.1.1.1.4.2 yamt }
4546 1.1.1.1.4.2 yamt else
4547 1.1.1.1.4.2 yamt {
4548 1.1.1.1.4.2 yamt emit_move_insn (gen_rtx_REG (Pmode, 26),
4549 1.1.1.1.4.2 yamt gen_rtx_MEM (Pmode, plus_constant (operands[1], 8)));
4550 1.1.1.1.4.2 yamt operands[3] = operands[1];
4551 1.1.1.1.4.2 yamt }
4552 1.1.1.1.4.2 yamt })
4553 1.1.1.1.4.2 yamt
4554 1.1.1.1.4.2 yamt (define_expand "call_value_umk"
4555 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
4556 1.1.1.1.4.2 yamt (call (mem:DI (match_operand 1 "" ""))
4557 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
4558 1.1.1.1.4.2 yamt (use (reg:DI 25))
4559 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4560 1.1.1.1.4.2 yamt ""
4561 1.1.1.1.4.2 yamt {
4562 1.1.1.1.4.2 yamt gcc_assert (MEM_P (operands[1]));
4563 1.1.1.1.4.2 yamt
4564 1.1.1.1.4.2 yamt operands[1] = XEXP (operands[1], 0);
4565 1.1.1.1.4.2 yamt if (!REG_P (operands[1]))
4566 1.1.1.1.4.2 yamt operands[1] = force_reg (DImode, operands[1]);
4567 1.1.1.1.4.2 yamt
4568 1.1.1.1.4.2 yamt emit_move_insn (gen_rtx_REG (DImode, 25), operands[2]);
4569 1.1.1.1.4.2 yamt })
4570 1.1.1.1.4.2 yamt
4571 1.1.1.1.4.2 yamt (define_insn "*call_osf_1_er_noreturn"
4572 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
4573 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4574 1.1.1.1.4.2 yamt (use (reg:DI 29))
4575 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4576 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
4577 1.1.1.1.4.2 yamt && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
4578 1.1.1.1.4.2 yamt "@
4579 1.1.1.1.4.2 yamt jsr $26,($27),0
4580 1.1.1.1.4.2 yamt bsr $26,%0\t\t!samegp
4581 1.1.1.1.4.2 yamt ldq $27,%0($29)\t\t!literal!%#\;jsr $26,($27),%0\t\t!lituse_jsr!%#"
4582 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4583 1.1.1.1.4.2 yamt (set_attr "length" "*,*,8")])
4584 1.1.1.1.4.2 yamt
4585 1.1.1.1.4.2 yamt (define_insn "*call_osf_1_er"
4586 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
4587 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4588 1.1.1.1.4.2 yamt (use (reg:DI 29))
4589 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4590 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4591 1.1.1.1.4.2 yamt "@
4592 1.1.1.1.4.2 yamt jsr $26,(%0),0\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*
4593 1.1.1.1.4.2 yamt bsr $26,%0\t\t!samegp
4594 1.1.1.1.4.2 yamt 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!%*"
4595 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4596 1.1.1.1.4.2 yamt (set_attr "length" "12,*,16")])
4597 1.1.1.1.4.2 yamt
4598 1.1.1.1.4.2 yamt ;; We must use peep2 instead of a split because we need accurate life
4599 1.1.1.1.4.2 yamt ;; information for $gp. Consider the case of { bar(); while (1); }.
4600 1.1.1.1.4.2 yamt (define_peephole2
4601 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand:DI 0 "call_operand" ""))
4602 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4603 1.1.1.1.4.2 yamt (use (reg:DI 29))
4604 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4605 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
4606 1.1.1.1.4.2 yamt && ! samegp_function_operand (operands[0], Pmode)
4607 1.1.1.1.4.2 yamt && (peep2_regno_dead_p (1, 29)
4608 1.1.1.1.4.2 yamt || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
4609 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_dup 2))
4610 1.1.1.1.4.2 yamt (match_dup 1))
4611 1.1.1.1.4.2 yamt (use (reg:DI 29))
4612 1.1.1.1.4.2 yamt (use (match_dup 0))
4613 1.1.1.1.4.2 yamt (use (match_dup 3))
4614 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4615 1.1.1.1.4.2 yamt {
4616 1.1.1.1.4.2 yamt if (CONSTANT_P (operands[0]))
4617 1.1.1.1.4.2 yamt {
4618 1.1.1.1.4.2 yamt operands[2] = gen_rtx_REG (Pmode, 27);
4619 1.1.1.1.4.2 yamt operands[3] = GEN_INT (alpha_next_sequence_number++);
4620 1.1.1.1.4.2 yamt emit_insn (gen_movdi_er_high_g (operands[2], pic_offset_table_rtx,
4621 1.1.1.1.4.2 yamt operands[0], operands[3]));
4622 1.1.1.1.4.2 yamt }
4623 1.1.1.1.4.2 yamt else
4624 1.1.1.1.4.2 yamt {
4625 1.1.1.1.4.2 yamt operands[2] = operands[0];
4626 1.1.1.1.4.2 yamt operands[0] = const0_rtx;
4627 1.1.1.1.4.2 yamt operands[3] = const0_rtx;
4628 1.1.1.1.4.2 yamt }
4629 1.1.1.1.4.2 yamt })
4630 1.1.1.1.4.2 yamt
4631 1.1.1.1.4.2 yamt (define_peephole2
4632 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_operand:DI 0 "call_operand" ""))
4633 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4634 1.1.1.1.4.2 yamt (use (reg:DI 29))
4635 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
4636 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
4637 1.1.1.1.4.2 yamt && ! samegp_function_operand (operands[0], Pmode)
4638 1.1.1.1.4.2 yamt && ! (peep2_regno_dead_p (1, 29)
4639 1.1.1.1.4.2 yamt || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
4640 1.1.1.1.4.2 yamt [(parallel [(call (mem:DI (match_dup 2))
4641 1.1.1.1.4.2 yamt (match_dup 1))
4642 1.1.1.1.4.2 yamt (set (match_dup 5)
4643 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5) (match_dup 3)] UNSPEC_LDGP1))
4644 1.1.1.1.4.2 yamt (use (match_dup 0))
4645 1.1.1.1.4.2 yamt (use (match_dup 4))
4646 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])
4647 1.1.1.1.4.2 yamt (set (match_dup 5)
4648 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5) (match_dup 3)] UNSPEC_LDGP2))]
4649 1.1.1.1.4.2 yamt {
4650 1.1.1.1.4.2 yamt if (CONSTANT_P (operands[0]))
4651 1.1.1.1.4.2 yamt {
4652 1.1.1.1.4.2 yamt operands[2] = gen_rtx_REG (Pmode, 27);
4653 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
4654 1.1.1.1.4.2 yamt emit_insn (gen_movdi_er_high_g (operands[2], pic_offset_table_rtx,
4655 1.1.1.1.4.2 yamt operands[0], operands[4]));
4656 1.1.1.1.4.2 yamt }
4657 1.1.1.1.4.2 yamt else
4658 1.1.1.1.4.2 yamt {
4659 1.1.1.1.4.2 yamt operands[2] = operands[0];
4660 1.1.1.1.4.2 yamt operands[0] = const0_rtx;
4661 1.1.1.1.4.2 yamt operands[4] = const0_rtx;
4662 1.1.1.1.4.2 yamt }
4663 1.1.1.1.4.2 yamt operands[3] = GEN_INT (alpha_next_sequence_number++);
4664 1.1.1.1.4.2 yamt operands[5] = pic_offset_table_rtx;
4665 1.1.1.1.4.2 yamt })
4666 1.1.1.1.4.2 yamt
4667 1.1.1.1.4.2 yamt (define_insn "*call_osf_2_er_nogp"
4668 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "register_operand" "c"))
4669 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4670 1.1.1.1.4.2 yamt (use (reg:DI 29))
4671 1.1.1.1.4.2 yamt (use (match_operand 2 "" ""))
4672 1.1.1.1.4.2 yamt (use (match_operand 3 "const_int_operand" ""))
4673 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4674 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4675 1.1.1.1.4.2 yamt "jsr $26,(%0),%2%J3"
4676 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")])
4677 1.1.1.1.4.2 yamt
4678 1.1.1.1.4.2 yamt (define_insn "*call_osf_2_er"
4679 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "register_operand" "c"))
4680 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4681 1.1.1.1.4.2 yamt (set (reg:DI 29)
4682 1.1.1.1.4.2 yamt (unspec:DI [(reg:DI 29) (match_operand 4 "const_int_operand" "")]
4683 1.1.1.1.4.2 yamt UNSPEC_LDGP1))
4684 1.1.1.1.4.2 yamt (use (match_operand 2 "" ""))
4685 1.1.1.1.4.2 yamt (use (match_operand 3 "const_int_operand" ""))
4686 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4687 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4688 1.1.1.1.4.2 yamt "jsr $26,(%0),%2%J3\;ldah $29,0($26)\t\t!gpdisp!%4"
4689 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4690 1.1.1.1.4.2 yamt (set_attr "cannot_copy" "true")
4691 1.1.1.1.4.2 yamt (set_attr "length" "8")])
4692 1.1.1.1.4.2 yamt
4693 1.1.1.1.4.2 yamt (define_insn "*call_osf_1_noreturn"
4694 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
4695 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4696 1.1.1.1.4.2 yamt (use (reg:DI 29))
4697 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4698 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
4699 1.1.1.1.4.2 yamt && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
4700 1.1.1.1.4.2 yamt "@
4701 1.1.1.1.4.2 yamt jsr $26,($27),0
4702 1.1.1.1.4.2 yamt bsr $26,$%0..ng
4703 1.1.1.1.4.2 yamt jsr $26,%0"
4704 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4705 1.1.1.1.4.2 yamt (set_attr "length" "*,*,8")])
4706 1.1.1.1.4.2 yamt
4707 1.1.1.1.4.2 yamt (define_insn "*call_osf_1"
4708 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "c,R,s"))
4709 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4710 1.1.1.1.4.2 yamt (use (reg:DI 29))
4711 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4712 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4713 1.1.1.1.4.2 yamt "@
4714 1.1.1.1.4.2 yamt jsr $26,($27),0\;ldgp $29,0($26)
4715 1.1.1.1.4.2 yamt bsr $26,$%0..ng
4716 1.1.1.1.4.2 yamt jsr $26,%0\;ldgp $29,0($26)"
4717 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4718 1.1.1.1.4.2 yamt (set_attr "length" "12,*,16")])
4719 1.1.1.1.4.2 yamt
4720 1.1.1.1.4.2 yamt (define_insn "*sibcall_osf_1_er"
4721 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "symbolic_operand" "R,s"))
4722 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4723 1.1.1.1.4.2 yamt (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
4724 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4725 1.1.1.1.4.2 yamt "@
4726 1.1.1.1.4.2 yamt br $31,%0\t\t!samegp
4727 1.1.1.1.4.2 yamt ldq $27,%0($29)\t\t!literal!%#\;jmp $31,($27),%0\t\t!lituse_jsr!%#"
4728 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4729 1.1.1.1.4.2 yamt (set_attr "length" "*,8")])
4730 1.1.1.1.4.2 yamt
4731 1.1.1.1.4.2 yamt ;; Note that the DEC assembler expands "jmp foo" with $at, which
4732 1.1.1.1.4.2 yamt ;; doesn't do what we want.
4733 1.1.1.1.4.2 yamt (define_insn "*sibcall_osf_1"
4734 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "symbolic_operand" "R,s"))
4735 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4736 1.1.1.1.4.2 yamt (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
4737 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
4738 1.1.1.1.4.2 yamt "@
4739 1.1.1.1.4.2 yamt br $31,$%0..ng
4740 1.1.1.1.4.2 yamt lda $27,%0\;jmp $31,($27),%0"
4741 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4742 1.1.1.1.4.2 yamt (set_attr "length" "*,8")])
4743 1.1.1.1.4.2 yamt
4744 1.1.1.1.4.2 yamt (define_insn "*call_nt_1"
4745 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "r,R,s"))
4746 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4747 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4748 1.1.1.1.4.2 yamt "TARGET_ABI_WINDOWS_NT"
4749 1.1.1.1.4.2 yamt "@
4750 1.1.1.1.4.2 yamt jsr $26,(%0)
4751 1.1.1.1.4.2 yamt bsr $26,%0
4752 1.1.1.1.4.2 yamt jsr $26,%0"
4753 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4754 1.1.1.1.4.2 yamt (set_attr "length" "*,*,12")])
4755 1.1.1.1.4.2 yamt
4756 1.1.1.1.4.2 yamt ; GAS relies on the order and position of instructions output below in order
4757 1.1.1.1.4.2 yamt ; to generate relocs for VMS link to potentially optimize the call.
4758 1.1.1.1.4.2 yamt ; Please do not molest.
4759 1.1.1.1.4.2 yamt (define_insn "*call_vms_1"
4760 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "r,s"))
4761 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4762 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "nonmemory_operand" "r,n"))
4763 1.1.1.1.4.2 yamt (use (reg:DI 25))
4764 1.1.1.1.4.2 yamt (use (reg:DI 26))
4765 1.1.1.1.4.2 yamt (clobber (reg:DI 27))]
4766 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
4767 1.1.1.1.4.2 yamt {
4768 1.1.1.1.4.2 yamt switch (which_alternative)
4769 1.1.1.1.4.2 yamt {
4770 1.1.1.1.4.2 yamt case 0:
4771 1.1.1.1.4.2 yamt return "mov %2,$27\;jsr $26,0\;ldq $27,0($29)";
4772 1.1.1.1.4.2 yamt case 1:
4773 1.1.1.1.4.2 yamt operands [2] = alpha_use_linkage (operands [0], cfun->decl, 1, 0);
4774 1.1.1.1.4.2 yamt operands [3] = alpha_use_linkage (operands [0], cfun->decl, 0, 0);
4775 1.1.1.1.4.2 yamt return "ldq $26,%3\;ldq $27,%2\;jsr $26,%0\;ldq $27,0($29)";
4776 1.1.1.1.4.2 yamt default:
4777 1.1.1.1.4.2 yamt gcc_unreachable ();
4778 1.1.1.1.4.2 yamt }
4779 1.1.1.1.4.2 yamt }
4780 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
4781 1.1.1.1.4.2 yamt (set_attr "length" "12,16")])
4782 1.1.1.1.4.2 yamt
4783 1.1.1.1.4.2 yamt (define_insn "*call_umk_1"
4784 1.1.1.1.4.2 yamt [(call (mem:DI (match_operand:DI 0 "call_operand" "r"))
4785 1.1.1.1.4.2 yamt (match_operand 1 "" ""))
4786 1.1.1.1.4.2 yamt (use (reg:DI 25))
4787 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
4788 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
4789 1.1.1.1.4.2 yamt "jsr $26,(%0)"
4790 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")])
4791 1.1.1.1.4.2 yamt
4792 1.1.1.1.4.2 yamt ;; Call subroutine returning any type.
4793 1.1.1.1.4.2 yamt
4794 1.1.1.1.4.2 yamt (define_expand "untyped_call"
4795 1.1.1.1.4.2 yamt [(parallel [(call (match_operand 0 "" "")
4796 1.1.1.1.4.2 yamt (const_int 0))
4797 1.1.1.1.4.2 yamt (match_operand 1 "" "")
4798 1.1.1.1.4.2 yamt (match_operand 2 "" "")])]
4799 1.1.1.1.4.2 yamt ""
4800 1.1.1.1.4.2 yamt {
4801 1.1.1.1.4.2 yamt int i;
4802 1.1.1.1.4.2 yamt
4803 1.1.1.1.4.2 yamt emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx));
4804 1.1.1.1.4.2 yamt
4805 1.1.1.1.4.2 yamt for (i = 0; i < XVECLEN (operands[2], 0); i++)
4806 1.1.1.1.4.2 yamt {
4807 1.1.1.1.4.2 yamt rtx set = XVECEXP (operands[2], 0, i);
4808 1.1.1.1.4.2 yamt emit_move_insn (SET_DEST (set), SET_SRC (set));
4809 1.1.1.1.4.2 yamt }
4810 1.1.1.1.4.2 yamt
4811 1.1.1.1.4.2 yamt /* The optimizer does not know that the call sets the function value
4812 1.1.1.1.4.2 yamt registers we stored in the result block. We avoid problems by
4813 1.1.1.1.4.2 yamt claiming that all hard registers are used and clobbered at this
4814 1.1.1.1.4.2 yamt point. */
4815 1.1.1.1.4.2 yamt emit_insn (gen_blockage ());
4816 1.1.1.1.4.2 yamt
4817 1.1.1.1.4.2 yamt DONE;
4818 1.1.1.1.4.2 yamt })
4819 1.1.1.1.4.2 yamt
4820 1.1.1.1.4.2 yamt ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
4821 1.1.1.1.4.2 yamt ;; all of memory. This blocks insns from being moved across this point.
4822 1.1.1.1.4.2 yamt
4823 1.1.1.1.4.2 yamt (define_insn "blockage"
4824 1.1.1.1.4.2 yamt [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
4825 1.1.1.1.4.2 yamt ""
4826 1.1.1.1.4.2 yamt ""
4827 1.1.1.1.4.2 yamt [(set_attr "length" "0")
4828 1.1.1.1.4.2 yamt (set_attr "type" "none")])
4829 1.1.1.1.4.2 yamt
4830 1.1.1.1.4.2 yamt (define_insn "jump"
4831 1.1.1.1.4.2 yamt [(set (pc)
4832 1.1.1.1.4.2 yamt (label_ref (match_operand 0 "" "")))]
4833 1.1.1.1.4.2 yamt ""
4834 1.1.1.1.4.2 yamt "br $31,%l0"
4835 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
4836 1.1.1.1.4.2 yamt
4837 1.1.1.1.4.2 yamt (define_expand "return"
4838 1.1.1.1.4.2 yamt [(return)]
4839 1.1.1.1.4.2 yamt "direct_return ()"
4840 1.1.1.1.4.2 yamt "")
4841 1.1.1.1.4.2 yamt
4842 1.1.1.1.4.2 yamt (define_insn "*return_internal"
4843 1.1.1.1.4.2 yamt [(return)]
4844 1.1.1.1.4.2 yamt "reload_completed"
4845 1.1.1.1.4.2 yamt "ret $31,($26),1"
4846 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
4847 1.1.1.1.4.2 yamt
4848 1.1.1.1.4.2 yamt (define_insn "indirect_jump"
4849 1.1.1.1.4.2 yamt [(set (pc) (match_operand:DI 0 "register_operand" "r"))]
4850 1.1.1.1.4.2 yamt ""
4851 1.1.1.1.4.2 yamt "jmp $31,(%0),0"
4852 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
4853 1.1.1.1.4.2 yamt
4854 1.1.1.1.4.2 yamt (define_expand "tablejump"
4855 1.1.1.1.4.2 yamt [(parallel [(set (pc)
4856 1.1.1.1.4.2 yamt (match_operand 0 "register_operand" ""))
4857 1.1.1.1.4.2 yamt (use (label_ref:DI (match_operand 1 "" "")))])]
4858 1.1.1.1.4.2 yamt ""
4859 1.1.1.1.4.2 yamt {
4860 1.1.1.1.4.2 yamt if (TARGET_ABI_WINDOWS_NT)
4861 1.1.1.1.4.2 yamt {
4862 1.1.1.1.4.2 yamt rtx dest = gen_reg_rtx (DImode);
4863 1.1.1.1.4.2 yamt emit_insn (gen_extendsidi2 (dest, operands[0]));
4864 1.1.1.1.4.2 yamt operands[0] = dest;
4865 1.1.1.1.4.2 yamt }
4866 1.1.1.1.4.2 yamt else if (TARGET_ABI_OSF)
4867 1.1.1.1.4.2 yamt {
4868 1.1.1.1.4.2 yamt rtx dest = gen_reg_rtx (DImode);
4869 1.1.1.1.4.2 yamt emit_insn (gen_extendsidi2 (dest, operands[0]));
4870 1.1.1.1.4.2 yamt emit_insn (gen_adddi3 (dest, pic_offset_table_rtx, dest));
4871 1.1.1.1.4.2 yamt operands[0] = dest;
4872 1.1.1.1.4.2 yamt }
4873 1.1.1.1.4.2 yamt })
4874 1.1.1.1.4.2 yamt
4875 1.1.1.1.4.2 yamt (define_insn "*tablejump_osf_nt_internal"
4876 1.1.1.1.4.2 yamt [(set (pc)
4877 1.1.1.1.4.2 yamt (match_operand:DI 0 "register_operand" "r"))
4878 1.1.1.1.4.2 yamt (use (label_ref:DI (match_operand 1 "" "")))]
4879 1.1.1.1.4.2 yamt "(TARGET_ABI_OSF || TARGET_ABI_WINDOWS_NT)
4880 1.1.1.1.4.2 yamt && alpha_tablejump_addr_vec (insn)"
4881 1.1.1.1.4.2 yamt {
4882 1.1.1.1.4.2 yamt operands[2] = alpha_tablejump_best_label (insn);
4883 1.1.1.1.4.2 yamt return "jmp $31,(%0),%2";
4884 1.1.1.1.4.2 yamt }
4885 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
4886 1.1.1.1.4.2 yamt
4887 1.1.1.1.4.2 yamt (define_insn "*tablejump_internal"
4888 1.1.1.1.4.2 yamt [(set (pc)
4889 1.1.1.1.4.2 yamt (match_operand:DI 0 "register_operand" "r"))
4890 1.1.1.1.4.2 yamt (use (label_ref (match_operand 1 "" "")))]
4891 1.1.1.1.4.2 yamt ""
4892 1.1.1.1.4.2 yamt "jmp $31,(%0),0"
4893 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
4894 1.1.1.1.4.2 yamt
4895 1.1.1.1.4.2 yamt ;; Cache flush. Used by alpha_trampoline_init. 0x86 is PAL_imb, but we don't
4896 1.1.1.1.4.2 yamt ;; want to have to include pal.h in our .s file.
4897 1.1.1.1.4.2 yamt (define_insn "imb"
4898 1.1.1.1.4.2 yamt [(unspec_volatile [(const_int 0)] UNSPECV_IMB)]
4899 1.1.1.1.4.2 yamt ""
4900 1.1.1.1.4.2 yamt "call_pal 0x86"
4901 1.1.1.1.4.2 yamt [(set_attr "type" "callpal")])
4902 1.1.1.1.4.2 yamt
4903 1.1.1.1.4.2 yamt ;; BUGCHK is documented common to OSF/1 and VMS PALcode.
4904 1.1.1.1.4.2 yamt ;; NT does not document anything at 0x81 -- presumably it would generate
4905 1.1.1.1.4.2 yamt ;; the equivalent of SIGILL, but this isn't that important.
4906 1.1.1.1.4.2 yamt ;; ??? Presuming unicosmk uses either OSF/1 or VMS PALcode.
4907 1.1.1.1.4.2 yamt (define_insn "trap"
4908 1.1.1.1.4.2 yamt [(trap_if (const_int 1) (const_int 0))]
4909 1.1.1.1.4.2 yamt "!TARGET_ABI_WINDOWS_NT"
4910 1.1.1.1.4.2 yamt "call_pal 0x81"
4911 1.1.1.1.4.2 yamt [(set_attr "type" "callpal")])
4912 1.1.1.1.4.2 yamt
4913 1.1.1.1.4.2 yamt ;; For userland, we load the thread pointer from the TCB.
4914 1.1.1.1.4.2 yamt ;; For the kernel, we load the per-cpu private value.
4915 1.1.1.1.4.2 yamt
4916 1.1.1.1.4.2 yamt (define_insn "load_tp"
4917 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=v")
4918 1.1.1.1.4.2 yamt (unspec:DI [(const_int 0)] UNSPEC_TP))]
4919 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
4920 1.1.1.1.4.2 yamt {
4921 1.1.1.1.4.2 yamt if (TARGET_TLS_KERNEL)
4922 1.1.1.1.4.2 yamt return "call_pal 0x32";
4923 1.1.1.1.4.2 yamt else
4924 1.1.1.1.4.2 yamt return "call_pal 0x9e";
4925 1.1.1.1.4.2 yamt }
4926 1.1.1.1.4.2 yamt [(set_attr "type" "callpal")])
4927 1.1.1.1.4.2 yamt
4928 1.1.1.1.4.2 yamt ;; For completeness, and possibly a __builtin function, here's how to
4929 1.1.1.1.4.2 yamt ;; set the thread pointer. Since we don't describe enough of this
4930 1.1.1.1.4.2 yamt ;; quantity for CSE, we have to use a volatile unspec, and then there's
4931 1.1.1.1.4.2 yamt ;; not much point in creating an R16_REG register class.
4932 1.1.1.1.4.2 yamt
4933 1.1.1.1.4.2 yamt (define_expand "set_tp"
4934 1.1.1.1.4.2 yamt [(set (reg:DI 16) (match_operand:DI 0 "input_operand" ""))
4935 1.1.1.1.4.2 yamt (unspec_volatile [(reg:DI 16)] UNSPECV_SET_TP)]
4936 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
4937 1.1.1.1.4.2 yamt "")
4938 1.1.1.1.4.2 yamt
4939 1.1.1.1.4.2 yamt (define_insn "*set_tp"
4940 1.1.1.1.4.2 yamt [(unspec_volatile [(reg:DI 16)] UNSPECV_SET_TP)]
4941 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
4942 1.1.1.1.4.2 yamt {
4943 1.1.1.1.4.2 yamt if (TARGET_TLS_KERNEL)
4944 1.1.1.1.4.2 yamt return "call_pal 0x31";
4945 1.1.1.1.4.2 yamt else
4946 1.1.1.1.4.2 yamt return "call_pal 0x9f";
4947 1.1.1.1.4.2 yamt }
4948 1.1.1.1.4.2 yamt [(set_attr "type" "callpal")])
4949 1.1.1.1.4.2 yamt
4950 1.1.1.1.4.2 yamt ;; Special builtins for establishing and reverting VMS condition handlers.
4951 1.1.1.1.4.2 yamt
4952 1.1.1.1.4.2 yamt (define_expand "builtin_establish_vms_condition_handler"
4953 1.1.1.1.4.2 yamt [(set (reg:DI 0) (match_operand:DI 0 "register_operand" ""))
4954 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "address_operand" ""))]
4955 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
4956 1.1.1.1.4.2 yamt {
4957 1.1.1.1.4.2 yamt alpha_expand_builtin_establish_vms_condition_handler (operands[0],
4958 1.1.1.1.4.2 yamt operands[1]);
4959 1.1.1.1.4.2 yamt })
4960 1.1.1.1.4.2 yamt
4961 1.1.1.1.4.2 yamt (define_expand "builtin_revert_vms_condition_handler"
4962 1.1.1.1.4.2 yamt [(set (reg:DI 0) (match_operand:DI 0 "register_operand" ""))]
4963 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
4964 1.1.1.1.4.2 yamt {
4965 1.1.1.1.4.2 yamt alpha_expand_builtin_revert_vms_condition_handler (operands[0]);
4966 1.1.1.1.4.2 yamt })
4967 1.1.1.1.4.2 yamt
4969 1.1.1.1.4.2 yamt ;; Finally, we have the basic data motion insns. The byte and word insns
4970 1.1.1.1.4.2 yamt ;; are done via define_expand. Start with the floating-point insns, since
4971 1.1.1.1.4.2 yamt ;; they are simpler.
4972 1.1.1.1.4.2 yamt
4973 1.1.1.1.4.2 yamt (define_insn "*movsf_nofix"
4974 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,*r,*r,m,m")
4975 1.1.1.1.4.2 yamt (match_operand:SF 1 "input_operand" "fG,m,*rG,m,fG,*r"))]
4976 1.1.1.1.4.2 yamt "TARGET_FPREGS && ! TARGET_FIX
4977 1.1.1.1.4.2 yamt && (register_operand (operands[0], SFmode)
4978 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], SFmode))"
4979 1.1.1.1.4.2 yamt "@
4980 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
4981 1.1.1.1.4.2 yamt ld%, %0,%1
4982 1.1.1.1.4.2 yamt bis $31,%r1,%0
4983 1.1.1.1.4.2 yamt ldl %0,%1
4984 1.1.1.1.4.2 yamt st%, %R1,%0
4985 1.1.1.1.4.2 yamt stl %r1,%0"
4986 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys,fld,ilog,ild,fst,ist")])
4987 1.1.1.1.4.2 yamt
4988 1.1.1.1.4.2 yamt (define_insn "*movsf_fix"
4989 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,*r,*r,m,m,f,*r")
4990 1.1.1.1.4.2 yamt (match_operand:SF 1 "input_operand" "fG,m,*rG,m,fG,*r,*r,f"))]
4991 1.1.1.1.4.2 yamt "TARGET_FPREGS && TARGET_FIX
4992 1.1.1.1.4.2 yamt && (register_operand (operands[0], SFmode)
4993 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], SFmode))"
4994 1.1.1.1.4.2 yamt "@
4995 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
4996 1.1.1.1.4.2 yamt ld%, %0,%1
4997 1.1.1.1.4.2 yamt bis $31,%r1,%0
4998 1.1.1.1.4.2 yamt ldl %0,%1
4999 1.1.1.1.4.2 yamt st%, %R1,%0
5000 1.1.1.1.4.2 yamt stl %r1,%0
5001 1.1.1.1.4.2 yamt itofs %1,%0
5002 1.1.1.1.4.2 yamt ftois %1,%0"
5003 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys,fld,ilog,ild,fst,ist,itof,ftoi")])
5004 1.1.1.1.4.2 yamt
5005 1.1.1.1.4.2 yamt (define_insn "*movsf_nofp"
5006 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,m")
5007 1.1.1.1.4.2 yamt (match_operand:SF 1 "input_operand" "rG,m,r"))]
5008 1.1.1.1.4.2 yamt "! TARGET_FPREGS
5009 1.1.1.1.4.2 yamt && (register_operand (operands[0], SFmode)
5010 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], SFmode))"
5011 1.1.1.1.4.2 yamt "@
5012 1.1.1.1.4.2 yamt bis $31,%r1,%0
5013 1.1.1.1.4.2 yamt ldl %0,%1
5014 1.1.1.1.4.2 yamt stl %r1,%0"
5015 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ild,ist")])
5016 1.1.1.1.4.2 yamt
5017 1.1.1.1.4.2 yamt (define_insn "*movdf_nofix"
5018 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,*r,*r,m,m")
5019 1.1.1.1.4.2 yamt (match_operand:DF 1 "input_operand" "fG,m,*rG,m,fG,*r"))]
5020 1.1.1.1.4.2 yamt "TARGET_FPREGS && ! TARGET_FIX
5021 1.1.1.1.4.2 yamt && (register_operand (operands[0], DFmode)
5022 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DFmode))"
5023 1.1.1.1.4.2 yamt "@
5024 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
5025 1.1.1.1.4.2 yamt ld%- %0,%1
5026 1.1.1.1.4.2 yamt bis $31,%r1,%0
5027 1.1.1.1.4.2 yamt ldq %0,%1
5028 1.1.1.1.4.2 yamt st%- %R1,%0
5029 1.1.1.1.4.2 yamt stq %r1,%0"
5030 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys,fld,ilog,ild,fst,ist")])
5031 1.1.1.1.4.2 yamt
5032 1.1.1.1.4.2 yamt (define_insn "*movdf_fix"
5033 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,*r,*r,m,m,f,*r")
5034 1.1.1.1.4.2 yamt (match_operand:DF 1 "input_operand" "fG,m,*rG,m,fG,*r,*r,f"))]
5035 1.1.1.1.4.2 yamt "TARGET_FPREGS && TARGET_FIX
5036 1.1.1.1.4.2 yamt && (register_operand (operands[0], DFmode)
5037 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DFmode))"
5038 1.1.1.1.4.2 yamt "@
5039 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
5040 1.1.1.1.4.2 yamt ld%- %0,%1
5041 1.1.1.1.4.2 yamt bis $31,%r1,%0
5042 1.1.1.1.4.2 yamt ldq %0,%1
5043 1.1.1.1.4.2 yamt st%- %R1,%0
5044 1.1.1.1.4.2 yamt stq %r1,%0
5045 1.1.1.1.4.2 yamt itoft %1,%0
5046 1.1.1.1.4.2 yamt ftoit %1,%0"
5047 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys,fld,ilog,ild,fst,ist,itof,ftoi")])
5048 1.1.1.1.4.2 yamt
5049 1.1.1.1.4.2 yamt (define_insn "*movdf_nofp"
5050 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,m")
5051 1.1.1.1.4.2 yamt (match_operand:DF 1 "input_operand" "rG,m,r"))]
5052 1.1.1.1.4.2 yamt "! TARGET_FPREGS
5053 1.1.1.1.4.2 yamt && (register_operand (operands[0], DFmode)
5054 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DFmode))"
5055 1.1.1.1.4.2 yamt "@
5056 1.1.1.1.4.2 yamt bis $31,%r1,%0
5057 1.1.1.1.4.2 yamt ldq %0,%1
5058 1.1.1.1.4.2 yamt stq %r1,%0"
5059 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,ild,ist")])
5060 1.1.1.1.4.2 yamt
5061 1.1.1.1.4.2 yamt ;; Subregs suck for register allocation. Pretend we can move TFmode
5062 1.1.1.1.4.2 yamt ;; data between general registers until after reload.
5063 1.1.1.1.4.2 yamt
5064 1.1.1.1.4.2 yamt (define_insn_and_split "*movtf_internal"
5065 1.1.1.1.4.2 yamt [(set (match_operand:TF 0 "nonimmediate_operand" "=r,o")
5066 1.1.1.1.4.2 yamt (match_operand:TF 1 "input_operand" "roG,rG"))]
5067 1.1.1.1.4.2 yamt "register_operand (operands[0], TFmode)
5068 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], TFmode)"
5069 1.1.1.1.4.2 yamt "#"
5070 1.1.1.1.4.2 yamt "reload_completed"
5071 1.1.1.1.4.2 yamt [(set (match_dup 0) (match_dup 2))
5072 1.1.1.1.4.2 yamt (set (match_dup 1) (match_dup 3))]
5073 1.1.1.1.4.2 yamt {
5074 1.1.1.1.4.2 yamt alpha_split_tmode_pair (operands, TFmode, true);
5075 1.1.1.1.4.2 yamt })
5076 1.1.1.1.4.2 yamt
5077 1.1.1.1.4.2 yamt (define_expand "movsf"
5078 1.1.1.1.4.2 yamt [(set (match_operand:SF 0 "nonimmediate_operand" "")
5079 1.1.1.1.4.2 yamt (match_operand:SF 1 "general_operand" ""))]
5080 1.1.1.1.4.2 yamt ""
5081 1.1.1.1.4.2 yamt {
5082 1.1.1.1.4.2 yamt if (MEM_P (operands[0])
5083 1.1.1.1.4.2 yamt && ! reg_or_0_operand (operands[1], SFmode))
5084 1.1.1.1.4.2 yamt operands[1] = force_reg (SFmode, operands[1]);
5085 1.1.1.1.4.2 yamt })
5086 1.1.1.1.4.2 yamt
5087 1.1.1.1.4.2 yamt (define_expand "movdf"
5088 1.1.1.1.4.2 yamt [(set (match_operand:DF 0 "nonimmediate_operand" "")
5089 1.1.1.1.4.2 yamt (match_operand:DF 1 "general_operand" ""))]
5090 1.1.1.1.4.2 yamt ""
5091 1.1.1.1.4.2 yamt {
5092 1.1.1.1.4.2 yamt if (MEM_P (operands[0])
5093 1.1.1.1.4.2 yamt && ! reg_or_0_operand (operands[1], DFmode))
5094 1.1.1.1.4.2 yamt operands[1] = force_reg (DFmode, operands[1]);
5095 1.1.1.1.4.2 yamt })
5096 1.1.1.1.4.2 yamt
5097 1.1.1.1.4.2 yamt (define_expand "movtf"
5098 1.1.1.1.4.2 yamt [(set (match_operand:TF 0 "nonimmediate_operand" "")
5099 1.1.1.1.4.2 yamt (match_operand:TF 1 "general_operand" ""))]
5100 1.1.1.1.4.2 yamt ""
5101 1.1.1.1.4.2 yamt {
5102 1.1.1.1.4.2 yamt if (MEM_P (operands[0])
5103 1.1.1.1.4.2 yamt && ! reg_or_0_operand (operands[1], TFmode))
5104 1.1.1.1.4.2 yamt operands[1] = force_reg (TFmode, operands[1]);
5105 1.1.1.1.4.2 yamt })
5106 1.1.1.1.4.2 yamt
5107 1.1.1.1.4.2 yamt (define_insn "*movsi"
5108 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,m")
5109 1.1.1.1.4.2 yamt (match_operand:SI 1 "input_operand" "rJ,K,L,n,m,rJ"))]
5110 1.1.1.1.4.2 yamt "(TARGET_ABI_OSF || TARGET_ABI_UNICOSMK)
5111 1.1.1.1.4.2 yamt && (register_operand (operands[0], SImode)
5112 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], SImode))"
5113 1.1.1.1.4.2 yamt "@
5114 1.1.1.1.4.2 yamt bis $31,%r1,%0
5115 1.1.1.1.4.2 yamt lda %0,%1($31)
5116 1.1.1.1.4.2 yamt ldah %0,%h1($31)
5117 1.1.1.1.4.2 yamt #
5118 1.1.1.1.4.2 yamt ldl %0,%1
5119 1.1.1.1.4.2 yamt stl %r1,%0"
5120 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,iadd,multi,ild,ist")])
5121 1.1.1.1.4.2 yamt
5122 1.1.1.1.4.2 yamt (define_insn "*movsi_nt_vms"
5123 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,r,m")
5124 1.1.1.1.4.2 yamt (match_operand:SI 1 "input_operand" "rJ,K,L,s,n,m,rJ"))]
5125 1.1.1.1.4.2 yamt "(TARGET_ABI_WINDOWS_NT || TARGET_ABI_OPEN_VMS)
5126 1.1.1.1.4.2 yamt && (register_operand (operands[0], SImode)
5127 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], SImode))"
5128 1.1.1.1.4.2 yamt "@
5129 1.1.1.1.4.2 yamt bis $31,%1,%0
5130 1.1.1.1.4.2 yamt lda %0,%1
5131 1.1.1.1.4.2 yamt ldah %0,%h1
5132 1.1.1.1.4.2 yamt lda %0,%1
5133 1.1.1.1.4.2 yamt #
5134 1.1.1.1.4.2 yamt ldl %0,%1
5135 1.1.1.1.4.2 yamt stl %r1,%0"
5136 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,iadd,ldsym,multi,ild,ist")])
5137 1.1.1.1.4.2 yamt
5138 1.1.1.1.4.2 yamt (define_insn "*movhi_nobwx"
5139 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "register_operand" "=r,r")
5140 1.1.1.1.4.2 yamt (match_operand:HI 1 "input_operand" "rJ,n"))]
5141 1.1.1.1.4.2 yamt "! TARGET_BWX
5142 1.1.1.1.4.2 yamt && (register_operand (operands[0], HImode)
5143 1.1.1.1.4.2 yamt || register_operand (operands[1], HImode))"
5144 1.1.1.1.4.2 yamt "@
5145 1.1.1.1.4.2 yamt bis $31,%r1,%0
5146 1.1.1.1.4.2 yamt lda %0,%L1($31)"
5147 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd")])
5148 1.1.1.1.4.2 yamt
5149 1.1.1.1.4.2 yamt (define_insn "*movhi_bwx"
5150 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m")
5151 1.1.1.1.4.2 yamt (match_operand:HI 1 "input_operand" "rJ,n,m,rJ"))]
5152 1.1.1.1.4.2 yamt "TARGET_BWX
5153 1.1.1.1.4.2 yamt && (register_operand (operands[0], HImode)
5154 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], HImode))"
5155 1.1.1.1.4.2 yamt "@
5156 1.1.1.1.4.2 yamt bis $31,%r1,%0
5157 1.1.1.1.4.2 yamt lda %0,%L1($31)
5158 1.1.1.1.4.2 yamt ldwu %0,%1
5159 1.1.1.1.4.2 yamt stw %r1,%0"
5160 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,ild,ist")])
5161 1.1.1.1.4.2 yamt
5162 1.1.1.1.4.2 yamt (define_insn "*movqi_nobwx"
5163 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "register_operand" "=r,r")
5164 1.1.1.1.4.2 yamt (match_operand:QI 1 "input_operand" "rJ,n"))]
5165 1.1.1.1.4.2 yamt "! TARGET_BWX
5166 1.1.1.1.4.2 yamt && (register_operand (operands[0], QImode)
5167 1.1.1.1.4.2 yamt || register_operand (operands[1], QImode))"
5168 1.1.1.1.4.2 yamt "@
5169 1.1.1.1.4.2 yamt bis $31,%r1,%0
5170 1.1.1.1.4.2 yamt lda %0,%L1($31)"
5171 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd")])
5172 1.1.1.1.4.2 yamt
5173 1.1.1.1.4.2 yamt (define_insn "*movqi_bwx"
5174 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,m")
5175 1.1.1.1.4.2 yamt (match_operand:QI 1 "input_operand" "rJ,n,m,rJ"))]
5176 1.1.1.1.4.2 yamt "TARGET_BWX
5177 1.1.1.1.4.2 yamt && (register_operand (operands[0], QImode)
5178 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], QImode))"
5179 1.1.1.1.4.2 yamt "@
5180 1.1.1.1.4.2 yamt bis $31,%r1,%0
5181 1.1.1.1.4.2 yamt lda %0,%L1($31)
5182 1.1.1.1.4.2 yamt ldbu %0,%1
5183 1.1.1.1.4.2 yamt stb %r1,%0"
5184 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,ild,ist")])
5185 1.1.1.1.4.2 yamt
5186 1.1.1.1.4.2 yamt ;; We do two major things here: handle mem->mem and construct long
5187 1.1.1.1.4.2 yamt ;; constants.
5188 1.1.1.1.4.2 yamt
5189 1.1.1.1.4.2 yamt (define_expand "movsi"
5190 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "nonimmediate_operand" "")
5191 1.1.1.1.4.2 yamt (match_operand:SI 1 "general_operand" ""))]
5192 1.1.1.1.4.2 yamt ""
5193 1.1.1.1.4.2 yamt {
5194 1.1.1.1.4.2 yamt if (alpha_expand_mov (SImode, operands))
5195 1.1.1.1.4.2 yamt DONE;
5196 1.1.1.1.4.2 yamt })
5197 1.1.1.1.4.2 yamt
5198 1.1.1.1.4.2 yamt ;; Split a load of a large constant into the appropriate two-insn
5199 1.1.1.1.4.2 yamt ;; sequence.
5200 1.1.1.1.4.2 yamt
5201 1.1.1.1.4.2 yamt (define_split
5202 1.1.1.1.4.2 yamt [(set (match_operand:SI 0 "register_operand" "")
5203 1.1.1.1.4.2 yamt (match_operand:SI 1 "non_add_const_operand" ""))]
5204 1.1.1.1.4.2 yamt ""
5205 1.1.1.1.4.2 yamt [(const_int 0)]
5206 1.1.1.1.4.2 yamt {
5207 1.1.1.1.4.2 yamt if (alpha_split_const_mov (SImode, operands))
5208 1.1.1.1.4.2 yamt DONE;
5209 1.1.1.1.4.2 yamt else
5210 1.1.1.1.4.2 yamt FAIL;
5211 1.1.1.1.4.2 yamt })
5212 1.1.1.1.4.2 yamt
5213 1.1.1.1.4.2 yamt ;; Split the load of an address into a four-insn sequence on Unicos/Mk.
5214 1.1.1.1.4.2 yamt ;; Always generate a REG_EQUAL note for the last instruction to facilitate
5215 1.1.1.1.4.2 yamt ;; optimizations. If the symbolic operand is a label_ref, generate
5216 1.1.1.1.4.2 yamt ;; REG_LABEL_OPERAND notes and update LABEL_NUSES because this is not done
5217 1.1.1.1.4.2 yamt ;; automatically. Labels may be incorrectly deleted if we don't do this.
5218 1.1.1.1.4.2 yamt ;;
5219 1.1.1.1.4.2 yamt ;; Describing what the individual instructions do correctly is too complicated
5220 1.1.1.1.4.2 yamt ;; so use UNSPECs for each of the three parts of an address.
5221 1.1.1.1.4.2 yamt
5222 1.1.1.1.4.2 yamt (define_split
5223 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5224 1.1.1.1.4.2 yamt (match_operand:DI 1 "symbolic_operand" ""))]
5225 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK && reload_completed"
5226 1.1.1.1.4.2 yamt [(const_int 0)]
5227 1.1.1.1.4.2 yamt {
5228 1.1.1.1.4.2 yamt rtx insn1, insn2, insn3;
5229 1.1.1.1.4.2 yamt
5230 1.1.1.1.4.2 yamt insn1 = emit_insn (gen_umk_laum (operands[0], operands[1]));
5231 1.1.1.1.4.2 yamt emit_insn (gen_ashldi3 (operands[0], operands[0], GEN_INT (32)));
5232 1.1.1.1.4.2 yamt insn2 = emit_insn (gen_umk_lalm (operands[0], operands[0], operands[1]));
5233 1.1.1.1.4.2 yamt insn3 = emit_insn (gen_umk_lal (operands[0], operands[0], operands[1]));
5234 1.1.1.1.4.2 yamt set_unique_reg_note (insn3, REG_EQUAL, operands[1]);
5235 1.1.1.1.4.2 yamt
5236 1.1.1.1.4.2 yamt if (GET_CODE (operands[1]) == LABEL_REF)
5237 1.1.1.1.4.2 yamt {
5238 1.1.1.1.4.2 yamt rtx label;
5239 1.1.1.1.4.2 yamt
5240 1.1.1.1.4.2 yamt label = XEXP (operands[1], 0);
5241 1.1.1.1.4.2 yamt add_reg_note (insn1, REG_LABEL_OPERAND, label);
5242 1.1.1.1.4.2 yamt add_reg_note (insn2, REG_LABEL_OPERAND, label);
5243 1.1.1.1.4.2 yamt add_reg_note (insn3, REG_LABEL_OPERAND, label);
5244 1.1.1.1.4.2 yamt LABEL_NUSES (label) += 3;
5245 1.1.1.1.4.2 yamt }
5246 1.1.1.1.4.2 yamt DONE;
5247 1.1.1.1.4.2 yamt })
5248 1.1.1.1.4.2 yamt
5249 1.1.1.1.4.2 yamt ;; Instructions for loading the three parts of an address on Unicos/Mk.
5250 1.1.1.1.4.2 yamt
5251 1.1.1.1.4.2 yamt (define_insn "umk_laum"
5252 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5253 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "symbolic_operand" "")]
5254 1.1.1.1.4.2 yamt UNSPEC_UMK_LAUM))]
5255 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
5256 1.1.1.1.4.2 yamt "laum %r0,%t1($31)"
5257 1.1.1.1.4.2 yamt [(set_attr "type" "iadd")])
5258 1.1.1.1.4.2 yamt
5259 1.1.1.1.4.2 yamt (define_insn "umk_lalm"
5260 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5261 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "r")
5262 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
5263 1.1.1.1.4.2 yamt UNSPEC_UMK_LALM)))]
5264 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
5265 1.1.1.1.4.2 yamt "lalm %r0,%t2(%r1)"
5266 1.1.1.1.4.2 yamt [(set_attr "type" "iadd")])
5267 1.1.1.1.4.2 yamt
5268 1.1.1.1.4.2 yamt (define_insn "umk_lal"
5269 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5270 1.1.1.1.4.2 yamt (plus:DI (match_operand:DI 1 "register_operand" "r")
5271 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 2 "symbolic_operand" "")]
5272 1.1.1.1.4.2 yamt UNSPEC_UMK_LAL)))]
5273 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
5274 1.1.1.1.4.2 yamt "lal %r0,%t2(%r1)"
5275 1.1.1.1.4.2 yamt [(set_attr "type" "iadd")])
5276 1.1.1.1.4.2 yamt
5277 1.1.1.1.4.2 yamt ;; Add a new call information word to the current function's list of CIWs
5278 1.1.1.1.4.2 yamt ;; and load its index into $25. Doing it here ensures that the CIW will be
5279 1.1.1.1.4.2 yamt ;; associated with the correct function even in the presence of inlining.
5280 1.1.1.1.4.2 yamt
5281 1.1.1.1.4.2 yamt (define_insn "*umk_load_ciw"
5282 1.1.1.1.4.2 yamt [(set (reg:DI 25)
5283 1.1.1.1.4.2 yamt (unspec:DI [(match_operand 0 "" "")] UNSPEC_UMK_LOAD_CIW))]
5284 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
5285 1.1.1.1.4.2 yamt {
5286 1.1.1.1.4.2 yamt operands[0] = unicosmk_add_call_info_word (operands[0]);
5287 1.1.1.1.4.2 yamt return "lda $25,%0";
5288 1.1.1.1.4.2 yamt }
5289 1.1.1.1.4.2 yamt [(set_attr "type" "iadd")])
5290 1.1.1.1.4.2 yamt
5291 1.1.1.1.4.2 yamt (define_insn "*movdi_er_low_l"
5292 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5293 1.1.1.1.4.2 yamt (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
5294 1.1.1.1.4.2 yamt (match_operand:DI 2 "local_symbolic_operand" "")))]
5295 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS"
5296 1.1.1.1.4.2 yamt {
5297 1.1.1.1.4.2 yamt if (true_regnum (operands[1]) == 29)
5298 1.1.1.1.4.2 yamt return "lda %0,%2(%1)\t\t!gprel";
5299 1.1.1.1.4.2 yamt else
5300 1.1.1.1.4.2 yamt return "lda %0,%2(%1)\t\t!gprellow";
5301 1.1.1.1.4.2 yamt }
5302 1.1.1.1.4.2 yamt [(set_attr "usegp" "yes")])
5303 1.1.1.1.4.2 yamt
5304 1.1.1.1.4.2 yamt (define_split
5305 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5306 1.1.1.1.4.2 yamt (match_operand:DI 1 "small_symbolic_operand" ""))]
5307 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && reload_completed"
5308 1.1.1.1.4.2 yamt [(set (match_dup 0)
5309 1.1.1.1.4.2 yamt (lo_sum:DI (match_dup 2) (match_dup 1)))]
5310 1.1.1.1.4.2 yamt "operands[2] = pic_offset_table_rtx;")
5311 1.1.1.1.4.2 yamt
5312 1.1.1.1.4.2 yamt (define_split
5313 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5314 1.1.1.1.4.2 yamt (match_operand:DI 1 "local_symbolic_operand" ""))]
5315 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && reload_completed"
5316 1.1.1.1.4.2 yamt [(set (match_dup 0)
5317 1.1.1.1.4.2 yamt (plus:DI (match_dup 2) (high:DI (match_dup 1))))
5318 1.1.1.1.4.2 yamt (set (match_dup 0)
5319 1.1.1.1.4.2 yamt (lo_sum:DI (match_dup 0) (match_dup 1)))]
5320 1.1.1.1.4.2 yamt "operands[2] = pic_offset_table_rtx;")
5321 1.1.1.1.4.2 yamt
5322 1.1.1.1.4.2 yamt (define_split
5323 1.1.1.1.4.2 yamt [(match_operand 0 "some_small_symbolic_operand" "")]
5324 1.1.1.1.4.2 yamt ""
5325 1.1.1.1.4.2 yamt [(match_dup 0)]
5326 1.1.1.1.4.2 yamt "operands[0] = split_small_symbolic_operand (operands[0]);")
5327 1.1.1.1.4.2 yamt
5328 1.1.1.1.4.2 yamt ;; Accepts any symbolic, not just global, since function calls that
5329 1.1.1.1.4.2 yamt ;; don't go via bsr still use !literal in hopes of linker relaxation.
5330 1.1.1.1.4.2 yamt (define_insn "movdi_er_high_g"
5331 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5332 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
5333 1.1.1.1.4.2 yamt (match_operand:DI 2 "symbolic_operand" "")
5334 1.1.1.1.4.2 yamt (match_operand 3 "const_int_operand" "")]
5335 1.1.1.1.4.2 yamt UNSPEC_LITERAL))]
5336 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS"
5337 1.1.1.1.4.2 yamt {
5338 1.1.1.1.4.2 yamt if (INTVAL (operands[3]) == 0)
5339 1.1.1.1.4.2 yamt return "ldq %0,%2(%1)\t\t!literal";
5340 1.1.1.1.4.2 yamt else
5341 1.1.1.1.4.2 yamt return "ldq %0,%2(%1)\t\t!literal!%3";
5342 1.1.1.1.4.2 yamt }
5343 1.1.1.1.4.2 yamt [(set_attr "type" "ldsym")])
5344 1.1.1.1.4.2 yamt
5345 1.1.1.1.4.2 yamt (define_split
5346 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5347 1.1.1.1.4.2 yamt (match_operand:DI 1 "global_symbolic_operand" ""))]
5348 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && reload_completed"
5349 1.1.1.1.4.2 yamt [(set (match_dup 0)
5350 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 2)
5351 1.1.1.1.4.2 yamt (match_dup 1)
5352 1.1.1.1.4.2 yamt (const_int 0)] UNSPEC_LITERAL))]
5353 1.1.1.1.4.2 yamt "operands[2] = pic_offset_table_rtx;")
5354 1.1.1.1.4.2 yamt
5355 1.1.1.1.4.2 yamt (define_insn "movdi_er_tlsgd"
5356 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5357 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
5358 1.1.1.1.4.2 yamt (match_operand:DI 2 "symbolic_operand" "")
5359 1.1.1.1.4.2 yamt (match_operand 3 "const_int_operand" "")]
5360 1.1.1.1.4.2 yamt UNSPEC_TLSGD))]
5361 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
5362 1.1.1.1.4.2 yamt {
5363 1.1.1.1.4.2 yamt if (INTVAL (operands[3]) == 0)
5364 1.1.1.1.4.2 yamt return "lda %0,%2(%1)\t\t!tlsgd";
5365 1.1.1.1.4.2 yamt else
5366 1.1.1.1.4.2 yamt return "lda %0,%2(%1)\t\t!tlsgd!%3";
5367 1.1.1.1.4.2 yamt })
5368 1.1.1.1.4.2 yamt
5369 1.1.1.1.4.2 yamt (define_insn "movdi_er_tlsldm"
5370 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5371 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
5372 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "")]
5373 1.1.1.1.4.2 yamt UNSPEC_TLSLDM))]
5374 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
5375 1.1.1.1.4.2 yamt {
5376 1.1.1.1.4.2 yamt if (INTVAL (operands[2]) == 0)
5377 1.1.1.1.4.2 yamt return "lda %0,%&(%1)\t\t!tlsldm";
5378 1.1.1.1.4.2 yamt else
5379 1.1.1.1.4.2 yamt return "lda %0,%&(%1)\t\t!tlsldm!%2";
5380 1.1.1.1.4.2 yamt })
5381 1.1.1.1.4.2 yamt
5382 1.1.1.1.4.2 yamt (define_insn "*movdi_er_gotdtp"
5383 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5384 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
5385 1.1.1.1.4.2 yamt (match_operand:DI 2 "symbolic_operand" "")]
5386 1.1.1.1.4.2 yamt UNSPEC_DTPREL))]
5387 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
5388 1.1.1.1.4.2 yamt "ldq %0,%2(%1)\t\t!gotdtprel"
5389 1.1.1.1.4.2 yamt [(set_attr "type" "ild")
5390 1.1.1.1.4.2 yamt (set_attr "usegp" "yes")])
5391 1.1.1.1.4.2 yamt
5392 1.1.1.1.4.2 yamt (define_split
5393 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5394 1.1.1.1.4.2 yamt (match_operand:DI 1 "gotdtp_symbolic_operand" ""))]
5395 1.1.1.1.4.2 yamt "HAVE_AS_TLS && reload_completed"
5396 1.1.1.1.4.2 yamt [(set (match_dup 0)
5397 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 2)
5398 1.1.1.1.4.2 yamt (match_dup 1)] UNSPEC_DTPREL))]
5399 1.1.1.1.4.2 yamt {
5400 1.1.1.1.4.2 yamt operands[1] = XVECEXP (XEXP (operands[1], 0), 0, 0);
5401 1.1.1.1.4.2 yamt operands[2] = pic_offset_table_rtx;
5402 1.1.1.1.4.2 yamt })
5403 1.1.1.1.4.2 yamt
5404 1.1.1.1.4.2 yamt (define_insn "*movdi_er_gottp"
5405 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5406 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
5407 1.1.1.1.4.2 yamt (match_operand:DI 2 "symbolic_operand" "")]
5408 1.1.1.1.4.2 yamt UNSPEC_TPREL))]
5409 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
5410 1.1.1.1.4.2 yamt "ldq %0,%2(%1)\t\t!gottprel"
5411 1.1.1.1.4.2 yamt [(set_attr "type" "ild")
5412 1.1.1.1.4.2 yamt (set_attr "usegp" "yes")])
5413 1.1.1.1.4.2 yamt
5414 1.1.1.1.4.2 yamt (define_split
5415 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5416 1.1.1.1.4.2 yamt (match_operand:DI 1 "gottp_symbolic_operand" ""))]
5417 1.1.1.1.4.2 yamt "HAVE_AS_TLS && reload_completed"
5418 1.1.1.1.4.2 yamt [(set (match_dup 0)
5419 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 2)
5420 1.1.1.1.4.2 yamt (match_dup 1)] UNSPEC_TPREL))]
5421 1.1.1.1.4.2 yamt {
5422 1.1.1.1.4.2 yamt operands[1] = XVECEXP (XEXP (operands[1], 0), 0, 0);
5423 1.1.1.1.4.2 yamt operands[2] = pic_offset_table_rtx;
5424 1.1.1.1.4.2 yamt })
5425 1.1.1.1.4.2 yamt
5426 1.1.1.1.4.2 yamt (define_insn "*movdi_er_nofix"
5427 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,r,r,r,m,*f,*f,Q")
5428 1.1.1.1.4.2 yamt (match_operand:DI 1 "input_operand" "rJ,K,L,T,s,n,m,rJ,*fJ,Q,*f"))]
5429 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && ! TARGET_FIX
5430 1.1.1.1.4.2 yamt && (register_operand (operands[0], DImode)
5431 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DImode))"
5432 1.1.1.1.4.2 yamt "@
5433 1.1.1.1.4.2 yamt mov %r1,%0
5434 1.1.1.1.4.2 yamt lda %0,%1($31)
5435 1.1.1.1.4.2 yamt ldah %0,%h1($31)
5436 1.1.1.1.4.2 yamt #
5437 1.1.1.1.4.2 yamt #
5438 1.1.1.1.4.2 yamt #
5439 1.1.1.1.4.2 yamt ldq%A1 %0,%1
5440 1.1.1.1.4.2 yamt stq%A0 %r1,%0
5441 1.1.1.1.4.2 yamt fmov %R1,%0
5442 1.1.1.1.4.2 yamt ldt %0,%1
5443 1.1.1.1.4.2 yamt stt %R1,%0"
5444 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,iadd,iadd,ldsym,multi,ild,ist,fcpys,fld,fst")
5445 1.1.1.1.4.2 yamt (set_attr "usegp" "*,*,*,yes,*,*,*,*,*,*,*")])
5446 1.1.1.1.4.2 yamt
5447 1.1.1.1.4.2 yamt ;; The 'U' constraint matches symbolic operands on Unicos/Mk. Those should
5448 1.1.1.1.4.2 yamt ;; have been split up by the rules above but we shouldn't reject the
5449 1.1.1.1.4.2 yamt ;; possibility of them getting through.
5450 1.1.1.1.4.2 yamt
5451 1.1.1.1.4.2 yamt (define_insn "*movdi_nofix"
5452 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,r,r,r,m,*f,*f,Q")
5453 1.1.1.1.4.2 yamt (match_operand:DI 1 "input_operand" "rJ,K,L,U,s,n,m,rJ,*fJ,Q,*f"))]
5454 1.1.1.1.4.2 yamt "! TARGET_FIX
5455 1.1.1.1.4.2 yamt && (register_operand (operands[0], DImode)
5456 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DImode))"
5457 1.1.1.1.4.2 yamt "@
5458 1.1.1.1.4.2 yamt bis $31,%r1,%0
5459 1.1.1.1.4.2 yamt lda %0,%1($31)
5460 1.1.1.1.4.2 yamt ldah %0,%h1($31)
5461 1.1.1.1.4.2 yamt laum %0,%t1($31)\;sll %0,32,%0\;lalm %0,%t1(%0)\;lal %0,%t1(%0)
5462 1.1.1.1.4.2 yamt lda %0,%1
5463 1.1.1.1.4.2 yamt #
5464 1.1.1.1.4.2 yamt ldq%A1 %0,%1
5465 1.1.1.1.4.2 yamt stq%A0 %r1,%0
5466 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
5467 1.1.1.1.4.2 yamt ldt %0,%1
5468 1.1.1.1.4.2 yamt stt %R1,%0"
5469 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,iadd,ldsym,ldsym,multi,ild,ist,fcpys,fld,fst")
5470 1.1.1.1.4.2 yamt (set_attr "length" "*,*,*,16,*,*,*,*,*,*,*")])
5471 1.1.1.1.4.2 yamt
5472 1.1.1.1.4.2 yamt (define_insn "*movdi_er_fix"
5473 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "nonimmediate_operand"
5474 1.1.1.1.4.2 yamt "=r,r,r,r,r,r,r, m, *f,*f, Q, r,*f")
5475 1.1.1.1.4.2 yamt (match_operand:DI 1 "input_operand"
5476 1.1.1.1.4.2 yamt "rJ,K,L,T,s,n,m,rJ,*fJ, Q,*f,*f, r"))]
5477 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_FIX
5478 1.1.1.1.4.2 yamt && (register_operand (operands[0], DImode)
5479 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DImode))"
5480 1.1.1.1.4.2 yamt "@
5481 1.1.1.1.4.2 yamt mov %r1,%0
5482 1.1.1.1.4.2 yamt lda %0,%1($31)
5483 1.1.1.1.4.2 yamt ldah %0,%h1($31)
5484 1.1.1.1.4.2 yamt #
5485 1.1.1.1.4.2 yamt #
5486 1.1.1.1.4.2 yamt #
5487 1.1.1.1.4.2 yamt ldq%A1 %0,%1
5488 1.1.1.1.4.2 yamt stq%A0 %r1,%0
5489 1.1.1.1.4.2 yamt fmov %R1,%0
5490 1.1.1.1.4.2 yamt ldt %0,%1
5491 1.1.1.1.4.2 yamt stt %R1,%0
5492 1.1.1.1.4.2 yamt ftoit %1,%0
5493 1.1.1.1.4.2 yamt itoft %1,%0"
5494 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,iadd,iadd,ldsym,multi,ild,ist,fcpys,fld,fst,ftoi,itof")
5495 1.1.1.1.4.2 yamt (set_attr "usegp" "*,*,*,yes,*,*,*,*,*,*,*,*,*")])
5496 1.1.1.1.4.2 yamt
5497 1.1.1.1.4.2 yamt (define_insn "*movdi_fix"
5498 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,r,r,m,*f,*f,Q,r,*f")
5499 1.1.1.1.4.2 yamt (match_operand:DI 1 "input_operand" "rJ,K,L,s,n,m,rJ,*fJ,Q,*f,*f,r"))]
5500 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_FIX
5501 1.1.1.1.4.2 yamt && (register_operand (operands[0], DImode)
5502 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], DImode))"
5503 1.1.1.1.4.2 yamt "@
5504 1.1.1.1.4.2 yamt bis $31,%r1,%0
5505 1.1.1.1.4.2 yamt lda %0,%1($31)
5506 1.1.1.1.4.2 yamt ldah %0,%h1($31)
5507 1.1.1.1.4.2 yamt lda %0,%1
5508 1.1.1.1.4.2 yamt #
5509 1.1.1.1.4.2 yamt ldq%A1 %0,%1
5510 1.1.1.1.4.2 yamt stq%A0 %r1,%0
5511 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
5512 1.1.1.1.4.2 yamt ldt %0,%1
5513 1.1.1.1.4.2 yamt stt %R1,%0
5514 1.1.1.1.4.2 yamt ftoit %1,%0
5515 1.1.1.1.4.2 yamt itoft %1,%0"
5516 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,iadd,iadd,ldsym,multi,ild,ist,fcpys,fld,fst,ftoi,itof")])
5517 1.1.1.1.4.2 yamt
5518 1.1.1.1.4.2 yamt ;; VMS needs to set up "vms_base_regno" for unwinding. This move
5519 1.1.1.1.4.2 yamt ;; often appears dead to the life analysis code, at which point we
5520 1.1.1.1.4.2 yamt ;; die for emitting dead prologue instructions. Force this live.
5521 1.1.1.1.4.2 yamt
5522 1.1.1.1.4.2 yamt (define_insn "force_movdi"
5523 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
5524 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")]
5525 1.1.1.1.4.2 yamt UNSPECV_FORCE_MOV))]
5526 1.1.1.1.4.2 yamt ""
5527 1.1.1.1.4.2 yamt "mov %1,%0"
5528 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
5529 1.1.1.1.4.2 yamt
5530 1.1.1.1.4.2 yamt ;; We do three major things here: handle mem->mem, put 64-bit constants in
5531 1.1.1.1.4.2 yamt ;; memory, and construct long 32-bit constants.
5532 1.1.1.1.4.2 yamt
5533 1.1.1.1.4.2 yamt (define_expand "movdi"
5534 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "nonimmediate_operand" "")
5535 1.1.1.1.4.2 yamt (match_operand:DI 1 "general_operand" ""))]
5536 1.1.1.1.4.2 yamt ""
5537 1.1.1.1.4.2 yamt {
5538 1.1.1.1.4.2 yamt if (alpha_expand_mov (DImode, operands))
5539 1.1.1.1.4.2 yamt DONE;
5540 1.1.1.1.4.2 yamt })
5541 1.1.1.1.4.2 yamt
5542 1.1.1.1.4.2 yamt ;; Split a load of a large constant into the appropriate two-insn
5543 1.1.1.1.4.2 yamt ;; sequence.
5544 1.1.1.1.4.2 yamt
5545 1.1.1.1.4.2 yamt (define_split
5546 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
5547 1.1.1.1.4.2 yamt (match_operand:DI 1 "non_add_const_operand" ""))]
5548 1.1.1.1.4.2 yamt ""
5549 1.1.1.1.4.2 yamt [(const_int 0)]
5550 1.1.1.1.4.2 yamt {
5551 1.1.1.1.4.2 yamt if (alpha_split_const_mov (DImode, operands))
5552 1.1.1.1.4.2 yamt DONE;
5553 1.1.1.1.4.2 yamt else
5554 1.1.1.1.4.2 yamt FAIL;
5555 1.1.1.1.4.2 yamt })
5556 1.1.1.1.4.2 yamt
5557 1.1.1.1.4.2 yamt ;; We need to prevent reload from splitting TImode moves, because it
5558 1.1.1.1.4.2 yamt ;; might decide to overwrite a pointer with the value it points to.
5559 1.1.1.1.4.2 yamt ;; In that case we have to do the loads in the appropriate order so
5560 1.1.1.1.4.2 yamt ;; that the pointer is not destroyed too early.
5561 1.1.1.1.4.2 yamt
5562 1.1.1.1.4.2 yamt (define_insn_and_split "*movti_internal"
5563 1.1.1.1.4.2 yamt [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
5564 1.1.1.1.4.2 yamt (match_operand:TI 1 "input_operand" "roJ,rJ"))]
5565 1.1.1.1.4.2 yamt "(register_operand (operands[0], TImode)
5566 1.1.1.1.4.2 yamt /* Prevent rematerialization of constants. */
5567 1.1.1.1.4.2 yamt && ! CONSTANT_P (operands[1]))
5568 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], TImode)"
5569 1.1.1.1.4.2 yamt "#"
5570 1.1.1.1.4.2 yamt "reload_completed"
5571 1.1.1.1.4.2 yamt [(set (match_dup 0) (match_dup 2))
5572 1.1.1.1.4.2 yamt (set (match_dup 1) (match_dup 3))]
5573 1.1.1.1.4.2 yamt {
5574 1.1.1.1.4.2 yamt alpha_split_tmode_pair (operands, TImode, true);
5575 1.1.1.1.4.2 yamt })
5576 1.1.1.1.4.2 yamt
5577 1.1.1.1.4.2 yamt (define_expand "movti"
5578 1.1.1.1.4.2 yamt [(set (match_operand:TI 0 "nonimmediate_operand" "")
5579 1.1.1.1.4.2 yamt (match_operand:TI 1 "general_operand" ""))]
5580 1.1.1.1.4.2 yamt ""
5581 1.1.1.1.4.2 yamt {
5582 1.1.1.1.4.2 yamt if (MEM_P (operands[0])
5583 1.1.1.1.4.2 yamt && ! reg_or_0_operand (operands[1], TImode))
5584 1.1.1.1.4.2 yamt operands[1] = force_reg (TImode, operands[1]);
5585 1.1.1.1.4.2 yamt
5586 1.1.1.1.4.2 yamt if (operands[1] == const0_rtx)
5587 1.1.1.1.4.2 yamt ;
5588 1.1.1.1.4.2 yamt /* We must put 64-bit constants in memory. We could keep the
5589 1.1.1.1.4.2 yamt 32-bit constants in TImode and rely on the splitter, but
5590 1.1.1.1.4.2 yamt this doesn't seem to be worth the pain. */
5591 1.1.1.1.4.2 yamt else if (CONST_INT_P (operands[1])
5592 1.1.1.1.4.2 yamt || GET_CODE (operands[1]) == CONST_DOUBLE)
5593 1.1.1.1.4.2 yamt {
5594 1.1.1.1.4.2 yamt rtx in[2], out[2], target;
5595 1.1.1.1.4.2 yamt
5596 1.1.1.1.4.2 yamt gcc_assert (can_create_pseudo_p ());
5597 1.1.1.1.4.2 yamt
5598 1.1.1.1.4.2 yamt split_double (operands[1], &in[0], &in[1]);
5599 1.1.1.1.4.2 yamt
5600 1.1.1.1.4.2 yamt if (in[0] == const0_rtx)
5601 1.1.1.1.4.2 yamt out[0] = const0_rtx;
5602 1.1.1.1.4.2 yamt else
5603 1.1.1.1.4.2 yamt {
5604 1.1.1.1.4.2 yamt out[0] = gen_reg_rtx (DImode);
5605 1.1.1.1.4.2 yamt emit_insn (gen_movdi (out[0], in[0]));
5606 1.1.1.1.4.2 yamt }
5607 1.1.1.1.4.2 yamt
5608 1.1.1.1.4.2 yamt if (in[1] == const0_rtx)
5609 1.1.1.1.4.2 yamt out[1] = const0_rtx;
5610 1.1.1.1.4.2 yamt else
5611 1.1.1.1.4.2 yamt {
5612 1.1.1.1.4.2 yamt out[1] = gen_reg_rtx (DImode);
5613 1.1.1.1.4.2 yamt emit_insn (gen_movdi (out[1], in[1]));
5614 1.1.1.1.4.2 yamt }
5615 1.1.1.1.4.2 yamt
5616 1.1.1.1.4.2 yamt if (!REG_P (operands[0]))
5617 1.1.1.1.4.2 yamt target = gen_reg_rtx (TImode);
5618 1.1.1.1.4.2 yamt else
5619 1.1.1.1.4.2 yamt target = operands[0];
5620 1.1.1.1.4.2 yamt
5621 1.1.1.1.4.2 yamt emit_insn (gen_movdi (operand_subword (target, 0, 0, TImode), out[0]));
5622 1.1.1.1.4.2 yamt emit_insn (gen_movdi (operand_subword (target, 1, 0, TImode), out[1]));
5623 1.1.1.1.4.2 yamt
5624 1.1.1.1.4.2 yamt if (target != operands[0])
5625 1.1.1.1.4.2 yamt emit_insn (gen_rtx_SET (VOIDmode, operands[0], target));
5626 1.1.1.1.4.2 yamt
5627 1.1.1.1.4.2 yamt DONE;
5628 1.1.1.1.4.2 yamt }
5629 1.1.1.1.4.2 yamt })
5630 1.1.1.1.4.2 yamt
5631 1.1.1.1.4.2 yamt ;; These are the partial-word cases.
5632 1.1.1.1.4.2 yamt ;;
5633 1.1.1.1.4.2 yamt ;; First we have the code to load an aligned word. Operand 0 is the register
5634 1.1.1.1.4.2 yamt ;; in which to place the result. It's mode is QImode or HImode. Operand 1
5635 1.1.1.1.4.2 yamt ;; is an SImode MEM at the low-order byte of the proper word. Operand 2 is the
5636 1.1.1.1.4.2 yamt ;; number of bits within the word that the value is. Operand 3 is an SImode
5637 1.1.1.1.4.2 yamt ;; scratch register. If operand 0 is a hard register, operand 3 may be the
5638 1.1.1.1.4.2 yamt ;; same register. It is allowed to conflict with operand 1 as well.
5639 1.1.1.1.4.2 yamt
5640 1.1.1.1.4.2 yamt (define_expand "aligned_loadqi"
5641 1.1.1.1.4.2 yamt [(set (match_operand:SI 3 "register_operand" "")
5642 1.1.1.1.4.2 yamt (match_operand:SI 1 "memory_operand" ""))
5643 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
5644 1.1.1.1.4.2 yamt (zero_extract:DI (subreg:DI (match_dup 3) 0)
5645 1.1.1.1.4.2 yamt (const_int 8)
5646 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "")))]
5647 1.1.1.1.4.2 yamt
5648 1.1.1.1.4.2 yamt ""
5649 1.1.1.1.4.2 yamt "")
5650 1.1.1.1.4.2 yamt
5651 1.1.1.1.4.2 yamt (define_expand "aligned_loadhi"
5652 1.1.1.1.4.2 yamt [(set (match_operand:SI 3 "register_operand" "")
5653 1.1.1.1.4.2 yamt (match_operand:SI 1 "memory_operand" ""))
5654 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
5655 1.1.1.1.4.2 yamt (zero_extract:DI (subreg:DI (match_dup 3) 0)
5656 1.1.1.1.4.2 yamt (const_int 16)
5657 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "")))]
5658 1.1.1.1.4.2 yamt
5659 1.1.1.1.4.2 yamt ""
5660 1.1.1.1.4.2 yamt "")
5661 1.1.1.1.4.2 yamt
5662 1.1.1.1.4.2 yamt ;; Similar for unaligned loads, where we use the sequence from the
5663 1.1.1.1.4.2 yamt ;; Alpha Architecture manual. We have to distinguish between little-endian
5664 1.1.1.1.4.2 yamt ;; and big-endian systems as the sequences are different.
5665 1.1.1.1.4.2 yamt ;;
5666 1.1.1.1.4.2 yamt ;; Operand 1 is the address. Operands 2 and 3 are temporaries, where
5667 1.1.1.1.4.2 yamt ;; operand 3 can overlap the input and output registers.
5668 1.1.1.1.4.2 yamt
5669 1.1.1.1.4.2 yamt (define_expand "unaligned_loadqi"
5670 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
5671 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "address_operand" ""))
5672 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))
5673 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "register_operand" ""))]
5674 1.1.1.1.4.2 yamt ""
5675 1.1.1.1.4.2 yamt {
5676 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
5677 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_loadqi_be (operands[0], operands[1],
5678 1.1.1.1.4.2 yamt operands[2], operands[3]));
5679 1.1.1.1.4.2 yamt else
5680 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_loadqi_le (operands[0], operands[1],
5681 1.1.1.1.4.2 yamt operands[2], operands[3]));
5682 1.1.1.1.4.2 yamt DONE;
5683 1.1.1.1.4.2 yamt })
5684 1.1.1.1.4.2 yamt
5685 1.1.1.1.4.2 yamt (define_expand "unaligned_loadqi_le"
5686 1.1.1.1.4.2 yamt [(set (match_operand:DI 2 "register_operand" "")
5687 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "address_operand" "")
5688 1.1.1.1.4.2 yamt (const_int -8))))
5689 1.1.1.1.4.2 yamt (set (match_operand:DI 3 "register_operand" "")
5690 1.1.1.1.4.2 yamt (match_dup 1))
5691 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
5692 1.1.1.1.4.2 yamt (zero_extract:DI (match_dup 2)
5693 1.1.1.1.4.2 yamt (const_int 8)
5694 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3) (const_int 3))))]
5695 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
5696 1.1.1.1.4.2 yamt "")
5697 1.1.1.1.4.2 yamt
5698 1.1.1.1.4.2 yamt (define_expand "unaligned_loadqi_be"
5699 1.1.1.1.4.2 yamt [(set (match_operand:DI 2 "register_operand" "")
5700 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "address_operand" "")
5701 1.1.1.1.4.2 yamt (const_int -8))))
5702 1.1.1.1.4.2 yamt (set (match_operand:DI 3 "register_operand" "")
5703 1.1.1.1.4.2 yamt (match_dup 1))
5704 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
5705 1.1.1.1.4.2 yamt (zero_extract:DI (match_dup 2)
5706 1.1.1.1.4.2 yamt (const_int 8)
5707 1.1.1.1.4.2 yamt (minus:DI
5708 1.1.1.1.4.2 yamt (const_int 56)
5709 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3) (const_int 3)))))]
5710 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
5711 1.1.1.1.4.2 yamt "")
5712 1.1.1.1.4.2 yamt
5713 1.1.1.1.4.2 yamt (define_expand "unaligned_loadhi"
5714 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" ""))
5715 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "address_operand" ""))
5716 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))
5717 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "register_operand" ""))]
5718 1.1.1.1.4.2 yamt ""
5719 1.1.1.1.4.2 yamt {
5720 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
5721 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_loadhi_be (operands[0], operands[1],
5722 1.1.1.1.4.2 yamt operands[2], operands[3]));
5723 1.1.1.1.4.2 yamt else
5724 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_loadhi_le (operands[0], operands[1],
5725 1.1.1.1.4.2 yamt operands[2], operands[3]));
5726 1.1.1.1.4.2 yamt DONE;
5727 1.1.1.1.4.2 yamt })
5728 1.1.1.1.4.2 yamt
5729 1.1.1.1.4.2 yamt (define_expand "unaligned_loadhi_le"
5730 1.1.1.1.4.2 yamt [(set (match_operand:DI 2 "register_operand" "")
5731 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "address_operand" "")
5732 1.1.1.1.4.2 yamt (const_int -8))))
5733 1.1.1.1.4.2 yamt (set (match_operand:DI 3 "register_operand" "")
5734 1.1.1.1.4.2 yamt (match_dup 1))
5735 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
5736 1.1.1.1.4.2 yamt (zero_extract:DI (match_dup 2)
5737 1.1.1.1.4.2 yamt (const_int 16)
5738 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3) (const_int 3))))]
5739 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
5740 1.1.1.1.4.2 yamt "")
5741 1.1.1.1.4.2 yamt
5742 1.1.1.1.4.2 yamt (define_expand "unaligned_loadhi_be"
5743 1.1.1.1.4.2 yamt [(set (match_operand:DI 2 "register_operand" "")
5744 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 1 "address_operand" "")
5745 1.1.1.1.4.2 yamt (const_int -8))))
5746 1.1.1.1.4.2 yamt (set (match_operand:DI 3 "register_operand" "")
5747 1.1.1.1.4.2 yamt (plus:DI (match_dup 1) (const_int 1)))
5748 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "")
5749 1.1.1.1.4.2 yamt (zero_extract:DI (match_dup 2)
5750 1.1.1.1.4.2 yamt (const_int 16)
5751 1.1.1.1.4.2 yamt (minus:DI
5752 1.1.1.1.4.2 yamt (const_int 56)
5753 1.1.1.1.4.2 yamt (ashift:DI (match_dup 3) (const_int 3)))))]
5754 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
5755 1.1.1.1.4.2 yamt "")
5756 1.1.1.1.4.2 yamt
5757 1.1.1.1.4.2 yamt ;; Storing an aligned byte or word requires two temporaries. Operand 0 is the
5758 1.1.1.1.4.2 yamt ;; aligned SImode MEM. Operand 1 is the register containing the
5759 1.1.1.1.4.2 yamt ;; byte or word to store. Operand 2 is the number of bits within the word that
5760 1.1.1.1.4.2 yamt ;; the value should be placed. Operands 3 and 4 are SImode temporaries.
5761 1.1.1.1.4.2 yamt
5762 1.1.1.1.4.2 yamt (define_expand "aligned_store"
5763 1.1.1.1.4.2 yamt [(set (match_operand:SI 3 "register_operand" "")
5764 1.1.1.1.4.2 yamt (match_operand:SI 0 "memory_operand" ""))
5765 1.1.1.1.4.2 yamt (set (subreg:DI (match_dup 3) 0)
5766 1.1.1.1.4.2 yamt (and:DI (subreg:DI (match_dup 3) 0) (match_dup 5)))
5767 1.1.1.1.4.2 yamt (set (subreg:DI (match_operand:SI 4 "register_operand" "") 0)
5768 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand 1 "register_operand" ""))
5769 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "")))
5770 1.1.1.1.4.2 yamt (set (subreg:DI (match_dup 4) 0)
5771 1.1.1.1.4.2 yamt (ior:DI (subreg:DI (match_dup 4) 0) (subreg:DI (match_dup 3) 0)))
5772 1.1.1.1.4.2 yamt (set (match_dup 0) (match_dup 4))]
5773 1.1.1.1.4.2 yamt ""
5774 1.1.1.1.4.2 yamt {
5775 1.1.1.1.4.2 yamt operands[5] = GEN_INT (~ (GET_MODE_MASK (GET_MODE (operands[1]))
5776 1.1.1.1.4.2 yamt << INTVAL (operands[2])));
5777 1.1.1.1.4.2 yamt })
5778 1.1.1.1.4.2 yamt
5779 1.1.1.1.4.2 yamt ;; For the unaligned byte and halfword cases, we use code similar to that
5780 1.1.1.1.4.2 yamt ;; in the ;; Architecture book, but reordered to lower the number of registers
5781 1.1.1.1.4.2 yamt ;; required. Operand 0 is the address. Operand 1 is the data to store.
5782 1.1.1.1.4.2 yamt ;; Operands 2, 3, and 4 are DImode temporaries, where operands 2 and 4 may
5783 1.1.1.1.4.2 yamt ;; be the same temporary, if desired. If the address is in a register,
5784 1.1.1.1.4.2 yamt ;; operand 2 can be that register.
5785 1.1.1.1.4.2 yamt
5786 1.1.1.1.4.2 yamt (define_expand "unaligned_storeqi"
5787 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "address_operand" ""))
5788 1.1.1.1.4.2 yamt (use (match_operand:QI 1 "register_operand" ""))
5789 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))
5790 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "register_operand" ""))
5791 1.1.1.1.4.2 yamt (use (match_operand:DI 4 "register_operand" ""))]
5792 1.1.1.1.4.2 yamt ""
5793 1.1.1.1.4.2 yamt {
5794 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
5795 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_storeqi_be (operands[0], operands[1],
5796 1.1.1.1.4.2 yamt operands[2], operands[3],
5797 1.1.1.1.4.2 yamt operands[4]));
5798 1.1.1.1.4.2 yamt else
5799 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_storeqi_le (operands[0], operands[1],
5800 1.1.1.1.4.2 yamt operands[2], operands[3],
5801 1.1.1.1.4.2 yamt operands[4]));
5802 1.1.1.1.4.2 yamt DONE;
5803 1.1.1.1.4.2 yamt })
5804 1.1.1.1.4.2 yamt
5805 1.1.1.1.4.2 yamt (define_expand "unaligned_storeqi_le"
5806 1.1.1.1.4.2 yamt [(set (match_operand:DI 3 "register_operand" "")
5807 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 0 "address_operand" "")
5808 1.1.1.1.4.2 yamt (const_int -8))))
5809 1.1.1.1.4.2 yamt (set (match_operand:DI 2 "register_operand" "")
5810 1.1.1.1.4.2 yamt (match_dup 0))
5811 1.1.1.1.4.2 yamt (set (match_dup 3)
5812 1.1.1.1.4.2 yamt (and:DI (not:DI (ashift:DI (const_int 255)
5813 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3))))
5814 1.1.1.1.4.2 yamt (match_dup 3)))
5815 1.1.1.1.4.2 yamt (set (match_operand:DI 4 "register_operand" "")
5816 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" ""))
5817 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3))))
5818 1.1.1.1.4.2 yamt (set (match_dup 4) (ior:DI (match_dup 4) (match_dup 3)))
5819 1.1.1.1.4.2 yamt (set (mem:DI (and:DI (match_dup 0) (const_int -8)))
5820 1.1.1.1.4.2 yamt (match_dup 4))]
5821 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
5822 1.1.1.1.4.2 yamt "")
5823 1.1.1.1.4.2 yamt
5824 1.1.1.1.4.2 yamt (define_expand "unaligned_storeqi_be"
5825 1.1.1.1.4.2 yamt [(set (match_operand:DI 3 "register_operand" "")
5826 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 0 "address_operand" "")
5827 1.1.1.1.4.2 yamt (const_int -8))))
5828 1.1.1.1.4.2 yamt (set (match_operand:DI 2 "register_operand" "")
5829 1.1.1.1.4.2 yamt (match_dup 0))
5830 1.1.1.1.4.2 yamt (set (match_dup 3)
5831 1.1.1.1.4.2 yamt (and:DI (not:DI (ashift:DI (const_int 255)
5832 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
5833 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3)))))
5834 1.1.1.1.4.2 yamt (match_dup 3)))
5835 1.1.1.1.4.2 yamt (set (match_operand:DI 4 "register_operand" "")
5836 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" ""))
5837 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
5838 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3)))))
5839 1.1.1.1.4.2 yamt (set (match_dup 4) (ior:DI (match_dup 4) (match_dup 3)))
5840 1.1.1.1.4.2 yamt (set (mem:DI (and:DI (match_dup 0) (const_int -8)))
5841 1.1.1.1.4.2 yamt (match_dup 4))]
5842 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
5843 1.1.1.1.4.2 yamt "")
5844 1.1.1.1.4.2 yamt
5845 1.1.1.1.4.2 yamt (define_expand "unaligned_storehi"
5846 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "address_operand" ""))
5847 1.1.1.1.4.2 yamt (use (match_operand:HI 1 "register_operand" ""))
5848 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "register_operand" ""))
5849 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "register_operand" ""))
5850 1.1.1.1.4.2 yamt (use (match_operand:DI 4 "register_operand" ""))]
5851 1.1.1.1.4.2 yamt ""
5852 1.1.1.1.4.2 yamt {
5853 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
5854 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_storehi_be (operands[0], operands[1],
5855 1.1.1.1.4.2 yamt operands[2], operands[3],
5856 1.1.1.1.4.2 yamt operands[4]));
5857 1.1.1.1.4.2 yamt else
5858 1.1.1.1.4.2 yamt emit_insn (gen_unaligned_storehi_le (operands[0], operands[1],
5859 1.1.1.1.4.2 yamt operands[2], operands[3],
5860 1.1.1.1.4.2 yamt operands[4]));
5861 1.1.1.1.4.2 yamt DONE;
5862 1.1.1.1.4.2 yamt })
5863 1.1.1.1.4.2 yamt
5864 1.1.1.1.4.2 yamt (define_expand "unaligned_storehi_le"
5865 1.1.1.1.4.2 yamt [(set (match_operand:DI 3 "register_operand" "")
5866 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 0 "address_operand" "")
5867 1.1.1.1.4.2 yamt (const_int -8))))
5868 1.1.1.1.4.2 yamt (set (match_operand:DI 2 "register_operand" "")
5869 1.1.1.1.4.2 yamt (match_dup 0))
5870 1.1.1.1.4.2 yamt (set (match_dup 3)
5871 1.1.1.1.4.2 yamt (and:DI (not:DI (ashift:DI (const_int 65535)
5872 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3))))
5873 1.1.1.1.4.2 yamt (match_dup 3)))
5874 1.1.1.1.4.2 yamt (set (match_operand:DI 4 "register_operand" "")
5875 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" ""))
5876 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3))))
5877 1.1.1.1.4.2 yamt (set (match_dup 4) (ior:DI (match_dup 4) (match_dup 3)))
5878 1.1.1.1.4.2 yamt (set (mem:DI (and:DI (match_dup 0) (const_int -8)))
5879 1.1.1.1.4.2 yamt (match_dup 4))]
5880 1.1.1.1.4.2 yamt "! WORDS_BIG_ENDIAN"
5881 1.1.1.1.4.2 yamt "")
5882 1.1.1.1.4.2 yamt
5883 1.1.1.1.4.2 yamt (define_expand "unaligned_storehi_be"
5884 1.1.1.1.4.2 yamt [(set (match_operand:DI 3 "register_operand" "")
5885 1.1.1.1.4.2 yamt (mem:DI (and:DI (match_operand:DI 0 "address_operand" "")
5886 1.1.1.1.4.2 yamt (const_int -8))))
5887 1.1.1.1.4.2 yamt (set (match_operand:DI 2 "register_operand" "")
5888 1.1.1.1.4.2 yamt (plus:DI (match_dup 5) (const_int 1)))
5889 1.1.1.1.4.2 yamt (set (match_dup 3)
5890 1.1.1.1.4.2 yamt (and:DI (not:DI (ashift:DI
5891 1.1.1.1.4.2 yamt (const_int 65535)
5892 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
5893 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3)))))
5894 1.1.1.1.4.2 yamt (match_dup 3)))
5895 1.1.1.1.4.2 yamt (set (match_operand:DI 4 "register_operand" "")
5896 1.1.1.1.4.2 yamt (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" ""))
5897 1.1.1.1.4.2 yamt (minus:DI (const_int 56)
5898 1.1.1.1.4.2 yamt (ashift:DI (match_dup 2) (const_int 3)))))
5899 1.1.1.1.4.2 yamt (set (match_dup 4) (ior:DI (match_dup 4) (match_dup 3)))
5900 1.1.1.1.4.2 yamt (set (mem:DI (and:DI (match_dup 0) (const_int -8)))
5901 1.1.1.1.4.2 yamt (match_dup 4))]
5902 1.1.1.1.4.2 yamt "WORDS_BIG_ENDIAN"
5903 1.1.1.1.4.2 yamt "operands[5] = force_reg (DImode, operands[0]);")
5904 1.1.1.1.4.2 yamt
5906 1.1.1.1.4.2 yamt ;; Here are the define_expand's for QI and HI moves that use the above
5907 1.1.1.1.4.2 yamt ;; patterns. We have the normal sets, plus the ones that need scratch
5908 1.1.1.1.4.2 yamt ;; registers for reload.
5909 1.1.1.1.4.2 yamt
5910 1.1.1.1.4.2 yamt (define_expand "movqi"
5911 1.1.1.1.4.2 yamt [(set (match_operand:QI 0 "nonimmediate_operand" "")
5912 1.1.1.1.4.2 yamt (match_operand:QI 1 "general_operand" ""))]
5913 1.1.1.1.4.2 yamt ""
5914 1.1.1.1.4.2 yamt {
5915 1.1.1.1.4.2 yamt if (TARGET_BWX
5916 1.1.1.1.4.2 yamt ? alpha_expand_mov (QImode, operands)
5917 1.1.1.1.4.2 yamt : alpha_expand_mov_nobwx (QImode, operands))
5918 1.1.1.1.4.2 yamt DONE;
5919 1.1.1.1.4.2 yamt })
5920 1.1.1.1.4.2 yamt
5921 1.1.1.1.4.2 yamt (define_expand "movhi"
5922 1.1.1.1.4.2 yamt [(set (match_operand:HI 0 "nonimmediate_operand" "")
5923 1.1.1.1.4.2 yamt (match_operand:HI 1 "general_operand" ""))]
5924 1.1.1.1.4.2 yamt ""
5925 1.1.1.1.4.2 yamt {
5926 1.1.1.1.4.2 yamt if (TARGET_BWX
5927 1.1.1.1.4.2 yamt ? alpha_expand_mov (HImode, operands)
5928 1.1.1.1.4.2 yamt : alpha_expand_mov_nobwx (HImode, operands))
5929 1.1.1.1.4.2 yamt DONE;
5930 1.1.1.1.4.2 yamt })
5931 1.1.1.1.4.2 yamt
5932 1.1.1.1.4.2 yamt ;; We need to hook into the extra support that we have for HImode
5933 1.1.1.1.4.2 yamt ;; reloads when BWX insns are not available.
5934 1.1.1.1.4.2 yamt (define_expand "movcqi"
5935 1.1.1.1.4.2 yamt [(set (match_operand:CQI 0 "nonimmediate_operand" "")
5936 1.1.1.1.4.2 yamt (match_operand:CQI 1 "general_operand" ""))]
5937 1.1.1.1.4.2 yamt "!TARGET_BWX"
5938 1.1.1.1.4.2 yamt {
5939 1.1.1.1.4.2 yamt if (GET_CODE (operands[0]) == CONCAT || GET_CODE (operands[1]) == CONCAT)
5940 1.1.1.1.4.2 yamt ;
5941 1.1.1.1.4.2 yamt else if (!any_memory_operand (operands[0], CQImode))
5942 1.1.1.1.4.2 yamt {
5943 1.1.1.1.4.2 yamt if (!any_memory_operand (operands[1], CQImode))
5944 1.1.1.1.4.2 yamt {
5945 1.1.1.1.4.2 yamt emit_move_insn (gen_lowpart (HImode, operands[0]),
5946 1.1.1.1.4.2 yamt gen_lowpart (HImode, operands[1]));
5947 1.1.1.1.4.2 yamt DONE;
5948 1.1.1.1.4.2 yamt }
5949 1.1.1.1.4.2 yamt if (aligned_memory_operand (operands[1], CQImode))
5950 1.1.1.1.4.2 yamt {
5951 1.1.1.1.4.2 yamt bool done;
5952 1.1.1.1.4.2 yamt do_aligned1:
5953 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (HImode, operands[1]);
5954 1.1.1.1.4.2 yamt do_aligned2:
5955 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (HImode, operands[0]);
5956 1.1.1.1.4.2 yamt done = alpha_expand_mov_nobwx (HImode, operands);
5957 1.1.1.1.4.2 yamt gcc_assert (done);
5958 1.1.1.1.4.2 yamt DONE;
5959 1.1.1.1.4.2 yamt }
5960 1.1.1.1.4.2 yamt }
5961 1.1.1.1.4.2 yamt else if (aligned_memory_operand (operands[0], CQImode))
5962 1.1.1.1.4.2 yamt {
5963 1.1.1.1.4.2 yamt if (MEM_P (operands[1]))
5964 1.1.1.1.4.2 yamt {
5965 1.1.1.1.4.2 yamt rtx x = gen_reg_rtx (HImode);
5966 1.1.1.1.4.2 yamt emit_move_insn (gen_lowpart (CQImode, x), operands[1]);
5967 1.1.1.1.4.2 yamt operands[1] = x;
5968 1.1.1.1.4.2 yamt goto do_aligned2;
5969 1.1.1.1.4.2 yamt }
5970 1.1.1.1.4.2 yamt goto do_aligned1;
5971 1.1.1.1.4.2 yamt }
5972 1.1.1.1.4.2 yamt
5973 1.1.1.1.4.2 yamt gcc_assert (!reload_in_progress);
5974 1.1.1.1.4.2 yamt emit_move_complex_parts (operands[0], operands[1]);
5975 1.1.1.1.4.2 yamt DONE;
5976 1.1.1.1.4.2 yamt })
5977 1.1.1.1.4.2 yamt
5978 1.1.1.1.4.2 yamt ;; Here are the versions for reload.
5979 1.1.1.1.4.2 yamt ;;
5980 1.1.1.1.4.2 yamt ;; The aligned input case is recognized early in alpha_secondary_reload
5981 1.1.1.1.4.2 yamt ;; in order to avoid allocating an unnecessary scratch register.
5982 1.1.1.1.4.2 yamt ;;
5983 1.1.1.1.4.2 yamt ;; Note that in the unaligned cases we know that the operand must not be
5984 1.1.1.1.4.2 yamt ;; a pseudo-register because stack slots are always aligned references.
5985 1.1.1.1.4.2 yamt
5986 1.1.1.1.4.2 yamt (define_expand "reload_in<mode>"
5987 1.1.1.1.4.2 yamt [(parallel [(match_operand:RELOAD12 0 "register_operand" "=r")
5988 1.1.1.1.4.2 yamt (match_operand:RELOAD12 1 "any_memory_operand" "m")
5989 1.1.1.1.4.2 yamt (match_operand:TI 2 "register_operand" "=&r")])]
5990 1.1.1.1.4.2 yamt "!TARGET_BWX"
5991 1.1.1.1.4.2 yamt {
5992 1.1.1.1.4.2 yamt rtx scratch, seq, addr;
5993 1.1.1.1.4.2 yamt unsigned regno = REGNO (operands[2]);
5994 1.1.1.1.4.2 yamt
5995 1.1.1.1.4.2 yamt /* It is possible that one of the registers we got for operands[2]
5996 1.1.1.1.4.2 yamt might coincide with that of operands[0] (which is why we made
5997 1.1.1.1.4.2 yamt it TImode). Pick the other one to use as our scratch. */
5998 1.1.1.1.4.2 yamt if (regno == REGNO (operands[0]))
5999 1.1.1.1.4.2 yamt regno++;
6000 1.1.1.1.4.2 yamt scratch = gen_rtx_REG (DImode, regno);
6001 1.1.1.1.4.2 yamt
6002 1.1.1.1.4.2 yamt addr = get_unaligned_address (operands[1]);
6003 1.1.1.1.4.2 yamt operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
6004 1.1.1.1.4.2 yamt seq = gen_unaligned_load<reloadmode> (operands[0], addr,
6005 1.1.1.1.4.2 yamt scratch, operands[0]);
6006 1.1.1.1.4.2 yamt alpha_set_memflags (seq, operands[1]);
6007 1.1.1.1.4.2 yamt
6008 1.1.1.1.4.2 yamt emit_insn (seq);
6009 1.1.1.1.4.2 yamt DONE;
6010 1.1.1.1.4.2 yamt })
6011 1.1.1.1.4.2 yamt
6012 1.1.1.1.4.2 yamt (define_expand "reload_out<mode>"
6013 1.1.1.1.4.2 yamt [(parallel [(match_operand:RELOAD12 0 "any_memory_operand" "=m")
6014 1.1.1.1.4.2 yamt (match_operand:RELOAD12 1 "register_operand" "r")
6015 1.1.1.1.4.2 yamt (match_operand:TI 2 "register_operand" "=&r")])]
6016 1.1.1.1.4.2 yamt "! TARGET_BWX"
6017 1.1.1.1.4.2 yamt {
6018 1.1.1.1.4.2 yamt unsigned regno = REGNO (operands[2]);
6019 1.1.1.1.4.2 yamt
6020 1.1.1.1.4.2 yamt if (<MODE>mode == CQImode)
6021 1.1.1.1.4.2 yamt {
6022 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (HImode, operands[0]);
6023 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (HImode, operands[1]);
6024 1.1.1.1.4.2 yamt }
6025 1.1.1.1.4.2 yamt
6026 1.1.1.1.4.2 yamt if (aligned_memory_operand (operands[0], <MODE>mode))
6027 1.1.1.1.4.2 yamt {
6028 1.1.1.1.4.2 yamt emit_insn (gen_reload_out<reloadmode>_aligned
6029 1.1.1.1.4.2 yamt (operands[0], operands[1],
6030 1.1.1.1.4.2 yamt gen_rtx_REG (SImode, regno),
6031 1.1.1.1.4.2 yamt gen_rtx_REG (SImode, regno + 1)));
6032 1.1.1.1.4.2 yamt }
6033 1.1.1.1.4.2 yamt else
6034 1.1.1.1.4.2 yamt {
6035 1.1.1.1.4.2 yamt rtx addr = get_unaligned_address (operands[0]);
6036 1.1.1.1.4.2 yamt rtx scratch1 = gen_rtx_REG (DImode, regno);
6037 1.1.1.1.4.2 yamt rtx scratch2 = gen_rtx_REG (DImode, regno + 1);
6038 1.1.1.1.4.2 yamt rtx scratch3 = scratch1;
6039 1.1.1.1.4.2 yamt rtx seq;
6040 1.1.1.1.4.2 yamt
6041 1.1.1.1.4.2 yamt if (REG_P (addr))
6042 1.1.1.1.4.2 yamt scratch1 = addr;
6043 1.1.1.1.4.2 yamt
6044 1.1.1.1.4.2 yamt seq = gen_unaligned_store<reloadmode> (addr, operands[1], scratch1,
6045 1.1.1.1.4.2 yamt scratch2, scratch3);
6046 1.1.1.1.4.2 yamt alpha_set_memflags (seq, operands[0]);
6047 1.1.1.1.4.2 yamt emit_insn (seq);
6048 1.1.1.1.4.2 yamt }
6049 1.1.1.1.4.2 yamt DONE;
6050 1.1.1.1.4.2 yamt })
6051 1.1.1.1.4.2 yamt
6052 1.1.1.1.4.2 yamt ;; Helpers for the above. The way reload is structured, we can't
6053 1.1.1.1.4.2 yamt ;; always get a proper address for a stack slot during reload_foo
6054 1.1.1.1.4.2 yamt ;; expansion, so we must delay our address manipulations until after.
6055 1.1.1.1.4.2 yamt
6056 1.1.1.1.4.2 yamt (define_insn_and_split "reload_in<mode>_aligned"
6057 1.1.1.1.4.2 yamt [(set (match_operand:I12MODE 0 "register_operand" "=r")
6058 1.1.1.1.4.2 yamt (match_operand:I12MODE 1 "memory_operand" "m"))]
6059 1.1.1.1.4.2 yamt "!TARGET_BWX && (reload_in_progress || reload_completed)"
6060 1.1.1.1.4.2 yamt "#"
6061 1.1.1.1.4.2 yamt "!TARGET_BWX && reload_completed"
6062 1.1.1.1.4.2 yamt [(const_int 0)]
6063 1.1.1.1.4.2 yamt {
6064 1.1.1.1.4.2 yamt rtx aligned_mem, bitnum;
6065 1.1.1.1.4.2 yamt get_aligned_mem (operands[1], &aligned_mem, &bitnum);
6066 1.1.1.1.4.2 yamt emit_insn (gen_aligned_load<reloadmode>
6067 1.1.1.1.4.2 yamt (gen_lowpart (DImode, operands[0]), aligned_mem, bitnum,
6068 1.1.1.1.4.2 yamt gen_rtx_REG (SImode, REGNO (operands[0]))));
6069 1.1.1.1.4.2 yamt DONE;
6070 1.1.1.1.4.2 yamt })
6071 1.1.1.1.4.2 yamt
6072 1.1.1.1.4.2 yamt (define_insn_and_split "reload_out<mode>_aligned"
6073 1.1.1.1.4.2 yamt [(set (match_operand:I12MODE 0 "memory_operand" "=m")
6074 1.1.1.1.4.2 yamt (match_operand:I12MODE 1 "register_operand" "r"))
6075 1.1.1.1.4.2 yamt (clobber (match_operand:SI 2 "register_operand" "=r"))
6076 1.1.1.1.4.2 yamt (clobber (match_operand:SI 3 "register_operand" "=r"))]
6077 1.1.1.1.4.2 yamt "!TARGET_BWX && (reload_in_progress || reload_completed)"
6078 1.1.1.1.4.2 yamt "#"
6079 1.1.1.1.4.2 yamt "!TARGET_BWX && reload_completed"
6080 1.1.1.1.4.2 yamt [(const_int 0)]
6081 1.1.1.1.4.2 yamt {
6082 1.1.1.1.4.2 yamt rtx aligned_mem, bitnum;
6083 1.1.1.1.4.2 yamt get_aligned_mem (operands[0], &aligned_mem, &bitnum);
6084 1.1.1.1.4.2 yamt emit_insn (gen_aligned_store (aligned_mem, operands[1], bitnum,
6085 1.1.1.1.4.2 yamt operands[2], operands[3]));
6086 1.1.1.1.4.2 yamt DONE;
6087 1.1.1.1.4.2 yamt })
6088 1.1.1.1.4.2 yamt
6090 1.1.1.1.4.2 yamt ;; Vector operations
6091 1.1.1.1.4.2 yamt
6092 1.1.1.1.4.2 yamt (define_mode_iterator VEC [V8QI V4HI V2SI])
6093 1.1.1.1.4.2 yamt
6094 1.1.1.1.4.2 yamt (define_expand "mov<mode>"
6095 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "nonimmediate_operand" "")
6096 1.1.1.1.4.2 yamt (match_operand:VEC 1 "general_operand" ""))]
6097 1.1.1.1.4.2 yamt ""
6098 1.1.1.1.4.2 yamt {
6099 1.1.1.1.4.2 yamt if (alpha_expand_mov (<MODE>mode, operands))
6100 1.1.1.1.4.2 yamt DONE;
6101 1.1.1.1.4.2 yamt })
6102 1.1.1.1.4.2 yamt
6103 1.1.1.1.4.2 yamt (define_split
6104 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "")
6105 1.1.1.1.4.2 yamt (match_operand:VEC 1 "non_zero_const_operand" ""))]
6106 1.1.1.1.4.2 yamt ""
6107 1.1.1.1.4.2 yamt [(const_int 0)]
6108 1.1.1.1.4.2 yamt {
6109 1.1.1.1.4.2 yamt if (alpha_split_const_mov (<MODE>mode, operands))
6110 1.1.1.1.4.2 yamt DONE;
6111 1.1.1.1.4.2 yamt else
6112 1.1.1.1.4.2 yamt FAIL;
6113 1.1.1.1.4.2 yamt })
6114 1.1.1.1.4.2 yamt
6115 1.1.1.1.4.2 yamt
6116 1.1.1.1.4.2 yamt (define_expand "movmisalign<mode>"
6117 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "nonimmediate_operand" "")
6118 1.1.1.1.4.2 yamt (match_operand:VEC 1 "general_operand" ""))]
6119 1.1.1.1.4.2 yamt ""
6120 1.1.1.1.4.2 yamt {
6121 1.1.1.1.4.2 yamt alpha_expand_movmisalign (<MODE>mode, operands);
6122 1.1.1.1.4.2 yamt DONE;
6123 1.1.1.1.4.2 yamt })
6124 1.1.1.1.4.2 yamt
6125 1.1.1.1.4.2 yamt (define_insn "*mov<mode>_fix"
6126 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "nonimmediate_operand" "=r,r,r,m,*f,*f,m,r,*f")
6127 1.1.1.1.4.2 yamt (match_operand:VEC 1 "input_operand" "rW,i,m,rW,*fW,m,*f,*f,r"))]
6128 1.1.1.1.4.2 yamt "TARGET_FIX
6129 1.1.1.1.4.2 yamt && (register_operand (operands[0], <MODE>mode)
6130 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], <MODE>mode))"
6131 1.1.1.1.4.2 yamt "@
6132 1.1.1.1.4.2 yamt bis $31,%r1,%0
6133 1.1.1.1.4.2 yamt #
6134 1.1.1.1.4.2 yamt ldq %0,%1
6135 1.1.1.1.4.2 yamt stq %r1,%0
6136 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
6137 1.1.1.1.4.2 yamt ldt %0,%1
6138 1.1.1.1.4.2 yamt stt %R1,%0
6139 1.1.1.1.4.2 yamt ftoit %1,%0
6140 1.1.1.1.4.2 yamt itoft %1,%0"
6141 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,multi,ild,ist,fcpys,fld,fst,ftoi,itof")])
6142 1.1.1.1.4.2 yamt
6143 1.1.1.1.4.2 yamt (define_insn "*mov<mode>_nofix"
6144 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "nonimmediate_operand" "=r,r,r,m,*f,*f,m")
6145 1.1.1.1.4.2 yamt (match_operand:VEC 1 "input_operand" "rW,i,m,rW,*fW,m,*f"))]
6146 1.1.1.1.4.2 yamt "! TARGET_FIX
6147 1.1.1.1.4.2 yamt && (register_operand (operands[0], <MODE>mode)
6148 1.1.1.1.4.2 yamt || reg_or_0_operand (operands[1], <MODE>mode))"
6149 1.1.1.1.4.2 yamt "@
6150 1.1.1.1.4.2 yamt bis $31,%r1,%0
6151 1.1.1.1.4.2 yamt #
6152 1.1.1.1.4.2 yamt ldq %0,%1
6153 1.1.1.1.4.2 yamt stq %r1,%0
6154 1.1.1.1.4.2 yamt cpys %R1,%R1,%0
6155 1.1.1.1.4.2 yamt ldt %0,%1
6156 1.1.1.1.4.2 yamt stt %R1,%0"
6157 1.1.1.1.4.2 yamt [(set_attr "type" "ilog,multi,ild,ist,fcpys,fld,fst")])
6158 1.1.1.1.4.2 yamt
6159 1.1.1.1.4.2 yamt (define_insn "uminv8qi3"
6160 1.1.1.1.4.2 yamt [(set (match_operand:V8QI 0 "register_operand" "=r")
6161 1.1.1.1.4.2 yamt (umin:V8QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
6162 1.1.1.1.4.2 yamt (match_operand:V8QI 2 "reg_or_0_operand" "rW")))]
6163 1.1.1.1.4.2 yamt "TARGET_MAX"
6164 1.1.1.1.4.2 yamt "minub8 %r1,%r2,%0"
6165 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6166 1.1.1.1.4.2 yamt
6167 1.1.1.1.4.2 yamt (define_insn "sminv8qi3"
6168 1.1.1.1.4.2 yamt [(set (match_operand:V8QI 0 "register_operand" "=r")
6169 1.1.1.1.4.2 yamt (smin:V8QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
6170 1.1.1.1.4.2 yamt (match_operand:V8QI 2 "reg_or_0_operand" "rW")))]
6171 1.1.1.1.4.2 yamt "TARGET_MAX"
6172 1.1.1.1.4.2 yamt "minsb8 %r1,%r2,%0"
6173 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6174 1.1.1.1.4.2 yamt
6175 1.1.1.1.4.2 yamt (define_insn "uminv4hi3"
6176 1.1.1.1.4.2 yamt [(set (match_operand:V4HI 0 "register_operand" "=r")
6177 1.1.1.1.4.2 yamt (umin:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rW")
6178 1.1.1.1.4.2 yamt (match_operand:V4HI 2 "reg_or_0_operand" "rW")))]
6179 1.1.1.1.4.2 yamt "TARGET_MAX"
6180 1.1.1.1.4.2 yamt "minuw4 %r1,%r2,%0"
6181 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6182 1.1.1.1.4.2 yamt
6183 1.1.1.1.4.2 yamt (define_insn "sminv4hi3"
6184 1.1.1.1.4.2 yamt [(set (match_operand:V4HI 0 "register_operand" "=r")
6185 1.1.1.1.4.2 yamt (smin:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rW")
6186 1.1.1.1.4.2 yamt (match_operand:V4HI 2 "reg_or_0_operand" "rW")))]
6187 1.1.1.1.4.2 yamt "TARGET_MAX"
6188 1.1.1.1.4.2 yamt "minsw4 %r1,%r2,%0"
6189 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6190 1.1.1.1.4.2 yamt
6191 1.1.1.1.4.2 yamt (define_insn "umaxv8qi3"
6192 1.1.1.1.4.2 yamt [(set (match_operand:V8QI 0 "register_operand" "=r")
6193 1.1.1.1.4.2 yamt (umax:V8QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
6194 1.1.1.1.4.2 yamt (match_operand:V8QI 2 "reg_or_0_operand" "rW")))]
6195 1.1.1.1.4.2 yamt "TARGET_MAX"
6196 1.1.1.1.4.2 yamt "maxub8 %r1,%r2,%0"
6197 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6198 1.1.1.1.4.2 yamt
6199 1.1.1.1.4.2 yamt (define_insn "smaxv8qi3"
6200 1.1.1.1.4.2 yamt [(set (match_operand:V8QI 0 "register_operand" "=r")
6201 1.1.1.1.4.2 yamt (smax:V8QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
6202 1.1.1.1.4.2 yamt (match_operand:V8QI 2 "reg_or_0_operand" "rW")))]
6203 1.1.1.1.4.2 yamt "TARGET_MAX"
6204 1.1.1.1.4.2 yamt "maxsb8 %r1,%r2,%0"
6205 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6206 1.1.1.1.4.2 yamt
6207 1.1.1.1.4.2 yamt (define_insn "umaxv4hi3"
6208 1.1.1.1.4.2 yamt [(set (match_operand:V4HI 0 "register_operand" "=r")
6209 1.1.1.1.4.2 yamt (umax:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rW")
6210 1.1.1.1.4.2 yamt (match_operand:V4HI 2 "reg_or_0_operand" "rW")))]
6211 1.1.1.1.4.2 yamt "TARGET_MAX"
6212 1.1.1.1.4.2 yamt "maxuw4 %r1,%r2,%0"
6213 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6214 1.1.1.1.4.2 yamt
6215 1.1.1.1.4.2 yamt (define_insn "smaxv4hi3"
6216 1.1.1.1.4.2 yamt [(set (match_operand:V4HI 0 "register_operand" "=r")
6217 1.1.1.1.4.2 yamt (smax:V4HI (match_operand:V4HI 1 "reg_or_0_operand" "rW")
6218 1.1.1.1.4.2 yamt (match_operand:V4HI 2 "reg_or_0_operand" "rW")))]
6219 1.1.1.1.4.2 yamt "TARGET_MAX"
6220 1.1.1.1.4.2 yamt "maxsw4 %r1,%r2,%0"
6221 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
6222 1.1.1.1.4.2 yamt
6223 1.1.1.1.4.2 yamt (define_insn "one_cmpl<mode>2"
6224 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6225 1.1.1.1.4.2 yamt (not:VEC (match_operand:VEC 1 "register_operand" "r")))]
6226 1.1.1.1.4.2 yamt ""
6227 1.1.1.1.4.2 yamt "ornot $31,%1,%0"
6228 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6229 1.1.1.1.4.2 yamt
6230 1.1.1.1.4.2 yamt (define_insn "and<mode>3"
6231 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6232 1.1.1.1.4.2 yamt (and:VEC (match_operand:VEC 1 "register_operand" "r")
6233 1.1.1.1.4.2 yamt (match_operand:VEC 2 "register_operand" "r")))]
6234 1.1.1.1.4.2 yamt ""
6235 1.1.1.1.4.2 yamt "and %1,%2,%0"
6236 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6237 1.1.1.1.4.2 yamt
6238 1.1.1.1.4.2 yamt (define_insn "*andnot<mode>3"
6239 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6240 1.1.1.1.4.2 yamt (and:VEC (not:VEC (match_operand:VEC 1 "register_operand" "r"))
6241 1.1.1.1.4.2 yamt (match_operand:VEC 2 "register_operand" "r")))]
6242 1.1.1.1.4.2 yamt ""
6243 1.1.1.1.4.2 yamt "bic %2,%1,%0"
6244 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6245 1.1.1.1.4.2 yamt
6246 1.1.1.1.4.2 yamt (define_insn "ior<mode>3"
6247 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6248 1.1.1.1.4.2 yamt (ior:VEC (match_operand:VEC 1 "register_operand" "r")
6249 1.1.1.1.4.2 yamt (match_operand:VEC 2 "register_operand" "r")))]
6250 1.1.1.1.4.2 yamt ""
6251 1.1.1.1.4.2 yamt "bis %1,%2,%0"
6252 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6253 1.1.1.1.4.2 yamt
6254 1.1.1.1.4.2 yamt (define_insn "*iornot<mode>3"
6255 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6256 1.1.1.1.4.2 yamt (ior:VEC (not:DI (match_operand:VEC 1 "register_operand" "r"))
6257 1.1.1.1.4.2 yamt (match_operand:VEC 2 "register_operand" "r")))]
6258 1.1.1.1.4.2 yamt ""
6259 1.1.1.1.4.2 yamt "ornot %2,%1,%0"
6260 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6261 1.1.1.1.4.2 yamt
6262 1.1.1.1.4.2 yamt (define_insn "xor<mode>3"
6263 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6264 1.1.1.1.4.2 yamt (xor:VEC (match_operand:VEC 1 "register_operand" "r")
6265 1.1.1.1.4.2 yamt (match_operand:VEC 2 "register_operand" "r")))]
6266 1.1.1.1.4.2 yamt ""
6267 1.1.1.1.4.2 yamt "xor %1,%2,%0"
6268 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6269 1.1.1.1.4.2 yamt
6270 1.1.1.1.4.2 yamt (define_insn "*xornot<mode>3"
6271 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "=r")
6272 1.1.1.1.4.2 yamt (not:VEC (xor:VEC (match_operand:VEC 1 "register_operand" "r")
6273 1.1.1.1.4.2 yamt (match_operand:VEC 2 "register_operand" "r"))))]
6274 1.1.1.1.4.2 yamt ""
6275 1.1.1.1.4.2 yamt "eqv %1,%2,%0"
6276 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
6277 1.1.1.1.4.2 yamt
6278 1.1.1.1.4.2 yamt (define_expand "vec_shl_<mode>"
6279 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "")
6280 1.1.1.1.4.2 yamt (ashift:DI (match_operand:VEC 1 "register_operand" "")
6281 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_6bit_operand" "")))]
6282 1.1.1.1.4.2 yamt ""
6283 1.1.1.1.4.2 yamt {
6284 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
6285 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, operands[1]);
6286 1.1.1.1.4.2 yamt })
6287 1.1.1.1.4.2 yamt
6288 1.1.1.1.4.2 yamt (define_expand "vec_shr_<mode>"
6289 1.1.1.1.4.2 yamt [(set (match_operand:VEC 0 "register_operand" "")
6290 1.1.1.1.4.2 yamt (lshiftrt:DI (match_operand:VEC 1 "register_operand" "")
6291 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_6bit_operand" "")))]
6292 1.1.1.1.4.2 yamt ""
6293 1.1.1.1.4.2 yamt {
6294 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (DImode, operands[0]);
6295 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (DImode, operands[1]);
6296 1.1.1.1.4.2 yamt })
6297 1.1.1.1.4.2 yamt
6299 1.1.1.1.4.2 yamt ;; Bit field extract patterns which use ext[wlq][lh]
6300 1.1.1.1.4.2 yamt
6301 1.1.1.1.4.2 yamt (define_expand "extv"
6302 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
6303 1.1.1.1.4.2 yamt (sign_extract:DI (match_operand:QI 1 "memory_operand" "")
6304 1.1.1.1.4.2 yamt (match_operand:DI 2 "immediate_operand" "")
6305 1.1.1.1.4.2 yamt (match_operand:DI 3 "immediate_operand" "")))]
6306 1.1.1.1.4.2 yamt ""
6307 1.1.1.1.4.2 yamt {
6308 1.1.1.1.4.2 yamt int ofs;
6309 1.1.1.1.4.2 yamt
6310 1.1.1.1.4.2 yamt /* We can do 16, 32 and 64 bit fields, if aligned on byte boundaries. */
6311 1.1.1.1.4.2 yamt if (INTVAL (operands[3]) % 8 != 0
6312 1.1.1.1.4.2 yamt || (INTVAL (operands[2]) != 16
6313 1.1.1.1.4.2 yamt && INTVAL (operands[2]) != 32
6314 1.1.1.1.4.2 yamt && INTVAL (operands[2]) != 64))
6315 1.1.1.1.4.2 yamt FAIL;
6316 1.1.1.1.4.2 yamt
6317 1.1.1.1.4.2 yamt /* From mips.md: extract_bit_field doesn't verify that our source
6318 1.1.1.1.4.2 yamt matches the predicate, so we force it to be a MEM here. */
6319 1.1.1.1.4.2 yamt if (!MEM_P (operands[1]))
6320 1.1.1.1.4.2 yamt FAIL;
6321 1.1.1.1.4.2 yamt
6322 1.1.1.1.4.2 yamt /* The bit number is relative to the mode of operand 1 which is
6323 1.1.1.1.4.2 yamt usually QImode (this might actually be a bug in expmed.c). Note
6324 1.1.1.1.4.2 yamt that the bit number is negative in big-endian mode in this case.
6325 1.1.1.1.4.2 yamt We have to convert that to the offset. */
6326 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
6327 1.1.1.1.4.2 yamt ofs = GET_MODE_BITSIZE (GET_MODE (operands[1]))
6328 1.1.1.1.4.2 yamt - INTVAL (operands[2]) - INTVAL (operands[3]);
6329 1.1.1.1.4.2 yamt else
6330 1.1.1.1.4.2 yamt ofs = INTVAL (operands[3]);
6331 1.1.1.1.4.2 yamt
6332 1.1.1.1.4.2 yamt ofs = ofs / 8;
6333 1.1.1.1.4.2 yamt
6334 1.1.1.1.4.2 yamt alpha_expand_unaligned_load (operands[0], operands[1],
6335 1.1.1.1.4.2 yamt INTVAL (operands[2]) / 8,
6336 1.1.1.1.4.2 yamt ofs, 1);
6337 1.1.1.1.4.2 yamt DONE;
6338 1.1.1.1.4.2 yamt })
6339 1.1.1.1.4.2 yamt
6340 1.1.1.1.4.2 yamt (define_expand "extzv"
6341 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
6342 1.1.1.1.4.2 yamt (zero_extract:DI (match_operand:DI 1 "nonimmediate_operand" "")
6343 1.1.1.1.4.2 yamt (match_operand:DI 2 "immediate_operand" "")
6344 1.1.1.1.4.2 yamt (match_operand:DI 3 "immediate_operand" "")))]
6345 1.1.1.1.4.2 yamt ""
6346 1.1.1.1.4.2 yamt {
6347 1.1.1.1.4.2 yamt /* We can do 8, 16, 32 and 64 bit fields, if aligned on byte boundaries. */
6348 1.1.1.1.4.2 yamt if (INTVAL (operands[3]) % 8 != 0
6349 1.1.1.1.4.2 yamt || (INTVAL (operands[2]) != 8
6350 1.1.1.1.4.2 yamt && INTVAL (operands[2]) != 16
6351 1.1.1.1.4.2 yamt && INTVAL (operands[2]) != 32
6352 1.1.1.1.4.2 yamt && INTVAL (operands[2]) != 64))
6353 1.1.1.1.4.2 yamt FAIL;
6354 1.1.1.1.4.2 yamt
6355 1.1.1.1.4.2 yamt if (MEM_P (operands[1]))
6356 1.1.1.1.4.2 yamt {
6357 1.1.1.1.4.2 yamt int ofs;
6358 1.1.1.1.4.2 yamt
6359 1.1.1.1.4.2 yamt /* Fail 8-bit fields, falling back on a simple byte load. */
6360 1.1.1.1.4.2 yamt if (INTVAL (operands[2]) == 8)
6361 1.1.1.1.4.2 yamt FAIL;
6362 1.1.1.1.4.2 yamt
6363 1.1.1.1.4.2 yamt /* The bit number is relative to the mode of operand 1 which is
6364 1.1.1.1.4.2 yamt usually QImode (this might actually be a bug in expmed.c). Note
6365 1.1.1.1.4.2 yamt that the bit number is negative in big-endian mode in this case.
6366 1.1.1.1.4.2 yamt We have to convert that to the offset. */
6367 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
6368 1.1.1.1.4.2 yamt ofs = GET_MODE_BITSIZE (GET_MODE (operands[1]))
6369 1.1.1.1.4.2 yamt - INTVAL (operands[2]) - INTVAL (operands[3]);
6370 1.1.1.1.4.2 yamt else
6371 1.1.1.1.4.2 yamt ofs = INTVAL (operands[3]);
6372 1.1.1.1.4.2 yamt
6373 1.1.1.1.4.2 yamt ofs = ofs / 8;
6374 1.1.1.1.4.2 yamt
6375 1.1.1.1.4.2 yamt alpha_expand_unaligned_load (operands[0], operands[1],
6376 1.1.1.1.4.2 yamt INTVAL (operands[2]) / 8,
6377 1.1.1.1.4.2 yamt ofs, 0);
6378 1.1.1.1.4.2 yamt DONE;
6379 1.1.1.1.4.2 yamt }
6380 1.1.1.1.4.2 yamt })
6381 1.1.1.1.4.2 yamt
6382 1.1.1.1.4.2 yamt (define_expand "insv"
6383 1.1.1.1.4.2 yamt [(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "")
6384 1.1.1.1.4.2 yamt (match_operand:DI 1 "immediate_operand" "")
6385 1.1.1.1.4.2 yamt (match_operand:DI 2 "immediate_operand" ""))
6386 1.1.1.1.4.2 yamt (match_operand:DI 3 "register_operand" ""))]
6387 1.1.1.1.4.2 yamt ""
6388 1.1.1.1.4.2 yamt {
6389 1.1.1.1.4.2 yamt int ofs;
6390 1.1.1.1.4.2 yamt
6391 1.1.1.1.4.2 yamt /* We can do 16, 32 and 64 bit fields, if aligned on byte boundaries. */
6392 1.1.1.1.4.2 yamt if (INTVAL (operands[2]) % 8 != 0
6393 1.1.1.1.4.2 yamt || (INTVAL (operands[1]) != 16
6394 1.1.1.1.4.2 yamt && INTVAL (operands[1]) != 32
6395 1.1.1.1.4.2 yamt && INTVAL (operands[1]) != 64))
6396 1.1.1.1.4.2 yamt FAIL;
6397 1.1.1.1.4.2 yamt
6398 1.1.1.1.4.2 yamt /* From mips.md: store_bit_field doesn't verify that our source
6399 1.1.1.1.4.2 yamt matches the predicate, so we force it to be a MEM here. */
6400 1.1.1.1.4.2 yamt if (!MEM_P (operands[0]))
6401 1.1.1.1.4.2 yamt FAIL;
6402 1.1.1.1.4.2 yamt
6403 1.1.1.1.4.2 yamt /* The bit number is relative to the mode of operand 1 which is
6404 1.1.1.1.4.2 yamt usually QImode (this might actually be a bug in expmed.c). Note
6405 1.1.1.1.4.2 yamt that the bit number is negative in big-endian mode in this case.
6406 1.1.1.1.4.2 yamt We have to convert that to the offset. */
6407 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
6408 1.1.1.1.4.2 yamt ofs = GET_MODE_BITSIZE (GET_MODE (operands[0]))
6409 1.1.1.1.4.2 yamt - INTVAL (operands[1]) - INTVAL (operands[2]);
6410 1.1.1.1.4.2 yamt else
6411 1.1.1.1.4.2 yamt ofs = INTVAL (operands[2]);
6412 1.1.1.1.4.2 yamt
6413 1.1.1.1.4.2 yamt ofs = ofs / 8;
6414 1.1.1.1.4.2 yamt
6415 1.1.1.1.4.2 yamt alpha_expand_unaligned_store (operands[0], operands[3],
6416 1.1.1.1.4.2 yamt INTVAL (operands[1]) / 8, ofs);
6417 1.1.1.1.4.2 yamt DONE;
6418 1.1.1.1.4.2 yamt })
6419 1.1.1.1.4.2 yamt
6420 1.1.1.1.4.2 yamt ;; Block move/clear, see alpha.c for more details.
6421 1.1.1.1.4.2 yamt ;; Argument 0 is the destination
6422 1.1.1.1.4.2 yamt ;; Argument 1 is the source
6423 1.1.1.1.4.2 yamt ;; Argument 2 is the length
6424 1.1.1.1.4.2 yamt ;; Argument 3 is the alignment
6425 1.1.1.1.4.2 yamt
6426 1.1.1.1.4.2 yamt (define_expand "movmemqi"
6427 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
6428 1.1.1.1.4.2 yamt (match_operand:BLK 1 "memory_operand" ""))
6429 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "immediate_operand" ""))
6430 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "immediate_operand" ""))])]
6431 1.1.1.1.4.2 yamt ""
6432 1.1.1.1.4.2 yamt {
6433 1.1.1.1.4.2 yamt if (alpha_expand_block_move (operands))
6434 1.1.1.1.4.2 yamt DONE;
6435 1.1.1.1.4.2 yamt else
6436 1.1.1.1.4.2 yamt FAIL;
6437 1.1.1.1.4.2 yamt })
6438 1.1.1.1.4.2 yamt
6439 1.1.1.1.4.2 yamt (define_expand "movmemdi"
6440 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
6441 1.1.1.1.4.2 yamt (match_operand:BLK 1 "memory_operand" ""))
6442 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "immediate_operand" ""))
6443 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "immediate_operand" ""))
6444 1.1.1.1.4.2 yamt (use (match_dup 4))
6445 1.1.1.1.4.2 yamt (clobber (reg:DI 25))
6446 1.1.1.1.4.2 yamt (clobber (reg:DI 16))
6447 1.1.1.1.4.2 yamt (clobber (reg:DI 17))
6448 1.1.1.1.4.2 yamt (clobber (reg:DI 18))
6449 1.1.1.1.4.2 yamt (clobber (reg:DI 19))
6450 1.1.1.1.4.2 yamt (clobber (reg:DI 20))
6451 1.1.1.1.4.2 yamt (clobber (reg:DI 26))
6452 1.1.1.1.4.2 yamt (clobber (reg:DI 27))])]
6453 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
6454 1.1.1.1.4.2 yamt {
6455 1.1.1.1.4.2 yamt operands[4] = alpha_need_linkage ("OTS$MOVE", 0);
6456 1.1.1.1.4.2 yamt })
6457 1.1.1.1.4.2 yamt
6458 1.1.1.1.4.2 yamt (define_insn "*movmemdi_1"
6459 1.1.1.1.4.2 yamt [(set (match_operand:BLK 0 "memory_operand" "=m,=m")
6460 1.1.1.1.4.2 yamt (match_operand:BLK 1 "memory_operand" "m,m"))
6461 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "nonmemory_operand" "r,i"))
6462 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "immediate_operand" ""))
6463 1.1.1.1.4.2 yamt (use (match_operand:DI 4 "call_operand" "i,i"))
6464 1.1.1.1.4.2 yamt (clobber (reg:DI 25))
6465 1.1.1.1.4.2 yamt (clobber (reg:DI 16))
6466 1.1.1.1.4.2 yamt (clobber (reg:DI 17))
6467 1.1.1.1.4.2 yamt (clobber (reg:DI 18))
6468 1.1.1.1.4.2 yamt (clobber (reg:DI 19))
6469 1.1.1.1.4.2 yamt (clobber (reg:DI 20))
6470 1.1.1.1.4.2 yamt (clobber (reg:DI 26))
6471 1.1.1.1.4.2 yamt (clobber (reg:DI 27))]
6472 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
6473 1.1.1.1.4.2 yamt {
6474 1.1.1.1.4.2 yamt operands [5] = alpha_use_linkage (operands [4], cfun->decl, 0, 1);
6475 1.1.1.1.4.2 yamt switch (which_alternative)
6476 1.1.1.1.4.2 yamt {
6477 1.1.1.1.4.2 yamt case 0:
6478 1.1.1.1.4.2 yamt 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)";
6479 1.1.1.1.4.2 yamt case 1:
6480 1.1.1.1.4.2 yamt 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)";
6481 1.1.1.1.4.2 yamt default:
6482 1.1.1.1.4.2 yamt gcc_unreachable ();
6483 1.1.1.1.4.2 yamt }
6484 1.1.1.1.4.2 yamt }
6485 1.1.1.1.4.2 yamt [(set_attr "type" "multi")
6486 1.1.1.1.4.2 yamt (set_attr "length" "28")])
6487 1.1.1.1.4.2 yamt
6488 1.1.1.1.4.2 yamt (define_expand "setmemqi"
6489 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
6490 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" ""))
6491 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "immediate_operand" ""))
6492 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "immediate_operand" ""))])]
6493 1.1.1.1.4.2 yamt ""
6494 1.1.1.1.4.2 yamt {
6495 1.1.1.1.4.2 yamt /* If value to set is not zero, use the library routine. */
6496 1.1.1.1.4.2 yamt if (operands[2] != const0_rtx)
6497 1.1.1.1.4.2 yamt FAIL;
6498 1.1.1.1.4.2 yamt
6499 1.1.1.1.4.2 yamt if (alpha_expand_block_clear (operands))
6500 1.1.1.1.4.2 yamt DONE;
6501 1.1.1.1.4.2 yamt else
6502 1.1.1.1.4.2 yamt FAIL;
6503 1.1.1.1.4.2 yamt })
6504 1.1.1.1.4.2 yamt
6505 1.1.1.1.4.2 yamt (define_expand "setmemdi"
6506 1.1.1.1.4.2 yamt [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
6507 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" ""))
6508 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "immediate_operand" ""))
6509 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "immediate_operand" ""))
6510 1.1.1.1.4.2 yamt (use (match_dup 4))
6511 1.1.1.1.4.2 yamt (clobber (reg:DI 25))
6512 1.1.1.1.4.2 yamt (clobber (reg:DI 16))
6513 1.1.1.1.4.2 yamt (clobber (reg:DI 17))
6514 1.1.1.1.4.2 yamt (clobber (reg:DI 26))
6515 1.1.1.1.4.2 yamt (clobber (reg:DI 27))])]
6516 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
6517 1.1.1.1.4.2 yamt {
6518 1.1.1.1.4.2 yamt /* If value to set is not zero, use the library routine. */
6519 1.1.1.1.4.2 yamt if (operands[2] != const0_rtx)
6520 1.1.1.1.4.2 yamt FAIL;
6521 1.1.1.1.4.2 yamt
6522 1.1.1.1.4.2 yamt operands[4] = alpha_need_linkage ("OTS$ZERO", 0);
6523 1.1.1.1.4.2 yamt })
6524 1.1.1.1.4.2 yamt
6525 1.1.1.1.4.2 yamt (define_insn "*clrmemdi_1"
6526 1.1.1.1.4.2 yamt [(set (match_operand:BLK 0 "memory_operand" "=m,=m")
6527 1.1.1.1.4.2 yamt (const_int 0))
6528 1.1.1.1.4.2 yamt (use (match_operand:DI 1 "nonmemory_operand" "r,i"))
6529 1.1.1.1.4.2 yamt (use (match_operand:DI 2 "immediate_operand" ""))
6530 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "call_operand" "i,i"))
6531 1.1.1.1.4.2 yamt (clobber (reg:DI 25))
6532 1.1.1.1.4.2 yamt (clobber (reg:DI 16))
6533 1.1.1.1.4.2 yamt (clobber (reg:DI 17))
6534 1.1.1.1.4.2 yamt (clobber (reg:DI 26))
6535 1.1.1.1.4.2 yamt (clobber (reg:DI 27))]
6536 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
6537 1.1.1.1.4.2 yamt {
6538 1.1.1.1.4.2 yamt operands [4] = alpha_use_linkage (operands [3], cfun->decl, 0, 1);
6539 1.1.1.1.4.2 yamt switch (which_alternative)
6540 1.1.1.1.4.2 yamt {
6541 1.1.1.1.4.2 yamt case 0:
6542 1.1.1.1.4.2 yamt return "lda $16,%0\;bis $31,%1,$17\;ldq $26,%4\;lda $25,2($31)\;jsr $26,%3\;ldq $27,0($29)";
6543 1.1.1.1.4.2 yamt case 1:
6544 1.1.1.1.4.2 yamt return "lda $16,%0\;lda $17,%1($31)\;ldq $26,%4\;lda $25,2($31)\;jsr $26,%3\;ldq $27,0($29)";
6545 1.1.1.1.4.2 yamt default:
6546 1.1.1.1.4.2 yamt gcc_unreachable ();
6547 1.1.1.1.4.2 yamt }
6548 1.1.1.1.4.2 yamt }
6549 1.1.1.1.4.2 yamt [(set_attr "type" "multi")
6550 1.1.1.1.4.2 yamt (set_attr "length" "24")])
6551 1.1.1.1.4.2 yamt
6552 1.1.1.1.4.2 yamt
6554 1.1.1.1.4.2 yamt ;; Subroutine of stack space allocation. Perform a stack probe.
6555 1.1.1.1.4.2 yamt (define_expand "probe_stack"
6556 1.1.1.1.4.2 yamt [(set (match_dup 1) (match_operand:DI 0 "const_int_operand" ""))]
6557 1.1.1.1.4.2 yamt ""
6558 1.1.1.1.4.2 yamt {
6559 1.1.1.1.4.2 yamt operands[1] = gen_rtx_MEM (DImode, plus_constant (stack_pointer_rtx,
6560 1.1.1.1.4.2 yamt INTVAL (operands[0])));
6561 1.1.1.1.4.2 yamt MEM_VOLATILE_P (operands[1]) = 1;
6562 1.1.1.1.4.2 yamt
6563 1.1.1.1.4.2 yamt operands[0] = const0_rtx;
6564 1.1.1.1.4.2 yamt })
6565 1.1.1.1.4.2 yamt
6566 1.1.1.1.4.2 yamt ;; This is how we allocate stack space. If we are allocating a
6567 1.1.1.1.4.2 yamt ;; constant amount of space and we know it is less than 4096
6568 1.1.1.1.4.2 yamt ;; bytes, we need do nothing.
6569 1.1.1.1.4.2 yamt ;;
6570 1.1.1.1.4.2 yamt ;; If it is more than 4096 bytes, we need to probe the stack
6571 1.1.1.1.4.2 yamt ;; periodically.
6572 1.1.1.1.4.2 yamt (define_expand "allocate_stack"
6573 1.1.1.1.4.2 yamt [(set (reg:DI 30)
6574 1.1.1.1.4.2 yamt (plus:DI (reg:DI 30)
6575 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_cint_operand" "")))
6576 1.1.1.1.4.2 yamt (set (match_operand:DI 0 "register_operand" "=r")
6577 1.1.1.1.4.2 yamt (match_dup 2))]
6578 1.1.1.1.4.2 yamt ""
6579 1.1.1.1.4.2 yamt {
6580 1.1.1.1.4.2 yamt if (CONST_INT_P (operands[1])
6581 1.1.1.1.4.2 yamt && INTVAL (operands[1]) < 32768)
6582 1.1.1.1.4.2 yamt {
6583 1.1.1.1.4.2 yamt if (INTVAL (operands[1]) >= 4096)
6584 1.1.1.1.4.2 yamt {
6585 1.1.1.1.4.2 yamt /* We do this the same way as in the prologue and generate explicit
6586 1.1.1.1.4.2 yamt probes. Then we update the stack by the constant. */
6587 1.1.1.1.4.2 yamt
6588 1.1.1.1.4.2 yamt int probed = 4096;
6589 1.1.1.1.4.2 yamt
6590 1.1.1.1.4.2 yamt emit_insn (gen_probe_stack (GEN_INT (- probed)));
6591 1.1.1.1.4.2 yamt while (probed + 8192 < INTVAL (operands[1]))
6592 1.1.1.1.4.2 yamt emit_insn (gen_probe_stack (GEN_INT (- (probed += 8192))));
6593 1.1.1.1.4.2 yamt
6594 1.1.1.1.4.2 yamt if (probed + 4096 < INTVAL (operands[1]))
6595 1.1.1.1.4.2 yamt emit_insn (gen_probe_stack (GEN_INT (- INTVAL(operands[1]))));
6596 1.1.1.1.4.2 yamt }
6597 1.1.1.1.4.2 yamt
6598 1.1.1.1.4.2 yamt operands[1] = GEN_INT (- INTVAL (operands[1]));
6599 1.1.1.1.4.2 yamt operands[2] = virtual_stack_dynamic_rtx;
6600 1.1.1.1.4.2 yamt }
6601 1.1.1.1.4.2 yamt else
6602 1.1.1.1.4.2 yamt {
6603 1.1.1.1.4.2 yamt rtx out_label = 0;
6604 1.1.1.1.4.2 yamt rtx loop_label = gen_label_rtx ();
6605 1.1.1.1.4.2 yamt rtx want = gen_reg_rtx (Pmode);
6606 1.1.1.1.4.2 yamt rtx tmp = gen_reg_rtx (Pmode);
6607 1.1.1.1.4.2 yamt rtx memref, test;
6608 1.1.1.1.4.2 yamt
6609 1.1.1.1.4.2 yamt emit_insn (gen_subdi3 (want, stack_pointer_rtx,
6610 1.1.1.1.4.2 yamt force_reg (Pmode, operands[1])));
6611 1.1.1.1.4.2 yamt emit_insn (gen_adddi3 (tmp, stack_pointer_rtx, GEN_INT (-4096)));
6612 1.1.1.1.4.2 yamt
6613 1.1.1.1.4.2 yamt if (!CONST_INT_P (operands[1]))
6614 1.1.1.1.4.2 yamt {
6615 1.1.1.1.4.2 yamt out_label = gen_label_rtx ();
6616 1.1.1.1.4.2 yamt test = gen_rtx_GEU (VOIDmode, want, tmp);
6617 1.1.1.1.4.2 yamt emit_jump_insn (gen_cbranchdi4 (test, want, tmp, out_label));
6618 1.1.1.1.4.2 yamt }
6619 1.1.1.1.4.2 yamt
6620 1.1.1.1.4.2 yamt emit_label (loop_label);
6621 1.1.1.1.4.2 yamt memref = gen_rtx_MEM (DImode, tmp);
6622 1.1.1.1.4.2 yamt MEM_VOLATILE_P (memref) = 1;
6623 1.1.1.1.4.2 yamt emit_move_insn (memref, const0_rtx);
6624 1.1.1.1.4.2 yamt emit_insn (gen_adddi3 (tmp, tmp, GEN_INT(-8192)));
6625 1.1.1.1.4.2 yamt test = gen_rtx_GTU (VOIDmode, tmp, want);
6626 1.1.1.1.4.2 yamt emit_jump_insn (gen_cbranchdi4 (test, tmp, want, loop_label));
6627 1.1.1.1.4.2 yamt
6628 1.1.1.1.4.2 yamt memref = gen_rtx_MEM (DImode, want);
6629 1.1.1.1.4.2 yamt MEM_VOLATILE_P (memref) = 1;
6630 1.1.1.1.4.2 yamt emit_move_insn (memref, const0_rtx);
6631 1.1.1.1.4.2 yamt
6632 1.1.1.1.4.2 yamt if (out_label)
6633 1.1.1.1.4.2 yamt emit_label (out_label);
6634 1.1.1.1.4.2 yamt
6635 1.1.1.1.4.2 yamt emit_move_insn (stack_pointer_rtx, want);
6636 1.1.1.1.4.2 yamt emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
6637 1.1.1.1.4.2 yamt DONE;
6638 1.1.1.1.4.2 yamt }
6639 1.1.1.1.4.2 yamt })
6640 1.1.1.1.4.2 yamt
6641 1.1.1.1.4.2 yamt ;; This is used by alpha_expand_prolog to do the same thing as above,
6642 1.1.1.1.4.2 yamt ;; except we cannot at that time generate new basic blocks, so we hide
6643 1.1.1.1.4.2 yamt ;; the loop in this one insn.
6644 1.1.1.1.4.2 yamt
6645 1.1.1.1.4.2 yamt (define_insn "prologue_stack_probe_loop"
6646 1.1.1.1.4.2 yamt [(unspec_volatile [(match_operand:DI 0 "register_operand" "r")
6647 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "r")]
6648 1.1.1.1.4.2 yamt UNSPECV_PSPL)]
6649 1.1.1.1.4.2 yamt ""
6650 1.1.1.1.4.2 yamt {
6651 1.1.1.1.4.2 yamt operands[2] = gen_label_rtx ();
6652 1.1.1.1.4.2 yamt (*targetm.asm_out.internal_label) (asm_out_file, "L",
6653 1.1.1.1.4.2 yamt CODE_LABEL_NUMBER (operands[2]));
6654 1.1.1.1.4.2 yamt
6655 1.1.1.1.4.2 yamt return "stq $31,-8192(%1)\;subq %0,1,%0\;lda %1,-8192(%1)\;bne %0,%l2";
6656 1.1.1.1.4.2 yamt }
6657 1.1.1.1.4.2 yamt [(set_attr "length" "16")
6658 1.1.1.1.4.2 yamt (set_attr "type" "multi")])
6659 1.1.1.1.4.2 yamt
6660 1.1.1.1.4.2 yamt (define_expand "prologue"
6661 1.1.1.1.4.2 yamt [(clobber (const_int 0))]
6662 1.1.1.1.4.2 yamt ""
6663 1.1.1.1.4.2 yamt {
6664 1.1.1.1.4.2 yamt alpha_expand_prologue ();
6665 1.1.1.1.4.2 yamt DONE;
6666 1.1.1.1.4.2 yamt })
6667 1.1.1.1.4.2 yamt
6668 1.1.1.1.4.2 yamt ;; These take care of emitting the ldgp insn in the prologue. This will be
6669 1.1.1.1.4.2 yamt ;; an lda/ldah pair and we want to align them properly. So we have two
6670 1.1.1.1.4.2 yamt ;; unspec_volatile insns, the first of which emits the ldgp assembler macro
6671 1.1.1.1.4.2 yamt ;; and the second of which emits nothing. However, both are marked as type
6672 1.1.1.1.4.2 yamt ;; IADD (the default) so the alignment code in alpha.c does the right thing
6673 1.1.1.1.4.2 yamt ;; with them.
6674 1.1.1.1.4.2 yamt
6675 1.1.1.1.4.2 yamt (define_expand "prologue_ldgp"
6676 1.1.1.1.4.2 yamt [(set (match_dup 0)
6677 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_dup 1) (match_dup 2)] UNSPECV_LDGP1))
6678 1.1.1.1.4.2 yamt (set (match_dup 0)
6679 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_dup 0) (match_dup 2)] UNSPECV_PLDGP2))]
6680 1.1.1.1.4.2 yamt ""
6681 1.1.1.1.4.2 yamt {
6682 1.1.1.1.4.2 yamt operands[0] = pic_offset_table_rtx;
6683 1.1.1.1.4.2 yamt operands[1] = gen_rtx_REG (Pmode, 27);
6684 1.1.1.1.4.2 yamt operands[2] = (TARGET_EXPLICIT_RELOCS
6685 1.1.1.1.4.2 yamt ? GEN_INT (alpha_next_sequence_number++)
6686 1.1.1.1.4.2 yamt : const0_rtx);
6687 1.1.1.1.4.2 yamt })
6688 1.1.1.1.4.2 yamt
6689 1.1.1.1.4.2 yamt (define_insn "*ldgp_er_1"
6690 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
6691 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
6692 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "")]
6693 1.1.1.1.4.2 yamt UNSPECV_LDGP1))]
6694 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
6695 1.1.1.1.4.2 yamt "ldah %0,0(%1)\t\t!gpdisp!%2"
6696 1.1.1.1.4.2 yamt [(set_attr "cannot_copy" "true")])
6697 1.1.1.1.4.2 yamt
6698 1.1.1.1.4.2 yamt (define_insn "*ldgp_er_2"
6699 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
6700 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "register_operand" "r")
6701 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "")]
6702 1.1.1.1.4.2 yamt UNSPEC_LDGP2))]
6703 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
6704 1.1.1.1.4.2 yamt "lda %0,0(%1)\t\t!gpdisp!%2"
6705 1.1.1.1.4.2 yamt [(set_attr "cannot_copy" "true")])
6706 1.1.1.1.4.2 yamt
6707 1.1.1.1.4.2 yamt (define_insn "*prologue_ldgp_er_2"
6708 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
6709 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
6710 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "")]
6711 1.1.1.1.4.2 yamt UNSPECV_PLDGP2))]
6712 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
6713 1.1.1.1.4.2 yamt "lda %0,0(%1)\t\t!gpdisp!%2\n$%~..ng:"
6714 1.1.1.1.4.2 yamt [(set_attr "cannot_copy" "true")])
6715 1.1.1.1.4.2 yamt
6716 1.1.1.1.4.2 yamt (define_insn "*prologue_ldgp_1"
6717 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
6718 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
6719 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "")]
6720 1.1.1.1.4.2 yamt UNSPECV_LDGP1))]
6721 1.1.1.1.4.2 yamt ""
6722 1.1.1.1.4.2 yamt "ldgp %0,0(%1)\n$%~..ng:"
6723 1.1.1.1.4.2 yamt [(set_attr "cannot_copy" "true")])
6724 1.1.1.1.4.2 yamt
6725 1.1.1.1.4.2 yamt (define_insn "*prologue_ldgp_2"
6726 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
6727 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")
6728 1.1.1.1.4.2 yamt (match_operand 2 "const_int_operand" "")]
6729 1.1.1.1.4.2 yamt UNSPECV_PLDGP2))]
6730 1.1.1.1.4.2 yamt ""
6731 1.1.1.1.4.2 yamt "")
6732 1.1.1.1.4.2 yamt
6733 1.1.1.1.4.2 yamt ;; The _mcount profiling hook has special calling conventions, and
6734 1.1.1.1.4.2 yamt ;; does not clobber all the registers that a normal call would. So
6735 1.1.1.1.4.2 yamt ;; hide the fact this is a call at all.
6736 1.1.1.1.4.2 yamt
6737 1.1.1.1.4.2 yamt (define_insn "prologue_mcount"
6738 1.1.1.1.4.2 yamt [(unspec_volatile [(const_int 0)] UNSPECV_MCOUNT)]
6739 1.1.1.1.4.2 yamt ""
6740 1.1.1.1.4.2 yamt {
6741 1.1.1.1.4.2 yamt if (TARGET_EXPLICIT_RELOCS)
6742 1.1.1.1.4.2 yamt /* Note that we cannot use a lituse_jsr reloc, since _mcount
6743 1.1.1.1.4.2 yamt cannot be called via the PLT. */
6744 1.1.1.1.4.2 yamt return "ldq $28,_mcount($29)\t\t!literal\;jsr $28,($28),_mcount";
6745 1.1.1.1.4.2 yamt else
6746 1.1.1.1.4.2 yamt return "lda $28,_mcount\;jsr $28,($28),_mcount";
6747 1.1.1.1.4.2 yamt }
6748 1.1.1.1.4.2 yamt [(set_attr "type" "multi")
6749 1.1.1.1.4.2 yamt (set_attr "length" "8")])
6750 1.1.1.1.4.2 yamt
6751 1.1.1.1.4.2 yamt (define_insn "init_fp"
6752 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
6753 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "r"))
6754 1.1.1.1.4.2 yamt (clobber (mem:BLK (match_operand:DI 2 "register_operand" "=r")))]
6755 1.1.1.1.4.2 yamt ""
6756 1.1.1.1.4.2 yamt "bis $31,%1,%0")
6757 1.1.1.1.4.2 yamt
6758 1.1.1.1.4.2 yamt (define_expand "epilogue"
6759 1.1.1.1.4.2 yamt [(return)]
6760 1.1.1.1.4.2 yamt ""
6761 1.1.1.1.4.2 yamt {
6762 1.1.1.1.4.2 yamt alpha_expand_epilogue ();
6763 1.1.1.1.4.2 yamt })
6764 1.1.1.1.4.2 yamt
6765 1.1.1.1.4.2 yamt (define_expand "sibcall_epilogue"
6766 1.1.1.1.4.2 yamt [(return)]
6767 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
6768 1.1.1.1.4.2 yamt {
6769 1.1.1.1.4.2 yamt alpha_expand_epilogue ();
6770 1.1.1.1.4.2 yamt DONE;
6771 1.1.1.1.4.2 yamt })
6772 1.1.1.1.4.2 yamt
6773 1.1.1.1.4.2 yamt (define_expand "builtin_longjmp"
6774 1.1.1.1.4.2 yamt [(use (match_operand:DI 0 "register_operand" "r"))]
6775 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
6776 1.1.1.1.4.2 yamt {
6777 1.1.1.1.4.2 yamt /* The elements of the buffer are, in order: */
6778 1.1.1.1.4.2 yamt rtx fp = gen_rtx_MEM (Pmode, operands[0]);
6779 1.1.1.1.4.2 yamt rtx lab = gen_rtx_MEM (Pmode, plus_constant (operands[0], 8));
6780 1.1.1.1.4.2 yamt rtx stack = gen_rtx_MEM (Pmode, plus_constant (operands[0], 16));
6781 1.1.1.1.4.2 yamt rtx pv = gen_rtx_REG (Pmode, 27);
6782 1.1.1.1.4.2 yamt
6783 1.1.1.1.4.2 yamt /* This bit is the same as expand_builtin_longjmp. */
6784 1.1.1.1.4.2 yamt emit_move_insn (hard_frame_pointer_rtx, fp);
6785 1.1.1.1.4.2 yamt emit_move_insn (pv, lab);
6786 1.1.1.1.4.2 yamt emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
6787 1.1.1.1.4.2 yamt emit_use (hard_frame_pointer_rtx);
6788 1.1.1.1.4.2 yamt emit_use (stack_pointer_rtx);
6789 1.1.1.1.4.2 yamt
6790 1.1.1.1.4.2 yamt /* Load the label we are jumping through into $27 so that we know
6791 1.1.1.1.4.2 yamt where to look for it when we get back to setjmp's function for
6792 1.1.1.1.4.2 yamt restoring the gp. */
6793 1.1.1.1.4.2 yamt emit_jump_insn (gen_builtin_longjmp_internal (pv));
6794 1.1.1.1.4.2 yamt emit_barrier ();
6795 1.1.1.1.4.2 yamt DONE;
6796 1.1.1.1.4.2 yamt })
6797 1.1.1.1.4.2 yamt
6798 1.1.1.1.4.2 yamt ;; This is effectively a copy of indirect_jump, but constrained such
6799 1.1.1.1.4.2 yamt ;; that register renaming cannot foil our cunning plan with $27.
6800 1.1.1.1.4.2 yamt (define_insn "builtin_longjmp_internal"
6801 1.1.1.1.4.2 yamt [(set (pc)
6802 1.1.1.1.4.2 yamt (unspec_volatile [(match_operand:DI 0 "register_operand" "c")]
6803 1.1.1.1.4.2 yamt UNSPECV_LONGJMP))]
6804 1.1.1.1.4.2 yamt ""
6805 1.1.1.1.4.2 yamt "jmp $31,(%0),0"
6806 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
6807 1.1.1.1.4.2 yamt
6808 1.1.1.1.4.2 yamt (define_expand "builtin_setjmp_receiver"
6809 1.1.1.1.4.2 yamt [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)]
6810 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
6811 1.1.1.1.4.2 yamt "")
6812 1.1.1.1.4.2 yamt
6813 1.1.1.1.4.2 yamt (define_insn_and_split "*builtin_setjmp_receiver_1"
6814 1.1.1.1.4.2 yamt [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_SETJMPR)]
6815 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
6816 1.1.1.1.4.2 yamt {
6817 1.1.1.1.4.2 yamt if (TARGET_EXPLICIT_RELOCS)
6818 1.1.1.1.4.2 yamt return "#";
6819 1.1.1.1.4.2 yamt else
6820 1.1.1.1.4.2 yamt return "br $27,$LSJ%=\n$LSJ%=:\;ldgp $29,0($27)";
6821 1.1.1.1.4.2 yamt }
6822 1.1.1.1.4.2 yamt "&& TARGET_EXPLICIT_RELOCS && reload_completed"
6823 1.1.1.1.4.2 yamt [(set (match_dup 1)
6824 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_dup 2) (match_dup 3)] UNSPECV_LDGP1))
6825 1.1.1.1.4.2 yamt (set (match_dup 1)
6826 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_LDGP2))]
6827 1.1.1.1.4.2 yamt {
6828 1.1.1.1.4.2 yamt if (prev_nonnote_insn (curr_insn) != XEXP (operands[0], 0))
6829 1.1.1.1.4.2 yamt emit_insn (gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, operands[0]),
6830 1.1.1.1.4.2 yamt UNSPECV_SETJMPR_ER));
6831 1.1.1.1.4.2 yamt operands[1] = pic_offset_table_rtx;
6832 1.1.1.1.4.2 yamt operands[2] = gen_rtx_REG (Pmode, 27);
6833 1.1.1.1.4.2 yamt operands[3] = GEN_INT (alpha_next_sequence_number++);
6834 1.1.1.1.4.2 yamt }
6835 1.1.1.1.4.2 yamt [(set_attr "length" "12")
6836 1.1.1.1.4.2 yamt (set_attr "type" "multi")])
6837 1.1.1.1.4.2 yamt
6838 1.1.1.1.4.2 yamt (define_insn "*builtin_setjmp_receiver_er_sl_1"
6839 1.1.1.1.4.2 yamt [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_SETJMPR_ER)]
6840 1.1.1.1.4.2 yamt "TARGET_ABI_OSF && TARGET_EXPLICIT_RELOCS && TARGET_AS_CAN_SUBTRACT_LABELS"
6841 1.1.1.1.4.2 yamt "lda $27,$LSJ%=-%l0($27)\n$LSJ%=:")
6842 1.1.1.1.4.2 yamt
6843 1.1.1.1.4.2 yamt (define_insn "*builtin_setjmp_receiver_er_1"
6844 1.1.1.1.4.2 yamt [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_SETJMPR_ER)]
6845 1.1.1.1.4.2 yamt "TARGET_ABI_OSF && TARGET_EXPLICIT_RELOCS"
6846 1.1.1.1.4.2 yamt "br $27,$LSJ%=\n$LSJ%=:"
6847 1.1.1.1.4.2 yamt [(set_attr "type" "ibr")])
6848 1.1.1.1.4.2 yamt
6849 1.1.1.1.4.2 yamt ;; When flag_reorder_blocks_and_partition is in effect, compiler puts
6850 1.1.1.1.4.2 yamt ;; exception landing pads in a cold section. To prevent inter-section offset
6851 1.1.1.1.4.2 yamt ;; calculation, a jump to original landing pad is emitted in the place of the
6852 1.1.1.1.4.2 yamt ;; original landing pad. Since landing pad is moved, RA-relative GP
6853 1.1.1.1.4.2 yamt ;; calculation in the prologue of landing pad breaks. To solve this problem,
6854 1.1.1.1.4.2 yamt ;; we use alternative GP load approach, as in the case of TARGET_LD_BUGGY_LDGP.
6855 1.1.1.1.4.2 yamt
6856 1.1.1.1.4.2 yamt (define_expand "exception_receiver"
6857 1.1.1.1.4.2 yamt [(unspec_volatile [(match_dup 0)] UNSPECV_EHR)]
6858 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
6859 1.1.1.1.4.2 yamt {
6860 1.1.1.1.4.2 yamt if (TARGET_LD_BUGGY_LDGP || flag_reorder_blocks_and_partition)
6861 1.1.1.1.4.2 yamt operands[0] = alpha_gp_save_rtx ();
6862 1.1.1.1.4.2 yamt else
6863 1.1.1.1.4.2 yamt operands[0] = const0_rtx;
6864 1.1.1.1.4.2 yamt })
6865 1.1.1.1.4.2 yamt
6866 1.1.1.1.4.2 yamt (define_insn "*exception_receiver_2"
6867 1.1.1.1.4.2 yamt [(unspec_volatile [(match_operand:DI 0 "memory_operand" "m")] UNSPECV_EHR)]
6868 1.1.1.1.4.2 yamt "TARGET_ABI_OSF
6869 1.1.1.1.4.2 yamt && (TARGET_LD_BUGGY_LDGP || flag_reorder_blocks_and_partition)"
6870 1.1.1.1.4.2 yamt "ldq $29,%0"
6871 1.1.1.1.4.2 yamt [(set_attr "type" "ild")])
6872 1.1.1.1.4.2 yamt
6873 1.1.1.1.4.2 yamt (define_insn_and_split "*exception_receiver_1"
6874 1.1.1.1.4.2 yamt [(unspec_volatile [(const_int 0)] UNSPECV_EHR)]
6875 1.1.1.1.4.2 yamt "TARGET_ABI_OSF"
6876 1.1.1.1.4.2 yamt {
6877 1.1.1.1.4.2 yamt if (TARGET_EXPLICIT_RELOCS)
6878 1.1.1.1.4.2 yamt return "ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*";
6879 1.1.1.1.4.2 yamt else
6880 1.1.1.1.4.2 yamt return "ldgp $29,0($26)";
6881 1.1.1.1.4.2 yamt }
6882 1.1.1.1.4.2 yamt "&& TARGET_EXPLICIT_RELOCS && reload_completed"
6883 1.1.1.1.4.2 yamt [(set (match_dup 0)
6884 1.1.1.1.4.2 yamt (unspec_volatile:DI [(match_dup 1) (match_dup 2)] UNSPECV_LDGP1))
6885 1.1.1.1.4.2 yamt (set (match_dup 0)
6886 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 0) (match_dup 2)] UNSPEC_LDGP2))]
6887 1.1.1.1.4.2 yamt {
6888 1.1.1.1.4.2 yamt operands[0] = pic_offset_table_rtx;
6889 1.1.1.1.4.2 yamt operands[1] = gen_rtx_REG (Pmode, 26);
6890 1.1.1.1.4.2 yamt operands[2] = GEN_INT (alpha_next_sequence_number++);
6891 1.1.1.1.4.2 yamt }
6892 1.1.1.1.4.2 yamt [(set_attr "length" "8")
6893 1.1.1.1.4.2 yamt (set_attr "type" "multi")])
6894 1.1.1.1.4.2 yamt
6895 1.1.1.1.4.2 yamt (define_expand "nonlocal_goto_receiver"
6896 1.1.1.1.4.2 yamt [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
6897 1.1.1.1.4.2 yamt (set (reg:DI 27) (mem:DI (reg:DI 29)))
6898 1.1.1.1.4.2 yamt (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
6899 1.1.1.1.4.2 yamt (use (reg:DI 27))]
6900 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
6901 1.1.1.1.4.2 yamt "")
6902 1.1.1.1.4.2 yamt
6903 1.1.1.1.4.2 yamt (define_insn "arg_home"
6904 1.1.1.1.4.2 yamt [(unspec [(const_int 0)] UNSPEC_ARG_HOME)
6905 1.1.1.1.4.2 yamt (use (reg:DI 1))
6906 1.1.1.1.4.2 yamt (use (reg:DI 25))
6907 1.1.1.1.4.2 yamt (use (reg:DI 16))
6908 1.1.1.1.4.2 yamt (use (reg:DI 17))
6909 1.1.1.1.4.2 yamt (use (reg:DI 18))
6910 1.1.1.1.4.2 yamt (use (reg:DI 19))
6911 1.1.1.1.4.2 yamt (use (reg:DI 20))
6912 1.1.1.1.4.2 yamt (use (reg:DI 21))
6913 1.1.1.1.4.2 yamt (use (reg:DI 48))
6914 1.1.1.1.4.2 yamt (use (reg:DI 49))
6915 1.1.1.1.4.2 yamt (use (reg:DI 50))
6916 1.1.1.1.4.2 yamt (use (reg:DI 51))
6917 1.1.1.1.4.2 yamt (use (reg:DI 52))
6918 1.1.1.1.4.2 yamt (use (reg:DI 53))
6919 1.1.1.1.4.2 yamt (clobber (mem:BLK (const_int 0)))
6920 1.1.1.1.4.2 yamt (clobber (reg:DI 24))
6921 1.1.1.1.4.2 yamt (clobber (reg:DI 25))
6922 1.1.1.1.4.2 yamt (clobber (reg:DI 0))]
6923 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
6924 1.1.1.1.4.2 yamt "lda $0,OTS$HOME_ARGS\;ldq $0,8($0)\;jsr $0,OTS$HOME_ARGS"
6925 1.1.1.1.4.2 yamt [(set_attr "length" "16")
6926 1.1.1.1.4.2 yamt (set_attr "type" "multi")])
6927 1.1.1.1.4.2 yamt
6928 1.1.1.1.4.2 yamt ;; Load the CIW into r2 for calling __T3E_MISMATCH
6929 1.1.1.1.4.2 yamt
6930 1.1.1.1.4.2 yamt (define_expand "umk_mismatch_args"
6931 1.1.1.1.4.2 yamt [(set:DI (match_dup 1) (mem:DI (plus:DI (reg:DI 15) (const_int -16))))
6932 1.1.1.1.4.2 yamt (set:DI (match_dup 2) (mem:DI (plus:DI (match_dup 1) (const_int -32))))
6933 1.1.1.1.4.2 yamt (set:DI (reg:DI 1) (match_operand:DI 0 "const_int_operand" ""))
6934 1.1.1.1.4.2 yamt (set:DI (match_dup 3) (plus:DI (mult:DI (reg:DI 25)
6935 1.1.1.1.4.2 yamt (const_int 8))
6936 1.1.1.1.4.2 yamt (match_dup 2)))
6937 1.1.1.1.4.2 yamt (set:DI (reg:DI 2) (mem:DI (match_dup 3)))]
6938 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
6939 1.1.1.1.4.2 yamt {
6940 1.1.1.1.4.2 yamt operands[1] = gen_reg_rtx (DImode);
6941 1.1.1.1.4.2 yamt operands[2] = gen_reg_rtx (DImode);
6942 1.1.1.1.4.2 yamt operands[3] = gen_reg_rtx (DImode);
6943 1.1.1.1.4.2 yamt })
6944 1.1.1.1.4.2 yamt
6945 1.1.1.1.4.2 yamt (define_insn "arg_home_umk"
6946 1.1.1.1.4.2 yamt [(unspec [(const_int 0)] UNSPEC_ARG_HOME)
6947 1.1.1.1.4.2 yamt (use (reg:DI 1))
6948 1.1.1.1.4.2 yamt (use (reg:DI 2))
6949 1.1.1.1.4.2 yamt (use (reg:DI 16))
6950 1.1.1.1.4.2 yamt (use (reg:DI 17))
6951 1.1.1.1.4.2 yamt (use (reg:DI 18))
6952 1.1.1.1.4.2 yamt (use (reg:DI 19))
6953 1.1.1.1.4.2 yamt (use (reg:DI 20))
6954 1.1.1.1.4.2 yamt (use (reg:DI 21))
6955 1.1.1.1.4.2 yamt (use (reg:DI 48))
6956 1.1.1.1.4.2 yamt (use (reg:DI 49))
6957 1.1.1.1.4.2 yamt (use (reg:DI 50))
6958 1.1.1.1.4.2 yamt (use (reg:DI 51))
6959 1.1.1.1.4.2 yamt (use (reg:DI 52))
6960 1.1.1.1.4.2 yamt (use (reg:DI 53))
6961 1.1.1.1.4.2 yamt (clobber (mem:BLK (const_int 0)))
6962 1.1.1.1.4.2 yamt (parallel [
6963 1.1.1.1.4.2 yamt (clobber (reg:DI 22))
6964 1.1.1.1.4.2 yamt (clobber (reg:DI 23))
6965 1.1.1.1.4.2 yamt (clobber (reg:DI 24))
6966 1.1.1.1.4.2 yamt (clobber (reg:DI 0))
6967 1.1.1.1.4.2 yamt (clobber (reg:DI 1))
6968 1.1.1.1.4.2 yamt (clobber (reg:DI 2))
6969 1.1.1.1.4.2 yamt (clobber (reg:DI 3))
6970 1.1.1.1.4.2 yamt (clobber (reg:DI 4))
6971 1.1.1.1.4.2 yamt (clobber (reg:DI 5))
6972 1.1.1.1.4.2 yamt (clobber (reg:DI 6))
6973 1.1.1.1.4.2 yamt (clobber (reg:DI 7))
6974 1.1.1.1.4.2 yamt (clobber (reg:DI 8))])]
6975 1.1.1.1.4.2 yamt "TARGET_ABI_UNICOSMK"
6976 1.1.1.1.4.2 yamt "laum $4,__T3E_MISMATCH($31)\;sll $4,32,$4\;lalm $4,__T3E_MISMATCH($4)\;lal $4,__T3E_MISMATCH($4)\;jsr $3,($4)"
6977 1.1.1.1.4.2 yamt [(set_attr "length" "16")
6978 1.1.1.1.4.2 yamt (set_attr "type" "multi")])
6979 1.1.1.1.4.2 yamt
6980 1.1.1.1.4.2 yamt ;; Prefetch data.
6981 1.1.1.1.4.2 yamt ;;
6982 1.1.1.1.4.2 yamt ;; On EV4, these instructions are nops -- no load occurs.
6983 1.1.1.1.4.2 yamt ;;
6984 1.1.1.1.4.2 yamt ;; On EV5, these instructions act as a normal load, and thus can trap
6985 1.1.1.1.4.2 yamt ;; if the address is invalid. The OS may (or may not) handle this in
6986 1.1.1.1.4.2 yamt ;; the entMM fault handler and suppress the fault. If so, then this
6987 1.1.1.1.4.2 yamt ;; has the effect of a read prefetch instruction.
6988 1.1.1.1.4.2 yamt ;;
6989 1.1.1.1.4.2 yamt ;; On EV6, these become official prefetch instructions.
6990 1.1.1.1.4.2 yamt
6991 1.1.1.1.4.2 yamt (define_insn "prefetch"
6992 1.1.1.1.4.2 yamt [(prefetch (match_operand:DI 0 "address_operand" "p")
6993 1.1.1.1.4.2 yamt (match_operand:DI 1 "const_int_operand" "n")
6994 1.1.1.1.4.2 yamt (match_operand:DI 2 "const_int_operand" "n"))]
6995 1.1.1.1.4.2 yamt "TARGET_FIXUP_EV5_PREFETCH || alpha_cpu == PROCESSOR_EV6"
6996 1.1.1.1.4.2 yamt {
6997 1.1.1.1.4.2 yamt /* Interpret "no temporal locality" as this data should be evicted once
6998 1.1.1.1.4.2 yamt it is used. The "evict next" alternatives load the data into the cache
6999 1.1.1.1.4.2 yamt and leave the LRU eviction counter pointing to that block. */
7000 1.1.1.1.4.2 yamt static const char * const alt[2][2] = {
7001 1.1.1.1.4.2 yamt {
7002 1.1.1.1.4.2 yamt "ldq $31,%a0", /* read, evict next */
7003 1.1.1.1.4.2 yamt "ldl $31,%a0", /* read, evict last */
7004 1.1.1.1.4.2 yamt },
7005 1.1.1.1.4.2 yamt {
7006 1.1.1.1.4.2 yamt "ldt $f31,%a0", /* write, evict next */
7007 1.1.1.1.4.2 yamt "lds $f31,%a0", /* write, evict last */
7008 1.1.1.1.4.2 yamt }
7009 1.1.1.1.4.2 yamt };
7010 1.1.1.1.4.2 yamt
7011 1.1.1.1.4.2 yamt bool write = INTVAL (operands[1]) != 0;
7012 1.1.1.1.4.2 yamt bool lru = INTVAL (operands[2]) != 0;
7013 1.1.1.1.4.2 yamt
7014 1.1.1.1.4.2 yamt return alt[write][lru];
7015 1.1.1.1.4.2 yamt }
7016 1.1.1.1.4.2 yamt [(set_attr "type" "ild")])
7017 1.1.1.1.4.2 yamt
7018 1.1.1.1.4.2 yamt ;; Close the trap shadow of preceding instructions. This is generated
7019 1.1.1.1.4.2 yamt ;; by alpha_reorg.
7020 1.1.1.1.4.2 yamt
7021 1.1.1.1.4.2 yamt (define_insn "trapb"
7022 1.1.1.1.4.2 yamt [(unspec_volatile [(const_int 0)] UNSPECV_TRAPB)]
7023 1.1.1.1.4.2 yamt ""
7024 1.1.1.1.4.2 yamt "trapb"
7025 1.1.1.1.4.2 yamt [(set_attr "type" "misc")])
7026 1.1.1.1.4.2 yamt
7027 1.1.1.1.4.2 yamt ;; No-op instructions used by machine-dependent reorg to preserve
7028 1.1.1.1.4.2 yamt ;; alignment for instruction issue.
7029 1.1.1.1.4.2 yamt ;; The Unicos/Mk assembler does not support these opcodes.
7030 1.1.1.1.4.2 yamt
7031 1.1.1.1.4.2 yamt (define_insn "nop"
7032 1.1.1.1.4.2 yamt [(const_int 0)]
7033 1.1.1.1.4.2 yamt ""
7034 1.1.1.1.4.2 yamt "bis $31,$31,$31"
7035 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
7036 1.1.1.1.4.2 yamt
7037 1.1.1.1.4.2 yamt (define_insn "fnop"
7038 1.1.1.1.4.2 yamt [(const_int 1)]
7039 1.1.1.1.4.2 yamt "TARGET_FP"
7040 1.1.1.1.4.2 yamt "cpys $f31,$f31,$f31"
7041 1.1.1.1.4.2 yamt [(set_attr "type" "fcpys")])
7042 1.1.1.1.4.2 yamt
7043 1.1.1.1.4.2 yamt (define_insn "unop"
7044 1.1.1.1.4.2 yamt [(const_int 2)]
7045 1.1.1.1.4.2 yamt ""
7046 1.1.1.1.4.2 yamt "ldq_u $31,0($30)")
7047 1.1.1.1.4.2 yamt
7048 1.1.1.1.4.2 yamt ;; On Unicos/Mk we use a macro for aligning code.
7049 1.1.1.1.4.2 yamt
7050 1.1.1.1.4.2 yamt (define_insn "realign"
7051 1.1.1.1.4.2 yamt [(unspec_volatile [(match_operand 0 "immediate_operand" "i")]
7052 1.1.1.1.4.2 yamt UNSPECV_REALIGN)]
7053 1.1.1.1.4.2 yamt ""
7054 1.1.1.1.4.2 yamt {
7055 1.1.1.1.4.2 yamt if (TARGET_ABI_UNICOSMK)
7056 1.1.1.1.4.2 yamt return "gcc@code@align %0";
7057 1.1.1.1.4.2 yamt else
7058 1.1.1.1.4.2 yamt return ".align %0 #realign";
7059 1.1.1.1.4.2 yamt })
7060 1.1.1.1.4.2 yamt
7062 1.1.1.1.4.2 yamt ;; Instructions to be emitted from __builtins.
7063 1.1.1.1.4.2 yamt
7064 1.1.1.1.4.2 yamt (define_insn "builtin_cmpbge"
7065 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
7066 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "rJ")
7067 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rI")]
7068 1.1.1.1.4.2 yamt UNSPEC_CMPBGE))]
7069 1.1.1.1.4.2 yamt ""
7070 1.1.1.1.4.2 yamt "cmpbge %r1,%2,%0"
7071 1.1.1.1.4.2 yamt ;; The EV6 data sheets list this as ILOG. OTOH, EV6 doesn't
7072 1.1.1.1.4.2 yamt ;; actually differentiate between ILOG and ICMP in the schedule.
7073 1.1.1.1.4.2 yamt [(set_attr "type" "icmp")])
7074 1.1.1.1.4.2 yamt
7075 1.1.1.1.4.2 yamt (define_expand "builtin_extbl"
7076 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7077 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7078 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7079 1.1.1.1.4.2 yamt ""
7080 1.1.1.1.4.2 yamt {
7081 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7082 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7083 1.1.1.1.4.2 yamt gen = gen_extxl_be;
7084 1.1.1.1.4.2 yamt else
7085 1.1.1.1.4.2 yamt gen = gen_extxl_le;
7086 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], GEN_INT (8), operands[2]));
7087 1.1.1.1.4.2 yamt DONE;
7088 1.1.1.1.4.2 yamt })
7089 1.1.1.1.4.2 yamt
7090 1.1.1.1.4.2 yamt (define_expand "builtin_extwl"
7091 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7092 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7093 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7094 1.1.1.1.4.2 yamt ""
7095 1.1.1.1.4.2 yamt {
7096 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7097 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7098 1.1.1.1.4.2 yamt gen = gen_extxl_be;
7099 1.1.1.1.4.2 yamt else
7100 1.1.1.1.4.2 yamt gen = gen_extxl_le;
7101 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], GEN_INT (16), operands[2]));
7102 1.1.1.1.4.2 yamt DONE;
7103 1.1.1.1.4.2 yamt })
7104 1.1.1.1.4.2 yamt
7105 1.1.1.1.4.2 yamt (define_expand "builtin_extll"
7106 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7107 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7108 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7109 1.1.1.1.4.2 yamt ""
7110 1.1.1.1.4.2 yamt {
7111 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7112 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7113 1.1.1.1.4.2 yamt gen = gen_extxl_be;
7114 1.1.1.1.4.2 yamt else
7115 1.1.1.1.4.2 yamt gen = gen_extxl_le;
7116 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], GEN_INT (32), operands[2]));
7117 1.1.1.1.4.2 yamt DONE;
7118 1.1.1.1.4.2 yamt })
7119 1.1.1.1.4.2 yamt
7120 1.1.1.1.4.2 yamt (define_expand "builtin_extql"
7121 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7122 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7123 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7124 1.1.1.1.4.2 yamt ""
7125 1.1.1.1.4.2 yamt {
7126 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7127 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7128 1.1.1.1.4.2 yamt gen = gen_extxl_be;
7129 1.1.1.1.4.2 yamt else
7130 1.1.1.1.4.2 yamt gen = gen_extxl_le;
7131 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], GEN_INT (64), operands[2]));
7132 1.1.1.1.4.2 yamt DONE;
7133 1.1.1.1.4.2 yamt })
7134 1.1.1.1.4.2 yamt
7135 1.1.1.1.4.2 yamt (define_expand "builtin_extwh"
7136 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7137 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7138 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7139 1.1.1.1.4.2 yamt ""
7140 1.1.1.1.4.2 yamt {
7141 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7142 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7143 1.1.1.1.4.2 yamt gen = gen_extwh_be;
7144 1.1.1.1.4.2 yamt else
7145 1.1.1.1.4.2 yamt gen = gen_extwh_le;
7146 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7147 1.1.1.1.4.2 yamt DONE;
7148 1.1.1.1.4.2 yamt })
7149 1.1.1.1.4.2 yamt
7150 1.1.1.1.4.2 yamt (define_expand "builtin_extlh"
7151 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7152 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7153 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7154 1.1.1.1.4.2 yamt ""
7155 1.1.1.1.4.2 yamt {
7156 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7157 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7158 1.1.1.1.4.2 yamt gen = gen_extlh_be;
7159 1.1.1.1.4.2 yamt else
7160 1.1.1.1.4.2 yamt gen = gen_extlh_le;
7161 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7162 1.1.1.1.4.2 yamt DONE;
7163 1.1.1.1.4.2 yamt })
7164 1.1.1.1.4.2 yamt
7165 1.1.1.1.4.2 yamt (define_expand "builtin_extqh"
7166 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7167 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7168 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7169 1.1.1.1.4.2 yamt ""
7170 1.1.1.1.4.2 yamt {
7171 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7172 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7173 1.1.1.1.4.2 yamt gen = gen_extqh_be;
7174 1.1.1.1.4.2 yamt else
7175 1.1.1.1.4.2 yamt gen = gen_extqh_le;
7176 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7177 1.1.1.1.4.2 yamt DONE;
7178 1.1.1.1.4.2 yamt })
7179 1.1.1.1.4.2 yamt
7180 1.1.1.1.4.2 yamt (define_expand "builtin_insbl"
7181 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7182 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7183 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7184 1.1.1.1.4.2 yamt ""
7185 1.1.1.1.4.2 yamt {
7186 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7187 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7188 1.1.1.1.4.2 yamt gen = gen_insbl_be;
7189 1.1.1.1.4.2 yamt else
7190 1.1.1.1.4.2 yamt gen = gen_insbl_le;
7191 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (QImode, operands[1]);
7192 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7193 1.1.1.1.4.2 yamt DONE;
7194 1.1.1.1.4.2 yamt })
7195 1.1.1.1.4.2 yamt
7196 1.1.1.1.4.2 yamt (define_expand "builtin_inswl"
7197 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7198 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7199 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7200 1.1.1.1.4.2 yamt ""
7201 1.1.1.1.4.2 yamt {
7202 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7203 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7204 1.1.1.1.4.2 yamt gen = gen_inswl_be;
7205 1.1.1.1.4.2 yamt else
7206 1.1.1.1.4.2 yamt gen = gen_inswl_le;
7207 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (HImode, operands[1]);
7208 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7209 1.1.1.1.4.2 yamt DONE;
7210 1.1.1.1.4.2 yamt })
7211 1.1.1.1.4.2 yamt
7212 1.1.1.1.4.2 yamt (define_expand "builtin_insll"
7213 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7214 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7215 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7216 1.1.1.1.4.2 yamt ""
7217 1.1.1.1.4.2 yamt {
7218 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7219 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7220 1.1.1.1.4.2 yamt gen = gen_insll_be;
7221 1.1.1.1.4.2 yamt else
7222 1.1.1.1.4.2 yamt gen = gen_insll_le;
7223 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (SImode, operands[1]);
7224 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7225 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7226 1.1.1.1.4.2 yamt DONE;
7227 1.1.1.1.4.2 yamt })
7228 1.1.1.1.4.2 yamt
7229 1.1.1.1.4.2 yamt (define_expand "builtin_insql"
7230 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7231 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7232 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7233 1.1.1.1.4.2 yamt ""
7234 1.1.1.1.4.2 yamt {
7235 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx);
7236 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7237 1.1.1.1.4.2 yamt gen = gen_insql_be;
7238 1.1.1.1.4.2 yamt else
7239 1.1.1.1.4.2 yamt gen = gen_insql_le;
7240 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], operands[2]));
7241 1.1.1.1.4.2 yamt DONE;
7242 1.1.1.1.4.2 yamt })
7243 1.1.1.1.4.2 yamt
7244 1.1.1.1.4.2 yamt (define_expand "builtin_inswh"
7245 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7246 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7247 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7248 1.1.1.1.4.2 yamt ""
7249 1.1.1.1.4.2 yamt {
7250 1.1.1.1.4.2 yamt emit_insn (gen_insxh (operands[0], operands[1], GEN_INT (16), operands[2]));
7251 1.1.1.1.4.2 yamt DONE;
7252 1.1.1.1.4.2 yamt })
7253 1.1.1.1.4.2 yamt
7254 1.1.1.1.4.2 yamt (define_expand "builtin_inslh"
7255 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7256 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7257 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7258 1.1.1.1.4.2 yamt ""
7259 1.1.1.1.4.2 yamt {
7260 1.1.1.1.4.2 yamt emit_insn (gen_insxh (operands[0], operands[1], GEN_INT (32), operands[2]));
7261 1.1.1.1.4.2 yamt DONE;
7262 1.1.1.1.4.2 yamt })
7263 1.1.1.1.4.2 yamt
7264 1.1.1.1.4.2 yamt (define_expand "builtin_insqh"
7265 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7266 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7267 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7268 1.1.1.1.4.2 yamt ""
7269 1.1.1.1.4.2 yamt {
7270 1.1.1.1.4.2 yamt emit_insn (gen_insxh (operands[0], operands[1], GEN_INT (64), operands[2]));
7271 1.1.1.1.4.2 yamt DONE;
7272 1.1.1.1.4.2 yamt })
7273 1.1.1.1.4.2 yamt
7274 1.1.1.1.4.2 yamt (define_expand "builtin_mskbl"
7275 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7276 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7277 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7278 1.1.1.1.4.2 yamt ""
7279 1.1.1.1.4.2 yamt {
7280 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7281 1.1.1.1.4.2 yamt rtx mask;
7282 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7283 1.1.1.1.4.2 yamt gen = gen_mskxl_be;
7284 1.1.1.1.4.2 yamt else
7285 1.1.1.1.4.2 yamt gen = gen_mskxl_le;
7286 1.1.1.1.4.2 yamt mask = GEN_INT (0xff);
7287 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], mask, operands[2]));
7288 1.1.1.1.4.2 yamt DONE;
7289 1.1.1.1.4.2 yamt })
7290 1.1.1.1.4.2 yamt
7291 1.1.1.1.4.2 yamt (define_expand "builtin_mskwl"
7292 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7293 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7294 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7295 1.1.1.1.4.2 yamt ""
7296 1.1.1.1.4.2 yamt {
7297 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7298 1.1.1.1.4.2 yamt rtx mask;
7299 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7300 1.1.1.1.4.2 yamt gen = gen_mskxl_be;
7301 1.1.1.1.4.2 yamt else
7302 1.1.1.1.4.2 yamt gen = gen_mskxl_le;
7303 1.1.1.1.4.2 yamt mask = GEN_INT (0xffff);
7304 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], mask, operands[2]));
7305 1.1.1.1.4.2 yamt DONE;
7306 1.1.1.1.4.2 yamt })
7307 1.1.1.1.4.2 yamt
7308 1.1.1.1.4.2 yamt (define_expand "builtin_mskll"
7309 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7310 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7311 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7312 1.1.1.1.4.2 yamt ""
7313 1.1.1.1.4.2 yamt {
7314 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7315 1.1.1.1.4.2 yamt rtx mask;
7316 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7317 1.1.1.1.4.2 yamt gen = gen_mskxl_be;
7318 1.1.1.1.4.2 yamt else
7319 1.1.1.1.4.2 yamt gen = gen_mskxl_le;
7320 1.1.1.1.4.2 yamt mask = immed_double_const (0xffffffff, 0, DImode);
7321 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], mask, operands[2]));
7322 1.1.1.1.4.2 yamt DONE;
7323 1.1.1.1.4.2 yamt })
7324 1.1.1.1.4.2 yamt
7325 1.1.1.1.4.2 yamt (define_expand "builtin_mskql"
7326 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7327 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7328 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7329 1.1.1.1.4.2 yamt ""
7330 1.1.1.1.4.2 yamt {
7331 1.1.1.1.4.2 yamt rtx (*gen) (rtx, rtx, rtx, rtx);
7332 1.1.1.1.4.2 yamt rtx mask;
7333 1.1.1.1.4.2 yamt if (WORDS_BIG_ENDIAN)
7334 1.1.1.1.4.2 yamt gen = gen_mskxl_be;
7335 1.1.1.1.4.2 yamt else
7336 1.1.1.1.4.2 yamt gen = gen_mskxl_le;
7337 1.1.1.1.4.2 yamt mask = constm1_rtx;
7338 1.1.1.1.4.2 yamt emit_insn ((*gen) (operands[0], operands[1], mask, operands[2]));
7339 1.1.1.1.4.2 yamt DONE;
7340 1.1.1.1.4.2 yamt })
7341 1.1.1.1.4.2 yamt
7342 1.1.1.1.4.2 yamt (define_expand "builtin_mskwh"
7343 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7344 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7345 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7346 1.1.1.1.4.2 yamt ""
7347 1.1.1.1.4.2 yamt {
7348 1.1.1.1.4.2 yamt emit_insn (gen_mskxh (operands[0], operands[1], GEN_INT (16), operands[2]));
7349 1.1.1.1.4.2 yamt DONE;
7350 1.1.1.1.4.2 yamt })
7351 1.1.1.1.4.2 yamt
7352 1.1.1.1.4.2 yamt (define_expand "builtin_msklh"
7353 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7354 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7355 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7356 1.1.1.1.4.2 yamt ""
7357 1.1.1.1.4.2 yamt {
7358 1.1.1.1.4.2 yamt emit_insn (gen_mskxh (operands[0], operands[1], GEN_INT (32), operands[2]));
7359 1.1.1.1.4.2 yamt DONE;
7360 1.1.1.1.4.2 yamt })
7361 1.1.1.1.4.2 yamt
7362 1.1.1.1.4.2 yamt (define_expand "builtin_mskqh"
7363 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7364 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")
7365 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "")]
7366 1.1.1.1.4.2 yamt ""
7367 1.1.1.1.4.2 yamt {
7368 1.1.1.1.4.2 yamt emit_insn (gen_mskxh (operands[0], operands[1], GEN_INT (64), operands[2]));
7369 1.1.1.1.4.2 yamt DONE;
7370 1.1.1.1.4.2 yamt })
7371 1.1.1.1.4.2 yamt
7372 1.1.1.1.4.2 yamt (define_expand "builtin_zap"
7373 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7374 1.1.1.1.4.2 yamt (and:DI (unspec:DI
7375 1.1.1.1.4.2 yamt [(match_operand:DI 2 "reg_or_cint_operand" "")]
7376 1.1.1.1.4.2 yamt UNSPEC_ZAP)
7377 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_cint_operand" "")))]
7378 1.1.1.1.4.2 yamt ""
7379 1.1.1.1.4.2 yamt {
7380 1.1.1.1.4.2 yamt if (CONST_INT_P (operands[2]))
7381 1.1.1.1.4.2 yamt {
7382 1.1.1.1.4.2 yamt rtx mask = alpha_expand_zap_mask (INTVAL (operands[2]));
7383 1.1.1.1.4.2 yamt
7384 1.1.1.1.4.2 yamt if (mask == const0_rtx)
7385 1.1.1.1.4.2 yamt {
7386 1.1.1.1.4.2 yamt emit_move_insn (operands[0], const0_rtx);
7387 1.1.1.1.4.2 yamt DONE;
7388 1.1.1.1.4.2 yamt }
7389 1.1.1.1.4.2 yamt if (mask == constm1_rtx)
7390 1.1.1.1.4.2 yamt {
7391 1.1.1.1.4.2 yamt emit_move_insn (operands[0], operands[1]);
7392 1.1.1.1.4.2 yamt DONE;
7393 1.1.1.1.4.2 yamt }
7394 1.1.1.1.4.2 yamt
7395 1.1.1.1.4.2 yamt operands[1] = force_reg (DImode, operands[1]);
7396 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (operands[0], operands[1], mask));
7397 1.1.1.1.4.2 yamt DONE;
7398 1.1.1.1.4.2 yamt }
7399 1.1.1.1.4.2 yamt
7400 1.1.1.1.4.2 yamt operands[1] = force_reg (DImode, operands[1]);
7401 1.1.1.1.4.2 yamt operands[2] = gen_lowpart (QImode, operands[2]);
7402 1.1.1.1.4.2 yamt })
7403 1.1.1.1.4.2 yamt
7404 1.1.1.1.4.2 yamt (define_insn "*builtin_zap_1"
7405 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
7406 1.1.1.1.4.2 yamt (and:DI (unspec:DI
7407 1.1.1.1.4.2 yamt [(match_operand:QI 2 "reg_or_cint_operand" "n,n,r,r")]
7408 1.1.1.1.4.2 yamt UNSPEC_ZAP)
7409 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_cint_operand" "n,r,J,r")))]
7410 1.1.1.1.4.2 yamt ""
7411 1.1.1.1.4.2 yamt "@
7412 1.1.1.1.4.2 yamt #
7413 1.1.1.1.4.2 yamt #
7414 1.1.1.1.4.2 yamt bis $31,$31,%0
7415 1.1.1.1.4.2 yamt zap %r1,%2,%0"
7416 1.1.1.1.4.2 yamt [(set_attr "type" "shift,shift,ilog,shift")])
7417 1.1.1.1.4.2 yamt
7418 1.1.1.1.4.2 yamt (define_split
7419 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7420 1.1.1.1.4.2 yamt (and:DI (unspec:DI
7421 1.1.1.1.4.2 yamt [(match_operand:QI 2 "const_int_operand" "")]
7422 1.1.1.1.4.2 yamt UNSPEC_ZAP)
7423 1.1.1.1.4.2 yamt (match_operand:DI 1 "const_int_operand" "")))]
7424 1.1.1.1.4.2 yamt ""
7425 1.1.1.1.4.2 yamt [(const_int 0)]
7426 1.1.1.1.4.2 yamt {
7427 1.1.1.1.4.2 yamt rtx mask = alpha_expand_zap_mask (INTVAL (operands[2]));
7428 1.1.1.1.4.2 yamt if (HOST_BITS_PER_WIDE_INT >= 64 || CONST_INT_P (mask))
7429 1.1.1.1.4.2 yamt operands[1] = gen_int_mode (INTVAL (operands[1]) & INTVAL (mask), DImode);
7430 1.1.1.1.4.2 yamt else
7431 1.1.1.1.4.2 yamt {
7432 1.1.1.1.4.2 yamt HOST_WIDE_INT c_lo = INTVAL (operands[1]);
7433 1.1.1.1.4.2 yamt HOST_WIDE_INT c_hi = (c_lo < 0 ? -1 : 0);
7434 1.1.1.1.4.2 yamt operands[1] = immed_double_const (c_lo & CONST_DOUBLE_LOW (mask),
7435 1.1.1.1.4.2 yamt c_hi & CONST_DOUBLE_HIGH (mask),
7436 1.1.1.1.4.2 yamt DImode);
7437 1.1.1.1.4.2 yamt }
7438 1.1.1.1.4.2 yamt emit_move_insn (operands[0], operands[1]);
7439 1.1.1.1.4.2 yamt DONE;
7440 1.1.1.1.4.2 yamt })
7441 1.1.1.1.4.2 yamt
7442 1.1.1.1.4.2 yamt (define_split
7443 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7444 1.1.1.1.4.2 yamt (and:DI (unspec:DI
7445 1.1.1.1.4.2 yamt [(match_operand:QI 2 "const_int_operand" "")]
7446 1.1.1.1.4.2 yamt UNSPEC_ZAP)
7447 1.1.1.1.4.2 yamt (match_operand:DI 1 "register_operand" "")))]
7448 1.1.1.1.4.2 yamt ""
7449 1.1.1.1.4.2 yamt [(set (match_dup 0)
7450 1.1.1.1.4.2 yamt (and:DI (match_dup 1) (match_dup 2)))]
7451 1.1.1.1.4.2 yamt {
7452 1.1.1.1.4.2 yamt operands[2] = alpha_expand_zap_mask (INTVAL (operands[2]));
7453 1.1.1.1.4.2 yamt if (operands[2] == const0_rtx)
7454 1.1.1.1.4.2 yamt {
7455 1.1.1.1.4.2 yamt emit_move_insn (operands[0], const0_rtx);
7456 1.1.1.1.4.2 yamt DONE;
7457 1.1.1.1.4.2 yamt }
7458 1.1.1.1.4.2 yamt if (operands[2] == constm1_rtx)
7459 1.1.1.1.4.2 yamt {
7460 1.1.1.1.4.2 yamt emit_move_insn (operands[0], operands[1]);
7461 1.1.1.1.4.2 yamt DONE;
7462 1.1.1.1.4.2 yamt }
7463 1.1.1.1.4.2 yamt })
7464 1.1.1.1.4.2 yamt
7465 1.1.1.1.4.2 yamt (define_expand "builtin_zapnot"
7466 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7467 1.1.1.1.4.2 yamt (and:DI (unspec:DI
7468 1.1.1.1.4.2 yamt [(not:QI (match_operand:DI 2 "reg_or_cint_operand" ""))]
7469 1.1.1.1.4.2 yamt UNSPEC_ZAP)
7470 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_cint_operand" "")))]
7471 1.1.1.1.4.2 yamt ""
7472 1.1.1.1.4.2 yamt {
7473 1.1.1.1.4.2 yamt if (CONST_INT_P (operands[2]))
7474 1.1.1.1.4.2 yamt {
7475 1.1.1.1.4.2 yamt rtx mask = alpha_expand_zap_mask (~ INTVAL (operands[2]));
7476 1.1.1.1.4.2 yamt
7477 1.1.1.1.4.2 yamt if (mask == const0_rtx)
7478 1.1.1.1.4.2 yamt {
7479 1.1.1.1.4.2 yamt emit_move_insn (operands[0], const0_rtx);
7480 1.1.1.1.4.2 yamt DONE;
7481 1.1.1.1.4.2 yamt }
7482 1.1.1.1.4.2 yamt if (mask == constm1_rtx)
7483 1.1.1.1.4.2 yamt {
7484 1.1.1.1.4.2 yamt emit_move_insn (operands[0], operands[1]);
7485 1.1.1.1.4.2 yamt DONE;
7486 1.1.1.1.4.2 yamt }
7487 1.1.1.1.4.2 yamt
7488 1.1.1.1.4.2 yamt operands[1] = force_reg (DImode, operands[1]);
7489 1.1.1.1.4.2 yamt emit_insn (gen_anddi3 (operands[0], operands[1], mask));
7490 1.1.1.1.4.2 yamt DONE;
7491 1.1.1.1.4.2 yamt }
7492 1.1.1.1.4.2 yamt
7493 1.1.1.1.4.2 yamt operands[1] = force_reg (DImode, operands[1]);
7494 1.1.1.1.4.2 yamt operands[2] = gen_lowpart (QImode, operands[2]);
7495 1.1.1.1.4.2 yamt })
7496 1.1.1.1.4.2 yamt
7497 1.1.1.1.4.2 yamt (define_insn "*builtin_zapnot_1"
7498 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
7499 1.1.1.1.4.2 yamt (and:DI (unspec:DI
7500 1.1.1.1.4.2 yamt [(not:QI (match_operand:QI 2 "register_operand" "r"))]
7501 1.1.1.1.4.2 yamt UNSPEC_ZAP)
7502 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "rJ")))]
7503 1.1.1.1.4.2 yamt ""
7504 1.1.1.1.4.2 yamt "zapnot %r1,%2,%0"
7505 1.1.1.1.4.2 yamt [(set_attr "type" "shift")])
7506 1.1.1.1.4.2 yamt
7507 1.1.1.1.4.2 yamt (define_insn "builtin_amask"
7508 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
7509 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "reg_or_8bit_operand" "rI")]
7510 1.1.1.1.4.2 yamt UNSPEC_AMASK))]
7511 1.1.1.1.4.2 yamt ""
7512 1.1.1.1.4.2 yamt "amask %1,%0"
7513 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
7514 1.1.1.1.4.2 yamt
7515 1.1.1.1.4.2 yamt (define_insn "builtin_implver"
7516 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
7517 1.1.1.1.4.2 yamt (unspec:DI [(const_int 0)] UNSPEC_IMPLVER))]
7518 1.1.1.1.4.2 yamt ""
7519 1.1.1.1.4.2 yamt "implver %0"
7520 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
7521 1.1.1.1.4.2 yamt
7522 1.1.1.1.4.2 yamt (define_insn "builtin_rpcc"
7523 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
7524 1.1.1.1.4.2 yamt (unspec_volatile:DI [(const_int 0)] UNSPECV_RPCC))]
7525 1.1.1.1.4.2 yamt ""
7526 1.1.1.1.4.2 yamt "rpcc %0"
7527 1.1.1.1.4.2 yamt [(set_attr "type" "ilog")])
7528 1.1.1.1.4.2 yamt
7529 1.1.1.1.4.2 yamt (define_expand "builtin_minub8"
7530 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7531 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7532 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7533 1.1.1.1.4.2 yamt "TARGET_MAX"
7534 1.1.1.1.4.2 yamt {
7535 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_uminv8qi3, V8QImode, operands[0],
7536 1.1.1.1.4.2 yamt operands[1], operands[2]);
7537 1.1.1.1.4.2 yamt DONE;
7538 1.1.1.1.4.2 yamt })
7539 1.1.1.1.4.2 yamt
7540 1.1.1.1.4.2 yamt (define_expand "builtin_minsb8"
7541 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7542 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7543 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7544 1.1.1.1.4.2 yamt "TARGET_MAX"
7545 1.1.1.1.4.2 yamt {
7546 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_sminv8qi3, V8QImode, operands[0],
7547 1.1.1.1.4.2 yamt operands[1], operands[2]);
7548 1.1.1.1.4.2 yamt DONE;
7549 1.1.1.1.4.2 yamt })
7550 1.1.1.1.4.2 yamt
7551 1.1.1.1.4.2 yamt (define_expand "builtin_minuw4"
7552 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7553 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7554 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7555 1.1.1.1.4.2 yamt "TARGET_MAX"
7556 1.1.1.1.4.2 yamt {
7557 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_uminv4hi3, V4HImode, operands[0],
7558 1.1.1.1.4.2 yamt operands[1], operands[2]);
7559 1.1.1.1.4.2 yamt DONE;
7560 1.1.1.1.4.2 yamt })
7561 1.1.1.1.4.2 yamt
7562 1.1.1.1.4.2 yamt (define_expand "builtin_minsw4"
7563 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7564 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7565 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7566 1.1.1.1.4.2 yamt "TARGET_MAX"
7567 1.1.1.1.4.2 yamt {
7568 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_sminv4hi3, V4HImode, operands[0],
7569 1.1.1.1.4.2 yamt operands[1], operands[2]);
7570 1.1.1.1.4.2 yamt DONE;
7571 1.1.1.1.4.2 yamt })
7572 1.1.1.1.4.2 yamt
7573 1.1.1.1.4.2 yamt (define_expand "builtin_maxub8"
7574 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7575 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7576 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7577 1.1.1.1.4.2 yamt "TARGET_MAX"
7578 1.1.1.1.4.2 yamt {
7579 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_umaxv8qi3, V8QImode, operands[0],
7580 1.1.1.1.4.2 yamt operands[1], operands[2]);
7581 1.1.1.1.4.2 yamt DONE;
7582 1.1.1.1.4.2 yamt })
7583 1.1.1.1.4.2 yamt
7584 1.1.1.1.4.2 yamt (define_expand "builtin_maxsb8"
7585 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7586 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7587 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7588 1.1.1.1.4.2 yamt "TARGET_MAX"
7589 1.1.1.1.4.2 yamt {
7590 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_smaxv8qi3, V8QImode, operands[0],
7591 1.1.1.1.4.2 yamt operands[1], operands[2]);
7592 1.1.1.1.4.2 yamt DONE;
7593 1.1.1.1.4.2 yamt })
7594 1.1.1.1.4.2 yamt
7595 1.1.1.1.4.2 yamt (define_expand "builtin_maxuw4"
7596 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7597 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7598 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7599 1.1.1.1.4.2 yamt "TARGET_MAX"
7600 1.1.1.1.4.2 yamt {
7601 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_umaxv4hi3, V4HImode, operands[0],
7602 1.1.1.1.4.2 yamt operands[1], operands[2]);
7603 1.1.1.1.4.2 yamt DONE;
7604 1.1.1.1.4.2 yamt })
7605 1.1.1.1.4.2 yamt
7606 1.1.1.1.4.2 yamt (define_expand "builtin_maxsw4"
7607 1.1.1.1.4.2 yamt [(match_operand:DI 0 "register_operand" "")
7608 1.1.1.1.4.2 yamt (match_operand:DI 1 "reg_or_0_operand" "")
7609 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_0_operand" "")]
7610 1.1.1.1.4.2 yamt "TARGET_MAX"
7611 1.1.1.1.4.2 yamt {
7612 1.1.1.1.4.2 yamt alpha_expand_builtin_vector_binop (gen_smaxv4hi3, V4HImode, operands[0],
7613 1.1.1.1.4.2 yamt operands[1], operands[2]);
7614 1.1.1.1.4.2 yamt DONE;
7615 1.1.1.1.4.2 yamt })
7616 1.1.1.1.4.2 yamt
7617 1.1.1.1.4.2 yamt (define_insn "builtin_perr"
7618 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "=r")
7619 1.1.1.1.4.2 yamt (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "%rJ")
7620 1.1.1.1.4.2 yamt (match_operand:DI 2 "reg_or_8bit_operand" "rJ")]
7621 1.1.1.1.4.2 yamt UNSPEC_PERR))]
7622 1.1.1.1.4.2 yamt "TARGET_MAX"
7623 1.1.1.1.4.2 yamt "perr %r1,%r2,%0"
7624 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
7625 1.1.1.1.4.2 yamt
7626 1.1.1.1.4.2 yamt (define_expand "builtin_pklb"
7627 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7628 1.1.1.1.4.2 yamt (vec_concat:V8QI
7629 1.1.1.1.4.2 yamt (vec_concat:V4QI
7630 1.1.1.1.4.2 yamt (truncate:V2QI (match_operand:DI 1 "register_operand" ""))
7631 1.1.1.1.4.2 yamt (match_dup 2))
7632 1.1.1.1.4.2 yamt (match_dup 3)))]
7633 1.1.1.1.4.2 yamt "TARGET_MAX"
7634 1.1.1.1.4.2 yamt {
7635 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (V8QImode, operands[0]);
7636 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (V2SImode, operands[1]);
7637 1.1.1.1.4.2 yamt operands[2] = CONST0_RTX (V2QImode);
7638 1.1.1.1.4.2 yamt operands[3] = CONST0_RTX (V4QImode);
7639 1.1.1.1.4.2 yamt })
7640 1.1.1.1.4.2 yamt
7641 1.1.1.1.4.2 yamt (define_insn "*pklb"
7642 1.1.1.1.4.2 yamt [(set (match_operand:V8QI 0 "register_operand" "=r")
7643 1.1.1.1.4.2 yamt (vec_concat:V8QI
7644 1.1.1.1.4.2 yamt (vec_concat:V4QI
7645 1.1.1.1.4.2 yamt (truncate:V2QI (match_operand:V2SI 1 "register_operand" "r"))
7646 1.1.1.1.4.2 yamt (match_operand:V2QI 2 "const0_operand" ""))
7647 1.1.1.1.4.2 yamt (match_operand:V4QI 3 "const0_operand" "")))]
7648 1.1.1.1.4.2 yamt "TARGET_MAX"
7649 1.1.1.1.4.2 yamt "pklb %r1,%0"
7650 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
7651 1.1.1.1.4.2 yamt
7652 1.1.1.1.4.2 yamt (define_expand "builtin_pkwb"
7653 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7654 1.1.1.1.4.2 yamt (vec_concat:V8QI
7655 1.1.1.1.4.2 yamt (truncate:V4QI (match_operand:DI 1 "register_operand" ""))
7656 1.1.1.1.4.2 yamt (match_dup 2)))]
7657 1.1.1.1.4.2 yamt "TARGET_MAX"
7658 1.1.1.1.4.2 yamt {
7659 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (V8QImode, operands[0]);
7660 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (V4HImode, operands[1]);
7661 1.1.1.1.4.2 yamt operands[2] = CONST0_RTX (V4QImode);
7662 1.1.1.1.4.2 yamt })
7663 1.1.1.1.4.2 yamt
7664 1.1.1.1.4.2 yamt (define_insn "*pkwb"
7665 1.1.1.1.4.2 yamt [(set (match_operand:V8QI 0 "register_operand" "=r")
7666 1.1.1.1.4.2 yamt (vec_concat:V8QI
7667 1.1.1.1.4.2 yamt (truncate:V4QI (match_operand:V4HI 1 "register_operand" "r"))
7668 1.1.1.1.4.2 yamt (match_operand:V4QI 2 "const0_operand" "")))]
7669 1.1.1.1.4.2 yamt "TARGET_MAX"
7670 1.1.1.1.4.2 yamt "pkwb %r1,%0"
7671 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
7672 1.1.1.1.4.2 yamt
7673 1.1.1.1.4.2 yamt (define_expand "builtin_unpkbl"
7674 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7675 1.1.1.1.4.2 yamt (zero_extend:V2SI
7676 1.1.1.1.4.2 yamt (vec_select:V2QI (match_operand:DI 1 "register_operand" "")
7677 1.1.1.1.4.2 yamt (parallel [(const_int 0) (const_int 1)]))))]
7678 1.1.1.1.4.2 yamt "TARGET_MAX"
7679 1.1.1.1.4.2 yamt {
7680 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (V2SImode, operands[0]);
7681 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (V8QImode, operands[1]);
7682 1.1.1.1.4.2 yamt })
7683 1.1.1.1.4.2 yamt
7684 1.1.1.1.4.2 yamt (define_insn "*unpkbl"
7685 1.1.1.1.4.2 yamt [(set (match_operand:V2SI 0 "register_operand" "=r")
7686 1.1.1.1.4.2 yamt (zero_extend:V2SI
7687 1.1.1.1.4.2 yamt (vec_select:V2QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
7688 1.1.1.1.4.2 yamt (parallel [(const_int 0) (const_int 1)]))))]
7689 1.1.1.1.4.2 yamt "TARGET_MAX"
7690 1.1.1.1.4.2 yamt "unpkbl %r1,%0"
7691 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
7692 1.1.1.1.4.2 yamt
7693 1.1.1.1.4.2 yamt (define_expand "builtin_unpkbw"
7694 1.1.1.1.4.2 yamt [(set (match_operand:DI 0 "register_operand" "")
7695 1.1.1.1.4.2 yamt (zero_extend:V4HI
7696 1.1.1.1.4.2 yamt (vec_select:V4QI (match_operand:DI 1 "register_operand" "")
7697 1.1.1.1.4.2 yamt (parallel [(const_int 0)
7698 1.1.1.1.4.2 yamt (const_int 1)
7699 1.1.1.1.4.2 yamt (const_int 2)
7700 1.1.1.1.4.2 yamt (const_int 3)]))))]
7701 1.1.1.1.4.2 yamt "TARGET_MAX"
7702 1.1.1.1.4.2 yamt {
7703 1.1.1.1.4.2 yamt operands[0] = gen_lowpart (V4HImode, operands[0]);
7704 1.1.1.1.4.2 yamt operands[1] = gen_lowpart (V8QImode, operands[1]);
7705 1.1.1.1.4.2 yamt })
7706 1.1.1.1.4.2 yamt
7707 1.1.1.1.4.2 yamt (define_insn "*unpkbw"
7708 1.1.1.1.4.2 yamt [(set (match_operand:V4HI 0 "register_operand" "=r")
7709 1.1.1.1.4.2 yamt (zero_extend:V4HI
7710 1.1.1.1.4.2 yamt (vec_select:V4QI (match_operand:V8QI 1 "reg_or_0_operand" "rW")
7711 1.1.1.1.4.2 yamt (parallel [(const_int 0)
7712 1.1.1.1.4.2 yamt (const_int 1)
7713 1.1.1.1.4.2 yamt (const_int 2)
7714 1.1.1.1.4.2 yamt (const_int 3)]))))]
7715 1.1.1.1.4.2 yamt "TARGET_MAX"
7716 1.1.1.1.4.2 yamt "unpkbw %r1,%0"
7717 1.1.1.1.4.2 yamt [(set_attr "type" "mvi")])
7718 1.1.1.1.4.2 yamt
7720 1.1.1.1.4.2 yamt (include "sync.md")
7721 1.1.1.1.4.2 yamt
7723 1.1.1.1.4.2 yamt ;; The call patterns are at the end of the file because their
7724 1.1.1.1.4.2 yamt ;; wildcard operand0 interferes with nice recognition.
7725 1.1.1.1.4.2 yamt
7726 1.1.1.1.4.2 yamt (define_insn "*call_value_osf_1_er_noreturn"
7727 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7728 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
7729 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7730 1.1.1.1.4.2 yamt (use (reg:DI 29))
7731 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7732 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
7733 1.1.1.1.4.2 yamt && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
7734 1.1.1.1.4.2 yamt "@
7735 1.1.1.1.4.2 yamt jsr $26,($27),0
7736 1.1.1.1.4.2 yamt bsr $26,%1\t\t!samegp
7737 1.1.1.1.4.2 yamt ldq $27,%1($29)\t\t!literal!%#\;jsr $26,($27),%1\t\t!lituse_jsr!%#"
7738 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7739 1.1.1.1.4.2 yamt (set_attr "length" "*,*,8")])
7740 1.1.1.1.4.2 yamt
7741 1.1.1.1.4.2 yamt (define_insn "*call_value_osf_1_er"
7742 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7743 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
7744 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7745 1.1.1.1.4.2 yamt (use (reg:DI 29))
7746 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7747 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
7748 1.1.1.1.4.2 yamt "@
7749 1.1.1.1.4.2 yamt jsr $26,(%1),0\;ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*
7750 1.1.1.1.4.2 yamt bsr $26,%1\t\t!samegp
7751 1.1.1.1.4.2 yamt 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!%*"
7752 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7753 1.1.1.1.4.2 yamt (set_attr "length" "12,*,16")])
7754 1.1.1.1.4.2 yamt
7755 1.1.1.1.4.2 yamt ;; We must use peep2 instead of a split because we need accurate life
7756 1.1.1.1.4.2 yamt ;; information for $gp. Consider the case of { bar(); while (1); }.
7757 1.1.1.1.4.2 yamt (define_peephole2
7758 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
7759 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" ""))
7760 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7761 1.1.1.1.4.2 yamt (use (reg:DI 29))
7762 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
7763 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
7764 1.1.1.1.4.2 yamt && ! samegp_function_operand (operands[1], Pmode)
7765 1.1.1.1.4.2 yamt && (peep2_regno_dead_p (1, 29)
7766 1.1.1.1.4.2 yamt || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
7767 1.1.1.1.4.2 yamt [(parallel [(set (match_dup 0)
7768 1.1.1.1.4.2 yamt (call (mem:DI (match_dup 3))
7769 1.1.1.1.4.2 yamt (match_dup 2)))
7770 1.1.1.1.4.2 yamt (use (reg:DI 29))
7771 1.1.1.1.4.2 yamt (use (match_dup 1))
7772 1.1.1.1.4.2 yamt (use (match_dup 4))
7773 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
7774 1.1.1.1.4.2 yamt {
7775 1.1.1.1.4.2 yamt if (CONSTANT_P (operands[1]))
7776 1.1.1.1.4.2 yamt {
7777 1.1.1.1.4.2 yamt operands[3] = gen_rtx_REG (Pmode, 27);
7778 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
7779 1.1.1.1.4.2 yamt emit_insn (gen_movdi_er_high_g (operands[3], pic_offset_table_rtx,
7780 1.1.1.1.4.2 yamt operands[1], operands[4]));
7781 1.1.1.1.4.2 yamt }
7782 1.1.1.1.4.2 yamt else
7783 1.1.1.1.4.2 yamt {
7784 1.1.1.1.4.2 yamt operands[3] = operands[1];
7785 1.1.1.1.4.2 yamt operands[1] = const0_rtx;
7786 1.1.1.1.4.2 yamt operands[4] = const0_rtx;
7787 1.1.1.1.4.2 yamt }
7788 1.1.1.1.4.2 yamt })
7789 1.1.1.1.4.2 yamt
7790 1.1.1.1.4.2 yamt (define_peephole2
7791 1.1.1.1.4.2 yamt [(parallel [(set (match_operand 0 "" "")
7792 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" ""))
7793 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7794 1.1.1.1.4.2 yamt (use (reg:DI 29))
7795 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])]
7796 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && reload_completed
7797 1.1.1.1.4.2 yamt && ! samegp_function_operand (operands[1], Pmode)
7798 1.1.1.1.4.2 yamt && ! (peep2_regno_dead_p (1, 29)
7799 1.1.1.1.4.2 yamt || find_reg_note (insn, REG_NORETURN, NULL_RTX))"
7800 1.1.1.1.4.2 yamt [(parallel [(set (match_dup 0)
7801 1.1.1.1.4.2 yamt (call (mem:DI (match_dup 3))
7802 1.1.1.1.4.2 yamt (match_dup 2)))
7803 1.1.1.1.4.2 yamt (set (match_dup 6)
7804 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 6) (match_dup 4)] UNSPEC_LDGP1))
7805 1.1.1.1.4.2 yamt (use (match_dup 1))
7806 1.1.1.1.4.2 yamt (use (match_dup 5))
7807 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])
7808 1.1.1.1.4.2 yamt (set (match_dup 6)
7809 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 6) (match_dup 4)] UNSPEC_LDGP2))]
7810 1.1.1.1.4.2 yamt {
7811 1.1.1.1.4.2 yamt if (CONSTANT_P (operands[1]))
7812 1.1.1.1.4.2 yamt {
7813 1.1.1.1.4.2 yamt operands[3] = gen_rtx_REG (Pmode, 27);
7814 1.1.1.1.4.2 yamt operands[5] = GEN_INT (alpha_next_sequence_number++);
7815 1.1.1.1.4.2 yamt emit_insn (gen_movdi_er_high_g (operands[3], pic_offset_table_rtx,
7816 1.1.1.1.4.2 yamt operands[1], operands[5]));
7817 1.1.1.1.4.2 yamt }
7818 1.1.1.1.4.2 yamt else
7819 1.1.1.1.4.2 yamt {
7820 1.1.1.1.4.2 yamt operands[3] = operands[1];
7821 1.1.1.1.4.2 yamt operands[1] = const0_rtx;
7822 1.1.1.1.4.2 yamt operands[5] = const0_rtx;
7823 1.1.1.1.4.2 yamt }
7824 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
7825 1.1.1.1.4.2 yamt operands[6] = pic_offset_table_rtx;
7826 1.1.1.1.4.2 yamt })
7827 1.1.1.1.4.2 yamt
7828 1.1.1.1.4.2 yamt (define_insn "*call_value_osf_2_er_nogp"
7829 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7830 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "register_operand" "c"))
7831 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7832 1.1.1.1.4.2 yamt (use (reg:DI 29))
7833 1.1.1.1.4.2 yamt (use (match_operand 3 "" ""))
7834 1.1.1.1.4.2 yamt (use (match_operand 4 "" ""))
7835 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7836 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
7837 1.1.1.1.4.2 yamt "jsr $26,(%1),%3%J4"
7838 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")])
7839 1.1.1.1.4.2 yamt
7840 1.1.1.1.4.2 yamt (define_insn "*call_value_osf_2_er"
7841 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7842 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "register_operand" "c"))
7843 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7844 1.1.1.1.4.2 yamt (set (reg:DI 29)
7845 1.1.1.1.4.2 yamt (unspec:DI [(reg:DI 29) (match_operand 5 "const_int_operand" "")]
7846 1.1.1.1.4.2 yamt UNSPEC_LDGP1))
7847 1.1.1.1.4.2 yamt (use (match_operand 3 "" ""))
7848 1.1.1.1.4.2 yamt (use (match_operand 4 "" ""))
7849 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7850 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
7851 1.1.1.1.4.2 yamt "jsr $26,(%1),%3%J4\;ldah $29,0($26)\t\t!gpdisp!%5"
7852 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7853 1.1.1.1.4.2 yamt (set_attr "cannot_copy" "true")
7854 1.1.1.1.4.2 yamt (set_attr "length" "8")])
7855 1.1.1.1.4.2 yamt
7856 1.1.1.1.4.2 yamt (define_insn "*call_value_osf_1_noreturn"
7857 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7858 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
7859 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7860 1.1.1.1.4.2 yamt (use (reg:DI 29))
7861 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7862 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
7863 1.1.1.1.4.2 yamt && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
7864 1.1.1.1.4.2 yamt "@
7865 1.1.1.1.4.2 yamt jsr $26,($27),0
7866 1.1.1.1.4.2 yamt bsr $26,$%1..ng
7867 1.1.1.1.4.2 yamt jsr $26,%1"
7868 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7869 1.1.1.1.4.2 yamt (set_attr "length" "*,*,8")])
7870 1.1.1.1.4.2 yamt
7871 1.1.1.1.4.2 yamt (define_insn_and_split "call_value_osf_tlsgd"
7872 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7873 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "symbolic_operand" ""))
7874 1.1.1.1.4.2 yamt (const_int 0)))
7875 1.1.1.1.4.2 yamt (unspec [(match_operand:DI 2 "const_int_operand" "")] UNSPEC_TLSGD_CALL)
7876 1.1.1.1.4.2 yamt (use (reg:DI 29))
7877 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7878 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
7879 1.1.1.1.4.2 yamt "#"
7880 1.1.1.1.4.2 yamt "&& reload_completed"
7881 1.1.1.1.4.2 yamt [(set (match_dup 3)
7882 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5)
7883 1.1.1.1.4.2 yamt (match_dup 1)
7884 1.1.1.1.4.2 yamt (match_dup 2)] UNSPEC_LITERAL))
7885 1.1.1.1.4.2 yamt (parallel [(set (match_dup 0)
7886 1.1.1.1.4.2 yamt (call (mem:DI (match_dup 3))
7887 1.1.1.1.4.2 yamt (const_int 0)))
7888 1.1.1.1.4.2 yamt (set (match_dup 5)
7889 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP1))
7890 1.1.1.1.4.2 yamt (use (match_dup 1))
7891 1.1.1.1.4.2 yamt (use (unspec [(match_dup 2)] UNSPEC_TLSGD_CALL))
7892 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])
7893 1.1.1.1.4.2 yamt (set (match_dup 5)
7894 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP2))]
7895 1.1.1.1.4.2 yamt {
7896 1.1.1.1.4.2 yamt operands[3] = gen_rtx_REG (Pmode, 27);
7897 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
7898 1.1.1.1.4.2 yamt operands[5] = pic_offset_table_rtx;
7899 1.1.1.1.4.2 yamt }
7900 1.1.1.1.4.2 yamt [(set_attr "type" "multi")])
7901 1.1.1.1.4.2 yamt
7902 1.1.1.1.4.2 yamt (define_insn_and_split "call_value_osf_tlsldm"
7903 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7904 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "symbolic_operand" ""))
7905 1.1.1.1.4.2 yamt (const_int 0)))
7906 1.1.1.1.4.2 yamt (unspec [(match_operand:DI 2 "const_int_operand" "")] UNSPEC_TLSLDM_CALL)
7907 1.1.1.1.4.2 yamt (use (reg:DI 29))
7908 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7909 1.1.1.1.4.2 yamt "HAVE_AS_TLS"
7910 1.1.1.1.4.2 yamt "#"
7911 1.1.1.1.4.2 yamt "&& reload_completed"
7912 1.1.1.1.4.2 yamt [(set (match_dup 3)
7913 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5)
7914 1.1.1.1.4.2 yamt (match_dup 1)
7915 1.1.1.1.4.2 yamt (match_dup 2)] UNSPEC_LITERAL))
7916 1.1.1.1.4.2 yamt (parallel [(set (match_dup 0)
7917 1.1.1.1.4.2 yamt (call (mem:DI (match_dup 3))
7918 1.1.1.1.4.2 yamt (const_int 0)))
7919 1.1.1.1.4.2 yamt (set (match_dup 5)
7920 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP1))
7921 1.1.1.1.4.2 yamt (use (match_dup 1))
7922 1.1.1.1.4.2 yamt (use (unspec [(match_dup 2)] UNSPEC_TLSLDM_CALL))
7923 1.1.1.1.4.2 yamt (clobber (reg:DI 26))])
7924 1.1.1.1.4.2 yamt (set (match_dup 5)
7925 1.1.1.1.4.2 yamt (unspec:DI [(match_dup 5) (match_dup 4)] UNSPEC_LDGP2))]
7926 1.1.1.1.4.2 yamt {
7927 1.1.1.1.4.2 yamt operands[3] = gen_rtx_REG (Pmode, 27);
7928 1.1.1.1.4.2 yamt operands[4] = GEN_INT (alpha_next_sequence_number++);
7929 1.1.1.1.4.2 yamt operands[5] = pic_offset_table_rtx;
7930 1.1.1.1.4.2 yamt }
7931 1.1.1.1.4.2 yamt [(set_attr "type" "multi")])
7932 1.1.1.1.4.2 yamt
7933 1.1.1.1.4.2 yamt (define_insn "*call_value_osf_1"
7934 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7935 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" "c,R,s"))
7936 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7937 1.1.1.1.4.2 yamt (use (reg:DI 29))
7938 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7939 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
7940 1.1.1.1.4.2 yamt "@
7941 1.1.1.1.4.2 yamt jsr $26,($27),0\;ldgp $29,0($26)
7942 1.1.1.1.4.2 yamt bsr $26,$%1..ng
7943 1.1.1.1.4.2 yamt jsr $26,%1\;ldgp $29,0($26)"
7944 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7945 1.1.1.1.4.2 yamt (set_attr "length" "12,*,16")])
7946 1.1.1.1.4.2 yamt
7947 1.1.1.1.4.2 yamt (define_insn "*sibcall_value_osf_1_er"
7948 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7949 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "symbolic_operand" "R,s"))
7950 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7951 1.1.1.1.4.2 yamt (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
7952 1.1.1.1.4.2 yamt "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
7953 1.1.1.1.4.2 yamt "@
7954 1.1.1.1.4.2 yamt br $31,%1\t\t!samegp
7955 1.1.1.1.4.2 yamt ldq $27,%1($29)\t\t!literal!%#\;jmp $31,($27),%1\t\t!lituse_jsr!%#"
7956 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7957 1.1.1.1.4.2 yamt (set_attr "length" "*,8")])
7958 1.1.1.1.4.2 yamt
7959 1.1.1.1.4.2 yamt (define_insn "*sibcall_value_osf_1"
7960 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7961 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "symbolic_operand" "R,s"))
7962 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7963 1.1.1.1.4.2 yamt (unspec [(reg:DI 29)] UNSPEC_SIBCALL)]
7964 1.1.1.1.4.2 yamt "! TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
7965 1.1.1.1.4.2 yamt "@
7966 1.1.1.1.4.2 yamt br $31,$%1..ng
7967 1.1.1.1.4.2 yamt lda $27,%1\;jmp $31,($27),%1"
7968 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7969 1.1.1.1.4.2 yamt (set_attr "length" "*,8")])
7970 1.1.1.1.4.2 yamt
7971 1.1.1.1.4.2 yamt (define_insn "*call_value_nt_1"
7972 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7973 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" "r,R,s"))
7974 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7975 1.1.1.1.4.2 yamt (clobber (reg:DI 26))]
7976 1.1.1.1.4.2 yamt "TARGET_ABI_WINDOWS_NT"
7977 1.1.1.1.4.2 yamt "@
7978 1.1.1.1.4.2 yamt jsr $26,(%1)
7979 1.1.1.1.4.2 yamt bsr $26,%1
7980 1.1.1.1.4.2 yamt jsr $26,%1"
7981 1.1.1.1.4.2 yamt [(set_attr "type" "jsr")
7982 1.1.1.1.4.2 yamt (set_attr "length" "*,*,12")])
7983 1.1.1.1.4.2 yamt
7984 1.1.1.1.4.2 yamt ; GAS relies on the order and position of instructions output below in order
7985 1.1.1.1.4.2 yamt ; to generate relocs for VMS link to potentially optimize the call.
7986 1.1.1.1.4.2 yamt ; Please do not molest.
7987 1.1.1.1.4.2 yamt (define_insn "*call_value_vms_1"
7988 1.1.1.1.4.2 yamt [(set (match_operand 0 "" "")
7989 1.1.1.1.4.2 yamt (call (mem:DI (match_operand:DI 1 "call_operand" "r,s"))
7990 1.1.1.1.4.2 yamt (match_operand 2 "" "")))
7991 1.1.1.1.4.2 yamt (use (match_operand:DI 3 "nonmemory_operand" "r,n"))
7992 1.1.1.1.4.2 yamt (use (reg:DI 25))
7993 1.1.1.1.4.2 yamt (use (reg:DI 26))
7994 1.1.1.1.4.2 yamt (clobber (reg:DI 27))]
7995 1.1.1.1.4.2 yamt "TARGET_ABI_OPEN_VMS"
7996 1.1.1.1.4.2 yamt {
7997 1.1.1.1.4.2 yamt switch (which_alternative)
7998 {
7999 case 0:
8000 return "mov %3,$27\;jsr $26,0\;ldq $27,0($29)";
8001 case 1:
8002 operands [3] = alpha_use_linkage (operands [1], cfun->decl, 1, 0);
8003 operands [4] = alpha_use_linkage (operands [1], cfun->decl, 0, 0);
8004 return "ldq $26,%4\;ldq $27,%3\;jsr $26,%1\;ldq $27,0($29)";
8005 default:
8006 gcc_unreachable ();
8007 }
8008 }
8009 [(set_attr "type" "jsr")
8010 (set_attr "length" "12,16")])
8011
8012 (define_insn "*call_value_umk"
8013 [(set (match_operand 0 "" "")
8014 (call (mem:DI (match_operand:DI 1 "call_operand" "r"))
8015 (match_operand 2 "" "")))
8016 (use (reg:DI 25))
8017 (clobber (reg:DI 26))]
8018 "TARGET_ABI_UNICOSMK"
8019 "jsr $26,(%1)"
8020 [(set_attr "type" "jsr")])
8021