Home | History | Annotate | Line # | Download | only in libiocs
makeiocscalls.awk revision 1.1.14.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.1   itohy #	written by Yasha (ITOH Yasufumi)
      6       1.1   itohy #	public domain
      7       1.1   itohy #
      8  1.1.14.1  bouyer #	$NetBSD: makeiocscalls.awk,v 1.1.14.1 2000/11/20 20:30:17 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.1.14.1  bouyer 	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.1.14.1  bouyer 	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.1.14.1  bouyer 			while (funcnam ~ /^\*/) {
     81       1.1   itohy 				funcnam = substr(funcnam, 2, length(funcnam) -1)
     82  1.1.14.1  bouyer 				ptrval = 1
     83  1.1.14.1  bouyer 			}
     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.1.14.1  bouyer 	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.1.14.1  bouyer 		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.1.14.1  bouyer 				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.1.14.1  bouyer 				saveregs = saveregs "/%" savereg[i]
    134       1.1   itohy 		}
    135       1.1   itohy 		saveregs = substr(saveregs, 2, length(saveregs) - 1)
    136  1.1.14.1  bouyer 		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.1.14.1  bouyer 	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.1.14.1  bouyer 			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.1.14.1  bouyer 	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.1.14.1  bouyer 		print "\tmovel\t%sp@(" argoff "),%" iarg	"\t| 1arg"
    186       1.1   itohy 	} else if (iarg_incorder && iarg !~ /\=/) {
    187  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff ")," iargreglist	"\t| inc order"
    188       1.1   itohy 	} else if (iarg == "a1/d1") {
    189  1.1.14.1  bouyer 		print "\tmoveal\t%sp@(" argoff "),%a1"
    190  1.1.14.1  bouyer 		print "\tmovel\t%sp@(" argoff + 4 "),%d1"
    191       1.1   itohy 	} else if (iarg == "d1/a1/d2") {
    192  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%d1-%d2/%a1"
    193  1.1.14.1  bouyer 		print "\texg\t%d2,%a1"
    194       1.1   itohy 	} else if (iarg == "a1/a2/d1") {
    195  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%a1/%a2"
    196  1.1.14.1  bouyer 		print "\tmovel\t%sp@(" argoff + 8 "),%d1"
    197       1.1   itohy 	} else if (iarg == "a1/a2/d1/d2") {
    198  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%d1-%d2/%a1-%a2"
    199  1.1.14.1  bouyer 		print "\texg\t%d1,%a1"
    200  1.1.14.1  bouyer 		print "\texg\t%d2,%a2"
    201       1.1   itohy 	} else if (iarg == "a1/d1/d2") {
    202  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%d0-%d2"
    203  1.1.14.1  bouyer 		print "\tmovel\t%d0,%a1"
    204       1.1   itohy 	} else if (iarg == "d1=bb") {
    205  1.1.14.1  bouyer 		print "\tmoveq\t#0,%d1"
    206  1.1.14.1  bouyer 		print "\tmoveb\t%sp@(" argoff + 3 "),%d1"
    207  1.1.14.1  bouyer 		print "\tlslw\t#8,%d1"
    208  1.1.14.1  bouyer 		print "\tmoveb\t%sp@(" argoff + 7 "),%d1"
    209       1.1   itohy 		niarg = 2
    210       1.1   itohy 	} else if (iarg == "d1=ww") {
    211  1.1.14.1  bouyer 		print "\tmovew\t%sp@(" argoff + 2 "),%d1"
    212  1.1.14.1  bouyer 		print "\tswap\t%d1"
    213  1.1.14.1  bouyer 		print "\tmovew\t%sp@(" argoff + 6 "),%d1"
    214       1.1   itohy 		niarg = 2
    215       1.1   itohy 	} else if (iarg == "d1=hsv") {
    216  1.1.14.1  bouyer 		print "\tmoveb\t%sp@(" argoff + 3 "),%d1"
    217  1.1.14.1  bouyer 		print "\tswap\t%d1"
    218  1.1.14.1  bouyer 		print "\tmoveb\t%sp@(" argoff + 7 "),%d1"
    219  1.1.14.1  bouyer 		print "\tlslw\t#8,%d1"
    220  1.1.14.1  bouyer 		print "\tmoveb\t%sp@(" argoff + 11 "),%d1"
    221  1.1.14.1  bouyer 		print "\tandl\t#0x00ff1f1f,%d1"
    222       1.1   itohy 		niarg = 3
    223       1.1   itohy 	} else if (iarg == "a1/d1=bb") {
    224  1.1.14.1  bouyer 		print "\tmoveal\t%sp@(" argoff "),%a1"
    225  1.1.14.1  bouyer 		print "\tmoveq\t#0,%d1"
    226  1.1.14.1  bouyer 		print "\tmoveb\t%sp@(" argoff + 7 "),%d1"
    227  1.1.14.1  bouyer 		print "\tlslw\t#8,%d1"
    228  1.1.14.1  bouyer 		print "\tmoveb	%sp@(" argoff + 11 "),%d1"
    229       1.1   itohy 		niarg = 3
    230       1.1   itohy 	} else if (iarg == "d1/d2=ww") {
    231  1.1.14.1  bouyer 		print "\tmovel\t%sp@(" argoff "),%d1"
    232  1.1.14.1  bouyer 		print "\tmovew\t%sp@(" argoff + 6 "),%d2"
    233  1.1.14.1  bouyer 		print "\tswap\t%d2"
    234  1.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%d0-%d1/%a1"
    238  1.1.14.1  bouyer 		print "\tswap\t%d1"
    239  1.1.14.1  bouyer 		print "\tmovew\t%d0,%d1"
    240  1.1.14.1  bouyer 		print "\tswap\t%d1"
    241       1.1   itohy 		niarg = 3
    242       1.1   itohy 	} else if (iarg == "d1=ww/d2=ww") {
    243  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%d1-%d2"
    244  1.1.14.1  bouyer 		print "\tswap\t%d1"
    245  1.1.14.1  bouyer 		print "\tmovew\t%d2,%d1"
    246  1.1.14.1  bouyer 		print "\tmovew\t%sp@(" argoff + 10 "),%d2"
    247  1.1.14.1  bouyer 		print "\tswap\t%d2"
    248  1.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tandl\t#0x80000000,%d1"
    258  1.1.14.1  bouyer 		print "\tmoveb\t%d0,%d1"
    259       1.1   itohy 	}
    260       1.1   itohy 
    261       1.1   itohy 	if (b_curmod) {
    262  1.1.14.1  bouyer 		print "\tmoveq\t#1,%d0"
    263  1.1.14.1  bouyer 		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.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tmoval\t%sp@+,%a0"
    276  1.1.14.1  bouyer 		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.1.14.1  bouyer 				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.1.14.1  bouyer 		print "\tmovel\t%d2,%d0"
    294  1.1.14.1  bouyer 		print "\taddql\t#1,%d0"
    295       1.1   itohy 		print "\tbeqs\tLcachemd"
    296  1.1.14.1  bouyer 		print "\tmoveq\t#2,%d1"
    297  1.1.14.1  bouyer 		print "\taddql\t#1,%d0"
    298       1.1   itohy 		print "\tbnes\tLcachemd"
    299  1.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tcmpl\t%d1,%d2"
    306       1.1   itohy 		print "\tbcss\tLscriocs"
    307  1.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tmoveal\t%sp@(" argoff "),%a0	| inregs"
    313  1.1.14.1  bouyer 		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.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tmoveal\t%sp@(" argoff "),%a0	| outregs"
    326  1.1.14.1  bouyer 		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.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tmoveal\t%sp@(" argoff "),%a0"
    341       1.1   itohy 		argoff += 4
    342  1.1.14.1  bouyer 		print "\tmovel\t%d2,%a0@"
    343       1.1   itohy 	} else if (oarg == "od1 od2 od0") {
    344  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
    345       1.1   itohy 		argoff += 8
    346  1.1.14.1  bouyer 		print "\tmovel\t%d1,%a0@"
    347  1.1.14.1  bouyer 		print "\tmovel\t%d2,%a1@"
    348  1.1.14.1  bouyer 		print "\tmoveal\t%sp@(" argoff "),%a0"
    349       1.1   itohy 		argoff += 4
    350  1.1.14.1  bouyer 		print "\tmovel\t%d0,%a0@"
    351       1.1   itohy 	} else if (oarg == "od2 od3") {
    352  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
    353       1.1   itohy 		argoff += 8
    354  1.1.14.1  bouyer 		print "\tmovel\t%d2,%a0@"
    355  1.1.14.1  bouyer 		print "\tmovel\t%d3,%a1@"
    356       1.1   itohy 	} else if (oarg == "od2 od3 od4 od5") {
    357  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
    358       1.1   itohy 		argoff += 8
    359  1.1.14.1  bouyer 		print "\tmovel\t%d2,%a0@"
    360  1.1.14.1  bouyer 		print "\tmovel\t%d3,%a1@"
    361  1.1.14.1  bouyer 		print "\tmoveml\t%sp@(" argoff "),%a0/%a1"
    362       1.1   itohy 		argoff += 8
    363  1.1.14.1  bouyer 		print "\tmovel\t%d4,%a0@"
    364  1.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tmovel\t%d2,%d0"
    377       1.1   itohy 
    378       1.1   itohy 	# RESTORE REGISTERS
    379       1.1   itohy 	if (iocs_trap15) {
    380  1.1.14.1  bouyer 		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.1.14.1  bouyer 				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.1.14.1  bouyer 		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.1.14.1  bouyer 		print "\tjmp\t%a0@"
    395  1.1.14.1  bouyer 	else if (!noret) {
    396  1.1.14.1  bouyer 		if (ptrval)
    397  1.1.14.1  bouyer 			print "#ifdef __SVR4_ABI__\n\tmoveal\t%d0,%a0\n#endif"
    398       1.1   itohy 		print "\trts"
    399  1.1.14.1  bouyer 	}
    400       1.1   itohy }
    401