mach4.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /* @(#)mach4.c 1.11 */
  2. /*
  3. * Motorola 68000/68010 syntax rules
  4. */
  5. operation
  6. : bcdx DREG ',' DREG
  7. { emit2($1 | $2 | $4<<9);}
  8. | bcdx '-' '(' AREG ')' ',' '-' '(' AREG ')'
  9. { emit2($1 | $4 | $9<<9 | 010);}
  10. | ADD sizedef ea_ea
  11. { add($1, $2);}
  12. | AND sizenon ea_ea
  13. { and($1, $2);}
  14. | SHIFT sizedef ea_ea
  15. { shift_op($1, $2);}
  16. | BR expr
  17. { branch($1, $2);}
  18. | DBR DREG ',' expr
  19. { $4.val -= (DOTVAL+2);
  20. fit(fitw($4.val));
  21. emit2($1 | $2);
  22. #ifdef RELOCATION
  23. #ifdef DUK
  24. newrelo($4.typ, RELPC|RELO2|RELBR|RELWR);
  25. #else DUK
  26. newrelo($4.typ, RELPC|RELO2);
  27. #endif DUK
  28. #endif
  29. emit2(loww($4.val));
  30. }
  31. | BITOP ea_ea
  32. { bitop($1);}
  33. | OP_EA_D ea ',' DREG
  34. { emit2($1 | mrg_2 | $4<<9);
  35. ea_2(SIZE_W, DTA);
  36. }
  37. | LEA ea ',' AREG
  38. { emit2(040700 | mrg_2 | $4<<9);
  39. ea_2(SIZE_L, CTR);
  40. }
  41. | op_ea ea
  42. { emit2(($1&0177700) | mrg_2);
  43. ea_2($1&0300, $1&017);
  44. }
  45. | OP_NOOP
  46. { emit2($1);}
  47. | CMP sizedef ea_ea
  48. { cmp($2);}
  49. | MOVE sizenon ea_ea
  50. { move($2);}
  51. | MOVEP sizedef ea_ea
  52. { movep($2);}
  53. | MOVEM sizedef regs ',' notimmreg
  54. { movem(0, $2, $3);}
  55. | MOVEM sizedef notimmreg ',' regs
  56. { movem(1, $2, $5);}
  57. | MOVES sizedef ea_ea
  58. { test68010();
  59. if (mrg_1 <= 017) {
  60. emit2(007000 | $2 | mrg_2);
  61. emit2(mrg_1 << 12 | 04000);
  62. ea_2($2,ALT|MEM);
  63. } else if (mrg_2 <= 017) {
  64. emit2(007000 | $2 | mrg_1);
  65. emit2(mrg_2 << 12);
  66. ea_1($2,ALT|MEM);
  67. } else
  68. badoperand();
  69. }
  70. | MOVEC creg ',' reg
  71. { test68010();
  72. emit2(047172); emit2($2 | $4<<12);
  73. }
  74. | MOVEC reg ',' creg
  75. { test68010();
  76. emit2(047173); emit2($4 | $2<<12);
  77. }
  78. | EXG reg ',' reg
  79. { if (($2 & 010) == 0)
  80. emit2(
  81. (0140500|$4|$2<<9)
  82. +
  83. (($4&010)<<3)
  84. );
  85. else
  86. emit2(
  87. (0140600|$2|($4&07)<<9)
  88. -
  89. (($4&010)<<3)
  90. );
  91. }
  92. | OP_EXT sizedef DREG
  93. { checksize($2, 2|4); emit2(044000 | $2+0100 | $3);}
  94. | SWAP DREG
  95. { emit2(044100 | $2);}
  96. | STOP imm
  97. { emit2($1); ea_2(SIZE_W, 0);}
  98. | LINK AREG ',' imm
  99. { emit2(047120 | $2); ea_2(SIZE_W, 0);}
  100. | UNLK AREG
  101. { emit2(047130 | $2);}
  102. | TRAP '#' absexp
  103. { fit(fit4($3)); emit2(047100|low4($3));}
  104. | RTD imm
  105. { test68010();
  106. emit2(047164);
  107. ea_2(SIZE_W, 0);
  108. }
  109. | MODEL
  110. { model = $1;}
  111. ;
  112. bcdx : ABCD
  113. | ADDX sizedef
  114. { $$ = $1 | $2;}
  115. ;
  116. creg : CREG
  117. | SPEC { if ($1 != 075) badoperand(); $$ = 04000;}
  118. ;
  119. op_ea : OP_EA
  120. | SZ_EA sizedef
  121. { $$ = $1 | $2;}
  122. ;
  123. regs : rrange
  124. | regs '/' rrange
  125. { $$ = $1 | $3;}
  126. ;
  127. rrange : reg
  128. { $$ = 1<<$1;}
  129. | reg '-' reg
  130. { if ($1 > $3)
  131. badoperand();
  132. for ($$ = 0; $1 <= $3; $1++)
  133. $$ |= (1<<$1);
  134. }
  135. ;
  136. ea : DREG
  137. { mrg_2 = $1;}
  138. | AREG
  139. { mrg_2 = 010 | $1;}
  140. | SPEC
  141. { mrg_2 = $1;}
  142. | notimmreg
  143. | imm
  144. ;
  145. notimmreg
  146. : '(' AREG ')'
  147. { mrg_2 = 020 | $2;}
  148. | '(' AREG ')' '+'
  149. { mrg_2 = 030 | $2;}
  150. | '-' '(' AREG ')'
  151. { mrg_2 = 040 | $3;}
  152. | expr sizenon
  153. { exp_2 = $1; ea707172($2);
  154. RELOMOVE(rel_2, relonami);
  155. }
  156. | expr '(' reg sizenon ')'
  157. { exp_2 = $1; ea5x73($3, $4);
  158. RELOMOVE(rel_2, relonami);
  159. }
  160. | expr '(' AREG ',' reg sizedef ')'
  161. { exp_2 = $1; ea6x($3, $5, $6);
  162. RELOMOVE(rel_2, relonami);
  163. }
  164. | expr '(' PC ')'
  165. { exp_2 = $1; ea72();
  166. RELOMOVE(rel_2, relonami);
  167. }
  168. | expr '(' PC ',' reg sizedef ')'
  169. { exp_2 = $1; ea73($5, $6);
  170. RELOMOVE(rel_2, relonami);
  171. }
  172. ;
  173. imm : '#' expr
  174. { mrg_2 = 074; exp_2 = $2;
  175. RELOMOVE(rel_2, relonami);
  176. }
  177. ;
  178. reg : DREG
  179. | AREG
  180. { $$ = $1 | 010;}
  181. ;
  182. sizedef : /* empty */
  183. { $$ = SIZE_DEF;}
  184. | SIZE
  185. ;
  186. sizenon : /* empty */
  187. { $$ = SIZE_NON;}
  188. | SIZE
  189. ;
  190. ea_ea : ea ','
  191. { mrg_1 = mrg_2; exp_1 = exp_2;
  192. RELOMOVE(rel_1, rel_2);
  193. }
  194. ea
  195. ;