xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/m32c/prologue.md (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
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