EM_TABLE=$1
argtype=$2
echo "switch(p->em_opcode) {"
for i in - cdflnorswz p b
do
	list=`$argtype $i $EM_TABLE`
	case $i in
	-)	args='()'
		echo "	/* no arguments */"
		;;
	cdflnorswz)
		args='(p->em_cst)'
		echo "	/* one integer constant argument */"
		;;
	p)
		args='(p->em_pnam)'
		echo "	/* a procedure name argument */"
		;;
	b)

: Grumbl, an instruction label as argument is encoded in a sp_cst2

		args='((label) (p->em_cst))'
		echo "	/* An instruction label argument */"
		;;
	esac
	for i in $list
	do
		cat << EOF
	case op_$i:
		C_$i$args;
		break;
EOF
	done
done
list=`$argtype g $EM_TABLE`
cat << 'EOF'
	default:
/* a "g" argument */
		if (p->em_argtype == nof_ptyp) {
			switch(p->em_opcode) {
				default:
					C_error = "Illegal mnemonic";
					break;
EOF
for i in $list
do
	cat << EOF
				case op_$i:
					C_${i}_dlb(p->em_dlb, p->em_off);
					break;
EOF
done
cat << 'EOF'
			}
		}
		else if (p->em_argtype == sof_ptyp) {
			switch(p->em_opcode) {
				default:
					C_error = "Illegal mnemonic";
					break;
EOF
for i in $list
do
	cat << EOF
				case op_$i:
					C_${i}_dnam(p->em_dnam, p->em_off);
					break;
EOF
done
cat << 'EOF'
			}
		}
		else /*argtype == cst_ptyp */ {
			switch(p->em_opcode) {
				default:
					C_error = "Illegal mnemonic";
					break;
EOF
for i in $list
do
	cat << EOF
				case op_$i:
					C_$i(p->em_cst);
					break;
EOF
done
cat << 'EOF'
			}
		}
}
EOF