Initial revision
authorceriel <none@none>
Thu, 18 Feb 1988 09:20:09 +0000 (09:20 +0000)
committerceriel <none@none>
Thu, 18 Feb 1988 09:20:09 +0000 (09:20 +0000)
mach/arm/as/mach0.c [new file with mode: 0644]
mach/arm/as/mach1.c [new file with mode: 0644]
mach/arm/as/mach2.c [new file with mode: 0644]
mach/arm/as/mach3.c [new file with mode: 0644]
mach/arm/as/mach4.c [new file with mode: 0644]
mach/arm/as/mach5.c [new file with mode: 0644]

diff --git a/mach/arm/as/mach0.c b/mach/arm/as/mach0.c
new file mode 100644 (file)
index 0000000..454db34
--- /dev/null
@@ -0,0 +1,42 @@
+#define LISTING
+#define ASLD
+#define THREE_PASS
+
+#undef valu_t
+#define valu_t         long
+
+#undef addr_t
+#define addr_t long
+
+#undef word_t
+#define word_t long
+
+#undef ALIGNWORD
+#define ALIGNWORD      4
+
+#undef ALIGNSECT
+#define ALIGNSECT      4
+
+#undef VALWIDTH
+#define VALWIDTH       8
+
+#define S_REG          0xF
+#define S_NUM          0x8
+
+#define        ADC     0x00A00000
+#define        ADD     0x00800000
+#define        AND     0x00000000
+#define        BIC     0x01C00000
+#define        EOR     0x00200000
+#define        ORR     0x01800000
+#define        RSB     0x00600000
+#define        RSC     0x00E00000
+#define        SBC     0x00C00000
+#define        SUB     0x00400000
+#define        MOV     0x01A00000
+#define        MVN     0x01E00000
+#define        CMN     0x01700000
+#define        CMP     0x01500000
+#define        TEQ     0x01300000
+#define        TST     0x01100000
+
diff --git a/mach/arm/as/mach1.c b/mach/arm/as/mach1.c
new file mode 100644 (file)
index 0000000..dd97686
--- /dev/null
@@ -0,0 +1 @@
+extern word_t opcode;
diff --git a/mach/arm/as/mach2.c b/mach/arm/as/mach2.c
new file mode 100644 (file)
index 0000000..e0211ba
--- /dev/null
@@ -0,0 +1,21 @@
+%token <y_word> COND
+%token <y_word> LINK
+%token <y_word> BRANCH
+%token <y_word> DATA1
+%token <y_word> DATA2
+%token <y_word> DATA3
+%token <y_word> SET
+%token <y_word> PEE
+%token <y_word> REG
+%token <y_word> SHIFT
+%token <y_word> RXX
+%token <y_word> SDT
+%token <y_word> BYTE
+%token <y_word> TRANS
+%token <y_word> BDT
+%token <y_word> SWI
+%token <y_word> ADR
+
+%type <y_word> optlink optcond opts optt optp optb optexc reglist rlist
+%type <y_word> optsign optpsr optshift shftcnt address offset
+%type <y_expr> operand
diff --git a/mach/arm/as/mach3.c b/mach/arm/as/mach3.c
new file mode 100644 (file)
index 0000000..e90f3b9
--- /dev/null
@@ -0,0 +1,115 @@
+0,             COND,           0x00000000,     ".EQ",
+0,             COND,           0x10000000,     ".NE",
+0,             COND,           0x20000000,     ".CS",
+0,             COND,           0x20000000,     ".HS",
+0,             COND,           0x30000000,     ".CC",
+0,             COND,           0x30000000,     ".LO",
+0,             COND,           0x40000000,     ".MI",
+0,             COND,           0x50000000,     ".PL",
+0,             COND,           0x60000000,     ".VS",
+0,             COND,           0x70000000,     ".VC",
+0,             COND,           0x80000000,     ".HI",
+0,             COND,           0x90000000,     ".LS",
+0,             COND,           0xA0000000,     ".GE",
+0,             COND,           0xB0000000,     ".LT",
+0,             COND,           0xC0000000,     ".GT",
+0,             COND,           0xD0000000,     ".LE",
+0,             COND,           0xE0000000,     ".AL",
+0,             COND,           0xF0000000,     ".NV",
+
+0,             LINK,           0x01000000,     ".L",
+
+0,             BRANCH,         0x0A000000,     "BEQ",
+0,             BRANCH,         0x1A000000,     "BNE",
+0,             BRANCH,         0x2A000000,     "BCS",
+0,             BRANCH,         0x2A000000,     "BHS",
+0,             BRANCH,         0x3A000000,     "BCC",
+0,             BRANCH,         0x3A000000,     "BLO",
+0,             BRANCH,         0x4A000000,     "BMI",
+0,             BRANCH,         0x5A000000,     "BPL",
+0,             BRANCH,         0x6A000000,     "BVS",
+0,             BRANCH,         0x7A000000,     "BVC",
+0,             BRANCH,         0x8A000000,     "BHI",
+0,             BRANCH,         0x9A000000,     "BLS",
+0,             BRANCH,         0xAA000000,     "BGE",
+0,             BRANCH,         0xBA000000,     "BLT",
+0,             BRANCH,         0xCA000000,     "BGT",
+0,             BRANCH,         0xDA000000,     "BLE",
+0,             BRANCH,         0xEA000000,     "BAL",
+0,             BRANCH,         0xFA000000,     "BNV",
+
+0,             DATA1,          ADC,    "ADC",
+0,             DATA1,          ADD,    "ADD",
+0,             DATA1,          AND,    "AND",
+0,             DATA1,          BIC,    "BIC",
+0,             DATA1,          EOR,    "EOR",
+0,             DATA1,          ORR,    "ORR",
+0,             DATA1,          RSB,    "RSB",
+0,             DATA1,          RSC,    "RSC",
+0,             DATA1,          SBC,    "SBC",
+0,             DATA1,          SUB,    "SUB",
+0,             DATA2,          MOV,    "MOV",
+0,             DATA2,          MVN,    "MVN",
+0,             DATA3,          CMN,    "CMN",
+0,             DATA3,          CMP,    "CMP",
+0,             DATA3,          TEQ,    "TEQ",
+0,             DATA3,          TST,    "TST",
+
+0,             SET,            0x00100000,     ".S",
+
+0,             PEE,            0x0010F000,     ".P",
+
+0,             REG,            0,              "R0",
+0,             REG,            1,              "R1",
+0,             REG,            2,              "R2",
+0,             REG,            3,              "R3",
+0,             REG,            4,              "R4",
+0,             REG,            5,              "R5",
+0,             REG,            6,              "R6",
+0,             REG,            7,              "R7",
+0,             REG,            8,              "R8",
+0,             REG,            9,              "R9",
+0,             REG,            10,             "R10",
+0,             REG,            11,             "R11",
+0,             REG,            12,             "R12",
+0,             REG,            13,             "R13",
+0,             REG,            14,             "R14",
+0,             REG,            15,             "R15",
+
+0,             SHIFT,          0x00000000,     "LSL",
+0,             SHIFT,          0x00000000,     "ASL",
+0,             SHIFT,          0x00000020,     "LSR",
+0,             SHIFT,          0x00000040,     "ASR",
+0,             SHIFT,          0x00000060,     "ROR",
+
+0,             RXX,            0x00000060,     "RXX",
+
+0,             SDT,            0x04100000,     "LDR",
+0,             SDT,            0x04000000,     "STR",
+
+0,             BYTE,           0x00400000,     ".B",
+
+0,             TRANS,          0x00200000,     ".T",
+
+0,             BDT,            0x09100000,     "LDMDB",
+0,             BDT,            0x08100000,     "LDMDA",
+0,             BDT,            0x09900000,     "LDMIB",
+0,             BDT,            0x08900000,     "LDMIA",
+0,             BDT,            0x08100000,     "LDMFD",
+0,             BDT,            0x08900000,     "LDMFA",
+0,             BDT,            0x09100000,     "LDMED",
+0,             BDT,            0x09900000,     "LDMEA",
+0,             BDT,            0x09000000,     "STMDB",
+0,             BDT,            0x08000000,     "STMDA",
+0,             BDT,            0x09800000,     "STMIB",
+0,             BDT,            0x08800000,     "STMIA",
+0,             BDT,            0x09000000,     "STMFD",
+0,             BDT,            0x09800000,     "STMFA",
+0,             BDT,            0x08000000,     "STMED",
+0,             BDT,            0x08800000,     "STMEA",
+
+0,             SWI,            0,              "SWI",
+
+0,             ADR,            0,              "ADR",
+
+
diff --git a/mach/arm/as/mach4.c b/mach/arm/as/mach4.c
new file mode 100644 (file)
index 0000000..b77776b
--- /dev/null
@@ -0,0 +1,110 @@
+operation      : BRANCH optlink expr
+                       {branch($1, $2, $3.val);}
+               | DATA1 optcond opts optp REG ',' REG ',' operand
+                       {data($1,$2|$3|$4|$5<<12|$7<<16,$9.val,$9.typ);}
+               | DATA2 optcond opts optp REG ',' operand
+                       {data($1,$2|$3|$4|$5<<12,$7.val,$7.typ);}
+               | DATA3 optcond opts optp REG ',' operand
+                       {data($1,$2|$3|$4|$5<<16,$7.val,$7.typ);}
+               | SDT optcond optb optt REG ',' address
+                       {emit4($1|$2|$3|$4|$5<<12|$7);}
+               | BDT optcond REG optexc ',' reglist optpsr
+                       {emit4($1|$2|$3<<16|$4|$6|$7);}
+               | SWI optcond expr
+                       {emit4($1|$2);}
+               | ADR REG ',' expr
+                       {calcadr($2, $4.val, $4.typ);}
+               ;
+
+optlink                :       {$$=0;}
+               | LINK
+                       {$$=$1;}
+               ;
+
+optcond                :       {$$=0xE0000000;}
+               | COND
+                       {$$=$1;}
+               ;
+
+opts           :       {$$=0;}
+               | SET
+                       {$$=$1;}
+               ;
+
+optt           :       {$$=0;}
+               | TRANS
+                       {$$=$1;}
+               ;
+
+optp           :       {$$=0;}
+               | PEE
+                       {$$=$1;}
+               ;
+
+optb           :       {$$=0;}
+               | BYTE
+                       {$$=$1;}
+               ;
+
+optexc         :       {$$=0;}
+               | '<'
+                       {$$=0x00200000;}
+               ;
+
+optpsr         :       {$$=0;}
+               | '^'
+                       {$$=0x00400000;}
+               ;
+
+operand                : REG optshift
+                       {$$.val = $1|$2; $$.typ = S_REG;}
+               | '#'expr
+                       {$$ = $2;}
+               ;
+
+optshift       : ',' SHIFT shftcnt
+                       {$$ = $2|$3;}
+               | ',' RXX
+                       {$$ = $2;}
+               |
+                       {$$ = 0;}
+               ;
+
+shftcnt                : '#' expr
+                       {$$ = calcshft($2.val, $2.typ, $<y_word>0);}
+               | REG
+                       {$$ = $1<<8|0x10;}
+               ;
+
+address                : expr
+                       {$$ = 0x01000000|calcaddress($1.val,$1.typ,$<y_word>-1);}
+               | '[' REG ']'
+                       {$$ = 0x01000000|$2<<16;}
+               | '[' REG ',' offset ']' optexc
+                       {$$ = $2<<16|$4|$6|0x01000000;}
+               | '[' REG ']' ',' offset
+                       {$$ = $2<<16|$5;}
+               ;
+
+offset         : '#' expr
+                       {$$ = calcoffset($2.val);}
+               | optsign REG optshift
+                       {$$ = 0x02000000|$1|$2|$3;}
+               ;
+       
+optsign                :       {$$ = 0x00800000;}
+               | '+'
+                       {$$ = 0x00800000;}
+               | '-'   
+                       {$$ = 0x0;}
+               ;
+
+reglist                : '{' rlist '}'
+                       {$$ = $2;}
+               ;
+
+rlist          : REG
+                       {$$ = 1<<$1;}
+               | rlist ',' REG
+                       {$$ = $1|1<<$3;}
+               ;
diff --git a/mach/arm/as/mach5.c b/mach/arm/as/mach5.c
new file mode 100644 (file)
index 0000000..6ff4890
--- /dev/null
@@ -0,0 +1,249 @@
+branch(brtyp, link, val)
+word_t brtyp;
+word_t link;
+valu_t val;
+{
+       valu_t offset;
+
+       offset = val - DOTVAL - 8;
+       if ((offset & 0xFC000000) != 0 && (offset & 0xFC000000) != 0xFC000000){
+               serror("offset out of range");
+       }
+       offset = offset>>2 & 0xFFFFFF; 
+       emit4(brtyp|link|offset);
+       return;
+}
+
+data(opc, ins, val, typ)
+word_t opc, ins;
+valu_t val;
+short typ;
+{
+       valu_t tmpval;
+
+       if (typ == S_REG){
+               emit4(opc|ins|val);
+               return;
+       }
+
+       ins |= 0x02000000;
+
+       tmpval = val;
+       if (typ == S_ABS){
+               if (calcimm(&opc, &tmpval, typ)){
+                       emit4(opc|ins|tmpval);
+                       return;
+               }
+       }
+
+       tmpval = val;
+       if (small(calcimm(&opc, &tmpval, typ),12)){
+               emit4(opc|ins|tmpval);
+               return;
+       }       
+
+       switch (opc){
+       case MOV:
+               if (small((val & 0xF0000000) == 0xF0000000, 8)){
+                       emit4(0xE51F0004 | (ins & 0xF000));
+                       emit4(val);
+                       return;
+               }
+               if (small(1,4)){
+                       emit4(0xE51F0000 | (ins & 0xF000));
+                       emit4(0xEA000000);
+                       emit4(val);
+                       return;
+               }
+               DOTVAL += 16;
+               return;
+       case ADD:
+               if (small((val & 0xF0000000) == 0xF0000000, 4)){
+                       emit4(0xE51F0004 | (ins & 0xF000));
+                       emit4(val);
+                       emit4(0xE2800000 | (ins&0xFF000) | (ins&0xF000)>>12);
+                       return;
+               }
+               emit4(0xE51F0000 | (ins & 0xF000));
+               emit4(0xEA000000);
+               emit4(val);
+               emit4(0xE2800000 | (ins&0xFF000) | (ins&0xF000)>>12);
+               return;
+       default:
+               if (pass == PASS_1)
+                       DOTVAL += 16;
+               else
+                       serror("immediate value out of range");
+               return;
+       }
+}
+
+calcimm(opc,val,typ)
+word_t *opc;
+valu_t *val;
+short typ;
+{
+       int i = 0;
+
+       if (typ == S_UND) return 0;
+
+       if ((*val & ~0xFF) == 0) return 1;
+
+       if ((~*val & ~0xFF) == 0){
+               switch (*opc){
+               case AND:
+                       *val = ~*val;
+                       *opc = BIC;
+                       return 1;
+               case MOV:
+                       *val = ~*val;
+                       *opc = MVN;
+                       return 1;
+               case ADC:
+                       *val = ~*val;
+                       *opc = SBC;
+                       return 1;
+               default : 
+                       break;
+               }
+       }       
+       if ((-1**val & ~0xFF) == 0 ){
+               switch (*opc){
+               case ADD:
+                       *val *= -1;
+                       *opc = SUB;
+                       return 1;
+               case CMP:
+                       *val *= -1;
+                       *opc = CMN;
+                       return 1;
+               default:
+                       break;
+               }
+       }
+
+       do{
+               rotateleft2(&*val);
+               i++;
+               if((*val & ~0xFF) == 0){
+                       *val = *val|i<<8;
+                       return 1;
+               }
+               if ((~*val & ~0xFF) == 0){
+                       switch (*opc){
+                       case AND:
+                               *val = ~*val|i<<8;
+                               *opc = BIC;
+                               return 1;
+                       case MOV:
+                               *val = ~*val|i<<8;
+                               *opc = MVN;
+                               return 1;
+                       case ADC:
+                               *val = ~*val|i<<8;
+                               *opc = SBC;
+                               return 1;
+                       default : 
+                               break;
+                       }
+               }       
+       }while(i<15);
+
+       return 0;
+}
+
+word_t
+calcoffset(val)
+valu_t val;
+{
+       if((val & ~0xFFF) == 0)
+               return(val|0x00800000);
+       val *= -1;
+       if((val & ~0xFFF) == 0)
+               return(val);
+       serror("offset out of range");
+       return(0);
+}
+
+word_t
+calcaddress(val,typ,reg)
+valu_t val;
+short typ;
+word_t reg;
+{
+       int tmpval;
+
+       if (typ == S_UND){
+               DOTVAL += 8;
+               return 0;
+       }
+       tmpval = val - DOTVAL - 8;
+       if(small((tmpval & ~0xFFF) == 0, 8))
+               return(val|0x008F0000);
+       tmpval *= -1;
+       if(small((tmpval & ~0xFFF) == 0, 8))
+               return(val|0x000F0000);
+       emit4(0xE51F0004 | reg << 12);
+       emit4(val | 0xF0000000);
+       return(reg << 16);
+}
+
+word_t
+calcadr(reg, val, typ)
+word_t reg;
+valu_t val;
+short typ;
+{
+       valu_t tmpval = val;
+       int i = 0;
+
+       if ((val & 0xFC000000) && (typ != S_UND)){
+               serror("address out of range");
+               return 0;
+       }
+
+       if (typ != S_ABS){
+               tmpval = val-DOTVAL-8;
+               if (small((tmpval & ~0xFF) == 0),12){
+                       emit4(0xE2000000|ADD|0xF<<16|reg<<12|tmpval);
+                       return 0;
+               }
+       
+               tmpval *= -1;
+               if (small((tmpval & ~0xFF) == 0), 12){
+                       emit4(0xE2000000|SUB|0xF<<16|reg<<12|tmpval);
+                       return 0;
+               }
+       }
+
+       data(MOV, 0xE2000000||reg<<12, val, typ);
+
+       return 0;
+}
+
+
+word_t
+calcshft(val, typ, styp)
+valu_t val;
+short typ;
+word_t styp;
+{
+       if (typ=S_UND) return 0;
+       if (val & ~0x1F) serror("shiftcount out of range");
+       if (styp && !val) warning("shiftcount 0");
+       return((val & 0x1F)<<7);
+}
+
+rotateleft2(x)
+long *x;
+{
+       unsigned long bits;
+
+       bits = *x & 0xC0000000;
+       *x <<= 2 ;
+       if (bits){
+               bits >>= 30;
+               *x |= bits;
+       }
+       return;
+}