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