aoptcpub.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. {
  2. $Id$
  3. Copyright (c) 1999 by Jonas Maebe, member of the Free Pascal
  4. Development Team
  5. This unit contains several types and constants necessary for the
  6. optimizer to work on the 80x86 architecture
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ****************************************************************************
  19. }
  20. Unit aoptcpub; { Assembler OPTimizer CPU Base }
  21. { enable the following define if memory references can have both a base and }
  22. { index register in 1 operand }
  23. {$define RefsHaveIndexReg}
  24. { enable the following define if memory references can have a scaled index }
  25. {$define RefsHaveScale}
  26. { enable the following define if memory references can have a segment }
  27. { override }
  28. {$define RefsHaveSegment}
  29. Interface
  30. Type
  31. { possible actions on an operand: read, write or modify (= read & write) }
  32. TOpAction = (OpAct_Read, OpAct_Write, OpAct_Modify, OpAct_Unknown);
  33. { type of a normal instruction }
  34. TInstr = Tai386;
  35. PInstr = ^TInstr;
  36. TFlag = (DirFlag);
  37. TFlagContents = (F_Unknown, F_Clear, F_Set);
  38. TCondRegs = Object
  39. Flags: Array[TFlag] of TFlagContents;
  40. Constructor Init;
  41. Procedure InitFlag(f: TFlag);
  42. Procedure SetFlag(f: TFlag);
  43. Procedure ClearFlag(f: TFlag);
  44. Function GetFlag(f: TFlag): TFlagContents;
  45. End;
  46. { What an instruction can change }
  47. TChange = (C_None,
  48. { Read from a predefined register }
  49. C_REAX, C_RECX, C_REDX, C_REBX, C_RESP, C_REBP, C_RESI, C_REDI,
  50. { write to a predefined register }
  51. C_WEAX, C_WECX, C_WEDX, C_WEBX, C_WESP, C_WEBP, C_WESI, C_WEDI,
  52. { read and write from/to a predefined register }
  53. C_RWEAX, C_RWECX, C_RWEDX, C_RWEBX, C_RWESP, C_RWEBP, C_RWESI, C_RWEDI,
  54. { modify the contents of a register with the purpose of using }
  55. { this changed content afterwards (add/sub/..., but e.g. not }
  56. { rep (ECX) or movsd (ESI/EDI) }
  57. {$ifdef arithopt}
  58. C_MEAX, C_MECX, C_MEDX, C_MEBX, C_MESP, C_MEBP, C_MESI, C_MEDI,
  59. {$endif arithopt}
  60. C_CDirFlag { clear direction flag }, C_SDirFlag { set dir flag },
  61. { read , write or read and write to the flags }
  62. C_RFlags, C_WFlags, C_RWFlags,
  63. { change the FPU registers }
  64. C_FPU,
  65. { read, write or both read and write from operand x }
  66. C_Rop1, C_Wop1, C_RWop1,
  67. C_Rop2, C_Wop2, C_RWop2,
  68. C_Rop3, C_WOp3, C_RWOp3,
  69. {$ifdef arithopt}
  70. { modify operand x }
  71. C_Mop1, C_Mop2, C_Mop3,
  72. {$endif arithopt}
  73. { write to the memory where edi points to (movsd/stosd) }
  74. C_WMemEDI,
  75. { assume all integer/general purpose registers are changed }
  76. C_All);
  77. Const
  78. {$ifndef arithopt}
  79. C_MEAX = C_RWEAX;
  80. C_MECX = C_RWECX;
  81. C_MEDX = C_RWEDX;
  82. C_MEBX = C_RWEBX;
  83. C_MESP = C_RWESP;
  84. C_MEBP = C_RWEBP;
  85. C_MESI = C_RWESI;
  86. C_MEDI = C_RWEDI;
  87. C_Mop1 = C_RWOp1;
  88. C_Mop2 = C_RWOp2;
  89. C_Mop3 = C_RWOp3;
  90. {$endif arithopt}
  91. { the maximum number of things (registers, memory, ...) a single instruction }
  92. { changes }
  93. MaxCh = 3;
  94. { the maximum number of operands an instruction has }
  95. MaxOps = 3;
  96. {Oper index of operand that contains the source (reference) with a load }
  97. {instruction }
  98. LoadSrc = 0;
  99. {Oper index of operand that contains the destination (register) with a load }
  100. {instruction }
  101. LoadDst = 1;
  102. {Oper index of operand that contains the source (register) with a store }
  103. {instruction }
  104. StoreSrc = 0;
  105. {Oper index of operand that contains the destination (reference) with a load }
  106. {instruction }
  107. StoreDst = 1;
  108. { low and high maximum width general purpose (integer) register }
  109. LoGPReg = R_EAX;
  110. HiGPReg = R_EDI;
  111. { low and high of every possible width general purpose register (same as }
  112. { above on most architctures apart from the 80x86) }
  113. LoReg = R_EAX;
  114. HiReg = R_BL;
  115. { Stack pointer }
  116. StackPtr = R_ESP;
  117. Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
  118. {A_<NONE>} (Ch: (C_All, C_None, C_None)), { new }
  119. {A_LOCK} (Ch: (C_None, C_None, C_None)),
  120. { the repCC instructions don't write to the flags themselves, but since }
  121. { they loop as long as CC is not fulfilled, it's possible that after the }
  122. { repCC instructions the flags have changed }
  123. {A_REP} (Ch: (C_RWECX, C_RWFlags, C_None)),
  124. {A_REPE} (Ch: (C_RWECX, C_RWFlags, C_None)),
  125. {A_REPNE} (Ch: (C_RWECX, C_RWFlags, C_None)),
  126. {A_REPNZ} (Ch: (C_RWECX, C_RWFLAGS, C_None)), { new }
  127. {A_REPZ} (Ch: (C_RWECX, C_RWFLAGS, C_None)), { new }
  128. {A_SEGCS} (Ch: (C_None, C_None, C_None)), { new }
  129. {A_SEGES} (Ch: (C_None, C_None, C_None)), { new }
  130. {A_SEGDS} (Ch: (C_None, C_None, C_None)), { new }
  131. {A_SEGFS} (Ch: (C_None, C_None, C_None)), { new }
  132. {A_SEGGS} (Ch: (C_None, C_None, C_None)), { new }
  133. {A_SEGSS} (Ch: (C_None, C_None, C_None)), { new }
  134. {A_AAA} (Ch: (C_MEAX, C_WFlags, C_None)),
  135. {A_AAD} (Ch: (C_MEAX, C_WFlags, C_None)),
  136. {A_AAM} (Ch: (C_MEAX, C_WFlags, C_None)),
  137. {A_AAS} (Ch: (C_MEAX, C_WFlags, C_None)),
  138. {A_ADC} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  139. {A_ADD} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  140. {A_AND} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  141. {A_ARPL} (Ch: (C_WFlags, C_None, C_None)),
  142. {A_BOUND} (Ch: (C_Rop1, C_None, C_None)),
  143. {A_BSF} (Ch: (C_Wop2, C_WFlags, C_Rop1)),
  144. {A_BSR} (Ch: (C_Wop2, C_WFlags, C_Rop1)),
  145. {A_BSWAP} (Ch: (C_MOp1, C_None, C_None)), { new }
  146. {A_BT} (Ch: (C_WFlags, C_Rop1, C_None)),
  147. {A_BTC} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  148. {A_BTR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  149. {A_BTS} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  150. {A_CALL} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  151. {A_CBW} (Ch: (C_MEAX, C_None, C_None)),
  152. {A_CDQ} (Ch: (C_MEAX, C_WEDX, C_None)),
  153. {A_CLC} (Ch: (C_WFlags, C_None, C_None)),
  154. {A_CLD} (Ch: (C_CDirFlag, C_None, C_None)),
  155. {A_CLI} (Ch: (C_WFlags, C_None, C_None)),
  156. {A_CLTS} (Ch: (C_None, C_None, C_None)),
  157. {A_CMC} (Ch: (C_WFlags, C_None, C_None)),
  158. {A_CMP} (Ch: (C_WFlags, C_None, C_None)),
  159. {A_CMPSB} (Ch: (C_All, C_None, C_None)), { new }
  160. {A_CMPSD} (Ch: (C_All, C_None, C_None)), { new }
  161. {A_CMPSW} (Ch: (C_All, C_None, C_None)), { new }
  162. {A_CMPXCHG} (Ch: (C_All, C_None, C_None)), { new }
  163. {A_CMPXCHG486} (Ch: (C_All, C_None, C_None)), { new }
  164. {A_CMPXCHG8B} (Ch: (C_All, C_None, C_None)), { new }
  165. {A_CPUID} (Ch: (C_All, C_None, C_none)),
  166. {A_CWD} (Ch: (C_MEAX, C_WEDX, C_None)),
  167. {A_CWDE} (Ch: (C_MEAX, C_None, C_None)),
  168. {A_DAA} (Ch: (C_MEAX, C_None, C_None)),
  169. {A_DAS} (Ch: (C_MEAX, C_None, C_None)),
  170. {A_DEC} (Ch: (C_Mop1, C_WFlags, C_None)),
  171. {A_DIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things}
  172. {A_EMMS} (Ch: (C_FPU, C_None, C_None)), { new }
  173. {A_ENTER} (Ch: (C_RWESP, C_None, C_None)),
  174. {A_EQU} (Ch: (C_ALL, C_None, C_None)), { new }
  175. {A_F2XM1} (Ch: (C_FPU, C_None, C_None)),
  176. {A_FABS} (Ch: (C_FPU, C_None, C_None)),
  177. {A_FADD} (Ch: (C_FPU, C_None, C_None)),
  178. {A_FADDP} (Ch: (C_FPU, C_None, C_None)),
  179. {A_FBLD} (Ch: (C_Rop1, C_FPU, C_None)),
  180. {A_FBSTP} (Ch: (C_Wop1, C_FPU, C_None)),
  181. {A_FCHS} (Ch: (C_FPU, C_None, C_None)),
  182. {A_FCLEX} (Ch: (C_FPU, C_None, C_None)),
  183. {A_FCMOVB} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  184. {A_FCMOVBE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  185. {A_FCMOVE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  186. {A_FCMOVNB} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  187. {A_FCMOVNBE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  188. {A_FCMOVNE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  189. {A_FCMOVNU} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  190. {A_FCMOVU} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  191. {A_FCOM} (Ch: (C_FPU, C_None, C_None)),
  192. {A_FCOMI} (Ch: (C_WFLAGS, C_None, C_None)), { new }
  193. {A_FCOMIP} (Ch: (C_FPU, C_WFLAGS, C_None)), { new }
  194. {A_FCOMP} (Ch: (C_FPU, C_None, C_None)),
  195. {A_FCOMPP} (Ch: (C_FPU, C_None, C_None)),
  196. {A_FCOS} (Ch: (C_FPU, C_None, C_None)),
  197. {A_FDECSTP} (Ch: (C_FPU, C_None, C_None)),
  198. {A_FDISI} (Ch: (C_FPU, C_None, C_None)),
  199. {A_FDIV} (Ch: (C_FPU, C_None, C_None)),
  200. {A_FDIVP} (Ch: (C_FPU, C_None, C_None)),
  201. {A_FDIVR} (Ch: (C_FPU, C_None, C_None)),
  202. {A_FDIVRP} (Ch: (C_FPU, C_None, C_None)),
  203. {A_FEMMS} (Ch: (C_All, C_None, C_None)), { new }
  204. {A_FENI} (Ch: (C_FPU, C_None, C_None)),
  205. {A_FFREE} (Ch: (C_FPU, C_None, C_None)),
  206. {A_FIADD} (Ch: (C_FPU, C_None, C_None)),
  207. {A_FICOM} (Ch: (C_FPU, C_None, C_None)),
  208. {A_FICOMP} (Ch: (C_FPU, C_None, C_None)),
  209. {A_FIDIV} (Ch: (C_FPU, C_None, C_None)),
  210. {A_FIDIVR} (Ch: (C_FPU, C_None, C_None)),
  211. {A_FILD} (Ch: (C_FPU, C_None, C_None)),
  212. {A_FIMUL} (Ch: (C_FPU, C_None, C_None)),
  213. {A_FINCSTP} (Ch: (C_FPU, C_None, C_None)),
  214. {A_FINIT} (Ch: (C_FPU, C_None, C_None)),
  215. {A_FIST} (Ch: (C_Wop1, C_None, C_None)),
  216. {A_FISTP} (Ch: (C_Wop1, C_None, C_None)),
  217. {A_FISUB} (Ch: (C_FPU, C_None, C_None)),
  218. {A_FISUBR} (Ch: (C_FPU, C_None, C_None)), { new }
  219. {A_FLD} (Ch: (C_Rop1, C_FPU, C_None)),
  220. {A_FLD1} (Ch: (C_FPU, C_None, C_None)),
  221. {A_FLDCW} (Ch: (C_FPU, C_None, C_None)),
  222. {A_FLDENV} (Ch: (C_FPU, C_None, C_None)),
  223. {A_FLDL2E} (Ch: (C_FPU, C_None, C_None)),
  224. {A_FLDL2T} (Ch: (C_FPU, C_None, C_None)),
  225. {A_FLDLG2} (Ch: (C_FPU, C_None, C_None)),
  226. {A_FLDLN2} (Ch: (C_FPU, C_None, C_None)),
  227. {A_FLDPI} (Ch: (C_FPU, C_None, C_None)),
  228. {A_FLDZ} (Ch: (C_FPU, C_None, C_None)),
  229. {A_FMUL} (Ch: (C_ROp1, C_FPU, C_None)),
  230. {A_FMULP} (Ch: (C_ROp1, C_FPU, C_None)),
  231. {A_FNCLEX} (Ch: (C_FPU, C_None, C_None)),
  232. {A_FNDISI} (Ch: (C_FPU, C_None, C_None)),
  233. {A_FNENI} (Ch: (C_FPU, C_None, C_None)),
  234. {A_FNINIT} (Ch: (C_FPU, C_None, C_None)),
  235. {A_FNOP} (Ch: (C_FPU, C_None, C_None)),
  236. {A_FNSAVE} (Ch: (C_FPU, C_None, C_None)),
  237. {A_FNSTCW} (Ch: (C_Wop1, C_None, C_None)),
  238. {A_FNSTENV} (Ch: (C_Wop1, C_None, C_None)),
  239. {A_FNSTSW} (Ch: (C_Wop1, C_None, C_None)),
  240. {A_FPATAN} (Ch: (C_FPU, C_None, C_None)),
  241. {A_FPREM} (Ch: (C_FPU, C_None, C_None)),
  242. {A_FPREM1} (Ch: (C_FPU, C_None, C_None)),
  243. {A_FPTAN} (Ch: (C_FPU, C_None, C_None)),
  244. {A_FRNDINT} (Ch: (C_FPU, C_None, C_None)),
  245. {A_FRSTOR} (Ch: (C_FPU, C_None, C_None)),
  246. {A_FSAVE} (Ch: (C_Wop1, C_None, C_None)),
  247. {A_FSCALE} (Ch: (C_FPU, C_None, C_None)),
  248. {A_FSETPM} (Ch: (C_FPU, C_None, C_None)),
  249. {A_FSIN} (Ch: (C_FPU, C_None, C_None)),
  250. {A_FSINCOS} (Ch: (C_FPU, C_None, C_None)),
  251. {A_FSQRT} (Ch: (C_FPU, C_None, C_None)),
  252. {A_FST} (Ch: (C_Wop1, C_None, C_None)),
  253. {A_FSTCW} (Ch: (C_Wop1, C_None, C_None)),
  254. {A_FSTENV} (Ch: (C_Wop1, C_None, C_None)),
  255. {A_FSTP} (Ch: (C_Wop1, C_FPU, C_None)),
  256. {A_FSTSW} (Ch: (C_Wop1, C_None, C_None)),
  257. {A_FSUB} (Ch: (C_ROp1, C_FPU, C_None)),
  258. {A_FSUBP} (Ch: (C_ROp1, C_FPU, C_None)),
  259. {A_FSUBR} (Ch: (C_ROp1, C_FPU, C_None)),
  260. {A_FSUBRP} (Ch: (C_ROp1, C_FPU, C_None)),
  261. {A_FTST} (Ch: (C_FPU, C_None, C_None)),
  262. {A_FUCOM} (Ch: (C_None, C_None, C_None)), {changes fpu status word}
  263. {A_FUCOMI} (Ch: (C_WFLAGS, C_None, C_None)), { new }
  264. {A_FUCOMIP} (Ch: (C_FPU, C_WFLAGS, C_None)), { new }
  265. {A_FUCOMP} (Ch: (C_FPU, C_None, C_None)),
  266. {A_FUCOMPP} (Ch: (C_FPU, C_None, C_None)),
  267. {A_FWAIT} (Ch: (C_FPU, C_None, C_None)),
  268. {A_FXAM} (Ch: (C_FPU, C_None, C_None)),
  269. {A_FXCH} (Ch: (C_FPU, C_None, C_None)),
  270. {A_FXTRACT} (Ch: (C_FPU, C_None, C_None)),
  271. {A_FYL2X} (Ch: (C_FPU, C_None, C_None)),
  272. {A_FYL2XP1} (Ch: (C_FPU, C_None, C_None)),
  273. {A_HLT} (Ch: (C_None, C_None, C_None)),
  274. {A_IBTS} (Ch: (C_All, C_None, C_None)), { new }
  275. {A_ICEBP} (Ch: (C_All, C_None, C_None)), { new }
  276. {A_IDIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things}
  277. {A_IMUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because several forms exist}
  278. {A_IN} (Ch: (C_Wop2, C_Rop1, C_None)),
  279. {A_INC} (Ch: (C_Mop1, C_WFlags, C_None)),
  280. {A_INSB} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new }
  281. {A_INSD} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new }
  282. {A_INSW} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new }
  283. {A_INT} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  284. {A_INT01} (Ch: (C_All, C_None, C_None)), { new }
  285. {A_INT1} (Ch: (C_All, C_None, C_None)), { new }
  286. {A_INT3} (Ch: (C_None, C_None, C_None)),
  287. {A_INTO} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  288. {A_INVD} (Ch: (C_All, C_None, C_None)), { new }
  289. {A_INVLPG} (Ch: (C_All, C_None, C_None)), { new }
  290. {A_IRET} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  291. {A_IRETD} (Ch: (C_All, C_None, C_None)), { new }
  292. {A_IRETW} (Ch: (C_All, C_None, C_None)), { new }
  293. {A_JCXZ} (Ch: (C_RECX, C_None, C_None)),
  294. {A_JECXZ} (Ch: (C_RECX, C_None, C_None)),
  295. {A_JMP} (Ch: (C_None, C_None, C_None)),
  296. {A_LAHF} (Ch: (C_WEAX, C_RFlags, C_None)),
  297. {A_LAR} (Ch: (C_Wop2, C_None, C_None)),
  298. {A_LDS} (Ch: (C_Wop2, C_None, C_None)),
  299. {A_LEA} (Ch: (C_Wop2, C_Rop1, C_None)),
  300. {A_LEAVE} (Ch: (C_RWESP, C_None, C_None)),
  301. {A_LES} (Ch: (C_Wop2, C_None, C_None)),
  302. {A_LFS} (Ch: (C_Wop2, C_None, C_None)),
  303. {A_LGDT} (Ch: (C_None, C_None, C_None)),
  304. {A_LGS} (Ch: (C_Wop2, C_None, C_None)),
  305. {A_LIDT} (Ch: (C_None, C_None, C_None)),
  306. {A_LLDT} (Ch: (C_None, C_None, C_None)),
  307. {A_LMSW} (Ch: (C_None, C_None, C_None)),
  308. {A_LOADALL} (Ch: (C_All, C_None, C_None)), { new }
  309. {A_LOADALL286} (Ch: (C_All, C_None, C_None)), { new }
  310. {A_LODSB} (Ch: (C_WEAX, C_RWESI, C_None)), { new }
  311. {A_LODSD} (Ch: (C_WEAX, C_RWESI, C_None)), { new }
  312. {A_LODSW} (Ch: (C_WEAX, C_RWESI, C_None)), { new }
  313. {A_LOOP} (Ch: (C_RWECX, C_None, C_None)),
  314. {A_LOOPE} (Ch: (C_RWECX, C_RFlags, C_None)),
  315. {A_LOOPNE} (Ch: (C_RWECX, C_RFlags, C_None)),
  316. {A_LOOPNZ} (Ch: (C_RWECX, C_RFlags, C_None)),
  317. {A_LOOPZ} (Ch: (C_RWECX, C_RFlags, C_None)),
  318. {A_LSL} (Ch: (C_Wop2, C_WFlags, C_None)),
  319. {A_LSS} (Ch: (C_Wop2, C_None, C_None)),
  320. {A_LTR} (Ch: (C_None, C_None, C_None)),
  321. {A_MOV} (Ch: (C_Wop2, C_Rop1, C_None)),
  322. {A_MOVD} (Ch: (C_All, C_None, C_None)), { new }
  323. {A_MOVQ} (Ch: (C_All, C_None, C_None)), { new }
  324. {A_MOVSB} (Ch: (C_All, C_Rop1, C_None)),
  325. {A_MOVSD} (Ch: (C_All, C_None, C_None)), { new }
  326. {A_MOVSW} (Ch: (C_All, C_None, C_None)), { new }
  327. {A_MOVSX} (Ch: (C_Wop2, C_Rop1, C_None)),
  328. {A_MOVZX} (Ch: (C_Wop2, C_Rop1, C_None)),
  329. {A_MUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things}
  330. {A_NEG} (Ch: (C_Mop1, C_None, C_None)),
  331. {A_NOP} (Ch: (C_None, C_None, C_None)),
  332. {A_NOT} (Ch: (C_Mop1, C_WFlags, C_None)),
  333. {A_OR} (Ch: (C_Mop2, C_WFlags, C_None)),
  334. {A_OUT} (Ch: (C_Rop1, C_Rop2, C_None)),
  335. {A_OUTSB} (Ch: (C_All, C_None, C_None)), { new }
  336. {A_OUTSD} (Ch: (C_All, C_None, C_None)), { new }
  337. {A_OUTSW} (Ch: (C_All, C_None, C_None)), { new }
  338. {A_PACKSSDW} (Ch: (C_All, C_None, C_None)), { new }
  339. {A_PACKSSWB} (Ch: (C_All, C_None, C_None)), { new }
  340. {A_PACKUSWB} (Ch: (C_All, C_None, C_None)), { new }
  341. {A_PADDB} (Ch: (C_All, C_None, C_None)), { new }
  342. {A_PADDD} (Ch: (C_All, C_None, C_None)), { new }
  343. {A_PADDSB} (Ch: (C_All, C_None, C_None)), { new }
  344. {A_PADDSIW} (Ch: (C_All, C_None, C_None)), { new }
  345. {A_PADDSW} (Ch: (C_All, C_None, C_None)), { new }
  346. {A_PADDUSB} (Ch: (C_All, C_None, C_None)), { new }
  347. {A_PADDUSW} (Ch: (C_All, C_None, C_None)), { new }
  348. {A_PADDW} (Ch: (C_All, C_None, C_None)), { new }
  349. {A_PAND} (Ch: (C_All, C_None, C_None)), { new }
  350. {A_PANDN} (Ch: (C_All, C_None, C_None)), { new }
  351. {A_PAVEB} (Ch: (C_All, C_None, C_None)), { new }
  352. {A_PAVGUSB} (Ch: (C_All, C_None, C_None)), { new }
  353. {A_PCMPEQB} (Ch: (C_All, C_None, C_None)), { new }
  354. {A_PCMPEQD} (Ch: (C_All, C_None, C_None)), { new }
  355. {A_PCMPEQW} (Ch: (C_All, C_None, C_None)), { new }
  356. {A_PCMPGTB} (Ch: (C_All, C_None, C_None)), { new }
  357. {A_PCMPGTD} (Ch: (C_All, C_None, C_None)), { new }
  358. {A_PCMPGTW} (Ch: (C_All, C_None, C_None)), { new }
  359. {A_PDISTIB} (Ch: (C_All, C_None, C_None)), { new }
  360. {A_PF2ID} (Ch: (C_All, C_None, C_None)), { new }
  361. {A_PFACC} (Ch: (C_All, C_None, C_None)), { new }
  362. {A_PFADD} (Ch: (C_All, C_None, C_None)), { new }
  363. {A_PFCMPEQ} (Ch: (C_All, C_None, C_None)), { new }
  364. {A_PFCMPGE} (Ch: (C_All, C_None, C_None)), { new }
  365. {A_PFCMPGT} (Ch: (C_All, C_None, C_None)), { new }
  366. {A_PFMAX} (Ch: (C_All, C_None, C_None)), { new }
  367. {A_PFMIN} (Ch: (C_All, C_None, C_None)), { new }
  368. {A_PFMUL} (Ch: (C_All, C_None, C_None)), { new }
  369. {A_PFRCP} (Ch: (C_All, C_None, C_None)), { new }
  370. {A_PFRCPIT1} (Ch: (C_All, C_None, C_None)), { new }
  371. {A_PFRCPIT2} (Ch: (C_All, C_None, C_None)), { new }
  372. {A_PFRSQIT1} (Ch: (C_All, C_None, C_None)), { new }
  373. {A_PFRSQRT} (Ch: (C_All, C_None, C_None)), { new }
  374. {A_PFSUB} (Ch: (C_All, C_None, C_None)), { new }
  375. {A_PFSUBR} (Ch: (C_All, C_None, C_None)), { new }
  376. {A_PI2FD} (Ch: (C_All, C_None, C_None)), { new }
  377. {A_PMACHRIW} (Ch: (C_All, C_None, C_None)), { new }
  378. {A_PMADDWD} (Ch: (C_All, C_None, C_None)), { new }
  379. {A_PMAGW} (Ch: (C_All, C_None, C_None)), { new }
  380. {A_PMULHRIW} (Ch: (C_All, C_None, C_None)), { new }
  381. {A_PMULHRWA} (Ch: (C_All, C_None, C_None)), { new }
  382. {A_PMULHRWC} (Ch: (C_All, C_None, C_None)), { new }
  383. {A_PMULHW} (Ch: (C_All, C_None, C_None)), { new }
  384. {A_PMULLW} (Ch: (C_All, C_None, C_None)), { new }
  385. {A_PMVGEZB} (Ch: (C_All, C_None, C_None)), { new }
  386. {A_PMVLZB} (Ch: (C_All, C_None, C_None)), { new }
  387. {A_PMVNZB} (Ch: (C_All, C_None, C_None)), { new }
  388. {A_PMVZB} (Ch: (C_All, C_None, C_None)), { new }
  389. {A_POP} (Ch: (C_Wop1, C_RWESP, C_None)),
  390. {A_POPA} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  391. {A_POPAD} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  392. {A_POPAW} (Ch: (C_All, C_None, C_None)), { new }
  393. {A_POPF} (Ch: (C_RWESP, C_WFlags, C_None)),
  394. {A_POPFD} (Ch: (C_RWESP, C_WFlags, C_None)),
  395. {A_POPFW} (Ch: (C_RWESP, C_WFLAGS, C_None)), { new }
  396. {A_POR} (Ch: (C_All, C_None, C_None)), { new }
  397. {A_PREFETCH} (Ch: (C_All, C_None, C_None)), { new }
  398. {A_PREFETCHW} (Ch: (C_All, C_None, C_None)), { new }
  399. {A_PSLLD} (Ch: (C_All, C_None, C_None)), { new }
  400. {A_PSLLQ} (Ch: (C_All, C_None, C_None)), { new }
  401. {A_PSLLW} (Ch: (C_All, C_None, C_None)), { new }
  402. {A_PSRAD} (Ch: (C_All, C_None, C_None)), { new }
  403. {A_PSRAW} (Ch: (C_All, C_None, C_None)), { new }
  404. {A_PSRLD} (Ch: (C_All, C_None, C_None)), { new }
  405. {A_PSRLQ} (Ch: (C_All, C_None, C_None)), { new }
  406. {A_PSRLW} (Ch: (C_All, C_None, C_None)), { new }
  407. {A_PSUBB} (Ch: (C_All, C_None, C_None)), { new }
  408. {A_PSUBD} (Ch: (C_All, C_None, C_None)), { new }
  409. {A_PSUBSB} (Ch: (C_All, C_None, C_None)), { new }
  410. {A_PSUBSIW} (Ch: (C_All, C_None, C_None)), { new }
  411. {A_PSUBSW} (Ch: (C_All, C_None, C_None)), { new }
  412. {A_PSUBUSB} (Ch: (C_All, C_None, C_None)), { new }
  413. {A_PSUBUSW} (Ch: (C_All, C_None, C_None)), { new }
  414. {A_PSUBW} (Ch: (C_All, C_None, C_None)), { new }
  415. {A_PUNPCKHBW} (Ch: (C_All, C_None, C_None)), { new }
  416. {A_PUNPCKHDQ} (Ch: (C_All, C_None, C_None)), { new }
  417. {A_PUNPCKHWD} (Ch: (C_All, C_None, C_None)), { new }
  418. {A_PUNPCKLBW} (Ch: (C_All, C_None, C_None)), { new }
  419. {A_PUNPCKLDQ} (Ch: (C_All, C_None, C_None)), { new }
  420. {A_PUNPCKLWD} (Ch: (C_All, C_None, C_None)), { new }
  421. {A_PUSH} (Ch: (C_Rop1, C_RWESP, C_None)),
  422. {A_PUSHA} (Ch: (C_All, C_None, C_None)),
  423. {A_PUSHAD} (Ch: (C_All, C_None, C_None)),
  424. {A_PUSHAW} (Ch: (C_All, C_None, C_None)), { new }
  425. {A_PUSHF} (Ch: (C_RWESP, C_RFlags, C_None)),
  426. {A_PUSHFD} (Ch: (C_RWESP, C_RFlags, C_None)),
  427. {A_PUSHFW} (Ch: (C_RWESP, C_RFLAGS, C_None)), { new }
  428. {A_PXOR} (Ch: (C_All, C_None, C_None)), { new }
  429. {A_RCL} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  430. {A_RCR} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  431. {A_RDMSR} (Ch: (C_WEAX, C_WEDX, C_None)), { new }
  432. {A_RDPMC} (Ch: (C_WEAX, C_WEDX, C_None)), { new }
  433. {A_RDTSC} (Ch: (C_WEAX, C_WEDX, C_None)), { new }
  434. {A_RESB} (Ch: (C_All, C_None, C_None)), { new }
  435. {A_RET} (Ch: (C_All, C_None, C_None)),
  436. {A_RETF} (Ch: (C_All, C_None, C_None)), { new }
  437. {A_RETN} (Ch: (C_All, C_None, C_None)), { new }
  438. {A_ROL} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  439. {A_ROR} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  440. {A_RSM} (Ch: (C_All, C_None, C_None)), { new }
  441. {A_SAHF} (Ch: (C_WFlags, C_REAX, C_None)),
  442. {A_SAL} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  443. {A_SALC} (Ch: (C_WEAX, C_RFLAGS, C_None)), { new }
  444. {A_SAR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  445. {A_SBB} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  446. {A_SCASB} (Ch: (C_All, C_None, C_None)), { new }
  447. {A_SCASD} (Ch: (C_All, C_None, C_None)), { new }
  448. {A_SCASW} (Ch: (C_All, C_None, C_None)), { new }
  449. {A_SGDT} (Ch: (C_Wop1, C_None, C_None)),
  450. {A_SHL} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  451. {A_SHLD} (Ch: (C_MOp3, C_RWFlags, C_Rop2)),
  452. {A_SHR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  453. {A_SHRD} (Ch: (C_MOp3, C_RWFlags, C_Rop2)),
  454. {A_SIDT} (Ch: (C_Wop1, C_None, C_None)),
  455. {A_SLDT} (Ch: (C_Wop1, C_None, C_None)),
  456. {A_SMI} (Ch: (C_All, C_None, C_None)), { new }
  457. {A_SMSW} (Ch: (C_Wop1, C_None, C_None)),
  458. {A_STC} (Ch: (C_WFlags, C_None, C_None)),
  459. {A_STD} (Ch: (C_SDirFlag, C_None, C_None)),
  460. {A_STI} (Ch: (C_WFlags, C_None, C_None)),
  461. {A_STOSB} (Ch: (C_REAX, C_WMemEDI, C_RWEDI)), { new }
  462. {A_STOSD} (Ch: (C_REAX, C_WMemEDI, C_RWEDI)), { new }
  463. {A_STOSW} (Ch: (C_REAX, C_WMemEDI, C_RWEDI)), { new }
  464. {A_STR} (Ch: (C_Wop1, C_None, C_None)),
  465. {A_SUB} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  466. {A_TEST} (Ch: (C_WFlags, C_Rop1, C_Rop2)),
  467. {A_UMOV} (Ch: (C_All, C_None, C_None)), { new }
  468. {A_VERR} (Ch: (C_WFlags, C_None, C_None)),
  469. {A_VERW} (Ch: (C_WFlags, C_None, C_None)),
  470. {A_WAIT} (Ch: (C_None, C_None, C_None)),
  471. {A_WBINVD} (Ch: (C_None, C_None, C_None)), { new }
  472. {A_WRMSR} (Ch: (C_All, C_None, C_None)), { new }
  473. {A_XADD} (Ch: (C_All, C_None, C_None)), { new }
  474. {A_XBTS} (Ch: (C_All, C_None, C_None)), { new }
  475. {A_XCHG} (Ch: (C_RWop1, C_RWop2, C_None)), {(might be) handled seperately}
  476. {A_XLAT} (Ch: (C_WEAX, C_REBX, C_None)),
  477. {A_XLATB} (Ch: (C_WEAX, C_REBX, C_None)),
  478. {A_XOR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  479. {A_CMOV} (Ch: (C_ROp1, C_WOp2, C_RFLAGS)), { new }
  480. {A_J} (Ch: (C_None, C_None, C_None)), { new }
  481. {A_SET} (Ch: (C_WEAX, C_RFLAGS, C_None)) { new }
  482. );
  483. Implementation
  484. {************************ TCondRegs ************************}
  485. Constructor TCondRegs.init;
  486. Begin
  487. FillChar(Flags, SizeOf(Flags), Byte(F_Unknown))
  488. End;
  489. Procedure TCondRegs.InitFlag(f: TFlag);
  490. Begin
  491. Flags[f] := F_Unknown
  492. End;
  493. Procedure TCondRegs.SetFlag(f: TFlag);
  494. Begin
  495. Flags[f] := F_Set
  496. End;
  497. Procedure TCondRegs.ClearFlag(f: TFlag);
  498. Begin
  499. Flags[f] : =F_Clear
  500. End;
  501. Function TCondRegs.GetFlag(f: TFlag): TFlagContents;
  502. Begin
  503. GetFlag := Flags[f]
  504. End;
  505. End.
  506. {
  507. $Log$
  508. Revision 1.2 1999-08-11 14:24:38 jonas
  509. - removed RefsHaveSymbol define (I think references on all processors can have a symbol)
  510. Revision 1.1 1999/08/09 14:07:28 jonas
  511. commit.msg
  512. }