included changes from Andy Michael

This commit is contained in:
ceriel 1988-11-07 09:24:36 +00:00
parent b90690ba5d
commit af5ed82bff
5 changed files with 98 additions and 55 deletions

View file

@ -1,7 +1,12 @@
/* $Header; mach0.c, v1.1 20-Oct-88 AJM */
#define LISTING
#define ASLD
#define THREE_PASS
#define WORDS_REVERSED
#define BYTES_REVERSED
#undef valu_t
#define valu_t long

View file

@ -1,3 +1,4 @@
/* $Header: mach2.c, V1.3 2-Nov-88 AJM */
%token <y_word> COND
%token <y_word> LINK
%token <y_word> BRANCH
@ -8,13 +9,15 @@
%token <y_word> PEE
%token <y_word> REG
%token <y_word> SHIFT
%token <y_word> RXX
%token <y_word> RRX
%token <y_word> SDT
%token <y_word> BYTE
%token <y_word> TRANS
%token <y_word> BDT
%token <y_word> SWI
%token <y_word> ADR
%token <y_word> MUL
%token <y_word> MLA
%type <y_word> optlink optcond opts optt optp optb optexc reglist rlist
%type <y_word> optsign optpsr optshift shftcnt address offset

View file

@ -1,3 +1,5 @@
/* $Header: mach3.c, v1.5 2-Nov-88 AJM */
0, COND, 0x00000000, ".EQ",
0, COND, 0x10000000, ".NE",
0, COND, 0x20000000, ".CS",
@ -82,7 +84,7 @@
0, SHIFT, 0x00000040, "ASR",
0, SHIFT, 0x00000060, "ROR",
0, RXX, 0x00000060, "RXX",
0, RRX, 0x00000060, "RRX",
0, SDT, 0x04100000, "LDR",
0, SDT, 0x04000000, "STR",
@ -108,8 +110,11 @@
0, BDT, 0x08000000, "STMED",
0, BDT, 0x08800000, "STMEA",
0, SWI, 0, "SWI",
0, SWI, 0x0F000000, "SWI",
0, ADR, 0, "ADR",
0, MUL, 0x00000090, "MUL",
0, MLA, 0x00200090, "MLA",

View file

@ -1,3 +1,5 @@
/* $Header: mach4.c, v1.5 2-Nov-88 AJM */
operation : BRANCH optlink expr
{branch($1, $2, $3.val);}
| DATA1 optcond opts optp REG ',' REG ',' operand
@ -11,9 +13,13 @@ operation : BRANCH optlink expr
| 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);}
{emit4($1|$2|$3.val);}
| ADR optcond REG ',' expr
{calcadr($2, $3, $5.val, $5.typ);}
| MUL optcond REG ',' REG ',' REG
{emit4($1|$2|$3<<16|$5|$7<<8);}
| MLA optcond REG ',' REG ',' REG ',' REG
{emit4($1|$2|$3<<16|$5|$7<<8|$9<<12);}
;
optlink : {$$=0;}
@ -64,7 +70,7 @@ operand : REG optshift
optshift : ',' SHIFT shftcnt
{$$ = $2|$3;}
| ',' RXX
| ',' RRX
{$$ = $2;}
|
{$$ = 0;}

View file

