home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / NeXT / GnuSource / cc-61.0.1 / cc / config / convex.md < prev    next >
Text File  |  1991-06-03  |  41KB  |  1,450 lines

  1. ;;- Machine description for GNU compiler
  2. ;;- Convex Version
  3. ;;   Copyright (C) 1989 Free Software Foundation, Inc.
  4.  
  5. ;; This file is part of GNU CC.
  6.  
  7. ;; GNU CC is free software; you can redistribute it and/or modify
  8. ;; it under the terms of the GNU General Public License as published by
  9. ;; the Free Software Foundation; either version 2, or (at your option)
  10. ;; any later version.
  11.  
  12. ;; GNU CC is distributed in the hope that it will be useful,
  13. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. ;; GNU General Public License for more details.
  16.  
  17. ;; You should have received a copy of the GNU General Public License
  18. ;; along with GNU CC; see the file COPYING.  If not, write to
  19. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, 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. ;; Put tstsi first among test insns so it matches a CONST_INT operand.
  31.  
  32. (define_insn "tstsi"
  33.   [(set (cc0)
  34.     (match_operand:SI 0 "register_operand" "r"))]
  35.   ""
  36.   "* return set_cmp (operands[0], const0_rtx, 'w');")
  37.  
  38. (define_insn "tsthi"
  39.   [(set (cc0)
  40.     (match_operand:HI 0 "register_operand" "r"))]
  41.   ""
  42.   "* return set_cmp (operands[0], const0_rtx, 'h');")
  43.  
  44. (define_expand "tstqi"
  45.   [(set (match_dup 1)
  46.     (sign_extend:SI (match_operand:QI 0 "register_operand" "r")))
  47.    (set (cc0)
  48.     (match_dup 1))]
  49.   ""
  50.   "operands[1] = gen_reg_rtx (SImode);")
  51.  
  52. (define_expand "tstdi"
  53.   [(parallel [(set (cc0) (match_operand:DI 0 "register_operand" "d"))
  54.           (use (match_dup 1))])]
  55.   ""
  56.   "operands[1] = force_reg (DImode, const0_rtx);")
  57.  
  58. (define_insn ""
  59.   [(set (cc0) (match_operand:DI 0 "register_operand" "d"))
  60.    (use (match_operand:DI 1 "register_operand" "d"))]
  61.   ""
  62.   "* return set_cmp (operands[0], operands[1], 'l');")
  63.  
  64. (define_expand "tstdf"
  65.   [(set (cc0)
  66.     (compare (match_operand:DF 0 "register_operand" "d")
  67.          (match_dup 1)))]
  68.   ""
  69.   "operands[1] = force_reg (DFmode, dconst0_rtx);")
  70.  
  71. (define_insn "tstsf"
  72.   [(set (cc0)
  73.     (match_operand:SF 0 "register_operand" "d"))]
  74.   ""
  75.   "* return set_cmp (operands[0], fconst0_rtx, 's');")
  76.  
  77. ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
  78.  
  79. (define_insn "cmpsi"
  80.   [(set (cc0)
  81.     (compare (match_operand:SI 0 "nonmemory_operand" "d,a,i,r")
  82.          (match_operand:SI 1 "nonmemory_operand" "d,a,r,i")))]
  83.   ""
  84.   "* return set_cmp (operands[0], operands[1], 'w');")
  85.  
  86. (define_insn "cmphi"
  87.   [(set (cc0)
  88.     (compare (match_operand:HI 0 "nonmemory_operand" "d,a,r,i")
  89.          (match_operand:HI 1 "nonmemory_operand" "d,a,i,r")))]
  90.   ""
  91.   "* return set_cmp (operands[0], operands[1], 'h');")
  92.  
  93. (define_insn "cmpqi"
  94.   [(set (cc0)
  95.     (compare (match_operand:QI 0 "register_operand" "d")
  96.          (match_operand:QI 1 "register_operand" "d")))]
  97.   ""
  98.   "* return set_cmp (operands[0], operands[1], 'b');")
  99.  
  100. (define_insn "cmpdi"
  101.   [(set (cc0)
  102.     (compare (match_operand:DI 0 "register_operand" "d")
  103.          (match_operand:DI 1 "register_operand" "d")))]
  104.   ""
  105.   "* return set_cmp (operands[0], operands[1], 'l');")
  106.  
  107. (define_insn "cmpdf"
  108.   [(set (cc0)
  109.     (compare (match_operand:DF 0 "register_operand" "d")
  110.          (match_operand:DF 1 "register_operand" "d")))]
  111.   ""
  112.   "* return set_cmp (operands[0], operands[1], 'd');")
  113.  
  114. (define_insn "cmpsf"
  115.   [(set (cc0)
  116.     (compare (match_operand:SF 0 "nonmemory_operand" "dF,d")
  117.          (match_operand:SF 1 "nonmemory_operand" "d,F")))]
  118.   ""
  119.   "* return set_cmp (operands[0], operands[1], 's');")
  120.  
  121. (define_insn "movtf"
  122.   [(set (match_operand:TF 0 "general_operand" "=g,d")
  123.     (match_operand:TF 1 "general_operand" "d,g"))]
  124.   ""
  125.   "*
  126. {
  127.   rtx opaddr = 0;
  128.   rtx xoperands[4];
  129.   xoperands[0] = operands[0];
  130.   xoperands[2] = operands[1];
  131.  
  132.   if (REG_P (operands[0]))
  133.     xoperands[1] = gen_rtx (REG, TFmode, REGNO (operands[0]) + 1);
  134.   else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
  135.     xoperands[1] = 0;
  136.   else if (offsettable_memref_p (operands[0]))
  137.     xoperands[1] = adj_offsettable_operand (operands[0], 8);
  138.   else
  139.     {
  140.       opaddr = XEXP (operands[0], 0);
  141.       xoperands[0] = gen_rtx (MEM, TFmode, gen_rtx (REG, SImode, 13));
  142.       xoperands[1] = adj_offsettable_operand (xoperands[0], 8);
  143.     }
  144.  
  145.   if (REG_P (operands[1]))
  146.     xoperands[3] = gen_rtx (REG, TFmode, REGNO (operands[1]) + 1);
  147.   else if (offsettable_memref_p (operands[1]))
  148.     xoperands[3] = adj_offsettable_operand (operands[1], 8);
  149.   else
  150.     {
  151.       opaddr = XEXP (operands[1], 0);
  152.       xoperands[2] = gen_rtx (MEM, TFmode, gen_rtx (REG, SImode, 13));
  153.       xoperands[3] = adj_offsettable_operand (xoperands[2], 8);
  154.     }
  155.  
  156.   if (opaddr)
  157.     output_asm_insn (\"psh.w a5\;ld.w %0,a5\", &opaddr);
  158.   if (push_operand (operands[0], TFmode))
  159.     output_asm_insn (\"psh.l %3\;psh.l %2\", xoperands);
  160.   else if (GET_CODE (operands[0]) == MEM)
  161.     output_asm_insn (\"st.l %2,%0\;st.l %3,%1\", xoperands);
  162.   else if (GET_CODE (operands[1]) == REG)
  163.     output_asm_insn (\"mov %2,%0\;mov %3,%1\", xoperands);
  164.   else
  165.     output_asm_insn (\"ld.l %2,%0\;ld.l %3,%1\", xoperands);
  166.   if (opaddr)
  167.     output_asm_insn (\"pop.w a5\");
  168.   return \"\";
  169. }")
  170.  
  171. (define_insn "movdf"
  172.   [(set (match_operand:DF 0 "general_operand" "=g,d")
  173.     (match_operand:DF 1 "general_operand" "d,dmG"))]
  174.   ""
  175.   "*
  176. {
  177.   if (push_operand (operands[0], DFmode))
  178.     return \"psh.l %1\";
  179.   else if (GET_CODE (operands[0]) == MEM)
  180.     return \"st.l %1,%0\";
  181.   else if (GET_CODE (operands[1]) == REG)
  182.     return \"mov %1,%0\";
  183.   else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_D_P (operands[1]))
  184.     {
  185.       operands[1] = gen_rtx (CONST_INT, VOIDmode,
  186.                  const_double_high_int (operands[1]));
  187.       return \"ld.d %1,%0\";
  188.     }
  189.   else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_L_P (operands[1]))
  190.     {
  191.       operands[1] = gen_rtx (CONST_INT, VOIDmode,
  192.                  const_double_low_int (operands[1]));
  193.       return \"ld.l %1,%0\";
  194.     }
  195.   else
  196.     return \"ld.l %1,%0\";
  197. }")
  198.  
  199. (define_insn "movsf"
  200.   [(set (match_operand:SF 0 "general_operand" "=g,d")
  201.     (match_operand:SF 1 "general_operand" "d,gF"))]
  202.   ""
  203.   "*
  204. {
  205.   if (push_operand (operands[0], SFmode))
  206.     return \"psh.w %1\";
  207.   else if (GET_CODE (operands[0]) == MEM)
  208.     return \"st.s %1,%0\";
  209.   else if (GET_CODE (operands[1]) == REG)
  210.     return \"mov.s %1,%0\";
  211.   else
  212.     return \"ld.s %1,%0\";
  213. }")
  214.  
  215. (define_insn "movdi"
  216.   [(set (match_operand:DI 0 "general_operand" "=g,d")
  217.     (match_operand:DI 1 "general_operand" "d,dmiG"))]
  218.   ""
  219.   "*
  220. {
  221.   if (push_operand (operands[0], DImode))
  222.     return \"psh.l %1\";
  223.   else if (GET_CODE (operands[0]) == MEM)
  224.     return \"st.l %1,%0\";
  225.   else if (GET_CODE (operands[1]) == REG)
  226.     return \"mov %1,%0\";
  227.   else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_D_P (operands[1]))
  228.     {
  229.       operands[1] = gen_rtx (CONST_INT, VOIDmode,
  230.                  const_double_high_int (operands[1]));
  231.       return \"ld.d %1,%0\";
  232.     }
  233.   else
  234.     return \"ld.l %1,%0\";
  235. }")
  236.  
  237. ;; Special case of movsi, needed to express A-reg preference.
  238.  
  239. (define_insn ""
  240.   [(set (match_operand:SI 0 "push_operand" "=<")
  241.     (plus:SI (match_operand:SI 1 "register_operand" "a")
  242.          (match_operand:SI 2 "immediate_operand" "i")))]
  243.   "operands[1] != stack_pointer_rtx"
  244.   "pshea %a2(%1)")
  245.  
  246. (define_insn "movsi"
  247.   [(set (match_operand:SI 0 "general_operand" "=g,r,<")
  248.     (match_operand:SI 1 "general_operand" "r,g,io"))]
  249.   ""
  250.   "*
  251.   if (push_operand (operands[0], SImode))
  252.     {
  253.       if (GET_CODE (operands[1]) == REG)
  254.     return \"psh.w %1\";
  255.       else
  256.         return \"pshea %a1\";
  257.     }
  258.   if (GET_CODE (operands[0]) == MEM)
  259.     return \"st.w %1,%0\";
  260.   if (GET_CODE (operands[1]) != REG)
  261.     return \"ld.w %1,%0\";
  262.   if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
  263.     return \"mov.w %1,%0\";
  264.   return \"mov %1,%0\";
  265. }")
  266.  
  267. (define_insn "movstrictsi"
  268.   [(set (strict_low_part (match_operand:SI 0 "general_operand" "=g,r"))
  269.     (match_operand:SI 1 "general_operand" "r,g"))]
  270.   ""
  271.   "*
  272.   if (GET_CODE (operands[0]) == MEM)
  273.     return \"st.w %1,%0\";
  274.   if (GET_CODE (operands[1]) != REG)
  275.     return \"ld.w %1,%0\";
  276.   if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
  277.     return \"mov.w %1,%0\";
  278.   return \"mov %1,%0\";
  279. }")
  280.  
  281. (define_insn "movhi"
  282.   [(set (match_operand:HI 0 "general_operand" "=g,r")
  283.     (match_operand:HI 1 "general_operand" "r,g"))]
  284.   ""
  285.   "*
  286. {
  287.   if (push_operand (operands[0], HImode))
  288.     abort ();
  289.   else if (GET_CODE (operands[0]) == MEM)
  290.     return \"st.h %1,%0\";
  291.   else if (GET_CODE (operands[1]) == REG) 
  292.     {
  293.       if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
  294.     return \"mov.w %1,%0\";
  295.       else
  296.         return \"mov %1,%0\";
  297.     }
  298.   else if (GET_CODE (operands[1]) == CONST_INT)
  299.     return \"ld.w %1,%0\";
  300.   else
  301.     return \"ld.h %1,%0\";
  302. }")
  303.  
  304. (define_insn "movqi"
  305.   [(set (match_operand:QI 0 "general_operand" "=g,r")
  306.     (match_operand:QI 1 "general_operand" "r,g"))]
  307.   ""
  308.   "*
  309. {
  310.   if (push_operand (operands[0], QImode))
  311.     abort ();
  312.   else if (GET_CODE (operands[0]) == MEM)
  313.     return \"st.b %1,%0\";
  314.   else if (GET_CODE (operands[1]) == REG)
  315.     {
  316.       if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
  317.     return \"mov.w %1,%0\";
  318.       else
  319.         return \"mov %1,%0\";
  320.     }
  321.   else if (GET_CODE (operands[1]) == CONST_INT)
  322.     return \"ld.w %1,%0\";
  323.   else
  324.     return \"ld.b %1,%0\";
  325. }")
  326.  
  327. ;; Extension and truncation insns.
  328. ;; Those for integer source operand
  329. ;; are ordered widest source type first.
  330.  
  331. (define_insn "truncsiqi2"
  332.   [(set (match_operand:QI 0 "register_operand" "=d,a")
  333.     (truncate:QI (match_operand:SI 1 "register_operand" "d,a")))]
  334.   ""
  335.   "cvtw.b %1,%0")
  336.  
  337. (define_insn "truncsihi2"
  338.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  339.     (truncate:HI (match_operand:SI 1 "register_operand" "d,a")))]
  340.   ""
  341.   "cvtw.h %1,%0")
  342.  
  343. (define_insn "trunchiqi2"
  344.   [(set (match_operand:QI 0 "register_operand" "=r")
  345.     (truncate:QI (match_operand:HI 1 "register_operand" "0")))]
  346.   ""
  347.   "")
  348.  
  349. (define_insn "truncdisi2"
  350.   [(set (match_operand:SI 0 "register_operand" "=d")
  351.     (truncate:SI (match_operand:DI 1 "register_operand" "d")))]
  352.   ""
  353.   "cvtl.w %1,%0")
  354.  
  355. (define_insn "extendsidi2"
  356.   [(set (match_operand:DI 0 "register_operand" "=d")
  357.     (sign_extend:DI (match_operand:SI 1 "register_operand" "d")))]
  358.   ""
  359.   "cvtw.l %1,%0")
  360.  
  361. (define_insn "extendhisi2"
  362.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  363.     (sign_extend:SI (match_operand:HI 1 "register_operand" "d,a")))]
  364.   ""
  365.   "cvth.w %1,%0")
  366.  
  367. (define_insn "extendqihi2"
  368.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  369.     (sign_extend:HI (match_operand:QI 1 "register_operand" "d,a")))]
  370.   ""
  371.   "cvtb.w %1,%0")
  372.  
  373. (define_insn "extendqisi2"
  374.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  375.     (sign_extend:SI (match_operand:QI 1 "register_operand" "d,a")))]
  376.   ""
  377.   "cvtb.w %1,%0")
  378.  
  379. (define_insn "extendsfdf2"
  380.   [(set (match_operand:DF 0 "register_operand" "=d")
  381.     (float_extend:DF (match_operand:SF 1 "register_operand" "d")))]
  382.   ""
  383.   "cvts.d %1,%0")
  384.  
  385. (define_insn "truncdfsf2"
  386.   [(set (match_operand:SF 0 "register_operand" "=d")
  387.     (float_truncate:SF (match_operand:DF 1 "register_operand" "d")))]
  388.   ""
  389.   "cvtd.s %1,%0")
  390.  
  391. (define_insn "zero_extendhisi2"
  392.   [(set (match_operand:SI 0 "register_operand" "=r")
  393.     (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))]
  394.   ""
  395.   "and #0xffff,%0")
  396.  
  397. (define_insn "zero_extendqihi2"
  398.   [(set (match_operand:HI 0 "register_operand" "=r")
  399.     (zero_extend:HI (match_operand:QI 1 "register_operand" "0")))]
  400.   ""
  401.   "and #0xff,%0")
  402.  
  403. (define_insn "zero_extendqisi2"
  404.   [(set (match_operand:SI 0 "register_operand" "=r")
  405.     (zero_extend:SI (match_operand:QI 1 "register_operand" "0")))]
  406.   ""
  407.   "and #0xff,%0")
  408.  
  409. (define_insn "zero_extendsidi2"
  410.   [(set (match_operand:DI 0 "register_operand" "=d")
  411.     (zero_extend:DI (match_operand:SI 1 "register_operand" "0")))]
  412.   ""
  413.   "ld.u #0,%0")
  414.  
  415. ;; Fix-to-float conversion insns.
  416. ;; Note that the ones that start with SImode come first.
  417. ;; That is so that an operand that is a CONST_INT
  418. ;; (and therefore lacks a specific machine mode).
  419. ;; will be recognized as SImode (which is always valid)
  420. ;; rather than as QImode or HImode.
  421.  
  422. (define_insn "floatsisf2"
  423.   [(set (match_operand:SF 0 "register_operand" "=d")
  424.     (float:SF (match_operand:SI 1 "register_operand" "d")))]
  425.   ""
  426.   "cvtw.s %1,%0")
  427.  
  428. (define_insn "floatdisf2"
  429.   [(set (match_operand:SF 0 "register_operand" "=d")
  430.     (float:SF (match_operand:DI 1 "register_operand" "d")))]
  431.   ""
  432.   "cvtl.s %1,%0")
  433.  
  434. (define_insn "floatsidf2"
  435.   [(set (match_operand:DF 0 "register_operand" "=d")
  436.     (float:DF (match_operand:SI 1 "register_operand" "d")))]
  437.   "TARGET_C2"
  438.   "cvtw.d %1,%0")
  439.  
  440. (define_insn "floatdidf2"
  441.   [(set (match_operand:DF 0 "register_operand" "=d")
  442.     (float:DF (match_operand:DI 1 "register_operand" "d")))]
  443.   ""
  444.   "cvtl.d %1,%0")
  445.  
  446. ;; Float-to-fix conversion insns.
  447.  
  448. (define_insn "fix_truncsfsi2"
  449.   [(set (match_operand:SI 0 "register_operand" "=d")
  450.     (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
  451.   ""
  452.   "cvts.w %1,%0")
  453.  
  454. (define_insn "fix_truncsfdi2"
  455.   [(set (match_operand:DI 0 "register_operand" "=d")
  456.     (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
  457.   ""
  458.   "cvts.l %1,%0")
  459.  
  460. (define_insn "fix_truncdfsi2"
  461.   [(set (match_operand:SI 0 "register_operand" "=d")
  462.     (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
  463.   ""
  464.   "*
  465. {
  466.   if (TARGET_C2)
  467.     return \"cvtd.w %1,%0\";
  468.   return \"cvtd.l %1,%0\";
  469. }")
  470.  
  471. (define_insn "fix_truncdfdi2"
  472.   [(set (match_operand:DI 0 "register_operand" "=d")
  473.     (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
  474.   ""
  475.   "cvtd.l %1,%0")
  476.  
  477. ;;- All kinds of add instructions.
  478.  
  479. (define_insn "adddf3"
  480.   [(set (match_operand:DF 0 "register_operand" "=d")
  481.     (plus:DF (match_operand:DF 1 "register_operand" "%0")
  482.          (match_operand:DF 2 "register_operand" "d")))]
  483.   ""
  484.   "add.d %2,%0")
  485.  
  486. (define_insn "addsf3"
  487.   [(set (match_operand:SF 0 "register_operand" "=d")
  488.     (plus:SF (match_operand:SF 1 "register_operand" "%0")
  489.          (match_operand:SF 2 "nonmemory_operand" "dF")))]
  490.   ""
  491.   "add.s %2,%0")
  492.  
  493. (define_insn "adddi3"
  494.   [(set (match_operand:DI 0 "register_operand" "=d")
  495.     (plus:DI (match_operand:DI 1 "register_operand" "%0")
  496.          (match_operand:DI 2 "register_operand" "d")))]
  497.   ""
  498.   "add.l %2,%0")
  499.  
  500. ;; special case of addsi3, needed to specify an A reg for the destination 
  501. ;; when the source is a sum involving FP or AP.
  502.  
  503. (define_insn ""
  504.   [(set (match_operand:SI 0 "register_operand" "=a")
  505.     (plus:SI (match_operand:SI 1 "register_operand" "%a")
  506.          (match_operand:SI 2 "immediate_operand" "i")))]
  507.   "operands[1] == frame_pointer_rtx || operands[1] == arg_pointer_rtx"
  508.   "ldea %a2(%1),%0")
  509.  
  510. (define_insn "addsi3"
  511.   [(set (match_operand:SI 0 "register_operand" "=d,a,a")
  512.     (plus:SI (match_operand:SI 1 "nonmemory_operand" "%0,0,a")
  513.          (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))]
  514.   ""
  515.   "* switch (which_alternative) 
  516. {
  517.  case 0:
  518.  case 1: 
  519.    return \"add.w %2,%0\";
  520.  case 2:
  521.    if ((TARGET_C2 || A_REG_P (operands[0]))
  522.        && operands[1] != stack_pointer_rtx)
  523.      return \"ldea %a2(%1),%0\";
  524.    else
  525.      return \"mov %1,%0\;add.w %2,%0\";
  526. }")
  527.  
  528. (define_insn "addhi3"
  529.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  530.     (plus:HI (match_operand:HI 1 "register_operand" "%0,0")
  531.          (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  532.   ""
  533.   "add.h %2,%0")
  534.  
  535. (define_insn "addqi3"
  536.   [(set (match_operand:QI 0 "register_operand" "=d")
  537.     (plus:QI (match_operand:QI 1 "register_operand" "%0")
  538.          (match_operand:QI 2 "register_operand" "d")))]
  539.   ""
  540.   "add.b %2,%0")
  541.  
  542. ;;- All kinds of subtract instructions.
  543.  
  544. (define_insn "subdf3"
  545.   [(set (match_operand:DF 0 "register_operand" "=d")
  546.     (minus:DF (match_operand:DF 1 "register_operand" "0")
  547.           (match_operand:DF 2 "register_operand" "d")))]
  548.   ""
  549.   "sub.d %2,%0")
  550.  
  551. (define_insn "subsf3"
  552.   [(set (match_operand:SF 0 "register_operand" "=d")
  553.     (minus:SF (match_operand:SF 1 "register_operand" "0")
  554.           (match_operand:SF 2 "nonmemory_operand" "dF")))]
  555.   ""
  556.   "sub.s %2,%0")
  557.  
  558. (define_insn "subdi3"
  559.   [(set (match_operand:DI 0 "register_operand" "=d")
  560.     (minus:DI (match_operand:DI 1 "register_operand" "0")
  561.           (match_operand:DI 2 "register_operand" "d")))]
  562.   ""
  563.   "sub.l %2,%0")
  564.  
  565. (define_insn "subsi3"
  566.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  567.     (minus:SI (match_operand:SI 1 "register_operand" "0,0")
  568.           (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  569.   ""
  570.   "sub.w %2,%0")
  571.  
  572. (define_insn "subhi3"
  573.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  574.     (minus:HI (match_operand:HI 1 "register_operand" "0,0")
  575.           (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  576.   ""
  577.   "sub.h %2,%0")
  578.  
  579. (define_insn "subqi3"
  580.   [(set (match_operand:QI 0 "register_operand" "=d")
  581.     (minus:QI (match_operand:QI 1 "register_operand" "0")
  582.           (match_operand:QI 2 "register_operand" "d")))]
  583.   ""
  584.   "sub.b %2,%0")
  585.  
  586. ;;- Multiply instructions.
  587.  
  588. (define_insn "muldf3"
  589.   [(set (match_operand:DF 0 "register_operand" "=d")
  590.     (mult:DF (match_operand:DF 1 "register_operand" "%0")
  591.          (match_operand:DF 2 "register_operand" "d")))]
  592.   ""
  593.   "mul.d %2,%0")
  594.  
  595. (define_insn "mulsf3"
  596.   [(set (match_operand:SF 0 "register_operand" "=d")
  597.     (mult:SF (match_operand:SF 1 "register_operand" "%0")
  598.          (match_operand:SF 2 "nonmemory_operand" "dF")))]
  599.   ""
  600.   "mul.s %2,%0")
  601.  
  602. (define_insn "muldi3"
  603.   [(set (match_operand:DI 0 "register_operand" "=d")
  604.     (mult:DI (match_operand:DI 1 "register_operand" "%0")
  605.          (match_operand:DI 2 "register_operand" "d")))]
  606.   ""
  607.   "mul.l %2,%0")
  608.  
  609. (define_insn "mulsi3"
  610.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  611.     (mult:SI (match_operand:SI 1 "register_operand" "%0,0")
  612.          (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  613.   ""
  614.   "mul.w %2,%0")
  615.  
  616. (define_insn "mulhi3"
  617.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  618.     (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
  619.          (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  620.   ""
  621.   "mul.h %2,%0")
  622.  
  623. (define_insn "mulqi3"
  624.   [(set (match_operand:QI 0 "register_operand" "=d")
  625.     (mult:QI (match_operand:QI 1 "register_operand" "%0")
  626.          (match_operand:QI 2 "register_operand" "d")))]
  627.   ""
  628.   "mul.b %2,%0")
  629.  
  630. ;;- Divide instructions.
  631.  
  632. (define_insn "divdf3"
  633.   [(set (match_operand:DF 0 "register_operand" "=d")
  634.     (div:DF (match_operand:DF 1 "register_operand" "0")
  635.         (match_operand:DF 2 "register_operand" "d")))]
  636.   ""
  637.   "div.d %2,%0")
  638.  
  639. (define_insn "divsf3"
  640.   [(set (match_operand:SF 0 "register_operand" "=d")
  641.     (div:SF (match_operand:SF 1 "register_operand" "0")
  642.         (match_operand:SF 2 "nonmemory_operand" "dF")))]
  643.   ""
  644.   "div.s %2,%0")
  645.  
  646. (define_insn "divdi3"
  647.   [(set (match_operand:DI 0 "register_operand" "=d")
  648.     (div:DI (match_operand:DI 1 "register_operand" "0")
  649.         (match_operand:DI 2 "register_operand" "d")))]
  650.   ""
  651.   "div.l %2,%0")
  652.  
  653. (define_insn "udivdi3"
  654.   [(set (match_operand:DI 0 "register_operand" "=d")
  655.     (udiv:DI (match_operand:DI 1 "register_operand" "d")
  656.          (match_operand:DI 2 "register_operand" "d")))]
  657.   ""
  658.   "psh.l %2\;psh.l %1\;callq udiv64\;pop.l %0\;add.w #8,sp")
  659.  
  660. (define_insn "divsi3"
  661.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  662.     (div:SI (match_operand:SI 1 "register_operand" "0,0")
  663.         (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  664.   ""
  665.   "div.w %2,%0")
  666.  
  667. (define_insn "divhi3"
  668.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  669.     (div:HI (match_operand:HI 1 "register_operand" "0,0")
  670.         (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  671.   ""
  672.   "div.h %2,%0")
  673.  
  674. (define_insn "divqi3"
  675.   [(set (match_operand:QI 0 "register_operand" "=d")
  676.     (div:QI (match_operand:QI 1 "register_operand" "0")
  677.         (match_operand:QI 2 "register_operand" "d")))]
  678.   ""
  679.   "div.b %2,%0")
  680.  
  681. ;; - and, or, xor
  682.  
  683. (define_insn ""
  684.   [(set (match_operand:DI 0 "register_operand" "=d")
  685.     (and:DI (match_operand:DI 1 "register_operand" "%0")
  686.         (match_operand:DI 2 "immediate_operand" "Fn")))]
  687.   "GET_CODE (operands[2]) == CONST_INT
  688.    || (GET_CODE (operands[2]) == CONST_DOUBLE
  689.        && CONST_DOUBLE_HIGH (operands[2]) == -1)"
  690.   "and %2,%0")
  691.  
  692. (define_insn "anddi3"
  693.   [(set (match_operand:DI 0 "register_operand" "=d")
  694.     (and:DI (match_operand:DI 1 "register_operand" "%0")
  695.         (match_operand:DI 2 "register_operand" "d")))]
  696.   ""
  697.   "and %2,%0")
  698.  
  699. (define_insn "andsi3"
  700.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  701.     (and:SI (match_operand:SI 1 "register_operand" "%0,0")
  702.         (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  703.   ""
  704.   "and %2,%0")
  705.  
  706. (define_insn "andhi3"
  707.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  708.     (and:HI (match_operand:HI 1 "register_operand" "%0,0")
  709.         (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  710.   ""
  711.   "and %2,%0")
  712.  
  713. (define_insn "andqi3"
  714.   [(set (match_operand:QI 0 "register_operand" "=d,a")
  715.     (and:QI (match_operand:QI 1 "register_operand" "%0,0")
  716.         (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
  717.   ""
  718.   "and %2,%0")
  719.  
  720. ;;- Bit set instructions.
  721.  
  722. (define_insn ""
  723.   [(set (match_operand:DI 0 "register_operand" "=d")
  724.     (ior:DI (match_operand:DI 1 "register_operand" "%0")
  725.         (match_operand:DI 2 "immediate_operand" "Fn")))]
  726.   "GET_CODE (operands[2]) == CONST_INT
  727.    || (GET_CODE (operands[2]) == CONST_DOUBLE
  728.        && CONST_DOUBLE_HIGH (operands[2]) == 0)"
  729.   "or %2,%0")
  730.  
  731. (define_insn "iordi3"
  732.   [(set (match_operand:DI 0 "register_operand" "=d")
  733.     (ior:DI (match_operand:DI 1 "register_operand" "%0")
  734.         (match_operand:DI 2 "register_operand" "d")))]
  735.   ""
  736.   "or %2,%0")
  737.  
  738. (define_insn "iorsi3"
  739.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  740.     (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
  741.         (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  742.   ""
  743.   "or %2,%0")
  744.  
  745. (define_insn "iorhi3"
  746.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  747.     (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
  748.         (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  749.   ""
  750.   "or %2,%0")
  751.  
  752. (define_insn "iorqi3"
  753.   [(set (match_operand:QI 0 "register_operand" "=d,a")
  754.     (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
  755.         (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
  756.   ""
  757.   "or %2,%0")
  758.  
  759. ;;- xor instructions.
  760.  
  761. (define_insn ""
  762.   [(set (match_operand:DI 0 "register_operand" "=d")
  763.     (xor:DI (match_operand:DI 1 "register_operand" "%0")
  764.         (match_operand:DI 2 "immediate_operand" "Fn")))]
  765.   "GET_CODE (operands[2]) == CONST_INT
  766.    || (GET_CODE (operands[2]) == CONST_DOUBLE
  767.        && CONST_DOUBLE_HIGH (operands[2]) == 0)"
  768.   "xor %2,%0")
  769.  
  770. (define_insn "xordi3"
  771.   [(set (match_operand:DI 0 "register_operand" "=d")
  772.     (xor:DI (match_operand:DI 1 "register_operand" "%0")
  773.         (match_operand:DI 2 "register_operand" "d")))]
  774.   ""
  775.   "xor %2,%0")
  776.  
  777. (define_insn "xorsi3"
  778.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  779.     (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
  780.         (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  781.   ""
  782.   "xor %2,%0")
  783.  
  784. (define_insn "xorhi3"
  785.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  786.     (xor:HI (match_operand:HI 1 "register_operand" "%0,0")
  787.         (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
  788.   ""
  789.   "xor %2,%0")
  790.  
  791. (define_insn "xorqi3"
  792.   [(set (match_operand:QI 0 "register_operand" "=d,a")
  793.     (xor:QI (match_operand:QI 1 "register_operand" "%0,0")
  794.         (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
  795.   ""
  796.   "xor %2,%0")
  797.  
  798. (define_insn "negdf2"
  799.   [(set (match_operand:DF 0 "register_operand" "=d")
  800.     (neg:DF (match_operand:DF 1 "register_operand" "d")))]
  801.   ""
  802.   "neg.d %1,%0")
  803.  
  804. (define_insn "negsf2"
  805.   [(set (match_operand:SF 0 "register_operand" "=d")
  806.     (neg:SF (match_operand:SF 1 "register_operand" "d")))]
  807.   ""
  808.   "neg.s %1,%0")
  809.  
  810. (define_insn "negdi2"
  811.   [(set (match_operand:DI 0 "register_operand" "=d")
  812.     (neg:DI (match_operand:DI 1 "register_operand" "d")))]
  813.   ""
  814.   "neg.l %1,%0")
  815.  
  816. (define_insn "negsi2"
  817.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  818.     (neg:SI (match_operand:SI 1 "register_operand" "d,a")))]
  819.   ""
  820.   "neg.w %1,%0")
  821.  
  822. (define_insn "neghi2"
  823.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  824.     (neg:HI (match_operand:HI 1 "register_operand" "d,a")))]
  825.   ""
  826.   "neg.h %1,%0")
  827.  
  828. (define_insn "negqi2"
  829.   [(set (match_operand:QI 0 "register_operand" "=d")
  830.     (neg:QI (match_operand:QI 1 "register_operand" "d")))]
  831.   ""
  832.   "neg.b %1,%0")
  833.  
  834. (define_insn "one_cmpldi2"
  835.   [(set (match_operand:DI 0 "register_operand" "=d")
  836.     (not:DI (match_operand:DI 1 "register_operand" "d")))]
  837.   ""
  838.   "not %1,%0")
  839.  
  840. (define_insn "one_cmplsi2"
  841.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  842.     (not:SI (match_operand:SI 1 "register_operand" "d,a")))]
  843.   ""
  844.   "not %1,%0")
  845.  
  846. (define_insn "one_cmplhi2"
  847.   [(set (match_operand:HI 0 "register_operand" "=d,a")
  848.     (not:HI (match_operand:HI 1 "register_operand" "d,a")))]
  849.   ""
  850.   "not %1,%0")
  851.  
  852. (define_insn "one_cmplqi2"
  853.   [(set (match_operand:QI 0 "register_operand" "=d,a")
  854.     (not:QI (match_operand:QI 1 "register_operand" "d,a")))]
  855.   ""
  856.   "not %1,%0")
  857.  
  858. ;;- shifts
  859. ;;
  860. ;; Convex shift instructions are logical shifts.
  861. ;; To make signed right shifts:
  862. ;; for SImode, sign extend to DImode and shift, works for 0..32
  863. ;; for DImode, shift and then extend the sign, works for 0..63 -- but not 64
  864.  
  865. (define_insn "lshlsi3"
  866.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  867.     (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
  868.            (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  869.   ""
  870.   "*
  871. {
  872.   if (operands[2] == const1_rtx)
  873.     return \"add.w %0,%0\";
  874.   else if (TARGET_C2 && S_REG_P (operands[0]))
  875.     return \"shf.w %2,%0\";
  876.   else
  877.     return \"shf %2,%0\";
  878. }")
  879.  
  880. (define_insn "ashlsi3"
  881.   [(set (match_operand:SI 0 "register_operand" "=d,a")
  882.     (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
  883.            (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
  884.   ""
  885.   "*
  886. {
  887.   if (operands[2] == const1_rtx)
  888.     return \"add.w %0,%0\";
  889.   else if (TARGET_C2 && S_REG_P (operands[0]))
  890.     return \"shf.w %2,%0\";
  891.   else
  892.     return \"shf %2,%0\";
  893. }")
  894.  
  895. (define_expand "lshrsi3"
  896.   [(set (match_operand:SI 0 "register_operand" "")
  897.     (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
  898.              (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
  899.   ""
  900.   "operands[2] = negate_rtx (SImode, operands[2]);")
  901.  
  902. (define_insn ""
  903.   [(set
  904.     (match_operand:SI 0 "register_operand" "=d,a")
  905.     (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
  906.          (neg:SI (match_operand:SI 2 "nonmemory_operand" "di,ai"))))]
  907.   ""
  908.   "*
  909. {
  910.   if (A_REG_P (operands[0]))
  911.     return \"shf %2,%0\";
  912.   else if (TARGET_C2)
  913.     return \"shf.w %2,%0\";
  914.   else
  915.     return \"ld.u #0,%0\;shf %2,%0\";
  916. }")
  917.  
  918. (define_insn ""
  919.   [(set
  920.     (match_operand:SI 0 "register_operand" "=r")
  921.     (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
  922.          (match_operand:SI 2 "immediate_operand" "i")))]
  923.   ""
  924.   "*
  925. {
  926.   if (A_REG_P (operands[0]))
  927.     return \"shf #%n2,%0\";
  928.   else if (TARGET_C2)
  929.     return \"shf.w #%n2,%0\";
  930.   else
  931.     return \"ld.u #0,%0\;shf #%n2,%0\";
  932. }")
  933.  
  934. (define_expand "ashrsi3"
  935.   [(set (match_operand:SI 0 "register_operand" "=d")
  936.     (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
  937.              (neg:SI (match_operand:SI 2 "nonmemory_operand" "di"))))]
  938.   ""
  939.   "operands[2] = negate_rtx (SImode, operands[2]);")
  940.  
  941. (define_insn ""
  942.   [(set (match_operand:SI 0 "register_operand" "=&d")
  943.     (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
  944.              (neg:SI (match_operand:SI 2 "nonmemory_operand" "di"))))]
  945.   ""
  946.   "cvtw.l %1,%0\;shf %2,%0")
  947.  
  948. (define_insn ""
  949.   [(set (match_operand:SI 0 "register_operand" "=&d")
  950.     (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
  951.              (match_operand:SI 2 "immediate_operand" "i")))]
  952.   ""
  953.   "cvtw.l %1,%0\;shf #%n2,%0")
  954.  
  955. (define_insn "lshldi3"
  956.   [(set (match_operand:DI 0 "register_operand" "=d")
  957.     (lshift:DI (match_operand:DI 1 "register_operand" "0")
  958.            (match_operand:SI 2 "nonmemory_operand" "di")))]
  959.   ""
  960.   "shf %2,%0")
  961.  
  962. (define_insn "ashldi3"
  963.   [(set (match_operand:DI 0 "register_operand" "=d")
  964.     (ashift:DI (match_operand:DI 1 "register_operand" "0")
  965.            (match_operand:SI 2 "nonmemory_operand" "di")))]
  966.   ""
  967.   "shf %2,%0")
  968.  
  969. (define_expand "lshrdi3"
  970.   [(set (match_operand:DI 0 "register_operand" "=d")
  971.     (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
  972.              (neg:SI (match_operand:SI 2 "nonmemory_operand" "di"))))]
  973.   ""
  974.   "operands[2] = negate_rtx (SImode, operands[2]);")
  975.  
  976. (define_insn ""
  977.   [(set (match_operand:DI 0 "register_operand" "=d")
  978.     (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
  979.              (neg:SI (match_operand:SI 2 "nonmemory_operand" "di"))))]
  980.   ""
  981.   "shf %2,%0")
  982.  
  983. (define_insn ""
  984.   [(set (match_operand:DI 0 "register_operand" "=d")
  985.     (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
  986.              (match_operand:SI 2 "immediate_operand" "i")))]
  987.   ""
  988.   "shf #%n2,%0")
  989.  
  990. ;; signed  a >> b  is
  991. ;;     ((a >> b) ^ signbit) - signbit
  992. ;; where signbit is (1 << 63) >> b
  993.  
  994. (define_expand "ashrdi3"
  995.   [(match_operand:DI 0 "register_operand" "")
  996.    (match_operand:DI 1 "register_operand" "")
  997.    (match_operand:SI 2 "nonmemory_operand" "")
  998.    (match_dup 3)]
  999.   ""
  1000.   "
  1001. {
  1002.   if (GET_CODE (operands[2]) == CONST_INT)
  1003.     {
  1004.       int rshift = INTVAL (operands[2]);
  1005.       operands[3] =
  1006.     force_reg (DImode, immed_double_const (1 << (63 - rshift),
  1007.                            1 << (31 - rshift), DImode));
  1008.     }
  1009.   else
  1010.     {
  1011.       operands[3] =
  1012.       force_reg (DImode, immed_double_const (0, 1 << 31, DImode));
  1013.       emit_insn (gen_lshrdi3 (operands[3], operands[3], operands[2]));
  1014.     }
  1015.  
  1016.   emit_insn (gen_lshrdi3 (operands[0], operands[1], operands[2]));
  1017.   emit_insn (gen_rtx (SET, VOIDmode, operands[0],
  1018.               gen_rtx (XOR, DImode, operands[0], operands[3])));
  1019.   emit_insn (gen_rtx (SET, VOIDmode, operands[0],
  1020.               gen_rtx (MINUS, DImode, operands[0], operands[3])));
  1021.   DONE;
  1022. }")
  1023.  
  1024. ;; __builtin instructions
  1025.  
  1026. (define_insn "sqrtdf2"
  1027.   [(set (match_operand:DF 0 "register_operand" "=d")
  1028.     (sqrt:DF (match_operand:DF 1 "register_operand" "0")))]
  1029.   "TARGET_C2"
  1030.   "sqrt.d %0")
  1031.  
  1032. (define_insn "sqrtsf2"
  1033.   [(set (match_operand:SF 0 "register_operand" "=d")
  1034.     (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
  1035.   "TARGET_C2"
  1036.   "sqrt.s %0")
  1037.  
  1038. (define_insn ""
  1039.   [(set (match_operand:SI 0 "register_operand" "=d")
  1040.     (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
  1041.           (const_int 1)))]
  1042.   ""
  1043.   "tzc %1,%0\;le.w #32,%0\;jbrs.f .+6\;ld.w #-1,%0")
  1044.  
  1045. (define_expand "ffssi2"
  1046.   [(set (match_operand:SI 0 "register_operand" "=d")
  1047.     (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
  1048.           (const_int 1)))
  1049.    (set (match_dup 0)
  1050.     (plus:SI (match_dup 0)
  1051.          (const_int 1)))]
  1052.   ""
  1053.   "")
  1054.  
  1055. (define_insn "abssf2"
  1056.   [(set (match_operand:SF 0 "register_operand" "=d")
  1057.     (abs:SF (match_operand:SF 1 "register_operand" "0")))]
  1058.   ""
  1059.   "and #0x7fffffff,%0")
  1060.  
  1061. (define_expand "absdf2"
  1062.   [(set (subreg:DI (match_operand:DF 0 "register_operand" "=d") 0)
  1063.     (and:DI (subreg:DI (match_operand:DF 1 "register_operand" "d") 0)
  1064.         (match_dup 2)))]
  1065.   ""
  1066.   "operands[2] = force_reg (DImode,
  1067.                 immed_double_const (-1, 0x7fffffff, DImode));")
  1068.  
  1069. (define_insn "jump"
  1070.   [(set (pc)
  1071.     (label_ref (match_operand 0 "" "")))]
  1072.   ""
  1073.   "jbr %l0")
  1074.  
  1075. (define_insn "beq"
  1076.   [(set (pc)
  1077.     (if_then_else (eq (cc0)
  1078.               (const_int 0))
  1079.               (label_ref (match_operand 0 "" ""))
  1080.               (pc)))]
  1081.   ""
  1082.   "* return gen_cmp (operands[0], \"eq\", 't'); ")
  1083.  
  1084. (define_insn "bne"
  1085.   [(set (pc)
  1086.     (if_then_else (ne (cc0)
  1087.               (const_int 0))
  1088.               (label_ref (match_operand 0 "" ""))
  1089.               (pc)))]
  1090.   ""
  1091.   "* return gen_cmp (operands[0], \"eq\", 'f'); ")
  1092.  
  1093. (define_insn "bgt"
  1094.   [(set (pc)
  1095.     (if_then_else (gt (cc0)
  1096.               (const_int 0))
  1097.               (label_ref (match_operand 0 "" ""))
  1098.               (pc)))]
  1099.   ""
  1100.   "* return gen_cmp (operands[0], \"le\", 'f'); ")
  1101.  
  1102. (define_insn "bgtu"
  1103.   [(set (pc)
  1104.     (if_then_else (gtu (cc0)
  1105.                (const_int 0))
  1106.               (label_ref (match_operand 0 "" ""))
  1107.               (pc)))]
  1108.   ""
  1109.   "* return gen_cmp (operands[0], \"leu\", 'f'); ")
  1110.  
  1111. (define_insn "blt"
  1112.   [(set (pc)
  1113.     (if_then_else (lt (cc0)
  1114.               (const_int 0))
  1115.               (label_ref (match_operand 0 "" ""))
  1116.               (pc)))]
  1117.   ""
  1118.   "* return gen_cmp (operands[0], \"lt\", 't'); ")
  1119.  
  1120. (define_insn "bltu"
  1121.   [(set (pc)
  1122.     (if_then_else (ltu (cc0)
  1123.                (const_int 0))
  1124.               (label_ref (match_operand 0 "" ""))
  1125.               (pc)))]
  1126.   ""
  1127.   "* return gen_cmp (operands[0], \"ltu\", 't'); ")
  1128.  
  1129. (define_insn "bge"
  1130.   [(set (pc)
  1131.     (if_then_else (ge (cc0)
  1132.               (const_int 0))
  1133.               (label_ref (match_operand 0 "" ""))
  1134.               (pc)))]
  1135.   ""
  1136.   "* return gen_cmp (operands[0], \"lt\", 'f'); ")
  1137.  
  1138. (define_insn "bgeu"
  1139.   [(set (pc)
  1140.     (if_then_else (geu (cc0)
  1141.                (const_int 0))
  1142.               (label_ref (match_operand 0 "" ""))
  1143.               (pc)))]
  1144.   ""
  1145.   "* return gen_cmp (operands[0], \"ltu\", 'f'); ")
  1146.  
  1147. (define_insn "ble"
  1148.   [(set (pc)
  1149.     (if_then_else (le (cc0)
  1150.               (const_int 0))
  1151.               (label_ref (match_operand 0 "" ""))
  1152.               (pc)))]
  1153.   ""
  1154.   "* return gen_cmp (operands[0], \"le\", 't'); ")
  1155.  
  1156. (define_insn "bleu"
  1157.   [(set (pc)
  1158.     (if_then_else (leu (cc0)
  1159.                (const_int 0))
  1160.               (label_ref (match_operand 0 "" ""))
  1161.               (pc)))]
  1162.   ""
  1163.   "* return gen_cmp (operands[0], \"leu\", 't'); ")
  1164.  
  1165. (define_insn ""
  1166.   [(set (pc)
  1167.     (if_then_else (eq (cc0)
  1168.               (const_int 0))
  1169.               (pc)
  1170.               (label_ref (match_operand 0 "" ""))))]
  1171.   ""
  1172.   "* return gen_cmp (operands[0], \"eq\", 'f'); ")
  1173.  
  1174. (define_insn ""
  1175.   [(set (pc)
  1176.     (if_then_else (ne (cc0)
  1177.               (const_int 0))
  1178.               (pc)
  1179.               (label_ref (match_operand 0 "" ""))))]
  1180.   ""
  1181.   "* return gen_cmp (operands[0], \"eq\", 't'); ")
  1182.  
  1183. (define_insn ""
  1184.   [(set (pc)
  1185.     (if_then_else (gt (cc0)
  1186.               (const_int 0))
  1187.               (pc)
  1188.               (label_ref (match_operand 0 "" ""))))]
  1189.   ""
  1190.   "* return gen_cmp (operands[0], \"le\", 't'); ")
  1191.  
  1192. (define_insn ""
  1193.   [(set (pc)
  1194.     (if_then_else (gtu (cc0)
  1195.                (const_int 0))
  1196.               (pc)
  1197.               (label_ref (match_operand 0 "" ""))))]
  1198.   ""
  1199.   "* return gen_cmp (operands[0], \"leu\", 't'); ")
  1200.  
  1201. (define_insn ""
  1202.   [(set (pc)
  1203.     (if_then_else (lt (cc0)
  1204.               (const_int 0))
  1205.               (pc)
  1206.               (label_ref (match_operand 0 "" ""))))]
  1207.   ""
  1208.   "* return gen_cmp (operands[0], \"lt\", 'f'); ")
  1209.  
  1210. (define_insn ""
  1211.   [(set (pc)
  1212.     (if_then_else (ltu (cc0)
  1213.                (const_int 0))
  1214.               (pc)
  1215.               (label_ref (match_operand 0 "" ""))))]
  1216.   ""
  1217.   "* return gen_cmp (operands[0], \"ltu\", 'f'); ")
  1218.  
  1219. (define_insn ""
  1220.   [(set (pc)
  1221.     (if_then_else (ge (cc0)
  1222.               (const_int 0))
  1223.               (pc)
  1224.               (label_ref (match_operand 0 "" ""))))]
  1225.   ""
  1226.   "* return gen_cmp (operands[0], \"lt\", 't'); ")
  1227.  
  1228. (define_insn ""
  1229.   [(set (pc)
  1230.     (if_then_else (geu (cc0)
  1231.                (const_int 0))
  1232.               (pc)
  1233.               (label_ref (match_operand 0 "" ""))))]
  1234.   ""
  1235.   "* return gen_cmp (operands[0], \"ltu\", 't'); ")
  1236.  
  1237. (define_insn ""
  1238.   [(set (pc)
  1239.     (if_then_else (le (cc0)
  1240.               (const_int 0))
  1241.               (pc)
  1242.               (label_ref (match_operand 0 "" ""))))]
  1243.   ""
  1244.   "* return gen_cmp (operands[0], \"le\", 'f'); ")
  1245.  
  1246. (define_insn ""
  1247.   [(set (pc)
  1248.     (if_then_else (leu (cc0)
  1249.                (const_int 0))
  1250.               (pc)
  1251.               (label_ref (match_operand 0 "" ""))))]
  1252.   ""
  1253.   "* return gen_cmp (operands[0], \"leu\", 'f'); ")
  1254.  
  1255. ;;  - Calls
  1256. ;;
  1257. ;; arg count word may be omitted to save a push and let gcc try to
  1258. ;; combine the arg list pop.  RETURN_POPS_ARGS from tm.h decides this.
  1259.  
  1260. (define_insn "call"
  1261.   [(call (match_operand:QI 0 "memory_operand" "m")
  1262.      (match_operand:SI 1 "general_operand" "g"))]
  1263.   ""
  1264.   "*
  1265. {
  1266.   if (! RETURN_POPS_ARGS (ignoreme)) 
  1267.     {
  1268.       if (operands[1] == const0_rtx)
  1269.     return \"calls %0\";
  1270.       if (! reg_mentioned_p (arg_pointer_rtx, operands[0]))
  1271.     return \"mov sp,ap\;calls %0\;ld.w 12(fp),ap\";
  1272.       operands[0] = XEXP (operands[0], 0);
  1273.       return \"ld.w %0,a1\;mov sp,ap\;calls (a1)\;ld.w 12(fp),ap\";
  1274.     }
  1275.   operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4);
  1276.   if (! reg_mentioned_p (arg_pointer_rtx, operands[0]))
  1277.     return \"mov sp,ap\;pshea %a1\;calls %0\;ld.w 12(fp),ap\;add.w #4*%a1+4,sp\";
  1278.   operands[0] = XEXP (operands[0], 0);
  1279.   return \"ld.w %0,a1\;mov sp,ap\;pshea %a1\;calls (a1)\;ld.w 12(fp),ap\;add.w #4*%a1+4,sp\";
  1280. }")
  1281.  
  1282. (define_insn "call_value"
  1283.   [(set (match_operand 0 "" "=g")
  1284.     (call (match_operand:QI 1 "memory_operand" "m")
  1285.           (match_operand:SI 2 "general_operand" "g")))]
  1286.   ""
  1287.   "*
  1288. {
  1289.   if (! RETURN_POPS_ARGS (ignoreme)) 
  1290.     {
  1291.       if (operands[2] == const0_rtx)
  1292.     return \"calls %1\";
  1293.       if (! reg_mentioned_p (arg_pointer_rtx, operands[1]))
  1294.     return \"mov sp,ap\;calls %1\;ld.w 12(fp),ap\";
  1295.       operands[1] = XEXP (operands[1], 0);
  1296.       return \"ld.w %1,a1\;mov sp,ap\;calls (a1)\;ld.w 12(fp),ap\";
  1297.     }
  1298.   operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3) / 4);
  1299.   if (! reg_mentioned_p (arg_pointer_rtx, operands[1]))
  1300.     return \"mov sp,ap\;pshea %a2\;calls %1\;ld.w 12(fp),ap\;add.w #4*%a2+4,sp\";
  1301.   operands[1] = XEXP (operands[1], 0);
  1302.   return \"ld.w %1,a1\;mov sp,ap\;pshea %a2\;calls (a1)\;ld.w 12(fp),ap\;add.w #4*%a2+4,sp\";
  1303. }")
  1304.  
  1305. (define_insn "return"
  1306.   [(return)]
  1307.   ""
  1308.   "rtn")
  1309.  
  1310. (define_insn "nop"
  1311.   [(const_int 0)]
  1312.   ""
  1313.   "nop")
  1314.  
  1315. (define_insn "tablejump"
  1316.   [(set (pc) (match_operand:SI 0 "address_operand" "p"))
  1317.    (use (label_ref (match_operand 1 "" "")))]
  1318.   ""
  1319.   "jmp %a0")
  1320.  
  1321. ;; fix up the code generated for bit field tests
  1322.  
  1323. ;; cc0 = (x >> k1) & k2  -->  cc0 = x & (k2 << k1)
  1324. ;; cc0 = (x << k1) & k2  -->  cc0 = x & (k2 >> k1)  
  1325.  
  1326. (define_peephole
  1327.   [(set (match_operand:SI 0 "register_operand" "r")
  1328.     (lshift:SI (match_dup 0)
  1329.            (match_operand 1 "immediate_operand" "i")))
  1330.    (set (match_dup 0)
  1331.     (and:SI (match_dup 0)
  1332.         (match_operand 2 "immediate_operand" "i")))
  1333.    (set (cc0) (match_dup 0))]
  1334.   "dead_or_set_p (insn, operands[0])
  1335.    && GET_CODE (operands[1]) == CONST_INT
  1336.    && GET_CODE (operands[2]) == CONST_INT
  1337.    && next_insn_tests_no_inequality (insn)"
  1338.   "*
  1339. {
  1340.   operands[2] = gen_rtx (CONST_INT, VOIDmode, 
  1341.              INTVAL (operands[2]) >> INTVAL (operands[1]));
  1342.   output_asm_insn (\"and %2,%0\", operands);
  1343.   return set_cmp (operands[0], const0_rtx, 'w');
  1344. }")
  1345.  
  1346. (define_peephole
  1347.   [(set (match_operand:SI 0 "register_operand" "r")
  1348.     (lshiftrt:SI (match_dup 0)
  1349.              (match_operand 1 "immediate_operand" "i")))
  1350.    (set (match_dup 0)
  1351.     (and:SI (match_dup 0)
  1352.         (match_operand 2 "immediate_operand" "i")))
  1353.    (set (cc0) (match_dup 0))]
  1354.   "dead_or_set_p (insn, operands[0])
  1355.    && GET_CODE (operands[1]) == CONST_INT
  1356.    && GET_CODE (operands[2]) == CONST_INT
  1357.    && next_insn_tests_no_inequality (insn)"
  1358.   "*
  1359. {
  1360.   operands[2] = gen_rtx (CONST_INT, VOIDmode, 
  1361.              INTVAL (operands[2]) << INTVAL (operands[1]));
  1362.   output_asm_insn (\"and %2,%0\", operands);
  1363.   return set_cmp (operands[0], const0_rtx, 'w');
  1364. }")
  1365.  
  1366. ;; same as above where x is (y & 0xff...) caused by a zero extend
  1367.  
  1368. (define_peephole
  1369.   [(set (match_operand:SI 0 "register_operand" "r")
  1370.     (zero_extend:SI (match_operand 1 "register_operand" "0")))
  1371.    (set (match_dup 0)
  1372.     (lshift:SI (match_dup 0)
  1373.            (match_operand 2 "immediate_operand" "i")))
  1374.    (set (match_dup 0)
  1375.     (and:SI (match_dup 0)
  1376.         (match_operand 3 "immediate_operand" "i")))
  1377.    (set (cc0) (match_dup 0))]
  1378.   "dead_or_set_p (insn, operands[0])
  1379.    && REGNO (operands[0]) == REGNO (operands[1])
  1380.    && GET_CODE (operands[2]) == CONST_INT
  1381.    && GET_CODE (operands[3]) == CONST_INT
  1382.    && next_insn_tests_no_inequality (insn)"
  1383.   "*
  1384. {
  1385.   operands[3] = gen_rtx (CONST_INT, VOIDmode, 
  1386.              (INTVAL (operands[3]) >> INTVAL (operands[2])) &
  1387.              ~((-1) << GET_MODE_BITSIZE (GET_MODE (operands[1]))));
  1388.   output_asm_insn (\"and %3,%0\", operands);
  1389.   return set_cmp (operands[0], const0_rtx, 'w');
  1390. }")
  1391.  
  1392. (define_peephole
  1393.   [(set (match_operand:SI 0 "register_operand" "r")
  1394.     (zero_extend:SI (match_operand 1 "register_operand" "0")))
  1395.    (set (match_dup 0)
  1396.     (lshiftrt:SI (match_dup 0)
  1397.              (match_operand 2 "immediate_operand" "i")))
  1398.    (set (match_dup 0)
  1399.     (and:SI (match_dup 0)
  1400.         (match_operand 3 "immediate_operand" "i")))
  1401.    (set (cc0) (match_dup 0))]
  1402.   "dead_or_set_p (insn, operands[0])
  1403.    && REGNO (operands[0]) == REGNO (operands[1])
  1404.    && GET_CODE (operands[2]) == CONST_INT
  1405.    && GET_CODE (operands[3]) == CONST_INT
  1406.    && next_insn_tests_no_inequality (insn)"
  1407.   "*
  1408. {
  1409.   operands[3] = gen_rtx (CONST_INT, VOIDmode, 
  1410.              (INTVAL (operands[3]) << INTVAL (operands[2])) &
  1411.              ~((-1) << GET_MODE_BITSIZE (GET_MODE (operands[1]))));
  1412.   output_asm_insn (\"and %3,%0\", operands);
  1413.   return set_cmp (operands[0], const0_rtx, 'w');
  1414. }")
  1415.  
  1416. ;; same as above where AND optimized away
  1417.  
  1418. (define_peephole
  1419.   [(set (match_operand:SI 0 "register_operand" "r")
  1420.     (zero_extend:SI (match_operand 1 "register_operand" "0")))
  1421.    (set (match_dup 0)
  1422.     (lshiftrt:SI (match_dup 0)
  1423.              (match_operand 2 "immediate_operand" "i")))
  1424.    (set (cc0) (match_dup 0))]
  1425.   "dead_or_set_p (insn, operands[0])
  1426.    && REGNO (operands[0]) == REGNO (operands[1])
  1427.    && GET_CODE (operands[2]) == CONST_INT
  1428.    && next_insn_tests_no_inequality (insn)"
  1429.   "*
  1430. {
  1431.   operands[2] = gen_rtx (CONST_INT, VOIDmode, 
  1432.              ((-1) << INTVAL (operands[2])) &
  1433.              ~((-1) << GET_MODE_BITSIZE (GET_MODE (operands[1]))));
  1434.   output_asm_insn (\"and %2,%0\", operands);
  1435.   return set_cmp (operands[0], const0_rtx, 'w');
  1436. }")
  1437.  
  1438. ;;- Local variables:
  1439. ;;- mode:emacs-lisp
  1440. ;;- comment-start: ";;- "
  1441. ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
  1442. ;;- eval: (modify-syntax-entry ?[ "(]")
  1443. ;;- eval: (modify-syntax-entry ?] ")[")
  1444. ;;- eval: (modify-syntax-entry ?{ "(}")
  1445. ;;- eval: (modify-syntax-entry ?} "){")
  1446. ;;- End:
  1447.  
  1448.