Home | History | Annotate | Line # | Download | only in libiocs
makeiocscalls.awk revision 1.2.164.1
      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.2.164.1  bouyer #	written by ITOH Yasufumi
      6        1.1   itohy #	public domain
      7        1.1   itohy #
      8  1.2.164.1  bouyer #	$NetBSD: makeiocscalls.awk,v 1.2.164.1 2011/03/05 15:10:08 bouyer 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