#if FAMILY==SCJ && OUTPUT==BINARY
PDP 11-SPECIFIC PRINTING ROUTINES
static char textline
[50];
p2pass(sprintf(textline
, "\tjmp\tcret"));
* move argument slot arg1 (relative to ap)
* to slot arg2 (relative to ARGREG)
p2reg(ARGREG
, P2SHORT
|P2PTR
);
p2op2(P2PLUS
, P2SHORT
|P2PTR
);
p2op2(P2INDIRECT
, P2SHORT
);
p2reg(AUTOREG
, P2SHORT
|P2PTR
);
p2op2(P2PLUS
, P2SHORT
|P2PTR
);
p2op2(P2INDIRECT
, P2SHORT
);
p2op2(P2ASSIGN
, P2SHORT
);
p2pass(sprintf(textline
, "\tmov\t%d.(r5),%d.(r4)", m
, n
));
fprintf(fp
, "L%d:\n", k
);
fprintf(fp
, "\t%d.;%d.\n", np
[0], np
[1]);
fprintf(fp
, "\t%d.\n", np
[1]);
fprintf(fp
, "L%ld\n", a
);
n
= &x
; /* nonportable cheat */
k
= (type
==TYREAL
? 2 : 4);
fprintf(fp
, "%d.%c", *n
++, (k
==0 ? '\n' : ';') );
fprintf(asmfile
, "\t.even\n", k
);
prcmgoto(p
, nlab
, skiplabel
, labarray
)
int nlab
, skiplabel
, labarray
;
p2pass(sprintf(textline
, "\ttst\tr0"));
p2pass(sprintf(textline
, "\tbne\tL%d", skiplabel
));
p2pass(sprintf(textline
, "\tcmp\tr%d,$%d.", regno
, nlab
));
p2pass(sprintf(textline
, "\tbhi\tL%d", skiplabel
));
p2pass(sprintf(textline
, "\tasl\tr%d", regno
));
p2pass(sprintf(textline
, "\tjmp\t*L%d(r%d)", labarray
, regno
));
putforce( ptype
= p
->vtype
, p
);
p2pass(sprintf(textline
, "\ttst\tr0"));
p2pass(sprintf(textline
, "\tjlt\tL%d", neg
));
p2pass(sprintf(textline
, "\tjgt\tL%d", pos
));
p2pass(sprintf(textline
, "\ttst\tr1"));
p2pass(sprintf(textline
, "\tjeq\tL%d", zer
));
p2pass(sprintf(textline
, "\tjbr\tL%d", pos
));
p2pass(sprintf(textline
, "\ttstf\tr0"));
p2pass(sprintf(textline
, "\tcfcc"));
p2pass(sprintf(textline
, "\tjeq\tL%d", zer
));
p2pass(sprintf(textline
, "\tjlt\tL%d", neg
));
p2pass(sprintf(textline
, "\tjmp\tL%d", pos
));
sprintf(s
, "_%s", varstr(XL
, extsymtab
[mem
].extname
) );
fatal1("memname: invalid vstg %d", stg
);
fprintf(asmfile
, "%s:", s
);
fprintf(asmfile
, "\t.globl\t_%s\n", name
);
fprintf(asmfile
, "\t.comm\t_%s,%ld.\n", name
, leng
);
p2pass(sprintf(textline
, "\t.globl\tcsv,cret"));
struct addrblock
*argvec
;
register struct nameblock
*q
;
register struct dimblock
*dp
;
struct constblock
*mkaddcon();
prentry( varstr(XL
, ep
->entryname
->extname
) );
fprintf(asmfile
, "L%d:\t. = .+2\n", proflab
);
p2pass(sprintf(textline
, "\tmov\t$L%d,r0", proflab
));
p2pass(sprintf(textline
, "\tjsr\tpc,mcount"));
p2pass(sprintf(textline
, "\tjsr\tr5,csv"));
p2pass(sprintf(textline
, "\tsub\t$.F%d,sp", procno
));
p2op2(P2PROFILE
, proflab
);
p2op2(P2SETSTK
, ( (((int) autoleng
)+1) & ~01) );
addreg( 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
&& ! ISCONST(q
->vleng
) )
mvarg(TYLENG
, argslot
, q
->vleng
->memno
);
for(p
= ep
->arglist
; p
; p
= p
->nextp
)
if(dp
= ( (struct nameblock
*) (p
->datap
) ) ->vdim
)
for(i
= 0 ; i
< dp
->ndim
; ++i
)
puteq( fixtype(cpexpr(dp
->dims
[i
].dimsize
)),
fixtype(cpexpr(dp
->dims
[i
].dimexpr
)));
puteq( cpexpr(fixtype(dp
->baseoffset
)),
cpexpr(fixtype(dp
->basexpr
)));
puteq( cpexpr(typeaddr
), mkaddcon(ep
->typelabel
) );
p2pass(sprintf(textline
, "_%s:", s
));
p2pass(sprintf(textline
, "\tmov\tr5,r4"));
p2pass(sprintf(textline
, "\tadd\t$%d.,r4", k
));
p2op2(P2ASSIGN
, P2SHORT
);
p2triple(P2LBRACKET
, ARGREG
-1-highregvar
, procno
);
p2word( (long) (BITSPERCHAR
*autoleng
) );
fprintf(fp
, "[%02d\t%06ld\t%02d\t\n", procno
,
BITSPERCHAR
*autoleng
, ARGREG
-1-highregvar
);
register struct nameblock
*p
;
if(s
= entries
->entryname
->extname
)
else if(procclass
== CLMAIN
)
fprintf(asmfile
, "~~%s = _%s\n", s
, s
);
for(hp
= hashtab
; hp
<lasthash
; ++hp
)
s
= sprintf(buff
, "%o", p
->vardesc
.varno
+argloc
);
else if(p
->vclass
== CLVAR
)
t
= memname(p
->vstg
, p
->vardesc
.varno
);
s
= sprintf(buff
, "%s+%o", t
, p
->voffset
);
s
= sprintf(buff
, "%s", t
);
s
= sprintf(buff
, "%o", p
->voffset
);
fprintf(asmfile
, "~%s = %s\n", varstr(VL
,p
->varname
), s
);
fprintf(asmfile
, "~~:\n");