makeiocscalls.awk revision 1.3 1 1.1 itohy #! /usr/bin/awk -f
2 1.1 itohy #
3 1.1 itohy # create IOCS call interface from iocs.h
4 1.1 itohy #
5 1.3 itohy # written by ITOH Yasufumi
6 1.1 itohy # public domain
7 1.1 itohy #
8 1.3 itohy # $NetBSD: makeiocscalls.awk,v 1.3 2011/02/21 02:31:59 itohy Exp $
9 1.1 itohy
10 1.1 itohy BEGIN {
11 1.1 itohy argsiz["l"] = 4; argsiz["w"] = 2
12 1.1 itohy argsiz["lb31"] = 4; argsiz["wb8"] = 2
13 1.1 itohy
14 1.1 itohy for (i = 0; i < 16; i++) {
15 1.1 itohy reg = substr("d0d1d2d3d4d5d6d7a0a1a2a3a4a5a6a7", i*2+1, 2)
16 1.1 itohy regno[reg] = i
17 1.1 itohy }
18 1.2 itohy print "#include <machine/asm.h>"
19 1.1 itohy }
20 1.1 itohy
21 1.1 itohy $1 == "/*" && ($2 ~ /^[0-9a-f][0-9a-f]$/ || $2 == "(none)") {
22 1.1 itohy funcnam=""
23 1.1 itohy iocsno=$2
24 1.2 itohy ptrval=0
25 1.1 itohy narg=0
26 1.1 itohy retd2=0
27 1.1 itohy err_d0=0
28 1.1 itohy noret=0
29 1.1 itohy c_md=0
30 1.1 itohy b_super=0
31 1.1 itohy sp_regst=0
32 1.1 itohy b_curmod = 0
33 1.1 itohy b_curpat = 0
34 1.1 itohy b_scroll = 0
35 1.1 itohy iocs_trap15=0
36 1.1 itohy for (i = 3; i <= NF && $i != "*/" && $i != ";"; i++) {
37 1.1 itohy arg[narg] = $i
38 1.1 itohy narg++
39 1.1 itohy }
40 1.1 itohy if ($i == ";") {
41 1.1 itohy # process opts
42 1.1 itohy for (i++; i <= NF && $i != "*/"; i++) {
43 1.1 itohy if ($i == "retd2")
44 1.1 itohy retd2 = 1
45 1.1 itohy else if ($i == "err_d0")
46 1.1 itohy err_d0 = 1
47 1.1 itohy else if ($i == "noret")
48 1.1 itohy noret = 1
49 1.1 itohy else if ($i == "c_md")
50 1.1 itohy c_md = 1
51 1.1 itohy else if ($i == "b_super")
52 1.1 itohy b_super = 1
53 1.1 itohy else if ($i == "sp_regst")
54 1.1 itohy sp_regst = 1
55 1.1 itohy else if ($i == "b_curmod")
56 1.1 itohy b_curmod = 1
57 1.1 itohy else if ($i == "b_curpat")
58 1.1 itohy b_curpat = 1
59 1.1 itohy else if ($i == "b_scroll")
60 1.1 itohy b_scroll = 1
61 1.1 itohy else if ($i == "trap15")
62 1.1 itohy iocs_trap15 = 1
63 1.1 itohy else {
64 1.1 itohy print FILENAME ":" NR ": unknown opt", $i
65 1.1 itohy exit(1)
66 1.1 itohy }
67 1.1 itohy }
68 1.1 itohy }
69 1.1 itohy if ($i != "*/") {
70 1.1 itohy print FILENAME ":" NR ": malformed input line:" $0
71 1.1 itohy exit(1)
72 1.1 itohy }
73 1.1 itohy
74 1.1 itohy # find out func name
75 1.1 itohy printf "|"
76 1.1 itohy for (i++; i <= NF; i++) {
77 1.1 itohy printf " %s", $i
78 1.1 itohy if ($i ~ /^\**IOCS_[A-Z0-9_]*$/) {
79 1.1 itohy funcnam = $i
80 1.2 itohy while (funcnam ~ /^\*/) {
81 1.1 itohy funcnam = substr(funcnam, 2, length(funcnam) -1)
82 1.2 itohy ptrval = 1
83 1.2 itohy }
84 1.1 itohy }
85 1.1 itohy }
86 1.1 itohy print ""
87 1.1 itohy if (!funcnam) {
88 1.1 itohy print FILENAME ":" NR ": can't find function name"
89 1.1 itohy exit(1)
90 1.1 itohy }
91 1.1 itohy
92 1.1 itohy # output assembly code
93 1.2 itohy print "ENTRY_NOPROFILE(" funcnam ")"
94 1.1 itohy
95 1.1 itohy # SAVE REGISTERS
96 1.1 itohy for (i = 0; i < 16; i++) {
97 1.1 itohy savereg[i] = 0
98 1.1 itohy }
99 1.1 itohy for (i = 0; i < narg; i++) {
100 1.1 itohy r = arg[i]
101 1.1 itohy if (r ~ /^o[ad][0-7]$/)
102 1.1 itohy r = substr(r, 2, 2)
103 1.1 itohy else if (r ~ /^d[0-7]=/)
104 1.1 itohy r = substr(r, 1, 2)
105 1.1 itohy if (r != "d0" && !regno[r]) {
106 1.1 itohy print FILENAME ":" NR ": unknown arg type:", arg[i]
107 1.1 itohy exit(1)
108 1.1 itohy }
109 1.1 itohy if (r !~ /^[da][01]$/) # may not be saved
110 1.1 itohy savereg[regno[r]] = r
111 1.1 itohy }
112 1.1 itohy # count reg to save
113 1.1 itohy nsave = 0
114 1.1 itohy for (i = 0; i < 16; i++) {
115 1.1 itohy if (savereg[i])
116 1.1 itohy nsave++
117 1.1 itohy }
118 1.1 itohy
119 1.1 itohy if (iocs_trap15) {
120 1.2 itohy print "\tmoveml\t%d2-%d7/%a2-%a6,%sp@-"
121 1.1 itohy nsave = 11
122 1.1 itohy } else if (nsave == 1 || nsave == 2){
123 1.1 itohy # use movel
124 1.1 itohy for (i = 0; i < 16; i++) {
125 1.1 itohy if (savereg[i])
126 1.2 itohy print "\tmovel\t%" savereg[i] ",%sp@-"
127 1.1 itohy }
128 1.1 itohy } else if (nsave > 2) {
129 1.1 itohy # use moveml
130 1.1 itohy saveregs = ""
131 1.1 itohy for (i = 0; i < 16; i++) {
132 1.1 itohy if (savereg[i])
133 1.2 itohy saveregs = saveregs "/%" savereg[i]
134 1.1 itohy }
135 1.1 itohy saveregs = substr(saveregs, 2, length(saveregs) - 1)
136 1.2 itohy print "\tmoveml\t" saveregs ",%sp@-"
137 1.1 itohy }
138 1.1 itohy
139 1.1 itohy # LOAD ARGS
140 1.1 itohy # XXX this should be more intelligent
141 1.1 itohy argoff = nsave * 4 + 4
142 1.1 itohy # input arguments for IOCS call
143 1.1 itohy iarg = ""
144 1.2 itohy iargreglist = ""
145 1.1 itohy niarg = 0
146 1.1 itohy iarg_incorder = 1
147 1.1 itohy immarg = ""
148 1.1 itohy nimmarg = 0
149 1.1 itohy for (i = 0; i < narg && arg[i] ~ /^[ad]/; i++) {
150 1.1 itohy a = arg[i]
151 1.1 itohy if (a ~ /^d[1-7]=[0-9][0-9]*$/) {
152 1.1 itohy immarg = immarg " " a
153 1.1 itohy nimmarg++
154 1.1 itohy } else {
155 1.1 itohy if (iarg) {
156 1.1 itohy if (regno[a1] >= regno[a])
157 1.1 itohy iarg_incorder = 0
158 1.1 itohy }
159 1.1 itohy a1 = a
160 1.1 itohy iarg = iarg "/" a
161 1.2 itohy iargreglist = iargreglist "/%" a
162 1.1 itohy niarg++
163 1.1 itohy }
164 1.1 itohy }
165 1.1 itohy oarg = ""
166 1.1 itohy noarg = 0
167 1.1 itohy for ( ; i < narg; i++) {
168 1.1 itohy if (arg[i] ~ /^[o]d[0-7]/) {
169 1.1 itohy oarg = oarg " " arg[i]
170 1.1 itohy noarg++
171 1.1 itohy } else {
172 1.1 itohy print "unknown arg:", arg[i]
173 1.1 itohy exit(1)
174 1.1 itohy }
175 1.1 itohy }
176 1.1 itohy # remove leading char
177 1.1 itohy iarg = substr(iarg, 2, length(iarg) - 1);
178 1.2 itohy iargreglist = substr(iargreglist, 2, length(iargreglist) - 1);
179 1.1 itohy immarg = substr(immarg, 2, length(immarg) - 1);
180 1.1 itohy oarg = substr(oarg, 2, length(oarg) - 1);
181 1.1 itohy # load input args
182 1.1 itohy if (niarg == 0)
183 1.1 itohy ;
184 1.1 itohy else if (niarg == 1 && iarg !~ /\=/) {
185 1.2 itohy print "\tmovel\t%sp@(" argoff "),%" iarg "\t| 1arg"
186 1.1 itohy } else if (iarg_incorder && iarg !~ /\=/) {
187 1.2 itohy print "\tmoveml\t%sp@(" argoff ")," iargreglist "\t| inc order"
188 1.1 itohy } else if (iarg == "a1/d1") {
189 1.2 itohy print "\tmoveal\t%sp@(" argoff "),%a1"
190 1.2 itohy print "\tmovel\t%sp@(" argoff + 4 "),%d1"
191 1.1 itohy } else if (iarg == "d1/a1/d2") {
192 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%d1-%d2/%a1"
193 1.2 itohy print "\texg\t%d2,%a1"
194 1.1 itohy } else if (iarg == "a1/a2/d1") {
195 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%a1/%a2"
196 1.2 itohy print "\tmovel\t%sp@(" argoff + 8 "),%d1"
197 1.1 itohy } else if (iarg == "a1/a2/d1/d2") {
198 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%d1-%d2/%a1-%a2"
199 1.2 itohy print "\texg\t%d1,%a1"
200 1.2 itohy print "\texg\t%d2,%a2"
201 1.1 itohy } else if (iarg == "a1/d1/d2") {
202 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%d0-%d2"
203 1.2 itohy print "\tmovel\t%d0,%a1"
204 1.1 itohy } else if (iarg == "d1=bb") {
205 1.2 itohy print "\tmoveq\t#0,%d1"
206 1.2 itohy print "\tmoveb\t%sp@(" argoff + 3 "),%d1"
207 1.2 itohy print "\tlslw\t#8,%d1"
208 1.2 itohy print "\tmoveb\t%sp@(" argoff + 7 "),%d1"
209 1.1 itohy niarg = 2
210 1.1 itohy } else if (iarg == "d1=ww") {
211 1.2 itohy print "\tmovew\t%sp@(" argoff + 2 "),%d1"
212 1.2 itohy print "\tswap\t%d1"
213 1.2 itohy print "\tmovew\t%sp@(" argoff + 6 "),%d1"
214 1.1 itohy niarg = 2
215 1.1 itohy } else if (iarg == "d1=hsv") {
216 1.2 itohy print "\tmoveb\t%sp@(" argoff + 3 "),%d1"
217 1.2 itohy print "\tswap\t%d1"
218 1.2 itohy print "\tmoveb\t%sp@(" argoff + 7 "),%d1"
219 1.2 itohy print "\tlslw\t#8,%d1"
220 1.2 itohy print "\tmoveb\t%sp@(" argoff + 11 "),%d1"
221 1.2 itohy print "\tandl\t#0x00ff1f1f,%d1"
222 1.1 itohy niarg = 3
223 1.1 itohy } else if (iarg == "a1/d1=bb") {
224 1.2 itohy print "\tmoveal\t%sp@(" argoff "),%a1"
225 1.2 itohy print "\tmoveq\t#0,%d1"
226 1.2 itohy print "\tmoveb\t%sp@(" argoff + 7 "),%d1"
227 1.2 itohy print "\tlslw\t#8,%d1"
228 1.2 itohy print "\tmoveb %sp@(" argoff + 11 "),%d1"
229 1.1 itohy niarg = 3
230 1.1 itohy } else if (iarg == "d1/d2=ww") {
231 1.2 itohy print "\tmovel\t%sp@(" argoff "),%d1"
232 1.2 itohy print "\tmovew\t%sp@(" argoff + 6 "),%d2"
233 1.2 itohy print "\tswap\t%d2"
234 1.2 itohy print "\tmovew\t%sp@(" argoff + 10 "),%d2"
235 1.1 itohy niarg = 3
236 1.1 itohy } else if (iarg == "d1=ww/a1") {
237 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%d0-%d1/%a1"
238 1.2 itohy print "\tswap\t%d1"
239 1.2 itohy print "\tmovew\t%d0,%d1"
240 1.2 itohy print "\tswap\t%d1"
241 1.1 itohy niarg = 3
242 1.1 itohy } else if (iarg == "d1=ww/d2=ww") {
243 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%d1-%d2"
244 1.2 itohy print "\tswap\t%d1"
245 1.2 itohy print "\tmovew\t%d2,%d1"
246 1.2 itohy print "\tmovew\t%sp@(" argoff + 10 "),%d2"
247 1.2 itohy print "\tswap\t%d2"
248 1.2 itohy print "\tmovew\t%sp@(" argoff + 14 "),%d2"
249 1.1 itohy niarg = 4
250 1.1 itohy } else {
251 1.1 itohy print "unsupported iarg:", iarg
252 1.1 itohy exit(1)
253 1.1 itohy }
254 1.1 itohy argoff += niarg * 4
255 1.1 itohy
256 1.1 itohy if (sp_regst) {
257 1.2 itohy print "\tandl\t#0x80000000,%d1"
258 1.2 itohy print "\tmoveb\t%d0,%d1"
259 1.1 itohy }
260 1.1 itohy
261 1.1 itohy if (b_curmod) {
262 1.2 itohy print "\tmoveq\t#1,%d0"
263 1.2 itohy print "\tcmpl\t%d1,%d0"
264 1.1 itohy # print "\tbcss\tLerr"
265 1.1 itohy print "\tbcss\t6f"
266 1.1 itohy }
267 1.1 itohy
268 1.1 itohy if (b_curpat) {
269 1.2 itohy print "\ttstw\t%d2"
270 1.1 itohy # print "\tbeqs\tLerr"
271 1.1 itohy print "\tbeqs\t6f"
272 1.1 itohy }
273 1.1 itohy
274 1.1 itohy if (b_super) {
275 1.2 itohy print "\tmoval\t%sp@+,%a0"
276 1.2 itohy print "\tmoval\t%sp@,%a1"
277 1.1 itohy }
278 1.1 itohy
279 1.1 itohy # load imm args
280 1.1 itohy if (nimmarg) {
281 1.1 itohy for (i = 0; i < narg && arg[i] ~ /^[ad]/; i++) {
282 1.1 itohy a = arg[i]
283 1.1 itohy if (a ~ /^d[1-7]=[0-9][0-9]*$/) {
284 1.1 itohy r = substr(a, 1, 2)
285 1.1 itohy v = substr(a, 4, length(a)-3)
286 1.2 itohy print "\tmoveq\t#" v ",%" r
287 1.1 itohy }
288 1.1 itohy }
289 1.1 itohy }
290 1.1 itohy
291 1.1 itohy if (c_md) {
292 1.1 itohy # -1: flush(3), -2: set default(2), other: set by the value(4)
293 1.2 itohy print "\tmovel\t%d2,%d0"
294 1.2 itohy print "\taddql\t#1,%d0"
295 1.1 itohy print "\tbeqs\tLcachemd"
296 1.2 itohy print "\tmoveq\t#2,%d1"
297 1.2 itohy print "\taddql\t#1,%d0"
298 1.1 itohy print "\tbnes\tLcachemd"
299 1.2 itohy print "\tmoveq\t#4,%d1"
300 1.1 itohy print "Lcachemd:"
301 1.1 itohy }
302 1.1 itohy
303 1.1 itohy if (b_scroll) {
304 1.1 itohy # d1 has 16
305 1.2 itohy print "\tcmpl\t%d1,%d2"
306 1.1 itohy print "\tbcss\tLscriocs"
307 1.2 itohy print "\tmovel\t%d2,%d1"
308 1.1 itohy print "Lscriocs:"
309 1.1 itohy }
310 1.1 itohy
311 1.1 itohy if (iocs_trap15) {
312 1.2 itohy print "\tmoveal\t%sp@(" argoff "),%a0 | inregs"
313 1.2 itohy print "\tmoveml\t%a0@,%d0-%d7/%a1-%a6"
314 1.1 itohy argoff += 4
315 1.1 itohy }
316 1.1 itohy
317 1.1 itohy if (iocsno != "(none)") {
318 1.1 itohy if (iocsno ~ /^[89abcdef]./)
319 1.1 itohy iocsno = "ffffff" iocsno
320 1.2 itohy print "\tmoveq\t#0x" iocsno ",%d0"
321 1.1 itohy }
322 1.1 itohy print "\ttrap\t#15"
323 1.1 itohy
324 1.1 itohy if (iocs_trap15) {
325 1.2 itohy print "\tmoveal\t%sp@(" argoff "),%a0 | outregs"
326 1.2 itohy print "\tmoveml\t%d0-%d7/%a1-%a6,%a0@"
327 1.1 itohy }
328 1.1 itohy
329 1.1 itohy if (err_d0 && noarg) {
330 1.2 itohy print "\ttstl\t%d0"
331 1.1 itohy # print "\tbnes\tLerr"
332 1.1 itohy print "\tbnes\t6f"
333 1.1 itohy }
334 1.1 itohy
335 1.1 itohy # SAVERESULTS
336 1.1 itohy # XXX this should be more intelligent
337 1.1 itohy if (noarg == 0)
338 1.1 itohy ;
339 1.1 itohy else if (oarg == "od2") {
340 1.2 itohy print "\tmoveal\t%sp@(" argoff "),%a0"
341 1.1 itohy argoff += 4
342 1.2 itohy print "\tmovel\t%d2,%a0@"
343 1.1 itohy } else if (oarg == "od1 od2 od0") {
344 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
345 1.1 itohy argoff += 8
346 1.2 itohy print "\tmovel\t%d1,%a0@"
347 1.2 itohy print "\tmovel\t%d2,%a1@"
348 1.2 itohy print "\tmoveal\t%sp@(" argoff "),%a0"
349 1.1 itohy argoff += 4
350 1.2 itohy print "\tmovel\t%d0,%a0@"
351 1.1 itohy } else if (oarg == "od2 od3") {
352 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
353 1.1 itohy argoff += 8
354 1.2 itohy print "\tmovel\t%d2,%a0@"
355 1.2 itohy print "\tmovel\t%d3,%a1@"
356 1.1 itohy } else if (oarg == "od2 od3 od4 od5") {
357 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
358 1.1 itohy argoff += 8
359 1.2 itohy print "\tmovel\t%d2,%a0@"
360 1.2 itohy print "\tmovel\t%d3,%a1@"
361 1.2 itohy print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
362 1.1 itohy argoff += 8
363 1.2 itohy print "\tmovel\t%d4,%a0@"
364 1.2 itohy print "\tmovel\t%d5,%a1@"
365 1.1 itohy } else {
366 1.1 itohy print "unsupported oarg:", oarg
367 1.1 itohy exit(1)
368 1.1 itohy }
369 1.1 itohy
370 1.1 itohy if ((err_d0 && noarg) || b_curmod || b_curpat)
371 1.1 itohy # print "Lerr:"
372 1.1 itohy print "6:"
373 1.1 itohy
374 1.1 itohy # return value
375 1.1 itohy if (retd2)
376 1.2 itohy print "\tmovel\t%d2,%d0"
377 1.1 itohy
378 1.1 itohy # RESTORE REGISTERS
379 1.1 itohy if (iocs_trap15) {
380 1.2 itohy print "\tmoveml\t%sp@+,%d2-%d7/%a2-%a6"
381 1.1 itohy } else if (nsave == 1 || nsave == 2){
382 1.1 itohy # use movel
383 1.1 itohy for (i = 16 - 1; i >= 0; i--) {
384 1.1 itohy if (savereg[i])
385 1.2 itohy print "\tmovel\t%sp@+,%" savereg[i]
386 1.1 itohy }
387 1.1 itohy } else if (nsave > 2) {
388 1.1 itohy # use moveml
389 1.2 itohy print "\tmoveml\t%sp@+," saveregs
390 1.1 itohy }
391 1.1 itohy
392 1.1 itohy
393 1.1 itohy if (b_super)
394 1.2 itohy print "\tjmp\t%a0@"
395 1.2 itohy else if (!noret) {
396 1.2 itohy if (ptrval)
397 1.2 itohy print "#ifdef __SVR4_ABI__\n\tmoveal\t%d0,%a0\n#endif"
398 1.1 itohy print "\trts"
399 1.2 itohy }
400 1.1 itohy }
401