If the ncg table uses reglap, then regvar($1, reg_float) would have
two sizes of registers. An error from ncgg would happen if regvar()
was in a token that allows only one size. Now one can pick a size
with regvar_w() for word size or regvar_d() for double-word size.
Add regvar_d and regvar_w as keywords in ncgg. Modify EX_REGVAR to
include the register size. In ncg, add some checks for the register
size. In tables without reglap, regvar() works as before, and ncg
ignores the register size in EX_REGVAR.
After the RA phase of ego, a procedure may put single-word and
double-word values in the same reg_float. Then ncg will use both
LOCAL and DLOCAL tokens at the same offset.
I add isregvar_size() to ncg. It receives the size of the LOCAL or
DLOCAL token, and picks the register of the correct size. This fixes
a problem where ncg got the wrong-size register and corrupted the
stack. This problem caused one of my test programs to segfault from
stack underflow.
Also adjust how fixregvars() handles both sizes.
This is like David Given's change to util/ncgg in d89f172. I need
this change in mach/proto/ncg to see fatal messages, because a 64-bit
pointer doesn't fit in an int.