Initial revision
authorceriel <none@none>
Thu, 26 Feb 1987 19:46:35 +0000 (19:46 +0000)
committerceriel <none@none>
Thu, 26 Feb 1987 19:46:35 +0000 (19:46 +0000)
mach/pdp/as/mach0.c [new file with mode: 0644]
mach/pdp/as/mach1.c [new file with mode: 0644]
mach/pdp/as/mach2.c [new file with mode: 0644]
mach/pdp/as/mach3.c [new file with mode: 0644]
mach/pdp/as/mach4.c [new file with mode: 0644]
mach/pdp/as/mach5.c [new file with mode: 0644]

diff --git a/mach/pdp/as/mach0.c b/mach/pdp/as/mach0.c
new file mode 100644 (file)
index 0000000..cd5836c
--- /dev/null
@@ -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 (file)
index 0000000..73aeed3
--- /dev/null
@@ -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 (file)
index 0000000..72fcbe9
--- /dev/null
@@ -0,0 +1,36 @@
+#define RCSID2 "$Header$"
+
+/*
+* PDP 11 machine dependent yacc declarations
+*/
+%token <y_word> REG
+%token <y_word> FREG
+%token <y_word> FRSP
+%token <y_word> JMP
+%token <y_word> OP_SO
+%token <y_word> OP_DO
+%token <y_word> OP_R_SO
+%token <y_word> BR
+%token <y_word> EJMP
+%token <y_word> JSR
+%token <y_word> RTS
+%token <y_word> MARK
+%token <y_word> SOB
+%token <y_word> SPL
+%token <y_word> TRAP
+%token <y_word> OP_NO
+%token <y_word> OP_SO_R
+%token <y_word> MFP
+%token <y_word> FOP_FSO_FR
+%token <y_word> FOP_NO
+%token <y_word> FOP_FSO
+%token <y_word> FOP_SO
+%token <y_word> MOVF
+%token <y_word> FOP_SO_FR
+%token <y_word> FOP_FR_SO
+%token <y_word> FOP_FR_FSO
+%token <y_word> CLEARCC
+%token <y_word> SETCC
+
+%type <y_word> opr1, opr2, op2, fopr2, fopr1, ari, ainc, adec
+%type <y_word> fop2, clcc, secc, fregister
diff --git a/mach/pdp/as/mach3.c b/mach/pdp/as/mach3.c
new file mode 100644 (file)
index 0000000..1247871
--- /dev/null
@@ -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 (file)
index 0000000..268868f
--- /dev/null
@@ -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 (file)
index 0000000..7bedc87
--- /dev/null
@@ -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);
+}