Initial revision

This commit is contained in:
ceriel 1988-02-18 09:20:09 +00:00
parent 4e0c9a780a
commit ccf7ef96b5
6 changed files with 538 additions and 0 deletions

42
mach/arm/as/mach0.c Normal file
View file

@ -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

1
mach/arm/as/mach1.c Normal file
View file

@ -0,0 +1 @@
extern word_t opcode;

21
mach/arm/as/mach2.c Normal file
View file

@ -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

115
mach/arm/as/mach3.c Normal file
View file

@ -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",

110
mach/arm/as/mach4.c Normal file
View file

@ -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;}
;

249
mach/arm/as/mach5.c Normal file
View file

@ -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;
}