Adapted for use of ACK VAX assembler

This commit is contained in:
ceriel 1990-01-12 17:05:42 +00:00
parent 7babff444a
commit 0ce4d37e54
3 changed files with 34 additions and 85 deletions

View file

@ -42,7 +42,7 @@ con_mult(sz)
{ {
if (sz != 4) if (sz != 4)
fatal("bad icon/ucon size"); fatal("bad icon/ucon size");
fprintf(codefile,".long\t%s\n",str); fprintf(codefile,".data4\t%s\n",str);
} }
mes(mesno) mes(mesno)
@ -51,40 +51,15 @@ mes(mesno)
while (getarg(any_ptyp) != sp_cend ); while (getarg(any_ptyp) != sp_cend );
} }
con_float() #define PDPFLOAT
{ #define CODE_GENERATOR
/* #include <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);
}
#ifndef REGVARS #ifndef REGVARS
prolog(nlocals) prolog(nlocals)
full nlocals; full nlocals;
{ {
fprintf(codefile,".word 00\n"); fprintf(codefile,".data2 00\n");
if (nlocals == 0) if (nlocals == 0)
return; return;
if (nlocals == 4) if (nlocals == 4)
@ -98,10 +73,10 @@ prolog(nlocals)
#endif not REGVARS #endif not REGVARS
char *segname[] = { char *segname[] = {
".text", /* SEGTXT */ ".sect .text", /* SEGTXT */
".data", /* SEGCON */ ".sect .data", /* SEGCON */
".data", /* SEGROM */ ".sect .rom", /* SEGROM */
".data" /* SEGBSS */ ".sect .bss" /* SEGBSS */
}; };
#ifdef REGVARS #ifdef REGVARS
@ -149,7 +124,7 @@ regsave(str, off, size)
p_reg->sr_off = off; p_reg->sr_off = off;
(p_reg++)->sr_size = size; (p_reg++)->sr_size = size;
fprintf(codefile, fprintf(codefile,
"\t# Local %ld, size %d, to register %s\n", "\t! Local %ld, size %d, to register %s\n",
off, size, str off, size, str
); );
} }
@ -182,7 +157,7 @@ f_regsave()
/* /*
* Now generate code to save registers. * 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. * Emit code to initialize parameters in registers.
*/ */

View file

@ -3,27 +3,29 @@
* See the copyright notice in the ACK home directory, in the file "Copyright". * See the copyright notice in the ACK home directory, in the file "Copyright".
*/ */
/* $Header$ */ /* $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 in_ap(x) /* nothing */
#define newilb(x) fprintf(codefile,"%s:\n",x) #define newilb(x) fprintf(codefile,"%s:\n",x)
#define newdlb(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 newplb(x) fprintf(codefile,".align 1\n%s:\n",x)
#define dlbdlb(s1,s2) fprintf(codefile,".data\n%s:\n",s1) #define dlbdlb(s1,s2) fprintf(codefile,"%s = %s\n",s1, s2)
#define newlbss(l,x) fprintf(codefile,".lcomm\t%s,%d\n",l,x); #define newlbss(l,x) fprintf(codefile,".comm\t%s,%ld\n",l,x);
#define cst_fmt "%ld" #define cst_fmt "%ld"
#define off_fmt "%ld" #define off_fmt "%ld"
#define ilb_fmt "L%xL%x" #define ilb_fmt "I%x_%x"
#define dlb_fmt "_%d" #define dlb_fmt "I_%d"
#define hol_fmt "hol%d" #define hol_fmt "hol%d"
#define fmt_id(fr,to) sprintf(to,"_%s",fr) #define fmt_id(fr,to) sprintf(to,"_%s",fr)
#define hol_off "%ld+hol%d" #define hol_off "%ld+hol%d"
#define con_cst(w) fprintf(codefile,".long\t%ld\n",w) #define con_cst(w) fprintf(codefile,".data4\t%ld\n",w)
#define con_ilb(x) fprintf(codefile,".long\t%s\n",x) #define con_ilb(x) fprintf(codefile,".data4\t%s\n",x)
#define con_dlb(x) fprintf(codefile,".long\t%s\n",x) #define con_dlb(x) fprintf(codefile,".data4\t%s\n",x)
#define BSS_INIT 0 #define BSS_INIT 0
#define modhead ".sect .text\n.sect .rom\n.sect .data\n.sect .bss\n"

View file

