diff --git a/mach/vax4/cg/mach.c b/mach/vax4/cg/mach.c
index 25c5af74d..698bd6300 100644
--- a/mach/vax4/cg/mach.c
+++ b/mach/vax4/cg/mach.c
@@ -42,7 +42,7 @@ con_mult(sz)
 {
 	if (sz != 4)
 		fatal("bad icon/ucon size");
-	fprintf(codefile,".long\t%s\n",str);
+	fprintf(codefile,".data4\t%s\n",str);
 }
 
 mes(mesno)
@@ -51,40 +51,15 @@ mes(mesno)
 	while (getarg(any_ptyp) != sp_cend );
 }
 
-con_float()
-{
-	/*
-	 * Insert a dot at the right position, if it is not present,
-	 * to make the floating point constant acceptable to the assembler.
-	 */
-	register char	*c;
-	extern char	*index();
-
-	if (argval != 4 && argval != 8)
-		fatal("bad fcon size");
-	if (argval == 8)
-		fprintf(codefile,".double\t0d");
-	else	fprintf(codefile,".float\t0f");
-
-	if (index(str,'.') != (char *) 0) {
-		fprintf(codefile,"%s\n",str);
-	
-	/*
-	 * There must be a dot after the `e' or - if the `e' is not present -
-	 * at the end.
-	 */
-	} else if ((c = index(str,'e')) != (char *) 0) {
-		*c++ = '\0';
-		fprintf(codefile,"%s.e%s\n",str,c--);
-		*c = 'e';
-	} else	fprintf(codefile,"%s.\n",str);
-}
+#define PDPFLOAT
+#define CODE_GENERATOR
+#include <con_float>
 
 #ifndef REGVARS
 prolog(nlocals)
 	full	nlocals;
 {
-	fprintf(codefile,".word 00\n");
+	fprintf(codefile,".data2 00\n");
 	if (nlocals == 0)
 		return;
 	if (nlocals == 4)
@@ -98,10 +73,10 @@ prolog(nlocals)
 #endif not REGVARS
 
 char    *segname[] = {
-	".text",	/* SEGTXT */
-	".data",	/* SEGCON */
-	".data",	/* SEGROM */
-	".data"		/* SEGBSS */
+	".sect .text",	/* SEGTXT */
+	".sect .data",	/* SEGCON */
+	".sect .rom",	/* SEGROM */
+	".sect .bss"	/* SEGBSS */
 };
 
 #ifdef REGVARS
@@ -149,7 +124,7 @@ regsave(str, off, size)
 	p_reg->sr_off = off;
 	(p_reg++)->sr_size = size;
 	fprintf(codefile,
-		"\t# Local %ld, size %d, to register %s\n",
+		"\t! Local %ld, size %d, to register %s\n",
 		off, size, str
 	);
 }
@@ -182,7 +157,7 @@ f_regsave()
 	/*
 	 * Now generate code to save registers.
 	 */
-	fprintf(codefile, ".word 0%o\n", mask);
+	fprintf(codefile, ".data2 0%o\n", mask);
 	/*
 	 * Emit code to initialize parameters in registers.
 	 */
diff --git a/mach/vax4/cg/mach.h b/mach/vax4/cg/mach.h
index 0ef86532a..3c7442d93 100644
--- a/mach/vax4/cg/mach.h
+++ b/mach/vax4/cg/mach.h
@@ -3,27 +3,29 @@
  * See the copyright notice in the ACK home directory, in the file "Copyright".
  */
 /* $Header$ */
-#define ex_ap(x)	fprintf(codefile,".globl\t%s\n",x)
+#define ex_ap(x)	fprintf(codefile,".extern\t%s\n",x)
 #define in_ap(x)	/* nothing */
 
 #define newilb(x)	fprintf(codefile,"%s:\n",x)
 #define newdlb(x)	fprintf(codefile,"%s:\n",x)
 #define newplb(x)	fprintf(codefile,".align 1\n%s:\n",x)
-#define	dlbdlb(s1,s2)	fprintf(codefile,".data\n%s:\n",s1)
-#define	newlbss(l,x)	fprintf(codefile,".lcomm\t%s,%d\n",l,x);
+#define	dlbdlb(s1,s2)	fprintf(codefile,"%s = %s\n",s1, s2)
+#define	newlbss(l,x)	fprintf(codefile,".comm\t%s,%ld\n",l,x);
 
 #define cst_fmt		"%ld"
 #define	off_fmt		"%ld"
-#define ilb_fmt		"L%xL%x"
-#define dlb_fmt		"_%d"
+#define ilb_fmt		"I%x_%x"
+#define dlb_fmt		"I_%d"
 #define	hol_fmt		"hol%d"
 
 #define fmt_id(fr,to)	sprintf(to,"_%s",fr)
 
 #define hol_off		"%ld+hol%d"
 
