1;; Copyright (C) 2013-2018 Free Software Foundation, Inc. 2;; 3;; micromips.md Machine Description for the microMIPS instruction set 4;; This file is part of GCC. 5 6;; GCC is free software; you can redistribute it and/or modify it 7;; under the terms of the GNU General Public License as published 8;; by the Free Software Foundation; either version 3, or (at your 9;; option) any later version. 10 11;; GCC is distributed in the hope that it will be useful, but WITHOUT 12;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 14;; License for more details. 15 16;; You should have received a copy of the GNU General Public License 17;; along with GCC; see the file COPYING3. If not see 18;; <http://www.gnu.org/licenses/>. 19 20(define_insn "*store_word_multiple" 21 [(match_parallel 0 "" 22 [(set (match_operand:SI 1 "memory_operand") 23 (match_operand:SI 2 "register_operand"))])] 24 "TARGET_MICROMIPS 25 && umips_save_restore_pattern_p (true, operands[0])" 26 { return umips_output_save_restore (true, operands[0]); } 27 [(set_attr "type" "multimem") 28 (set_attr "mode" "SI") 29 (set_attr "can_delay" "no")]) 30 31(define_insn "*load_word_multiple" 32 [(match_parallel 0 "" 33 [(set (match_operand:SI 1 "register_operand") 34 (match_operand:SI 2 "memory_operand"))])] 35 "TARGET_MICROMIPS 36 && umips_save_restore_pattern_p (false, operands[0])" 37 { return umips_output_save_restore (false, operands[0]); } 38 [(set_attr "type" "multimem") 39 (set_attr "mode" "SI") 40 (set_attr "can_delay" "no")]) 41 42;; For LWP. 43(define_peephole2 44 [(set (match_operand:SI 0 "d_operand" "") 45 (match_operand:SI 1 "non_volatile_mem_operand" "")) 46 (set (match_operand:SI 2 "d_operand" "") 47 (match_operand:SI 3 "non_volatile_mem_operand" ""))] 48 "TARGET_MICROMIPS 49 && umips_load_store_pair_p (true, operands)" 50 [(parallel [(set (match_dup 0) (match_dup 1)) 51 (set (match_dup 2) (match_dup 3))])]) 52 53;; The behavior of the LWP insn is undefined if placed in a delay slot. 54(define_insn "*lwp" 55 [(parallel [(set (match_operand:SI 0 "d_operand") 56 (match_operand:SI 1 "non_volatile_mem_operand")) 57 (set (match_operand:SI 2 "d_operand") 58 (match_operand:SI 3 "non_volatile_mem_operand"))])] 59 60 "TARGET_MICROMIPS 61 && umips_load_store_pair_p (true, operands)" 62{ 63 umips_output_load_store_pair (true, operands); 64 return ""; 65} 66 [(set_attr "type" "load") 67 (set_attr "mode" "SI") 68 (set_attr "can_delay" "no")]) 69 70;; For SWP. 71(define_peephole2 72 [(set (match_operand:SI 0 "non_volatile_mem_operand" "") 73 (match_operand:SI 1 "d_operand" "")) 74 (set (match_operand:SI 2 "non_volatile_mem_operand" "") 75 (match_operand:SI 3 "d_operand" ""))] 76 "TARGET_MICROMIPS 77 && umips_load_store_pair_p (false, operands)" 78 [(parallel [(set (match_dup 0) (match_dup 1)) 79 (set (match_dup 2) (match_dup 3))])]) 80 81;; The behavior of the SWP insn is undefined if placed in a delay slot. 82(define_insn "*swp" 83 [(set (match_operand:SI 0 "non_volatile_mem_operand") 84 (match_operand:SI 1 "d_operand")) 85 (set (match_operand:SI 2 "non_volatile_mem_operand") 86 (match_operand:SI 3 "d_operand"))] 87 "TARGET_MICROMIPS 88 && umips_load_store_pair_p (false, operands)" 89{ 90 umips_output_load_store_pair (false, operands); 91 return ""; 92} 93 [(set_attr "type" "store") 94 (set_attr "mode" "SI") 95 (set_attr "can_delay" "no")]) 96 97;; For JRADDIUSP. 98(define_insn "jraddiusp" 99 [(return) 100 (use (reg:SI 31)) 101 (set (reg:SI 29) 102 (plus:SI (reg:SI 29) 103 (match_operand 0 "uw5_operand")))] 104 "TARGET_MICROMIPS" 105 "jraddiusp\t%0" 106 [(set_attr "type" "trap") 107 (set_attr "can_delay" "no") 108 (set_attr "mode" "SI")]) 109 110;; For MOVEP. 111(define_peephole2 112 [(set (match_operand:MOVEP1 0 "register_operand" "") 113 (match_operand:MOVEP1 1 "movep_src_operand" "")) 114 (set (match_operand:MOVEP2 2 "register_operand" "") 115 (match_operand:MOVEP2 3 "movep_src_operand" ""))] 116 "TARGET_MICROMIPS 117 && umips_movep_target_p (operands[0], operands[2])" 118 [(parallel [(set (match_dup 0) (match_dup 1)) 119 (set (match_dup 2) (match_dup 3))])]) 120 121;; The behavior of the MOVEP insn is undefined if placed in a delay slot. 122(define_insn "*movep<MOVEP1:mode><MOVEP2:mode>" 123 [(set (match_operand:MOVEP1 0 "register_operand") 124 (match_operand:MOVEP1 1 "movep_src_operand")) 125 (set (match_operand:MOVEP2 2 "register_operand") 126 (match_operand:MOVEP2 3 "movep_src_operand"))] 127 "TARGET_MICROMIPS 128 && umips_movep_target_p (operands[0], operands[2])" 129{ 130 if (REGNO (operands[0]) < REGNO (operands[2])) 131 return "movep\t%0,%2,%z1,%z3"; 132 else 133 return "movep\t%2,%0,%z3,%z1"; 134} 135 [(set_attr "type" "move") 136 (set_attr "mode" "<MODE>") 137 (set_attr "can_delay" "no")]) 138