annotate gcc/config/nios2/nios2-ldstwm.sml @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 (* Auto-generate Nios II R2 CDX ldwm/stwm/push.n/pop.n patterns
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2014-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by Mentor Graphics.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
10 version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
15 for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 This is a Standard ML program. There are multiple Standard ML
kono
parents:
diff changeset
22 implementations widely available. We recommend the MLton optimizing
kono
parents:
diff changeset
23 SML compiler, due to its ease of creating a standalone executable.
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 http://www.mlton.org/
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 Or from your favourite OS's friendly packaging system. Tested with
kono
parents:
diff changeset
28 MLton Release 20130715, though other versions will probably work too.
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 Run with:
kono
parents:
diff changeset
31 mlton -output a.out /path/to/gcc/config/nios2/nios2-ldstwm.sml
kono
parents:
diff changeset
32 ./a.out >/path/to/gcc/config/nios2/ldstwm.md
kono
parents:
diff changeset
33 *)
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 datatype ld_st = ld | st;
kono
parents:
diff changeset
36 datatype push_pop = push | pop;
kono
parents:
diff changeset
37 datatype inc_dec = inc | dec;
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 fun for ls f = map f ls;
kono
parents:
diff changeset
40 fun conds cond str = if cond then str else "";
kono
parents:
diff changeset
41 fun ints n = if n>=0 then (Int.toString n) else ("-" ^ (Int.toString (~n)));
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 fun pushpop_pattern pptype n fp =
kono
parents:
diff changeset
44 let
kono
parents:
diff changeset
45 val sp_reg = "(reg:SI SP_REGNO)";
kono
parents:
diff changeset
46 val ra_reg = "(reg:SI RA_REGNO)";
kono
parents:
diff changeset
47 val fp_reg = "(reg:SI FP_REGNO)";
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 fun sets lhs rhs = "(set " ^ lhs ^
kono
parents:
diff changeset
50 (if pptype=push then " "
kono
parents:
diff changeset
51 else " ") ^ rhs ^ ")";
kono
parents:
diff changeset
52 val sp_adj =
kono
parents:
diff changeset
53 "(set " ^ sp_reg ^ "\n " ^
kono
parents:
diff changeset
54 "(plus:SI " ^ sp_reg ^
kono
parents:
diff changeset
55 " (match_operand 1 \"const_int_operand\" \"\")))";
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 fun reg i regi = "(reg:SI " ^ (ints regi) ^ ")";
kono
parents:
diff changeset
58 fun mem i opndi =
kono
parents:
diff changeset
59 if pptype=push then
kono
parents:
diff changeset
60 "(mem:SI (plus:SI (reg:SI SP_REGNO) (const_int " ^ (ints (~4*i)) ^ ")))"
kono
parents:
diff changeset
61 else
kono
parents:
diff changeset
62 "(match_operand:SI " ^
kono
parents:
diff changeset
63 (ints opndi) ^ " \"stack_memory_operand\" \"\")";
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 val start = 1 + (if fp then 2 else 1);
kono
parents:
diff changeset
66 val lim = n + (if fp then 2 else 1);
kono
parents:
diff changeset
67 fun set_elt i regi opndi =
kono
parents:
diff changeset
68 if pptype=push then (sets (mem i opndi) (reg i regi))
kono
parents:
diff changeset
69 else (sets (reg i regi) (mem i opndi));
kono
parents:
diff changeset
70 fun get_elt_list (i, regi, opndi) =
kono
parents:
diff changeset
71 if i > lim then []
kono
parents:
diff changeset
72 else (set_elt i regi opndi) :: get_elt_list (i+1, regi-1, opndi+1);
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 val set_elements = get_elt_list (start, 16+n-1, start+1);
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 val ra_set = if pptype=push then sets (mem 1 2) ra_reg
kono
parents:
diff changeset
77 else sets ra_reg (mem 1 2);
kono
parents:
diff changeset
78 val fp_set = (conds fp (if pptype=push then sets (mem 2 3) fp_reg
kono
parents:
diff changeset
79 else sets fp_reg (mem 2 3)));
kono
parents:
diff changeset
80 val ret = (conds (pptype=pop) "(return)");
kono
parents:
diff changeset
81 val element_list =
kono
parents:
diff changeset
82 List.filter (fn x => x<>"")
kono
parents:
diff changeset
83 ([ret, sp_adj, ra_set, fp_set] @ set_elements);
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 fun reg_index i = 16 + n - i;
kono
parents:
diff changeset
86 fun pop_opnds 0 spl = (conds fp ("fp" ^ spl)) ^ "ra"
kono
parents:
diff changeset
87 | pop_opnds n spl = "r" ^ (ints (reg_index n)) ^ spl ^ (pop_opnds (n-1) spl);
kono
parents:
diff changeset
88 fun push_opnds 0 spl = "ra" ^ (conds fp (spl ^ "fp"))
kono
parents:
diff changeset
89 | push_opnds n spl = (push_opnds (n-1) spl) ^ spl ^ "r" ^ (ints (reg_index n));
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 val spadj_opnd = if pptype=push then 2 else (start+n);
kono
parents:
diff changeset
92 val spadj = ints spadj_opnd;
kono
parents:
diff changeset
93 val regsave_num = n + (if fp then 2 else 1);
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 val ppname = if pptype=push then "push" else "pop";
kono
parents:
diff changeset
96 val name = if pptype=push then "push" ^ "_" ^ (push_opnds n "_")
kono
parents:
diff changeset
97 else "pop" ^ "_" ^ (pop_opnds n "_");
kono
parents:
diff changeset
98 in
kono
parents:
diff changeset
99 "(define_insn \"*cdx_" ^ name ^ "\"\n" ^
kono
parents:
diff changeset
100 " [(match_parallel 0 \"" ^
kono
parents:
diff changeset
101 (conds (pptype=pop) "pop_operation") ^ "\"\n" ^
kono
parents:
diff changeset
102 " [" ^ (String.concatWith ("\n ") element_list) ^ "])]\n" ^
kono
parents:
diff changeset
103 " \"TARGET_HAS_CDX && XVECLEN (operands[0], 0) == " ^
kono
parents:
diff changeset
104 (ints (length element_list)) ^
kono
parents:
diff changeset
105 (conds (pptype=push)
kono
parents:
diff changeset
106 ("\n && (-INTVAL (operands[1]) & 3) == 0\n" ^
kono
parents:
diff changeset
107 " && (-INTVAL (operands[1]) - " ^
kono
parents:
diff changeset
108 (ints (4*regsave_num)) ^ ") <= 60")) ^
kono
parents:
diff changeset
109 "\"\n" ^
kono
parents:
diff changeset
110 (if pptype=pop then
kono
parents:
diff changeset
111 "{\n" ^
kono
parents:
diff changeset
112 " rtx x = XEXP (operands[" ^ spadj ^ "], 0);\n" ^
kono
parents:
diff changeset
113 " operands[" ^ spadj ^ "] = REG_P (x) ? const0_rtx : XEXP (x, 1);\n" ^
kono
parents:
diff changeset
114 " return \"pop.n\\\\t{" ^ (pop_opnds n ", ") ^ "}, %" ^ spadj ^ "\";\n" ^
kono
parents:
diff changeset
115 "}\n"
kono
parents:
diff changeset
116 else
kono
parents:
diff changeset
117 "{\n" ^
kono
parents:
diff changeset
118 " operands[" ^ spadj ^ "] = " ^
kono
parents:
diff changeset
119 "GEN_INT (-INTVAL (operands[1]) - " ^ (ints (4*regsave_num)) ^ ");\n" ^
kono
parents:
diff changeset
120 " return \"push.n\\\\t{" ^ (push_opnds n ", ") ^ "}, %" ^ spadj ^ "\";\n" ^
kono
parents:
diff changeset
121 "}\n") ^
kono
parents:
diff changeset
122 " [(set_attr \"type\" \"" ^ ppname ^ "\")])\n\n"
kono
parents:
diff changeset
123 end;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 fun ldstwm_pattern ldst n id wb pc =
kono
parents:
diff changeset
126 let
kono
parents:
diff changeset
127 val ldstwm = (if ldst=ld then "ldwm" else "stwm");
kono
parents:
diff changeset
128 val name = "*cdx_" ^ ldstwm ^ (Int.toString n) ^
kono
parents:
diff changeset
129 (if id=inc then "_inc" else "_dec") ^
kono
parents:
diff changeset
130 (conds wb "_wb") ^ (conds pc "_ret");
kono
parents:
diff changeset
131 val base_reg_referenced_p = ref false;
kono
parents:
diff changeset
132 val base_regno = ints (n+1);
kono
parents:
diff changeset
133 fun plus_addr base offset =
kono
parents:
diff changeset
134 "(plus:SI " ^ base ^ " (const_int " ^ (ints offset) ^ "))";
kono
parents:
diff changeset
135 fun base_reg () =
kono
parents:
diff changeset
136 if !base_reg_referenced_p then
kono
parents:
diff changeset
137 "(match_dup " ^ base_regno ^ ")"
kono
parents:
diff changeset
138 else (base_reg_referenced_p := true;
kono
parents:
diff changeset
139 "(match_operand:SI " ^ base_regno ^
kono
parents:
diff changeset
140 " \"register_operand\" \"" ^ (conds wb "+&") ^ "r\")");
kono
parents:
diff changeset
141 fun reg i = "(match_operand:SI " ^ (ints i) ^
kono
parents:
diff changeset
142 " \"nios2_hard_register_operand\" \"" ^
kono
parents:
diff changeset
143 (conds (ldst=ld) "") ^ "\")";
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 fun addr 1 = if id=inc then base_reg ()
kono
parents:
diff changeset
146 else plus_addr (base_reg ()) (~4)
kono
parents:
diff changeset
147 | addr i = let val offset = if id=inc then (i-1)*4 else (~i*4)
kono
parents:
diff changeset
148 in plus_addr (base_reg ()) offset end;
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 fun mem i = "(mem:SI " ^ (addr i) ^ ")";
kono
parents:
diff changeset
151 fun lhs i = if ldst=ld then reg i else mem i;
kono
parents:
diff changeset
152 fun rhs i = if ldst=st then reg i else mem i;
kono
parents:
diff changeset
153 fun sets lhs rhs = "(set " ^ lhs ^ "\n " ^ rhs ^ ")";
kono
parents:
diff changeset
154 fun set_elements i =
kono
parents:
diff changeset
155 if i > n then []
kono
parents:
diff changeset
156 else (sets (lhs i) (rhs i)) :: (set_elements (i+1));
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 fun opnds 1 = "%1"
kono
parents:
diff changeset
159 | opnds n = opnds(n-1) ^ ", %" ^ (Int.toString n);
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 val asm_template = ldstwm ^ "\\\\t{" ^ (opnds n) ^ "}" ^
kono
parents:
diff changeset
162 (if id=inc
kono
parents:
diff changeset
163 then ", (%" ^ base_regno ^ ")++"
kono
parents:
diff changeset
164 else ", --(%" ^ base_regno ^ ")") ^
kono
parents:
diff changeset
165 (conds wb ", writeback") ^
kono
parents:
diff changeset
166 (conds pc ", ret");
kono
parents:
diff changeset
167 val wbtmp =
kono
parents:
diff changeset
168 if wb then
kono
parents:
diff changeset
169 (sets (base_reg ())
kono
parents:
diff changeset
170 (plus_addr (base_reg ())
kono
parents:
diff changeset
171 ((if id=inc then n else ~n)*4)))
kono
parents:
diff changeset
172 else "";
kono
parents:
diff changeset
173 val pctmp = conds pc "(return)";
kono
parents:
diff changeset
174 val set_list = List.filter (fn x => x<>"")
kono
parents:
diff changeset
175 ([pctmp, wbtmp] @ (set_elements 1));
kono
parents:
diff changeset
176 in
kono
parents:
diff changeset
177 if ldst=st andalso pc then ""
kono
parents:
diff changeset
178 else
kono
parents:
diff changeset
179 "(define_insn \"" ^ name ^ "\"\n" ^
kono
parents:
diff changeset
180 " [(match_parallel 0 \"" ^ ldstwm ^ "_operation\"\n" ^
kono
parents:
diff changeset
181 " [" ^ (String.concatWith ("\n ") set_list) ^ "])]\n" ^
kono
parents:
diff changeset
182 " \"TARGET_HAS_CDX && XVECLEN (operands[0], 0) == " ^
kono
parents:
diff changeset
183 (ints (length set_list)) ^ "\"\n" ^
kono
parents:
diff changeset
184 " \"" ^ asm_template ^ "\"\n" ^
kono
parents:
diff changeset
185 " [(set_attr \"type\" \"" ^ ldstwm ^ "\")])\n\n"
kono
parents:
diff changeset
186 end;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 fun peephole_pattern ldst n scratch_p =
kono
parents:
diff changeset
189 let
kono
parents:
diff changeset
190 fun sets lhs rhs = "(set " ^ lhs ^ "\n " ^ rhs ^ ")";
kono
parents:
diff changeset
191 fun single_set i indent =
kono
parents:
diff changeset
192 let val reg = "(match_operand:SI " ^ (ints i) ^
kono
parents:
diff changeset
193 " \"register_operand\" \"\")";
kono
parents:
diff changeset
194 val mem = "(match_operand:SI " ^ (ints (i+n)) ^
kono
parents:
diff changeset
195 " \"memory_operand\" \"\")";
kono
parents:
diff changeset
196 in
kono
parents:
diff changeset
197 if ldst=ld then sets reg mem
kono
parents:
diff changeset
198 else sets mem reg
kono
parents:
diff changeset
199 end;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 fun single_sets i =
kono
parents:
diff changeset
202 if i=n then []
kono
parents:
diff changeset
203 else (single_set i " ") :: (single_sets (i+1));
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 val scratch = ints (2*n);
kono
parents:
diff changeset
206 val peephole_elements =
kono
parents:
diff changeset
207 let val tmp = single_sets 0 in
kono
parents:
diff changeset
208 if scratch_p
kono
parents:
diff changeset
209 then (["(match_scratch:SI " ^ scratch ^ " \"r\")"] @
kono
parents:
diff changeset
210 tmp @
kono
parents:
diff changeset
211 ["(match_dup " ^ scratch ^ ")"])
kono
parents:
diff changeset
212 else tmp
kono
parents:
diff changeset
213 end;
kono
parents:
diff changeset
214 in
kono
parents:
diff changeset
215 "(define_peephole2\n" ^
kono
parents:
diff changeset
216 " [" ^ (String.concatWith ("\n ") peephole_elements) ^ "]\n" ^
kono
parents:
diff changeset
217 " \"TARGET_HAS_CDX\"\n" ^
kono
parents:
diff changeset
218 " [(const_int 0)]\n" ^
kono
parents:
diff changeset
219 "{\n" ^
kono
parents:
diff changeset
220 " if (gen_ldstwm_peep (" ^
kono
parents:
diff changeset
221 (if ldst=st then "false" else "true") ^ ", " ^ (ints n) ^ ", " ^
kono
parents:
diff changeset
222 (if scratch_p then ("operands[" ^ scratch ^ "]") else "NULL_RTX") ^
kono
parents:
diff changeset
223 ", operands))\n" ^
kono
parents:
diff changeset
224 " DONE;\n" ^
kono
parents:
diff changeset
225 " else\n" ^
kono
parents:
diff changeset
226 " FAIL;\n" ^
kono
parents:
diff changeset
227 "})\n\n"
kono
parents:
diff changeset
228 end;
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 print
kono
parents:
diff changeset
232 ("/* Nios II R2 CDX ldwm/stwm/push.h/pop.n instruction patterns.\n" ^
kono
parents:
diff changeset
233 " This file was automatically generated using nios2-ldstwm.sml.\n" ^
kono
parents:
diff changeset
234 " Please do not edit manually.\n" ^
kono
parents:
diff changeset
235 "\n" ^
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
236 " Copyright (C) 2014-2018 Free Software Foundation, Inc.\n" ^
111
kono
parents:
diff changeset
237 " Contributed by Mentor Graphics.\n" ^
kono
parents:
diff changeset
238 "\n" ^
kono
parents:
diff changeset
239 " This file is part of GCC.\n" ^
kono
parents:
diff changeset
240 "\n" ^
kono
parents:
diff changeset
241 " GCC is free software; you can redistribute it and/or modify it\n" ^
kono
parents:
diff changeset
242 " under the terms of the GNU General Public License as published\n" ^
kono
parents:
diff changeset
243 " by the Free Software Foundation; either version 3, or (at your\n" ^
kono
parents:
diff changeset
244 " option) any later version.\n" ^
kono
parents:
diff changeset
245 "\n" ^
kono
parents:
diff changeset
246 " GCC is distributed in the hope that it will be useful, but WITHOUT\n" ^
kono
parents:
diff changeset
247 " ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n" ^
kono
parents:
diff changeset
248 " or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n" ^
kono
parents:
diff changeset
249 " License for more details.\n" ^
kono
parents:
diff changeset
250 "\n" ^
kono
parents:
diff changeset
251 " You should have received a copy of the GNU General Public License and\n" ^
kono
parents:
diff changeset
252 " a copy of the GCC Runtime Library Exception along with this program;\n" ^
kono
parents:
diff changeset
253 " see the files COPYING3 and COPYING.RUNTIME respectively. If not, see\n" ^
kono
parents:
diff changeset
254 " <http://www.gnu.org/licenses/>. */\n\n");
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 fun seq a b = if a=b then [b]
kono
parents:
diff changeset
257 else a :: (seq (if a<b then a+1 else a-1) b);
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 (* push/pop patterns *)
kono
parents:
diff changeset
260 for (seq 0 8) (fn n =>
kono
parents:
diff changeset
261 for [push, pop] (fn p =>
kono
parents:
diff changeset
262 for [true, false] (fn fp =>
kono
parents:
diff changeset
263 print (pushpop_pattern p n fp))));
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 (* ldwm/stwm patterns *)
kono
parents:
diff changeset
266 for [ld, st] (fn l =>
kono
parents:
diff changeset
267 for (seq 1 12) (fn n =>
kono
parents:
diff changeset
268 for [inc, dec] (fn id =>
kono
parents:
diff changeset
269 for [true, false] (fn wb =>
kono
parents:
diff changeset
270 for [true, false] (fn pc =>
kono
parents:
diff changeset
271 print (ldstwm_pattern l n id wb pc))))));
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 (* peephole patterns *)
kono
parents:
diff changeset
274 for [ld, st] (fn l =>
kono
parents:
diff changeset
275 for (seq 12 2) (fn n =>
kono
parents:
diff changeset
276 print (peephole_pattern l n true)));
kono
parents:
diff changeset
277