PDP11-780/VAX - SPECIFIC PRINTING ROUTINES
static char textline
[50];
int maxregvar
= MAXREGVAR
;
int regnum
[] = { 11, 10, 9, 8, 7, 6 } ;
static int regmask
[] = { 0, 0x800, 0xc00, 0xe00, 0xf00, 0xf80, 0xfc0 };
p2pass( sprintf(textline
, "\t.word\t0x%x", regmask
[highregvar
]) ); /* register variable mask */
fprintf(asmfile
, "L%d:\t.space\t4\n", proflab
);
p2pass( sprintf(textline
, "\tmovab\tL%d,r0", proflab
) );
p2pass( sprintf(textline
, "\tjsb\tmcount") );
p2pass( sprintf(textline
, "\tsubl2\t$.F%d,sp", procno
) );
p2pass( sprintf(textline
, "\tret") );
* move argument slot arg1 (relative to ap)
* to slot arg2 (relative to ARGREG)
p2pass( sprintf(textline
, "\tmovl\t%d(ap),%d(fp)", arg1
+ARGOFFSET
, arg2
+argloc
) );
fprintf(fp
, "L%d:\n", k
);
fprintf(fp
, "\t%s\t%ld\n", (type
==TYSHORT
? ".word" : ".long"), n
);
fprintf(fp
, "\t.long\tL%ld\n", a
);
fprintf(fp
, "\t%s\t0f%e\n", (type
==TYREAL
? ".float" : ".double"), x
);
n
= &x
; /* nonportable cheat */
fprintf(fp
, "\t.long\t0x%X\n", n
[0]);
fprintf(fp
, "\t.long\t0x%X,0x%X\n", n
[0], n
[1]);
fprintf(asmfile
, "\t.align\t%d\n", lg
);
vaxgoto(index
, nlab
, labs
)
struct labelblock
*labs
[];
p2pass( sprintf(textline
, "\tcasel\tr0,$1,$%d", nlab
-1) );
p2pass( sprintf(textline
, "L%d:", arrlab
= newlabel() ) );
for(i
= 0; i
< nlab
; ++i
)
p2pass( sprintf(textline
, "\t.word\tL%d-L%d", labs
[i
]->labelno
, arrlab
) );
p2pass( sprintf(textline
, "\ttstl\tr0") );
p2pass( sprintf(textline
, "\ttstd\tr0") );
p2pass( sprintf(textline
, "\tjlss\tL%d", neg
) );
p2pass( sprintf(textline
, "\tjeql\tL%d", zer
) );
p2pass( sprintf(textline
, "\tjbr\tL%d", pos
) );
sprintf(s
, "_%s", varstr(XL
, extsymtab
[mem
].extname
) );
fatal1("memname: invalid vstg %d", stg
);
fprintf(asmfile
, "\t.lcomm\t%s,%ld\n", s
, len
);
fprintf(asmfile
, "\t.globl\t_%s\n", name
);
fprintf(asmfile
, "\t.comm\t_%s,%ld\n", name
, leng
);
struct addrblock
*argvec
;
register struct nameblock
*q
;
register struct dimblock
*dp
;
p2pass( sprintf(textline
, "_%s:", varstr(XL
, ep
->entryname
->extname
)) );
argloc
= argvec
->memoffset
->const.ci
;
mvarg(TYADDR
, 0, chslot
);
mvarg(TYLENG
, SZADDR
, chlgslot
);
argslot
= SZADDR
+ SZLENG
;
else if( ISCOMPLEX(proctype
) )
mvarg(TYADDR
, 0, cxslot
);
for(p
= ep
->arglist
; p
; p
=p
->nextp
)
mvarg(TYADDR
, argslot
, q
->vardesc
.varno
);
for(p
= ep
->arglist
; p
; p
= p
->nextp
)
if(q
->vtype
==TYCHAR
|| q
->vclass
==CLPROC
)
if(q
->vleng
&& q
->vleng
->tag
!=TCONST
)
mvarg(TYLENG
, argslot
, q
->vleng
->vardesc
.varno
);
p2pass( sprintf(textline
, "\taddl3\t$%d,fp,ap", argloc
-ARGOFFSET
) );
for(p
= ep
->arglist
; p
; p
= p
->nextp
)
for(i
= 0 ; i
< dp
->ndim
; ++i
)
puteq( fixtype(cpexpr(dp
->dims
[i
].dimsize
)),
fixtype(cpexpr(dp
->dims
[i
].dimexpr
)));
size
= typesize
[ q
->vtype
];
/* on VAX, get more efficient subscripting if subscripts
have zero-base, so fudge the argument pointers for arrays.
Not done if array bounds are being checked.
puteq( cpexpr(fixtype(dp
->baseoffset
)),
cpexpr(fixtype(dp
->basexpr
)));
fixtype( mkexpr(OPSTAR
, ICON(size
),
cpexpr(dp
->baseoffset
)) ));
p2pass( sprintf(textline
, "\tsubl2\tr0,%d(ap)",
p
->datap
->vardesc
.varno
+ ARGOFFSET
) );
else if(!checksubs
&& dp
->baseoffset
->const.ci
!=0)
p2pass( sprintf(textline
, "\tsubl2\t$%ld,%d(ap)",
dp
->baseoffset
->const.ci
* size
,
p
->datap
->vardesc
.varno
+ ARGOFFSET
) );
puteq( cpexpr(typeaddr
), mkaddcon(ep
->typelabel
) );
p2triple(P2LBRACKET
, ARGREG
-highregvar
, procno
);
p2word( (long) (BITSPERCHAR
*autoleng
) );
fprintf(fp
, "[%02d\t%06ld\t%02d\t\n", procno
,
BITSPERCHAR
*autoleng
, ARGREG
-highregvar
);