1;; Machine Descriptions for R8C/M16C/M32C 2;; Copyright (C) 2005, 2007, 2008 3;; Free Software Foundation, Inc. 4;; Contributed by Red Hat. 5;; 6;; This file is part of GCC. 7;; 8;; GCC is free software; you can redistribute it and/or modify it 9;; under the terms of the GNU General Public License as published 10;; by the Free Software Foundation; either version 3, or (at your 11;; option) any later version. 12;; 13;; GCC is distributed in the hope that it will be useful, but WITHOUT 14;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16;; License for more details. 17;; 18;; You should have received a copy of the GNU General Public License 19;; along with GCC; see the file COPYING3. If not see 20;; <http://www.gnu.org/licenses/>. 21 22;; Prologue and epilogue patterns 23 24(define_expand "prologue" 25 [(const_int 1)] 26 "" 27 "m32c_emit_prologue(); DONE;" 28 ) 29 30; For the next two, operands[0] is the amount of stack space we want 31; to reserve. 32 33; We assume dwarf2out will process each set in sequence. 34(define_insn "prologue_enter_16" 35 [(set (mem:HI (plus:HI (reg:HI SP_REGNO) (const_int -2))) 36 (reg:HI FB_REGNO)) 37 (set (reg:HI FB_REGNO) 38 (plus:HI (reg:HI SP_REGNO) (const_int -2))) 39 (set (reg:HI SP_REGNO) 40 (minus:HI (reg:HI SP_REGNO) 41 (match_operand 0 "const_int_operand" "i"))) 42 ] 43 "TARGET_A16" 44 { 45 /* This is due to binutils bug gas/4659. */ 46 if (INTVAL (operands[0]) == 2) 47 return "enter\t#0"; 48 return "enter\t%0-2"; 49 } 50 [(set_attr "flags" "x")] 51 ) 52 53(define_insn "prologue_enter_24" 54 [(set (mem:SI (plus:PSI (reg:PSI SP_REGNO) (const_int -4))) 55 (reg:SI FB_REGNO)) 56 (set (reg:PSI FB_REGNO) 57 (plus:PSI (reg:PSI SP_REGNO) (const_int -4))) 58 (set (reg:PSI SP_REGNO) 59 (minus:PSI (reg:PSI SP_REGNO) 60 (match_operand 0 "const_int_operand" "i"))) 61 ] 62 "TARGET_A24" 63 { 64 /* This is due to binutils bug gas/4659. */ 65 if (INTVAL (operands[0]) == 4) 66 return "enter\t#0"; 67 return "enter\t%0-4"; 68 } 69 [(set_attr "flags" "x")] 70 ) 71 72; Just a comment, for debugging the assembler output. 73(define_insn "prologue_end" 74 [(unspec_volatile [(const_int 0)] UNS_PROLOGUE_END)] 75 "" 76 "; end of prologue" 77 [(set_attr "flags" "n")] 78 ) 79 80 81 82(define_expand "epilogue" 83 [(const_int 1)] 84 "" 85 "m32c_emit_epilogue(); DONE;" 86 ) 87 88(define_expand "eh_return" 89 [(match_operand:PSI 0 "" "")] 90 "" 91 "m32c_emit_eh_epilogue(operands[0]); DONE;" 92 ) 93 94(define_insn "eh_epilogue" 95 [(set (pc) 96 (unspec_volatile [(match_operand 0 "m32c_r1_operand" "") 97 (match_operand 1 "m32c_r0_operand" "") 98 ] UNS_EH_EPILOGUE))] 99 "" 100 "jmp.a\t__m32c_eh_return" 101 [(set_attr "flags" "x")] 102 ) 103 104(define_insn "epilogue_exitd_16" 105 [(set (reg:HI SP_REGNO) 106 (plus:HI (reg:HI FB_REGNO) 107 (const_int 2))) 108 (set (reg:HI FB_REGNO) 109 (mem:HI (reg:HI FB_REGNO))) 110 (return) 111 ] 112 "TARGET_A16" 113 "exitd" 114 [(set_attr "flags" "x")] 115 ) 116 117(define_insn "epilogue_reit_16" 118 [(set (reg:HI SP_REGNO) 119 (plus:HI (reg:HI SP_REGNO) 120 (const_int 4))) 121 (return) 122 ] 123 "TARGET_A16" 124 "reit" 125 [(set_attr "flags" "x")] 126 ) 127 128(define_insn "epilogue_exitd_24" 129 [(set (reg:PSI SP_REGNO) 130 (plus:PSI (reg:PSI FB_REGNO) 131 (const_int 4))) 132 (set (reg:PSI FB_REGNO) 133 (mem:PSI (reg:PSI FB_REGNO))) 134 (return) 135 ] 136 "TARGET_A24" 137 "exitd" 138 [(set_attr "flags" "x")] 139 ) 140 141(define_insn "epilogue_reit_24" 142 [(set (reg:PSI SP_REGNO) 143 (plus:PSI (reg:PSI SP_REGNO) 144 (const_int 6))) 145 (return) 146 ] 147 "TARGET_A24" 148 "reit" 149 [(set_attr "flags" "x")] 150 ) 151 152(define_insn "epilogue_freit" 153 [(unspec [(const_int 0)] UNS_FREIT) 154 (return) 155 ] 156 "" 157 "freit" 158 [(set_attr "flags" "x")] 159 ) 160 161(define_insn "epilogue_rts" 162 [(return) 163 ] 164 "" 165 "rts" 166 [(set_attr "flags" "x")] 167 ) 168 169(define_insn "epilogue_start" 170 [(unspec_volatile [(const_int 0)] UNS_EPILOGUE_START)] 171 "" 172 "; start of epilogue" 173 [(set_attr "flags" "n")] 174 ) 175 176 177; These are used by the prologue/epilogue code. 178 179(define_insn "pushm" 180 [(unspec [(match_operand 0 "const_int_operand" "i")] UNS_PUSHM)] 181 "" 182 "pushm\t%p0" 183 [(set_attr "flags" "n")] 184 ) 185 186(define_insn "popm" 187 [(unspec [(match_operand 0 "const_int_operand" "i")] UNS_POPM)] 188 "" 189 "popm\t%p0" 190 [(set_attr "flags" "n")] 191 ) 192 193(define_insn "fset_b" 194 [(unspec [(const_int 0)] UNS_FSETB)] 195 "" 196 "fset\tB" 197 [(set_attr "flags" "n")] 198 ) 199 200