123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #define RCSID4 "$Id$"
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- *
- */
- operation
- : prefix oper
- ;
- prefix : /* empty */
- | prefix PREFIX
- { emit1($2);}
- ;
- oper : NOOP_1
- { emit1($1);}
- | NOOP_2
- { emit2($1);}
- | JOP expr
- { branch($1,$2);}
- | PUSHOP ea_1
- { pushop($1);}
- | IOOP expr
- { emit1($1);
- #ifdef RELOCATION
- newrelo($2.typ, RELO1);
- #endif
- emit1($2.val);
- }
- | IOOP R16
- { if ($2!=2) serror("register error");
- emit1($1+010);
- }
- | ADDOP ea_ea
- { addop($1);}
- | ROLOP ea_ea
- { rolop($1);}
- | INCOP ea_1
- { incop($1);}
- | IMUL ea_ea
- { imul($1);}
- | IMUL ea_1
- { regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
- | NOTOP ea_1
- { regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
- | CALLOP ea_1
- { callop($1&0xFFFF);}
- | CALFOP expr ':' expr
- { emit1($1>>8);
- #ifdef RELOCATION
- newrelo($4.typ, RELO2);
- #endif
- emit2($4.val);
- #ifdef RELOCATION
- newrelo($2.typ, RELO2);
- #endif
- emit2($2.val);
- }
- | CALFOP mem
- { emit1(0377); ea_2($1&0xFF);}
- | ENTER absexp ',' absexp
- { fit(fitw($2)); fit(fitb($4));
- emit1($1); emit2((int)$2); emit1((int)$4);
- }
- | LEAOP R16 ',' mem
- { emit1($1); ea_2($2<<3);}
- | ARPLOP mem ',' R16
- { emit1($1); ea_2($4<<3);}
- | EXTOP R16 ',' ea_2
- { emit1(0xF); emit1($1);
- ea_2($2<<3);
- }
- | EXTOP1 ea_1
- { regsize(1); emit1(0xF); emit1($1&07);
- ea_1($1&070);
- }
- | ESC absexp ',' mem
- { fit(fit6($2));
- emit1(0330 | $2>>3);
- ea_2(($2&7)<<3);
- }
- | INT absexp
- { if ($2==3)
- emit1(0314);
- else {
- emit1(0315); emit1($2);
- }
- }
- | RET
- { emit1($1);}
- | RET expr
- { emit1($1-1);
- #ifdef RELOCATION
- newrelo($2.typ, RELO2);
- #endif
- emit2($2.val);
- }
- | XCHG ea_ea
- { xchg($1);}
- | TEST ea_ea
- { test($1);}
- | MOV ea_ea
- { mov($1);}
- /* Intel 8087 coprocessor instructions */
- | FNOOP
- { emit1($1); emit1($1>>8);}
- | FMEM mem
- { emit1($1); ea_2(($1>>8)&070);}
- | FST_I st_i
- { emit1($1); emit1(($1>>8)|$2); }
- | FST_I ST
- { emit1($1); emit1($1>>8); }
- | FST_ST ST ',' st_i
- { emit1($1); emit1(($1>>8)|$4); }
- | FST_ST2 ST ',' st_i
- { emit1($1); emit1(($1>>8)|$4); }
- | FST_ST st_i ',' ST
- { emit1($1|4); emit1((($1>>8)|$2)); }
- | FST_ST2 st_i ',' ST
- { emit1($1|4); emit1((($1>>8)|$2)^010); }
- ;
- st_i : ST '(' absexp ')'
- { if (!fit3($3)) {
- serror("illegal index in FP stack");
- }
- $$ = $3;
- }
- ;
- mem : '(' expr ')'
- { mrg_2 = 6; exp_2 = $2;
- RELOMOVE(rel_2, relonami);
- }
- | bases
- { exp_2.val = 0; exp_2.typ = S_ABS; indexed();}
- | expr bases
- { exp_2 = $1; indexed();
- RELOMOVE(rel_2, relonami);
- }
- ;
- bases : '(' R16 ')'
- { mrg_2 = sr_m[$2];}
- | '(' R16 ')' '(' R16 ')'
- { mrg_2 = dr_m[$2][$5];}
- ;
- ea_2 : mem
- | R8
- { mrg_2 = $1 | 0300;}
- | R16
- { mrg_2 = $1 | 0310;}
- | RSEG
- { mrg_2 = $1 | 020;}
- | expr
- { mrg_2 = 040; exp_2 = $1;
- RELOMOVE(rel_2, relonami);
- }
- ;
- ea_1 : ea_2
- { mrg_1 = mrg_2; exp_1 = exp_2;
- RELOMOVE(rel_1, rel_2);
- }
- ;
- ea_ea : ea_1 ',' ea_2
- ;
|