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