xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/lm32/lm32.md (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
136ac495dSmrg;; Machine description of the Lattice Mico32 architecture for GNU C compiler.
236ac495dSmrg;; Contributed by Jon Beniston <jon@beniston.com>
336ac495dSmrg
4*8feb0f0bSmrg;; Copyright (C) 2009-2020 Free Software Foundation, Inc.
536ac495dSmrg
636ac495dSmrg;; This file is part of GCC.
736ac495dSmrg
836ac495dSmrg;; GCC is free software; you can redistribute it and/or modify it
936ac495dSmrg;; under the terms of the GNU General Public License as published
1036ac495dSmrg;; by the Free Software Foundation; either version 3, or (at your
1136ac495dSmrg;; option) any later version.
1236ac495dSmrg
1336ac495dSmrg;; GCC is distributed in the hope that it will be useful, but WITHOUT
1436ac495dSmrg;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1536ac495dSmrg;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
1636ac495dSmrg;; License for more details.
1736ac495dSmrg
1836ac495dSmrg;; You should have received a copy of the GNU General Public License
1936ac495dSmrg;; along with GCC; see the file COPYING3.  If not see
2036ac495dSmrg;; <http://www.gnu.org/licenses/>.
2136ac495dSmrg
2236ac495dSmrg;; Include predicate and constraint definitions
2336ac495dSmrg(include "predicates.md")
2436ac495dSmrg(include "constraints.md")
2536ac495dSmrg
2636ac495dSmrg
2736ac495dSmrg;; Register numbers
2836ac495dSmrg(define_constants
2936ac495dSmrg  [(RA_REGNUM           29)	; return address register.
3036ac495dSmrg  ]
3136ac495dSmrg)
3236ac495dSmrg
3336ac495dSmrg;; LM32 specific volatile operations
3436ac495dSmrg(define_constants
3536ac495dSmrg  [(UNSPECV_BLOCKAGE    1)]     ; prevent scheduling across pro/epilog boundaries
3636ac495dSmrg)
3736ac495dSmrg
3836ac495dSmrg;; LM32 specific operations
3936ac495dSmrg(define_constants
4036ac495dSmrg  [(UNSPEC_GOT          2)
4136ac495dSmrg   (UNSPEC_GOTOFF_HI16  3)
4236ac495dSmrg   (UNSPEC_GOTOFF_LO16  4)]
4336ac495dSmrg)
4436ac495dSmrg
4536ac495dSmrg;; ---------------------------------
4636ac495dSmrg;;      instruction types
4736ac495dSmrg;; ---------------------------------
4836ac495dSmrg
4936ac495dSmrg(define_attr "type"
5036ac495dSmrg  "unknown,load,store,arith,compare,shift,multiply,divide,call,icall,ubranch,uibranch,cbranch"
5136ac495dSmrg  (const_string "unknown"))
5236ac495dSmrg
5336ac495dSmrg;; ---------------------------------
5436ac495dSmrg;;      instruction lengths
5536ac495dSmrg;; ---------------------------------
5636ac495dSmrg
5736ac495dSmrg; All instructions are 4 bytes
5836ac495dSmrg; Except for branches that are out of range, and have to be implemented
5936ac495dSmrg; as two instructions
6036ac495dSmrg(define_attr "length" ""
6136ac495dSmrg        (cond [
6236ac495dSmrg                (eq_attr "type" "cbranch")
6336ac495dSmrg                (if_then_else
6436ac495dSmrg                        (lt (abs (minus (match_dup 2) (pc)))
6536ac495dSmrg                                (const_int 32768)
6636ac495dSmrg                        )
6736ac495dSmrg                        (const_int 4)
6836ac495dSmrg                        (const_int 8)
6936ac495dSmrg                )
7036ac495dSmrg              ]
7136ac495dSmrg        (const_int 4))
7236ac495dSmrg)
7336ac495dSmrg
7436ac495dSmrg;; ---------------------------------
7536ac495dSmrg;;           scheduling
7636ac495dSmrg;; ---------------------------------
7736ac495dSmrg
7836ac495dSmrg(define_automaton "lm32")
7936ac495dSmrg
8036ac495dSmrg(define_cpu_unit "x" "lm32")
8136ac495dSmrg(define_cpu_unit "m" "lm32")
8236ac495dSmrg(define_cpu_unit "w" "lm32")
8336ac495dSmrg
8436ac495dSmrg(define_insn_reservation "singlecycle" 1
8536ac495dSmrg  (eq_attr "type" "store,arith,call,icall,ubranch,uibranch,cbranch")
8636ac495dSmrg "x")
8736ac495dSmrg
8836ac495dSmrg(define_insn_reservation "twocycle" 2
8936ac495dSmrg  (eq_attr "type" "compare,shift,divide")
9036ac495dSmrg "x,m")
9136ac495dSmrg
9236ac495dSmrg(define_insn_reservation "threecycle" 3
9336ac495dSmrg  (eq_attr "type" "load,multiply")
9436ac495dSmrg "x,m,w")
9536ac495dSmrg
9636ac495dSmrg;; ---------------------------------
9736ac495dSmrg;;               mov
9836ac495dSmrg;; ---------------------------------
9936ac495dSmrg
10036ac495dSmrg(define_expand "movqi"
10136ac495dSmrg  [(set (match_operand:QI 0 "general_operand" "")
10236ac495dSmrg        (match_operand:QI 1 "general_operand" ""))]
10336ac495dSmrg  ""
10436ac495dSmrg  "
10536ac495dSmrg{
10636ac495dSmrg  if (can_create_pseudo_p ())
10736ac495dSmrg    {
10836ac495dSmrg      if (GET_CODE (operand0) == MEM)
10936ac495dSmrg        {
11036ac495dSmrg          /* Source operand for store must be in a register.  */
11136ac495dSmrg          operands[1] = force_reg (QImode, operands[1]);
11236ac495dSmrg        }
11336ac495dSmrg    }
11436ac495dSmrg}")
11536ac495dSmrg
11636ac495dSmrg(define_expand "movhi"
11736ac495dSmrg  [(set (match_operand:HI 0 "general_operand" "")
11836ac495dSmrg        (match_operand:HI 1 "general_operand" ""))]
11936ac495dSmrg  ""
12036ac495dSmrg  "
12136ac495dSmrg{
12236ac495dSmrg  if (can_create_pseudo_p ())
12336ac495dSmrg    {
12436ac495dSmrg      if (GET_CODE (operands[0]) == MEM)
12536ac495dSmrg        {
12636ac495dSmrg          /* Source operand for store must be in a register.  */
12736ac495dSmrg          operands[1] = force_reg (HImode, operands[1]);
12836ac495dSmrg        }
12936ac495dSmrg    }
13036ac495dSmrg}")
13136ac495dSmrg
13236ac495dSmrg(define_expand "movsi"
13336ac495dSmrg  [(set (match_operand:SI 0 "general_operand" "")
13436ac495dSmrg        (match_operand:SI 1 "general_operand" ""))]
13536ac495dSmrg  ""
13636ac495dSmrg  "
13736ac495dSmrg{
13836ac495dSmrg  if (can_create_pseudo_p ())
13936ac495dSmrg    {
14036ac495dSmrg      if (GET_CODE (operands[0]) == MEM
14136ac495dSmrg	  || (GET_CODE (operands[0]) == SUBREG
14236ac495dSmrg	      && GET_CODE (SUBREG_REG (operands[0])) == MEM))
14336ac495dSmrg        {
14436ac495dSmrg          /* Source operand for store must be in a register.  */
14536ac495dSmrg          operands[1] = force_reg (SImode, operands[1]);
14636ac495dSmrg        }
14736ac495dSmrg    }
14836ac495dSmrg
14936ac495dSmrg  if (flag_pic && symbolic_operand (operands[1], SImode))
15036ac495dSmrg    {
15136ac495dSmrg      if (GET_CODE (operands[1]) == LABEL_REF
15236ac495dSmrg          || (GET_CODE (operands[1]) == SYMBOL_REF
15336ac495dSmrg              && SYMBOL_REF_LOCAL_P (operands[1])
15436ac495dSmrg              && !SYMBOL_REF_WEAK (operands[1])))
15536ac495dSmrg        {
15636ac495dSmrg          emit_insn (gen_movsi_gotoff_hi16 (operands[0], operands[1]));
15736ac495dSmrg          emit_insn (gen_addsi3 (operands[0],
15836ac495dSmrg                                 operands[0],
15936ac495dSmrg                                 pic_offset_table_rtx));
16036ac495dSmrg          emit_insn (gen_movsi_gotoff_lo16 (operands[0],
16136ac495dSmrg                                            operands[0],
16236ac495dSmrg                                            operands[1]));
16336ac495dSmrg        }
16436ac495dSmrg      else
16536ac495dSmrg        emit_insn (gen_movsi_got (operands[0], operands[1]));
16636ac495dSmrg      crtl->uses_pic_offset_table = 1;
16736ac495dSmrg      DONE;
16836ac495dSmrg    }
16936ac495dSmrg  else if (flag_pic && GET_CODE (operands[1]) == CONST)
17036ac495dSmrg    {
17136ac495dSmrg      rtx op = XEXP (operands[1], 0);
17236ac495dSmrg      if (GET_CODE (op) == PLUS)
17336ac495dSmrg        {
17436ac495dSmrg          rtx arg0 = XEXP (op, 0);
17536ac495dSmrg          rtx arg1 = XEXP (op, 1);
17636ac495dSmrg          if (GET_CODE (arg0) == LABEL_REF
17736ac495dSmrg              || (GET_CODE (arg0) == SYMBOL_REF
17836ac495dSmrg                  && SYMBOL_REF_LOCAL_P (arg0)
17936ac495dSmrg                  && !SYMBOL_REF_WEAK (arg0)))
18036ac495dSmrg            {
18136ac495dSmrg              emit_insn (gen_movsi_gotoff_hi16 (operands[0], arg0));
18236ac495dSmrg              emit_insn (gen_addsi3 (operands[0],
18336ac495dSmrg                                     operands[0],
18436ac495dSmrg                                     pic_offset_table_rtx));
18536ac495dSmrg              emit_insn (gen_movsi_gotoff_lo16 (operands[0],
18636ac495dSmrg                                                operands[0],
18736ac495dSmrg                                                arg0));
18836ac495dSmrg            }
18936ac495dSmrg          else
19036ac495dSmrg            emit_insn (gen_movsi_got (operands[0], arg0));
19136ac495dSmrg          emit_insn (gen_addsi3 (operands[0], operands[0], arg1));
19236ac495dSmrg          crtl->uses_pic_offset_table = 1;
19336ac495dSmrg          DONE;
19436ac495dSmrg        }
19536ac495dSmrg    }
19636ac495dSmrg  else if (!flag_pic && reloc_operand (operands[1], GET_MODE (operands[1])))
19736ac495dSmrg    {
19836ac495dSmrg      emit_insn (gen_rtx_SET (operands[0], gen_rtx_HIGH (SImode, operands[1])));
19936ac495dSmrg      emit_insn (gen_rtx_SET (operands[0], gen_rtx_LO_SUM (SImode, operands[0],
20036ac495dSmrg							   operands[1])));
20136ac495dSmrg      DONE;
20236ac495dSmrg    }
20336ac495dSmrg  else if (GET_CODE (operands[1]) == CONST_INT)
20436ac495dSmrg    {
20536ac495dSmrg      if (!(satisfies_constraint_K (operands[1])
20636ac495dSmrg          || satisfies_constraint_L (operands[1])
20736ac495dSmrg          || satisfies_constraint_U (operands[1])))
20836ac495dSmrg        {
20936ac495dSmrg          emit_insn (gen_movsi_insn (operands[0],
21036ac495dSmrg                                     GEN_INT (INTVAL (operands[1]) & ~0xffff)));
21136ac495dSmrg          emit_insn (gen_iorsi3 (operands[0],
21236ac495dSmrg                                 operands[0],
21336ac495dSmrg                                 GEN_INT (INTVAL (operands[1]) & 0xffff)));
21436ac495dSmrg          DONE;
21536ac495dSmrg        }
21636ac495dSmrg    }
21736ac495dSmrg}")
21836ac495dSmrg
219*8feb0f0bSmrg(define_expand "cpymemsi"
22036ac495dSmrg  [(parallel [(set (match_operand:BLK 0 "general_operand" "")
22136ac495dSmrg		   (match_operand:BLK 1 "general_operand" ""))
22236ac495dSmrg	      (use (match_operand:SI 2 "" ""))
22336ac495dSmrg	      (use (match_operand:SI 3 "const_int_operand" ""))])]
22436ac495dSmrg  ""
22536ac495dSmrg{
22636ac495dSmrg  if (!lm32_expand_block_move (operands))
22736ac495dSmrg    FAIL;
22836ac495dSmrg  DONE;
22936ac495dSmrg})
23036ac495dSmrg
23136ac495dSmrg;; ---------------------------------
23236ac495dSmrg;;        load/stores/moves
23336ac495dSmrg;; ---------------------------------
23436ac495dSmrg
23536ac495dSmrg(define_insn "movsi_got"
23636ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
23736ac495dSmrg        (unspec:SI [(match_operand 1 "" "")] UNSPEC_GOT))]
23836ac495dSmrg  "flag_pic"
23936ac495dSmrg  "lw       %0, (gp+got(%1))"
24036ac495dSmrg  [(set_attr "type" "load")]
24136ac495dSmrg)
24236ac495dSmrg
24336ac495dSmrg(define_insn "movsi_gotoff_hi16"
24436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
24536ac495dSmrg        (unspec:SI [(match_operand 1 "" "")] UNSPEC_GOTOFF_HI16))]
24636ac495dSmrg  "flag_pic"
24736ac495dSmrg  "orhi     %0, r0, gotoffhi16(%1)"
24836ac495dSmrg  [(set_attr "type" "load")]
24936ac495dSmrg)
25036ac495dSmrg
25136ac495dSmrg(define_insn "movsi_gotoff_lo16"
25236ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
25336ac495dSmrg        (unspec:SI [(plus:SI (match_operand:SI 1 "register_operand" "0")
25436ac495dSmrg                             (match_operand 2 "" ""))] UNSPEC_GOTOFF_LO16))]
25536ac495dSmrg  "flag_pic"
25636ac495dSmrg  "addi     %0, %1, gotofflo16(%2)"
25736ac495dSmrg  [(set_attr "type" "arith")]
25836ac495dSmrg)
25936ac495dSmrg
26036ac495dSmrg(define_insn "*movsi_lo_sum"
26136ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
26236ac495dSmrg        (lo_sum:SI (match_operand:SI 1 "register_operand" "0")
26336ac495dSmrg                   (match_operand:SI 2 "reloc_operand" "i")))]
26436ac495dSmrg  "!flag_pic"
26536ac495dSmrg  "ori      %0, %0, lo(%2)"
26636ac495dSmrg  [(set_attr "type" "arith")]
26736ac495dSmrg)
26836ac495dSmrg
26936ac495dSmrg(define_insn "*movqi_insn"
27036ac495dSmrg  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,m,r")
27136ac495dSmrg        (match_operand:QI 1 "general_operand" "m,r,r,J,n"))]
27236ac495dSmrg  "lm32_move_ok (QImode, operands)"
27336ac495dSmrg  "@
27436ac495dSmrg   lbu      %0, %1
27536ac495dSmrg   or       %0, %1, r0
27636ac495dSmrg   sb       %0, %1
27736ac495dSmrg   sb       %0, r0
27836ac495dSmrg   addi     %0, r0, %1"
27936ac495dSmrg  [(set_attr "type" "load,arith,store,store,arith")]
28036ac495dSmrg)
28136ac495dSmrg
28236ac495dSmrg(define_insn "*movhi_insn"
28336ac495dSmrg  [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,m,r,r")
28436ac495dSmrg        (match_operand:HI 1 "general_operand" "m,r,r,J,K,L"))]
28536ac495dSmrg  "lm32_move_ok (HImode, operands)"
28636ac495dSmrg  "@
28736ac495dSmrg   lhu      %0, %1
28836ac495dSmrg   or       %0, %1, r0
28936ac495dSmrg   sh       %0, %1
29036ac495dSmrg   sh       %0, r0
29136ac495dSmrg   addi     %0, r0, %1
29236ac495dSmrg   ori      %0, r0, %1"
29336ac495dSmrg  [(set_attr "type" "load,arith,store,store,arith,arith")]
29436ac495dSmrg)
29536ac495dSmrg
29636ac495dSmrg(define_insn "movsi_insn"
29736ac495dSmrg  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,m,m,r,r,r,r,r,r")
29836ac495dSmrg        (match_operand:SI 1 "general_operand" "m,r,r,J,K,L,U,S,Y,n"))]
29936ac495dSmrg  "lm32_move_ok (SImode, operands)"
30036ac495dSmrg  "@
30136ac495dSmrg   lw       %0, %1
30236ac495dSmrg   or       %0, %1, r0
30336ac495dSmrg   sw       %0, %1
30436ac495dSmrg   sw       %0, r0
30536ac495dSmrg   addi     %0, r0, %1
30636ac495dSmrg   ori      %0, r0, %1
30736ac495dSmrg   orhi     %0, r0, hi(%1)
30836ac495dSmrg   mva      %0, gp(%1)
30936ac495dSmrg   orhi     %0, r0, hi(%1)
31036ac495dSmrg   ori      %0, r0, lo(%1); orhi     %0, %0, hi(%1)"
31136ac495dSmrg  [(set_attr "type" "load,arith,store,store,arith,arith,arith,arith,arith,arith")]
31236ac495dSmrg)
31336ac495dSmrg
31436ac495dSmrg;; ---------------------------------
31536ac495dSmrg;;      sign and zero extension
31636ac495dSmrg;; ---------------------------------
31736ac495dSmrg
31836ac495dSmrg(define_insn "*extendqihi2"
31936ac495dSmrg  [(set (match_operand:HI 0 "register_operand" "=r,r")
32036ac495dSmrg        (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
32136ac495dSmrg  "TARGET_SIGN_EXTEND_ENABLED || (GET_CODE (operands[1]) != REG)"
32236ac495dSmrg  "@
32336ac495dSmrg   lb       %0, %1
32436ac495dSmrg   sextb    %0, %1"
32536ac495dSmrg  [(set_attr "type" "load,arith")]
32636ac495dSmrg)
32736ac495dSmrg
32836ac495dSmrg(define_insn "zero_extendqihi2"
32936ac495dSmrg  [(set (match_operand:HI 0 "register_operand" "=r,r")
33036ac495dSmrg        (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
33136ac495dSmrg  ""
33236ac495dSmrg  "@
33336ac495dSmrg   lbu      %0, %1
33436ac495dSmrg   andi     %0, %1, 0xff"
33536ac495dSmrg  [(set_attr "type" "load,arith")]
33636ac495dSmrg)
33736ac495dSmrg
33836ac495dSmrg(define_insn "*extendqisi2"
33936ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
34036ac495dSmrg        (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
34136ac495dSmrg  "TARGET_SIGN_EXTEND_ENABLED || (GET_CODE (operands[1]) != REG)"
34236ac495dSmrg  "@
34336ac495dSmrg   lb       %0, %1
34436ac495dSmrg   sextb    %0, %1"
34536ac495dSmrg  [(set_attr "type" "load,arith")]
34636ac495dSmrg)
34736ac495dSmrg
34836ac495dSmrg(define_insn "zero_extendqisi2"
34936ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
35036ac495dSmrg        (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
35136ac495dSmrg  ""
35236ac495dSmrg  "@
35336ac495dSmrg   lbu      %0, %1
35436ac495dSmrg   andi     %0, %1, 0xff"
35536ac495dSmrg  [(set_attr "type" "load,arith")]
35636ac495dSmrg)
35736ac495dSmrg
35836ac495dSmrg(define_insn "*extendhisi2"
35936ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
36036ac495dSmrg        (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
36136ac495dSmrg  "TARGET_SIGN_EXTEND_ENABLED || (GET_CODE (operands[1]) != REG)"
36236ac495dSmrg  "@
36336ac495dSmrg   lh       %0, %1
36436ac495dSmrg   sexth    %0, %1"
36536ac495dSmrg  [(set_attr "type" "load,arith")]
36636ac495dSmrg)
36736ac495dSmrg
36836ac495dSmrg(define_insn "zero_extendhisi2"
36936ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
37036ac495dSmrg        (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
37136ac495dSmrg  ""
37236ac495dSmrg  "@
37336ac495dSmrg   lhu      %0, %1
37436ac495dSmrg   andi     %0, %1, 0xffff"
37536ac495dSmrg  [(set_attr "type" "load,arith")]
37636ac495dSmrg)
37736ac495dSmrg
37836ac495dSmrg;; ---------------------------------
37936ac495dSmrg;;             compare
38036ac495dSmrg;; ---------------------------------
38136ac495dSmrg
38236ac495dSmrg(define_expand "cstoresi4"
38336ac495dSmrg  [(set (match_operand:SI 0 "register_operand")
38436ac495dSmrg	(match_operator:SI 1 "ordered_comparison_operator"
38536ac495dSmrg	 [(match_operand:SI 2 "register_operand")
38636ac495dSmrg	  (match_operand:SI 3 "register_or_int_operand")]))]
38736ac495dSmrg  ""
38836ac495dSmrg{
38936ac495dSmrg  lm32_expand_scc (operands);
39036ac495dSmrg  DONE;
39136ac495dSmrg})
39236ac495dSmrg
39336ac495dSmrg(define_insn "*seq"
39436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
39536ac495dSmrg        (eq:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
39636ac495dSmrg               (match_operand:SI 2 "register_or_K_operand" "r,K")))]
39736ac495dSmrg  ""
39836ac495dSmrg  "@
39936ac495dSmrg   cmpe     %0, %z1, %2
40036ac495dSmrg   cmpei    %0, %z1, %2"
40136ac495dSmrg  [(set_attr "type" "compare")]
40236ac495dSmrg)
40336ac495dSmrg
40436ac495dSmrg(define_insn "*sne"
40536ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
40636ac495dSmrg        (ne:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
40736ac495dSmrg               (match_operand:SI 2 "register_or_K_operand" "r,K")))]
40836ac495dSmrg  ""
40936ac495dSmrg  "@
41036ac495dSmrg   cmpne    %0, %z1, %2
41136ac495dSmrg   cmpnei   %0, %z1, %2"
41236ac495dSmrg  [(set_attr "type" "compare")]
41336ac495dSmrg)
41436ac495dSmrg
41536ac495dSmrg(define_insn "*sgt"
41636ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
41736ac495dSmrg        (gt:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
41836ac495dSmrg               (match_operand:SI 2 "register_or_K_operand" "r,K")))]
41936ac495dSmrg  ""
42036ac495dSmrg  "@
42136ac495dSmrg   cmpg     %0, %z1, %2
42236ac495dSmrg   cmpgi    %0, %z1, %2"
42336ac495dSmrg  [(set_attr "type" "compare")]
42436ac495dSmrg)
42536ac495dSmrg
42636ac495dSmrg(define_insn "*sge"
42736ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
42836ac495dSmrg        (ge:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
42936ac495dSmrg               (match_operand:SI 2 "register_or_K_operand" "r,K")))]
43036ac495dSmrg  ""
43136ac495dSmrg  "@
43236ac495dSmrg   cmpge    %0, %z1, %2
43336ac495dSmrg   cmpgei   %0, %z1, %2"
43436ac495dSmrg  [(set_attr "type" "compare")]
43536ac495dSmrg)
43636ac495dSmrg
43736ac495dSmrg(define_insn "*sgtu"
43836ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
43936ac495dSmrg        (gtu:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
44036ac495dSmrg                (match_operand:SI 2 "register_or_L_operand" "r,L")))]
44136ac495dSmrg  ""
44236ac495dSmrg  "@
44336ac495dSmrg   cmpgu    %0, %z1, %2
44436ac495dSmrg   cmpgui   %0, %z1, %2"
44536ac495dSmrg  [(set_attr "type" "compare")]
44636ac495dSmrg)
44736ac495dSmrg
44836ac495dSmrg(define_insn "*sgeu"
44936ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
45036ac495dSmrg        (geu:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
45136ac495dSmrg                (match_operand:SI 2 "register_or_L_operand" "r,L")))]
45236ac495dSmrg  ""
45336ac495dSmrg  "@
45436ac495dSmrg   cmpgeu   %0, %z1, %2
45536ac495dSmrg   cmpgeui  %0, %z1, %2"
45636ac495dSmrg  [(set_attr "type" "compare")]
45736ac495dSmrg)
45836ac495dSmrg
45936ac495dSmrg;; ---------------------------------
46036ac495dSmrg;;       unconditional branch
46136ac495dSmrg;; ---------------------------------
46236ac495dSmrg
46336ac495dSmrg(define_insn "jump"
46436ac495dSmrg  [(set (pc) (label_ref (match_operand 0 "" "")))]
46536ac495dSmrg  ""
46636ac495dSmrg  "bi       %0"
46736ac495dSmrg  [(set_attr "type" "ubranch")]
46836ac495dSmrg)
46936ac495dSmrg
47036ac495dSmrg(define_insn "indirect_jump"
47136ac495dSmrg  [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
47236ac495dSmrg  ""
47336ac495dSmrg  "b        %0"
47436ac495dSmrg  [(set_attr "type" "uibranch")]
47536ac495dSmrg)
47636ac495dSmrg
47736ac495dSmrg;; ---------------------------------
47836ac495dSmrg;;        conditional branch
47936ac495dSmrg;; ---------------------------------
48036ac495dSmrg
48136ac495dSmrg(define_expand "cbranchsi4"
48236ac495dSmrg  [(set (pc)
48336ac495dSmrg   (if_then_else (match_operator 0 "comparison_operator"
48436ac495dSmrg                  [(match_operand:SI 1 "register_operand")
48536ac495dSmrg		   (match_operand:SI 2 "nonmemory_operand")])
48636ac495dSmrg                 (label_ref (match_operand 3 "" ""))
48736ac495dSmrg                 (pc)))]
48836ac495dSmrg  ""
48936ac495dSmrg  "
49036ac495dSmrg{
49136ac495dSmrg  lm32_expand_conditional_branch (operands);
49236ac495dSmrg  DONE;
49336ac495dSmrg}")
49436ac495dSmrg
49536ac495dSmrg(define_insn "*beq"
49636ac495dSmrg  [(set (pc)
49736ac495dSmrg        (if_then_else (eq:SI (match_operand:SI 0 "register_or_zero_operand" "rJ")
49836ac495dSmrg                             (match_operand:SI 1 "register_or_zero_operand" "rJ"))
49936ac495dSmrg                      (label_ref (match_operand 2 "" ""))
50036ac495dSmrg                      (pc)))]
50136ac495dSmrg  ""
50236ac495dSmrg{
50336ac495dSmrg  return get_attr_length (insn) == 4
50436ac495dSmrg        ? "be     %z0,%z1,%2"
50536ac495dSmrg        : "bne    %z0,%z1,8\n\tbi     %2";
50636ac495dSmrg}
50736ac495dSmrg  [(set_attr "type" "cbranch")])
50836ac495dSmrg
50936ac495dSmrg(define_insn "*bne"
51036ac495dSmrg  [(set (pc)
51136ac495dSmrg        (if_then_else (ne:SI (match_operand:SI 0 "register_or_zero_operand" "rJ")
51236ac495dSmrg                             (match_operand:SI 1 "register_or_zero_operand" "rJ"))
51336ac495dSmrg                      (label_ref (match_operand 2 "" ""))
51436ac495dSmrg                      (pc)))]
51536ac495dSmrg  ""
51636ac495dSmrg{
51736ac495dSmrg  return get_attr_length (insn) == 4
51836ac495dSmrg        ? "bne    %z0,%z1,%2"
51936ac495dSmrg        : "be     %z0,%z1,8\n\tbi     %2";
52036ac495dSmrg}
52136ac495dSmrg  [(set_attr "type" "cbranch")])
52236ac495dSmrg
52336ac495dSmrg(define_insn "*bgt"
52436ac495dSmrg  [(set (pc)
52536ac495dSmrg        (if_then_else (gt:SI (match_operand:SI 0 "register_or_zero_operand" "rJ")
52636ac495dSmrg                             (match_operand:SI 1 "register_or_zero_operand" "rJ"))
52736ac495dSmrg                      (label_ref (match_operand 2 "" ""))
52836ac495dSmrg                      (pc)))]
52936ac495dSmrg  ""
53036ac495dSmrg{
53136ac495dSmrg  return get_attr_length (insn) == 4
53236ac495dSmrg        ? "bg     %z0,%z1,%2"
53336ac495dSmrg        : "bge    %z1,%z0,8\n\tbi     %2";
53436ac495dSmrg}
53536ac495dSmrg  [(set_attr "type" "cbranch")])
53636ac495dSmrg
53736ac495dSmrg(define_insn "*bge"
53836ac495dSmrg  [(set (pc)
53936ac495dSmrg        (if_then_else (ge:SI (match_operand:SI 0 "register_or_zero_operand" "rJ")
54036ac495dSmrg                             (match_operand:SI 1 "register_or_zero_operand" "rJ"))
54136ac495dSmrg                      (label_ref (match_operand 2 "" ""))
54236ac495dSmrg                      (pc)))]
54336ac495dSmrg  ""
54436ac495dSmrg{
54536ac495dSmrg  return get_attr_length (insn) == 4
54636ac495dSmrg        ? "bge    %z0,%z1,%2"
54736ac495dSmrg        : "bg     %z1,%z0,8\n\tbi     %2";
54836ac495dSmrg}
54936ac495dSmrg  [(set_attr "type" "cbranch")])
55036ac495dSmrg
55136ac495dSmrg(define_insn "*bgtu"
55236ac495dSmrg  [(set (pc)
55336ac495dSmrg        (if_then_else (gtu:SI (match_operand:SI 0 "register_or_zero_operand" "rJ")
55436ac495dSmrg                              (match_operand:SI 1 "register_or_zero_operand" "rJ"))
55536ac495dSmrg                      (label_ref (match_operand 2 "" ""))
55636ac495dSmrg                      (pc)))]
55736ac495dSmrg  ""
55836ac495dSmrg{
55936ac495dSmrg  return get_attr_length (insn) == 4
56036ac495dSmrg        ? "bgu    %z0,%z1,%2"
56136ac495dSmrg        : "bgeu   %z1,%z0,8\n\tbi     %2";
56236ac495dSmrg}
56336ac495dSmrg  [(set_attr "type" "cbranch")])
56436ac495dSmrg
56536ac495dSmrg(define_insn "*bgeu"
56636ac495dSmrg  [(set (pc)
56736ac495dSmrg        (if_then_else (geu:SI (match_operand:SI 0 "register_or_zero_operand" "rJ")
56836ac495dSmrg                              (match_operand:SI 1 "register_or_zero_operand" "rJ"))
56936ac495dSmrg                      (label_ref (match_operand 2 "" ""))
57036ac495dSmrg                      (pc)))]
57136ac495dSmrg  ""
57236ac495dSmrg{
57336ac495dSmrg  return get_attr_length (insn) == 4
57436ac495dSmrg        ? "bgeu   %z0,%z1,%2"
57536ac495dSmrg        : "bgu    %z1,%z0,8\n\tbi     %2";
57636ac495dSmrg}
57736ac495dSmrg  [(set_attr "type" "cbranch")])
57836ac495dSmrg
57936ac495dSmrg;; ---------------------------------
58036ac495dSmrg;;               call
58136ac495dSmrg;; ---------------------------------
58236ac495dSmrg
58336ac495dSmrg(define_expand "call"
58436ac495dSmrg  [(parallel [(call (match_operand 0 "" "")
58536ac495dSmrg                    (match_operand 1 "" ""))
58636ac495dSmrg              (clobber (reg:SI RA_REGNUM))
58736ac495dSmrg             ])]
58836ac495dSmrg  ""
58936ac495dSmrg  "
59036ac495dSmrg{
59136ac495dSmrg  rtx addr = XEXP (operands[0], 0);
59236ac495dSmrg  if (!CONSTANT_ADDRESS_P (addr))
59336ac495dSmrg    XEXP (operands[0], 0) = force_reg (Pmode, addr);
59436ac495dSmrg}")
59536ac495dSmrg
59636ac495dSmrg(define_insn "*call"
59736ac495dSmrg  [(call (mem:SI (match_operand:SI 0 "call_operand" "r,s"))
59836ac495dSmrg         (match_operand 1 "" ""))
59936ac495dSmrg   (clobber (reg:SI RA_REGNUM))]
60036ac495dSmrg  ""
60136ac495dSmrg  "@
60236ac495dSmrg   call     %0
60336ac495dSmrg   calli    %0"
60436ac495dSmrg  [(set_attr "type" "call,icall")]
60536ac495dSmrg)
60636ac495dSmrg
60736ac495dSmrg(define_expand "call_value"
60836ac495dSmrg  [(parallel [(set (match_operand 0 "" "")
60936ac495dSmrg                   (call (match_operand 1 "" "")
61036ac495dSmrg                         (match_operand 2 "" "")))
61136ac495dSmrg              (clobber (reg:SI RA_REGNUM))
61236ac495dSmrg             ])]
61336ac495dSmrg  ""
61436ac495dSmrg  "
61536ac495dSmrg{
61636ac495dSmrg  rtx addr = XEXP (operands[1], 0);
61736ac495dSmrg  if (!CONSTANT_ADDRESS_P (addr))
61836ac495dSmrg    XEXP (operands[1], 0) = force_reg (Pmode, addr);
61936ac495dSmrg}")
62036ac495dSmrg
62136ac495dSmrg(define_insn "*call_value"
62236ac495dSmrg  [(set (match_operand 0 "register_operand" "=r,r")
62336ac495dSmrg        (call (mem:SI (match_operand:SI 1 "call_operand" "r,s"))
62436ac495dSmrg              (match_operand 2 "" "")))
62536ac495dSmrg   (clobber (reg:SI RA_REGNUM))]
62636ac495dSmrg  ""
62736ac495dSmrg  "@
62836ac495dSmrg   call     %1
62936ac495dSmrg   calli    %1"
63036ac495dSmrg  [(set_attr "type" "call,icall")]
63136ac495dSmrg)
63236ac495dSmrg
63336ac495dSmrg(define_insn "return_internal"
63436ac495dSmrg  [(use (match_operand:SI 0 "register_operand" "r"))
63536ac495dSmrg   (return)]
63636ac495dSmrg  ""
63736ac495dSmrg  "b        %0"
63836ac495dSmrg  [(set_attr "type" "uibranch")]
63936ac495dSmrg)
64036ac495dSmrg
64136ac495dSmrg(define_expand "return"
64236ac495dSmrg  [(return)]
64336ac495dSmrg  "lm32_can_use_return ()"
64436ac495dSmrg  ""
64536ac495dSmrg)
64636ac495dSmrg
64736ac495dSmrg(define_expand "simple_return"
64836ac495dSmrg  [(simple_return)]
64936ac495dSmrg  ""
65036ac495dSmrg  ""
65136ac495dSmrg)
65236ac495dSmrg
65336ac495dSmrg(define_insn "*return"
65436ac495dSmrg  [(return)]
65536ac495dSmrg  "reload_completed"
65636ac495dSmrg  "ret"
65736ac495dSmrg  [(set_attr "type" "uibranch")]
65836ac495dSmrg)
65936ac495dSmrg
66036ac495dSmrg(define_insn "*simple_return"
66136ac495dSmrg  [(simple_return)]
66236ac495dSmrg  ""
66336ac495dSmrg  "ret"
66436ac495dSmrg  [(set_attr "type" "uibranch")]
66536ac495dSmrg)
66636ac495dSmrg
66736ac495dSmrg;; ---------------------------------
66836ac495dSmrg;;       switch/case statements
66936ac495dSmrg;; ---------------------------------
67036ac495dSmrg
67136ac495dSmrg(define_expand "tablejump"
67236ac495dSmrg  [(set (pc) (match_operand 0 "register_operand" ""))
67336ac495dSmrg   (use (label_ref (match_operand 1 "" "")))]
67436ac495dSmrg  ""
67536ac495dSmrg  "
67636ac495dSmrg{
67736ac495dSmrg  rtx target = operands[0];
67836ac495dSmrg  if (flag_pic)
67936ac495dSmrg    {
68036ac495dSmrg      /* For PIC, the table entry is relative to the start of the table.  */
68136ac495dSmrg      rtx label = gen_reg_rtx (SImode);
68236ac495dSmrg      target = gen_reg_rtx (SImode);
68336ac495dSmrg      emit_move_insn (label, gen_rtx_LABEL_REF (SImode, operands[1]));
68436ac495dSmrg      emit_insn (gen_addsi3 (target, operands[0], label));
68536ac495dSmrg    }
68636ac495dSmrg  emit_jump_insn (gen_tablejumpsi (target, operands[1]));
68736ac495dSmrg  DONE;
68836ac495dSmrg}")
68936ac495dSmrg
69036ac495dSmrg(define_insn "tablejumpsi"
69136ac495dSmrg  [(set (pc) (match_operand:SI 0 "register_operand" "r"))
69236ac495dSmrg   (use (label_ref (match_operand 1 "" "")))]
69336ac495dSmrg  ""
69436ac495dSmrg  "b        %0"
69536ac495dSmrg  [(set_attr "type" "ubranch")]
69636ac495dSmrg)
69736ac495dSmrg
69836ac495dSmrg;; ---------------------------------
69936ac495dSmrg;;            arithmetic
70036ac495dSmrg;; ---------------------------------
70136ac495dSmrg
70236ac495dSmrg(define_insn "addsi3"
70336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
70436ac495dSmrg        (plus:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
70536ac495dSmrg                 (match_operand:SI 2 "register_or_K_operand" "r,K")))]
70636ac495dSmrg  ""
70736ac495dSmrg  "@
70836ac495dSmrg   add      %0, %z1, %2
70936ac495dSmrg   addi     %0, %z1, %2"
71036ac495dSmrg  [(set_attr "type" "arith")]
71136ac495dSmrg)
71236ac495dSmrg
71336ac495dSmrg(define_insn "subsi3"
71436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
71536ac495dSmrg        (minus:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")
71636ac495dSmrg                  (match_operand:SI 2 "register_or_zero_operand" "rJ")))]
71736ac495dSmrg  ""
71836ac495dSmrg  "sub      %0, %z1, %z2"
71936ac495dSmrg  [(set_attr "type" "arith")]
72036ac495dSmrg)
72136ac495dSmrg
72236ac495dSmrg(define_insn "mulsi3"
72336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
72436ac495dSmrg        (mult:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
72536ac495dSmrg                 (match_operand:SI 2 "register_or_K_operand" "r,K")))]
72636ac495dSmrg  "TARGET_MULTIPLY_ENABLED"
72736ac495dSmrg  "@
72836ac495dSmrg   mul      %0, %z1, %2
72936ac495dSmrg   muli     %0, %z1, %2"
73036ac495dSmrg  [(set_attr "type" "multiply")]
73136ac495dSmrg)
73236ac495dSmrg
73336ac495dSmrg(define_insn "udivsi3"
73436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
73536ac495dSmrg        (udiv:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")
73636ac495dSmrg                 (match_operand:SI 2 "register_operand" "r")))]
73736ac495dSmrg  "TARGET_DIVIDE_ENABLED"
73836ac495dSmrg  "divu     %0, %z1, %2"
73936ac495dSmrg  [(set_attr "type" "divide")]
74036ac495dSmrg)
74136ac495dSmrg
74236ac495dSmrg(define_insn "umodsi3"
74336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
74436ac495dSmrg        (umod:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")
74536ac495dSmrg                 (match_operand:SI 2 "register_operand" "r")))]
74636ac495dSmrg  "TARGET_DIVIDE_ENABLED"
74736ac495dSmrg  "modu     %0, %z1, %2"
74836ac495dSmrg  [(set_attr "type" "divide")]
74936ac495dSmrg)
75036ac495dSmrg
75136ac495dSmrg;; ---------------------------------
75236ac495dSmrg;;      negation and inversion
75336ac495dSmrg;; ---------------------------------
75436ac495dSmrg
75536ac495dSmrg(define_insn "negsi2"
75636ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
75736ac495dSmrg        (neg:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")))]
75836ac495dSmrg  ""
75936ac495dSmrg  "sub      %0, r0, %z1"
76036ac495dSmrg  [(set_attr "type" "arith")]
76136ac495dSmrg)
76236ac495dSmrg
76336ac495dSmrg(define_insn "one_cmplsi2"
76436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
76536ac495dSmrg        (not:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")))]
76636ac495dSmrg  ""
76736ac495dSmrg  "not      %0, %z1"
76836ac495dSmrg  [(set_attr "type" "arith")]
76936ac495dSmrg)
77036ac495dSmrg
77136ac495dSmrg;; ---------------------------------
77236ac495dSmrg;;             logical
77336ac495dSmrg;; ---------------------------------
77436ac495dSmrg
77536ac495dSmrg(define_insn "andsi3"
77636ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
77736ac495dSmrg        (and:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
77836ac495dSmrg                (match_operand:SI 2 "register_or_L_operand" "r,L")))]
77936ac495dSmrg  ""
78036ac495dSmrg  "@
78136ac495dSmrg   and      %0, %z1, %2
78236ac495dSmrg   andi     %0, %z1, %2"
78336ac495dSmrg  [(set_attr "type" "arith")]
78436ac495dSmrg)
78536ac495dSmrg
78636ac495dSmrg(define_insn "iorsi3"
78736ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
78836ac495dSmrg        (ior:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
78936ac495dSmrg                (match_operand:SI 2 "register_or_L_operand" "r,L")))]
79036ac495dSmrg  ""
79136ac495dSmrg  "@
79236ac495dSmrg   or       %0, %z1, %2
79336ac495dSmrg   ori      %0, %z1, %2"
79436ac495dSmrg  [(set_attr "type" "arith")]
79536ac495dSmrg)
79636ac495dSmrg
79736ac495dSmrg(define_insn "xorsi3"
79836ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
79936ac495dSmrg        (xor:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
80036ac495dSmrg                (match_operand:SI 2 "register_or_L_operand" "r,L")))]
80136ac495dSmrg  ""
80236ac495dSmrg  "@
80336ac495dSmrg   xor      %0, %z1, %2
80436ac495dSmrg   xori     %0, %z1, %2"
80536ac495dSmrg  [(set_attr "type" "arith")]
80636ac495dSmrg)
80736ac495dSmrg
80836ac495dSmrg(define_insn "*norsi3"
80936ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
81036ac495dSmrg	(not:SI (ior:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
81136ac495dSmrg			(match_operand:SI 2 "register_or_L_operand" "r,L"))))]
81236ac495dSmrg  ""
81336ac495dSmrg  "@
81436ac495dSmrg   nor      %0, %z1, %2
81536ac495dSmrg   nori     %0, %z1, %2"
81636ac495dSmrg  [(set_attr "type" "arith")]
81736ac495dSmrg)
81836ac495dSmrg
81936ac495dSmrg(define_insn "*xnorsi3"
82036ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
82136ac495dSmrg	(not:SI (xor:SI (match_operand:SI 1 "register_or_zero_operand" "%rJ,rJ")
82236ac495dSmrg			(match_operand:SI 2 "register_or_L_operand" "r,L"))))]
82336ac495dSmrg  ""
82436ac495dSmrg  "@
82536ac495dSmrg   xnor     %0, %z1, %2
82636ac495dSmrg   xnori    %0, %z1, %2"
82736ac495dSmrg  [(set_attr "type" "arith")]
82836ac495dSmrg)
82936ac495dSmrg
83036ac495dSmrg;; ---------------------------------
83136ac495dSmrg;;              shifts
83236ac495dSmrg;; ---------------------------------
83336ac495dSmrg
83436ac495dSmrg(define_expand "ashlsi3"
83536ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "")
83636ac495dSmrg        (ashift:SI (match_operand:SI 1 "register_or_zero_operand" "")
83736ac495dSmrg                   (match_operand:SI 2 "register_or_L_operand" "")))]
83836ac495dSmrg  ""
83936ac495dSmrg{
84036ac495dSmrg  if (!TARGET_BARREL_SHIFT_ENABLED)
84136ac495dSmrg    {
84236ac495dSmrg      if (!optimize_size
84336ac495dSmrg          && satisfies_constraint_L (operands[2])
84436ac495dSmrg          && INTVAL (operands[2]) <= 8)
84536ac495dSmrg        {
84636ac495dSmrg          int i;
84736ac495dSmrg          int shifts = INTVAL (operands[2]);
84836ac495dSmrg
84936ac495dSmrg          if (shifts == 0)
85036ac495dSmrg            emit_move_insn (operands[0], operands[1]);
85136ac495dSmrg          else
85236ac495dSmrg            emit_insn (gen_addsi3 (operands[0], operands[1], operands[1]));
85336ac495dSmrg          for (i = 1; i < shifts; i++)
85436ac495dSmrg            emit_insn (gen_addsi3 (operands[0], operands[0], operands[0]));
85536ac495dSmrg          DONE;
85636ac495dSmrg        }
85736ac495dSmrg      else
85836ac495dSmrg        FAIL;
85936ac495dSmrg    }
86036ac495dSmrg})
86136ac495dSmrg
86236ac495dSmrg(define_insn "*ashlsi3"
86336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
86436ac495dSmrg        (ashift:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
86536ac495dSmrg                   (match_operand:SI 2 "register_or_L_operand" "r,L")))]
86636ac495dSmrg  "TARGET_BARREL_SHIFT_ENABLED"
86736ac495dSmrg  "@
86836ac495dSmrg   sl       %0, %z1, %2
86936ac495dSmrg   sli      %0, %z1, %2"
87036ac495dSmrg  [(set_attr "type" "shift")]
87136ac495dSmrg)
87236ac495dSmrg
87336ac495dSmrg(define_expand "ashrsi3"
87436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "")
87536ac495dSmrg        (ashiftrt:SI (match_operand:SI 1 "register_or_zero_operand" "")
87636ac495dSmrg                     (match_operand:SI 2 "register_or_L_operand" "")))]
87736ac495dSmrg  ""
87836ac495dSmrg{
87936ac495dSmrg  if (!TARGET_BARREL_SHIFT_ENABLED)
88036ac495dSmrg    {
88136ac495dSmrg      if (!optimize_size
88236ac495dSmrg          && satisfies_constraint_L (operands[2])
88336ac495dSmrg          && INTVAL (operands[2]) <= 8)
88436ac495dSmrg        {
88536ac495dSmrg          int i;
88636ac495dSmrg          int shifts = INTVAL (operands[2]);
88736ac495dSmrg          rtx one = GEN_INT (1);
88836ac495dSmrg
88936ac495dSmrg          if (shifts == 0)
89036ac495dSmrg            emit_move_insn (operands[0], operands[1]);
89136ac495dSmrg          else
89236ac495dSmrg            emit_insn (gen_ashrsi3_1bit (operands[0], operands[1], one));
89336ac495dSmrg          for (i = 1; i < shifts; i++)
89436ac495dSmrg            emit_insn (gen_ashrsi3_1bit (operands[0], operands[0], one));
89536ac495dSmrg          DONE;
89636ac495dSmrg        }
89736ac495dSmrg      else
89836ac495dSmrg        FAIL;
89936ac495dSmrg    }
90036ac495dSmrg})
90136ac495dSmrg
90236ac495dSmrg(define_insn "*ashrsi3"
90336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
90436ac495dSmrg        (ashiftrt:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
90536ac495dSmrg                     (match_operand:SI 2 "register_or_L_operand" "r,L")))]
90636ac495dSmrg  "TARGET_BARREL_SHIFT_ENABLED"
90736ac495dSmrg  "@
90836ac495dSmrg   sr       %0, %z1, %2
90936ac495dSmrg   sri      %0, %z1, %2"
91036ac495dSmrg  [(set_attr "type" "shift")]
91136ac495dSmrg)
91236ac495dSmrg
91336ac495dSmrg(define_insn "ashrsi3_1bit"
91436ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
91536ac495dSmrg        (ashiftrt:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")
91636ac495dSmrg                     (match_operand:SI 2 "constant_M_operand" "M")))]
91736ac495dSmrg  "!TARGET_BARREL_SHIFT_ENABLED"
91836ac495dSmrg  "sri      %0, %z1, %2"
91936ac495dSmrg  [(set_attr "type" "shift")]
92036ac495dSmrg)
92136ac495dSmrg
92236ac495dSmrg(define_expand "lshrsi3"
92336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "")
92436ac495dSmrg        (lshiftrt:SI (match_operand:SI 1 "register_or_zero_operand" "")
92536ac495dSmrg                     (match_operand:SI 2 "register_or_L_operand" "")))]
92636ac495dSmrg  ""
92736ac495dSmrg{
92836ac495dSmrg  if (!TARGET_BARREL_SHIFT_ENABLED)
92936ac495dSmrg    {
93036ac495dSmrg      if (!optimize_size
93136ac495dSmrg          && satisfies_constraint_L (operands[2])
93236ac495dSmrg          && INTVAL (operands[2]) <= 8)
93336ac495dSmrg        {
93436ac495dSmrg          int i;
93536ac495dSmrg          int shifts = INTVAL (operands[2]);
93636ac495dSmrg          rtx one = GEN_INT (1);
93736ac495dSmrg
93836ac495dSmrg          if (shifts == 0)
93936ac495dSmrg            emit_move_insn (operands[0], operands[1]);
94036ac495dSmrg          else
94136ac495dSmrg            emit_insn (gen_lshrsi3_1bit (operands[0], operands[1], one));
94236ac495dSmrg          for (i = 1; i < shifts; i++)
94336ac495dSmrg            emit_insn (gen_lshrsi3_1bit (operands[0], operands[0], one));
94436ac495dSmrg          DONE;
94536ac495dSmrg        }
94636ac495dSmrg      else
94736ac495dSmrg        FAIL;
94836ac495dSmrg    }
94936ac495dSmrg})
95036ac495dSmrg
95136ac495dSmrg(define_insn "*lshrsi3"
95236ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r,r")
95336ac495dSmrg        (lshiftrt:SI (match_operand:SI 1 "register_or_zero_operand" "rJ,rJ")
95436ac495dSmrg                     (match_operand:SI 2 "register_or_L_operand" "r,L")))]
95536ac495dSmrg  "TARGET_BARREL_SHIFT_ENABLED"
95636ac495dSmrg  "@
95736ac495dSmrg   sru      %0, %z1, %2
95836ac495dSmrg   srui     %0, %z1, %2"
95936ac495dSmrg  [(set_attr "type" "shift")]
96036ac495dSmrg)
96136ac495dSmrg
96236ac495dSmrg(define_insn "lshrsi3_1bit"
96336ac495dSmrg  [(set (match_operand:SI 0 "register_operand" "=r")
96436ac495dSmrg        (lshiftrt:SI (match_operand:SI 1 "register_or_zero_operand" "rJ")
96536ac495dSmrg                     (match_operand:SI 2 "constant_M_operand" "M")))]
96636ac495dSmrg  "!TARGET_BARREL_SHIFT_ENABLED"
96736ac495dSmrg  "srui     %0, %z1, %2"
96836ac495dSmrg  [(set_attr "type" "shift")]
96936ac495dSmrg)
97036ac495dSmrg
97136ac495dSmrg;; ---------------------------------
97236ac495dSmrg;;     function entry / exit
97336ac495dSmrg;; ---------------------------------
97436ac495dSmrg
97536ac495dSmrg(define_expand "prologue"
97636ac495dSmrg  [(const_int 1)]
97736ac495dSmrg  ""
97836ac495dSmrg  "
97936ac495dSmrg{
98036ac495dSmrg  lm32_expand_prologue ();
98136ac495dSmrg  DONE;
98236ac495dSmrg}")
98336ac495dSmrg
98436ac495dSmrg(define_expand "epilogue"
98536ac495dSmrg  [(return)]
98636ac495dSmrg  ""
98736ac495dSmrg  "
98836ac495dSmrg{
98936ac495dSmrg  lm32_expand_epilogue ();
99036ac495dSmrg  DONE;
99136ac495dSmrg}")
99236ac495dSmrg
99336ac495dSmrg;; ---------------------------------
99436ac495dSmrg;;              nop
99536ac495dSmrg;; ---------------------------------
99636ac495dSmrg
99736ac495dSmrg(define_insn "nop"
99836ac495dSmrg  [(const_int 0)]
99936ac495dSmrg  ""
100036ac495dSmrg  "nop"
100136ac495dSmrg  [(set_attr "type" "arith")]
100236ac495dSmrg)
100336ac495dSmrg
100436ac495dSmrg;; ---------------------------------
100536ac495dSmrg;;             blockage
100636ac495dSmrg;; ---------------------------------
100736ac495dSmrg
100836ac495dSmrg;; used to stop the scheduler from
100936ac495dSmrg;; scheduling code across certain boundaries
101036ac495dSmrg
101136ac495dSmrg(define_insn "blockage"
101236ac495dSmrg  [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
101336ac495dSmrg  ""
101436ac495dSmrg  ""
101536ac495dSmrg  [(set_attr "length" "0")]
101636ac495dSmrg)
1017