#!/bin/sh
#------------------------------------------------------------------------------
# generate MC68881.s from MC68881.od
# afb 7/89
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# assumptions about MC68881.od
#    procedures with beginning F corresponds to monadic ops of the 68881
#    the procedure names are given in upper case letters and are
#       68881 mnemonics
#------------------------------------------------------------------------------

# parameters
	: ${oc:=oc}
	: ${ocflags:="-OC -OT"}

# tunables
	definition=MC68881.od
	module=MC68881.om
	out=MC68881.s
	lib=libo.a
	tmp=make$$

	trap "rm -f $tmp; exit" 0 1 2 3 15

[ -r $definition ] || { echo >&2 "cannot read $definition"; exit 1; }

rm -f $module && cat $definition >$module
ed - $module <<"eof"
/DEFINITION/s//MODULE/
/CONST/i
   IMPORT SYS := SYSTEM;

.
g/PROCEDURE/s/PROCEDURE \([A-Z][a-zA-Z0-9]*\)(.*/&\
   BEGIN\
   END \1;\
/
g/PROCEDURE F[A-Z]/+a\
      RETURN ABS(x)\
.
/PROCEDURE GetExceptionEnable/+a
      exceptions := {};
.
/PROCEDURE SetExceptionEnable/+a
      exceptions := {};
.
/PROCEDURE GetRoundingMode/+a
      precision := 1;
      mode := 2;
.
/PROCEDURE SetRoundingMode/+a
      precision := 1;
      mode := 2;
.
/PROCEDURE RealToFloat/+a
      SYS.MOVE(real, float, floatlen);
.
/PROCEDURE FloatToReal/+a
      SYS.MOVE(float, real, floatlen);
.
w
eof

cmp -s $definition $module && { echo >&2 "ed failed"; exit 1; }
eval $oc $ocflags -S $module || { echo >&2 "$oc failed"; exit 1; }

sed '/list of VAR-parameters/d
/PROCEDURE F[A-Z]/{
	y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
	s/procedure f/PROCEDURE F/
}' <$out | grep -v 'type tag of' >$tmp && mv $tmp $out

ex - $out <<"eof"
g/PROCEDURE F[a-z][a-z0-9]* /ka\
/fabsx/kb\
'at'b\
'b,'b+1j\
s/fabsx\(.*\)..   PROCEDURE F\(.*\)...$/f\2x\1/
/PROCEDURE GetExceptionEnable/;/movl.#0,/s/movl.#0,/movl	d0,/
i
	fmovel	fpcr,d0
	andl	#0xff00,d0
	lsll	#8,d0
	lsll	#8,d0
.
/PROCEDURE SetExceptionEnable/;/movl.#0,/s/movl.#0,\(.*\)$/movl	\1,d0/
a
	lsrl	#8,d0
	lsrl	#8,d0
	andl	#0xff00,d0
	fmovel	fpcr,d1
	andl	#0xff,d1
	orl	d1,d0
	fmovel	d0,fpcr
.
/PROCEDURE GetRoundingMode/;/movl.#1,/s/movl.#1,/movl	d1,/
i
	fmovel	fpcr,d0
	bfextu	d0{#24:#2},d1
	bfextu	d0{#26:#2},d2
.
/movl.#2,/s/movl.#2,/movl	d2,/
/PROCEDURE SetRoundingMode/;/movl.#1,/s/movl.#1,\(.*\)$/movl	\1,d1/
/movl.#2,/s/movl.#2,\(.*\)$/movl	\1,d2/
a
	fmovel	fpcr,d0
	bfins	d1,d0{#24:#2}
	bfins	d2,d0{#26:#2}
	fmovel	d0,fpcr
.
/PROCEDURE RealToFloat/;/movl/s/movl	a0@,a1@/fmovex	a0@,fp1/
a
	fmoves	fp1,a1@
.
/PROCEDURE FloatToReal/;/movl	a0@,a1@/s//fmoves	a0@,fp1/
a
	fmovex	fp1,a1@
.
w
eof

eval $oc $ocflags -o $lib $out
