123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /* @(#)mach4.c 1.11 */
- /*
- * Motorola 68000/68010 syntax rules
- */
- operation
- : bcdx DREG ',' DREG
- { emit2($1 | $2 | $4<<9);}
- | bcdx '-' '(' AREG ')' ',' '-' '(' AREG ')'
- { emit2($1 | $4 | $9<<9 | 010);}
- | ADD sizedef ea_ea
- { add($1, $2);}
- | AND sizenon ea_ea
- { and($1, $2);}
- | SHIFT sizedef ea_ea
- { shift_op($1, $2);}
- | BR expr
- { branch($1, $2);}
- | DBR DREG ',' expr
- { $4.val -= (DOTVAL+2);
- fit(fitw($4.val));
- emit2($1 | $2);
- #ifdef RELOCATION
- #ifdef DUK
- newrelo($4.typ, RELPC|RELO2|RELBR|RELWR);
- #else DUK
- newrelo($4.typ, RELPC|RELO2);
- #endif DUK
- #endif
- emit2(loww($4.val));
- }
- | BITOP ea_ea
- { bitop($1);}
- | OP_EA_D ea ',' DREG
- { emit2($1 | mrg_2 | $4<<9);
- ea_2(SIZE_W, DTA);
- }
- | LEA ea ',' AREG
- { emit2(040700 | mrg_2 | $4<<9);
- ea_2(SIZE_L, CTR);
- }
- | op_ea ea
- { emit2(($1&0177700) | mrg_2);
- ea_2($1&0300, $1&017);
- }
- | OP_NOOP
- { emit2($1);}
- | CMP sizedef ea_ea
- { cmp($2);}
- | MOVE sizenon ea_ea
- { move($2);}
- | MOVEP sizedef ea_ea
- { movep($2);}
- | MOVEM sizedef regs ',' notimmreg
- { movem(0, $2, $3);}
- | MOVEM sizedef notimmreg ',' regs
- { movem(1, $2, $5);}
- | MOVES sizedef ea_ea
- { test68010();
- if (mrg_1 <= 017) {
- emit2(007000 | $2 | mrg_2);
- emit2(mrg_1 << 12 | 04000);
- ea_2($2,ALT|MEM);
- } else if (mrg_2 <= 017) {
- emit2(007000 | $2 | mrg_1);
- emit2(mrg_2 << 12);
- ea_1($2,ALT|MEM);
- } else
- badoperand();
- }
- | MOVEC creg ',' reg
- { test68010();
- emit2(047172); emit2($2 | $4<<12);
- }
- | MOVEC reg ',' creg
- { test68010();
- emit2(047173); emit2($4 | $2<<12);
- }
- | EXG reg ',' reg
- { if (($2 & 010) == 0)
- emit2(
- (0140500|$4|$2<<9)
- +
- (($4&010)<<3)
- );
- else
- emit2(
- (0140600|$2|($4&07)<<9)
- -
- (($4&010)<<3)
- );
- }
- | OP_EXT sizedef DREG
- { checksize($2, 2|4); emit2(044000 | $2+0100 | $3);}
- | SWAP DREG
- { emit2(044100 | $2);}
- | STOP imm
- { emit2($1); ea_2(SIZE_W, 0);}
- | LINK AREG ',' imm
- { emit2(047120 | $2); ea_2(SIZE_W, 0);}
- | UNLK AREG
- { emit2(047130 | $2);}
- | TRAP '#' absexp
- { fit(fit4($3)); emit2(047100|low4($3));}
- | RTD imm
- { test68010();
- emit2(047164);
- ea_2(SIZE_W, 0);
- }
- | MODEL
- { model = $1;}
- ;
- bcdx : ABCD
- | ADDX sizedef
- { $$ = $1 | $2;}
- ;
- creg : CREG
- | SPEC { if ($1 != 075) badoperand(); $$ = 04000;}
- ;
- op_ea : OP_EA
- | SZ_EA sizedef
- { $$ = $1 | $2;}
- ;
- regs : rrange
- | regs '/' rrange
- { $$ = $1 | $3;}
- ;
- rrange : reg
- { $$ = 1<<$1;}
- | reg '-' reg
- { if ($1 > $3)
- badoperand();
- for ($$ = 0; $1 <= $3; $1++)
- $$ |= (1<<$1);
- }
- ;
- ea : DREG
- { mrg_2 = $1;}
- | AREG
- { mrg_2 = 010 | $1;}
- | SPEC
- { mrg_2 = $1;}
- | notimmreg
- | imm
- ;
- notimmreg
- : '(' AREG ')'
- { mrg_2 = 020 | $2;}
- | '(' AREG ')' '+'
- { mrg_2 = 030 | $2;}
- | '-' '(' AREG ')'
- { mrg_2 = 040 | $3;}
- | expr sizenon
- { exp_2 = $1; ea707172($2);
- RELOMOVE(rel_2, relonami);
- }
- | expr '(' reg sizenon ')'
- { exp_2 = $1; ea5x73($3, $4);
- RELOMOVE(rel_2, relonami);
- }
- | expr '(' AREG ',' reg sizedef ')'
- { exp_2 = $1; ea6x($3, $5, $6);
- RELOMOVE(rel_2, relonami);
- }
- | expr '(' PC ')'
- { exp_2 = $1; ea72();
- RELOMOVE(rel_2, relonami);
- }
- | expr '(' PC ',' reg sizedef ')'
- { exp_2 = $1; ea73($5, $6);
- RELOMOVE(rel_2, relonami);
- }
- ;
- imm : '#' expr
- { mrg_2 = 074; exp_2 = $2;
- RELOMOVE(rel_2, relonami);
- }
- ;
- reg : DREG
- | AREG
- { $$ = $1 | 010;}
- ;
- sizedef : /* empty */
- { $$ = SIZE_DEF;}
- | SIZE
- ;
- sizenon : /* empty */
- { $$ = SIZE_NON;}
- | SIZE
- ;
- ea_ea : ea ','
- { mrg_1 = mrg_2; exp_1 = exp_2;
- RELOMOVE(rel_1, rel_2);
- }
- ea
- ;
|