@ -1,3 +1,5 @@
/* $Header: mach5.c, v1.6 3-Nov-88 AJM */
branch(brtyp, link, val)
word_t brtyp;
word_t link;
@ -15,7 +17,7 @@ valu_t val;
}
data(opc, ins, val, typ)
word_t opc, ins;
long opc, ins;
valu_t val;
short typ;
{
@ -42,7 +44,8 @@ short typ;
return;
}
if (opc == MOV) {
if (opc == MOV && typ != S_ABS)
{
if (small((val & 0xF0000000) == 0xF0000000, 8)){
emit4(0xE51F0004 | (ins & 0xF000));
emit4(val);
@ -57,7 +60,8 @@ short typ;
DOTVAL += 16;
return;
}
if (opc == ADD) {
if (opc == ADD && typ != S_ABS)
{
if (small((val & 0xF0000000) == 0xF0000000, 4)){
emit4(0xE51F0004 | (ins & 0xF000));
emit4(val);
@ -70,10 +74,13 @@ short typ;
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)
@ -85,32 +92,38 @@ short typ;
if (typ == S_UND) return 0;
if ((*val & ~0xFF) == 0) return 1;
if ((*val & 0xFFFFFF00) == 0) return 1;
if ((~*val & ~0xFF) == 0){
if (*opc == AND) {
if ((~*val & 0xFFFFFF00) == 0){
if (*opc == AND)
{
*val = ~*val;
*opc = BIC;
return 1;
}
if (*opc == MOV) {
if (*opc == MOV)
{
*val = ~*val;
*opc = MVN;
return 1;
}
if (*opc == ADC) {
if (*opc == ADC)
{
*val = ~*val;
*opc = SBC;
return 1;
}
}
if ((-1**val & ~0xFF) == 0 ){
if (*opc == ADD) {
if ((-1**val & 0xFFFFFF00) == 0 ){
if (*opc == ADD)
{
*val *= -1;
*opc = SUB;
return 1;
}
if (*opc == CMP) {
if (*opc == CMP)
{
*val *= -1;
*opc = CMN;
return 1;
@ -120,22 +133,25 @@ short typ;
do{
rotateleft2(&*val);
i++;
if((*val & ~0xFF) == 0){
if((*val & 0xFFFFFF00) == 0){
*val = *val|i<<8;
return 1;
}
if ((~*val & ~0xFF) == 0){
if (*opc == AND) {
if ((~*val & 0xFFFFFF00) == 0){
if (*opc == AND)
{
*val = ~*val|i<<8;
*opc = BIC;
return 1;
}
if (*opc == MOV) {
if (*opc == MOV)
{
*val = ~*val|i<<8;
*opc = MVN;
return 1;
}
if (*opc == ADC) {
if (*opc == ADC)
{
*val = ~*val|i<<8;
*opc = SBC;
return 1;
@ -150,17 +166,17 @@ word_t
calcoffset(val)
valu_t val;
{
if((val & ~0xFFF) == 0)
if((val & 0xFFFFF000) == 0)
return(val|0x00800000);
val *= -1;
if((val & ~0xFFF) == 0)
if((val & 0xFFFFF000) == 0)
return(val);
serror("offset out of range");
return(0);
}
word_t
calcaddress(val,typ,reg)
calcaddress (val,typ,reg)
valu_t val;
short typ;
word_t reg;
@ -172,10 +188,10 @@ word_t reg;
return 0;
}
tmpval = val - DOTVAL - 8;
if(small((tmpval & ~0xFFF) == 0, 8))
if(small((tmpval & 0xFFFFF000) == 0, 8))
return(val|0x008F0000);
tmpval *= -1;
if(small((tmpval & ~0xFFF) == 0, 8))
if(small((tmpval & 0xFFFFF000) == 0, 8))
return(val|0x000F0000);
emit4(0xE51F0004 | reg << 12);
emit4(val | 0xF0000000);
@ -183,36 +199,44 @@ word_t reg;
}
word_t
calcadr(reg, val, typ)
word_t reg;
calcadr(ins, reg, val, typ)
word_t ins, reg;
valu_t val;
short typ;
{
valu_t tmpval = val;
word_t opc;
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|(long)0xF<<16|reg<<12|tmpval);
if (tmpval > 0) {
if (small((tmpval & 0xFFFFFF00) == 0),12){
emit4(ins|ADD|0x020F0000|reg<<12|tmpval);
return 0;
}
}
tmpval *= -1;
if (small((tmpval & ~0xFF) == 0), 12){
emit4(0xE2000000|SUB|(long)0xF<<16|reg<<12|tmpval);
if (small((tmpval & 0xFFFFFF00) == 0), 12){
emit4(ins|SUB|0x020F0000|reg<<12|tmpval);
return 0;
}
}
data(MOV, 0xE2000000||reg<<12, val, typ);
tmpval = val;
opc = MOV;
if (calcimm(&opc, &tmpval, typ)){
emit4(ins|opc|0x020F0000|reg<<12|tmpval);
return 0;
}
/* Failed */
if (pass == PASS_1)
DOTVAL += 16;
else
serror("illegal ADR argument");
return ;
}
@ -223,7 +247,7 @@ short typ;
word_t styp;
{
if (typ=S_UND) return 0;
if (val & ~0x1F) serror("shiftcount out of range");
if (val & 0xFFFFFFE0) serror("shiftcount out of range");
if (styp && !val) warning("shiftcount 0");
return((val & 0x1F)<<7);
}