123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /* $Id: 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);
- }
- ;
|