-#define con_cst(w)	fprintf(codefile,".long\t%ld\n",w)
-#define con_ilb(x)	fprintf(codefile,".long\t%s\n",x)
-#define con_dlb(x)	fprintf(codefile,".long\t%s\n",x)
+#define con_cst(w)	fprintf(codefile,".data4\t%ld\n",w)
+#define con_ilb(x)	fprintf(codefile,".data4\t%s\n",x)
+#define con_dlb(x)	fprintf(codefile,".data4\t%s\n",x)
 
 #define BSS_INIT	0
+
+#define modhead		".sect .text\n.sect .rom\n.sect .data\n.sect .bss\n"
diff --git a/mach/vax4/cg/table b/mach/vax4/cg/table
index b26172fba..d897976bc 100644
--- a/mach/vax4/cg/table
+++ b/mach/vax4/cg/table
@@ -4,7 +4,7 @@
 #define DORCK		/* define if you want RCK */
 #define FLOAT4		/* define if you want better 4-byte FP arithmetic */
 #define FLOAT8		/* define if you want better 8-byte FP arithmetic */
-#define ASBUG_AVOID	/* define if you want to avoid a bug in the BSD 4.1 VAX
+/* #define ASBUG_AVOID	/* define if you want to avoid a bug in the BSD 4.1 VAX
 			   assembler, that sometimes generates "*1" for
 			   (r1). This is avoided by generating 0(r1), which is
 			   optimized by the assembler to (r1).
@@ -87,8 +87,6 @@ CONST1 =	{INT num;}		4 cost=(4,3)  "$%[num]"
 CONST2 =	{INT num;}		4 cost=(4,3)  "$%[num]"
 CONST4 =	{INT num;}		4 cost=(4,3)  "$%[num]"
 CONST8 =	{STRING ind;}		8 cost=(8,6)  "$%[ind]"
-FCONST4 =	{INT num;}		4 cost=(4,3)  "$0f%[num].0"
-FCONST8 =	{INT num;}		8 cost=(8,6)  "$0f%[num].0"
 LOCAL1 =	{REGISTER reg; INT num,size;}	4 cost=(2,6)  "%[num](%[reg])"
 LOCAL2 =	{REGISTER reg; INT num,size;}	4 cost=(2,6)  "%[num](%[reg])"
 LOCAL4 =	{REGISTER reg; INT num,size;}	4 cost=(2,6)  "%[num](%[reg])"
@@ -196,7 +194,7 @@ source2 =	Xsource2
 		+ reginc2 + regdec2
 #endif REGVARS
 Xsource4 =	REG + regdef4 + displ4 + displdef4 + LocaLBase +
-		EXTERNAL4 + reldef4 + CONST + DOUBLE + LOCAL4 + FCONST4 + ind4
+		EXTERNAL4 + reldef4 + CONST + DOUBLE + LOCAL4 + ind4
 source4 =	Xsource4
 #ifdef REGVARS
 		+ RREG + reginc4 + regdec4
@@ -205,7 +203,7 @@ dups4 =		CONST + regdef1 + displ1 + LOCAL1 +
 		REG +	regdef2 + displ2 + LOCAL2 +
 		RREG +	regdef4 + displ4 + LOCAL4 + DOUBLE
 Xsource8 =	QREG + regdef8 + displ8 + displdef8 +
-		EXTERNAL8 + reldef8 + CONST8 + LOCAL8 + FCONST8
+		EXTERNAL8 + reldef8 + CONST8 + LOCAL8
 		+ extind8 + displind8 + extdefind8 + displdefind8
 source8 =	Xsource8
 #ifdef REGVARS
@@ -1652,7 +1650,9 @@ ngf !defined($1) | source1or2or4 |
 fif $1==4	| source4 source4 |
 			allocate(%[1],%[2],REG,REG)
 			"mulf3\t%[1],%[2],%[a]"
-			"emodf\t%[a],$$0,$$0f1.0,-(sp),%[b]"
+			/* the assembler does not do immediate floating point */
+			"cvtlf $$1,%[b]"
+			"emodf\t%[a],$$0,%[b],-(sp),%[b]"
 			/*
 			 * Don't trust the integer part.
 			 * Overflow could occur.
@@ -1662,7 +1662,8 @@ fif $1==4	| source4 source4 |
 fif $1==8	| source8 source8 |
 			allocate(%[1],%[2],QREG,QREG)
 			"muld3\t%[1],%[2],%[a]"
-			"emodd\t%[a],$$0,$$0f1.0,-(sp),%[b]"
+			"cvtld $$1,%[b]"
+			"emodd\t%[a],$$0,%[b],-(sp),%[b]"
 			"tstl\t(sp)+"
 			"subd2\t%[b],%[a]"	| %[b] %[a]	| |
 fif !defined($1) | source1or2or4 |
@@ -1670,18 +1671,11 @@ fif !defined($1) | source1or2or4 |
 			move(%[1],R0)
 			"jsb\t.fif"
 			erase(R0)		|	| |
-fef $1==4	| sreg4 |
-			allocate(REG)
-			"extzv\t$$7,$$8,%[1],%[a]"
-			"subl2\t$$128,%[a]"
-			"insv\t$$128,$$7,$$8,%[1]" 
-			erase(%[1])		| %[1] %[a] | |
-fef $1==8	| sreg8 |
-			allocate(REG)
-			"extzv\t$$7,$$8,%[1],%[a]"
-			"subl2\t$$128,%[a]"
-			"insv\t$$128,$$7,$$8,%[1]" 
-			erase(%[1])		| %[1] %[a] | |
+fef defined($1)	| |
+			remove(ALL)
+			move({CONST4, $1}, R0)
+			"jsb\t.fef"
+			erase(R0)		|	| |
 fef !defined($1) | source1or2or4 |
 			remove(ALL)
 			move(%[1],R0)
@@ -2054,9 +2048,6 @@ zrl zrl $1==$2-4 | |				|	| zrl $2 zrl $1 |
 zre		| |	remove(externals)
 			"clrl\t$1"
 			setcc({EXTERNAL4,$1})	|	| |
-/* Avoid a bug in the VAX assembler, that handles $0f0.0 wrong.
-   So, do NOT create {FCONST[4|8], 0}!
-*/
 zrf $1==4	| |	allocate(REG)
 			"clrl\t%[a]"		| %[a]	| |
 zrf $1==8	| |	allocate(QREG)
