Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/m32c/prologue.md @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | 77e2b8dfacca |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
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_rts" | |
153 [(return) | |
154 ] | |
155 "" | |
156 "rts" | |
157 [(set_attr "flags" "x")] | |
158 ) | |
159 | |
160 (define_insn "epilogue_start" | |
161 [(unspec_volatile [(const_int 0)] UNS_EPILOGUE_START)] | |
162 "" | |
163 "; start of epilogue" | |
164 [(set_attr "flags" "n")] | |
165 ) | |
166 | |
167 | |
168 ; These are used by the prologue/epilogue code. | |
169 | |
170 (define_insn "pushm" | |
171 [(unspec [(match_operand 0 "const_int_operand" "i")] UNS_PUSHM)] | |
172 "" | |
173 "pushm\t%p0" | |
174 [(set_attr "flags" "n")] | |
175 ) | |
176 | |
177 (define_insn "popm" | |
178 [(unspec [(match_operand 0 "const_int_operand" "i")] UNS_POPM)] | |
179 "" | |
180 "popm\t%p0" | |
181 [(set_attr "flags" "n")] | |
182 ) |