[net.micro.atari16] Yet another Megamax bug

braner@batcomputer.TN.CORNELL.EDU (braner) (08/27/86)

[]

The following program will never exit:

-------------------------------------------------
#include <stdio.h>
long n;
subr()
{
	register int	j;
	j = (97 * n) / 12345;	/* integer result, long intermediate	*/
}
main()
{
	register long	i;
	for (i=0; i<0x20000; i++) {
		subr();
		if ((i&0xFFF) == 0)
			printf("t = %lx\n", i);
	}
}
------------------------------------------------

The reason is that subr() is compiled into: (excerpt)

	MOVE	D7,-(A7)	/* save the "register int j" space,        */
	MOVE.L	#97,D7		/*  but use it as "register long scratch", */
				/*  upper word of main's i gets clobbered! */
	...

(If you declare > 1 register, MOVEM.L ,-(A7) is used, so no problem.)
This is especially surprising because in MOST other cases the compiler
moves register vars into a scratch register (D0) before doing ANYTHING
with them, which is a waste of time and space.  For example:

	register int	i, k;
	i = i + k;

compiles into (even if mmimp'roved):

	MOVE	D7,D0
	ADD	D6,D0
	MOVE	D0,D7

You would think that that's because while evaluating "i + k", the
stupid compiler doesn't know yet that it is not going to keep the old
value of i, i.e. it could say "j = i + k". But look:

	register int	i, j, k;
	i = j + k;

compiles into:

	MOVE	D6,D7
	ADD	D5,D7

- i.e. in the former example the compiler is not stupid, just lazy!

Anybody at Megamax listening?

Disclaimer: Although I AM disappointed that I have to spend so much time
debugging a compiler I spent $200 on (and get no rebate...), I still think
that the Megamax compiler is the best we have right now.  But, if anybody
has had experience with the brand new Mark Williams compiler/shell, please
let us know! (bug density, speed of compilation, quality of code...)
At something like $125 for compiler AND shell it MIGHT be a bargain, unless
you have already spent your money on such things.  But then, the compiler
output products might work with the shell's I/O redirection...

- Moshe Braner

Corson Hall,  Cornell U.,  Ithaca  NY 14853    607-272-3487