home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gcc-2.7.2.1-base.tgz / gcc-2.7.2.1-base.tar / fsf / gcc / config / vax / vax.md < prev    next >
Text File  |  1996-06-29  |  60KB  |  2,119 lines

  1. ;;- Machine description for GNU compiler, Vax Version
  2. ;;   Copyright (C) 1987, 1988, 1991, 1994, 1995 Free Software Foundation, Inc.
  3.  
  4. ;; This file is part of GNU CC.
  5.  
  6. ;; GNU CC 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 2, or (at your option)
  9. ;; any later version.
  10.  
  11. ;; GNU CC 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 GNU CC; see the file COPYING.  If not, write to
  18. ;; the Free Software Foundation, 59 Temple Place - Suite 330,
  19. ;; Boston, MA 02111-1307, USA.
  20.  
  21.  
  22. ;;- Instruction patterns.  When multiple patterns apply,
  23. ;;- the first one in the file is chosen.
  24. ;;-
  25. ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
  26. ;;-
  27. ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
  28. ;;- updates for most instructions.
  29.  
  30. ;; We don't want to allow a constant operand for test insns because
  31. ;; (set (cc0) (const_int foo)) has no mode information.  Such insns will
  32. ;; be folded while optimizing anyway.
  33.  
  34. (define_insn "tstsi"
  35.   [(set (cc0)
  36.     (match_operand:SI 0 "nonimmediate_operand" "g"))]
  37.   ""
  38.   "tstl %0")
  39.  
  40. (define_insn "tsthi"
  41.   [(set (cc0)
  42.     (match_operand:HI 0 "nonimmediate_operand" "g"))]
  43.   ""
  44.   "tstw %0")
  45.  
  46. (define_insn "tstqi"
  47.   [(set (cc0)
  48.     (match_operand:QI 0 "nonimmediate_operand" "g"))]
  49.   ""
  50.   "tstb %0")
  51.  
  52. (define_insn "tstdf"
  53.   [(set (cc0)
  54.     (match_operand:DF 0 "general_operand" "gF"))]
  55.   ""
  56.   "tst%# %0")
  57.  
  58. (define_insn "tstsf"
  59.   [(set (cc0)
  60.     (match_operand:SF 0 "general_operand" "gF"))]
  61.   ""
  62.   "tstf %0")
  63.  
  64. (define_insn "cmpsi"
  65.   [(set (cc0)
  66.     (compare (match_operand:SI 0 "nonimmediate_operand" "g")
  67.          (match_operand:SI 1 "general_operand" "g")))]
  68.   ""
  69.   "cmpl %0,%1")
  70.  
  71. (define_insn "cmphi"
  72.   [(set (cc0)
  73.     (compare (match_operand:HI 0 "nonimmediate_operand" "g")
  74.          (match_operand:HI 1 "general_operand" "g")))]
  75.   ""
  76.   "cmpw %0,%1")
  77.  
  78. (define_insn "cmpqi"
  79.   [(set (cc0)
  80.     (compare (match_operand:QI 0 "nonimmediate_operand" "g")
  81.          (match_operand:QI 1 "general_operand" "g")))]
  82.   ""
  83.   "cmpb %0,%1")
  84.  
  85. (define_insn "cmpdf"
  86.   [(set (cc0)
  87.     (compare (match_operand:DF 0 "general_operand" "gF,gF")
  88.          (match_operand:DF 1 "general_operand" "G,gF")))]
  89.   ""
  90.   "@
  91.    tst%# %0
  92.    cmp%# %0,%1")
  93.  
  94. (define_insn "cmpsf"
  95.   [(set (cc0)
  96.     (compare (match_operand:SF 0 "general_operand" "gF,gF")
  97.          (match_operand:SF 1 "general_operand" "G,gF")))]
  98.   ""
  99.   "@
  100.    tstf %0
  101.    cmpf %0,%1")
  102.  
  103. (define_insn ""
  104.   [(set (cc0)
  105.     (and:SI (match_operand:SI 0 "general_operand" "g")
  106.         (match_operand:SI 1 "general_operand" "g")))]
  107.   ""
  108.   "bitl %0,%1")
  109.  
  110. (define_insn ""
  111.   [(set (cc0)
  112.     (and:HI (match_operand:HI 0 "general_operand" "g")
  113.         (match_operand:HI 1 "general_operand" "g")))]
  114.   ""
  115.   "bitw %0,%1")
  116.  
  117. (define_insn ""
  118.   [(set (cc0)
  119.     (and:QI (match_operand:QI 0 "general_operand" "g")
  120.         (match_operand:QI 1 "general_operand" "g")))]
  121.   ""
  122.   "bitb %0,%1")
  123.  
  124. ;; The vax has no sltu or sgeu patterns, but does have two-operand
  125. ;; add/subtract with carry.  This is still better than the alternative.
  126. ;; Since the cc0-using insn cannot be separated from the cc0-setting insn,
  127. ;; and the two are created independently, we can't just use a define_expand
  128. ;; to try to optimize this.  (The "movl" and "clrl" insns alter the cc0
  129. ;; flags, but leave the carry flag alone, but that can't easily be expressed.)
  130. ;;
  131. ;; Several two-operator combinations could be added to make slightly more
  132. ;; optimal code, but they'd have to cover all combinations of plus and minus
  133. ;; using match_dup.  If you want to do this, I'd suggest changing the "sgeu"
  134. ;; pattern to something like (minus (const_int 1) (ltu ...)), so fewer
  135. ;; patterns need to be recognized.
  136. ;; -- Ken Raeburn (Raeburn@Watch.COM) 24 August 1991.
  137.  
  138. (define_insn "sltu"
  139.   [(set (match_operand:SI 0 "general_operand" "=ro")
  140.     (ltu (cc0) (const_int 0)))]
  141.   ""
  142.   "clrl %0\;adwc $0,%0")
  143.  
  144. (define_insn "sgeu"
  145.   [(set (match_operand:SI 0 "general_operand" "=ro")
  146.     (geu (cc0) (const_int 0)))]
  147.   ""
  148.   "movl $1,%0\;sbwc $0,%0")
  149.  
  150. (define_insn "movdf"
  151.   [(set (match_operand:DF 0 "general_operand" "=g,g")
  152.     (match_operand:DF 1 "general_operand" "G,gF"))]
  153.   ""
  154.   "@
  155.    clr%# %0
  156.    mov%# %1,%0")
  157.  
  158. (define_insn "movsf"
  159.   [(set (match_operand:SF 0 "general_operand" "=g,g")
  160.     (match_operand:SF 1 "general_operand" "G,gF"))]
  161.   ""
  162.   "@
  163.    clrf %0
  164.    movf %1,%0")
  165.  
  166. ;; Some vaxes don't support this instruction.
  167. ;;(define_insn "movti"
  168. ;;  [(set (match_operand:TI 0 "general_operand" "=g")
  169. ;;    (match_operand:TI 1 "general_operand" "g"))]
  170. ;;  ""
  171. ;;  "movh %1,%0")
  172.  
  173. (define_insn "movdi"
  174.   [(set (match_operand:DI 0 "general_operand" "=g,g")
  175.     (match_operand:DI 1 "general_operand" "I,g"))]
  176.   ""
  177.   "@
  178.    clrq %0
  179.    movq %D1,%0")
  180.  
  181. ;; The VAX move instructions have space-time tradeoffs.  On a microVAX
  182. ;; register-register mov instructions take 3 bytes and 2 CPU cycles.  clrl
  183. ;; takes 2 bytes and 3 cycles.  mov from constant to register takes 2 cycles
  184. ;; if the constant is smaller than 4 bytes, 3 cycles for a longword
  185. ;; constant.  movz, mneg, and mcom are as fast as mov, so movzwl is faster
  186. ;; than movl for positive constants that fit in 16 bits but not 6 bits.  cvt
  187. ;; instructions take 4 cycles.  inc takes 3 cycles.  The machine description
  188. ;; is willing to trade 1 byte for 1 cycle (clrl instead of movl $0; cvtwl
  189. ;; instead of movl).
  190.  
  191. ;; Cycle counts for other models may vary (on a VAX 750 they are similar,
  192. ;; but on a VAX 9000 most move and add instructions with one constant
  193. ;; operand take 1 cycle).
  194.  
  195. ;;  Loads of constants between 64 and 128 used to be done with
  196. ;; "addl3 $63,#,dst" but this is slower than movzbl and takes as much space.
  197.  
  198. (define_insn "movsi"
  199.   [(set (match_operand:SI 0 "general_operand" "=g")
  200.     (match_operand:SI 1 "general_operand" "g"))]
  201.   ""
  202.   "*
  203. {
  204.   rtx link;
  205.   if (operands[1] == const1_rtx
  206.       && (link = find_reg_note (insn, REG_WAS_0, 0))
  207.       /* Make sure the insn that stored the 0 is still present.  */
  208.       && ! INSN_DELETED_P (XEXP (link, 0))
  209.       && GET_CODE (XEXP (link, 0)) != NOTE
  210.       /* Make sure cross jumping didn't happen here.  */
  211.       && no_labels_between_p (XEXP (link, 0), insn)
  212.       /* Make sure the reg hasn't been clobbered.  */
  213.       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
  214.     return \"incl %0\";
  215.   if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
  216.     {
  217.       if (push_operand (operands[0], SImode))
  218.     return \"pushab %a1\";
  219.       return \"movab %a1,%0\";
  220.     }
  221.   if (operands[1] == const0_rtx)
  222.     return \"clrl %0\";
  223.   if (GET_CODE (operands[1]) == CONST_INT
  224.       && (unsigned) INTVAL (operands[1]) >= 64)
  225.     {
  226.       int i = INTVAL (operands[1]);
  227.       if ((unsigned)(~i) < 64)
  228.     return \"mcoml %N1,%0\";
  229.       if ((unsigned)i < 0x100)
  230.     return \"movzbl %1,%0\";
  231.       if (i >= -0x80 && i < 0)
  232.     return \"cvtbl %1,%0\";
  233.       if ((unsigned)i < 0x10000)
  234.     return \"movzwl %1,%0\";
  235.       if (i >= -0x8000 && i < 0)
  236.     return \"cvtwl %1,%0\";
  237.     }
  238.   if (push_operand (operands[0], SImode))
  239.     return \"pushl %1\";
  240.   return \"movl %1,%0\";
  241. }")
  242.  
  243. (define_insn "movhi"
  244.   [(set (match_operand:HI 0 "general_operand" "=g")
  245.     (match_operand:HI 1 "general_operand" "g"))]
  246.   ""
  247.   "*
  248. {
  249.   rtx link;
  250.   if (operands[1] == const1_rtx
  251.       && (link = find_reg_note (insn, REG_WAS_0, 0))
  252.       /* Make sure the insn that stored the 0 is still present.  */
  253.       && ! INSN_DELETED_P (XEXP (link, 0))
  254.       && GET_CODE (XEXP (link, 0)) != NOTE
  255.       /* Make sure cross jumping didn't happen here.  */
  256.       && no_labels_between_p (XEXP (link, 0), insn)
  257.       /* Make sure the reg hasn't been clobbered.  */
  258.       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
  259.     return \"incw %0\";
  260.  
  261.   if (GET_CODE (operands[1]) == CONST_INT)
  262.     {
  263.       int i = INTVAL (operands[1]);
  264.       if (i == 0)
  265.     return \"clrw %0\";
  266.       else if ((unsigned int)i < 64)
  267.     return \"movw %1,%0\";
  268.       else if ((unsigned int)~i < 64)
  269.     return \"mcomw %H1,%0\";
  270.       else if ((unsigned int)i < 256)
  271.     return \"movzbw %1,%0\";
  272.     }
  273.   return \"movw %1,%0\";
  274. }")
  275.  
  276. (define_insn "movstricthi"
  277.   [(set (strict_low_part (match_operand:HI 0 "register_operand" "=g"))
  278.     (match_operand:HI 1 "general_operand" "g"))]
  279.   ""
  280.   "*
  281. {
  282.   if (GET_CODE (operands[1]) == CONST_INT)
  283.     {
  284.       int i = INTVAL (operands[1]);
  285.       if (i == 0)
  286.     return \"clrw %0\";
  287.       else if ((unsigned int)i < 64)
  288.     return \"movw %1,%0\";
  289.       else if ((unsigned int)~i < 64)
  290.     return \"mcomw %H1,%0\";
  291.       else if ((unsigned int)i < 256)
  292.     return \"movzbw %1,%0\";
  293.     }
  294.   return \"movw %1,%0\";
  295. }")
  296.  
  297. (define_insn "movqi"
  298.   [(set (match_operand:QI 0 "general_operand" "=g")
  299.     (match_operand:QI 1 "general_operand" "g"))]
  300.   ""
  301.   "*
  302. {
  303.   rtx link;
  304.   if (operands[1] == const1_rtx
  305.       && (link = find_reg_note (insn, REG_WAS_0, 0))
  306.       /* Make sure the insn that stored the 0 is still present.  */
  307.       && ! INSN_DELETED_P (XEXP (link, 0))
  308.       && GET_CODE (XEXP (link, 0)) != NOTE
  309.       /* Make sure cross jumping didn't happen here.  */
  310.       && no_labels_between_p (XEXP (link, 0), insn)
  311.       /* Make sure the reg hasn't been clobbered.  */
  312.       && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
  313.     return \"incb %0\";
  314.  
  315.   if (GET_CODE (operands[1]) == CONST_INT)
  316.     {
  317.       int i = INTVAL (operands[1]);
  318.       if (i == 0)
  319.     return \"clrb %0\";
  320.       else if ((unsigned int)~i < 64)
  321.     return \"mcomb %B1,%0\";
  322.     }
  323.   return \"movb %1,%0\";
  324. }")
  325.  
  326. (define_insn "movstrictqi"
  327.   [(set (strict_low_part (match_operand:QI 0 "register_operand" "=g"))
  328.     (match_operand:QI 1 "general_operand" "g"))]
  329.   ""
  330.   "*
  331. {
  332.   if (GET_CODE (operands[1]) == CONST_INT)
  333.     {
  334.       int i = INTVAL (operands[1]);
  335.       if (i == 0)
  336.     return \"clrb %0\";
  337.       else if ((unsigned int)~i < 64)
  338.     return \"mcomb %B1,%0\";
  339.     }
  340.   return \"movb %1,%0\";
  341. }")
  342.  
  343. ;; This is here to accept 4 arguments and pass the first 3 along
  344. ;; to the movstrhi1 pattern that really does the work.
  345. (define_expand "movstrhi"
  346.   [(set (match_operand:BLK 0 "general_operand" "=g")
  347.     (match_operand:BLK 1 "general_operand" "g"))
  348.    (use (match_operand:HI 2 "general_operand" "g"))
  349.    (match_operand 3 "" "")]
  350.   ""
  351.   "
  352.   emit_insn (gen_movstrhi1 (operands[0], operands[1], operands[2]));
  353.   DONE;
  354. ")
  355.  
  356. ;; The definition of this insn does not really explain what it does,
  357. ;; but it should suffice
  358. ;; that anything generated as this insn will be recognized as one
  359. ;; and that it won't successfully combine with anything.
  360. (define_insn "movstrhi1"
  361.   [(set (match_operand:BLK 0 "general_operand" "=g")
  362.     (match_operand:BLK 1 "general_operand" "g"))
  363.    (use (match_operand:HI 2 "general_operand" "g"))
  364.    (clobber (reg:SI 0))
  365.    (clobber (reg:SI 1))
  366.    (clobber (reg:SI 2))
  367.    (clobber (reg:SI 3))
  368.    (clobber (reg:SI 4))
  369.    (clobber (reg:SI 5))]
  370.   ""
  371.   "movc3 %2,%1,%0")
  372.  
  373. ;; Extension and truncation insns.
  374.  
  375. (define_insn "truncsiqi2"
  376.   [(set (match_operand:QI 0 "general_operand" "=g")
  377.     (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "g")))]
  378.   ""
  379.   "cvtlb %1,%0")
  380.  
  381. (define_insn "truncsihi2"
  382.   [(set (match_operand:HI 0 "general_operand" "=g")
  383.     (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "g")))]
  384.   ""
  385.   "cvtlw %1,%0")
  386.  
  387. (define_insn "trunchiqi2"
  388.   [(set (match_operand:QI 0 "general_operand" "=g")
  389.     (truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))]
  390.   ""
  391.   "cvtwb %1,%0")
  392.  
  393. (define_insn "extendhisi2"
  394.   [(set (match_operand:SI 0 "general_operand" "=g")
  395.     (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
  396.   ""
  397.   "cvtwl %1,%0")
  398.  
  399. (define_insn "extendqihi2"
  400.   [(set (match_operand:HI 0 "general_operand" "=g")
  401.     (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
  402.   ""
  403.   "cvtbw %1,%0")
  404.  
  405. (define_insn "extendqisi2"
  406.   [(set (match_operand:SI 0 "general_operand" "=g")
  407.     (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
  408.   ""
  409.   "cvtbl %1,%0")
  410.  
  411. (define_insn "extendsfdf2"
  412.   [(set (match_operand:DF 0 "general_operand" "=g")
  413.     (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))]
  414.   ""
  415.   "cvtf%# %1,%0")
  416.  
  417. (define_insn "truncdfsf2"
  418.   [(set (match_operand:SF 0 "general_operand" "=g")
  419.     (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))]
  420.   ""
  421.   "cvt%#f %1,%0")
  422.  
  423. (define_insn "zero_extendhisi2"
  424.   [(set (match_operand:SI 0 "general_operand" "=g")
  425.     (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
  426.   ""
  427.   "movzwl %1,%0")
  428.  
  429. (define_insn "zero_extendqihi2"
  430.   [(set (match_operand:HI 0 "general_operand" "=g")
  431.     (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
  432.   ""
  433.   "movzbw %1,%0")
  434.  
  435. (define_insn "zero_extendqisi2"
  436.   [(set (match_operand:SI 0 "general_operand" "=g")
  437.     (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
  438.   ""
  439.   "movzbl %1,%0")
  440.  
  441. ;; Fix-to-float conversion insns.
  442.  
  443. (define_insn "floatsisf2"
  444.   [(set (match_operand:SF 0 "general_operand" "=g")
  445.     (float:SF (match_operand:SI 1 "nonimmediate_operand" "g")))]
  446.   ""
  447.   "cvtlf %1,%0")
  448.  
  449. (define_insn "floatsidf2"
  450.   [(set (match_operand:DF 0 "general_operand" "=g")
  451.     (float:DF (match_operand:SI 1 "nonimmediate_operand" "g")))]
  452.   ""
  453.   "cvtl%# %1,%0")
  454.  
  455. (define_insn "floathisf2"
  456.   [(set (match_operand:SF 0 "general_operand" "=g")
  457.     (float:SF (match_operand:HI 1 "nonimmediate_operand" "g")))]
  458.   ""
  459.   "cvtwf %1,%0")
  460.  
  461. (define_insn "floathidf2"
  462.   [(set (match_operand:DF 0 "general_operand" "=g")
  463.     (float:DF (match_operand:HI 1 "nonimmediate_operand" "g")))]
  464.   ""
  465.   "cvtw%# %1,%0")
  466.  
  467. (define_insn "floatqisf2"
  468.   [(set (match_operand:SF 0 "general_operand" "=g")
  469.     (float:SF (match_operand:QI 1 "nonimmediate_operand" "g")))]
  470.   ""
  471.   "cvtbf %1,%0")
  472.  
  473. (define_insn "floatqidf2"
  474.   [(set (match_operand:DF 0 "general_operand" "=g")
  475.     (float:DF (match_operand:QI 1 "nonimmediate_operand" "g")))]
  476.   ""
  477.   "cvtb%# %1,%0")
  478.  
  479. ;; Float-to-fix conversion insns.
  480.  
  481. (define_insn "fix_truncsfqi2"
  482.   [(set (match_operand:QI 0 "general_operand" "=g")
  483.     (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
  484.   ""
  485.   "cvtfb %1,%0")
  486.  
  487. (define_insn "fix_truncsfhi2"
  488.   [(set (match_operand:HI 0 "general_operand" "=g")
  489.     (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
  490.   ""
  491.   "cvtfw %1,%0")
  492.  
  493. (define_insn "fix_truncsfsi2"
  494.   [(set (match_operand:SI 0 "general_operand" "=g")
  495.     (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
  496.   ""
  497.   "cvtfl %1,%0")
  498.  
  499. (define_insn "fix_truncdfqi2"
  500.   [(set (match_operand:QI 0 "general_operand" "=g")
  501.     (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
  502.   ""
  503.   "cvt%#b %1,%0")
  504.  
  505. (define_insn "fix_truncdfhi2"
  506.   [(set (match_operand:HI 0 "general_operand" "=g")
  507.     (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
  508.   ""
  509.   "cvt%#w %1,%0")
  510.  
  511. (define_insn "fix_truncdfsi2"
  512.   [(set (match_operand:SI 0 "general_operand" "=g")
  513.     (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
  514.   ""
  515.   "cvt%#l %1,%0")
  516.  
  517. ;;- All kinds of add instructions.
  518.  
  519. (define_insn "adddf3"
  520.   [(set (match_operand:DF 0 "general_operand" "=g,g,g")
  521.     (plus:DF (match_operand:DF 1 "general_operand" "0,gF,gF")
  522.          (match_operand:DF 2 "general_operand" "gF,0,gF")))]
  523.   ""
  524.   "@
  525.    add%#2 %2,%0
  526.    add%#2 %1,%0
  527.    add%#3 %1,%2,%0")
  528.  
  529. (define_insn "addsf3"
  530.   [(set (match_operand:SF 0 "general_operand" "=g,g,g")
  531.     (plus:SF (match_operand:SF 1 "general_operand" "0,gF,gF")
  532.          (match_operand:SF 2 "general_operand" "gF,0,gF")))]
  533.   ""
  534.   "@
  535.    addf2 %2,%0
  536.    addf2 %1,%0
  537.    addf3 %1,%2,%0")
  538.  
  539. /* The space-time-opcode tradeoffs for addition vary by model of VAX.
  540.  
  541.    On a VAX 3 "movab (r1)[r2],r3" is faster than "addl3 r1,r2,r3",
  542.    but it not faster on other models.
  543.  
  544.    "movab #(r1),r2" is usually shorter than "addl3 #,r1,r2", and is
  545.    faster on a VAX 3, but some VAXes (e.g. VAX 9000) will stall if
  546.    a register is used in an address too soon after it is set.
  547.    Compromise by using movab only when it is shorter than the add
  548.    or the base register in the address is one of sp, ap, and fp,
  549.    which are not modified very often.  */
  550.  
  551.  
  552. (define_insn "addsi3"
  553.   [(set (match_operand:SI 0 "general_operand" "=g")
  554.     (plus:SI (match_operand:SI 1 "general_operand" "g")
  555.          (match_operand:SI 2 "general_operand" "g")))]
  556.   ""
  557.   "*
  558. {
  559.   if (rtx_equal_p (operands[0], operands[1]))
  560.     {
  561.       if (operands[2] == const1_rtx)
  562.     return \"incl %0\";
  563.       if (operands[2] == constm1_rtx)
  564.     return \"decl %0\";
  565.       if (GET_CODE (operands[2]) == CONST_INT
  566.       && (unsigned) (- INTVAL (operands[2])) < 64)
  567.     return \"subl2 $%n2,%0\";
  568.       if (GET_CODE (operands[2]) == CONST_INT
  569.       && (unsigned) INTVAL (operands[2]) >= 64
  570.       && GET_CODE (operands[1]) == REG
  571.       && ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768)
  572.           || REGNO (operands[1]) > 11))
  573.     return \"movab %c2(%1),%0\";
  574.       return \"addl2 %2,%0\";
  575.     }
  576.   if (rtx_equal_p (operands[0], operands[2]))
  577.     return \"addl2 %1,%0\";
  578.  
  579.   if (GET_CODE (operands[2]) == CONST_INT
  580.       && INTVAL (operands[2]) < 32767
  581.       && INTVAL (operands[2]) > -32768
  582.       && GET_CODE (operands[1]) == REG
  583.       && push_operand (operands[0], SImode))
  584.     return \"pushab %c2(%1)\";
  585.  
  586.   if (GET_CODE (operands[2]) == CONST_INT
  587.       && (unsigned) (- INTVAL (operands[2])) < 64)
  588.     return \"subl3 $%n2,%1,%0\";
  589.  
  590.   if (GET_CODE (operands[2]) == CONST_INT
  591.       && (unsigned) INTVAL (operands[2]) >= 64
  592.       && GET_CODE (operands[1]) == REG
  593.       && ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768)
  594.       || REGNO (operands[1]) > 11))
  595.     return \"movab %c2(%1),%0\";
  596.  
  597.   /* Add this if using gcc on a VAX 3xxx:
  598.   if (REG_P (operands[1]) && REG_P (operands[2]))
  599.     return \"movab (%1)[%2],%0\";
  600.   */
  601.   return \"addl3 %1,%2,%0\";
  602. }")
  603.  
  604. (define_insn "addhi3"
  605.   [(set (match_operand:HI 0 "general_operand" "=g")
  606.     (plus:HI (match_operand:HI 1 "general_operand" "g")
  607.          (match_operand:HI 2 "general_operand" "g")))]
  608.   ""
  609.   "*
  610. {
  611.   if (rtx_equal_p (operands[0], operands[1]))
  612.     {
  613.       if (operands[2] == const1_rtx)
  614.     return \"incw %0\";
  615.       if (operands[2] == constm1_rtx)
  616.     return \"decw %0\";
  617.       if (GET_CODE (operands[2]) == CONST_INT
  618.       && (unsigned) (- INTVAL (operands[2])) < 64)
  619.     return \"subw2 $%n2,%0\";
  620.       return \"addw2 %2,%0\";
  621.     }
  622.   if (rtx_equal_p (operands[0], operands[2]))
  623.     return \"addw2 %1,%0\";
  624.   if (GET_CODE (operands[2]) == CONST_INT
  625.       && (unsigned) (- INTVAL (operands[2])) < 64)
  626.     return \"subw3 $%n2,%1,%0\";
  627.   return \"addw3 %1,%2,%0\";
  628. }")
  629.  
  630. (define_insn "addqi3"
  631.   [(set (match_operand:QI 0 "general_operand" "=g")
  632.     (plus:QI (match_operand:QI 1 "general_operand" "g")
  633.          (match_operand:QI 2 "general_operand" "g")))]
  634.   ""
  635.   "*
  636. {
  637.   if (rtx_equal_p (operands[0], operands[1]))
  638.     {
  639.       if (operands[2] == const1_rtx)
  640.     return \"incb %0\";
  641.       if (operands[2] == constm1_rtx)
  642.     return \"decb %0\";
  643.       if (GET_CODE (operands[2]) == CONST_INT
  644.       && (unsigned) (- INTVAL (operands[2])) < 64)
  645.     return \"subb2 $%n2,%0\";
  646.       return \"addb2 %2,%0\";
  647.     }
  648.   if (rtx_equal_p (operands[0], operands[2]))
  649.     return \"addb2 %1,%0\";
  650.   if (GET_CODE (operands[2]) == CONST_INT
  651.       && (unsigned) (- INTVAL (operands[2])) < 64)
  652.     return \"subb3 $%n2,%1,%0\";
  653.   return \"addb3 %1,%2,%0\";
  654. }")
  655.  
  656. ;; The add-with-carry (adwc) instruction only accepts two operands.
  657. (define_insn "adddi3"
  658.   [(set (match_operand:DI 0 "general_operand" "=ro>,ro>")
  659.     (plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")
  660.          (match_operand:DI 2 "general_operand" "Fro,F")))]
  661.   ""
  662.   "*
  663. {
  664.   rtx low[3];
  665.   char *pattern;
  666.   int carry = 1;
  667.  
  668.   split_quadword_operands (operands, low, 3);
  669.   /* Add low parts.  */
  670.   if (rtx_equal_p (operands[0], operands[1]))
  671.     {
  672.       if (low[2] == const0_rtx)
  673.     /* Should examine operand, punt if not POST_INC.  */
  674.     pattern = \"tstl %0\", carry = 0;
  675.       else if (low[2] == const1_rtx)
  676.         pattern = \"incl %0\";
  677.       else
  678.         pattern = \"addl2 %2,%0\";
  679.     }
  680.   else
  681.     {
  682.       if (low[2] == const0_rtx)
  683.     pattern = \"movl %1,%0\", carry = 0;
  684.       else
  685.     pattern = \"addl3 %2,%1,%0\";
  686.     }
  687.   if (pattern)
  688.     output_asm_insn (pattern, low);
  689.   if (!carry)
  690.     /* If CARRY is 0, we don't have any carry value to worry about.  */
  691.     return OUT_FCN (CODE_FOR_addsi3) (operands, insn);
  692.   /* %0 = C + %1 + %2 */
  693.   if (!rtx_equal_p (operands[0], operands[1]))
  694.     output_asm_insn ((operands[1] == const0_rtx
  695.               ? \"clrl %0\"
  696.               : \"movl %1,%0\"), operands);
  697.   return \"adwc %2,%0\";
  698. }")
  699.  
  700. ;;- All kinds of subtract instructions.
  701.  
  702. (define_insn "subdf3"
  703.   [(set (match_operand:DF 0 "general_operand" "=g,g")
  704.     (minus:DF (match_operand:DF 1 "general_operand" "0,gF")
  705.           (match_operand:DF 2 "general_operand" "gF,gF")))]
  706.   ""
  707.   "@
  708.    sub%#2 %2,%0
  709.    sub%#3 %2,%1,%0")
  710.  
  711. (define_insn "subsf3"
  712.   [(set (match_operand:SF 0 "general_operand" "=g,g")
  713.     (minus:SF (match_operand:SF 1 "general_operand" "0,gF")
  714.           (match_operand:SF 2 "general_operand" "gF,gF")))]
  715.   ""
  716.   "@
  717.    subf2 %2,%0
  718.    subf3 %2,%1,%0")
  719.  
  720. (define_insn "subsi3"
  721.   [(set (match_operand:SI 0 "general_operand" "=g,g")
  722.     (minus:SI (match_operand:SI 1 "general_operand" "0,g")
  723.           (match_operand:SI 2 "general_operand" "g,g")))]
  724.   ""
  725.   "@
  726.    subl2 %2,%0
  727.    subl3 %2,%1,%0")
  728.  
  729. (define_insn "subhi3"
  730.   [(set (match_operand:HI 0 "general_operand" "=g,g")
  731.     (minus:HI (match_operand:HI 1 "general_operand" "0,g")
  732.           (match_operand:HI 2 "general_operand" "g,g")))]
  733.   ""
  734.   "@
  735.    subw2 %2,%0
  736.    subw3 %2,%1,%0")
  737.  
  738. (define_insn "subqi3"
  739.   [(set (match_operand:QI 0 "general_operand" "=g,g")
  740.     (minus:QI (match_operand:QI 1 "general_operand" "0,g")
  741.           (match_operand:QI 2 "general_operand" "g,g")))]
  742.   ""
  743.   "@
  744.    subb2 %2,%0
  745.    subb3 %2,%1,%0")
  746.  
  747. ;; The subtract-with-carry (sbwc) instruction only takes two operands.
  748. (define_insn "subdi3"
  749.   [(set (match_operand:DI 0 "general_operand" "=or>,or>")
  750.     (minus:DI (match_operand:DI 1 "general_operand" "0,or>")
  751.           (match_operand:DI 2 "general_operand" "For,F")))]
  752.   ""
  753.   "*
  754. {
  755.   rtx low[3];
  756.   char *pattern;
  757.   int carry = 1;
  758.  
  759.   split_quadword_operands (operands, low, 3);
  760.   /* Subtract low parts.  */
  761.   if (rtx_equal_p (operands[0], operands[1]))
  762.     {
  763.       if (low[2] == const0_rtx)
  764.     pattern = 0, carry = 0;
  765.       else if (low[2] == constm1_rtx)
  766.     pattern = \"decl %0\";
  767.       else
  768.     pattern = \"subl2 %2,%0\";
  769.     }
  770.   else
  771.     {
  772.       if (low[2] == constm1_rtx)
  773.     pattern = \"decl %0\";
  774.       else if (low[2] == const0_rtx)
  775.     pattern = OUT_FCN (CODE_FOR_movsi) (low, insn), carry = 0;
  776.       else
  777.     pattern = \"subl3 %2,%1,%0\";
  778.     }
  779.   if (pattern)
  780.     output_asm_insn (pattern, low);
  781.   if (carry)
  782.     {
  783.       if (!rtx_equal_p (operands[0], operands[1]))
  784.     return \"movl %1,%0\;sbwc %2,%0\";
  785.       return \"sbwc %2,%0\";
  786.       /* %0 = %2 - %1 - C */
  787.     }
  788.   return OUT_FCN (CODE_FOR_subsi3) (operands, insn);
  789. }")
  790.  
  791. ;;- Multiply instructions.
  792.  
  793. (define_insn "muldf3"
  794.   [(set (match_operand:DF 0 "general_operand" "=g,g,g")
  795.     (mult:DF (match_operand:DF 1 "general_operand" "0,gF,gF")
  796.          (match_operand:DF 2 "general_operand" "gF,0,gF")))]
  797.   ""
  798.   "@
  799.    mul%#2 %2,%0
  800.    mul%#2 %1,%0
  801.    mul%#3 %1,%2,%0")
  802.  
  803. (define_insn "mulsf3"
  804.   [(set (match_operand:SF 0 "general_operand" "=g,g,g")
  805.     (mult:SF (match_operand:SF 1 "general_operand" "0,gF,gF")
  806.          (match_operand:SF 2 "general_operand" "gF,0,gF")))]
  807.   ""
  808.   "@
  809.    mulf2 %2,%0
  810.    mulf2 %1,%0
  811.    mulf3 %1,%2,%0")
  812.  
  813. (define_insn "mulsi3"
  814.   [(set (match_operand:SI 0 "general_operand" "=g,g,g")
  815.     (mult:SI (match_operand:SI 1 "general_operand" "0,g,g")
  816.          (match_operand:SI 2 "general_operand" "g,0,g")))]
  817.   ""
  818.   "@
  819.    mull2 %2,%0
  820.    mull2 %1,%0
  821.    mull3 %1,%2,%0")
  822.  
  823. (define_insn "mulhi3"
  824.   [(set (match_operand:HI 0 "general_operand" "=g,g,")
  825.     (mult:HI (match_operand:HI 1 "general_operand" "0,g,g")
  826.          (match_operand:HI 2 "general_operand" "g,0,g")))]
  827.   ""
  828.   "@
  829.    mulw2 %2,%0
  830.    mulw2 %1,%0
  831.    mulw3 %1,%2,%0")
  832.  
  833. (define_insn "mulqi3"
  834.   [(set (match_operand:QI 0 "general_operand" "=g,g,g")
  835.     (mult:QI (match_operand:QI 1 "general_operand" "0,g,g")
  836.          (match_operand:QI 2 "general_operand" "g,0,g")))]
  837.   ""
  838.   "@
  839.    mulb2 %2,%0
  840.    mulb2 %1,%0
  841.    mulb3 %1,%2,%0")
  842.  
  843. (define_insn "mulsidi3"
  844.   [(set (match_operand:DI 0 "general_operand" "=g")
  845.     (mult:DI (sign_extend:DI
  846.           (match_operand:SI 1 "nonimmediate_operand" "g"))
  847.          (sign_extend:DI
  848.           (match_operand:SI 2 "nonimmediate_operand" "g"))))]
  849.   ""
  850.   "emul %1,%2,$0,%0")
  851.  
  852. (define_insn ""
  853.   [(set (match_operand:DI 0 "general_operand" "=g")
  854.     (plus:DI
  855.      (mult:DI (sign_extend:DI
  856.            (match_operand:SI 1 "nonimmediate_operand" "g"))
  857.           (sign_extend:DI
  858.            (match_operand:SI 2 "nonimmediate_operand" "g")))
  859.      (sign_extend:DI (match_operand:SI 3 "nonimmediate_operand" "g"))))]
  860.   ""
  861.   "emul %1,%2,%3,%0")
  862.  
  863. ;; 'F' constraint means type CONST_DOUBLE
  864. (define_insn ""
  865.   [(set (match_operand:DI 0 "general_operand" "=g")
  866.     (plus:DI
  867.      (mult:DI (sign_extend:DI
  868.            (match_operand:SI 1 "nonimmediate_operand" "g"))
  869.           (sign_extend:DI
  870.            (match_operand:SI 2 "nonimmediate_operand" "g")))
  871.      (match_operand:DI 3 "immediate_operand" "F")))]
  872.   "GET_CODE (operands[3]) == CONST_DOUBLE 
  873.     && CONST_DOUBLE_HIGH (operands[3]) == (CONST_DOUBLE_LOW (operands[3]) >> 31)"
  874.   "*
  875. {
  876.   if (CONST_DOUBLE_HIGH (operands[3]))
  877.     operands[3] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (operands[3]));
  878.   return \"emul %1,%2,%3,%0\";
  879. }")
  880.  
  881. ;;- Divide instructions.
  882.  
  883. (define_insn "divdf3"
  884.   [(set (match_operand:DF 0 "general_operand" "=g,g")
  885.     (div:DF (match_operand:DF 1 "general_operand" "0,gF")
  886.         (match_operand:DF 2 "general_operand" "gF,gF")))]
  887.   ""
  888.   "@
  889.    div%#2 %2,%0
  890.    div%#3 %2,%1,%0")
  891.  
  892. (define_insn "divsf3"
  893.   [(set (match_operand:SF 0 "general_operand" "=g,g")
  894.     (div:SF (match_operand:SF 1 "general_operand" "0,gF")
  895.         (match_operand:SF 2 "general_operand" "gF,gF")))]
  896.   ""
  897.   "@
  898.    divf2 %2,%0
  899.    divf3 %2,%1,%0")
  900.  
  901. (define_insn "divsi3"
  902.   [(set (match_operand:SI 0 "general_operand" "=g,g")
  903.     (div:SI (match_operand:SI 1 "general_operand" "0,g")
  904.         (match_operand:SI 2 "general_operand" "g,g")))]
  905.   ""
  906.   "@
  907.    divl2 %2,%0
  908.    divl3 %2,%1,%0")
  909.  
  910. (define_insn "divhi3"
  911.   [(set (match_operand:HI 0 "general_operand" "=g,g")
  912.     (div:HI (match_operand:HI 1 "general_operand" "0,g")
  913.         (match_operand:HI 2 "general_operand" "g,g")))]
  914.   ""
  915.   "@
  916.    divw2 %2,%0
  917.    divw3 %2,%1,%0")
  918.  
  919. (define_insn "divqi3"
  920.   [(set (match_operand:QI 0 "general_operand" "=g,g")
  921.     (div:QI (match_operand:QI 1 "general_operand" "0,g")
  922.         (match_operand:QI 2 "general_operand" "g,g")))]
  923.   ""
  924.   "@
  925.    divb2 %2,%0
  926.    divb3 %2,%1,%0")
  927.  
  928. ;This is left out because it is very slow;
  929. ;we are better off programming around the "lack" of this insn.
  930. ;(define_insn "divmoddisi4"
  931. ;  [(set (match_operand:SI 0 "general_operand" "=g")
  932. ;    (div:SI (match_operand:DI 1 "general_operand" "g")
  933. ;        (match_operand:SI 2 "general_operand" "g")))
  934. ;   (set (match_operand:SI 3 "general_operand" "=g")
  935. ;    (mod:SI (match_operand:DI 1 "general_operand" "g")
  936. ;        (match_operand:SI 2 "general_operand" "g")))]
  937. ;  ""
  938. ;  "ediv %2,%1,%0,%3")
  939.  
  940. ;; Bit-and on the vax is done with a clear-bits insn.
  941. (define_expand "andsi3"
  942.   [(set (match_operand:SI 0 "general_operand" "=g")
  943.     (and:SI (not:SI (match_operand:SI 1 "general_operand" "g"))
  944.         (match_operand:SI 2 "general_operand" "g")))]
  945.   ""
  946.   "
  947. {
  948.   rtx op1 = operands[1];
  949.  
  950.   /* If there is a constant argument, complement that one.  */
  951.   if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT)
  952.     {
  953.       operands[1] = operands[2];
  954.       operands[2] = op1;
  955.       op1 = operands[1];
  956.     }
  957.  
  958.   if (GET_CODE (op1) == CONST_INT)
  959.     operands[1] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (op1));
  960.   else
  961.     operands[1] = expand_unop (SImode, one_cmpl_optab, op1, 0, 1);
  962. }")
  963.  
  964. (define_expand "andhi3"
  965.   [(set (match_operand:HI 0 "general_operand" "=g")
  966.     (and:HI (not:HI (match_operand:HI 1 "general_operand" "g"))
  967.         (match_operand:HI 2 "general_operand" "g")))]
  968.   ""
  969.   "
  970. {
  971.   rtx op1 = operands[1];
  972.  
  973.   if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT)
  974.     {
  975.       operands[1] = operands[2];
  976.       operands[2] = op1;
  977.       op1 = operands[1];
  978.     }
  979.  
  980.   if (GET_CODE (op1) == CONST_INT)
  981.     operands[1] = gen_rtx (CONST_INT, VOIDmode, 65535 & ~INTVAL (op1));
  982.   else
  983.     operands[1] = expand_unop (HImode, one_cmpl_optab, op1, 0, 1);
  984. }")
  985.  
  986. (define_expand "andqi3"
  987.   [(set (match_operand:QI 0 "general_operand" "=g")
  988.     (and:QI (not:QI (match_operand:QI 1 "general_operand" "g"))
  989.         (match_operand:QI 2 "general_operand" "g")))]
  990.   ""
  991.   "
  992. {
  993.   rtx op1 = operands[1];
  994.  
  995.   if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT)
  996.     {
  997.      operands[1] = operands[2];
  998.      operands[2] = op1;
  999.      op1 = operands[1];
  1000.    }
  1001.  
  1002.   if (GET_CODE (op1) == CONST_INT)
  1003.     operands[1] = gen_rtx (CONST_INT, VOIDmode, 255 & ~INTVAL (op1));
  1004.   else
  1005.     operands[1] = expand_unop (QImode, one_cmpl_optab, op1, 0, 1);
  1006. }")
  1007.  
  1008. (define_insn ""
  1009.   [(set (match_operand:SI 0 "general_operand" "=g,g")
  1010.     (and:SI (not:SI (match_operand:SI 1 "general_operand" "g,g"))
  1011.         (match_operand:SI 2 "general_operand" "0,g")))]
  1012.   ""
  1013.   "@
  1014.    bicl2 %1,%0
  1015.    bicl3 %1,%2,%0")
  1016.  
  1017. (define_insn ""
  1018.   [(set (match_operand:HI 0 "general_operand" "=g,g")
  1019.     (and:HI (not:HI (match_operand:HI 1 "general_operand" "g,g"))
  1020.         (match_operand:HI 2 "general_operand" "0,g")))]
  1021.   ""
  1022.   "@
  1023.    bicw2 %1,%0
  1024.    bicw3 %1,%2,%0")
  1025.  
  1026. (define_insn ""
  1027.   [(set (match_operand:QI 0 "general_operand" "=g,g")
  1028.     (and:QI (not:QI (match_operand:QI 1 "general_operand" "g,g"))
  1029.         (match_operand:QI 2 "general_operand" "0,g")))]
  1030.   ""
  1031.   "@
  1032.    bicb2 %1,%0
  1033.    bicb3 %1,%2,%0")
  1034.  
  1035. ;; The following used to be needed because constant propagation can
  1036. ;; create them starting from the bic insn patterns above.  This is no
  1037. ;; longer a problem.  However, having these patterns allows optimization
  1038. ;; opportunities in combine.c.
  1039.  
  1040. (define_insn ""
  1041.   [(set (match_operand:SI 0 "general_operand" "=g,g")
  1042.     (and:SI (match_operand:SI 1 "general_operand" "0,g")
  1043.         (match_operand:SI 2 "const_int_operand" "n,n")))]
  1044.   ""
  1045.   "@
  1046.    bicl2 %N2,%0
  1047.    bicl3 %N2,%1,%0")
  1048.  
  1049. (define_insn ""
  1050.   [(set (match_operand:HI 0 "general_operand" "=g,g")
  1051.     (and:HI (match_operand:HI 1 "general_operand" "0,g")
  1052.         (match_operand:HI 2 "const_int_operand" "n,n")))]
  1053.   ""
  1054.   "@
  1055.    bicw2 %H2,%0
  1056.    bicw3 %H2,%1,%0")
  1057.  
  1058. (define_insn ""
  1059.   [(set (match_operand:QI 0 "general_operand" "=g,g")
  1060.     (and:QI (match_operand:QI 1 "general_operand" "0,g")
  1061.         (match_operand:QI 2 "const_int_operand" "n,n")))]
  1062.   ""
  1063.   "@
  1064.    bicb2 %B2,%0
  1065.    bicb3 %B2,%1,%0")
  1066.  
  1067. ;;- Bit set instructions.
  1068.  
  1069. (define_insn "iorsi3"
  1070.   [(set (match_operand:SI 0 "general_operand" "=g,g,g")
  1071.     (ior:SI (match_operand:SI 1 "general_operand" "0,g,g")
  1072.         (match_operand:SI 2 "general_operand" "g,0,g")))]
  1073.   ""
  1074.   "@
  1075.    bisl2 %2,%0
  1076.    bisl2 %1,%0
  1077.    bisl3 %2,%1,%0")
  1078.  
  1079. (define_insn "iorhi3"
  1080.   [(set (match_operand:HI 0 "general_operand" "=g,g,g")
  1081.     (ior:HI (match_operand:HI 1 "general_operand" "0,g,g")
  1082.         (match_operand:HI 2 "general_operand" "g,0,g")))]
  1083.   ""
  1084.   "@
  1085.    bisw2 %2,%0
  1086.    bisw2 %1,%0
  1087.    bisw3 %2,%1,%0")
  1088.  
  1089. (define_insn "iorqi3"
  1090.   [(set (match_operand:QI 0 "general_operand" "=g,g,g")
  1091.     (ior:QI (match_operand:QI 1 "general_operand" "0,g,g")
  1092.         (match_operand:QI 2 "general_operand" "g,0,g")))]
  1093.   ""
  1094.   "@
  1095.    bisb2 %2,%0
  1096.    bisb2 %1,%0
  1097.    bisb3 %2,%1,%0")
  1098.  
  1099. ;;- xor instructions.
  1100.  
  1101. (define_insn "xorsi3"
  1102.   [(set (match_operand:SI 0 "general_operand" "=g,g,g")
  1103.     (xor:SI (match_operand:SI 1 "general_operand" "0,g,g")
  1104.         (match_operand:SI 2 "general_operand" "g,0,g")))]
  1105.   ""
  1106.   "@
  1107.    xorl2 %2,%0
  1108.    xorl2 %1,%0
  1109.    xorl3 %2,%1,%0")
  1110.  
  1111. (define_insn "xorhi3"
  1112.   [(set (match_operand:HI 0 "general_operand" "=g,g,g")
  1113.     (xor:HI (match_operand:HI 1 "general_operand" "0,g,g")
  1114.         (match_operand:HI 2 "general_operand" "g,0,g")))]
  1115.   ""
  1116.   "@
  1117.    xorw2 %2,%0
  1118.    xorw2 %1,%0
  1119.    xorw3 %2,%1,%0")
  1120.  
  1121. (define_insn "xorqi3"
  1122.   [(set (match_operand:QI 0 "general_operand" "=g,g,g")
  1123.     (xor:QI (match_operand:QI 1 "general_operand" "0,g,g")
  1124.         (match_operand:QI 2 "general_operand" "g,0,g")))]
  1125.   ""
  1126.   "@
  1127.    xorb2 %2,%0
  1128.    xorb2 %1,%0
  1129.    xorb3 %2,%1,%0")
  1130.  
  1131. (define_insn "negdf2"
  1132.   [(set (match_operand:DF 0 "general_operand" "=g")
  1133.     (neg:DF (match_operand:DF 1 "general_operand" "gF")))]
  1134.   ""
  1135.   "mneg%# %1,%0")
  1136.  
  1137. (define_insn "negsf2"
  1138.   [(set (match_operand:SF 0 "general_operand" "=g")
  1139.     (neg:SF (match_operand:SF 1 "general_operand" "gF")))]
  1140.   ""
  1141.   "mnegf %1,%0")
  1142.  
  1143. (define_insn "negsi2"
  1144.   [(set (match_operand:SI 0 "general_operand" "=g")
  1145.     (neg:SI (match_operand:SI 1 "general_operand" "g")))]
  1146.   ""
  1147.   "mnegl %1,%0")
  1148.  
  1149. (define_insn "neghi2"
  1150.   [(set (match_operand:HI 0 "general_operand" "=g")
  1151.     (neg:HI (match_operand:HI 1 "general_operand" "g")))]
  1152.   ""
  1153.   "mnegw %1,%0")
  1154.  
  1155. (define_insn "negqi2"
  1156.   [(set (match_operand:QI 0 "general_operand" "=g")
  1157.     (neg:QI (match_operand:QI 1 "general_operand" "g")))]
  1158.   ""
  1159.   "mnegb %1,%0")
  1160.  
  1161. (define_insn "one_cmplsi2"
  1162.   [(set (match_operand:SI 0 "general_operand" "=g")
  1163.     (not:SI (match_operand:SI 1 "general_operand" "g")))]
  1164.   ""
  1165.   "mcoml %1,%0")
  1166.  
  1167. (define_insn "one_cmplhi2"
  1168.   [(set (match_operand:HI 0 "general_operand" "=g")
  1169.     (not:HI (match_operand:HI 1 "general_operand" "g")))]
  1170.   ""
  1171.   "mcomw %1,%0")
  1172.  
  1173. (define_insn "one_cmplqi2"
  1174.   [(set (match_operand:QI 0 "general_operand" "=g")
  1175.     (not:QI (match_operand:QI 1 "general_operand" "g")))]
  1176.   ""
  1177.   "mcomb %1,%0")
  1178.  
  1179. ;; Arithmetic right shift on the vax works by negating the shift count,
  1180. ;; then emitting a right shift with the shift count negated.  This means
  1181. ;; that all actual shift counts in the RTL will be positive.  This 
  1182. ;; prevents converting shifts to ZERO_EXTRACTs with negative positions,
  1183. ;; which isn't valid.
  1184. (define_expand "ashrsi3"
  1185.   [(set (match_operand:SI 0 "general_operand" "=g")
  1186.     (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
  1187.            (match_operand:QI 2 "general_operand" "g")))]
  1188.   ""
  1189.   "
  1190. {
  1191.   if (GET_CODE (operands[2]) != CONST_INT)
  1192.     operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
  1193. }")
  1194.  
  1195. (define_insn ""
  1196.   [(set (match_operand:SI 0 "general_operand" "=g")
  1197.     (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
  1198.              (match_operand:QI 2 "const_int_operand" "n")))]
  1199.   ""
  1200.   "ashl $%n2,%1,%0")
  1201.  
  1202. (define_insn ""
  1203.   [(set (match_operand:SI 0 "general_operand" "=g")
  1204.     (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
  1205.              (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
  1206.   ""
  1207.   "ashl %2,%1,%0")
  1208.  
  1209. (define_insn "ashlsi3"
  1210.   [(set (match_operand:SI 0 "general_operand" "=g")
  1211.     (ashift:SI (match_operand:SI 1 "general_operand" "g")
  1212.            (match_operand:QI 2 "general_operand" "g")))]
  1213.   ""
  1214.   "*
  1215. {
  1216.   if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
  1217.     return \"addl2 %0,%0\";
  1218.   if (GET_CODE (operands[1]) == REG
  1219.       && GET_CODE (operands[2]) == CONST_INT)
  1220.     {
  1221.       int i = INTVAL (operands[2]);
  1222.       if (i == 1)
  1223.     return \"addl3 %1,%1,%0\";
  1224.       if (i == 2)
  1225.     return \"moval 0[%1],%0\";
  1226.       if (i == 3)
  1227.     return \"movad 0[%1],%0\";
  1228.     }
  1229.   return \"ashl %2,%1,%0\";
  1230. }")
  1231.  
  1232. ;; Arithmetic right shift on the vax works by negating the shift count.
  1233. (define_expand "ashrdi3"
  1234.   [(set (match_operand:DI 0 "general_operand" "=g")
  1235.     (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
  1236.              (match_operand:QI 2 "general_operand" "g")))]
  1237.   ""
  1238.   "
  1239. {
  1240.   operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
  1241. }")
  1242.  
  1243. (define_insn "ashldi3"
  1244.   [(set (match_operand:DI 0 "general_operand" "=g")
  1245.     (ashift:DI (match_operand:DI 1 "general_operand" "g")
  1246.            (match_operand:QI 2 "general_operand" "g")))]
  1247.   ""
  1248.   "ashq %2,%1,%0")
  1249.  
  1250. (define_insn ""
  1251.   [(set (match_operand:DI 0 "general_operand" "=g")
  1252.     (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
  1253.              (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
  1254.   ""
  1255.   "ashq %2,%1,%0")
  1256.  
  1257. ;; We used to have expand_shift handle logical right shifts by using extzv,
  1258. ;; but this make it very difficult to do lshrdi3.  Since the VAX is the
  1259. ;; only machine with this kludge, it's better to just do this with a
  1260. ;; define_expand and remove that case from expand_shift.
  1261.  
  1262. (define_expand "lshrsi3"
  1263.   [(set (match_dup 3)
  1264.     (minus:QI (const_int 32)
  1265.           (match_dup 4)))
  1266.    (set (match_operand:SI 0 "general_operand" "=g")
  1267.     (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
  1268.              (match_dup 3)
  1269.              (match_operand:SI 2 "register_operand" "g")))]
  1270.   ""
  1271.   "
  1272. {
  1273.   operands[3] = gen_reg_rtx (QImode);
  1274.   operands[4] = gen_lowpart (QImode, operands[2]);
  1275. }")
  1276.  
  1277. ;; Rotate right on the vax works by negating the shift count.
  1278. (define_expand "rotrsi3"
  1279.   [(set (match_operand:SI 0 "general_operand" "=g")
  1280.     (rotatert:SI (match_operand:SI 1 "general_operand" "g")
  1281.              (match_operand:QI 2 "general_operand" "g")))]
  1282.   ""
  1283.   "
  1284. {
  1285.   if (GET_CODE (operands[2]) != CONST_INT)
  1286.     operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
  1287. }")
  1288.  
  1289. (define_insn "rotlsi3"
  1290.   [(set (match_operand:SI 0 "general_operand" "=g")
  1291.     (rotate:SI (match_operand:SI 1 "general_operand" "g")
  1292.            (match_operand:QI 2 "general_operand" "g")))]
  1293.   ""
  1294.   "rotl %2,%1,%0")
  1295.  
  1296. (define_insn ""
  1297.   [(set (match_operand:SI 0 "general_operand" "=g")
  1298.     (rotatert:SI (match_operand:SI 1 "general_operand" "g")
  1299.              (match_operand:QI 2 "const_int_operand" "n")))]
  1300.   ""
  1301.   "rotl $%R2,%1,%0")
  1302.  
  1303. (define_insn ""
  1304.   [(set (match_operand:SI 0 "general_operand" "=g")
  1305.     (rotatert:SI (match_operand:SI 1 "general_operand" "g")
  1306.              (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
  1307.   ""
  1308.   "rotl %2,%1,%0")
  1309.  
  1310. ;This insn is probably slower than a multiply and an add.
  1311. ;(define_insn ""
  1312. ;  [(set (match_operand:SI 0 "general_operand" "=g")
  1313. ;    (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
  1314. ;              (match_operand:SI 2 "general_operand" "g"))
  1315. ;         (match_operand:SI 3 "general_operand" "g")))]
  1316. ;  ""
  1317. ;  "index %1,$0x80000000,$0x7fffffff,%3,%2,%0")
  1318.  
  1319. ;; Special cases of bit-field insns which we should
  1320. ;; recognize in preference to the general case.
  1321. ;; These handle aligned 8-bit and 16-bit fields,
  1322. ;; which can usually be done with move instructions.
  1323.  
  1324. (define_insn ""
  1325.   [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+ro")
  1326.              (match_operand:QI 1 "const_int_operand" "n")
  1327.              (match_operand:SI 2 "const_int_operand" "n"))
  1328.     (match_operand:SI 3 "general_operand" "g"))]
  1329.    "(INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
  1330.    && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
  1331.    && (GET_CODE (operands[0]) == REG
  1332.        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
  1333.   "*
  1334. {
  1335.   if (REG_P (operands[0]))
  1336.     {
  1337.       if (INTVAL (operands[2]) != 0)
  1338.     return \"insv %3,%2,%1,%0\";
  1339.     }
  1340.   else
  1341.     operands[0]
  1342.       = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
  1343.  
  1344.   CC_STATUS_INIT;
  1345.   if (INTVAL (operands[1]) == 8)
  1346.     return \"movb %3,%0\";
  1347.   return \"movw %3,%0\";
  1348. }")
  1349.  
  1350. (define_insn ""
  1351.   [(set (match_operand:SI 0 "general_operand" "=&g")
  1352.     (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
  1353.              (match_operand:QI 2 "const_int_operand" "n")
  1354.              (match_operand:SI 3 "const_int_operand" "n")))]
  1355.   "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
  1356.    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
  1357.    && (GET_CODE (operands[1]) == REG
  1358.        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
  1359.   "*
  1360. {
  1361.   if (REG_P (operands[1]))
  1362.     {
  1363.       if (INTVAL (operands[3]) != 0)
  1364.     return \"extzv %3,%2,%1,%0\";
  1365.     }
  1366.   else
  1367.     operands[1]
  1368.       = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
  1369.  
  1370.   if (INTVAL (operands[2]) == 8)
  1371.     return \"movzbl %1,%0\";
  1372.   return \"movzwl %1,%0\";
  1373. }")
  1374.  
  1375. (define_insn ""
  1376.   [(set (match_operand:SI 0 "general_operand" "=g")
  1377.     (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
  1378.              (match_operand:QI 2 "const_int_operand" "n")
  1379.              (match_operand:SI 3 "const_int_operand" "n")))]
  1380.   "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
  1381.    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
  1382.    && (GET_CODE (operands[1]) == REG
  1383.        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
  1384.   "*
  1385. {
  1386.   if (REG_P (operands[1]))
  1387.     {
  1388.       if (INTVAL (operands[3]) != 0)
  1389.     return \"extv %3,%2,%1,%0\";
  1390.     }
  1391.   else
  1392.     operands[1]
  1393.       = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
  1394.  
  1395.   if (INTVAL (operands[2]) == 8)
  1396.     return \"cvtbl %1,%0\";
  1397.   return \"cvtwl %1,%0\";
  1398. }")
  1399.  
  1400. ;; Register-only SImode cases of bit-field insns.
  1401.  
  1402. (define_insn ""
  1403.   [(set (cc0)
  1404.     (compare
  1405.      (sign_extract:SI (match_operand:SI 0 "nonmemory_operand" "r")
  1406.               (match_operand:QI 1 "general_operand" "g")
  1407.               (match_operand:SI 2 "general_operand" "g"))
  1408.      (match_operand:SI 3 "general_operand" "g")))]
  1409.   ""
  1410.   "cmpv %2,%1,%0,%3")
  1411.  
  1412. (define_insn ""
  1413.   [(set (cc0)
  1414.     (compare
  1415.      (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
  1416.               (match_operand:QI 1 "general_operand" "g")
  1417.               (match_operand:SI 2 "general_operand" "g"))
  1418.      (match_operand:SI 3 "general_operand" "g")))]
  1419.   ""
  1420.   "cmpzv %2,%1,%0,%3")
  1421.  
  1422. ;; When the field position and size are constant and the destination
  1423. ;; is a register, extv and extzv are much slower than a rotate followed
  1424. ;; by a bicl or sign extension.  Because we might end up choosing ext[z]v
  1425. ;; anyway, we can't allow immediate values for the primary source operand.
  1426.  
  1427. (define_insn ""
  1428.   [(set (match_operand:SI 0 "general_operand" "=g")
  1429.     (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
  1430.              (match_operand:QI 2 "general_operand" "g")
  1431.              (match_operand:SI 3 "general_operand" "g")))]
  1432.   ""
  1433.   "*
  1434. {
  1435.   if (GET_CODE (operands[3]) != CONST_INT || GET_CODE (operands[2]) != CONST_INT
  1436.       || GET_CODE (operands[0]) != REG
  1437.       || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16))
  1438.     return \"extv %3,%2,%1,%0\";
  1439.   if (INTVAL (operands[2]) == 8)
  1440.     return \"rotl %R3,%1,%0\;cvtbl %0,%0\";
  1441.   return \"rotl %R3,%1,%0\;cvtwl %0,%0\";
  1442. }")
  1443.  
  1444. (define_insn ""
  1445.   [(set (match_operand:SI 0 "general_operand" "=g")
  1446.     (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
  1447.              (match_operand:QI 2 "general_operand" "g")
  1448.              (match_operand:SI 3 "general_operand" "g")))]
  1449.   ""
  1450.   "*
  1451. {
  1452.   if (GET_CODE (operands[3]) != CONST_INT || GET_CODE (operands[2]) != CONST_INT
  1453.       || GET_CODE (operands[0]) != REG)
  1454.     return \"extzv %3,%2,%1,%0\";
  1455.   if (INTVAL (operands[2]) == 8)
  1456.     return \"rotl %R3,%1,%0\;movzbl %0,%0\";
  1457.   if (INTVAL (operands[2]) == 16)
  1458.     return \"rotl %R3,%1,%0\;movzwl %0,%0\";
  1459.   if (INTVAL (operands[3]) & 31)
  1460.     return \"rotl %R3,%1,%0\;bicl2 %M2,%0\";
  1461.   if (rtx_equal_p (operands[0], operands[1]))
  1462.     return \"bicl2 %M2,%0\";
  1463.   return \"bicl3 %M2,%1,%0\";
  1464. }")
  1465.  
  1466. ;; Non-register cases.
  1467. ;; nonimmediate_operand is used to make sure that mode-ambiguous cases
  1468. ;; don't match these (and therefore match the cases above instead).
  1469.  
  1470. (define_insn ""
  1471.   [(set (cc0)
  1472.     (compare
  1473.      (sign_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
  1474.               (match_operand:QI 1 "general_operand" "g")
  1475.               (match_operand:SI 2 "general_operand" "g"))
  1476.      (match_operand:SI 3 "general_operand" "g")))]
  1477.   ""
  1478.   "cmpv %2,%1,%0,%3")
  1479.  
  1480. (define_insn ""
  1481.   [(set (cc0)
  1482.     (compare
  1483.      (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
  1484.               (match_operand:QI 1 "general_operand" "g")
  1485.               (match_operand:SI 2 "general_operand" "g"))
  1486.      (match_operand:SI 3 "general_operand" "g")))]
  1487.   ""
  1488.   "cmpzv %2,%1,%0,%3")
  1489.  
  1490. (define_insn "extv"
  1491.   [(set (match_operand:SI 0 "general_operand" "=g")
  1492.     (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm")
  1493.              (match_operand:QI 2 "general_operand" "g")
  1494.              (match_operand:SI 3 "general_operand" "g")))]
  1495.   ""
  1496.   "*
  1497. {
  1498.   if (GET_CODE (operands[0]) != REG || GET_CODE (operands[2]) != CONST_INT
  1499.       || GET_CODE (operands[3]) != CONST_INT
  1500.       || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16)
  1501.       || INTVAL (operands[2]) + INTVAL (operands[3]) > 32
  1502.       || side_effects_p (operands[1])
  1503.       || (GET_CODE (operands[1]) == MEM
  1504.       && mode_dependent_address_p (XEXP (operands[1], 0))))
  1505.     return \"extv %3,%2,%1,%0\";
  1506.   if (INTVAL (operands[2]) == 8)
  1507.     return \"rotl %R3,%1,%0\;cvtbl %0,%0\";
  1508.   return \"rotl %R3,%1,%0\;cvtwl %0,%0\";
  1509. }")
  1510.  
  1511. (define_insn "extzv"
  1512.   [(set (match_operand:SI 0 "general_operand" "=g")
  1513.     (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm")
  1514.              (match_operand:QI 2 "general_operand" "g")
  1515.              (match_operand:SI 3 "general_operand" "g")))]
  1516.   ""
  1517.   "*
  1518. {
  1519.   if (GET_CODE (operands[0]) != REG || GET_CODE (operands[2]) != CONST_INT
  1520.       || GET_CODE (operands[3]) != CONST_INT
  1521.       || INTVAL (operands[2]) + INTVAL (operands[3]) > 32
  1522.       || side_effects_p (operands[1])
  1523.       || (GET_CODE (operands[1]) == MEM
  1524.       && mode_dependent_address_p (XEXP (operands[1], 0))))
  1525.     return \"extzv %3,%2,%1,%0\";
  1526.   if (INTVAL (operands[2]) == 8)
  1527.     return \"rotl %R3,%1,%0\;movzbl %0,%0\";
  1528.   if (INTVAL (operands[2]) == 16)
  1529.     return \"rotl %R3,%1,%0\;movzwl %0,%0\";
  1530.   return \"rotl %R3,%1,%0\;bicl2 %M2,%0\";
  1531. }")
  1532.  
  1533. (define_insn "insv"
  1534.   [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+g")
  1535.              (match_operand:QI 1 "general_operand" "g")
  1536.              (match_operand:SI 2 "general_operand" "g"))
  1537.     (match_operand:SI 3 "general_operand" "g"))]
  1538.   ""
  1539.   "insv %3,%2,%1,%0")
  1540.  
  1541. (define_insn ""
  1542.   [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+r")
  1543.              (match_operand:QI 1 "general_operand" "g")
  1544.              (match_operand:SI 2 "general_operand" "g"))
  1545.     (match_operand:SI 3 "general_operand" "g"))]
  1546.   ""
  1547.   "insv %3,%2,%1,%0")
  1548.  
  1549. (define_insn "jump"
  1550.   [(set (pc)
  1551.     (label_ref (match_operand 0 "" "")))]
  1552.   ""
  1553.   "jbr %l0")
  1554.  
  1555. (define_insn "beq"
  1556.   [(set (pc)
  1557.     (if_then_else (eq (cc0)
  1558.               (const_int 0))
  1559.               (label_ref (match_operand 0 "" ""))
  1560.               (pc)))]
  1561.   ""
  1562.   "jeql %l0")
  1563.  
  1564. (define_insn "bne"
  1565.   [(set (pc)
  1566.     (if_then_else (ne (cc0)
  1567.               (const_int 0))
  1568.               (label_ref (match_operand 0 "" ""))
  1569.               (pc)))]
  1570.   ""
  1571.   "jneq %l0")
  1572.  
  1573. (define_insn "bgt"
  1574.   [(set (pc)
  1575.     (if_then_else (gt (cc0)
  1576.               (const_int 0))
  1577.               (label_ref (match_operand 0 "" ""))
  1578.               (pc)))]
  1579.   ""
  1580.   "jgtr %l0")
  1581.  
  1582. (define_insn "bgtu"
  1583.   [(set (pc)
  1584.     (if_then_else (gtu (cc0)
  1585.                (const_int 0))
  1586.               (label_ref (match_operand 0 "" ""))
  1587.               (pc)))]
  1588.   ""
  1589.   "jgtru %l0")
  1590.  
  1591. (define_insn "blt"
  1592.   [(set (pc)
  1593.     (if_then_else (lt (cc0)
  1594.               (const_int 0))
  1595.               (label_ref (match_operand 0 "" ""))
  1596.               (pc)))]
  1597.   ""
  1598.   "jlss %l0")
  1599.  
  1600. (define_insn "bltu"
  1601.   [(set (pc)
  1602.     (if_then_else (ltu (cc0)
  1603.                (const_int 0))
  1604.               (label_ref (match_operand 0 "" ""))
  1605.               (pc)))]
  1606.   ""
  1607.   "jlssu %l0")
  1608.  
  1609. (define_insn "bge"
  1610.   [(set (pc)
  1611.     (if_then_else (ge (cc0)
  1612.               (const_int 0))
  1613.               (label_ref (match_operand 0 "" ""))
  1614.               (pc)))]
  1615.   ""
  1616.   "jgeq %l0")
  1617.  
  1618. (define_insn "bgeu"
  1619.   [(set (pc)
  1620.     (if_then_else (geu (cc0)
  1621.                (const_int 0))
  1622.               (label_ref (match_operand 0 "" ""))
  1623.               (pc)))]
  1624.   ""
  1625.   "jgequ %l0")
  1626.  
  1627. (define_insn "ble"
  1628.   [(set (pc)
  1629.     (if_then_else (le (cc0)
  1630.               (const_int 0))
  1631.               (label_ref (match_operand 0 "" ""))
  1632.               (pc)))]
  1633.   ""
  1634.   "jleq %l0")
  1635.  
  1636. (define_insn "bleu"
  1637.   [(set (pc)
  1638.     (if_then_else (leu (cc0)
  1639.                (const_int 0))
  1640.               (label_ref (match_operand 0 "" ""))
  1641.               (pc)))]
  1642.   ""
  1643.   "jlequ %l0")
  1644.  
  1645. ;; Recognize reversed jumps.
  1646. (define_insn ""
  1647.   [(set (pc)
  1648.     (if_then_else (match_operator 0 "comparison_operator"
  1649.                       [(cc0)
  1650.                        (const_int 0)])
  1651.               (pc)
  1652.               (label_ref (match_operand 1 "" ""))))]
  1653.   ""
  1654.   "j%C0 %l1") ; %C0 negates condition
  1655.  
  1656. ;; Recognize jbs, jlbs, jbc and jlbc instructions.  Note that the operand
  1657. ;; of jlbs and jlbc insns are SImode in the hardware.  However, if it is
  1658. ;; memory, we use QImode in the insn.  So we can't use those instructions
  1659. ;; for mode-dependent addresses.
  1660.  
  1661. (define_insn ""
  1662.   [(set (pc)
  1663.     (if_then_else
  1664.      (ne (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rQ,g")
  1665.                   (const_int 1)
  1666.                   (match_operand:SI 1 "general_operand" "I,g"))
  1667.          (const_int 0))
  1668.      (label_ref (match_operand 2 "" ""))
  1669.      (pc)))]
  1670.   ""
  1671.   "@
  1672.    jlbs %0,%l2
  1673.    jbs %1,%0,%l2")
  1674.  
  1675. (define_insn ""
  1676.   [(set (pc)
  1677.     (if_then_else
  1678.      (eq (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rQ,g")
  1679.                   (const_int 1)
  1680.                   (match_operand:SI 1 "general_operand" "I,g"))
  1681.          (const_int 0))
  1682.      (label_ref (match_operand 2 "" ""))
  1683.      (pc)))]
  1684.   ""
  1685.   "@
  1686.    jlbc %0,%l2
  1687.    jbc %1,%0,%l2")
  1688.  
  1689. (define_insn ""
  1690.   [(set (pc)
  1691.     (if_then_else
  1692.      (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r")
  1693.                   (const_int 1)
  1694.                   (match_operand:SI 1 "general_operand" "I,g"))
  1695.          (const_int 0))
  1696.      (label_ref (match_operand 2 "" ""))
  1697.      (pc)))]
  1698.   ""
  1699.   "@
  1700.    jlbs %0,%l2
  1701.    jbs %1,%0,%l2")
  1702.  
  1703. (define_insn ""
  1704.   [(set (pc)
  1705.     (if_then_else
  1706.      (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r")
  1707.                   (const_int 1)
  1708.                   (match_operand:SI 1 "general_operand" "I,g"))
  1709.          (const_int 0))
  1710.      (label_ref (match_operand 2 "" ""))
  1711.      (pc)))]
  1712.   ""
  1713.   "@
  1714.    jlbc %0,%l2
  1715.    jbc %1,%0,%l2")
  1716.  
  1717. ;; Subtract-and-jump and Add-and-jump insns.
  1718. ;; These are not used when output is for the Unix assembler
  1719. ;; because it does not know how to modify them to reach far.
  1720.  
  1721. ;; Normal sob insns.
  1722.  
  1723. (define_insn ""
  1724.   [(set (pc)
  1725.     (if_then_else
  1726.      (gt (plus:SI (match_operand:SI 0 "general_operand" "+g")
  1727.               (const_int -1))
  1728.          (const_int 0))
  1729.      (label_ref (match_operand 1 "" ""))
  1730.      (pc)))
  1731.    (set (match_dup 0)
  1732.     (plus:SI (match_dup 0)
  1733.          (const_int -1)))]
  1734.   "!TARGET_UNIX_ASM"
  1735.   "jsobgtr %0,%l1")
  1736.  
  1737. (define_insn ""
  1738.   [(set (pc)
  1739.     (if_then_else
  1740.      (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
  1741.               (const_int -1))
  1742.          (const_int 0))
  1743.      (label_ref (match_operand 1 "" ""))
  1744.      (pc)))
  1745.    (set (match_dup 0)
  1746.     (plus:SI (match_dup 0)
  1747.          (const_int -1)))]
  1748.   "!TARGET_UNIX_ASM"
  1749.   "jsobgeq %0,%l1")
  1750.  
  1751. ;; Normal aob insns.  Define a version for when operands[1] is a constant.
  1752. (define_insn ""
  1753.   [(set (pc)
  1754.     (if_then_else
  1755.      (lt (plus:SI (match_operand:SI 0 "general_operand" "+g")
  1756.               (const_int 1))
  1757.          (match_operand:SI 1 "general_operand" "g"))
  1758.      (label_ref (match_operand 2 "" ""))
  1759.      (pc)))
  1760.    (set (match_dup 0)
  1761.     (plus:SI (match_dup 0)
  1762.          (const_int 1)))]
  1763.   "!TARGET_UNIX_ASM"
  1764.   "jaoblss %1,%0,%l2")
  1765.  
  1766. (define_insn ""
  1767.   [(set (pc)
  1768.     (if_then_else
  1769.      (lt (match_operand:SI 0 "general_operand" "+g")
  1770.          (match_operand:SI 1 "general_operand" "g"))
  1771.      (label_ref (match_operand 2 "" ""))
  1772.      (pc)))
  1773.    (set (match_dup 0)
  1774.     (plus:SI (match_dup 0)
  1775.          (const_int 1)))]
  1776.   "!TARGET_UNIX_ASM && GET_CODE (operands[1]) == CONST_INT"
  1777.   "jaoblss %P1,%0,%l2")
  1778.  
  1779. (define_insn ""
  1780.   [(set (pc)
  1781.     (if_then_else
  1782.      (le (plus:SI (match_operand:SI 0 "general_operand" "+g")
  1783.               (const_int 1))
  1784.          (match_operand:SI 1 "general_operand" "g"))
  1785.      (label_ref (match_operand 2 "" ""))
  1786.      (pc)))
  1787.    (set (match_dup 0)
  1788.     (plus:SI (match_dup 0)
  1789.          (const_int 1)))]
  1790.   "!TARGET_UNIX_ASM"
  1791.   "jaobleq %1,%0,%l2")
  1792.  
  1793. (define_insn ""
  1794.   [(set (pc)
  1795.     (if_then_else
  1796.      (le (match_operand:SI 0 "general_operand" "+g")
  1797.          (match_operand:SI 1 "general_operand" "g"))
  1798.      (label_ref (match_operand 2 "" ""))
  1799.      (pc)))
  1800.    (set (match_dup 0)
  1801.     (plus:SI (match_dup 0)
  1802.          (const_int 1)))]
  1803.   "!TARGET_UNIX_ASM && GET_CODE (operands[1]) == CONST_INT"
  1804.   "jaobleq %P1,%0,%l2")
  1805.  
  1806. ;; Something like a sob insn, but compares against -1.
  1807. ;; This finds `while (foo--)' which was changed to `while (--foo != -1)'.
  1808.  
  1809. (define_insn ""
  1810.   [(set (pc)
  1811.     (if_then_else
  1812.      (ne (match_operand:SI 0 "general_operand" "g")
  1813.          (const_int 0))
  1814.      (label_ref (match_operand 1 "" ""))
  1815.      (pc)))
  1816.    (set (match_dup 0)
  1817.     (plus:SI (match_dup 0)
  1818.          (const_int -1)))]
  1819.   ""
  1820.   "decl %0\;jgequ %l1")
  1821.  
  1822. ;; Note that operand 1 is total size of args, in bytes,
  1823. ;; and what the call insn wants is the number of words.
  1824. (define_insn "call_pop"
  1825.   [(call (match_operand:QI 0 "memory_operand" "m")
  1826.      (match_operand:QI 1 "general_operand" "g"))
  1827.    (set (reg:SI 14) (plus:SI (reg:SI 14)
  1828.                  (match_operand:SI 3 "immediate_operand" "i")))]
  1829.   ""
  1830.   "*
  1831.   if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) > 255 * 4)
  1832.     /* Vax `calls' really uses only one byte of #args, so pop explicitly.  */
  1833.     return \"calls $0,%0\;addl2 %1,sp\";
  1834.   operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4);
  1835.   return \"calls %1,%0\";
  1836. ")
  1837.  
  1838. (define_insn "call_value_pop"
  1839.   [(set (match_operand 0 "" "=g")
  1840.     (call (match_operand:QI 1 "memory_operand" "m")
  1841.           (match_operand:QI 2 "general_operand" "g")))
  1842.    (set (reg:SI 14) (plus:SI (reg:SI 14)
  1843.                  (match_operand:SI 4 "immediate_operand" "i")))]
  1844.   ""
  1845.   "*
  1846.   if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) > 255 * 4)
  1847.     /* Vax `calls' really uses only one byte of #args, so pop explicitly.  */
  1848.     return \"calls $0,%1\;addl2 %2,sp\";
  1849.   operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3)/ 4);
  1850.   return \"calls %2,%1\";
  1851. ")
  1852.  
  1853. ;; Define another set of these for the case of functions with no
  1854. ;; operands.  In that case, combine may simplify the adjustment of sp.
  1855. (define_insn ""
  1856.   [(call (match_operand:QI 0 "memory_operand" "m")
  1857.      (match_operand:QI 1 "general_operand" "g"))
  1858.    (set (reg:SI 14) (reg:SI 14))]
  1859.   ""
  1860.   "*
  1861.   if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) > 255 * 4)
  1862.     /* Vax `calls' really uses only one byte of #args, so pop explicitly.  */
  1863.     return \"calls $0,%0\;addl2 %1,sp\";
  1864.   operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4);
  1865.   return \"calls %1,%0\";
  1866. ")
  1867.  
  1868. (define_insn ""
  1869.   [(set (match_operand 0 "" "=g")
  1870.     (call (match_operand:QI 1 "memory_operand" "m")
  1871.           (match_operand:QI 2 "general_operand" "g")))
  1872.    (set (reg:SI 14) (reg:SI 14))]
  1873.   ""
  1874.   "*
  1875.   if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) > 255 * 4)
  1876.     /* Vax `calls' really uses only one byte of #args, so pop explicitly.  */
  1877.     return \"calls $0,%1\;addl2 %2,sp\";
  1878.   operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3)/ 4);
  1879.   return \"calls %2,%1\";
  1880. ")
  1881.  
  1882. ;; Call subroutine returning any type.
  1883.  
  1884. (define_expand "untyped_call"
  1885.   [(parallel [(call (match_operand 0 "" "")
  1886.                   (const_int 0))
  1887.             (match_operand 1 "" "")
  1888.             (match_operand 2 "" "")])]
  1889.   ""
  1890.   "
  1891. {
  1892.   int i;
  1893.  
  1894.   emit_call_insn (gen_call_pop (operands[0], const0_rtx, NULL, const0_rtx));
  1895.  
  1896.   for (i = 0; i < XVECLEN (operands[2], 0); i++)
  1897.     {
  1898.       rtx set = XVECEXP (operands[2], 0, i);
  1899.       emit_move_insn (SET_DEST (set), SET_SRC (set));
  1900.     }
  1901.  
  1902.   /* The optimizer does not know that the call sets the function value
  1903.      registers we stored in the result block.  We avoid problems by
  1904.      claiming that all hard registers are used and clobbered at this
  1905.      point.  */
  1906.   emit_insn (gen_blockage ());
  1907.  
  1908.   DONE;
  1909. }")
  1910.  
  1911. ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
  1912. ;; all of memory.  This blocks insns from being moved across this point.
  1913.  
  1914. (define_insn "blockage"
  1915.   [(unspec_volatile [(const_int 0)] 0)]
  1916.   ""
  1917.   "")
  1918.  
  1919. (define_insn "return"
  1920.   [(return)]
  1921.   ""
  1922.   "ret")
  1923.  
  1924. (define_insn "nop"
  1925.   [(const_int 0)]
  1926.   ""
  1927.   "nop")
  1928.  
  1929. ;; This had a wider constraint once, and it had trouble.
  1930. ;; If you are tempted to try `g', please don't--it's not worth
  1931. ;; the risk we will reopen the same bug.
  1932. (define_insn "indirect_jump"
  1933.   [(set (pc) (match_operand:SI 0 "general_operand" "r"))]
  1934.   ""
  1935.   "jmp (%0)")
  1936.  
  1937. ;; This is here to accept 5 arguments (as passed by expand_end_case)
  1938. ;; and pass the first 4 along to the casesi1 pattern that really does the work.
  1939. (define_expand "casesi"
  1940.   [(set (pc)
  1941.     (if_then_else (leu (minus:SI (match_operand:SI 0 "general_operand" "g")
  1942.                      (match_operand:SI 1 "general_operand" "g"))
  1943.                (match_operand:SI 2 "general_operand" "g"))
  1944.               (plus:SI (sign_extend:SI
  1945.                 (mem:HI
  1946.                  (plus:SI (pc)
  1947.                       (mult:SI (minus:SI (match_dup 0)
  1948.                                  (match_dup 1))
  1949.                            (const_int 2)))))
  1950.                    (label_ref:SI (match_operand 3 "" "")))
  1951.               (pc)))
  1952.    (match_operand 4 "" "")]
  1953.   ""
  1954.   "
  1955.   emit_insn (gen_casesi1 (operands[0], operands[1], operands[2], operands[3]));
  1956.   DONE;
  1957. ")
  1958.  
  1959. (define_insn "casesi1"
  1960.   [(set (pc)
  1961.     (if_then_else (leu (minus:SI (match_operand:SI 0 "general_operand" "g")
  1962.                      (match_operand:SI 1 "general_operand" "g"))
  1963.                (match_operand:SI 2 "general_operand" "g"))
  1964.               (plus:SI (sign_extend:SI
  1965.                 (mem:HI
  1966.                  (plus:SI (pc)
  1967.                       (mult:SI (minus:SI (match_dup 0)
  1968.                                  (match_dup 1))
  1969.                            (const_int 2)))))
  1970.                    (label_ref:SI (match_operand 3 "" "")))
  1971.               (pc)))]
  1972.   ""
  1973.   "casel %0,%1,%2")
  1974.  
  1975. ;; This used to arise from the preceding by simplification
  1976. ;; if operand 1 is zero.  Perhaps it is no longer necessary.
  1977. (define_insn ""
  1978.   [(set (pc)
  1979.     (if_then_else (leu (match_operand:SI 0 "general_operand" "g")
  1980.                (match_operand:SI 1 "general_operand" "g"))
  1981.               (plus:SI (sign_extend:SI
  1982.                 (mem:HI
  1983.                  (plus:SI (pc)
  1984.                       (mult:SI (minus:SI (match_dup 0)
  1985.                                  (const_int 0))
  1986.                            (const_int 2)))))
  1987.                    (label_ref:SI (match_operand 3 "" "")))
  1988.               (pc)))]
  1989.   ""
  1990.   "casel %0,$0,%1")
  1991.  
  1992. ;;- load or push effective address 
  1993. ;; These come after the move and add/sub patterns
  1994. ;; because we don't want pushl $1 turned into pushad 1.
  1995. ;; or addl3 r1,r2,r3 turned into movab 0(r1)[r2],r3.
  1996.  
  1997. ;; It does not work to use constraints to distinguish pushes from moves,
  1998. ;; because < matches any autodecrement, not just a push.
  1999.  
  2000. (define_insn ""
  2001.   [(set (match_operand:SI 0 "general_operand" "=g")
  2002.     (match_operand:QI 1 "address_operand" "p"))]
  2003.   ""
  2004.   "*
  2005. {
  2006.   if (push_operand (operands[0], SImode))
  2007.     return \"pushab %a1\";
  2008.   else
  2009.     return \"movab %a1,%0\";
  2010. }")
  2011.  
  2012. (define_insn ""
  2013.   [(set (match_operand:SI 0 "general_operand" "=g")
  2014.     (match_operand:HI 1 "address_operand" "p"))]
  2015.   ""
  2016.   "*
  2017. {
  2018.   if (push_operand (operands[0], SImode))
  2019.     return \"pushaw %a1\";
  2020.   else
  2021.     return \"movaw %a1,%0\";
  2022. }")
  2023.  
  2024. (define_insn ""
  2025.   [(set (match_operand:SI 0 "general_operand" "=g")
  2026.     (match_operand:SI 1 "address_operand" "p"))]
  2027.   ""
  2028.   "*
  2029. {
  2030.   if (push_operand (operands[0], SImode))
  2031.     return \"pushal %a1\";
  2032.   else
  2033.     return \"moval %a1,%0\";
  2034. }")
  2035.  
  2036. (define_insn ""
  2037.   [(set (match_operand:SI 0 "general_operand" "=g")
  2038.     (match_operand:DI 1 "address_operand" "p"))]
  2039.   ""
  2040.   "*
  2041. {
  2042.   if (push_operand (operands[0], SImode))
  2043.     return \"pushaq %a1\";
  2044.   else
  2045.     return \"movaq %a1,%0\";
  2046. }")
  2047.  
  2048. (define_insn ""
  2049.   [(set (match_operand:SI 0 "general_operand" "=g")
  2050.     (match_operand:SF 1 "address_operand" "p"))]
  2051.   ""
  2052.   "*
  2053. {
  2054.   if (push_operand (operands[0], SImode))
  2055.     return \"pushaf %a1\";
  2056.   else
  2057.     return \"movaf %a1,%0\";
  2058. }")
  2059.  
  2060. (define_insn ""
  2061.   [(set (match_operand:SI 0 "general_operand" "=g")
  2062.     (match_operand:DF 1 "address_operand" "p"))]
  2063.   ""
  2064.   "*
  2065. {
  2066.   if (push_operand (operands[0], SImode))
  2067.     return \"pushad %a1\";
  2068.   else
  2069.     return \"movad %a1,%0\";
  2070. }")
  2071.  
  2072. ;; These used to be peepholes, but it is more straightforward to do them
  2073. ;; as single insns.  However, we must force the output to be a register
  2074. ;; if it is not an offsettable address so that we know that we can assign
  2075. ;; to it twice. 
  2076.  
  2077. ;; If we had a good way of evaluating the relative costs, these could be
  2078. ;; machine-independent.
  2079.  
  2080. ;; Optimize   extzv ...,z;    andl2 ...,z
  2081. ;; or          ashl ...,z;     andl2 ...,z
  2082. ;; with other operands constant.  This is what the combiner converts the
  2083. ;; above sequences to before attempting to recognize the new insn.
  2084.  
  2085. (define_insn ""
  2086.   [(set (match_operand:SI 0 "general_operand" "=ro")
  2087.     (and:SI (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
  2088.                  (match_operand:QI 2 "const_int_operand" "n"))
  2089.         (match_operand:SI 3 "const_int_operand" "n")))]
  2090.   "(INTVAL (operands[3]) & ~((1 << (32 - INTVAL (operands[2]))) - 1)) == 0"
  2091.   "*
  2092. {
  2093.   unsigned long mask1 = INTVAL (operands[3]);
  2094.   unsigned long mask2 = (1 << (32 - INTVAL (operands[2]))) - 1;
  2095.  
  2096.   if ((mask1 & mask2) != mask1)
  2097.     operands[3] = gen_rtx (CONST_INT, VOIDmode, mask1 & mask2);
  2098.  
  2099.   return \"rotl %R2,%1,%0\;bicl2 %N3,%0\";
  2100. }")
  2101.  
  2102. ;; left-shift and mask
  2103. ;; The only case where `ashl' is better is if the mask only turns off
  2104. ;; bits that the ashl would anyways, in which case it should have been
  2105. ;; optimized away.
  2106.  
  2107. (define_insn ""
  2108.   [(set (match_operand:SI 0 "general_operand" "=ro")
  2109.     (and:SI (ashift:SI (match_operand:SI 1 "general_operand" "g")
  2110.                (match_operand:QI 2 "const_int_operand" "n"))
  2111.         (match_operand:SI 3 "const_int_operand" "n")))]
  2112.   ""
  2113.   "*
  2114. {
  2115.   operands[3] = gen_rtx (CONST_INT, VOIDmode,
  2116.              INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1));
  2117.   return \"rotl %2,%1,%0\;bicl2 %N3,%0\";
  2118. }")
  2119.