vax.md revision 1.1.1.9 1 ;; Machine description for GNU compiler, VAX Version
2 ;; Copyright (C) 1987-2022 Free Software Foundation, Inc.
3
4 ;; This file is part of GCC.
5
6 ;; GCC is free software; you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation; either version 3, or (at your option)
9 ;; any later version.
10
11 ;; GCC is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;; GNU General Public License for more details.
15
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3. If not see
18 ;; <http://www.gnu.org/licenses/>.
19
20
21 ;;- Instruction patterns. When multiple patterns apply,
22 ;;- the first one in the file is chosen.
23 ;;-
24 ;;- See file "rtl.def" for documentation on define_insn, match_*, et al.
25
26 ;; UNSPEC_VOLATILE usage:
27
28 (define_c_enum "unspecv" [
29 VUNSPEC_BLOCKAGE ; 'blockage' insn to prevent scheduling across an
30 ; insn in the code.
31 VUNSPEC_SYNC_ISTREAM ; sequence of insns to sync the I-stream
32 VUNSPEC_PEM ; 'procedure_entry_mask' insn.
33
34 VUNSPEC_EH_RETURN
35 ])
36
37 ;; UNSPEC usage:
38
39 (define_c_enum "unspec" [
40 UNSPEC_SETMEM_FILL ; 'fill' operand to 'setmem' insn.
41 ])
42
43 (define_constants
44 [(VAX_AP_REGNUM 12) ; Register 12 contains the argument pointer
45 (VAX_FP_REGNUM 13) ; Register 13 contains the frame pointer
46 (VAX_SP_REGNUM 14) ; Register 14 contains the stack pointer
47 (VAX_PC_REGNUM 15) ; Register 15 contains the program counter
48 (VAX_PSL_REGNUM 16) ; Register 16 contains the processor status
49 ; and condition codes in particular
50 ]
51 )
52
53 ;; Integer modes supported on VAX, with a mapping from machine mode
54 ;; to mnemonic suffix. DImode is always a special case.
55 (define_mode_iterator VAXint [QI HI SI])
56 (define_mode_iterator VAXintQH [QI HI])
57 (define_mode_iterator VAXintQHSD [QI HI SI DI])
58 (define_mode_attr isfx [(QI "b") (HI "w") (SI "l") (DI "q")])
59
60 ;; Similar for float modes supported on VAX.
61 (define_mode_iterator VAXfp [SF DF])
62 (define_mode_attr fsfx [(SF "f") (DF "%#")])
63
64 ;; Some output patterns want integer immediates with a prefix...
65 (define_mode_attr iprefx [(QI "B") (HI "H") (SI "N")])
66
67 (define_mode_iterator VAXcc [CC CCN CCNZ CCZ])
68 (define_mode_iterator VAXccnz [CCN CCNZ CCZ])
69
70 (define_code_iterator any_extract [sign_extract zero_extract])
71
72 ;;
73 (include "constraints.md")
74 (include "predicates.md")
75
76 ;; Make instructions that set the N, N+Z, and Z condition codes respectively.
77 (define_subst "subst_<mode>"
78 [(set (match_operand 0 "")
79 (match_operand 1 ""))
80 (clobber (reg:CC VAX_PSL_REGNUM))]
81 ""
82 [(set (reg:VAXccnz VAX_PSL_REGNUM)
83 (compare:VAXccnz (match_dup 1)
84 (const_int 0)))
85 (set (match_dup 0)
86 (match_dup 1))])
87
88 (define_subst "subst_f<VAXccnz:mode>"
89 [(set (match_operand:VAXfp 0 "")
90 (match_operand:VAXfp 1 ""))
91 (clobber (reg:CC VAX_PSL_REGNUM))]
92 ""
93 [(set (reg:VAXccnz VAX_PSL_REGNUM)
94 (compare:VAXccnz (match_dup 1)
95 (const_double_zero:VAXfp)))
96 (set (match_dup 0)
97 (match_dup 1))])
98
99 ;; Select all from the attributes below that apply to a given insn that
100 ;; has a clobber on CC for the comparison elimination pass to use it in
101 ;; place of a subsequent comparison instruction matching the mode used
102 ;; by a comparison operator in branch.
103 ;;
104 ;; For example a branch doing `eq' in SImode will use `*cmpsi_ccz', so
105 ;; to eliminate it a `*movsi_ccz', etc. pattern will be required via the
106 ;; `ccz' substitution. Analogously for the other CC modes.
107 ;;
108 ;; The general `cc' mode, which sets all of the C, N, V and Z condition
109 ;; codes, has to be handled specially as it makes no sense for the usual
110 ;; comparison against zero, so no substitution has been defined for it.
111 (define_subst_attr "ccn" "subst_ccn" "" "_ccn")
112 (define_subst_attr "ccnz" "subst_ccnz" "" "_ccnz")
113 (define_subst_attr "ccz" "subst_ccz" "" "_ccz")
114 (define_subst_attr "fccn" "subst_fccn" "" "_ccn")
115 (define_subst_attr "fccnz" "subst_fccnz" "" "_ccnz")
116 (define_subst_attr "fccz" "subst_fccz" "" "_ccz")
117
118 (define_insn "*cmp<VAXint:mode>_<VAXcc:mode>"
119 [(set (reg:VAXcc VAX_PSL_REGNUM)
120 (compare:VAXcc (match_operand:VAXint 0 "general_operand" "nrmT,nrmT")
121 (match_operand:VAXint 1 "general_operand" "I,nrmT")))]
122 "reload_completed"
123 "@
124 tst<VAXint:isfx> %0
125 cmp<VAXint:isfx> %0,%1")
126
127 ;; We don't have a CMPQ instruction, but we can set the N and Z condition
128 ;; codes with MOVQ, and also this comparison can be folded into a preceding
129 ;; operation by the post-reload comparison elimination pass.
130 (define_insn "*cmpdi_<VAXccnz:mode>"
131 [(set (reg:VAXccnz VAX_PSL_REGNUM)
132 (compare:VAXccnz (match_operand:DI 0 "general_operand" "r,nmT")
133 (match_operand:DI 1 "const_zero_operand" "I,I")))
134 (clobber (match_scratch:DI 2 "=X,r"))]
135 "reload_completed"
136 "@
137 movq %0,%0
138 movq %0,%2")
139
140 (define_insn "*cmp<VAXfp:mode>_<VAXccnz:mode>"
141 [(set (reg:VAXccnz VAX_PSL_REGNUM)
142 (compare:VAXccnz (match_operand:VAXfp 0 "general_operand" "gF,gF")
143 (match_operand:VAXfp 1 "general_operand" "G,gF")))]
144 "reload_completed"
145 "@
146 tst<VAXfp:fsfx> %0
147 cmp<VAXfp:fsfx> %0,%1")
148
149 (define_insn "*bit<VAXint:mode>_<VAXccnz:mode>"
150 [(set (reg:VAXccnz VAX_PSL_REGNUM)
151 (compare:VAXccnz
152 (and:VAXint (match_operand:VAXint 0 "general_operand" "nrmT")
153 (match_operand:VAXint 1 "general_operand" "nrmT"))
154 (const_int 0)))]
155 "reload_completed"
156 "bit<VAXint:isfx> %0,%1")
157
158 ;; The VAX has no sCOND insns. It does have add/subtract with carry
159 ;; which could be used to implement the sltu and sgeu patterns. However,
160 ;; to do this properly requires a complete rewrite of the compare insns
161 ;; to keep them together with the sltu/sgeu insns until after the
162 ;; reload pass is complete. The previous implementation didn't do this
163 ;; and has been deleted.
164
165
167 (define_insn_and_split "mov<mode>"
168 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
169 (match_operand:VAXfp 1 "general_operand" "G,gF"))]
170 ""
171 "#"
172 "reload_completed"
173 [(parallel
174 [(set (match_dup 0)
175 (match_dup 1))
176 (clobber (reg:CC VAX_PSL_REGNUM))])]
177 "")
178
179 (define_insn "*mov<mode><fccn><fccnz><fccz>"
180 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
181 (match_operand:VAXfp 1 "general_operand" "G,gF"))
182 (clobber (reg:CC VAX_PSL_REGNUM))]
183 "reload_completed"
184 "@
185 clr<VAXfp:fsfx> %0
186 mov<VAXfp:fsfx> %1,%0")
187
188 ;; Some VAXen don't support this instruction.
189 ;;(define_insn_and_split "movti"
190 ;; [(set (match_operand:TI 0 "nonimmediate_operand" "=g")
191 ;; (match_operand:TI 1 "general_operand" "g"))]
192 ;; ""
193 ;; "#"
194 ;; "reload_completed"
195 ;; [(parallel
196 ;; [(set (match_dup 0)
197 ;; (match_dup 1))
198 ;; (clobber (reg:CC VAX_PSL_REGNUM))])]
199 ;; "")
200 ;;
201 ;;(define_insn "*movti<ccn><ccnz><ccz>"
202 ;; [(set (match_operand:TI 0 "nonimmediate_operand" "=g")
203 ;; (match_operand:TI 1 "general_operand" "g"))
204 ;; (clobber (reg:CC VAX_PSL_REGNUM))]
205 ;; "reload_completed"
206 ;; "movo %1,%0")
207
208 (define_insn_and_split "movdi"
209 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
210 (match_operand:DI 1 "general_operand" "g"))]
211 ""
212 "#"
213 "reload_completed"
214 [(parallel
215 [(set (match_dup 0)
216 (match_dup 1))
217 (clobber (reg:CC VAX_PSL_REGNUM))])]
218 "")
219
220 ;; In some cases `vax_output_int_move' splits a `DImode' move into a pair
221 ;; of `SImode' moves, in which case the flags aren't usefully set. Have
222 ;; separate patterns then, for the cases where the move may and may not be
223 ;; split each. We use the outer condition only so in some cases we will
224 ;; fail to notice the move does not actually get split, but this is OK.
225 (define_insn "*movdi_maybe_split"
226 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
227 (match_operand:DI 1 "general_operand" "g"))
228 (clobber (reg:CC VAX_PSL_REGNUM))]
229 "reload_completed && vax_maybe_split_dimode_move (operands)"
230 "* return vax_output_int_move (insn, operands, DImode);")
231
232 (define_insn "*movdi_unsplit<ccn><ccnz><ccz>"
233 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
234 (match_operand:DI 1 "general_operand" "g"))
235 (clobber (reg:CC VAX_PSL_REGNUM))]
236 "reload_completed && !vax_maybe_split_dimode_move (operands)"
237 "* return vax_output_int_move (insn, operands, DImode);")
238
239 ;; The VAX move instructions have space-time tradeoffs. On a MicroVAX
240 ;; register-register mov instructions take 3 bytes and 2 CPU cycles. clrl
241 ;; takes 2 bytes and 3 cycles. mov from constant to register takes 2 cycles
242 ;; if the constant is smaller than 4 bytes, 3 cycles for a longword
243 ;; constant. movz, mneg, and mcom are as fast as mov, so movzwl is faster
244 ;; than movl for positive constants that fit in 16 bits but not 6 bits. cvt
245 ;; instructions take 4 cycles. inc takes 3 cycles. The machine description
246 ;; is willing to trade 1 byte for 1 cycle (clrl instead of movl $0; cvtwl
247 ;; instead of movl).
248
249 ;; Cycle counts for other models may vary (on a VAX 750 they are similar,
250 ;; but on a VAX 9000 most move and add instructions with one constant
251 ;; operand take 1 cycle).
252
253 ;; Loads of constants between 64 and 128 used to be done with
254 ;; "addl3 $63,#,dst" but this is slower than movzbl and takes as much space.
255
256 (define_expand "movsi"
257 [(set (match_operand:SI 0 "nonimmediate_operand" "")
258 (match_operand:SI 1 "general_operand" ""))]
259 ""
260 "
261 {
262 #ifdef NO_EXTERNAL_INDIRECT_ADDRESS
263 if (flag_pic
264 && GET_CODE (operands[1]) == CONST
265 && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF
266 && !SYMBOL_REF_LOCAL_P (XEXP (XEXP (operands[1], 0), 0)))
267 {
268 rtx symbol_ref = XEXP (XEXP (operands[1], 0), 0);
269 rtx const_int = XEXP (XEXP (operands[1], 0), 1);
270 rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
271 emit_move_insn (temp, symbol_ref);
272 emit_move_insn (operands[0], gen_rtx_PLUS (SImode, temp, const_int));
273 DONE;
274 }
275 #endif
276 }")
277
278 ;; Split a store of the upper half of a 64 bit value in memory into
279 ;; two operations.
280 (define_split
281 [(set (match_operand:SI 0 "nonimmediate_operand" "")
282 (subreg:SI
283 (match_operand:DI 1 "indexed_memory_operand" "")
284 4
285 )
286 )
287 (clobber (match_scratch:DI 2 ""))
288 ]
289 ""
290 [
291 (set (match_dup 2)
292 (match_dup 1)
293 )
294 (set (match_dup 0)
295 (subreg:SI (match_dup 2) 4)
296 )
297 ]
298 )
299
300 (define_insn_and_split "movsi_2"
301 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
302 (match_operand:SI 1 "nonsymbolic_operand" "nrmT"))]
303 ""
304 "#"
305 "reload_completed"
306 [(parallel
307 [(set (match_dup 0)
308 (match_dup 1))
309 (clobber (reg:CC VAX_PSL_REGNUM))])]
310 "")
311
312 (define_insn "*movsi_2<ccn><ccnz><ccz>"
313 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
314 (match_operand:SI 1 "nonsymbolic_operand" "nrmT"))
315 (clobber (reg:CC VAX_PSL_REGNUM))]
316 "reload_completed"
317 "* return vax_output_int_move (insn, operands, SImode);")
318
319 (define_insn_and_split "mov<mode>"
320 [(set (match_operand:VAXintQH 0 "nonimmediate_operand" "=g")
321 (match_operand:VAXintQH 1 "general_operand" "g"))]
322 ""
323 "#"
324 "reload_completed"
325 [(parallel
326 [(set (match_dup 0)
327 (match_dup 1))
328 (clobber (reg:CC VAX_PSL_REGNUM))])]
329 "")
330
331 (define_insn "*mov<mode><ccn><ccnz><ccz>"
332 [(set (match_operand:VAXintQH 0 "nonimmediate_operand" "=g")
333 (match_operand:VAXintQH 1 "general_operand" "g"))
334 (clobber (reg:CC VAX_PSL_REGNUM))]
335 "reload_completed"
336 "* return vax_output_int_move (insn, operands, <MODE>mode);")
337
338 (define_insn_and_split "movstricthi"
339 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
340 (match_operand:HI 1 "general_operand" "g"))]
341 ""
342 "#"
343 "reload_completed"
344 [(parallel
345 [(set (strict_low_part (match_dup 0))
346 (match_dup 1))
347 (clobber (reg:CC VAX_PSL_REGNUM))])]
348 "")
349
350 (define_insn "*movstricthi<ccn><ccnz><ccz>"
351 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
352 (match_operand:HI 1 "general_operand" "g"))
353 (clobber (reg:CC VAX_PSL_REGNUM))]
354 "reload_completed"
355 "*
356 {
357 if (CONST_INT_P (operands[1]))
358 {
359 int i = INTVAL (operands[1]);
360 if (i == 0)
361 return \"clrw %0\";
362 else if ((unsigned int)i < 64)
363 return \"movw %1,%0\";
364 else if ((unsigned int)~i < 64)
365 return \"mcomw %H1,%0\";
366 else if ((unsigned int)i < 256)
367 return \"movzbw %1,%0\";
368 }
369 return \"movw %1,%0\";
370 }")
371
372 (define_insn_and_split "movstrictqi"
373 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r"))
374 (match_operand:QI 1 "general_operand" "g"))]
375 ""
376 "#"
377 "reload_completed"
378 [(parallel
379 [(set (strict_low_part (match_dup 0))
380 (match_dup 1))
381 (clobber (reg:CC VAX_PSL_REGNUM))])]
382 "")
383
384 (define_insn "*movstrictqi<ccn><ccnz><ccz>"
385 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+r"))
386 (match_operand:QI 1 "general_operand" "g"))
387 (clobber (reg:CC VAX_PSL_REGNUM))]
388 "reload_completed"
389 "*
390 {
391 if (CONST_INT_P (operands[1]))
392 {
393 int i = INTVAL (operands[1]);
394 if (i == 0)
395 return \"clrb %0\";
396 else if ((unsigned int)~i < 64)
397 return \"mcomb %B1,%0\";
398 }
399 return \"movb %1,%0\";
400 }")
401
402 ;; This is here to accept 4 arguments and pass the first 3 along
403 ;; to the movmemhi1 pattern that really does the work.
404 (define_expand "cpymemhi"
405 [(set (match_operand:BLK 0 "memory_operand" "")
406 (match_operand:BLK 1 "memory_operand" ""))
407 (use (match_operand:HI 2 "general_operand" ""))
408 (match_operand 3 "" "")]
409 ""
410 "
411 {
412 emit_insn (gen_movmemhi1 (operands[0], operands[1], operands[2]));
413 DONE;
414 }")
415
416 (define_expand "movmemhi"
417 [(set (match_operand:BLK 0 "memory_operand" "")
418 (match_operand:BLK 1 "memory_operand" ""))
419 (use (match_operand:HI 2 "general_operand" ""))
420 (match_operand 3 "" "")]
421 ""
422 "
423 {
424 emit_insn (gen_movmemhi1 (operands[0], operands[1], operands[2]));
425 DONE;
426 }")
427
428 ;; The definition of this insn does not really explain what it does,
429 ;; but it should suffice
430 ;; that anything generated as this insn will be recognized as one
431 ;; and that it won't successfully combine with anything.
432
433 (define_insn_and_split "movmemhi1"
434 [(set (match_operand:BLK 0 "memory_operand" "=o")
435 (match_operand:BLK 1 "memory_operand" "o"))
436 (use (match_operand:HI 2 "general_operand" "g"))
437 (clobber (reg:SI 0))
438 (clobber (reg:SI 1))
439 (clobber (reg:SI 2))
440 (clobber (reg:SI 3))
441 (clobber (reg:SI 4))
442 (clobber (reg:SI 5))]
443 ""
444 "#"
445 "reload_completed"
446 [(parallel
447 [(set (match_dup 0)
448 (match_dup 1))
449 (use (match_dup 2))
450 (clobber (reg:SI 0))
451 (clobber (reg:SI 1))
452 (clobber (reg:SI 2))
453 (clobber (reg:SI 3))
454 (clobber (reg:SI 4))
455 (clobber (reg:SI 5))
456 (clobber (reg:CC VAX_PSL_REGNUM))])]
457 "")
458
459 (define_insn "*movmemhi1"
460 [(set (match_operand:BLK 0 "memory_operand" "=o")
461 (match_operand:BLK 1 "memory_operand" "o"))
462 (use (match_operand:HI 2 "general_operand" "g"))
463 (clobber (reg:SI 0))
464 (clobber (reg:SI 1))
465 (clobber (reg:SI 2))
466 (clobber (reg:SI 3))
467 (clobber (reg:SI 4))
468 (clobber (reg:SI 5))
469 (clobber (reg:CC VAX_PSL_REGNUM))]
470 "reload_completed"
471 "movc3 %2,%1,%0")
472
473 ;; This is here to accept 4 arguments and pass the first 3 along
474 ;; to the setmemhi1 pattern that really does the work.
475 (define_expand "setmemhi"
476 [(set (match_operand:BLK 0 "memory_operand" "")
477 (match_operand:QI 2 "general_operand" ""))
478 (use (match_operand:HI 1 "general_operand" ""))
479 (match_operand 3 "" "")]
480 ""
481 "
482 {
483 emit_insn (gen_setmemhi1 (operands[0], operands[1], operands[2]));
484 DONE;
485 }")
486
487 ;; The srcaddr operand of MOVC5 is not dereferenced if srclen is zero, so we
488 ;; set it to (%ap) somewhat arbitrarily chosen for the shortest encoding.
489 (define_insn_and_split "setmemhi1"
490 [(set (match_operand:BLK 0 "memory_operand" "=o")
491 (unspec:BLK [(use (match_operand:QI 2 "general_operand" "g"))]
492 UNSPEC_SETMEM_FILL))
493 (use (match_operand:HI 1 "general_operand" "g"))
494 (clobber (reg:SI 0))
495 (clobber (reg:SI 1))
496 (clobber (reg:SI 2))
497 (clobber (reg:SI 3))
498 (clobber (reg:SI 4))
499 (clobber (reg:SI 5))]
500 ""
501 "#"
502 "reload_completed"
503 [(parallel
504 [(set (match_dup 0)
505 (unspec:BLK [(use (match_dup 2))] UNSPEC_SETMEM_FILL))
506 (use (match_dup 1))
507 (clobber (reg:SI 0))
508 (clobber (reg:SI 1))
509 (clobber (reg:SI 2))
510 (clobber (reg:SI 3))
511 (clobber (reg:SI 4))
512 (clobber (reg:SI 5))
513 (clobber (reg:CC VAX_PSL_REGNUM))])]
514 "")
515
516 (define_insn "*setmemhi1"
517 [(set (match_operand:BLK 0 "memory_operand" "=o")
518 (unspec:BLK [(use (match_operand:QI 2 "general_operand" "g"))]
519 UNSPEC_SETMEM_FILL))
520 (use (match_operand:HI 1 "general_operand" "g"))
521 (clobber (reg:SI 0))
522 (clobber (reg:SI 1))
523 (clobber (reg:SI 2))
524 (clobber (reg:SI 3))
525 (clobber (reg:SI 4))
526 (clobber (reg:SI 5))
527 (clobber (reg:CC VAX_PSL_REGNUM))]
528 "reload_completed"
529 "movc5 $0,(%%ap),%2,%1,%0")
530
532 ;; Extension and truncation insns.
533
534 (define_insn_and_split "truncsiqi2"
535 [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
536 (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "nrmT")))]
537 ""
538 "#"
539 "reload_completed"
540 [(parallel
541 [(set (match_dup 0)
542 (truncate:QI (match_dup 1)))
543 (clobber (reg:CC VAX_PSL_REGNUM))])]
544 "")
545
546 (define_insn "*truncsiqi2<ccn><ccnz><ccz>"
547 [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
548 (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "nrmT")))
549 (clobber (reg:CC VAX_PSL_REGNUM))]
550 "reload_completed"
551 "cvtlb %1,%0")
552
553 (define_insn_and_split "truncsihi2"
554 [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
555 (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "nrmT")))]
556 ""
557 "#"
558 "reload_completed"
559 [(parallel
560 [(set (match_dup 0)
561 (truncate:HI (match_dup 1)))
562 (clobber (reg:CC VAX_PSL_REGNUM))])]
563 "")
564
565 (define_insn "*truncsihi2<ccn><ccnz><ccz>"
566 [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
567 (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "nrmT")))
568 (clobber (reg:CC VAX_PSL_REGNUM))]
569 "reload_completed"
570 "cvtlw %1,%0")
571
572 (define_insn_and_split "trunchiqi2"
573 [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
574 (truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))]
575 ""
576 "#"
577 "reload_completed"
578 [(parallel
579 [(set (match_dup 0)
580 (truncate:QI (match_dup 1)))
581 (clobber (reg:CC VAX_PSL_REGNUM))])]
582 "")
583
584 (define_insn "*trunchiqi2<ccn><ccnz><ccz>"
585 [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
586 (truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))
587 (clobber (reg:CC VAX_PSL_REGNUM))]
588 "reload_completed"
589 "cvtwb %1,%0")
590
591 (define_insn_and_split "extendhisi2"
592 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
593 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
594 ""
595 "#"
596 "reload_completed"
597 [(parallel
598 [(set (match_dup 0)
599 (sign_extend:SI (match_dup 1)))
600 (clobber (reg:CC VAX_PSL_REGNUM))])]
601 "")
602
603 (define_insn "*extendhisi2<ccn><ccnz><ccz>"
604 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
605 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))
606 (clobber (reg:CC VAX_PSL_REGNUM))]
607 "reload_completed"
608 "cvtwl %1,%0")
609
610 (define_insn_and_split "extendqihi2"
611 [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
612 (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
613 ""
614 "#"
615 "reload_completed"
616 [(parallel
617 [(set (match_dup 0)
618 (sign_extend:HI (match_dup 1)))
619 (clobber (reg:CC VAX_PSL_REGNUM))])]
620 "")
621
622 (define_insn "*extendqihi2<ccn><ccnz><ccz>"
623 [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
624 (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))
625 (clobber (reg:CC VAX_PSL_REGNUM))]
626 "reload_completed"
627 "cvtbw %1,%0")
628
629 (define_insn_and_split "extendqisi2"
630 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
631 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
632 ""
633 "#"
634 "reload_completed"
635 [(parallel
636 [(set (match_dup 0)
637 (sign_extend:SI (match_dup 1)))
638 (clobber (reg:CC VAX_PSL_REGNUM))])]
639 "")
640
641 (define_insn "*extendqisi2<ccn><ccnz><ccz>"
642 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
643 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))
644 (clobber (reg:CC VAX_PSL_REGNUM))]
645 "reload_completed"
646 "cvtbl %1,%0")
647
648 (define_insn_and_split "extendsfdf2"
649 [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
650 (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))]
651 ""
652 "#"
653 "reload_completed"
654 [(parallel
655 [(set (match_dup 0)
656 (float_extend:DF (match_dup 1)))
657 (clobber (reg:CC VAX_PSL_REGNUM))])]
658 "")
659
660 (define_insn "*extendsfdf2<fccn><fccnz><fccz>"
661 [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
662 (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))
663 (clobber (reg:CC VAX_PSL_REGNUM))]
664 "reload_completed"
665 "cvtf%# %1,%0")
666
667 (define_insn_and_split "truncdfsf2"
668 [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
669 (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))]
670 ""
671 "#"
672 "reload_completed"
673 [(parallel
674 [(set (match_dup 0)
675 (float_truncate:SF (match_dup 1)))
676 (clobber (reg:CC VAX_PSL_REGNUM))])]
677 "")
678
679 (define_insn "*truncdfsf2<fccn><fccnz><fccz>"
680 [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
681 (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))
682 (clobber (reg:CC VAX_PSL_REGNUM))]
683 "reload_completed"
684 "cvt%#f %1,%0")
685
686 (define_insn_and_split "zero_extendhisi2"
687 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
688 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
689 ""
690 "#"
691 "reload_completed"
692 [(parallel
693 [(set (match_dup 0)
694 (zero_extend:SI (match_dup 1)))
695 (clobber (reg:CC VAX_PSL_REGNUM))])]
696 "")
697
698 (define_insn "*zero_extendhisi2<ccn><ccnz><ccz>"
699 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
700 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))
701 (clobber (reg:CC VAX_PSL_REGNUM))]
702 "reload_completed"
703 "movzwl %1,%0")
704
705 (define_insn_and_split "zero_extendqihi2"
706 [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
707 (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
708 ""
709 "#"
710 "reload_completed"
711 [(parallel
712 [(set (match_dup 0)
713 (zero_extend:HI (match_dup 1)))
714 (clobber (reg:CC VAX_PSL_REGNUM))])]
715 "")
716
717 (define_insn "*zero_extendqihi2<ccn><ccnz><ccz>"
718 [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
719 (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))
720 (clobber (reg:CC VAX_PSL_REGNUM))]
721 "reload_completed"
722 "movzbw %1,%0")
723
724 (define_insn_and_split "zero_extendqisi2"
725 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
726 (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
727 ""
728 "#"
729 "reload_completed"
730 [(parallel
731 [(set (match_dup 0)
732 (zero_extend:SI (match_dup 1)))
733 (clobber (reg:CC VAX_PSL_REGNUM))])]
734 "")
735
736 (define_insn "*zero_extendqisi2<ccn><ccnz><ccz>"
737 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
738 (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))
739 (clobber (reg:CC VAX_PSL_REGNUM))]
740 "reload_completed"
741 "movzbl %1,%0")
742
744 ;; Fix-to-float conversion insns.
745
746 (define_insn_and_split "float<VAXint:mode><VAXfp:mode>2"
747 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g")
748 (float:VAXfp (match_operand:VAXint 1 "nonimmediate_operand" "g")))]
749 ""
750 "#"
751 "reload_completed"
752 [(parallel
753 [(set (match_dup 0)
754 (float:VAXfp (match_dup 1)))
755 (clobber (reg:CC VAX_PSL_REGNUM))])]
756 "")
757
758 (define_insn "*float<VAXint:mode><VAXfp:mode>2<fccn><fccnz><fccz>"
759 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g")
760 (float:VAXfp (match_operand:VAXint 1 "nonimmediate_operand" "g")))
761 (clobber (reg:CC VAX_PSL_REGNUM))]
762 "reload_completed"
763 "cvt<VAXint:isfx><VAXfp:fsfx> %1,%0")
764
765 ;; Float-to-fix conversion insns.
766
767 (define_insn_and_split "fix_trunc<VAXfp:mode><VAXint:mode>2"
768 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
769 (fix:VAXint (match_operand:VAXfp 1 "general_operand" "gF")))]
770 ""
771 "#"
772 "reload_completed"
773 [(parallel
774 [(set (match_dup 0)
775 (fix:VAXint (match_dup 1)))
776 (clobber (reg:CC VAX_PSL_REGNUM))])]
777 "")
778
779 (define_insn "*fix_trunc<VAXfp:mode><VAXint:mode>2<ccn><ccnz><ccz>"
780 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
781 (fix:VAXint (match_operand:VAXfp 1 "general_operand" "gF")))
782 (clobber (reg:CC VAX_PSL_REGNUM))]
783 "reload_completed"
784 "cvt<VAXfp:fsfx><VAXint:isfx> %1,%0")
785
786 (define_expand "fixuns_trunc<VAXfp:mode><VAXint:mode>2"
787 [(set (match_operand:VAXint 0 "nonimmediate_operand" "")
788 (fix:VAXint (match_operand:VAXfp 1 "general_operand")))]
789 "")
790
792 ;;- All kinds of add instructions.
793
794 (define_insn_and_split "add<mode>3"
795 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g,g")
796 (plus:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF,gF")
797 (match_operand:VAXfp 2 "general_operand" "gF,0,gF")))]
798 ""
799 "#"
800 "reload_completed"
801 [(parallel
802 [(set (match_dup 0)
803 (plus:VAXfp (match_dup 1)
804 (match_dup 2)))
805 (clobber (reg:CC VAX_PSL_REGNUM))])]
806 "")
807
808 (define_insn "*add<mode>3<fccn><fccnz><fccz>"
809 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g,g")
810 (plus:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF,gF")
811 (match_operand:VAXfp 2 "general_operand" "gF,0,gF")))
812 (clobber (reg:CC VAX_PSL_REGNUM))]
813 "reload_completed"
814 "@
815 add<VAXfp:fsfx>2 %2,%0
816 add<VAXfp:fsfx>2 %1,%0
817 add<VAXfp:fsfx>3 %1,%2,%0")
818
819 (define_insn_and_split "add<mode>3"
820 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
821 (plus:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")
822 (match_operand:VAXint 2 "general_operand" "nrmT")))]
823 ""
824 "#"
825 "reload_completed"
826 [(parallel
827 [(set (match_dup 0)
828 (plus:VAXint (match_dup 1)
829 (match_dup 2)))
830 (clobber (reg:CC VAX_PSL_REGNUM))])]
831 "")
832
833 (define_insn "*add<mode>3<ccn><ccnz><ccz>"
834 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
835 (plus:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")
836 (match_operand:VAXint 2 "general_operand" "nrmT")))
837 (clobber (reg:CC VAX_PSL_REGNUM))]
838 "reload_completed"
839 "* return vax_output_int_add (insn, operands, <MODE>mode);")
840
841 (define_expand "adddi3"
842 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
843 (plus:DI (match_operand:DI 1 "general_operand" "g")
844 (match_operand:DI 2 "general_operand" "g")))]
845 "!reload_in_progress"
846 "vax_expand_addsub_di_operands (operands, PLUS); DONE;")
847
848 (define_insn_and_split "adcdi3"
849 [(set (match_operand:DI 0 "nonimmediate_addsub_di_operand" "=Rr")
850 (plus:DI (match_operand:DI 1 "general_addsub_di_operand" "%0")
851 (match_operand:DI 2 "general_addsub_di_operand" "nRr")))]
852 "TARGET_QMATH"
853 "#"
854 "&& reload_completed"
855 [(parallel
856 [(set (match_dup 0)
857 (plus:DI (match_dup 1)
858 (match_dup 2)))
859 (clobber (reg:CC VAX_PSL_REGNUM))])]
860 "")
861
862 (define_insn "*adcdi3<ccn>"
863 [(set (match_operand:DI 0 "nonimmediate_addsub_di_operand" "=Rr")
864 (plus:DI (match_operand:DI 1 "general_addsub_di_operand" "%0")
865 (match_operand:DI 2 "general_addsub_di_operand" "nRr")))
866 (clobber (reg:CC VAX_PSL_REGNUM))]
867 "TARGET_QMATH && reload_completed"
868 "* return vax_output_int_add (insn, operands, DImode);")
869
870 ;; The add-with-carry (adwc) instruction only accepts two operands.
871 (define_insn_and_split "adddi3_old"
872 [(set (match_operand:DI 0 "nonimmediate_operand" "=ro>,ro>")
873 (plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")
874 (match_operand:DI 2 "general_operand" "Fsro,Fs")))]
875 "!TARGET_QMATH"
876 "#"
877 "&& reload_completed"
878 [(parallel
879 [(set (match_dup 0)
880 (plus:DI (match_dup 1)
881 (match_dup 2)))
882 (clobber (reg:CC VAX_PSL_REGNUM))])]
883 "")
884
885 (define_insn "*adddi3_old<ccn>"
886 [(set (match_operand:DI 0 "nonimmediate_operand" "=ro>,ro>")
887 (plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")
888 (match_operand:DI 2 "general_operand" "Fsro,Fs")))
889 (clobber (reg:CC VAX_PSL_REGNUM))]
890 "!TARGET_QMATH && reload_completed"
891 "* return vax_output_int_add (insn, operands, DImode);")
892
894 ;;- All kinds of subtract instructions.
895
896 (define_insn_and_split "sub<mode>3"
897 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
898 (minus:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF")
899 (match_operand:VAXfp 2 "general_operand" "gF,gF")))]
900 ""
901 "#"
902 "reload_completed"
903 [(parallel
904 [(set (match_dup 0)
905 (minus:VAXfp (match_dup 1)
906 (match_dup 2)))
907 (clobber (reg:CC VAX_PSL_REGNUM))])]
908 "")
909
910 (define_insn "*sub<mode>3<fccn><fccnz><fccz>"
911 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
912 (minus:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF")
913 (match_operand:VAXfp 2 "general_operand" "gF,gF")))
914 (clobber (reg:CC VAX_PSL_REGNUM))]
915 "reload_completed"
916 "@
917 sub<VAXfp:fsfx>2 %2,%0
918 sub<VAXfp:fsfx>3 %2,%1,%0")
919
920 (define_insn_and_split "sub<mode>3"
921 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
922 (minus:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
923 (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))]
924 ""
925 "#"
926 "reload_completed"
927 [(parallel
928 [(set (match_dup 0)
929 (minus:VAXint (match_dup 1)
930 (match_dup 2)))
931 (clobber (reg:CC VAX_PSL_REGNUM))])]
932 "")
933
934 (define_insn "*sub<mode>3<ccn><ccnz><ccz>"
935 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
936 (minus:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
937 (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))
938 (clobber (reg:CC VAX_PSL_REGNUM))]
939 "reload_completed"
940 "@
941 sub<VAXint:isfx>2 %2,%0
942 sub<VAXint:isfx>3 %2,%1,%0")
943
944 (define_insn "*sub<mode>3_cc"
945 [(set (reg:CC VAX_PSL_REGNUM)
946 (compare:CC (match_operand:VAXint 1 "general_operand" "0,nrmT")
947 (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))
948 (set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
949 (minus:VAXint (match_dup 1)
950 (match_dup 2)))]
951 "reload_completed"
952 "@
953 sub<VAXint:isfx>2 %2,%0
954 sub<VAXint:isfx>3 %2,%1,%0")
955
956 (define_expand "subdi3"
957 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
958 (minus:DI (match_operand:DI 1 "general_operand" "g")
959 (match_operand:DI 2 "general_operand" "g")))]
960 "!reload_in_progress"
961 "vax_expand_addsub_di_operands (operands, MINUS); DONE;")
962
963 (define_insn_and_split "sbcdi3"
964 [(set (match_operand:DI 0 "nonimmediate_addsub_di_operand" "=&Rr,&Rr")
965 (minus:DI (match_operand:DI 1 "general_addsub_di_operand" "0,I")
966 (match_operand:DI 2 "general_addsub_di_operand" "nRr,Rr")))]
967 "TARGET_QMATH"
968 "#"
969 "&& reload_completed"
970 [(parallel
971 [(set (match_dup 0)
972 (minus:DI (match_dup 1)
973 (match_dup 2)))
974 (clobber (reg:CC VAX_PSL_REGNUM))])]
975 "")
976
977 (define_insn "*sbcdi3<ccn>"
978 [(set (match_operand:DI 0 "nonimmediate_addsub_di_operand" "=&Rr,&Rr")
979 (minus:DI (match_operand:DI 1 "general_addsub_di_operand" "0,I")
980 (match_operand:DI 2 "general_addsub_di_operand" "nRr,Rr")))
981 (clobber (reg:CC VAX_PSL_REGNUM))]
982 "TARGET_QMATH && reload_completed"
983 "* return vax_output_int_subtract (insn, operands, DImode);")
984
985 ;; The subtract-with-carry (sbwc) instruction only takes two operands.
986 (define_insn_and_split "subdi3_old"
987 [(set (match_operand:DI 0 "nonimmediate_operand" "=or>,or>")
988 (minus:DI (match_operand:DI 1 "general_operand" "0,or>")
989 (match_operand:DI 2 "general_operand" "Fsor,Fs")))]
990 "!TARGET_QMATH"
991 "#"
992 "&& reload_completed"
993 [(parallel
994 [(set (match_dup 0)
995 (minus:DI (match_dup 1)
996 (match_dup 2)))
997 (clobber (reg:CC VAX_PSL_REGNUM))])]
998 "")
999
1000 (define_insn "*subdi3_old<ccn>"
1001 [(set (match_operand:DI 0 "nonimmediate_operand" "=or>,or>")
1002 (minus:DI (match_operand:DI 1 "general_operand" "0,or>")
1003 (match_operand:DI 2 "general_operand" "Fsor,Fs")))
1004 (clobber (reg:CC VAX_PSL_REGNUM))]
1005 "!TARGET_QMATH && reload_completed"
1006 "* return vax_output_int_subtract (insn, operands, DImode);")
1007
1009 ;;- Multiply instructions.
1010
1011 (define_insn_and_split "mul<mode>3"
1012 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g,g")
1013 (mult:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF,gF")
1014 (match_operand:VAXfp 2 "general_operand" "gF,0,gF")))]
1015 ""
1016 "#"
1017 "reload_completed"
1018 [(parallel
1019 [(set (match_dup 0)
1020 (mult:VAXfp (match_dup 1)
1021 (match_dup 2)))
1022 (clobber (reg:CC VAX_PSL_REGNUM))])]
1023 "")
1024
1025 (define_insn "*mul<mode>3<fccn><fccnz><fccz>"
1026 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g,g")
1027 (mult:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF,gF")
1028 (match_operand:VAXfp 2 "general_operand" "gF,0,gF")))
1029 (clobber (reg:CC VAX_PSL_REGNUM))]
1030 "reload_completed"
1031 "@
1032 mul<VAXfp:fsfx>2 %2,%0
1033 mul<VAXfp:fsfx>2 %1,%0
1034 mul<VAXfp:fsfx>3 %1,%2,%0")
1035
1036 (define_insn_and_split "mul<mode>3"
1037 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
1038 (mult:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
1039 (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))]
1040 ""
1041 "#"
1042 "reload_completed"
1043 [(parallel
1044 [(set (match_dup 0)
1045 (mult:VAXint (match_dup 1)
1046 (match_dup 2)))
1047 (clobber (reg:CC VAX_PSL_REGNUM))])]
1048 "")
1049
1050 (define_insn "*mul<mode>3<ccn><ccnz><ccz>"
1051 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
1052 (mult:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
1053 (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))
1054 (clobber (reg:CC VAX_PSL_REGNUM))]
1055 "reload_completed"
1056 "@
1057 mul<VAXint:isfx>2 %2,%0
1058 mul<VAXint:isfx>2 %1,%0
1059 mul<VAXint:isfx>3 %1,%2,%0")
1060
1061 (define_insn_and_split "mulsidi3"
1062 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1063 (mult:DI
1064 (sign_extend:DI (match_operand:SI 1 "general_operand" "nrmT"))
1065 (sign_extend:DI (match_operand:SI 2 "general_operand" "nrmT"))))]
1066 ""
1067 "#"
1068 "reload_completed"
1069 [(parallel
1070 [(set (match_dup 0)
1071 (mult:DI
1072 (sign_extend:DI (match_dup 1))
1073 (sign_extend:DI (match_dup 2))))
1074 (clobber (reg:CC VAX_PSL_REGNUM))])]
1075 "")
1076
1077 (define_insn "*mulsidi3<ccn><ccnz><ccz>"
1078 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1079 (mult:DI
1080 (sign_extend:DI (match_operand:SI 1 "general_operand" "nrmT"))
1081 (sign_extend:DI (match_operand:SI 2 "general_operand" "nrmT"))))
1082 (clobber (reg:CC VAX_PSL_REGNUM))]
1083 "reload_completed"
1084 "emul %1,%2,$0,%0")
1085
1086 (define_insn_and_split "*maddsidi4"
1087 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1088 (plus:DI
1089 (mult:DI
1090 (sign_extend:DI (match_operand:SI 1 "general_operand" "nrmT"))
1091 (sign_extend:DI (match_operand:SI 2 "general_operand" "nrmT")))
1092 (sign_extend:DI (match_operand:SI 3 "general_operand" "g"))))]
1093 ""
1094 "#"
1095 "reload_completed"
1096 [(parallel
1097 [(set (match_dup 0)
1098 (plus:DI
1099 (mult:DI
1100 (sign_extend:DI (match_dup 1))
1101 (sign_extend:DI (match_dup 2)))
1102 (sign_extend:DI (match_dup 3))))
1103 (clobber (reg:CC VAX_PSL_REGNUM))])]
1104 "")
1105
1106 (define_insn "*maddsidi4_2<ccn><ccnz><ccz>"
1107 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1108 (plus:DI
1109 (mult:DI
1110 (sign_extend:DI (match_operand:SI 1 "general_operand" "nrmT"))
1111 (sign_extend:DI (match_operand:SI 2 "general_operand" "nrmT")))
1112 (sign_extend:DI (match_operand:SI 3 "nonimmediate_operand" "g"))))
1113 (clobber (reg:CC VAX_PSL_REGNUM))]
1114 "reload_completed"
1115 "emul %1,%2,%3,%0")
1116
1117 ;; 'F' constraint means type CONST_DOUBLE
1118 (define_insn_and_split "*maddsidi4_const"
1119 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1120 (plus:DI
1121 (mult:DI
1122 (sign_extend:DI (match_operand:SI 1 "general_operand" "nrmT"))
1123 (sign_extend:DI (match_operand:SI 2 "general_operand" "nrmT")))
1124 (match_operand:DI 3 "immediate_operand" "F")))]
1125 "GET_CODE (operands[3]) == CONST_DOUBLE
1126 && CONST_DOUBLE_HIGH (operands[3]) == (CONST_DOUBLE_LOW (operands[3]) >> 31)"
1127 "#"
1128 "&& reload_completed"
1129 [(parallel
1130 [(set (match_dup 0)
1131 (plus:DI
1132 (mult:DI
1133 (sign_extend:DI (match_dup 1))
1134 (sign_extend:DI (match_dup 2)))
1135 (match_dup 3)))
1136 (clobber (reg:CC VAX_PSL_REGNUM))])]
1137 "")
1138
1139 (define_insn "*maddsidi4_const_2<ccn><ccnz><ccz>"
1140 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1141 (plus:DI
1142 (mult:DI
1143 (sign_extend:DI (match_operand:SI 1 "general_operand" "nrmT"))
1144 (sign_extend:DI (match_operand:SI 2 "general_operand" "nrmT")))
1145 (match_operand:DI 3 "immediate_operand" "F")))
1146 (clobber (reg:CC VAX_PSL_REGNUM))]
1147 "GET_CODE (operands[3]) == CONST_DOUBLE
1148 && CONST_DOUBLE_HIGH (operands[3]) == (CONST_DOUBLE_LOW (operands[3]) >> 31)
1149 && reload_completed"
1150 "*
1151 {
1152 if (CONST_DOUBLE_HIGH (operands[3]))
1153 operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[3]));
1154 return \"emul %1,%2,%3,%0\";
1155 }")
1156
1158 ;;- Divide instructions.
1159
1160 (define_insn_and_split "div<mode>3"
1161 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
1162 (div:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF")
1163 (match_operand:VAXfp 2 "general_operand" "gF,gF")))]
1164 ""
1165 "#"
1166 "reload_completed"
1167 [(parallel
1168 [(set (match_dup 0)
1169 (div:VAXfp (match_dup 1)
1170 (match_dup 2)))
1171 (clobber (reg:CC VAX_PSL_REGNUM))])]
1172 "")
1173
1174 (define_insn "*div<mode>3<fccn><fccnz><fccz>"
1175 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
1176 (div:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF")
1177 (match_operand:VAXfp 2 "general_operand" "gF,gF")))
1178 (clobber (reg:CC VAX_PSL_REGNUM))]
1179 "reload_completed"
1180 "@
1181 div<VAXfp:fsfx>2 %2,%0
1182 div<VAXfp:fsfx>3 %2,%1,%0")
1183
1184 (define_insn_and_split "div<mode>3"
1185 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1186 (div:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
1187 (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))]
1188 ""
1189 "#"
1190 "reload_completed"
1191 [(parallel
1192 [(set (match_dup 0)
1193 (div:VAXint (match_dup 1)
1194 (match_dup 2)))
1195 (clobber (reg:CC VAX_PSL_REGNUM))])]
1196 "")
1197
1198 (define_insn "*div<mode>3<ccn><ccnz><ccz>"
1199 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1200 (div:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
1201 (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))
1202 (clobber (reg:CC VAX_PSL_REGNUM))]
1203 "reload_completed"
1204 "@
1205 div<VAXint:isfx>2 %2,%0
1206 div<VAXint:isfx>3 %2,%1,%0")
1207
1208 ;; This is left out because it is very slow;
1209 ;; we are better off programming around the "lack" of this insn.
1210 ;;(define_insn_and_split "divmoddisi4"
1211 ;; [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1212 ;; (div:SI (match_operand:DI 1 "general_operand" "g")
1213 ;; (match_operand:SI 2 "general_operand" "g")))
1214 ;; (set (match_operand:SI 3 "nonimmediate_operand" "=g")
1215 ;; (mod:SI (match_dup 1)
1216 ;; (match_dup 2)))]
1217 ;; ""
1218 ;; "#"
1219 ;; "reload_completed"
1220 ;; [(parallel
1221 ;; [(set (match_dup 0)
1222 ;; (div:SI (match_dup 1)
1223 ;; (match_dup 2)))
1224 ;; (set (match_dup 3)
1225 ;; (mod:SI (match_dup 1)
1226 ;; (match_dup 2)))
1227 ;; (clobber (reg:CC VAX_PSL_REGNUM))])]
1228 ;; "")
1229 ;;
1230 ;;(define_insn "*divmoddisi4<ccn><ccnz><ccz>"
1231 ;; [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1232 ;; (div:SI (match_operand:DI 1 "general_operand" "g")
1233 ;; (match_operand:SI 2 "general_operand" "g")))
1234 ;; (set (match_operand:SI 3 "nonimmediate_operand" "=g")
1235 ;; (mod:SI (match_dup 1)
1236 ;; (match_dup 2)))
1237 ;; (clobber (reg:CC VAX_PSL_REGNUM))]
1238 ;; "reload_completed"
1239 ;; "ediv %2,%1,%0,%3")
1240
1242 ;; Bit-and on the VAX is done with a clear-bits insn.
1243 (define_expand "and<mode>3"
1244 [(set (match_operand:VAXint 0 "nonimmediate_operand" "")
1245 (and:VAXint (not:VAXint (match_operand:VAXint 1 "general_operand" ""))
1246 (match_operand:VAXint 2 "general_operand" "")))]
1247 ""
1248 "
1249 {
1250 rtx op1 = operands[1];
1251
1252 /* If there is a constant argument, complement that one. */
1253 if (CONST_INT_P (operands[2]) && ! CONST_INT_P (op1))
1254 {
1255 operands[1] = operands[2];
1256 operands[2] = op1;
1257 op1 = operands[1];
1258 }
1259
1260 if (CONST_INT_P (op1))
1261 operands[1] = GEN_INT (~INTVAL (op1));
1262 else
1263 operands[1] = expand_unop (<MODE>mode, one_cmpl_optab, op1, 0, 1);
1264 }")
1265
1266 (define_insn_and_split "*and<mode>3"
1267 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1268 (and:VAXint (not:VAXint
1269 (match_operand:VAXint 1 "general_operand" "nrmT,nrmT"))
1270 (match_operand:VAXint 2 "general_operand" "0,nrmT")))]
1271 ""
1272 "#"
1273 "reload_completed"
1274 [(parallel
1275 [(set (match_dup 0)
1276 (and:VAXint (not:VAXint
1277 (match_dup 1))
1278 (match_dup 2)))
1279 (clobber (reg:CC VAX_PSL_REGNUM))])]
1280 "")
1281
1282 (define_insn "*and<mode>3_2<ccn><ccnz><ccz>"
1283 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1284 (and:VAXint (not:VAXint
1285 (match_operand:VAXint 1 "general_operand" "nrmT,nrmT"))
1286 (match_operand:VAXint 2 "general_operand" "0,nrmT")))
1287 (clobber (reg:CC VAX_PSL_REGNUM))]
1288 "reload_completed"
1289 "@
1290 bic<VAXint:isfx>2 %1,%0
1291 bic<VAXint:isfx>3 %1,%2,%0")
1292
1293 ;; The following used to be needed because constant propagation can
1294 ;; create them starting from the bic insn patterns above. This is no
1295 ;; longer a problem. However, having these patterns allows optimization
1296 ;; opportunities in combine.cc.
1297
1298 (define_insn_and_split "*and<mode>3_const_int"
1299 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1300 (and:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
1301 (match_operand:VAXint 2 "const_int_operand" "n,n")))]
1302 ""
1303 "#"
1304 "reload_completed"
1305 [(parallel
1306 [(set (match_dup 0)
1307 (and:VAXint (match_dup 1)
1308 (match_dup 2)))
1309 (clobber (reg:CC VAX_PSL_REGNUM))])]
1310 "")
1311
1312 (define_insn "*and<mode>3_2_const_int<ccn><ccnz><ccz>"
1313 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1314 (and:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
1315 (match_operand:VAXint 2 "const_int_operand" "n,n")))
1316 (clobber (reg:CC VAX_PSL_REGNUM))]
1317 "reload_completed"
1318 "@
1319 bic<VAXint:isfx>2 %<VAXint:iprefx>2,%0
1320 bic<VAXint:isfx>3 %<VAXint:iprefx>2,%1,%0")
1321
1322 ;; We have no direct AND operation and consequently the RTL sequence
1323 ;; the "and<mode>3" pattern produces does not match the instruction
1324 ;; the "*bit<mode>" pattern does for the purpose of the compare
1325 ;; elimination pass. Try to get rid of the extra operation by hand
1326 ;; and where the sequence is used to set the condition codes only
1327 ;; convert MCOM/BIC => BIT.
1328 (define_peephole2
1329 [(parallel
1330 [(set (match_operand:VAXint 0 "register_operand")
1331 (not:VAXint (match_operand:VAXint 1 "general_operand")))
1332 (clobber (reg:CC VAX_PSL_REGNUM))])
1333 (parallel
1334 [(set (reg:VAXccnz VAX_PSL_REGNUM)
1335 (compare:VAXccnz
1336 (and:VAXint (not:VAXint (match_dup 0))
1337 (match_operand:VAXint 3 "general_operand"))
1338 (const_int 0)))
1339 (set (match_operand:VAXint 2 "register_operand")
1340 (and:VAXint (not:VAXint (match_dup 0))
1341 (match_dup 3)))])]
1342 "peep2_reg_dead_p (2, operands[0]) && peep2_reg_dead_p (2, operands[2])"
1343 [(set (reg:VAXccnz VAX_PSL_REGNUM)
1344 (compare:VAXccnz
1345 (and:VAXint (match_dup 1)
1346 (match_dup 3))
1347 (const_int 0)))]
1348 "")
1349
1351 ;;- Bit set instructions.
1352
1353 (define_insn_and_split "ior<mode>3"
1354 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
1355 (ior:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
1356 (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))]
1357 ""
1358 "#"
1359 "reload_completed"
1360 [(parallel
1361 [(set (match_dup 0)
1362 (ior:VAXint (match_dup 1)
1363 (match_dup 2)))
1364 (clobber (reg:CC VAX_PSL_REGNUM))])]
1365 "")
1366
1367 (define_insn "*ior<mode>3<ccn><ccnz><ccz>"
1368 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
1369 (ior:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
1370 (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))
1371 (clobber (reg:CC VAX_PSL_REGNUM))]
1372 "reload_completed"
1373 "@
1374 bis<VAXint:isfx>2 %2,%0
1375 bis<VAXint:isfx>2 %1,%0
1376 bis<VAXint:isfx>3 %2,%1,%0")
1377
1378 ;;- xor instructions.
1379
1380 (define_insn_and_split "xor<mode>3"
1381 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
1382 (xor:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
1383 (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))]
1384 ""
1385 "#"
1386 "reload_completed"
1387 [(parallel
1388 [(set (match_dup 0)
1389 (xor:VAXint (match_dup 1)
1390 (match_dup 2)))
1391 (clobber (reg:CC VAX_PSL_REGNUM))])]
1392 "")
1393
1394 (define_insn "*xor<mode>3<ccn><ccnz><ccz>"
1395 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
1396 (xor:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
1397 (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))
1398 (clobber (reg:CC VAX_PSL_REGNUM))]
1399 "reload_completed"
1400 "@
1401 xor<VAXint:isfx>2 %2,%0
1402 xor<VAXint:isfx>2 %1,%0
1403 xor<VAXint:isfx>3 %2,%1,%0")
1404
1406 (define_insn_and_split "neg<mode>2"
1407 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g")
1408 (neg:VAXfp (match_operand:VAXfp 1 "general_operand" "gF")))]
1409 ""
1410 "#"
1411 "reload_completed"
1412 [(parallel
1413 [(set (match_dup 0)
1414 (neg:VAXfp (match_dup 1)))
1415 (clobber (reg:CC VAX_PSL_REGNUM))])]
1416 "")
1417
1418 (define_insn "*neg<mode>2<fccn><fccnz><fccz>"
1419 [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g")
1420 (neg:VAXfp (match_operand:VAXfp 1 "general_operand" "gF")))
1421 (clobber (reg:CC VAX_PSL_REGNUM))]
1422 "reload_completed"
1423 "mneg<VAXfp:fsfx> %1,%0")
1424
1425 (define_insn_and_split "neg<mode>2"
1426 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
1427 (neg:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")))]
1428 ""
1429 "#"
1430 "reload_completed"
1431 [(parallel
1432 [(set (match_dup 0)
1433 (neg:VAXint (match_dup 1)))
1434 (clobber (reg:CC VAX_PSL_REGNUM))])]
1435 "")
1436
1437 (define_insn "*neg<mode>2<ccn><ccnz><ccz>"
1438 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
1439 (neg:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")))
1440 (clobber (reg:CC VAX_PSL_REGNUM))]
1441 "reload_completed"
1442 "mneg<VAXint:isfx> %1,%0")
1443
1444 (define_insn "*neg<mode>2_cc"
1445 [(set (reg:CC VAX_PSL_REGNUM)
1446 (compare:CC (const_int 0)
1447 (neg:VAXint
1448 (match_operand:VAXint 1 "general_operand" "0,nrmT"))))
1449 (set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
1450 (neg:VAXint (match_dup 1)))]
1451 "reload_completed"
1452 "mneg<VAXint:isfx> %1,%0")
1453
1454 (define_insn_and_split "one_cmpl<mode>2"
1455 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
1456 (not:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")))]
1457 ""
1458 "#"
1459 "reload_completed"
1460 [(parallel
1461 [(set (match_dup 0)
1462 (not:VAXint (match_dup 1)))
1463 (clobber (reg:CC VAX_PSL_REGNUM))])]
1464 "")
1465
1466 (define_insn "*one_cmpl<mode>2<ccn><ccnz><ccz>"
1467 [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
1468 (not:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")))
1469 (clobber (reg:CC VAX_PSL_REGNUM))]
1470 "reload_completed"
1471 "mcom<VAXint:isfx> %1,%0")
1472
1474 ;; Arithmetic right shift on the VAX works by negating the shift count,
1475 ;; then emitting a right shift with the shift count negated. This means
1476 ;; that all actual shift counts in the RTL will be positive. This
1477 ;; prevents converting shifts to ZERO_EXTRACTs with negative positions,
1478 ;; which isn't valid.
1479 (define_expand "ashrsi3"
1480 [(set (match_operand:SI 0 "general_operand" "=g")
1481 (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
1482 (match_operand:QI 2 "general_operand" "g")))]
1483 ""
1484 "
1485 {
1486 if (! CONST_INT_P(operands[2]))
1487 operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
1488 }")
1489
1490 (define_insn_and_split "*ashlnegsi3_const_int"
1491 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1492 (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
1493 (match_operand:QI 2 "const_int_operand" "n")))]
1494 ""
1495 "#"
1496 "reload_completed"
1497 [(parallel
1498 [(set (match_dup 0)
1499 (ashiftrt:SI (match_dup 1)
1500 (match_dup 2)))
1501 (clobber (reg:CC VAX_PSL_REGNUM))])]
1502 "")
1503
1504 (define_insn "*ashlnegsi3_const_int_2<ccn><ccnz><ccz>"
1505 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1506 (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
1507 (match_operand:QI 2 "const_int_operand" "n")))
1508 (clobber (reg:CC VAX_PSL_REGNUM))]
1509 "reload_completed"
1510 "ashl $%n2,%1,%0")
1511
1512 (define_insn_and_split "*ashlnegsi3"
1513 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1514 (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
1515 (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
1516 ""
1517 "#"
1518 "reload_completed"
1519 [(parallel
1520 [(set (match_dup 0)
1521 (ashiftrt:SI (match_dup 1)
1522 (neg:QI (match_dup 2))))
1523 (clobber (reg:CC VAX_PSL_REGNUM))])]
1524 "")
1525
1526 (define_insn "*ashlnegsi3_2<ccn><ccnz><ccz>"
1527 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1528 (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
1529 (neg:QI (match_operand:QI 2 "general_operand" "g"))))
1530 (clobber (reg:CC VAX_PSL_REGNUM))]
1531 "reload_completed"
1532 "ashl %2,%1,%0")
1533
1534 (define_insn_and_split "ashlsi3"
1535 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1536 (ashift:SI (match_operand:SI 1 "general_operand" "nrmT")
1537 (match_operand:QI 2 "general_operand" "g")))]
1538 ""
1539 "#"
1540 "reload_completed"
1541 [(parallel
1542 [(set (match_dup 0)
1543 (ashift:SI (match_dup 1)
1544 (match_dup 2)))
1545 (clobber (reg:CC VAX_PSL_REGNUM))])]
1546 "")
1547
1548 (define_insn "*ashlsi3<ccn><ccnz><ccz>"
1549 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1550 (ashift:SI (match_operand:SI 1 "general_operand" "nrmT")
1551 (match_operand:QI 2 "general_operand" "g")))
1552 (clobber (reg:CC VAX_PSL_REGNUM))]
1553 "reload_completed"
1554 "*
1555 {
1556 if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
1557 return \"addl2 %0,%0\";
1558 if (REG_P (operands[1]) && CONST_INT_P (operands[2]))
1559 {
1560 int i = INTVAL (operands[2]);
1561 if (i == 1)
1562 return \"addl3 %1,%1,%0\";
1563 if (i == 2 && !optimize_size)
1564 {
1565 if (push_operand (operands[0], SImode))
1566 return \"pushal 0[%1]\";
1567 return \"moval 0[%1],%0\";
1568 }
1569 if (i == 3 && !optimize_size)
1570 {
1571 if (push_operand (operands[0], SImode))
1572 return \"pushaq 0[%1]\";
1573 return \"movaq 0[%1],%0\";
1574 }
1575 }
1576 return \"ashl %2,%1,%0\";
1577 }")
1578
1579 ;; Arithmetic right shift on the VAX works by negating the shift count.
1580 (define_expand "ashrdi3"
1581 [(set (match_operand:DI 0 "general_operand" "=g")
1582 (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
1583 (match_operand:QI 2 "general_operand" "g")))]
1584 ""
1585 "
1586 {
1587 operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
1588 }")
1589
1590 (define_insn_and_split "ashldi3"
1591 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1592 (ashift:DI (match_operand:DI 1 "general_operand" "g")
1593 (match_operand:QI 2 "general_operand" "g")))]
1594 ""
1595 "#"
1596 "reload_completed"
1597 [(parallel
1598 [(set (match_dup 0)
1599 (ashift:DI (match_dup 1)
1600 (match_dup 2)))
1601 (clobber (reg:CC VAX_PSL_REGNUM))])]
1602 "")
1603
1604 (define_insn "*ashldi3<ccn><ccnz><ccz>"
1605 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1606 (ashift:DI (match_operand:DI 1 "general_operand" "g")
1607 (match_operand:QI 2 "general_operand" "g")))
1608 (clobber (reg:CC VAX_PSL_REGNUM))]
1609 "reload_completed"
1610 "ashq %2,%D1,%0")
1611
1612 (define_insn_and_split "*ashlnegdi3"
1613 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1614 (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
1615 (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
1616 ""
1617 "#"
1618 "reload_completed"
1619 [(parallel
1620 [(set (match_dup 0)
1621 (ashiftrt:DI (match_dup 1)
1622 (neg:QI (match_dup 2))))
1623 (clobber (reg:CC VAX_PSL_REGNUM))])]
1624 "")
1625
1626 (define_insn "*ashlnegdi3_2<ccn><ccnz><ccz>"
1627 [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
1628 (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
1629 (neg:QI (match_operand:QI 2 "general_operand" "g"))))
1630 (clobber (reg:CC VAX_PSL_REGNUM))]
1631 "reload_completed"
1632 "ashq %2,%D1,%0")
1633
1634 ;; We used to have expand_shift handle logical right shifts by using extzv,
1635 ;; but this make it very difficult to do lshrdi3. Since the VAX is the
1636 ;; only machine with this kludge, it's better to just do this with a
1637 ;; define_expand and remove that case from expand_shift.
1638
1639 (define_expand "lshrsi3"
1640 [(set (match_dup 3)
1641 (minus:QI (const_int 32)
1642 (match_dup 4)))
1643 (set (match_operand:SI 0 "nonimmediate_operand" "=g")
1644 (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
1645 (match_dup 3)
1646 (match_operand:SI 2 "register_operand" "g")))]
1647 ""
1648 "
1649 {
1650 operands[3] = gen_reg_rtx (QImode);
1651 operands[4] = gen_lowpart (QImode, operands[2]);
1652 }")
1653
1654 ;; Rotate right on the VAX works by negating the shift count.
1655 (define_expand "rotrsi3"
1656 [(set (match_operand:SI 0 "general_operand" "=g")
1657 (rotatert:SI (match_operand:SI 1 "general_operand" "g")
1658 (match_operand:QI 2 "general_operand" "g")))]
1659 ""
1660 "
1661 {
1662 if (! CONST_INT_P (operands[2]))
1663 operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
1664 }")
1665
1666 (define_insn_and_split "rotlsi3"
1667 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1668 (rotate:SI (match_operand:SI 1 "general_operand" "nrmT")
1669 (match_operand:QI 2 "general_operand" "g")))]
1670 ""
1671 "#"
1672 "reload_completed"
1673 [(parallel
1674 [(set (match_dup 0)
1675 (rotate:SI (match_dup 1)
1676 (match_dup 2)))
1677 (clobber (reg:CC VAX_PSL_REGNUM))])]
1678 "")
1679
1680 (define_insn "*rotlsi3<ccn><ccnz><ccz>"
1681 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1682 (rotate:SI (match_operand:SI 1 "general_operand" "nrmT")
1683 (match_operand:QI 2 "general_operand" "g")))
1684 (clobber (reg:CC VAX_PSL_REGNUM))]
1685 "reload_completed"
1686 "rotl %2,%1,%0")
1687
1688 (define_insn_and_split "*rotrsi3_const_int"
1689 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1690 (rotatert:SI (match_operand:SI 1 "general_operand" "nrmT")
1691 (match_operand:QI 2 "const_int_operand" "n")))]
1692 ""
1693 "#"
1694 "reload_completed"
1695 [(parallel
1696 [(set (match_dup 0)
1697 (rotatert:SI (match_dup 1)
1698 (match_dup 2)))
1699 (clobber (reg:CC VAX_PSL_REGNUM))])]
1700 "")
1701
1702 (define_insn "*rotrsi3_const_int_2<ccn><ccnz><ccz>"
1703 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1704 (rotatert:SI (match_operand:SI 1 "general_operand" "nrmT")
1705 (match_operand:QI 2 "const_int_operand" "n")))
1706 (clobber (reg:CC VAX_PSL_REGNUM))]
1707 "reload_completed"
1708 "rotl %R2,%1,%0")
1709
1710 (define_insn_and_split "*rotrnegsi3"
1711 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1712 (rotatert:SI (match_operand:SI 1 "general_operand" "nrmT")
1713 (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
1714 ""
1715 "#"
1716 "reload_completed"
1717 [(parallel
1718 [(set (match_dup 0)
1719 (rotatert:SI (match_dup 1)
1720 (neg:QI (match_dup 2))))
1721 (clobber (reg:CC VAX_PSL_REGNUM))])]
1722 "")
1723
1724 (define_insn "*rotrnegsi3_2<ccn><ccnz><ccz>"
1725 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1726 (rotatert:SI (match_operand:SI 1 "general_operand" "nrmT")
1727 (neg:QI (match_operand:QI 2 "general_operand" "g"))))
1728 (clobber (reg:CC VAX_PSL_REGNUM))]
1729 "reload_completed"
1730 "rotl %2,%1,%0")
1731
1732 ;; This insn is probably slower than a multiply and an add.
1733 ;;(define_insn_and_split "*amulsi4"
1734 ;; [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1735 ;; (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
1736 ;; (match_operand:SI 2 "general_operand" "g"))
1737 ;; (match_operand:SI 3 "general_operand" "g")))]
1738 ;; ""
1739 ;; "#"
1740 ;; "reload_completed"
1741 ;; [(parallel
1742 ;; [(set (match_dup 0)
1743 ;; (mult:SI (plus:SI (match_dup 1)
1744 ;; (match_dup 2))
1745 ;; (match_dup 3)))
1746 ;; (clobber (reg:CC VAX_PSL_REGNUM))])]
1747 ;; "")
1748 ;;
1749 ;;(define_insn "*amulsi4_2<ccn><ccnz><ccz>"
1750 ;; [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1751 ;; (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
1752 ;; (match_operand:SI 2 "general_operand" "g"))
1753 ;; (match_operand:SI 3 "general_operand" "g")))
1754 ;; (clobber (reg:CC VAX_PSL_REGNUM))]
1755 ;; "reload_completed"
1756 ;; "index %1,$0x80000000,$0x7fffffff,%3,%2,%0")
1757
1759 ;; Special cases of bit-field insns which we should
1760 ;; recognize in preference to the general case.
1761 ;; These handle aligned 8-bit and 16-bit fields
1762 ;; that can be done with move or convert instructions.
1763
1764 (define_insn_and_split "*insv_aligned"
1765 [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+ro")
1766 (match_operand:QI 1 "const_int_operand" "n")
1767 (match_operand:SI 2 "const_int_operand" "n"))
1768 (match_operand:SI 3 "general_operand" "g"))]
1769 "(INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
1770 && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
1771 && (!MEM_P (operands[0])
1772 || ((!flag_pic
1773 || vax_acceptable_pic_operand_p (XEXP (operands[0], 0),
1774 true, true))
1775 && !mode_dependent_address_p (XEXP (operands[0], 0),
1776 MEM_ADDR_SPACE (operands[0]))))
1777 && (!(REG_P (operands[0])
1778 || (SUBREG_P (operands[0]) && REG_P (SUBREG_REG (operands[0]))))
1779 || INTVAL (operands[2]) == 0)"
1780 "#"
1781 "&& reload_completed"
1782 [(parallel
1783 [(set (zero_extract:SI (match_dup 0)
1784 (match_dup 1)
1785 (match_dup 2))
1786 (match_dup 3))
1787 (clobber (reg:CC VAX_PSL_REGNUM))])]
1788 "")
1789
1790 (define_insn "*insv_aligned_2<ccn><ccnz><ccz>"
1791 [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+ro")
1792 (match_operand:QI 1 "const_int_operand" "n")
1793 (match_operand:SI 2 "const_int_operand" "n"))
1794 (match_operand:SI 3 "general_operand" "g"))
1795 (clobber (reg:CC VAX_PSL_REGNUM))]
1796 "(INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
1797 && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
1798 && (!MEM_P (operands[0])
1799 || ((!flag_pic
1800 || vax_acceptable_pic_operand_p (XEXP (operands[0], 0),
1801 true, true))
1802 && !mode_dependent_address_p (XEXP (operands[0], 0),
1803 MEM_ADDR_SPACE (operands[0]))))
1804 && (!(REG_P (operands[0])
1805 || (SUBREG_P (operands[0]) && REG_P (SUBREG_REG (operands[0]))))
1806 || INTVAL (operands[2]) == 0)
1807 && reload_completed"
1808 "*
1809 {
1810 if (!REG_P (operands[0]))
1811 operands[0]
1812 = adjust_address (operands[0],
1813 INTVAL (operands[1]) == 8 ? QImode : HImode,
1814 INTVAL (operands[2]) / 8);
1815 else
1816 gcc_assert (INTVAL (operands[2]) == 0);
1817
1818 if (INTVAL (operands[1]) == 8)
1819 return \"movb %3,%0\";
1820 return \"movw %3,%0\";
1821 }")
1822
1823 (define_insn_and_split "*extzv_aligned"
1824 [(set (match_operand:SI 0 "nonimmediate_operand" "=&g")
1825 (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
1826 (match_operand:QI 2 "const_int_operand" "n")
1827 (match_operand:SI 3 "const_int_operand" "n")))]
1828 "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1829 && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
1830 && (!MEM_P (operands[1])
1831 || ((!flag_pic
1832 || vax_acceptable_pic_operand_p (XEXP (operands[1], 0),
1833 true, true))
1834 && !mode_dependent_address_p (XEXP (operands[1], 0),
1835 MEM_ADDR_SPACE (operands[1]))))
1836 && (!(REG_P (operands[1])
1837 || (SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1]))))
1838 || INTVAL (operands[3]) == 0)"
1839 "#"
1840 "&& reload_completed"
1841 [(parallel
1842 [(set (match_dup 0)
1843 (zero_extract:SI (match_dup 1)
1844 (match_dup 2)
1845 (match_dup 3)))
1846 (clobber (reg:CC VAX_PSL_REGNUM))])]
1847 "")
1848
1849 (define_insn "*extzv_aligned_2<ccn><ccnz><ccz>"
1850 [(set (match_operand:SI 0 "nonimmediate_operand" "=&g")
1851 (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
1852 (match_operand:QI 2 "const_int_operand" "n")
1853 (match_operand:SI 3 "const_int_operand" "n")))
1854 (clobber (reg:CC VAX_PSL_REGNUM))]
1855 "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1856 && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
1857 && (!MEM_P (operands[1])
1858 || ((!flag_pic
1859 || vax_acceptable_pic_operand_p (XEXP (operands[1], 0),
1860 true, true))
1861 && !mode_dependent_address_p (XEXP (operands[1], 0),
1862 MEM_ADDR_SPACE (operands[1]))))
1863 && (!(REG_P (operands[1])
1864 || (SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1]))))
1865 || INTVAL (operands[3]) == 0)
1866 && reload_completed"
1867 "*
1868 {
1869 if (!REG_P (operands[1]))
1870 operands[1]
1871 = adjust_address (operands[1],
1872 INTVAL (operands[2]) == 8 ? QImode : HImode,
1873 INTVAL (operands[3]) / 8);
1874 else
1875 gcc_assert (INTVAL (operands[3]) == 0);
1876
1877 if (INTVAL (operands[2]) == 8)
1878 return \"movzbl %1,%0\";
1879 return \"movzwl %1,%0\";
1880 }")
1881
1882 (define_insn_and_split "*extv_aligned"
1883 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1884 (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
1885 (match_operand:QI 2 "const_int_operand" "n")
1886 (match_operand:SI 3 "const_int_operand" "n")))]
1887 "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1888 && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
1889 && (!MEM_P (operands[1])
1890 || ((!flag_pic
1891 || vax_acceptable_pic_operand_p (XEXP (operands[1], 0),
1892 true, true))
1893 && !mode_dependent_address_p (XEXP (operands[1], 0),
1894 MEM_ADDR_SPACE (operands[1]))))
1895 && (!(REG_P (operands[1])
1896 || (SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1]))))
1897 || INTVAL (operands[3]) == 0)"
1898 "#"
1899 "&& reload_completed"
1900 [(parallel
1901 [(set (match_dup 0)
1902 (sign_extract:SI (match_dup 1)
1903 (match_dup 2)
1904 (match_dup 3)))
1905 (clobber (reg:CC VAX_PSL_REGNUM))])]
1906 "")
1907
1908 (define_insn "*extv_aligned_2<ccn><ccnz><ccz>"
1909 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1910 (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
1911 (match_operand:QI 2 "const_int_operand" "n")
1912 (match_operand:SI 3 "const_int_operand" "n")))
1913 (clobber (reg:CC VAX_PSL_REGNUM))]
1914 "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1915 && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
1916 && (!MEM_P (operands[1])
1917 || ((!flag_pic
1918 || vax_acceptable_pic_operand_p (XEXP (operands[1], 0),
1919 true, true))
1920 && !mode_dependent_address_p (XEXP (operands[1], 0),
1921 MEM_ADDR_SPACE (operands[1]))))
1922 && (!(REG_P (operands[1])
1923 || (SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1]))))
1924 || INTVAL (operands[3]) == 0)
1925 && reload_completed"
1926 "*
1927 {
1928 if (!REG_P (operands[1]))
1929 operands[1]
1930 = adjust_address (operands[1],
1931 INTVAL (operands[2]) == 8 ? QImode : HImode,
1932 INTVAL (operands[3]) / 8);
1933 else
1934 gcc_assert (INTVAL (operands[3]) == 0);
1935
1936 if (INTVAL (operands[2]) == 8)
1937 return \"cvtbl %1,%0\";
1938 return \"cvtwl %1,%0\";
1939 }")
1940
1942 ;; Register and non-offsettable-memory SImode cases of bit-field insns.
1943
1944 (define_insn "*cmpv_<mode>"
1945 [(set (reg:VAXcc VAX_PSL_REGNUM)
1946 (compare:VAXcc
1947 (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "ro")
1948 (match_operand:QI 1 "general_operand" "g")
1949 (match_operand:SI 2 "general_operand" "nrmT"))
1950 (match_operand:SI 3 "general_operand" "nrmT")))]
1951 "reload_completed"
1952 "cmpv %2,%1,%0,%3")
1953
1954 (define_insn "*cmpzv_<mode>"
1955 [(set (reg:VAXcc VAX_PSL_REGNUM)
1956 (compare:VAXcc
1957 (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "ro")
1958 (match_operand:QI 1 "general_operand" "g")
1959 (match_operand:SI 2 "general_operand" "nrmT"))
1960 (match_operand:SI 3 "general_operand" "nrmT")))]
1961 "reload_completed"
1962 "cmpzv %2,%1,%0,%3")
1963
1964 ;; When the field position and size are constant and the destination
1965 ;; is a register, extv and extzv are much slower than a rotate followed
1966 ;; by a bicl or sign extension. Because we might end up choosing ext[z]v
1967 ;; anyway, we can't allow immediate values for the primary source operand.
1968
1969 (define_insn_and_split "*extv_non_const"
1970 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1971 (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
1972 (match_operand:QI 2 "general_operand" "g")
1973 (match_operand:SI 3 "general_operand" "nrmT")))]
1974 ""
1975 "#"
1976 "reload_completed"
1977 [(parallel
1978 [(set (match_dup 0)
1979 (sign_extract:SI (match_dup 1)
1980 (match_dup 2)
1981 (match_dup 3)))
1982 (clobber (reg:CC VAX_PSL_REGNUM))])]
1983 "")
1984
1985 (define_insn "*extv_non_const_2<ccn><ccnz><ccz>"
1986 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
1987 (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
1988 (match_operand:QI 2 "general_operand" "g")
1989 (match_operand:SI 3 "general_operand" "nrmT")))
1990 (clobber (reg:CC VAX_PSL_REGNUM))]
1991 "reload_completed"
1992 "*
1993 {
1994 if (! CONST_INT_P (operands[3]) || ! CONST_INT_P (operands[2])
1995 || ! REG_P (operands[0])
1996 || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16))
1997 return \"extv %3,%2,%1,%0\";
1998 if (INTVAL (operands[2]) == 8)
1999 return \"rotl %R3,%1,%0\;cvtbl %0,%0\";
2000 return \"rotl %R3,%1,%0\;cvtwl %0,%0\";
2001 }")
2002
2003 (define_insn_and_split "*extzv_non_const"
2004 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
2005 (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
2006 (match_operand:QI 2 "general_operand" "g")
2007 (match_operand:SI 3 "general_operand" "nrmT")))]
2008 ""
2009 "#"
2010 "reload_completed"
2011 [(parallel
2012 [(set (match_dup 0)
2013 (zero_extract:SI (match_dup 1)
2014 (match_dup 2)
2015 (match_dup 3)))
2016 (clobber (reg:CC VAX_PSL_REGNUM))])]
2017 "")
2018
2019 (define_insn "*extzv_non_const_2<ccn><ccnz><ccz>"
2020 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
2021 (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
2022 (match_operand:QI 2 "general_operand" "g")
2023 (match_operand:SI 3 "general_operand" "nrmT")))
2024 (clobber (reg:CC VAX_PSL_REGNUM))]
2025 "reload_completed"
2026 "*
2027 {
2028 if (! CONST_INT_P (operands[3]) || ! CONST_INT_P (operands[2])
2029 || ! REG_P (operands[0]))
2030 return \"extzv %3,%2,%1,%0\";
2031 if (INTVAL (operands[2]) == 8)
2032 return \"rotl %R3,%1,%0\;movzbl %0,%0\";
2033 if (INTVAL (operands[2]) == 16)
2034 return \"rotl %R3,%1,%0\;movzwl %0,%0\";
2035 if (INTVAL (operands[3]) & 31)
2036 return \"rotl %R3,%1,%0\;bicl2 %M2,%0\";
2037 if (rtx_equal_p (operands[0], operands[1]))
2038 {
2039 if (INTVAL (operands[2]) == 32)
2040 return \"\"; /* no-op */
2041 else
2042 return \"bicl2 %M2,%0\";
2043 }
2044 if (INTVAL (operands[2]) == 32)
2045 return \"movl %1,%0\";
2046 return \"bicl3 %M2,%1,%0\";
2047 }")
2048
2049 ;; Non-register cases.
2050 ;; nonimmediate_operand is used to make sure that mode-ambiguous cases
2051 ;; don't match these (and therefore match the cases above instead).
2052
2053 (define_insn "*cmpv_2_<mode>"
2054 [(set (reg:VAXcc VAX_PSL_REGNUM)
2055 (compare:VAXcc
2056 (sign_extract:SI (match_operand:QI 0 "memory_operand" "m")
2057 (match_operand:QI 1 "general_operand" "g")
2058 (match_operand:SI 2 "general_operand" "nrmT"))
2059 (match_operand:SI 3 "general_operand" "nrmT")))]
2060 "reload_completed"
2061 "cmpv %2,%1,%0,%3")
2062
2063 (define_insn "*cmpzv_2_<mode>"
2064 [(set (reg:VAXcc VAX_PSL_REGNUM)
2065 (compare:VAXcc
2066 (zero_extract:SI (match_operand:QI 0 "memory_operand" "m")
2067 (match_operand:QI 1 "general_operand" "g")
2068 (match_operand:SI 2 "general_operand" "nrmT"))
2069 (match_operand:SI 3 "general_operand" "nrmT")))]
2070 "reload_completed"
2071 "cmpzv %2,%1,%0,%3")
2072
2073 (define_expand "extv"
2074 [(set (match_operand:SI 0 "general_operand" "")
2075 (sign_extract:SI (match_operand:SI 1 "general_operand" "")
2076 (match_operand:QI 2 "general_operand" "")
2077 (match_operand:SI 3 "general_operand" "")))]
2078 ""
2079 "")
2080
2081 (define_insn_and_split "*extv"
2082 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
2083 (sign_extract:SI (match_operand:QI 1 "memory_operand" "m")
2084 (match_operand:QI 2 "general_operand" "g")
2085 (match_operand:SI 3 "general_operand" "nrmT")))]
2086 ""
2087 "#"
2088 "reload_completed"
2089 [(parallel
2090 [(set (match_dup 0)
2091 (sign_extract:SI (match_dup 1)
2092 (match_dup 2)
2093 (match_dup 3)))
2094 (clobber (reg:CC VAX_PSL_REGNUM))])]
2095 "")
2096
2097 (define_insn "*extv_2<ccn><ccnz><ccz>"
2098 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
2099 (sign_extract:SI (match_operand:QI 1 "memory_operand" "m")
2100 (match_operand:QI 2 "general_operand" "g")
2101 (match_operand:SI 3 "general_operand" "nrmT")))
2102 (clobber (reg:CC VAX_PSL_REGNUM))]
2103 "reload_completed"
2104 "*
2105 {
2106 if (!REG_P (operands[0]) || !CONST_INT_P (operands[2])
2107 || !CONST_INT_P (operands[3])
2108 || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16)
2109 || INTVAL (operands[2]) + INTVAL (operands[3]) > 32
2110 || side_effects_p (operands[1])
2111 || (MEM_P (operands[1])
2112 && mode_dependent_address_p (XEXP (operands[1], 0),
2113 MEM_ADDR_SPACE (operands[1]))))
2114 return \"extv %3,%2,%1,%0\";
2115 if (INTVAL (operands[2]) == 8)
2116 return \"rotl %R3,%1,%0\;cvtbl %0,%0\";
2117 return \"rotl %R3,%1,%0\;cvtwl %0,%0\";
2118 }")
2119
2120 (define_expand "extzv"
2121 [(set (match_operand:SI 0 "general_operand" "")
2122 (zero_extract:SI (match_operand:SI 1 "general_operand" "")
2123 (match_operand:QI 2 "general_operand" "")
2124 (match_operand:SI 3 "general_operand" "")))]
2125 ""
2126 "")
2127
2128 (define_insn_and_split "*extzv"
2129 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
2130 (zero_extract:SI (match_operand:QI 1 "memory_operand" "m")
2131 (match_operand:QI 2 "general_operand" "g")
2132 (match_operand:SI 3 "general_operand" "nrmT")))]
2133 ""
2134 "#"
2135 "reload_completed"
2136 [(parallel
2137 [(set (match_dup 0)
2138 (zero_extract:SI (match_dup 1)
2139 (match_dup 2)
2140 (match_dup 3)))
2141 (clobber (reg:CC VAX_PSL_REGNUM))])]
2142 "")
2143
2144 (define_insn "*extzv_2<ccn><ccnz><ccz>"
2145 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
2146 (zero_extract:SI (match_operand:QI 1 "memory_operand" "m")
2147 (match_operand:QI 2 "general_operand" "g")
2148 (match_operand:SI 3 "general_operand" "nrmT")))
2149 (clobber (reg:CC VAX_PSL_REGNUM))]
2150 "reload_completed"
2151 "*
2152 {
2153 if (!REG_P (operands[0]) || !CONST_INT_P (operands[2])
2154 || !CONST_INT_P (operands[3])
2155 || INTVAL (operands[2]) + INTVAL (operands[3]) > 32
2156 || side_effects_p (operands[1])
2157 || (MEM_P (operands[1])
2158 && mode_dependent_address_p (XEXP (operands[1], 0),
2159 MEM_ADDR_SPACE (operands[1]))))
2160 return \"extzv %3,%2,%1,%0\";
2161 if (INTVAL (operands[2]) == 8)
2162 return \"rotl %R3,%1,%0\;movzbl %0,%0\";
2163 if (INTVAL (operands[2]) == 16)
2164 return \"rotl %R3,%1,%0\;movzwl %0,%0\";
2165 if (MEM_P (operands[1])
2166 && GET_CODE (XEXP (operands[1], 0)) == PLUS
2167 && REG_P (XEXP (XEXP (operands[1], 0), 0))
2168 && CONST_INT_P (XEXP (XEXP (operands[1], 0), 1))
2169 && CONST_INT_P (operands[2])
2170 && CONST_INT_P (operands[3]))
2171 {
2172 HOST_WIDE_INT o = INTVAL (XEXP (XEXP (operands[1], 0), 1));
2173 HOST_WIDE_INT l = INTVAL (operands[2]);
2174 HOST_WIDE_INT v = INTVAL (operands[3]);
2175 if ((o & 3) && (o & 3) * 8 + v + l <= 32)
2176 {
2177 rtx tmp;
2178 tmp = XEXP (XEXP (operands[1], 0), 0);
2179 if (o & ~3)
2180 tmp = gen_rtx_PLUS (SImode, tmp, GEN_INT (o & ~3));
2181 operands[1] = gen_rtx_MEM (QImode, tmp);
2182 operands[3] = GEN_INT (v + (o & 3) * 8);
2183 }
2184 if (optimize_size)
2185 return \"extzv %3,%2,%1,%0\";
2186 }
2187 return \"rotl %R3,%1,%0\;bicl2 %M2,%0\";
2188 }")
2189
2190 ;; Combine EXTV/CMPL and EXTZV/CMPL sequences where the output of
2191 ;; extraction is used for the comparison only into CMPV and CMPZV
2192 ;; respectively.
2193 (define_peephole2
2194 [(parallel
2195 [(set (match_operand:SI 0 "register_operand")
2196 (any_extract:SI (match_operand 1 "general_operand")
2197 (match_operand:QI 2 "general_operand")
2198 (match_operand:SI 3 "general_operand")))
2199 (clobber (reg:CC VAX_PSL_REGNUM))])
2200 (set (reg:VAXcc VAX_PSL_REGNUM)
2201 (compare:VAXcc (match_dup 0)
2202 (match_operand:SI 4 "general_operand")))]
2203 "peep2_reg_dead_p (2, operands[0])"
2204 [(set (reg:VAXcc VAX_PSL_REGNUM)
2205 (compare:VAXcc
2206 (any_extract:SI (match_dup 1)
2207 (match_dup 2)
2208 (match_dup 3))
2209 (match_dup 4)))]
2210 "")
2211
2212 (define_expand "insv"
2213 [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "")
2214 (match_operand:QI 1 "general_operand" "")
2215 (match_operand:SI 2 "general_operand" ""))
2216 (match_operand:SI 3 "general_operand" ""))]
2217 ""
2218 "")
2219
2220 ;; This one actually doesn't change CC.
2221 (define_insn "*insv"
2222 [(set (zero_extract:SI (match_operand:QI 0 "memory_operand" "+m")
2223 (match_operand:QI 1 "general_operand" "g")
2224 (match_operand:SI 2 "general_operand" "nrmT"))
2225 (match_operand:SI 3 "general_operand" "nrmT"))]
2226 ""
2227 "*
2228 {
2229 if (MEM_P (operands[0])
2230 && GET_CODE (XEXP (operands[0], 0)) == PLUS
2231 && REG_P (XEXP (XEXP (operands[0], 0), 0))
2232 && CONST_INT_P (XEXP (XEXP (operands[0], 0), 1))
2233 && CONST_INT_P (operands[1])
2234 && CONST_INT_P (operands[2]))
2235 {
2236 HOST_WIDE_INT o = INTVAL (XEXP (XEXP (operands[0], 0), 1));
2237 HOST_WIDE_INT v = INTVAL (operands[2]);
2238 HOST_WIDE_INT l = INTVAL (operands[1]);
2239 if ((o & 3) && (o & 3) * 8 + v + l <= 32)
2240 {
2241 rtx tmp;
2242 tmp = XEXP (XEXP (operands[0], 0), 0);
2243 if (o & ~3)
2244 tmp = gen_rtx_PLUS (SImode, tmp, GEN_INT (o & ~3));
2245 operands[0] = gen_rtx_MEM (QImode, tmp);
2246 operands[2] = GEN_INT (v + (o & 3) * 8);
2247 }
2248 }
2249 return \"insv %3,%2,%1,%0\";
2250 }")
2251
2252 ;; This one actually doesn't change CC.
2253 (define_insn "*insv_2"
2254 [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+ro")
2255 (match_operand:QI 1 "general_operand" "g")
2256 (match_operand:SI 2 "general_operand" "nrmT"))
2257 (match_operand:SI 3 "general_operand" "nrmT"))]
2258 ""
2259 "insv %3,%2,%1,%0")
2260
2262 ;; Unconditional jump
2263 (define_insn "jump"
2264 [(set (pc)
2265 (label_ref (match_operand 0 "" "")))]
2266 ""
2267 "jbr %l0")
2268
2269 ;; Conditional jumps
2270
2271 (define_expand "cbranch<mode>4"
2272 [(set (pc)
2273 (if_then_else
2274 (match_operator 0 "ordered_comparison_operator"
2275 [(match_operand:VAXint 1 "general_operand" "")
2276 (match_operand:VAXint 2 "general_operand" "")])
2277 (label_ref (match_operand 3 "" ""))
2278 (pc)))]
2279 ""
2280 "")
2281
2282 (define_insn_and_split "*cbranch<VAXint:mode>4_<VAXcc:mode>"
2283 [(set (pc)
2284 (if_then_else
2285 (match_operator 0 "vax_<VAXcc:mode>_comparison_operator"
2286 [(match_operand:VAXint 1 "general_operand" "nrmT")
2287 (match_operand:VAXint 2 "general_operand" "nrmT")])
2288 (label_ref (match_operand 3 "" ""))
2289 (pc)))]
2290 ""
2291 "#"
2292 "reload_completed"
2293 [(set (reg:VAXcc VAX_PSL_REGNUM)
2294 (compare:VAXcc (match_dup 1) (match_dup 2)))
2295 (set (pc)
2296 (if_then_else
2297 (match_op_dup 0 [(reg:VAXcc VAX_PSL_REGNUM)
2298 (const_int 0)])
2299 (label_ref (match_operand 3 "" ""))
2300 (pc)))]
2301 "")
2302
2303 (define_expand "cbranch<mode>4"
2304 [(set (pc)
2305 (if_then_else
2306 (match_operator 0 "ordered_comparison_operator"
2307 [(match_operand:VAXfp 1 "general_operand" "")
2308 (match_operand:VAXfp 2 "general_operand" "")])
2309 (label_ref (match_operand 3 "" ""))
2310 (pc)))]
2311 ""
2312 "")
2313
2314 (define_insn_and_split "*cbranch<VAXfp:mode>4_<VAXccnz:mode>"
2315 [(set (pc)
2316 (if_then_else
2317 (match_operator 0 "vax_<VAXccnz:mode>_comparison_operator"
2318 [(match_operand:VAXfp 1 "general_operand" "gF")
2319 (match_operand:VAXfp 2 "general_operand" "gF")])
2320 (label_ref (match_operand 3 "" ""))
2321 (pc)))]
2322 ""
2323 "#"
2324 "reload_completed"
2325 [(set (reg:VAXccnz VAX_PSL_REGNUM)
2326 (compare:VAXccnz (match_dup 1) (match_dup 2)))
2327 (set (pc)
2328 (if_then_else
2329 (match_op_dup 0 [(reg:VAXccnz VAX_PSL_REGNUM)
2330 (const_int 0)])
2331 (label_ref (match_operand 3 "" ""))
2332 (pc)))]
2333 "")
2334
2335 (define_insn "*branch_<mode>"
2336 [(set (pc)
2337 (if_then_else (match_operator 0 "vax_<mode>_comparison_operator"
2338 [(reg:VAXcc VAX_PSL_REGNUM)
2339 (const_int 0)])
2340 (label_ref (match_operand 1 "" ""))
2341 (pc)))]
2342 "reload_completed"
2343 "j%k0 %l1")
2344
2345 ;; Recognize reversed jumps.
2346 (define_insn "*branch_<mode>_reversed"
2347 [(set (pc)
2348 (if_then_else (match_operator 0 "vax_<mode>_comparison_operator"
2349 [(reg:VAXcc VAX_PSL_REGNUM)
2350 (const_int 0)])
2351 (pc)
2352 (label_ref (match_operand 1 "" ""))))]
2353 "reload_completed"
2354 "j%K0 %l1") ; %K0 negates condition
2355
2357 ;; Recognize jbs, jlbs, jbc and jlbc instructions. Note that the operand
2358 ;; of jlbs and jlbc insns are SImode in the hardware. However, if it is
2359 ;; memory, we use QImode in the insn. So we can't use those instructions
2360 ;; for mode-dependent addresses.
2361
2362 (define_insn ""
2363 [(set (pc)
2364 (if_then_else
2365 (ne (zero_extract:SI (match_operand:QI 0 "memory_operand" "Q,g")
2366 (const_int 1)
2367 (match_operand:SI 1 "general_operand" "I,nrmT"))
2368 (const_int 0))
2369 (label_ref (match_operand 2 "" ""))
2370 (pc)))]
2371 ""
2372 "@
2373 jlbs %0,%l2
2374 jbs %1,%0,%l2")
2375
2376 (define_insn ""
2377 [(set (pc)
2378 (if_then_else
2379 (eq (zero_extract:SI (match_operand:QI 0 "memory_operand" "Q,g")
2380 (const_int 1)
2381 (match_operand:SI 1 "general_operand" "I,nrmT"))
2382 (const_int 0))
2383 (label_ref (match_operand 2 "" ""))
2384 (pc)))]
2385 ""
2386 "@
2387 jlbc %0,%l2
2388 jbc %1,%0,%l2")
2389
2390 (define_insn ""
2391 [(set (pc)
2392 (if_then_else
2393 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r")
2394 (const_int 1)
2395 (match_operand:SI 1 "general_operand" "I,nrmT"))
2396 (const_int 0))
2397 (label_ref (match_operand 2 "" ""))
2398 (pc)))]
2399 ""
2400 "@
2401 jlbs %0,%l2
2402 jbs %1,%0,%l2")
2403
2404 (define_insn ""
2405 [(set (pc)
2406 (if_then_else
2407 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r")
2408 (const_int 1)
2409 (match_operand:SI 1 "general_operand" "I,nrmT"))
2410 (const_int 0))
2411 (label_ref (match_operand 2 "" ""))
2412 (pc)))]
2413 ""
2414 "@
2415 jlbc %0,%l2
2416 jbc %1,%0,%l2")
2417
2419 ;; Subtract-and-jump and Add-and-jump insns.
2420 ;; These are not used when output is for the Unix assembler
2421 ;; because it does not know how to modify them to reach far.
2422
2423 ;; Normal sob insns.
2424
2425 (define_insn_and_split "*jsobgtr"
2426 [(set (pc)
2427 (if_then_else
2428 (gt (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2429 (const_int -1))
2430 (const_int 0))
2431 (label_ref (match_operand 1 "" ""))
2432 (pc)))
2433 (set (match_dup 0)
2434 (plus:SI (match_dup 0)
2435 (const_int -1)))]
2436 "!TARGET_UNIX_ASM"
2437 "#"
2438 "&& reload_completed"
2439 [(parallel
2440 [(set (pc)
2441 (if_then_else
2442 (gt (plus:SI (match_dup 0)
2443 (const_int -1))
2444 (const_int 0))
2445 (label_ref (match_dup 1))
2446 (pc)))
2447 (set (match_dup 0)
2448 (plus:SI (match_dup 0)
2449 (const_int -1)))
2450 (clobber (reg:CC VAX_PSL_REGNUM))])]
2451 "")
2452
2453 (define_insn "*jsobgtr_2"
2454 [(set (pc)
2455 (if_then_else
2456 (gt (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2457 (const_int -1))
2458 (const_int 0))
2459 (label_ref (match_operand 1 "" ""))
2460 (pc)))
2461 (set (match_dup 0)
2462 (plus:SI (match_dup 0)
2463 (const_int -1)))
2464 (clobber (reg:CC VAX_PSL_REGNUM))]
2465 "!TARGET_UNIX_ASM && reload_completed"
2466 "jsobgtr %0,%l1")
2467
2468 (define_insn_and_split "*jsobgeq"
2469 [(set (pc)
2470 (if_then_else
2471 (ge (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2472 (const_int -1))
2473 (const_int 0))
2474 (label_ref (match_operand 1 "" ""))
2475 (pc)))
2476 (set (match_dup 0)
2477 (plus:SI (match_dup 0)
2478 (const_int -1)))]
2479 "!TARGET_UNIX_ASM"
2480 "#"
2481 "&& reload_completed"
2482 [(parallel
2483 [(set (pc)
2484 (if_then_else
2485 (ge (plus:SI (match_dup 0)
2486 (const_int -1))
2487 (const_int 0))
2488 (label_ref (match_dup 1))
2489 (pc)))
2490 (set (match_dup 0)
2491 (plus:SI (match_dup 0)
2492 (const_int -1)))
2493 (clobber (reg:CC VAX_PSL_REGNUM))])]
2494 "")
2495
2496 (define_insn "*jsobgeq_2"
2497 [(set (pc)
2498 (if_then_else
2499 (ge (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2500 (const_int -1))
2501 (const_int 0))
2502 (label_ref (match_operand 1 "" ""))
2503 (pc)))
2504 (set (match_dup 0)
2505 (plus:SI (match_dup 0)
2506 (const_int -1)))
2507 (clobber (reg:CC VAX_PSL_REGNUM))]
2508 "!TARGET_UNIX_ASM && reload_completed"
2509 "jsobgeq %0,%l1")
2510
2511 ;; Normal aob insns. Define a version for when operands[1] is a constant.
2512 (define_insn_and_split "*jaoblss"
2513 [(set (pc)
2514 (if_then_else
2515 (lt (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2516 (const_int 1))
2517 (match_operand:SI 1 "general_operand" "nrmT"))
2518 (label_ref (match_operand 2 "" ""))
2519 (pc)))
2520 (set (match_dup 0)
2521 (plus:SI (match_dup 0)
2522 (const_int 1)))]
2523 "!TARGET_UNIX_ASM"
2524 "#"
2525 "&& reload_completed"
2526 [(parallel
2527 [(set (pc)
2528 (if_then_else
2529 (lt (plus:SI (match_dup 0)
2530 (const_int 1))
2531 (match_dup 1))
2532 (label_ref (match_dup 2))
2533 (pc)))
2534 (set (match_dup 0)
2535 (plus:SI (match_dup 0)
2536 (const_int 1)))
2537 (clobber (reg:CC VAX_PSL_REGNUM))])]
2538 "")
2539
2540 (define_insn "*jaoblss_2"
2541 [(set (pc)
2542 (if_then_else
2543 (lt (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2544 (const_int 1))
2545 (match_operand:SI 1 "general_operand" "nrmT"))
2546 (label_ref (match_operand 2 "" ""))
2547 (pc)))
2548 (set (match_dup 0)
2549 (plus:SI (match_dup 0)
2550 (const_int 1)))
2551 (clobber (reg:CC VAX_PSL_REGNUM))]
2552 "!TARGET_UNIX_ASM && reload_completed"
2553 "jaoblss %1,%0,%l2")
2554
2555 (define_insn_and_split "*jaoblss_const"
2556 [(set (pc)
2557 (if_then_else
2558 (lt (match_operand:SI 0 "nonimmediate_operand" "+g")
2559 (match_operand:SI 1 "general_operand" "nrmT"))
2560 (label_ref (match_operand 2 "" ""))
2561 (pc)))
2562 (set (match_dup 0)
2563 (plus:SI (match_dup 0)
2564 (const_int 1)))]
2565 "!TARGET_UNIX_ASM && CONST_INT_P (operands[1])"
2566 "#"
2567 "&& reload_completed"
2568 [(parallel
2569 [(set (pc)
2570 (if_then_else
2571 (lt (match_dup 0)
2572 (match_dup 1))
2573 (label_ref (match_dup 2))
2574 (pc)))
2575 (set (match_dup 0)
2576 (plus:SI (match_dup 0)
2577 (const_int 1)))
2578 (clobber (reg:CC VAX_PSL_REGNUM))])]
2579 "")
2580
2581 (define_insn "*jaoblss_const_2"
2582 [(set (pc)
2583 (if_then_else
2584 (lt (match_operand:SI 0 "nonimmediate_operand" "+g")
2585 (match_operand:SI 1 "general_operand" "nrmT"))
2586 (label_ref (match_operand 2 "" ""))
2587 (pc)))
2588 (set (match_dup 0)
2589 (plus:SI (match_dup 0)
2590 (const_int 1)))
2591 (clobber (reg:CC VAX_PSL_REGNUM))]
2592 "!TARGET_UNIX_ASM && CONST_INT_P (operands[1]) && reload_completed"
2593 "jaoblss %P1,%0,%l2")
2594
2595 (define_insn_and_split "*jaobleq"
2596 [(set (pc)
2597 (if_then_else
2598 (le (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2599 (const_int 1))
2600 (match_operand:SI 1 "general_operand" "nrmT"))
2601 (label_ref (match_operand 2 "" ""))
2602 (pc)))
2603 (set (match_dup 0)
2604 (plus:SI (match_dup 0)
2605 (const_int 1)))]
2606 "!TARGET_UNIX_ASM"
2607 "#"
2608 "&& reload_completed"
2609 [(parallel
2610 [(set (pc)
2611 (if_then_else
2612 (le (plus:SI (match_dup 0)
2613 (const_int 1))
2614 (match_dup 1))
2615 (label_ref (match_dup 2))
2616 (pc)))
2617 (set (match_dup 0)
2618 (plus:SI (match_dup 0)
2619 (const_int 1)))
2620 (clobber (reg:CC VAX_PSL_REGNUM))])]
2621 "")
2622
2623 (define_insn "*jaobleq_2"
2624 [(set (pc)
2625 (if_then_else
2626 (le (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
2627 (const_int 1))
2628 (match_operand:SI 1 "general_operand" "nrmT"))
2629 (label_ref (match_operand 2 "" ""))
2630 (pc)))
2631 (set (match_dup 0)
2632 (plus:SI (match_dup 0)
2633 (const_int 1)))
2634 (clobber (reg:CC VAX_PSL_REGNUM))]
2635 "!TARGET_UNIX_ASM && reload_completed"
2636 "jaobleq %1,%0,%l2")
2637
2638 (define_insn_and_split "*jaobleq_const"
2639 [(set (pc)
2640 (if_then_else
2641 (le (match_operand:SI 0 "nonimmediate_operand" "+g")
2642 (match_operand:SI 1 "general_operand" "nrmT"))
2643 (label_ref (match_operand 2 "" ""))
2644 (pc)))
2645 (set (match_dup 0)
2646 (plus:SI (match_dup 0)
2647 (const_int 1)))]
2648 "!TARGET_UNIX_ASM && CONST_INT_P (operands[1])"
2649 "#"
2650 "&& reload_completed"
2651 [(parallel
2652 [(set (pc)
2653 (if_then_else
2654 (le (match_dup 0)
2655 (match_dup 1))
2656 (label_ref (match_dup 2))
2657 (pc)))
2658 (set (match_dup 0)
2659 (plus:SI (match_dup 0)
2660 (const_int 1)))
2661 (clobber (reg:CC VAX_PSL_REGNUM))])]
2662 "")
2663
2664 (define_insn "*jaobleq_const_2"
2665 [(set (pc)
2666 (if_then_else
2667 (le (match_operand:SI 0 "nonimmediate_operand" "+g")
2668 (match_operand:SI 1 "general_operand" "nrmT"))
2669 (label_ref (match_operand 2 "" ""))
2670 (pc)))
2671 (set (match_dup 0)
2672 (plus:SI (match_dup 0)
2673 (const_int 1)))
2674 (clobber (reg:CC VAX_PSL_REGNUM))]
2675 "!TARGET_UNIX_ASM && CONST_INT_P (operands[1]) && reload_completed"
2676 "jaobleq %P1,%0,%l2")
2677
2678 ;; Something like a sob insn, but compares against -1.
2679 ;; This finds `while (foo--)' which was changed to `while (--foo != -1)'.
2680
2681 (define_insn_and_split "*jsobneq_minus_one"
2682 [(set (pc)
2683 (if_then_else
2684 (ne (match_operand:SI 0 "nonimmediate_operand" "+g")
2685 (const_int 0))
2686 (label_ref (match_operand 1 "" ""))
2687 (pc)))
2688 (set (match_dup 0)
2689 (plus:SI (match_dup 0)
2690 (const_int -1)))]
2691 ""
2692 "#"
2693 "reload_completed"
2694 [(parallel
2695 [(set (pc)
2696 (if_then_else
2697 (ne (match_dup 0)
2698 (const_int 0))
2699 (label_ref (match_dup 1))
2700 (pc)))
2701 (set (match_dup 0)
2702 (plus:SI (match_dup 0)
2703 (const_int -1)))
2704 (clobber (reg:CC VAX_PSL_REGNUM))])]
2705 "")
2706
2707 (define_insn "*jsobneq_minus_one_2"
2708 [(set (pc)
2709 (if_then_else
2710 (ne (match_operand:SI 0 "nonimmediate_operand" "+g")
2711 (const_int 0))
2712 (label_ref (match_operand 1 "" ""))
2713 (pc)))
2714 (set (match_dup 0)
2715 (plus:SI (match_dup 0)
2716 (const_int -1)))
2717 (clobber (reg:CC VAX_PSL_REGNUM))]
2718 "reload_completed"
2719 "decl %0\;jgequ %l1")
2720
2722 (define_expand "call_pop"
2723 [(parallel [(call (match_operand:QI 0 "memory_operand" "")
2724 (match_operand:SI 1 "const_int_operand" ""))
2725 (set (reg:SI VAX_SP_REGNUM)
2726 (plus:SI (reg:SI VAX_SP_REGNUM)
2727 (match_operand:SI 3 "immediate_operand" "")))])]
2728 ""
2729 {
2730 gcc_assert (INTVAL (operands[3]) <= 255 * 4 && INTVAL (operands[3]) % 4 == 0);
2731
2732 /* Operand 1 is the number of bytes to be popped by DW_CFA_GNU_args_size
2733 during EH unwinding. We must include the argument count pushed by
2734 the calls instruction. */
2735 operands[1] = GEN_INT (INTVAL (operands[3]) + 4);
2736 })
2737
2738 (define_insn "*call_pop"
2739 [(call (match_operand:QI 0 "memory_operand" "m")
2740 (match_operand:SI 1 "const_int_operand" "n"))
2741 (set (reg:SI VAX_SP_REGNUM) (plus:SI (reg:SI VAX_SP_REGNUM)
2742 (match_operand:SI 2 "immediate_operand" "i")))]
2743 ""
2744 {
2745 operands[1] = GEN_INT ((INTVAL (operands[1]) - 4) / 4);
2746 return "calls %1,%0";
2747 })
2748
2749 (define_expand "call_value_pop"
2750 [(parallel [(set (match_operand 0 "" "")
2751 (call (match_operand:QI 1 "memory_operand" "")
2752 (match_operand:SI 2 "const_int_operand" "")))
2753 (set (reg:SI VAX_SP_REGNUM)
2754 (plus:SI (reg:SI VAX_SP_REGNUM)
2755 (match_operand:SI 4 "immediate_operand" "")))])]
2756 ""
2757 {
2758 gcc_assert (INTVAL (operands[4]) <= 255 * 4 && INTVAL (operands[4]) % 4 == 0);
2759
2760 /* Operand 2 is the number of bytes to be popped by DW_CFA_GNU_args_size
2761 during EH unwinding. We must include the argument count pushed by
2762 the calls instruction. */
2763 operands[2] = GEN_INT (INTVAL (operands[4]) + 4);
2764 })
2765
2766 (define_insn "*call_value_pop"
2767 [(set (match_operand 0 "" "")
2768 (call (match_operand:QI 1 "memory_operand" "m")
2769 (match_operand:SI 2 "const_int_operand" "n")))
2770 (set (reg:SI VAX_SP_REGNUM) (plus:SI (reg:SI VAX_SP_REGNUM)
2771 (match_operand:SI 3 "immediate_operand" "i")))]
2772 ""
2773 "*
2774 {
2775 operands[2] = GEN_INT ((INTVAL (operands[2]) - 4) / 4);
2776 return \"calls %2,%1\";
2777 }")
2778
2779 (define_expand "call"
2780 [(call (match_operand:QI 0 "memory_operand" "")
2781 (match_operand:SI 1 "const_int_operand" ""))]
2782 ""
2783 "
2784 {
2785 /* Operand 1 is the number of bytes to be popped by DW_CFA_GNU_args_size
2786 during EH unwinding. We must include the argument count pushed by
2787 the calls instruction. */
2788 operands[1] = GEN_INT (INTVAL (operands[1]) + 4);
2789 }")
2790
2791 (define_insn "*call"
2792 [(call (match_operand:QI 0 "memory_operand" "m")
2793 (match_operand:SI 1 "const_int_operand" ""))]
2794 ""
2795 "calls $0,%0")
2796
2797 (define_expand "call_value"
2798 [(set (match_operand 0 "" "")
2799 (call (match_operand:QI 1 "memory_operand" "")
2800 (match_operand:SI 2 "const_int_operand" "")))]
2801 ""
2802 "
2803 {
2804 /* Operand 2 is the number of bytes to be popped by DW_CFA_GNU_args_size
2805 during EH unwinding. We must include the argument count pushed by
2806 the calls instruction. */
2807 operands[2] = GEN_INT (INTVAL (operands[2]) + 4);
2808 }")
2809
2810 (define_insn "*call_value"
2811 [(set (match_operand 0 "" "")
2812 (call (match_operand:QI 1 "memory_operand" "m")
2813 (match_operand:SI 2 "const_int_operand" "")))]
2814 ""
2815 "calls $0,%1")
2816
2817 ;; Call subroutine returning any type.
2818
2819 (define_expand "untyped_call"
2820 [(parallel [(call (match_operand 0 "" "")
2821 (const_int 0))
2822 (match_operand 1 "" "")
2823 (match_operand 2 "" "")])]
2824 ""
2825 "
2826 {
2827 int i;
2828
2829 emit_call_insn (gen_call_pop (operands[0], const0_rtx, NULL, const0_rtx));
2830
2831 for (i = 0; i < XVECLEN (operands[2], 0); i++)
2832 {
2833 rtx set = XVECEXP (operands[2], 0, i);
2834 emit_move_insn (SET_DEST (set), SET_SRC (set));
2835 }
2836
2837 /* The optimizer does not know that the call sets the function value
2838 registers we stored in the result block. We avoid problems by
2839 claiming that all hard registers are used and clobbered at this
2840 point. */
2841 emit_insn (gen_blockage ());
2842
2843 DONE;
2844 }")
2845
2846 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
2847 ;; all of memory. This blocks insns from being moved across this point.
2848
2849 (define_insn "blockage"
2850 [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)]
2851 ""
2852 "")
2853
2854 (define_insn "procedure_entry_mask"
2855 [(unspec_volatile [(match_operand 0 "const_int_operand")] VUNSPEC_PEM)]
2856 ""
2857 ".word %x0")
2858
2859 (define_insn "return"
2860 [(return)]
2861 ""
2862 "ret")
2863
2864 (define_expand "prologue"
2865 [(const_int 0)]
2866 ""
2867 {
2868 vax_expand_prologue ();
2869 DONE;
2870 })
2871
2872 (define_expand "epilogue"
2873 [(return)]
2874 ""
2875 "
2876 {
2877 emit_jump_insn (gen_return ());
2878 DONE;
2879 }")
2880
2881 ;; Exception handling
2882 ;; This is used when compiling the stack unwinding routines.
2883 (define_expand "eh_return"
2884 [(use (match_operand 0 "general_operand"))]
2885 ""
2886 {
2887 if (GET_MODE (operands[0]) != word_mode)
2888 operands[0] = convert_to_mode (word_mode, operands[0], 0);
2889 emit_insn (gen_eh_set_retaddr (operands[0]));
2890 DONE;
2891 })
2892
2893 (define_insn_and_split "eh_set_retaddr"
2894 [(unspec [(match_operand:SI 0 "general_operand")] VUNSPEC_EH_RETURN)
2895 (clobber (match_scratch:SI 1 "=&r"))
2896 ]
2897 ""
2898 "#"
2899 "reload_completed"
2900 [(const_int 0)]
2901 {
2902 rtx tmp = RETURN_ADDR_RTX(0, frame_pointer_rtx);
2903 MEM_VOLATILE_P(tmp) = 1;
2904 tmp = gen_rtx_SET(tmp, operands[0]);
2905 emit_insn(tmp);
2906 DONE;
2907 })
2908
2909
2910
2911 (define_insn "nop"
2912 [(const_int 0)]
2913 ""
2914 "nop")
2915
2916 ;; This had a wider constraint once, and it had trouble.
2917 ;; If you are tempted to try `g', please don't--it's not worth
2918 ;; the risk we will reopen the same bug.
2919 (define_insn "indirect_jump"
2920 [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
2921 ""
2922 "jmp (%0)")
2923
2924 ;; This is here to accept 5 arguments (as passed by expand_end_case)
2925 ;; and pass the first 4 along to the casesi1 pattern that really does
2926 ;; the actual casesi work. We emit a jump here to the default label
2927 ;; _before_ the casesi so that we can be sure that the casesi never
2928 ;; drops through.
2929 ;; This is suboptimal perhaps, but so is much of the rest of this
2930 ;; machine description. For what it's worth, HPPA uses the same trick.
2931 ;;
2932 ;; operand 0 is index
2933 ;; operand 1 is the minimum bound (a const_int)
2934 ;; operand 2 is the maximum bound - minimum bound + 1 (also a const_int)
2935 ;; operand 3 is CODE_LABEL for the table;
2936 ;; operand 4 is the CODE_LABEL to go to if index out of range (ie. default).
2937 ;;
2938 ;; We emit:
2939 ;; i = index - minimum_bound
2940 ;; if (i > (maximum_bound - minimum_bound + 1) goto default;
2941 ;; casesi (i, 0, table);
2942 ;;
2943 (define_expand "casesi"
2944 [(match_operand:SI 0 "general_operand" "")
2945 (match_operand:SI 1 "general_operand" "")
2946 (match_operand:SI 2 "general_operand" "")
2947 (match_operand 3 "" "")
2948 (match_operand 4 "" "")]
2949 ""
2950 {
2951 rtx test;
2952
2953 /* i = index - minimum_bound;
2954 But only if the lower bound is not already zero. */
2955 if (operands[1] != const0_rtx)
2956 {
2957 rtx index = gen_reg_rtx (SImode);
2958 emit_insn (gen_addsi3 (index,
2959 operands[0],
2960 gen_int_mode (-INTVAL (operands[1]), SImode)));
2961 operands[0] = index;
2962 }
2963
2964 /* if (i > (maximum_bound - minimum_bound + 1)) goto default; */
2965 test = gen_rtx_fmt_ee (GTU, VOIDmode, operands[0], operands[2]);
2966 emit_jump_insn (gen_cbranchsi4 (test, operands[0], operands[2], operands[4]));
2967
2968 /* casesi (i, 0, table); */
2969 emit_jump_insn (gen_casesi1 (operands[0], operands[2], operands[3]));
2970 DONE;
2971 })
2972
2973 ;; This insn is a bit of a lier. It actually falls through if no case
2974 ;; matches. But, we prevent that from ever happening by emitting a jump
2975 ;; before this, see the define_expand above.
2976 (define_insn_and_split "casesi1"
2977 [(match_operand:SI 1 "const_int_operand" "n")
2978 (set (pc)
2979 (plus:SI (sign_extend:SI
2980 (mem:HI (plus:SI
2981 (mult:SI
2982 (match_operand:SI 0 "general_operand" "nrmT")
2983 (const_int 2))
2984 (pc))))
2985 (label_ref:SI (match_operand 2 "" ""))))]
2986 ""
2987 "#"
2988 "reload_completed"
2989 [(parallel
2990 [(use (match_dup 1))
2991 (set (pc)
2992 (plus:SI (sign_extend:SI
2993 (mem:HI (plus:SI
2994 (mult:SI
2995 (match_dup 0)
2996 (const_int 2))
2997 (pc))))
2998 (label_ref:SI (match_dup 2))))
2999 (clobber (reg:CC VAX_PSL_REGNUM))
3000 (use (label_ref:SI (match_dup 2)))
3001 ])]
3002 "")
3003
3004 (define_insn "*casesi1"
3005 [(use (match_operand:SI 1 "const_int_operand" "n"))
3006 (set (pc)
3007 (plus:SI (sign_extend:SI
3008 (mem:HI (plus:SI
3009 (mult:SI
3010 (match_operand:SI 0 "general_operand" "nrmT")
3011 (const_int 2))
3012 (pc))))
3013 (label_ref:SI (match_operand 2 "" ""))))
3014 (clobber (reg:CC VAX_PSL_REGNUM))
3015 (use (label_ref:SI (match_dup 2)))
3016 ]
3017 "reload_completed"
3018 "casel %0,$0,%1")
3019
3021 (define_insn_and_split "*pushsym"
3022 [(set (match_operand:SI 0 "push_operand" "=g")
3023 (match_operand:SI 1 "pic_symbolic_operand" "A"))]
3024 ""
3025 "#"
3026 "reload_completed"
3027 [(parallel
3028 [(set (match_dup 0)
3029 (match_dup 1))
3030 (clobber (reg:CC VAX_PSL_REGNUM))])]
3031 "")
3032
3033 (define_insn "*pushsym_2<ccn><ccnz><ccz>"
3034 [(set (match_operand:SI 0 "push_operand" "=g")
3035 (match_operand:SI 1 "pic_symbolic_operand" "A"))
3036 (clobber (reg:CC VAX_PSL_REGNUM))]
3037 "reload_completed"
3038 "pushab %a1")
3039
3040 (define_insn_and_split "*movsym"
3041 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3042 (match_operand:SI 1 "pic_symbolic_operand" "A"))]
3043 ""
3044 "#"
3045 "reload_completed"
3046 [(parallel
3047 [(set (match_dup 0)
3048 (match_dup 1))
3049 (clobber (reg:CC VAX_PSL_REGNUM))])]
3050 "")
3051
3052 (define_insn "*movsym_2<ccn><ccnz><ccz>"
3053 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3054 (match_operand:SI 1 "pic_symbolic_operand" "A"))
3055 (clobber (reg:CC VAX_PSL_REGNUM))]
3056 "reload_completed"
3057 "movab %a1,%0")
3058
3059 (define_insn_and_split "*pushsymreg"
3060 [(set (match_operand:SI 0 "push_operand" "=g")
3061 (plus:SI (match_operand:SI 1 "register_operand" "%r")
3062 (match_operand:SI 2 "pic_symbolic_operand" "A")))]
3063 "flag_pic"
3064 "#"
3065 "&& reload_completed"
3066 [(parallel
3067 [(set (match_dup 0)
3068 (plus:SI (match_dup 1)
3069 (match_dup 2)))
3070 (clobber (reg:CC VAX_PSL_REGNUM))])]
3071 "")
3072
3073 (define_insn "*pushsymreg_2<ccn><ccnz><ccz>"
3074 [(set (match_operand:SI 0 "push_operand" "=g")
3075 (plus:SI (match_operand:SI 1 "register_operand" "%r")
3076 (match_operand:SI 2 "pic_symbolic_operand" "A")))
3077 (clobber (reg:CC VAX_PSL_REGNUM))]
3078 "flag_pic && reload_completed"
3079 "pushab %a2[%1]")
3080
3081 (define_insn_and_split "*movsymreg"
3082 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3083 (plus:SI (match_operand:SI 1 "register_operand" "%r")
3084 (match_operand:SI 2 "pic_symbolic_operand" "A")))]
3085 "flag_pic"
3086 "#"
3087 "&& reload_completed"
3088 [(parallel
3089 [(set (match_dup 0)
3090 (plus:SI (match_dup 1)
3091 (match_dup 2)))
3092 (clobber (reg:CC VAX_PSL_REGNUM))])]
3093 "")
3094
3095 (define_insn "*movsymreg_2<ccn><ccnz><ccz>"
3096 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3097 (plus:SI (match_operand:SI 1 "register_operand" "%r")
3098 (match_operand:SI 2 "pic_symbolic_operand" "A")))
3099 (clobber (reg:CC VAX_PSL_REGNUM))]
3100 "flag_pic && reload_completed"
3101 "movab %a2[%1],%0")
3102
3104 ;;- load or push effective address
3105 ;; These come after the move and add/sub patterns
3106 ;; because we don't want pushl $1 turned into pushad 1.
3107 ;; or addl3 r1,r2,r3 turned into movab 0(r1)[r2],r3.
3108
3109 ;; It does not work to use constraints to distinguish pushes from moves,
3110 ;; because < matches any autodecrement, not just a push.
3111
3112 (define_insn_and_split "pushaddr<mode>"
3113 [(set (match_operand:SI 0 "push_operand" "=g")
3114 (match_operand:VAXintQHSD 1 "address_operand" "p"))]
3115 ""
3116 "#"
3117 "reload_completed"
3118 [(parallel
3119 [(set (match_dup 0)
3120 (match_dup 1))
3121 (clobber (reg:CC VAX_PSL_REGNUM))])]
3122 "")
3123
3124 (define_insn "*pushaddr<mode><ccn><ccnz><ccz>"
3125 [(set (match_operand:SI 0 "push_operand" "=g")
3126 (match_operand:VAXintQHSD 1 "address_operand" "p"))
3127 (clobber (reg:CC VAX_PSL_REGNUM))]
3128 "reload_completed"
3129 "pusha<VAXintQHSD:isfx> %a1")
3130
3131 (define_insn_and_split "movaddr<mode>"
3132 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3133 (match_operand:VAXintQHSD 1 "address_operand" "p"))]
3134 ""
3135 "#"
3136 "reload_completed"
3137 [(parallel
3138 [(set (match_dup 0)
3139 (match_dup 1))
3140 (clobber (reg:CC VAX_PSL_REGNUM))])]
3141 "")
3142
3143 (define_insn "*movaddr<mode><ccn><ccnz><ccz>"
3144 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3145 (match_operand:VAXintQHSD 1 "address_operand" "p"))
3146 (clobber (reg:CC VAX_PSL_REGNUM))]
3147 "reload_completed"
3148 "mova<VAXintQHSD:isfx> %a1,%0")
3149
3150 (define_insn_and_split "pushaddr<mode>"
3151 [(set (match_operand:SI 0 "push_operand" "=g")
3152 (match_operand:VAXfp 1 "address_operand" "p"))]
3153 ""
3154 "#"
3155 "reload_completed"
3156 [(parallel
3157 [(set (match_dup 0)
3158 (match_dup 1))
3159 (clobber (reg:CC VAX_PSL_REGNUM))])]
3160 "")
3161
3162 (define_insn "*pushaddr<mode><ccn><ccnz><ccz>"
3163 [(set (match_operand:SI 0 "push_operand" "=g")
3164 (match_operand:VAXfp 1 "address_operand" "p"))
3165 (clobber (reg:CC VAX_PSL_REGNUM))]
3166 "reload_completed"
3167 "pusha<VAXfp:fsfx> %a1")
3168
3169 (define_insn_and_split "movaddr<mode>"
3170 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3171 (match_operand:VAXfp 1 "address_operand" "p"))]
3172 ""
3173 "#"
3174 "reload_completed"
3175 [(parallel
3176 [(set (match_dup 0)
3177 (match_dup 1))
3178 (clobber (reg:CC VAX_PSL_REGNUM))])]
3179 "")
3180
3181 (define_insn "*movaddr<mode>"
3182 [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
3183 (match_operand:VAXfp 1 "address_operand" "p"))
3184 (clobber (reg:CC VAX_PSL_REGNUM))]
3185 "reload_completed"
3186 "mova<VAXfp:fsfx> %a1,%0")
3187
3189 ;; These used to be peepholes, but it is more straightforward to do them
3190 ;; as single insns. However, we must force the output to be a register
3191 ;; if it is not an offsettable address so that we know that we can assign
3192 ;; to it twice.
3193
3194 ;; If we had a good way of evaluating the relative costs, these could be
3195 ;; machine-independent.
3196
3197 ;; Optimize extzv ...,z; andl2 ...,z
3198 ;; or ashl ...,z; andl2 ...,z
3199 ;; with other operands constant. This is what the combiner converts the
3200 ;; above sequences to before attempting to recognize the new insn.
3201
3202 (define_insn_and_split "*andashlnegsi4"
3203 [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
3204 (and:SI (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
3205 (match_operand:QI 2 "const_int_operand" "n"))
3206 (match_operand:SI 3 "const_int_operand" "n")))]
3207 "(INTVAL (operands[3]) & ~((1 << (32 - INTVAL (operands[2]))) - 1)) == 0"
3208 "#"
3209 "&& reload_completed"
3210 [(parallel
3211 [(set (match_dup 0)
3212 (and:SI (ashiftrt:SI (match_dup 1)
3213 (match_dup 2))
3214 (match_dup 3)))
3215 (clobber (reg:CC VAX_PSL_REGNUM))])]
3216 "")
3217
3218 (define_insn "*andashlnegsi4_2<ccn><ccnz><ccz>"
3219 [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
3220 (and:SI (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
3221 (match_operand:QI 2 "const_int_operand" "n"))
3222 (match_operand:SI 3 "const_int_operand" "n")))
3223 (clobber (reg:CC VAX_PSL_REGNUM))]
3224 "(INTVAL (operands[3]) & ~((1 << (32 - INTVAL (operands[2]))) - 1)) == 0
3225 && reload_completed"
3226 "*
3227 {
3228 unsigned long mask1 = INTVAL (operands[3]);
3229 unsigned long mask2 = (1 << (32 - INTVAL (operands[2]))) - 1;
3230
3231 if ((mask1 & mask2) != mask1)
3232 operands[3] = GEN_INT (mask1 & mask2);
3233
3234 return \"rotl %R2,%1,%0\;bicl2 %N3,%0\";
3235 }")
3236
3237 ;; left-shift and mask
3238 ;; The only case where `ashl' is better is if the mask only turns off
3239 ;; bits that the ashl would anyways, in which case it should have been
3240 ;; optimized away.
3241
3242 (define_insn_and_split "*andashlsi4"
3243 [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
3244 (and:SI (ashift:SI (match_operand:SI 1 "general_operand" "nrmT")
3245 (match_operand:QI 2 "const_int_operand" "n"))
3246 (match_operand:SI 3 "const_int_operand" "n")))]
3247 ""
3248 "#"
3249 "reload_completed"
3250 [(parallel
3251 [(set (match_dup 0)
3252 (and:SI (ashift:SI (match_dup 1)
3253 (match_dup 2))
3254 (match_dup 3)))
3255 (clobber (reg:CC VAX_PSL_REGNUM))])]
3256 "")
3257
3258 (define_insn "*andashlsi4_2<ccn><ccnz><ccz>"
3259 [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
3260 (and:SI (ashift:SI (match_operand:SI 1 "general_operand" "nrmT")
3261 (match_operand:QI 2 "const_int_operand" "n"))
3262 (match_operand:SI 3 "const_int_operand" "n")))
3263 (clobber (reg:CC VAX_PSL_REGNUM))]
3264 "reload_completed"
3265 "*
3266 {
3267 operands[3]
3268 = GEN_INT (INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1));
3269 return \"rotl %2,%1,%0\;bicl2 %N3,%0\";
3270 }")
3271
3272 ;; Instruction sequence to sync the VAX instruction stream.
3273 (define_insn "sync_istream"
3274 [(unspec_volatile [(const_int 0)] VUNSPEC_SYNC_ISTREAM)]
3275 ""
3276 "movpsl -(%|sp)\;pushal 1(%|pc)\;rei")
3277
3278 (define_expand "nonlocal_goto"
3279 [(use (match_operand 0 "general_operand" ""))
3280 (use (match_operand 1 "general_operand" ""))
3281 (use (match_operand 2 "general_operand" ""))
3282 (use (match_operand 3 "general_operand" ""))]
3283 ""
3284 {
3285 rtx lab = operands[1];
3286 rtx stack = operands[2];
3287 rtx fp = operands[3];
3288
3289 emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
3290 emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
3291
3292 emit_move_insn (hard_frame_pointer_rtx, fp);
3293 emit_stack_restore (SAVE_NONLOCAL, stack);
3294
3295 emit_use (hard_frame_pointer_rtx);
3296 emit_use (stack_pointer_rtx);
3297
3298 /* We'll convert this to direct jump via a peephole optimization. */
3299 emit_indirect_jump (copy_to_reg (lab));
3300 emit_barrier ();
3301 DONE;
3302 })
3303
3304 (include "builtins.md")
3305