@ -4,7 +4,7 @@
#define DORCK /* define if you want RCK */ #define DORCK /* define if you want RCK */
#define FLOAT4 /* define if you want better 4-byte FP arithmetic */ #define FLOAT4 /* define if you want better 4-byte FP arithmetic */
#define FLOAT8 /* define if you want better 8-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 assembler, that sometimes generates "*1" for
(r1). This is avoided by generating 0(r1), which is (r1). This is avoided by generating 0(r1), which is
optimized by the assembler to (r1). 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]" CONST2 = {INT num;} 4 cost=(4,3) "$%[num]"
CONST4 = {INT num;} 4 cost=(4,3) "$%[num]" CONST4 = {INT num;} 4 cost=(4,3) "$%[num]"
CONST8 = {STRING ind;} 8 cost=(8,6) "$%[ind]" 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])" LOCAL1 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])"
LOCAL2 = {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])" LOCAL4 = {REGISTER reg; INT num,size;} 4 cost=(2,6) "%[num](%[reg])"
@ -196,7 +194,7 @@ source2 = Xsource2
+ reginc2 + regdec2 + reginc2 + regdec2
#endif REGVARS #endif REGVARS
Xsource4 = REG + regdef4 + displ4 + displdef4 + LocaLBase + Xsource4 = REG + regdef4 + displ4 + displdef4 + LocaLBase +
EXTERNAL4 + reldef4 + CONST + DOUBLE + LOCAL4 + FCONST4 + ind4 EXTERNAL4 + reldef4 + CONST + DOUBLE + LOCAL4 + ind4
source4 = Xsource4 source4 = Xsource4
#ifdef REGVARS #ifdef REGVARS
+ RREG + reginc4 + regdec4 + RREG + reginc4 + regdec4
@ -205,7 +203,7 @@ dups4 = CONST + regdef1 + displ1 + LOCAL1 +
REG + regdef2 + displ2 + LOCAL2 + REG + regdef2 + displ2 + LOCAL2 +
RREG + regdef4 + displ4 + LOCAL4 + DOUBLE RREG + regdef4 + displ4 + LOCAL4 + DOUBLE
Xsource8 = QREG + regdef8 + displ8 + displdef8 + Xsource8 = QREG + regdef8 + displ8 + displdef8 +
EXTERNAL8 + reldef8 + CONST8 + LOCAL8 + FCONST8 EXTERNAL8 + reldef8 + CONST8 + LOCAL8
+ extind8 + displind8 + extdefind8 + displdefind8 + extind8 + displind8 + extdefind8 + displdefind8
source8 = Xsource8 source8 = Xsource8
#ifdef REGVARS #ifdef REGVARS
@ -1652,7 +1650,9 @@ ngf !defined($1) | source1or2or4 |
fif $1==4 | source4 source4 | fif $1==4 | source4 source4 |
allocate(%[1],%[2],REG,REG) allocate(%[1],%[2],REG,REG)
"mulf3\t%[1],%[2],%[a]" "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. * Don't trust the integer part.
* Overflow could occur. * Overflow could occur.
@ -1662,7 +1662,8 @@ fif $1==4 | source4 source4 |
fif $1==8 | source8 source8 | fif $1==8 | source8 source8 |
allocate(%[1],%[2],QREG,QREG) allocate(%[1],%[2],QREG,QREG)
"muld3\t%[1],%[2],%[a]" "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)+" "tstl\t(sp)+"
"subd2\t%[b],%[a]" | %[b] %[a] | | "subd2\t%[b],%[a]" | %[b] %[a] | |
fif !defined($1) | source1or2or4 | fif !defined($1) | source1or2or4 |
@ -1670,18 +1671,11 @@ fif !defined($1) | source1or2or4 |
move(%[1],R0) move(%[1],R0)
"jsb\t.fif" "jsb\t.fif"
erase(R0) | | | erase(R0) | | |
fef $1==4 | sreg4 | fef defined($1) | |
allocate(REG) remove(ALL)
"extzv\t$$7,$$8,%[1],%[a]" move({CONST4, $1}, R0)
"subl2\t$$128,%[a]" "jsb\t.fef"
"insv\t$$128,$$7,$$8,%[1]" erase(R0) | | |
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) | source1or2or4 | fef !defined($1) | source1or2or4 |
remove(ALL) remove(ALL)
move(%[1],R0) move(%[1],R0)
@ -2054,9 +2048,6 @@ zrl zrl $1==$2-4 | | | | zrl $2 zrl $1 |
zre | | remove(externals) zre | | remove(externals)
"clrl\t$1" "clrl\t$1"
setcc({EXTERNAL4,$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) zrf $1==4 | | allocate(REG)
"clrl\t%[a]" | %[a] | | "clrl\t%[a]" | %[a] | |
zrf $1==8 | | allocate(QREG) 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 | loc loc cif ste $1==4 && $2==4 | source4 |
remove(externals) remove(externals)
"cvtlf\t%[1],$4" | | | "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 #endif FLOAT4
loc loc cif $1==4 && $2==4 | source4 | loc loc cif $1==4 && $2==4 | source4 |
allocate(%[1],REG) 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 | loc loc cif sde $1==4 && $2==8 | source4 |
remove(externals) remove(externals)
"cvtld\t%[1],$4" | | | "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 #endif FLOAT8
loc loc cif $1==4 && $2==8 | source4 | loc loc cif $1==4 && $2==8 | source4 |
allocate(%[1],QREG) allocate(%[1],QREG)
@ -4570,14 +4554,6 @@ MOVES:
setcc(%[2]), (2,4)+%[2]) setcc(%[2]), (2,4)+%[2])
(CONST8 %[ind]=="0",source8, "clrq\t%[2]" (CONST8 %[ind]=="0",source8, "clrq\t%[2]"
setcc(%[2]), (2,4)+%[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 #ifdef REGVARS
/* Tokens with side effects should not be remembered. */ /* Tokens with side effects should not be remembered. */
(reginc1+regdec1,reg4, "movzbl\t%[1],%[2]" (reginc1+regdec1,reg4, "movzbl\t%[1],%[2]"
@ -4640,10 +4616,6 @@ STACKS:
(source1,, "movzbl\t%[1],-(sp)", (3,7) + %[1]) (source1,, "movzbl\t%[1],-(sp)", (3,7) + %[1])
(CONST sfit(%[num],16),, (CONST sfit(%[num],16),,
"cvtwl\t%[1],-(sp)", (3,7) + %[1]) "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]) (source2,, "movzwl\t%[1],-(sp)", (3,7) + %[1])
(source4,, "pushl\t%[1]" (source4,, "pushl\t%[1]"
setcc(%[1]), (2,7) + %[1]) setcc(%[1]), (2,7) + %[1])