ack/mach/arm/as/mach4.c
1990-11-12 15:29:14 +00:00

130 lines
2.3 KiB
C

/* $Header: mach4.c, v1.9 15-Mar-89 AJM */
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
{strldr($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|$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;}
| 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;}
| ',' RRX
{$$ = $2;}
|
{$$ = 0;}
;
aoptshift : ',' SHIFT '#' expr
{$$ = $2|calcshft($4.val, $4.typ, $<y_word>0);}
| ',' RRX
{$$ = $2;}
|
{$$ = 0;}
;
shftcnt : '#' expr
{$$ = calcshft($2.val, $2.typ, $<y_word>0);}
| REG
{$$ = $1<<8|0x10;}
;
address : expr
{success = 0; $$ = $1.val;}
| '[' REG ']'
{success = 1; $$ = 0x01000000|$2<<16;}
| '[' REG ',' offset ']' optexc
{success = 1; $$ = $2<<16|$4|$6|0x01000000;}
| '[' REG ']' ',' offset
{success = 1; $$ = $2<<16|$5;}
;
offset : '#' expr
{$$ = calcoffset($2.val);}
| optsign REG aoptshift
{$$ = 0x02000000|$1|$2|$3;}
;
optsign : {$$ = 0x00800000;}
| '+'
{$$ = 0x00800000;}
| '-'
{$$ = 0x0;}
;
reglist : '{' rlist '}'
{$$ = $2;}
;
rlist : REG
{$$ = 1<<$1;}
| rlist ',' REG
{$$ = $1|1<<$3;}
| REG '-' REG
{
for ($$ = 0; $1 <= $3; $1++)
$$ |= (1<<$1);
}
;