aoptcpub.pas 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  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 specific 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. uses aasm, cpubase, cpuasm, aoptbase;
  31. Type
  32. { possible actions on an operand: read, write or modify (= read & write) }
  33. TOpAction = (OpAct_Read, OpAct_Write, OpAct_Modify, OpAct_Unknown);
  34. { type of a normal instruction }
  35. TInstr = Taicpu;
  36. PInstr = ^TInstr;
  37. TFlag = (DirFlag);
  38. TFlagContents = (F_Unknown, F_Clear, F_Set);
  39. { ************************************************************************* }
  40. { **************************** TCondRegs ********************************** }
  41. { ************************************************************************* }
  42. { Info about the conditional registers }
  43. TCondRegs = Object
  44. Flags: Array[TFlag] of TFlagContents;
  45. Constructor Init;
  46. Procedure InitFlag(f: TFlag);
  47. Procedure SetFlag(f: TFlag);
  48. Procedure ClearFlag(f: TFlag);
  49. Function GetFlag(f: TFlag): TFlagContents;
  50. Destructor Done;
  51. End;
  52. { What an instruction can change }
  53. TChange = (C_None,
  54. { Read from a predefined register }
  55. C_REAX, C_RECX, C_REDX, C_REBX, C_RESP, C_REBP, C_RESI, C_REDI,
  56. { write to a predefined register }
  57. C_WEAX, C_WECX, C_WEDX, C_WEBX, C_WESP, C_WEBP, C_WESI, C_WEDI,
  58. { read and write from/to a predefined register }
  59. C_RWEAX, C_RWECX, C_RWEDX, C_RWEBX, C_RWESP, C_RWEBP, C_RWESI, C_RWEDI,
  60. { modify the contents of a register with the purpose of using }
  61. { this changed content afterwards (add/sub/..., but e.g. not }
  62. { rep (ECX) or movsd (ESI/EDI) }
  63. {$ifdef arithopt}
  64. C_MEAX, C_MECX, C_MEDX, C_MEBX, C_MESP, C_MEBP, C_MESI, C_MEDI,
  65. {$endif arithopt}
  66. C_CDirFlag { clear direction flag }, C_SDirFlag { set dir flag },
  67. { read , write or read and write to the flags }
  68. C_RFlags, C_WFlags, C_RWFlags,
  69. { change the FPU registers }
  70. C_FPU,
  71. { read, write or both read and write from operand x }
  72. C_Rop1, C_Wop1, C_RWop1,
  73. C_Rop2, C_Wop2, C_RWop2,
  74. C_Rop3, C_WOp3, C_RWOp3,
  75. {$ifdef arithopt}
  76. { modify operand x }
  77. C_Mop1, C_Mop2, C_Mop3,
  78. {$endif arithopt}
  79. { write to the memory where edi points to (movsd/stosd) }
  80. C_WMemEDI,
  81. { assume all integer/general purpose registers are changed }
  82. C_All);
  83. { ************************************************************************* }
  84. { **************************** TAoptBaseCpu ******************************* }
  85. { ************************************************************************* }
  86. TAoptBaseCpu = Object(TAoptBase)
  87. Function RegMaxSize(Reg: TRegister): TRegister; Virtual;
  88. Function RegsSameSize(Reg1, Reg2: TRegister): Boolean; Virtual;
  89. Function IsLoadMemReg(p: pai): Boolean; Virtual;
  90. Function IsLoadConstReg(p: pai): Boolean; Virtual;
  91. Function IsStoreRegMem(p: pai): Boolean; Virtual;
  92. Function a_load_reg_reg(reg1, reg2: TRegister): paicpu; virtual;
  93. End;
  94. { ************************************************************************* }
  95. { ******************************* Constants ******************************* }
  96. { ************************************************************************* }
  97. Const
  98. {$ifndef arithopt}
  99. C_MEAX = C_RWEAX;
  100. C_MECX = C_RWECX;
  101. C_MEDX = C_RWEDX;
  102. C_MEBX = C_RWEBX;
  103. C_MESP = C_RWESP;
  104. C_MEBP = C_RWEBP;
  105. C_MESI = C_RWESI;
  106. C_MEDI = C_RWEDI;
  107. C_Mop1 = C_RWOp1;
  108. C_Mop2 = C_RWOp2;
  109. C_Mop3 = C_RWOp3;
  110. {$endif arithopt}
  111. { the maximum number of things (registers, memory, ...) a single instruction }
  112. { changes }
  113. MaxCh = 3;
  114. { the maximum number of operands an instruction has }
  115. MaxOps = 3;
  116. {Oper index of operand that contains the source (reference) with a load }
  117. {instruction }
  118. LoadSrc = 0;
  119. {Oper index of operand that contains the destination (register) with a load }
  120. {instruction }
  121. LoadDst = 1;
  122. {Oper index of operand that contains the source (register) with a store }
  123. {instruction }
  124. StoreSrc = 0;
  125. {Oper index of operand that contains the destination (reference) with a load }
  126. {instruction }
  127. StoreDst = 1;
  128. Type
  129. { the properties of a cpu instruction }
  130. TAsmInstrucProp = Record
  131. { what it changes }
  132. Ch: Array[1..MaxCh] of TChange;
  133. End;
  134. Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
  135. {A_<NONE>} (Ch: (C_All, C_None, C_None)), { new }
  136. {A_LOCK} (Ch: (C_None, C_None, C_None)),
  137. { the repCC instructions don't write to the flags themselves, but since }
  138. { they loop as long as CC is not fulfilled, it's possible that after the }
  139. { repCC instructions the flags have changed }
  140. {A_REP} (Ch: (C_RWECX, C_RWFlags, C_None)),
  141. {A_REPE} (Ch: (C_RWECX, C_RWFlags, C_None)),
  142. {A_REPNE} (Ch: (C_RWECX, C_RWFlags, C_None)),
  143. {A_REPNZ} (Ch: (C_RWECX, C_RWFLAGS, C_None)), { new }
  144. {A_REPZ} (Ch: (C_RWECX, C_RWFLAGS, C_None)), { new }
  145. {A_SEGCS} (Ch: (C_None, C_None, C_None)), { new }
  146. {A_SEGES} (Ch: (C_None, C_None, C_None)), { new }
  147. {A_SEGDS} (Ch: (C_None, C_None, C_None)), { new }
  148. {A_SEGFS} (Ch: (C_None, C_None, C_None)), { new }
  149. {A_SEGGS} (Ch: (C_None, C_None, C_None)), { new }
  150. {A_SEGSS} (Ch: (C_None, C_None, C_None)), { new }
  151. {A_AAA} (Ch: (C_MEAX, C_WFlags, C_None)),
  152. {A_AAD} (Ch: (C_MEAX, C_WFlags, C_None)),
  153. {A_AAM} (Ch: (C_MEAX, C_WFlags, C_None)),
  154. {A_AAS} (Ch: (C_MEAX, C_WFlags, C_None)),
  155. {A_ADC} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  156. {A_ADD} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  157. {A_AND} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  158. {A_ARPL} (Ch: (C_WFlags, C_None, C_None)),
  159. {A_BOUND} (Ch: (C_Rop1, C_None, C_None)),
  160. {A_BSF} (Ch: (C_Wop2, C_WFlags, C_Rop1)),
  161. {A_BSR} (Ch: (C_Wop2, C_WFlags, C_Rop1)),
  162. {A_BSWAP} (Ch: (C_MOp1, C_None, C_None)), { new }
  163. {A_BT} (Ch: (C_WFlags, C_Rop1, C_None)),
  164. {A_BTC} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  165. {A_BTR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  166. {A_BTS} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  167. {A_CALL} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  168. {A_CBW} (Ch: (C_MEAX, C_None, C_None)),
  169. {A_CDQ} (Ch: (C_MEAX, C_WEDX, C_None)),
  170. {A_CLC} (Ch: (C_WFlags, C_None, C_None)),
  171. {A_CLD} (Ch: (C_CDirFlag, C_None, C_None)),
  172. {A_CLI} (Ch: (C_WFlags, C_None, C_None)),
  173. {A_CLTS} (Ch: (C_None, C_None, C_None)),
  174. {A_CMC} (Ch: (C_WFlags, C_None, C_None)),
  175. {A_CMP} (Ch: (C_WFlags, C_None, C_None)),
  176. {A_CMPSB} (Ch: (C_All, C_None, C_None)), { new }
  177. {A_CMPSD} (Ch: (C_All, C_None, C_None)), { new }
  178. {A_CMPSW} (Ch: (C_All, C_None, C_None)), { new }
  179. {A_CMPXCHG} (Ch: (C_All, C_None, C_None)), { new }
  180. {A_CMPXCHG486} (Ch: (C_All, C_None, C_None)), { new }
  181. {A_CMPXCHG8B} (Ch: (C_All, C_None, C_None)), { new }
  182. {A_CPUID} (Ch: (C_All, C_None, C_none)),
  183. {A_CWD} (Ch: (C_MEAX, C_WEDX, C_None)),
  184. {A_CWDE} (Ch: (C_MEAX, C_None, C_None)),
  185. {A_DAA} (Ch: (C_MEAX, C_None, C_None)),
  186. {A_DAS} (Ch: (C_MEAX, C_None, C_None)),
  187. {A_DEC} (Ch: (C_Mop1, C_WFlags, C_None)),
  188. {A_DIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things}
  189. {A_EMMS} (Ch: (C_FPU, C_None, C_None)), { new }
  190. {A_ENTER} (Ch: (C_RWESP, C_None, C_None)),
  191. {A_EQU} (Ch: (C_ALL, C_None, C_None)), { new }
  192. {A_F2XM1} (Ch: (C_FPU, C_None, C_None)),
  193. {A_FABS} (Ch: (C_FPU, C_None, C_None)),
  194. {A_FADD} (Ch: (C_FPU, C_None, C_None)),
  195. {A_FADDP} (Ch: (C_FPU, C_None, C_None)),
  196. {A_FBLD} (Ch: (C_Rop1, C_FPU, C_None)),
  197. {A_FBSTP} (Ch: (C_Wop1, C_FPU, C_None)),
  198. {A_FCHS} (Ch: (C_FPU, C_None, C_None)),
  199. {A_FCLEX} (Ch: (C_FPU, C_None, C_None)),
  200. {A_FCMOVB} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  201. {A_FCMOVBE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  202. {A_FCMOVE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  203. {A_FCMOVNB} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  204. {A_FCMOVNBE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  205. {A_FCMOVNE} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  206. {A_FCMOVNU} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  207. {A_FCMOVU} (Ch: (C_FPU, C_RFLAGS, C_None)), { new }
  208. {A_FCOM} (Ch: (C_FPU, C_None, C_None)),
  209. {A_FCOMI} (Ch: (C_WFLAGS, C_None, C_None)), { new }
  210. {A_FCOMIP} (Ch: (C_FPU, C_WFLAGS, C_None)), { new }
  211. {A_FCOMP} (Ch: (C_FPU, C_None, C_None)),
  212. {A_FCOMPP} (Ch: (C_FPU, C_None, C_None)),
  213. {A_FCOS} (Ch: (C_FPU, C_None, C_None)),
  214. {A_FDECSTP} (Ch: (C_FPU, C_None, C_None)),
  215. {A_FDISI} (Ch: (C_FPU, C_None, C_None)),
  216. {A_FDIV} (Ch: (C_FPU, C_None, C_None)),
  217. {A_FDIVP} (Ch: (C_FPU, C_None, C_None)),
  218. {A_FDIVR} (Ch: (C_FPU, C_None, C_None)),
  219. {A_FDIVRP} (Ch: (C_FPU, C_None, C_None)),
  220. {A_FEMMS} (Ch: (C_All, C_None, C_None)), { new }
  221. {A_FENI} (Ch: (C_FPU, C_None, C_None)),
  222. {A_FFREE} (Ch: (C_FPU, C_None, C_None)),
  223. {A_FIADD} (Ch: (C_FPU, C_None, C_None)),
  224. {A_FICOM} (Ch: (C_FPU, C_None, C_None)),
  225. {A_FICOMP} (Ch: (C_FPU, C_None, C_None)),
  226. {A_FIDIV} (Ch: (C_FPU, C_None, C_None)),
  227. {A_FIDIVR} (Ch: (C_FPU, C_None, C_None)),
  228. {A_FILD} (Ch: (C_FPU, C_None, C_None)),
  229. {A_FIMUL} (Ch: (C_FPU, C_None, C_None)),
  230. {A_FINCSTP} (Ch: (C_FPU, C_None, C_None)),
  231. {A_FINIT} (Ch: (C_FPU, C_None, C_None)),
  232. {A_FIST} (Ch: (C_Wop1, C_None, C_None)),
  233. {A_FISTP} (Ch: (C_Wop1, C_None, C_None)),
  234. {A_FISUB} (Ch: (C_FPU, C_None, C_None)),
  235. {A_FISUBR} (Ch: (C_FPU, C_None, C_None)), { new }
  236. {A_FLD} (Ch: (C_Rop1, C_FPU, C_None)),
  237. {A_FLD1} (Ch: (C_FPU, C_None, C_None)),
  238. {A_FLDCW} (Ch: (C_FPU, C_None, C_None)),
  239. {A_FLDENV} (Ch: (C_FPU, C_None, C_None)),
  240. {A_FLDL2E} (Ch: (C_FPU, C_None, C_None)),
  241. {A_FLDL2T} (Ch: (C_FPU, C_None, C_None)),
  242. {A_FLDLG2} (Ch: (C_FPU, C_None, C_None)),
  243. {A_FLDLN2} (Ch: (C_FPU, C_None, C_None)),
  244. {A_FLDPI} (Ch: (C_FPU, C_None, C_None)),
  245. {A_FLDZ} (Ch: (C_FPU, C_None, C_None)),
  246. {A_FMUL} (Ch: (C_ROp1, C_FPU, C_None)),
  247. {A_FMULP} (Ch: (C_ROp1, C_FPU, C_None)),
  248. {A_FNCLEX} (Ch: (C_FPU, C_None, C_None)),
  249. {A_FNDISI} (Ch: (C_FPU, C_None, C_None)),
  250. {A_FNENI} (Ch: (C_FPU, C_None, C_None)),
  251. {A_FNINIT} (Ch: (C_FPU, C_None, C_None)),
  252. {A_FNOP} (Ch: (C_FPU, C_None, C_None)),
  253. {A_FNSAVE} (Ch: (C_FPU, C_None, C_None)),
  254. {A_FNSTCW} (Ch: (C_Wop1, C_None, C_None)),
  255. {A_FNSTENV} (Ch: (C_Wop1, C_None, C_None)),
  256. {A_FNSTSW} (Ch: (C_Wop1, C_None, C_None)),
  257. {A_FPATAN} (Ch: (C_FPU, C_None, C_None)),
  258. {A_FPREM} (Ch: (C_FPU, C_None, C_None)),
  259. {A_FPREM1} (Ch: (C_FPU, C_None, C_None)),
  260. {A_FPTAN} (Ch: (C_FPU, C_None, C_None)),
  261. {A_FRNDINT} (Ch: (C_FPU, C_None, C_None)),
  262. {A_FRSTOR} (Ch: (C_FPU, C_None, C_None)),
  263. {A_FSAVE} (Ch: (C_Wop1, C_None, C_None)),
  264. {A_FSCALE} (Ch: (C_FPU, C_None, C_None)),
  265. {A_FSETPM} (Ch: (C_FPU, C_None, C_None)),
  266. {A_FSIN} (Ch: (C_FPU, C_None, C_None)),
  267. {A_FSINCOS} (Ch: (C_FPU, C_None, C_None)),
  268. {A_FSQRT} (Ch: (C_FPU, C_None, C_None)),
  269. {A_FST} (Ch: (C_Wop1, C_None, C_None)),
  270. {A_FSTCW} (Ch: (C_Wop1, C_None, C_None)),
  271. {A_FSTENV} (Ch: (C_Wop1, C_None, C_None)),
  272. {A_FSTP} (Ch: (C_Wop1, C_FPU, C_None)),
  273. {A_FSTSW} (Ch: (C_Wop1, C_None, C_None)),
  274. {A_FSUB} (Ch: (C_ROp1, C_FPU, C_None)),
  275. {A_FSUBP} (Ch: (C_ROp1, C_FPU, C_None)),
  276. {A_FSUBR} (Ch: (C_ROp1, C_FPU, C_None)),
  277. {A_FSUBRP} (Ch: (C_ROp1, C_FPU, C_None)),
  278. {A_FTST} (Ch: (C_FPU, C_None, C_None)),
  279. {A_FUCOM} (Ch: (C_None, C_None, C_None)), {changes fpu status word}
  280. {A_FUCOMI} (Ch: (C_WFLAGS, C_None, C_None)), { new }
  281. {A_FUCOMIP} (Ch: (C_FPU, C_WFLAGS, C_None)), { new }
  282. {A_FUCOMP} (Ch: (C_FPU, C_None, C_None)),
  283. {A_FUCOMPP} (Ch: (C_FPU, C_None, C_None)),
  284. {A_FWAIT} (Ch: (C_FPU, C_None, C_None)),
  285. {A_FXAM} (Ch: (C_FPU, C_None, C_None)),
  286. {A_FXCH} (Ch: (C_FPU, C_None, C_None)),
  287. {A_FXTRACT} (Ch: (C_FPU, C_None, C_None)),
  288. {A_FYL2X} (Ch: (C_FPU, C_None, C_None)),
  289. {A_FYL2XP1} (Ch: (C_FPU, C_None, C_None)),
  290. {A_HLT} (Ch: (C_None, C_None, C_None)),
  291. {A_IBTS} (Ch: (C_All, C_None, C_None)), { new }
  292. {A_ICEBP} (Ch: (C_All, C_None, C_None)), { new }
  293. {A_IDIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things}
  294. {A_IMUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because several forms exist}
  295. {A_IN} (Ch: (C_Wop2, C_Rop1, C_None)),
  296. {A_INC} (Ch: (C_Mop1, C_WFlags, C_None)),
  297. {A_INSB} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new }
  298. {A_INSD} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new }
  299. {A_INSW} (Ch: (C_WMemEDI, C_RWEDI, C_REDX)), { new }
  300. {A_INT} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  301. {A_INT01} (Ch: (C_All, C_None, C_None)), { new }
  302. {A_INT1} (Ch: (C_All, C_None, C_None)), { new }
  303. {!!!} {A_INT03} (Ch: (C_None, C_None, C_None)),
  304. {A_INT3} (Ch: (C_None, C_None, C_None)),
  305. {A_INTO} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  306. {A_INVD} (Ch: (C_All, C_None, C_None)), { new }
  307. {A_INVLPG} (Ch: (C_All, C_None, C_None)), { new }
  308. {A_IRET} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  309. {A_IRETD} (Ch: (C_All, C_None, C_None)), { new }
  310. {A_IRETW} (Ch: (C_All, C_None, C_None)), { new }
  311. {A_JCXZ} (Ch: (C_RECX, C_None, C_None)),
  312. {A_JECXZ} (Ch: (C_RECX, C_None, C_None)),
  313. {A_JMP} (Ch: (C_None, C_None, C_None)),
  314. {A_LAHF} (Ch: (C_WEAX, C_RFlags, C_None)),
  315. {A_LAR} (Ch: (C_Wop2, C_None, C_None)),
  316. {A_LDS} (Ch: (C_Wop2, C_None, C_None)),
  317. {A_LEA} (Ch: (C_Wop2, C_Rop1, C_None)),
  318. {A_LEAVE} (Ch: (C_RWESP, C_None, C_None)),
  319. {A_LES} (Ch: (C_Wop2, C_None, C_None)),
  320. {A_LFS} (Ch: (C_Wop2, C_None, C_None)),
  321. {A_LGDT} (Ch: (C_None, C_None, C_None)),
  322. {A_LGS} (Ch: (C_Wop2, C_None, C_None)),
  323. {A_LIDT} (Ch: (C_None, C_None, C_None)),
  324. {A_LLDT} (Ch: (C_None, C_None, C_None)),
  325. {A_LMSW} (Ch: (C_None, C_None, C_None)),
  326. {A_LOADALL} (Ch: (C_All, C_None, C_None)), { new }
  327. {A_LOADALL286} (Ch: (C_All, C_None, C_None)), { new }
  328. {A_LODSB} (Ch: (C_WEAX, C_RWESI, C_None)), { new }
  329. {A_LODSD} (Ch: (C_WEAX, C_RWESI, C_None)), { new }
  330. {A_LODSW} (Ch: (C_WEAX, C_RWESI, C_None)), { new }
  331. {A_LOOP} (Ch: (C_RWECX, C_None, C_None)),
  332. {A_LOOPE} (Ch: (C_RWECX, C_RFlags, C_None)),
  333. {A_LOOPNE} (Ch: (C_RWECX, C_RFlags, C_None)),
  334. {A_LOOPNZ} (Ch: (C_RWECX, C_RFlags, C_None)),
  335. {A_LOOPZ} (Ch: (C_RWECX, C_RFlags, C_None)),
  336. {A_LSL} (Ch: (C_Wop2, C_WFlags, C_None)),
  337. {A_LSS} (Ch: (C_Wop2, C_None, C_None)),
  338. {A_LTR} (Ch: (C_None, C_None, C_None)),
  339. {A_MOV} (Ch: (C_Wop2, C_Rop1, C_None)),
  340. {A_MOVD} (Ch: (C_All, C_None, C_None)), { new }
  341. {A_MOVQ} (Ch: (C_All, C_None, C_None)), { new }
  342. {A_MOVSB} (Ch: (C_All, C_Rop1, C_None)),
  343. {A_MOVSD} (Ch: (C_All, C_None, C_None)), { new }
  344. {A_MOVSW} (Ch: (C_All, C_None, C_None)), { new }
  345. {A_MOVSX} (Ch: (C_Wop2, C_Rop1, C_None)),
  346. {A_MOVZX} (Ch: (C_Wop2, C_Rop1, C_None)),
  347. {A_MUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because modifies more than three things}
  348. {A_NEG} (Ch: (C_Mop1, C_None, C_None)),
  349. {A_NOP} (Ch: (C_None, C_None, C_None)),
  350. {A_NOT} (Ch: (C_Mop1, C_WFlags, C_None)),
  351. {A_OR} (Ch: (C_Mop2, C_WFlags, C_None)),
  352. {A_OUT} (Ch: (C_Rop1, C_Rop2, C_None)),
  353. {A_OUTSB} (Ch: (C_All, C_None, C_None)), { new }
  354. {A_OUTSD} (Ch: (C_All, C_None, C_None)), { new }
  355. {A_OUTSW} (Ch: (C_All, C_None, C_None)), { new }
  356. {A_PACKSSDW} (Ch: (C_All, C_None, C_None)), { new }
  357. {A_PACKSSWB} (Ch: (C_All, C_None, C_None)), { new }
  358. {A_PACKUSWB} (Ch: (C_All, C_None, C_None)), { new }
  359. {A_PADDB} (Ch: (C_All, C_None, C_None)), { new }
  360. {A_PADDD} (Ch: (C_All, C_None, C_None)), { new }
  361. {A_PADDSB} (Ch: (C_All, C_None, C_None)), { new }
  362. {A_PADDSIW} (Ch: (C_All, C_None, C_None)), { new }
  363. {A_PADDSW} (Ch: (C_All, C_None, C_None)), { new }
  364. {A_PADDUSB} (Ch: (C_All, C_None, C_None)), { new }
  365. {A_PADDUSW} (Ch: (C_All, C_None, C_None)), { new }
  366. {A_PADDW} (Ch: (C_All, C_None, C_None)), { new }
  367. {A_PAND} (Ch: (C_All, C_None, C_None)), { new }
  368. {A_PANDN} (Ch: (C_All, C_None, C_None)), { new }
  369. {A_PAVEB} (Ch: (C_All, C_None, C_None)), { new }
  370. {A_PAVGUSB} (Ch: (C_All, C_None, C_None)), { new }
  371. {A_PCMPEQB} (Ch: (C_All, C_None, C_None)), { new }
  372. {A_PCMPEQD} (Ch: (C_All, C_None, C_None)), { new }
  373. {A_PCMPEQW} (Ch: (C_All, C_None, C_None)), { new }
  374. {A_PCMPGTB} (Ch: (C_All, C_None, C_None)), { new }
  375. {A_PCMPGTD} (Ch: (C_All, C_None, C_None)), { new }
  376. {A_PCMPGTW} (Ch: (C_All, C_None, C_None)), { new }
  377. {A_PDISTIB} (Ch: (C_All, C_None, C_None)), { new }
  378. {A_PF2ID} (Ch: (C_All, C_None, C_None)), { new }
  379. {A_PFACC} (Ch: (C_All, C_None, C_None)), { new }
  380. {A_PFADD} (Ch: (C_All, C_None, C_None)), { new }
  381. {A_PFCMPEQ} (Ch: (C_All, C_None, C_None)), { new }
  382. {A_PFCMPGE} (Ch: (C_All, C_None, C_None)), { new }
  383. {A_PFCMPGT} (Ch: (C_All, C_None, C_None)), { new }
  384. {A_PFMAX} (Ch: (C_All, C_None, C_None)), { new }
  385. {A_PFMIN} (Ch: (C_All, C_None, C_None)), { new }
  386. {A_PFMUL} (Ch: (C_All, C_None, C_None)), { new }
  387. {A_PFRCP} (Ch: (C_All, C_None, C_None)), { new }
  388. {A_PFRCPIT1} (Ch: (C_All, C_None, C_None)), { new }
  389. {A_PFRCPIT2} (Ch: (C_All, C_None, C_None)), { new }
  390. {A_PFRSQIT1} (Ch: (C_All, C_None, C_None)), { new }
  391. {A_PFRSQRT} (Ch: (C_All, C_None, C_None)), { new }
  392. {A_PFSUB} (Ch: (C_All, C_None, C_None)), { new }
  393. {A_PFSUBR} (Ch: (C_All, C_None, C_None)), { new }
  394. {A_PI2FD} (Ch: (C_All, C_None, C_None)), { new }
  395. {A_PMACHRIW} (Ch: (C_All, C_None, C_None)), { new }
  396. {A_PMADDWD} (Ch: (C_All, C_None, C_None)), { new }
  397. {A_PMAGW} (Ch: (C_All, C_None, C_None)), { new }
  398. {A_PMULHRIW} (Ch: (C_All, C_None, C_None)), { new }
  399. {A_PMULHRWA} (Ch: (C_All, C_None, C_None)), { new }
  400. {A_PMULHRWC} (Ch: (C_All, C_None, C_None)), { new }
  401. {A_PMULHW} (Ch: (C_All, C_None, C_None)), { new }
  402. {A_PMULLW} (Ch: (C_All, C_None, C_None)), { new }
  403. {A_PMVGEZB} (Ch: (C_All, C_None, C_None)), { new }
  404. {A_PMVLZB} (Ch: (C_All, C_None, C_None)), { new }
  405. {A_PMVNZB} (Ch: (C_All, C_None, C_None)), { new }
  406. {A_PMVZB} (Ch: (C_All, C_None, C_None)), { new }
  407. {A_POP} (Ch: (C_Wop1, C_RWESP, C_None)),
  408. {A_POPA} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  409. {A_POPAD} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
  410. {A_POPAW} (Ch: (C_All, C_None, C_None)), { new }
  411. {A_POPF} (Ch: (C_RWESP, C_WFlags, C_None)),
  412. {A_POPFD} (Ch: (C_RWESP, C_WFlags, C_None)),
  413. {A_POPFW} (Ch: (C_RWESP, C_WFLAGS, C_None)), { new }
  414. {A_POR} (Ch: (C_All, C_None, C_None)), { new }
  415. {A_PREFETCH} (Ch: (C_All, C_None, C_None)), { new }
  416. {A_PREFETCHW} (Ch: (C_All, C_None, C_None)), { new }
  417. {A_PSLLD} (Ch: (C_All, C_None, C_None)), { new }
  418. {A_PSLLQ} (Ch: (C_All, C_None, C_None)), { new }
  419. {A_PSLLW} (Ch: (C_All, C_None, C_None)), { new }
  420. {A_PSRAD} (Ch: (C_All, C_None, C_None)), { new }
  421. {A_PSRAW} (Ch: (C_All, C_None, C_None)), { new }
  422. {A_PSRLD} (Ch: (C_All, C_None, C_None)), { new }
  423. {A_PSRLQ} (Ch: (C_All, C_None, C_None)), { new }
  424. {A_PSRLW} (Ch: (C_All, C_None, C_None)), { new }
  425. {A_PSUBB} (Ch: (C_All, C_None, C_None)), { new }
  426. {A_PSUBD} (Ch: (C_All, C_None, C_None)), { new }
  427. {A_PSUBSB} (Ch: (C_All, C_None, C_None)), { new }
  428. {A_PSUBSIW} (Ch: (C_All, C_None, C_None)), { new }
  429. {A_PSUBSW} (Ch: (C_All, C_None, C_None)), { new }
  430. {A_PSUBUSB} (Ch: (C_All, C_None, C_None)), { new }
  431. {A_PSUBUSW} (Ch: (C_All, C_None, C_None)), { new }
  432. {A_PSUBW} (Ch: (C_All, C_None, C_None)), { new }
  433. {A_PUNPCKHBW} (Ch: (C_All, C_None, C_None)), { new }
  434. {A_PUNPCKHDQ} (Ch: (C_All, C_None, C_None)), { new }
  435. {A_PUNPCKHWD} (Ch: (C_All, C_None, C_None)), { new }
  436. {A_PUNPCKLBW} (Ch: (C_All, C_None, C_None)), { new }
  437. {A_PUNPCKLDQ} (Ch: (C_All, C_None, C_None)), { new }
  438. {A_PUNPCKLWD} (Ch: (C_All, C_None, C_None)), { new }
  439. {A_PUSH} (Ch: (C_Rop1, C_RWESP, C_None)),
  440. {A_PUSHA} (Ch: (C_All, C_None, C_None)),
  441. {A_PUSHAD} (Ch: (C_All, C_None, C_None)),
  442. {A_PUSHAW} (Ch: (C_All, C_None, C_None)), { new }
  443. {A_PUSHF} (Ch: (C_RWESP, C_RFlags, C_None)),
  444. {A_PUSHFD} (Ch: (C_RWESP, C_RFlags, C_None)),
  445. {A_PUSHFW} (Ch: (C_RWESP, C_RFLAGS, C_None)), { new }
  446. {A_PXOR} (Ch: (C_All, C_None, C_None)), { new }
  447. {A_RCL} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  448. {A_RCR} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  449. {!!!} {A_RDSHR} (Ch: (C_All, C_None, C_None)), { new }
  450. {A_RDMSR} (Ch: (C_WEAX, C_WEDX, C_None)), { new }
  451. {A_RDPMC} (Ch: (C_WEAX, C_WEDX, C_None)), { new }
  452. {A_RDTSC} (Ch: (C_WEAX, C_WEDX, C_None)), { new }
  453. {A_RESB} (Ch: (C_All, C_None, C_None)), { new }
  454. {A_RET} (Ch: (C_All, C_None, C_None)),
  455. {A_RETF} (Ch: (C_All, C_None, C_None)), { new }
  456. {A_RETN} (Ch: (C_All, C_None, C_None)), { new }
  457. {A_ROL} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  458. {A_ROR} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  459. {!!!} {A_RSDC} (Ch: (C_All, C_None, C_None)), { new }
  460. {!!!} {A_RSLDT} (Ch: (C_All, C_None, C_None)), { new }
  461. {A_RSM} (Ch: (C_All, C_None, C_None)), { new }
  462. {A_SAHF} (Ch: (C_WFlags, C_REAX, C_None)),
  463. {A_SAL} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  464. {A_SALC} (Ch: (C_WEAX, C_RFLAGS, C_None)), { new }
  465. {A_SAR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  466. {A_SBB} (Ch: (C_Mop2, C_Rop1, C_RWFlags)),
  467. {A_SCASB} (Ch: (C_All, C_None, C_None)), { new }
  468. {A_SCASD} (Ch: (C_All, C_None, C_None)), { new }
  469. {A_SCASW} (Ch: (C_All, C_None, C_None)), { new }
  470. {A_SGDT} (Ch: (C_Wop1, C_None, C_None)),
  471. {A_SHL} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  472. {A_SHLD} (Ch: (C_MOp3, C_RWFlags, C_Rop2)),
  473. {A_SHR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  474. {A_SHRD} (Ch: (C_MOp3, C_RWFlags, C_Rop2)),
  475. {A_SIDT} (Ch: (C_Wop1, C_None, C_None)),
  476. {A_SLDT} (Ch: (C_Wop1, C_None, C_None)),
  477. {A_SMI} (Ch: (C_All, C_None, C_None)), { new }
  478. {!!!} {A_SMINT} (Ch: (C_All, C_None, C_None)), { new }
  479. {!!!} {A_SMINTOLD} (Ch: (C_All, C_None, C_None)), { new }
  480. {A_SMSW} (Ch: (C_Wop1, C_None, C_None)),
  481. {A_STC} (Ch: (C_WFlags, C_None, C_None)),
  482. {A_STD} (Ch: (C_SDirFlag, C_None, C_None)),
  483. {A_STI} (Ch: (C_WFlags, C_None, C_None)),
  484. {A_STOSB} (Ch: (C_REAX, C_WMemEDI, C_RWEDI)), { new }
  485. {A_STOSD} (Ch: (C_REAX, C_WMemEDI, C_RWEDI)), { new }
  486. {A_STOSW} (Ch: (C_REAX, C_WMemEDI, C_RWEDI)), { new }
  487. {A_STR} (Ch: (C_Wop1, C_None, C_None)),
  488. {A_SUB} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  489. {!!!} {A_SVDC} (Ch: (C_All, C_None, C_None)), { new }
  490. {!!!} {A_SVLDT} (Ch: (C_All, C_None, C_None)), { new }
  491. {!!!} {A_SVTS} (Ch: (C_All, C_None, C_None)), { new }
  492. {!!!} {A_SYSCALL} (Ch: (C_All, C_None, C_None)), { new }
  493. {!!!} {A_SYSENTER} (Ch: (C_All, C_None, C_None)), { new }
  494. {!!!} {A_SYSEXIT} (Ch: (C_All, C_None, C_None)), { new }
  495. {!!!} {A_SYSRET} (Ch: (C_All, C_None, C_None)), { new }
  496. {A_TEST} (Ch: (C_WFlags, C_Rop1, C_Rop2)),
  497. {!!!} {A_UD1} (Ch: (C_All, C_None, C_None)), { new }
  498. {!!!} {A_UD2} (Ch: (C_All, C_None, C_None)), { new }
  499. {A_UMOV} (Ch: (C_All, C_None, C_None)), { new }
  500. {A_VERR} (Ch: (C_WFlags, C_None, C_None)),
  501. {A_VERW} (Ch: (C_WFlags, C_None, C_None)),
  502. {A_WAIT} (Ch: (C_None, C_None, C_None)),
  503. {A_WBINVD} (Ch: (C_None, C_None, C_None)), { new }
  504. {!!!} {A_WRSHR} (Ch: (C_All, C_None, C_None)), { new }
  505. {A_WRMSR} (Ch: (C_All, C_None, C_None)), { new }
  506. {A_XADD} (Ch: (C_All, C_None, C_None)), { new }
  507. {A_XBTS} (Ch: (C_All, C_None, C_None)), { new }
  508. {A_XCHG} (Ch: (C_RWop1, C_RWop2, C_None)), {(might be) handled seperately}
  509. {A_XLAT} (Ch: (C_WEAX, C_REBX, C_None)),
  510. {A_XLATB} (Ch: (C_WEAX, C_REBX, C_None)),
  511. {A_XOR} (Ch: (C_Mop2, C_Rop1, C_WFlags)),
  512. {A_CMOV} (Ch: (C_ROp1, C_WOp2, C_RFLAGS)), { new }
  513. {A_J} (Ch: (C_None, C_None, C_None)), { new }
  514. {A_SET} (Ch: (C_WEAX, C_RFLAGS, C_None)), { new }
  515. {!!!! From here everything is new !!!!!!!!}
  516. {ADDPS} (Ch: (C_All, C_None, C_None)), { new }
  517. {ADDSS} (Ch: (C_All, C_None, C_None)), { new }
  518. {ANDNPS} (Ch: (C_All, C_None, C_None)), { new }
  519. {ANDPS} (Ch: (C_All, C_None, C_None)), { new }
  520. {CMPEQPS} (Ch: (C_All, C_None, C_None)), { new }
  521. {CMPEQSS} (Ch: (C_All, C_None, C_None)), { new }
  522. {CMPLEPS} (Ch: (C_All, C_None, C_None)), { new }
  523. {CMPLESS} (Ch: (C_All, C_None, C_None)), { new }
  524. {CMPLTPS} (Ch: (C_All, C_None, C_None)), { new }
  525. {CMPLTSS} (Ch: (C_All, C_None, C_None)), { new }
  526. {CMPNEQPS} (Ch: (C_All, C_None, C_None)), { new }
  527. {CMPNEQSS} (Ch: (C_All, C_None, C_None)), { new }
  528. {CMPNLEPS} (Ch: (C_All, C_None, C_None)), { new }
  529. {CMPNLESS} (Ch: (C_All, C_None, C_None)), { new }
  530. {CMPNLTPS} (Ch: (C_All, C_None, C_None)), { new }
  531. {CMPNLTSS} (Ch: (C_All, C_None, C_None)), { new }
  532. {CMPORDPS} (Ch: (C_All, C_None, C_None)), { new }
  533. {CMPORDSS} (Ch: (C_All, C_None, C_None)), { new }
  534. {CMPUNORDPS} (Ch: (C_All, C_None, C_None)), { new }
  535. {CMPUNORDSS} (Ch: (C_All, C_None, C_None)), { new }
  536. {CMPPS} (Ch: (C_All, C_None, C_None)), { new }
  537. {CMPSS} (Ch: (C_All, C_None, C_None)), { new }
  538. {COMISS} (Ch: (C_All, C_None, C_None)), { new }
  539. {CVTPI2PS} (Ch: (C_All, C_None, C_None)), { new }
  540. {CVTPS2PI} (Ch: (C_All, C_None, C_None)), { new }
  541. {CVTSI2SS} (Ch: (C_All, C_None, C_None)), { new }
  542. {CVTSS2SI} (Ch: (C_All, C_None, C_None)), { new }
  543. {CVTTPS2PI} (Ch: (C_All, C_None, C_None)), { new }
  544. {CVTTSS2SI} (Ch: (C_All, C_None, C_None)), { new }
  545. {DIVPS} (Ch: (C_All, C_None, C_None)), { new }
  546. {DIVSS} (Ch: (C_All, C_None, C_None)), { new }
  547. {LDMXCSR} (Ch: (C_All, C_None, C_None)), { new }
  548. {MAXPS} (Ch: (C_All, C_None, C_None)), { new }
  549. {MAXSS} (Ch: (C_All, C_None, C_None)), { new }
  550. {MINPS} (Ch: (C_All, C_None, C_None)), { new }
  551. {MINSS} (Ch: (C_All, C_None, C_None)), { new }
  552. {MOVAPS} (Ch: (C_All, C_None, C_None)), { new }
  553. {MOVHPS} (Ch: (C_All, C_None, C_None)), { new }
  554. {MOVLHPS} (Ch: (C_All, C_None, C_None)), { new }
  555. {MOVLPS} (Ch: (C_All, C_None, C_None)), { new }
  556. {MOVHLPS} (Ch: (C_All, C_None, C_None)), { new }
  557. {MOVMSKPS} (Ch: (C_All, C_None, C_None)), { new }
  558. {MOVNTPS} (Ch: (C_All, C_None, C_None)), { new }
  559. {MOVSS} (Ch: (C_All, C_None, C_None)), { new }
  560. {MOVUPS} (Ch: (C_All, C_None, C_None)), { new }
  561. {MULPS} (Ch: (C_All, C_None, C_None)), { new }
  562. {MULSS} (Ch: (C_All, C_None, C_None)), { new }
  563. {ORPS} (Ch: (C_All, C_None, C_None)), { new }
  564. {RCPPS} (Ch: (C_All, C_None, C_None)), { new }
  565. {RCPSS} (Ch: (C_All, C_None, C_None)), { new }
  566. {RSQRTPS} (Ch: (C_All, C_None, C_None)), { new }
  567. {RSQRTSS} (Ch: (C_All, C_None, C_None)), { new }
  568. {SHUFPS} (Ch: (C_All, C_None, C_None)), { new }
  569. {SQRTPS} (Ch: (C_All, C_None, C_None)), { new }
  570. {SQRTSS} (Ch: (C_All, C_None, C_None)), { new }
  571. {STMXCSR} (Ch: (C_All, C_None, C_None)), { new }
  572. {SUBPS} (Ch: (C_All, C_None, C_None)), { new }
  573. {SUBSS} (Ch: (C_All, C_None, C_None)), { new }
  574. {UCOMISS} (Ch: (C_All, C_None, C_None)), { new }
  575. {UNPCKHPS} (Ch: (C_All, C_None, C_None)), { new }
  576. {UNPCKLPS} (Ch: (C_All, C_None, C_None)), { new }
  577. {XORPS} (Ch: (C_All, C_None, C_None)), { new }
  578. {FXRSTOR} (Ch: (C_All, C_None, C_None)), { new }
  579. {FXSAVE} (Ch: (C_All, C_None, C_None)), { new }
  580. {PREFETCHNTA} (Ch: (C_All, C_None, C_None)), { new }
  581. {PREFETCHT0} (Ch: (C_All, C_None, C_None)), { new }
  582. {PREFETCHT1} (Ch: (C_All, C_None, C_None)), { new }
  583. {PREFETCHT2} (Ch: (C_All, C_None, C_None)), { new }
  584. {SFENCE} (Ch: (C_All, C_None, C_None)), { new }
  585. {MASKMOVQ} (Ch: (C_All, C_None, C_None)), { new }
  586. {MOVNTQ} (Ch: (C_All, C_None, C_None)), { new }
  587. {PAVGB} (Ch: (C_All, C_None, C_None)), { new }
  588. {PAVGW} (Ch: (C_All, C_None, C_None)), { new }
  589. {PEXTRW} (Ch: (C_All, C_None, C_None)), { new }
  590. {PINSRW} (Ch: (C_All, C_None, C_None)), { new }
  591. {PMAXSW} (Ch: (C_All, C_None, C_None)), { new }
  592. {PMAXUB} (Ch: (C_All, C_None, C_None)), { new }
  593. {PMINSW} (Ch: (C_All, C_None, C_None)), { new }
  594. {PMINUB} (Ch: (C_All, C_None, C_None)), { new }
  595. {PMOVMSKB} (Ch: (C_All, C_None, C_None)), { new }
  596. {PMULHUW} (Ch: (C_All, C_None, C_None)), { new }
  597. {PSADBW} (Ch: (C_All, C_None, C_None)), { new }
  598. {PSHUFW} (Ch: (C_All, C_None, C_None)) { new }
  599. );
  600. Implementation
  601. uses cpuinfo;
  602. { ************************************************************************* }
  603. { **************************** TCondRegs ********************************** }
  604. { ************************************************************************* }
  605. Constructor TCondRegs.init;
  606. Begin
  607. FillChar(Flags, SizeOf(Flags), Byte(F_Unknown))
  608. End;
  609. Procedure TCondRegs.InitFlag(f: TFlag);
  610. Begin
  611. Flags[f] := F_Unknown
  612. End;
  613. Procedure TCondRegs.SetFlag(f: TFlag);
  614. Begin
  615. Flags[f] := F_Set
  616. End;
  617. Procedure TCondRegs.ClearFlag(f: TFlag);
  618. Begin
  619. Flags[f] := F_Clear
  620. End;
  621. Function TCondRegs.GetFlag(f: TFlag): TFlagContents;
  622. Begin
  623. GetFlag := Flags[f]
  624. End;
  625. Destructor TCondRegs.Done; {$ifdef inl} inline; {$endif inl}
  626. Begin
  627. End;
  628. { ************************************************************************* }
  629. { **************************** TAoptBaseCpu ******************************* }
  630. { ************************************************************************* }
  631. Function TAoptBaseCpu.RegMaxSize(Reg: TRegister): TRegister;
  632. Begin
  633. RegMaxSize := Reg;
  634. If (Reg >= R_AX)
  635. Then
  636. If (Reg <= R_DI)
  637. Then RegMaxSize := Reg16ToReg32(Reg)
  638. Else
  639. If (Reg <= R_BL)
  640. Then RegMaxSize := Reg8toReg32(Reg)
  641. End;
  642. Function TAOptBaseCpu.RegsSameSize(Reg1, Reg2: TRegister): Boolean;
  643. Begin
  644. If (Reg1 <= R_EDI)
  645. Then RegsSameSize := (Reg2 <= R_EDI)
  646. Else
  647. If (Reg1 <= R_DI)
  648. Then RegsSameSize := (Reg2 in [R_AX..R_DI])
  649. Else
  650. If (Reg1 <= R_BL)
  651. Then RegsSameSize := (Reg2 in [R_AL..R_BL])
  652. Else RegsSameSize := False
  653. End;
  654. Function TAOptBaseCpu.IsLoadMemReg(p: pai): Boolean;
  655. Begin
  656. IsLoadMemReg :=
  657. (p^.typ = ait_instruction) and
  658. ((PInstr(p)^.OpCode = A_MOV) or
  659. (PInstr(p)^.OpCode = A_MOVZX) or
  660. (PInstr(p)^.OpCode = A_MOVSX)) And
  661. (PInstr(p)^.oper[LoadSrc].typ = top_ref);
  662. End;
  663. Function TAOptBaseCpu.IsLoadConstReg(p: pai): Boolean;
  664. Begin
  665. IsLoadConstReg :=
  666. (p^.typ = ait_instruction) and
  667. (PInstr(p)^.OpCode = A_MOV) And
  668. (PInstr(p)^.oper[LoadSrc].typ = top_const);
  669. End;
  670. Function TAOptBaseCpu.IsStoreRegMem(p: pai): Boolean;
  671. Begin
  672. IsStoreRegMem :=
  673. (p^.typ = ait_instruction) and
  674. ((PInstr(p)^.OpCode = A_MOV) or
  675. (PInstr(p)^.OpCode = A_MOVZX) or
  676. (PInstr(p)^.OpCode = A_MOVSX)) And
  677. (PInstr(p)^.oper[StoreDst].typ = top_ref);
  678. End;
  679. Function TAOptBaseCpu.a_load_reg_reg(reg1, reg2: TRegister): paicpu;
  680. Begin
  681. a_load_reg_Reg := New(paicpu,Op_Reg_Reg(A_MOV, S_L, reg1, reg2))
  682. End;
  683. End.
  684. {
  685. $Log$
  686. Revision 1.6 1999-09-08 15:05:43 jonas
  687. * some small changes so the new optimizer is again compilable
  688. Revision 1.5 1999/08/25 12:00:19 jonas
  689. * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
  690. Revision 1.4 1999/08/23 14:41:14 jonas
  691. + checksequence (processor independent)\n + processor independent part of docse
  692. Revision 1.3 1999/08/18 14:32:25 jonas
  693. + compilable!
  694. + dataflow analyzer finished
  695. + start of CSE units
  696. + aoptbase which contains a base object for all optimizer objects
  697. * some constants and type definitions moved around to avoid circular
  698. dependencies
  699. * moved some methods from base objects to specialized objects because
  700. they're not used anywhere else
  701. Revision 1.2 1999/08/11 14:24:38 jonas
  702. - removed RefsHaveSymbol define (I think references on all processors can have a symbol)
  703. Revision 1.1 1999/08/09 14:07:28 jonas
  704. commit.msg
  705. }