@@ -2249,8 +2240,6 @@ loc loc cif stl $1==4 && $2==4 && $4>=0
 loc loc cif ste $1==4 && $2==4	| source4 |
 			remove(externals)
 			"cvtlf\t%[1],$4"	|	| |
-loc loc loc cif $1!=0 && $2==4 && $3==4	| |	| {FCONST4, $1} | |
-/* $1 != 0: kludge to avoid bug in VAX assembler */
 #endif FLOAT4
 loc loc cif $1==4 && $2==4	| source4 |
 			allocate(%[1],REG)
@@ -2279,11 +2268,6 @@ loc loc cif sdl $1==4 && $2==8 && $4>=0
 loc loc cif sde $1==4 && $2==8	| source4 |
 			remove(externals)
 			"cvtld\t%[1],$4"	|	| |
-loc loc loc cif $1!=0 && $2==4 && $3==8	| |	| {FCONST8,$1}	| |
-/* $1!=0: kludge to avoid known bug in Vax assembler, that
- * doesn't handle 0f0.0 (and other numbers that have the 0x4000 bit off
- * in the exponent) right.
- */
 #endif FLOAT8
 loc loc cif $1==4 && $2==8	| source4 |
 			allocate(%[1],QREG)
@@ -4570,14 +4554,6 @@ MOVES:
 				setcc(%[2]),		(2,4)+%[2])
 (CONST8 %[ind]=="0",source8,	"clrq\t%[2]"
 				setcc(%[2]),		(2,4)+%[2])
-(FCONST4 %[num]==0,source4,	"clrl\t%[2]"
-				setcc(%[2]),		(2,4)+%[2])
-(FCONST4,source4,		"movf\t%[1],%[2]"
-				setcc(%[2]),		(3,4)+%[1]+%[2])
-(FCONST8 %[num]==0,source8,	"clrq\t%[2]"
-				setcc(%[2]),		(2,4)+%[2])
-(FCONST8,source8,		"movd\t%[1],%[2]"
-				setcc(%[2]),		(3,4)+%[1]+%[2])
 #ifdef REGVARS
 /* Tokens with side effects should not be remembered. */
 (reginc1+regdec1,reg4,		"movzbl\t%[1],%[2]"
@@ -4640,10 +4616,6 @@ STACKS:
 (source1,,	"movzbl\t%[1],-(sp)",	(3,7) + %[1])
 (CONST sfit(%[num],16),,
 		"cvtwl\t%[1],-(sp)",	(3,7) + %[1])
-(FCONST4,,	"pushl\t%[1]",		(2,7) + %[1])
-(FCONST8 %[num]==0,,
-		"clrq\t-(sp)",		(2,10))
-(FCONST8,,	"movd\t%[1],-(sp)",	(3,10) + %[1])
 (source2,,	"movzwl\t%[1],-(sp)",	(3,7) + %[1])
 (source4,,	"pushl\t%[1]"
 		setcc(%[1]),		(2,7) + %[1])