diff --git a/mach/pdp/as/mach0.c b/mach/pdp/as/mach0.c new file mode 100644 index 000000000..cd5836ce0 --- /dev/null +++ b/mach/pdp/as/mach0.c @@ -0,0 +1,15 @@ +#define RCSID0 "$Header$" + +/* + * PDP 11 machine dependent options + */ + +#define THREE_PASS +#define WORDS_REVERSED +#define LISTING +#define RELOCATION + +#undef ALIGNWORD +#define ALIGNWORD 2 +#undef ALIGNSECT +#define ALIGNSECT 2 diff --git a/mach/pdp/as/mach1.c b/mach/pdp/as/mach1.c new file mode 100644 index 000000000..73aeed329 --- /dev/null +++ b/mach/pdp/as/mach1.c @@ -0,0 +1,35 @@ +#define RCSID1 "$Header$" + +# +/* + * PDP 11 Machine dependent C declarations + */ + +/* Addressing modes */ +#define RMODE 00 +#define AIMODE 020 +#define ADMODE 040 +#define INDMODE 060 +#define RDEFMODE 010 +#define AIDEFMODE 030 +#define ADDEFMODE 050 +#define INDDEFMODE 070 + +#define OPLDF 0172400 +#define OPSTF 0174000 +#define OPSOB 077000 +#define OPBRA 0400 + +#define low3(z) (((short) z) & 07) +#define low6(z) (((short) z) & 077) +#define low7(z) (((short) z) & 0177) + +#define fit3(z) (low3(z) == (z)) +#define fit6(z) (low6(z) == (z)) +#define fit8(z) (lowb(z) == (z)) + +extern expr_t exp_1, exp_2; +extern int rel_1, rel_2; +extern int im1flag INIT(0); +extern int im2flag INIT(0); +extern valu_t adjust(); diff --git a/mach/pdp/as/mach2.c b/mach/pdp/as/mach2.c new file mode 100644 index 000000000..72fcbe951 --- /dev/null +++ b/mach/pdp/as/mach2.c @@ -0,0 +1,36 @@ +#define RCSID2 "$Header$" + +/* +* PDP 11 machine dependent yacc declarations +*/ +%token REG +%token FREG +%token FRSP +%token JMP +%token OP_SO +%token OP_DO +%token OP_R_SO +%token BR +%token EJMP +%token JSR +%token RTS +%token MARK +%token SOB +%token SPL +%token TRAP +%token OP_NO +%token OP_SO_R +%token MFP +%token FOP_FSO_FR +%token FOP_NO +%token FOP_FSO +%token FOP_SO +%token MOVF +%token FOP_SO_FR +%token FOP_FR_SO +%token FOP_FR_FSO +%token CLEARCC +%token SETCC + +%type opr1, opr2, op2, fopr2, fopr1, ari, ainc, adec +%type fop2, clcc, secc, fregister diff --git a/mach/pdp/as/mach3.c b/mach/pdp/as/mach3.c new file mode 100644 index 000000000..124787142 --- /dev/null +++ b/mach/pdp/as/mach3.c @@ -0,0 +1,152 @@ +#define RCSID3 "$Header$" + +/*, + * PDP 11 keywords, + */ +0, REG, 00, "r0", +0, REG, 01, "r1", +0, REG, 02, "r2", +0, REG, 03, "r3", +0, REG, 04, "r4", +0, REG, 05, "r5", +0, REG, 06, "r6", +0, REG, 06, "sp", +0, REG, 07, "r7", +0, REG, 07, "pc", +0, FREG, 00, "fr0", +0, FREG, 01, "fr1", +0, FREG, 02, "fr2", +0, FREG, 03, "fr3", +0, FRSP, 04, "fr4", +0, FRSP, 05, "fr5", +0, OP_SO, 05000, "clr", +0, OP_SO, 0105000, "clrb", +0, OP_SO, 05100, "com", +0, OP_SO, 0105100, "comb", +0, OP_SO, 005200, "inc", +0, OP_SO, 0105200, "incb", +0, OP_SO, 005300, "dec", +0, OP_SO, 0105300, "decb", +0, OP_SO, 005400, "neg", +0, OP_SO, 0105400, "negb", +0, OP_SO, 005700, "tst", +0, OP_SO, 0105700, "tstb", +0, OP_SO, 006200, "asr", +0, OP_SO, 0106200, "asrb", +0, OP_SO, 006300, "asl", +0, OP_SO, 0106300, "aslb", +0, OP_SO, 006000, "ror", +0, OP_SO, 0106000, "rorb", +0, OP_SO, 006100, "rol", +0, OP_SO, 0106100, "rolb", +0, OP_SO, 000300, "swab", +0, OP_SO, 005500, "adc", +0, OP_SO, 0105500, "adcb", +0, OP_SO, 005600, "sbc", +0, OP_SO, 0105600, "sbcb", +0, OP_SO, 006700, "sxt", +0, OP_SO, 0100, "jmp", +0, OP_DO, 010000, "mov", +0, OP_DO, 0110000, "movb", +0, OP_DO, 020000, "cmp", +0, OP_DO, 0120000, "cmpb", +0, OP_DO, 060000, "add", +0, OP_DO, 0160000, "sub", +0, OP_DO, 030000, "bit", +0, OP_DO, 0130000, "bitb", +0, OP_DO, 040000, "bic", +0, OP_DO, 0140000, "bicb", +0, OP_DO, 050000, "bis", +0, OP_DO, 0150000, "bisb", +0, OP_R_SO, 074000, "xor", +0, JMP, 0100, "jmp", +0, BR, 0400, "br", +0, BR, 01000, "bne", +0, BR, 01400, "beq", +0, BR, 0100000, "bpl", +0, BR, 0100400, "bmi", +0, BR, 0102000, "bvc", +0, BR, 0102400, "bvs", +0, BR, 0103000, "bcc", +0, BR, 0103400, "bcs", +0, BR, 002000, "bge", +0, BR, 002400, "blt", +0, BR, 003000, "bgt", +0, BR, 003400, "ble", +0, BR, 0101000, "bhi", +0, BR, 0101400, "blos", +0, BR, 0103000, "bhis", +0, BR, 0103400, "blo", +0, EJMP, 0400, "jbr", +0, EJMP, 01000, "jne", +0, EJMP, 01400, "jeq", +0, EJMP, 0100000, "jpl", +0, EJMP, 0100400, "jmi", +0, EJMP, 0102000, "jvc", +0, EJMP, 0102400, "jvs", +0, EJMP, 0103000, "jcc", +0, EJMP, 0103400, "jcs", +0, EJMP, 02000, "jge", +0, EJMP, 02400, "jlt", +0, EJMP, 03000, "jgt", +0, EJMP, 03400, "jle", +0, EJMP, 0101000, "jhi", +0, EJMP, 0101400, "jlos", +0, EJMP, 0103000, "jhis", +0, EJMP, 0103400, "jlo", +0, JSR, 004000, "jsr", +0, RTS, 000200, "rts", +0, MARK, 006400, "mark", +0, SOB, 077000, "sob", +0, SPL, 0230, "spl", +0, TRAP, 0104000, "emt", +0, TRAP, 0104400, "trap", +0, TRAP, 0104400, "sys", +0, OP_NO, 03, "bpt", +0, OP_NO, 04, "iot", +0, OP_NO, 02, "rti", +0, OP_NO, 06, "rtt", +0, OP_NO, 0, "halt", +0, OP_NO, 01, "wait", +0, OP_NO, 05, "reset", +0, OP_NO, 0170000, "cfcc", +0, OP_NO, 0170002, "seti", +0, OP_NO, 0170012, "setl", +0, OP_NO, 0170001, "setf", +0, OP_NO, 0170011, "setd", +0, CLEARCC, 0241, "clc", +0, CLEARCC, 0242, "clv", +0, CLEARCC, 0244, "clz", +0, CLEARCC, 0250, "cln", +0, SETCC, 0261, "sec", +0, SETCC, 0262, "sev", +0, SETCC, 0264, "sez", +0, SETCC, 0270, "sen", +0, OP_SO_R, 070000, "mul", +0, OP_SO_R, 071000, "div", +0, OP_SO_R, 072000, "ash", +0, OP_SO_R, 073000, "ashc", +0, MFP, 006500, "mfpi", +0, MFP, 0106500, "mfpd", +0, MFP, 006600, "mtpi", +0, MFP, 0106600, "mtpd", +0, FOP_FSO_FR, 0172000, "addf", +0, FOP_FSO_FR, 0173000, "subf", +0, FOP_FSO_FR, 0171000, "mulf", +0, FOP_FSO_FR, 0174600, "divf", +0, FOP_FSO_FR, 0173600, "cmpf", +0, FOP_FSO_FR, 0171600, "modf", +0, FOP_FSO, 0170400, "clrf", +0, FOP_FSO, 0070700, "negf", +0, FOP_FSO, 0170600, "absf", +0, FOP_FSO, 0170500, "tstf", +0, FOP_SO, 0170100, "ldfps", +0, FOP_SO, 0170200, "stfps", +0, FOP_SO, 0170300, "stst", +0, MOVF, 0, "movf", +0, FOP_SO_FR, 0177000, "movif", +0, FOP_SO_FR, 0176400, "movie", +0, FOP_FR_SO, 0175400, "movfi", +0, FOP_FR_SO, 0175000, "movei", +0, FOP_FSO_FR, 0177400, "movof", +0, FOP_FR_FSO, 0176000, "movfo", diff --git a/mach/pdp/as/mach4.c b/mach/pdp/as/mach4.c new file mode 100644 index 000000000..268868f5c --- /dev/null +++ b/mach/pdp/as/mach4.c @@ -0,0 +1,163 @@ +#define RCSID4 "$Header$" + +/* + * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. + * + * This product is part of the Amsterdam Compiler Kit. + * + * Permission to use, sell, duplicate or disclose this software must be + * obtained in writing. Requests for such permissions may be sent to + * + * Dr. Andrew S. Tanenbaum + * Wiskundig Seminarium + * Vrije Universiteit + * Postbox 7161 + * 1007 MC Amsterdam + * The Netherlands + * + */ + +/* + * PDP 11 dependent yacc table + */ + +operation + : OP_SO opr1 + { emit2( $1 | $2 ); op1($2); } + | OP_DO opr1 ',' opr2 + { emit2( $1 | ($2 << 6) | $4); op1($2); op2($4);} + | OP_R_SO REG ',' opr1 + { emit2( $1 | ($2 << 6) | $4); op1($4); } + | BR expr + { branch( $1, $2); } + | EJMP expr + { ejump( $1, $2); } + | JMP opr1 + { jump( $1, $2); } + | JSR REG ',' opr1 + { emit2( $1 | ($2 << 6) | $4); op1($4); } + | RTS REG + { emit2($1 | $2); } + | MARK absexp + { fit(fit6($2)); emit2($1 | $2); } + | SOB REG ',' expr + { sob($2, $4); } + | SPL absexp + { fit(fit3($2)); emit2( $1 | $2 ); } + | TRAP absexp + { fit(fit8($2)); emit2( $1 | $2 ); } + | OP_NO + {emit2($1); } + | clcc + { emit2($1); } + | secc + { emit2($1); } + | OP_SO_R opr1 ',' REG + { emit2( $1 | ($4 << 6) | $2); op1($2); } + | MFP opr1 + { emit2( $1 | $2); op1($2); } + | FOP_FSO_FR fopr1 ',' fregister + {emit2($1 | ($4 << 6) | $2); op1($2); } + | FOP_FSO fopr1 + { emit2( $1 | $2); op1($2); } + | FOP_SO opr1 + { emit2( $1 | $2); op1($2); } + | MOVF fop2 ',' fregister + { emit2(OPSTF | ($4 << 6) | $2); op2($2);} + | MOVF fregister ',' fopr1 + { emit2(OPLDF | ($2 << 6) | $4); op1($4); } + | FOP_SO_FR opr1 ',' fregister + { emit2($1 | ($4 << 6) | $2); op1($2); } + | FOP_FR_SO fregister ',' opr1 + { emit2($1 | ($2 << 6) | $4); op1($4); } + | FOP_FR_FSO fregister ',' fopr1 + { emit2($1 | ($2 << 6) | $4); op1($4); } + ; +clcc + : CLEARCC + | clcc '|' CLEARCC + { $$ = ( $1 | $3 ); } + ; +secc + : SETCC + | secc '|' SETCC + { $$ = ( $1 | $3 ); } + ; +opr1 + : opr2 + { $$ = $1; + exp_1 = exp_2; + RELOMOVE(rel_1, rel_2); + im1flag = im2flag; + im2flag=0; + } + ; +opr2 + : REG + | op2 + ; +op2 + : ari + { $$ = ( RDEFMODE | $1); } + | ainc + { $$ = ( AIMODE | $1 ); } + | adec + { $$ = ( ADMODE | $1 ); } + | expr ari + { exp_2 = $1; $$ = ( INDMODE | $2); im2flag = 1; + RELOMOVE(rel_2, relonami); + } + | '*' expr ari + { exp_2 = $2; $$ = ( INDDEFMODE | $3); im2flag = 1; + RELOMOVE(rel_2, relonami); + } + | '*' ainc + { $$ = ( AIDEFMODE | $2 ); } + | '*' adec + { $$ = ( ADDEFMODE | $2 ); } + | expr + { exp_2 = $1; $$ = (INDMODE | 07); im2flag = 1; + RELOMOVE(rel_2, relonami); + } + | '$' expr + { exp_2 =$2; $$ = ( AIMODE | 07); im2flag = 1; + RELOMOVE(rel_2, relonami); + } + | '*' '$' expr + { exp_2 = $3; $$ = ( AIDEFMODE | 07 ); im2flag = 1; + RELOMOVE(rel_2, relonami); + } + | '*' expr + { exp_2 = $2; $$ = ( INDDEFMODE | 07 ); im2flag = 1; + RELOMOVE(rel_2, relonami); + } + ; +fopr1 + : fopr2 + { $$ = $1; exp_1 = exp_2; im1flag = im2flag; im2flag=0; + RELOMOVE(rel_1, rel_2); + } + ; +fopr2 + : fregister + | fop2 + ; +fop2 + : FRSP + | op2 + ; +ari + : '(' REG ')' + { $$ = $2; } + ; +ainc + : ari '+' + ; +adec + : '-' ari + { $$ = $2; } + ; +fregister + : FREG + | REG + ; diff --git a/mach/pdp/as/mach5.c b/mach/pdp/as/mach5.c new file mode 100644 index 000000000..7bedc8712 --- /dev/null +++ b/mach/pdp/as/mach5.c @@ -0,0 +1,133 @@ +#define RCSID5 "$Header$" + +/* + * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. + * + * This product is part of the Amsterdam Compiler Kit. + * + * Permission to use, sell, duplicate or disclose this software must be + * obtained in writing. Requests for such permissions may be sent to + * + * Dr. Andrew S. Tanenbaum + * Wiskundig Seminarium + * Vrije Universiteit + * Postbox 7161 + * 1007 MC Amsterdam + * The Netherlands + * + */ + +op1(mode) { + int relpc = 0; + if (im1flag) { + if (mode == 067 || mode == 077) { + exp_1.val = adjust(exp_1); + relpc = RELPC; + } +#ifdef RELOCATION + RELOMOVE(relonami, rel_1); + if (rflag != 0 && PASS_RELO) + newrelo(exp_1.typ, RELO2|relpc); +#endif + emit2(exp_1.val); + im1flag = 0; + } +} + +op2(mode) { + int relpc = 0; + if (im2flag) { + if (mode == 067 || mode == 077) { + relpc = RELPC; + exp_2.val = adjust(exp_2); + } +#ifdef RELOCATION + RELOMOVE(relonami, rel_2); + if (rflag != 0 && PASS_RELO) + newrelo(exp_2.typ, RELO2|relpc); +#endif + emit2(exp_2.val); + im2flag = 0; + } +} + +branch(opc,exp) expr_t exp; { + register eval; + register sm; + + eval = adjust(exp) >> 1; + sm = fitb(eval); + if ((exp.typ & ~S_DOT) != DOTTYP && pass >= PASS_2) sm = 0; + if (!sm && pass >= PASS_2) { + serror("label too far"); + } + emit2(opc | lowb(eval)); +} + +ejump(opc, exp) expr_t exp; { + register sm,eval; + int gain; + +# ifdef THREE_PASS + eval = adjust(exp) >> 1; + sm = fitb(eval); + if ((exp.typ & ~S_DOT) != DOTTYP) { + sm = 0; + } + gain = (opc == OPBRA ? 2 : 4); + if (small(sm,gain)) { + emit2( opc | lowb(eval)); + } + else { +# endif + if (opc != OPBRA) { + emit2((opc^0400) | 04); + } + + exp_1.val = exp.val; + im1flag = 1; + jump(0100,067); +# ifdef THREE_PASS + } +# endif +} + +sob(reg, exp) expr_t exp; { + if ((exp.typ & ~S_DOT) != DOTTYP) { + serror("error in sob-label"); + } + exp.val = ( - adjust(exp) ) >> 1; + fit(fit6(exp.val)); + emit2( OPSOB | (reg << 6) | exp.val); +} + +jump(opc,opr) { + register sm; + register val; + + if (opr==067) { +# ifdef THREE_PASS + val = adjust(exp_1) >> 1; + if ( fitb(val) && (exp_1.typ & ~S_DOT) == DOTTYP) { + sm = 1; + } + if (small(sm,2)) { + emit2(OPBRA | lowb(val)); + im1flag = 0; + return(0); + } +# endif + } + emit2(opc | opr); + op1(opr); +} + +valu_t adjust(exp) expr_t exp; { + valu_t val; + + val = exp.val - DOTVAL - 2; +# ifdef THREE_PASS + if (pass == PASS_2 && val > 0) val -= DOTGAIN; +# endif + return(val); +}