cpubase.pas 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl and Peter Vreman
  4. Contains the base types for the i386 and x86-64 architecture
  5. * This code was inspired by the NASM sources
  6. The Netwide Assembler is Copyright (c) 1996 Simon Tatham and
  7. Julian Hall. All rights reserved.
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. GNU General Public License for more details.
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. ****************************************************************************
  20. }
  21. {# Base unit for processor information. This unit contains
  22. enumerations of registers, opcodes, sizes, and other
  23. such things which are processor specific.
  24. }
  25. unit cpubase;
  26. {$i fpcdefs.inc}
  27. interface
  28. uses
  29. cutils,cclasses,
  30. globtype,globals,
  31. cpuinfo,
  32. aasmbase,
  33. cginfo
  34. {$ifdef delphi}
  35. ,dmisc
  36. {$endif}
  37. ;
  38. {*****************************************************************************
  39. Assembler Opcodes
  40. *****************************************************************************}
  41. type
  42. {$ifdef x86_64}
  43. TAsmOp={$i x86_64op.inc}
  44. {$else x86_64}
  45. TAsmOp={$i i386op.inc}
  46. {$endif x86_64}
  47. { This should define the array of instructions as string }
  48. op2strtable=array[tasmop] of string[11];
  49. const
  50. { First value of opcode enumeration }
  51. firstop = low(tasmop);
  52. { Last value of opcode enumeration }
  53. lastop = high(tasmop);
  54. {*****************************************************************************
  55. Registers
  56. *****************************************************************************}
  57. const
  58. { Invalid register number }
  59. RS_INVALID = $ff;
  60. { Integer Super registers }
  61. RS_RAX = $00; {EAX}
  62. RS_RCX = $01; {ECX}
  63. RS_RDX = $02; {EDX}
  64. RS_RBX = $03; {EBX}
  65. RS_RSI = $04; {ESI}
  66. RS_RDI = $05; {EDI}
  67. RS_RBP = $06; {EBP}
  68. RS_RSP = $07; {ESP}
  69. RS_R8 = $08; {R8}
  70. RS_R9 = $09; {R9}
  71. RS_R10 = $0a; {R10}
  72. RS_R11 = $0b; {R11}
  73. RS_R12 = $0c; {R12}
  74. RS_R13 = $0d; {R13}
  75. RS_R14 = $0e; {R14}
  76. RS_R15 = $0f; {R15}
  77. { create aliases to allow code sharing between x86-64 and i386 }
  78. RS_EAX = RS_RAX;
  79. RS_EBX = RS_RBX;
  80. RS_ECX = RS_RCX;
  81. RS_EDX = RS_RDX;
  82. RS_ESI = RS_RSI;
  83. RS_EDI = RS_RDI;
  84. RS_EBP = RS_RBP;
  85. RS_ESP = RS_RSP;
  86. { Integer Super register first and last }
  87. first_int_supreg = $00;
  88. {$ifdef x86_64}
  89. last_int_supreg = $0f;
  90. {$else}
  91. last_int_supreg = $07;
  92. {$endif}
  93. first_int_imreg = $10;
  94. last_int_imreg = $fe;
  95. { Float Super registers }
  96. RS_ST0 = $00;
  97. RS_ST1 = $01;
  98. RS_ST2 = $02;
  99. RS_ST3 = $03;
  100. RS_ST4 = $04;
  101. RS_ST5 = $05;
  102. RS_ST6 = $06;
  103. RS_ST7 = $07;
  104. { Float Super register first and last }
  105. first_fpu_supreg = $00;
  106. last_fpu_supreg = $07;
  107. first_fpu_imreg = $08;
  108. last_fpu_imreg = $fe;
  109. { MM Super registers }
  110. RS_MM0 = $00;
  111. RS_MM1 = $01;
  112. RS_MM2 = $02;
  113. RS_MM3 = $03;
  114. RS_MM4 = $04;
  115. RS_MM5 = $05;
  116. RS_MM6 = $06;
  117. RS_MM7 = $07;
  118. RS_MM8 = $08;
  119. RS_MM9 = $09;
  120. RS_MM10 = $0a;
  121. RS_MM11 = $0b;
  122. RS_MM12 = $0c;
  123. RS_MM13 = $0d;
  124. RS_MM14 = $0e;
  125. RS_MM15 = $0f;
  126. { Float Super register first and last }
  127. first_mmx_supreg = $00;
  128. last_mmx_supreg = $07;
  129. first_mmx_imreg = $08;
  130. last_mmx_imreg = $fe;
  131. { The subregister that specifies the entire register }
  132. {$ifdef x86_64}
  133. R_SUBWHOLE = R_SUBQ; {Hammer}
  134. {$else x86_64}
  135. R_SUBWHOLE = R_SUBD; {i386}
  136. {$endif x86_64}
  137. { Available Registers }
  138. {$ifdef x86_64}
  139. {$i r8664con.inc}
  140. {$else x86_64}
  141. {$i r386con.inc}
  142. {$endif x86_64}
  143. type
  144. { Number of registers used for indexing in tables }
  145. {$ifdef x86_64}
  146. tregisterindex=0..{$i r8664nor.inc}-1;
  147. {$else x86_64}
  148. tregisterindex=0..{$i r386nor.inc}-1;
  149. {$endif x86_64}
  150. const
  151. {$warning TODO Calculate bsstart}
  152. regnumber_count_bsstart = 64;
  153. regnumber_table : array[tregisterindex] of tregister = (
  154. {$ifdef x86_64}
  155. {$i r8664num.inc}
  156. {$else x86_64}
  157. {$i r386num.inc}
  158. {$endif x86_64}
  159. );
  160. regstabs_table : array[tregisterindex] of tregister = (
  161. {$ifdef x86_64}
  162. {$i r8664stab.inc}
  163. {$else x86_64}
  164. {$i r386stab.inc}
  165. {$endif x86_64}
  166. );
  167. type
  168. totherregisterset = set of tregisterindex;
  169. {*****************************************************************************
  170. Conditions
  171. *****************************************************************************}
  172. type
  173. TAsmCond=(C_None,
  174. C_A,C_AE,C_B,C_BE,C_C,C_E,C_G,C_GE,C_L,C_LE,C_NA,C_NAE,
  175. C_NB,C_NBE,C_NC,C_NE,C_NG,C_NGE,C_NL,C_NLE,C_NO,C_NP,
  176. C_NS,C_NZ,C_O,C_P,C_PE,C_PO,C_S,C_Z
  177. );
  178. const
  179. cond2str:array[TAsmCond] of string[3]=('',
  180. 'a','ae','b','be','c','e','g','ge','l','le','na','nae',
  181. 'nb','nbe','nc','ne','ng','nge','nl','nle','no','np',
  182. 'ns','nz','o','p','pe','po','s','z'
  183. );
  184. inverse_cond:array[TAsmCond] of TAsmCond=(C_None,
  185. C_NA,C_NAE,C_NB,C_NBE,C_NC,C_NE,C_NG,C_NGE,C_NL,C_NLE,C_A,C_AE,
  186. C_B,C_BE,C_C,C_E,C_G,C_GE,C_L,C_LE,C_O,C_P,
  187. C_S,C_Z,C_NO,C_NP,C_NP,C_P,C_NS,C_NZ
  188. );
  189. {*****************************************************************************
  190. Flags
  191. *****************************************************************************}
  192. type
  193. TResFlags = (F_E,F_NE,F_G,F_L,F_GE,F_LE,F_C,F_NC,F_A,F_AE,F_B,F_BE);
  194. {*****************************************************************************
  195. Reference
  196. *****************************************************************************}
  197. type
  198. { reference record }
  199. preference = ^treference;
  200. treference = packed record
  201. segment,
  202. base,
  203. index : tregister;
  204. scalefactor : byte;
  205. offset : longint;
  206. symbol : tasmsymbol;
  207. end;
  208. { reference record }
  209. pparareference = ^tparareference;
  210. tparareference = packed record
  211. index : tregister;
  212. offset : longint;
  213. end;
  214. {*****************************************************************************
  215. Generic Location
  216. *****************************************************************************}
  217. type
  218. { tparamlocation describes where a parameter for a procedure is stored.
  219. References are given from the caller's point of view. The usual
  220. TLocation isn't used, because contains a lot of unnessary fields.
  221. }
  222. tparalocation = packed record
  223. size : TCGSize;
  224. loc : TCGLoc;
  225. case TCGLoc of
  226. LOC_REFERENCE : (reference : tparareference);
  227. { segment in reference at the same place as in loc_register }
  228. LOC_REGISTER,LOC_CREGISTER : (
  229. case longint of
  230. 1 : (register,registerhigh : tregister);
  231. { overlay a registerlow }
  232. 2 : (registerlow : tregister);
  233. { overlay a 64 Bit register type }
  234. 3 : (reg64 : tregister64);
  235. 4 : (register64 : tregister64);
  236. );
  237. { it's only for better handling }
  238. LOC_MMXREGISTER,LOC_CMMXREGISTER : (mmxreg : tregister);
  239. end;
  240. tlocation = packed record
  241. loc : TCGLoc;
  242. size : TCGSize;
  243. case TCGLoc of
  244. LOC_FLAGS : (resflags : tresflags);
  245. LOC_CONSTANT : (
  246. case longint of
  247. 1 : (value : AWord);
  248. { can't do this, this layout depends on the host cpu. Use }
  249. { lo(valueqword)/hi(valueqword) instead (JM) }
  250. { 2 : (valuelow, valuehigh:AWord); }
  251. { overlay a complete 64 Bit value }
  252. 3 : (valueqword : qword);
  253. );
  254. LOC_CREFERENCE,
  255. LOC_REFERENCE : (reference : treference);
  256. { segment in reference at the same place as in loc_register }
  257. LOC_REGISTER,LOC_CREGISTER : (
  258. case longint of
  259. 1 : (register,registerhigh,segment : tregister);
  260. { overlay a registerlow }
  261. 2 : (registerlow : tregister);
  262. { overlay a 64 Bit register type }
  263. 3 : (reg64 : tregister64);
  264. 4 : (register64 : tregister64);
  265. );
  266. { it's only for better handling }
  267. LOC_MMXREGISTER,LOC_CMMXREGISTER : (mmxreg : tregister);
  268. end;
  269. {*****************************************************************************
  270. Constants
  271. *****************************************************************************}
  272. const
  273. { declare aliases }
  274. LOC_MMREGISTER = LOC_SSEREGISTER;
  275. LOC_CMMREGISTER = LOC_CSSEREGISTER;
  276. max_operands = 3;
  277. { low and high of the available maximum width integer general purpose }
  278. { registers }
  279. LoGPReg = RS_EAX;
  280. HiGPReg = RS_EDX;
  281. { Table of registers which can be allocated by the code generator
  282. internally, when generating the code.
  283. }
  284. { legend: }
  285. { xxxregs = set of all possibly used registers of that type in the code }
  286. { generator }
  287. { usableregsxxx = set of all 32bit components of registers that can be }
  288. { possible allocated to a regvar or using getregisterxxx (this }
  289. { excludes registers which can be only used for parameter }
  290. { passing on ABI's that define this) }
  291. { c_countusableregsxxx = amount of registers in the usableregsxxx set }
  292. // maxintregs = 4;
  293. // intregs = [R_EAX..R_BL]-[R_ESI,R_SI];
  294. { to determine how many registers to use for regvars }
  295. maxintscratchregs = 1;
  296. maxfpuregs = 8;
  297. usableregsfpu = [];
  298. c_countusableregsfpu = 0;
  299. usableregsmm = [RS_MM0..RS_MM7];
  300. c_countusableregsmm = 8;
  301. {*****************************************************************************
  302. CPU Dependent Constants
  303. *****************************************************************************}
  304. {$i cpubase.inc}
  305. {*****************************************************************************
  306. Helpers
  307. *****************************************************************************}
  308. function cgsize2subreg(s:Tcgsize):Tsubregister;
  309. function reg2opsize(r:Tregister):topsize;
  310. function is_calljmp(o:tasmop):boolean;
  311. procedure inverse_flags(var f: TResFlags);
  312. function flags_to_cond(const f: TResFlags) : TAsmCond;
  313. function is_segment_reg(r:tregister):boolean;
  314. function findreg_by_number(r:Tregister):tregisterindex;
  315. function std_regnum_search(const s:string):Tregister;
  316. function std_regname(r:Tregister):string;
  317. implementation
  318. uses
  319. verbose;
  320. const
  321. {$ifdef x86_64}
  322. std_regname_table : array[tregisterindex] of string[7] = (
  323. {$i r8664std.inc}
  324. );
  325. regnumber_index : array[tregisterindex] of tregisterindex = (
  326. {$i r8664rni.inc}
  327. );
  328. std_regname_index : array[tregisterindex] of tregisterindex = (
  329. {$i r8664sri.inc}
  330. );
  331. {$else x86_64}
  332. std_regname_table : array[tregisterindex] of string[7] = (
  333. {$i r386std.inc}
  334. );
  335. regnumber_index : array[tregisterindex] of tregisterindex = (
  336. {$i r386rni.inc}
  337. );
  338. std_regname_index : array[tregisterindex] of tregisterindex = (
  339. {$i r386sri.inc}
  340. );
  341. {$endif x86_64}
  342. {*****************************************************************************
  343. Helpers
  344. *****************************************************************************}
  345. function cgsize2subreg(s:Tcgsize):Tsubregister;
  346. begin
  347. case s of
  348. OS_8,OS_S8:
  349. cgsize2subreg:=R_SUBL;
  350. OS_16,OS_S16:
  351. cgsize2subreg:=R_SUBW;
  352. OS_32,OS_S32:
  353. cgsize2subreg:=R_SUBD;
  354. OS_64,OS_S64:
  355. cgsize2subreg:=R_SUBQ;
  356. else
  357. internalerror(200301231);
  358. end;
  359. end;
  360. function reg2opsize(r:Tregister):topsize;
  361. const
  362. subreg2opsize : array[tsubregister] of topsize =
  363. (S_NO,S_B,S_B,S_W,S_L,S_D);
  364. begin
  365. reg2opsize:=S_L;
  366. case getregtype(r) of
  367. R_INTREGISTER :
  368. reg2opsize:=subreg2opsize[getsubreg(r)];
  369. R_FPUREGISTER :
  370. reg2opsize:=S_FL;
  371. R_MMXREGISTER,
  372. R_MMREGISTER :
  373. reg2opsize:=S_D;
  374. R_SPECIALREGISTER :
  375. begin
  376. case r of
  377. NR_CS,NR_DS,NR_ES,
  378. NR_SS,NR_FS,NR_GS :
  379. reg2opsize:=S_W;
  380. end;
  381. end;
  382. else
  383. internalerror(200303181);
  384. end;
  385. end;
  386. function is_calljmp(o:tasmop):boolean;
  387. begin
  388. case o of
  389. A_CALL,
  390. A_JCXZ,
  391. A_JECXZ,
  392. A_JMP,
  393. A_LOOP,
  394. A_LOOPE,
  395. A_LOOPNE,
  396. A_LOOPNZ,
  397. A_LOOPZ,
  398. A_Jcc :
  399. is_calljmp:=true;
  400. else
  401. is_calljmp:=false;
  402. end;
  403. end;
  404. procedure inverse_flags(var f: TResFlags);
  405. const
  406. inv_flags: array[TResFlags] of TResFlags =
  407. (F_NE,F_E,F_LE,F_GE,F_L,F_G,F_NC,F_C,F_BE,F_B,F_AE,F_A);
  408. begin
  409. f:=inv_flags[f];
  410. end;
  411. function flags_to_cond(const f: TResFlags) : TAsmCond;
  412. const
  413. flags_2_cond : array[TResFlags] of TAsmCond =
  414. (C_E,C_NE,C_G,C_L,C_GE,C_LE,C_C,C_NC,C_A,C_AE,C_B,C_BE);
  415. begin
  416. result := flags_2_cond[f];
  417. end;
  418. function is_segment_reg(r:tregister):boolean;
  419. begin
  420. result:=false;
  421. case r of
  422. NR_CS,NR_DS,NR_ES,
  423. NR_SS,NR_FS,NR_GS :
  424. result:=true;
  425. end;
  426. end;
  427. function findreg_by_stdname(const s:string):byte;
  428. var
  429. i,p : tregisterindex;
  430. begin
  431. {Binary search.}
  432. p:=0;
  433. i:=regnumber_count_bsstart;
  434. repeat
  435. if (p+i<=high(tregisterindex)) and (std_regname_table[std_regname_index[p+i]]<=s) then
  436. p:=p+i;
  437. i:=i shr 1;
  438. until i=0;
  439. if std_regname_table[std_regname_index[p]]=s then
  440. result:=std_regname_index[p]
  441. else
  442. result:=0;
  443. end;
  444. function findreg_by_number(r:Tregister):tregisterindex;
  445. var
  446. i,p : tregisterindex;
  447. begin
  448. {Binary search.}
  449. p:=0;
  450. i:=regnumber_count_bsstart;
  451. repeat
  452. if (p+i<=high(tregisterindex)) and (regnumber_table[regnumber_index[p+i]]<=r) then
  453. p:=p+i;
  454. i:=i shr 1;
  455. until i=0;
  456. if regnumber_table[regnumber_index[p]]=r then
  457. result:=regnumber_index[p]
  458. else
  459. result:=0;
  460. end;
  461. function std_regnum_search(const s:string):Tregister;
  462. begin
  463. result:=regnumber_table[findreg_by_stdname(s)];
  464. end;
  465. function std_regname(r:Tregister):string;
  466. var
  467. p : tregisterindex;
  468. begin
  469. p:=findreg_by_number(r);
  470. if p<>0 then
  471. result:=std_regname_table[p]
  472. else
  473. result:=generic_regname(r);
  474. end;
  475. end.
  476. {
  477. $Log$
  478. Revision 1.20 2003-09-25 21:29:23 peter
  479. * remove sp_fixup
  480. Revision 1.19 2003/09/24 17:12:36 florian
  481. * x86-64 adaptions
  482. Revision 1.18 2003/09/23 17:56:06 peter
  483. * locals and paras are allocated in the code generation
  484. * tvarsym.localloc contains the location of para/local when
  485. generating code for the current procedure
  486. Revision 1.17 2003/09/07 22:09:35 peter
  487. * preparations for different default calling conventions
  488. * various RA fixes
  489. Revision 1.16 2003/09/04 21:07:03 florian
  490. * ARM compiler compiles again
  491. Revision 1.15 2003/09/03 15:55:02 peter
  492. * NEWRA branch merged
  493. Revision 1.14 2003/09/03 11:18:37 florian
  494. * fixed arm concatcopy
  495. + arm support in the common compiler sources added
  496. * moved some generic cg code around
  497. + tfputype added
  498. * ...
  499. Revision 1.13.2.8 2003/08/31 19:31:51 daniel
  500. * FIxed superregister constants
  501. Revision 1.13.2.7 2003/08/31 16:18:05 peter
  502. * more fixes
  503. Revision 1.13.2.6 2003/08/31 15:46:26 peter
  504. * more updates for tregister
  505. Revision 1.13.2.5 2003/08/31 13:50:16 daniel
  506. * Remove sorting and use pregenerated indexes
  507. * Some work on making things compile
  508. Revision 1.13.2.4 2003/08/29 17:29:00 peter
  509. * next batch of updates
  510. Revision 1.13.2.3 2003/08/28 18:35:08 peter
  511. * tregister changed to cardinal
  512. Revision 1.13.2.2 2003/08/27 21:06:34 peter
  513. * more updates
  514. Revision 1.13.2.1 2003/08/27 19:55:54 peter
  515. * first tregister patch
  516. Revision 1.13 2003/08/20 07:48:04 daniel
  517. * Made internal assembler use new register coding
  518. Revision 1.12 2003/08/17 16:59:20 jonas
  519. * fixed regvars so they work with newra (at least for ppc)
  520. * fixed some volatile register bugs
  521. + -dnotranslation option for -dnewra, which causes the registers not to
  522. be translated from virtual to normal registers. Requires support in
  523. the assembler writer as well, which is only implemented in aggas/
  524. agppcgas currently
  525. Revision 1.11 2003/07/06 21:50:33 jonas
  526. * fixed ppc compilation problems and changed VOLATILE_REGISTERS for x86
  527. so that it doesn't include ebp and esp anymore
  528. Revision 1.10 2003/06/17 16:34:45 jonas
  529. * lots of newra fixes (need getfuncretparaloc implementation for i386)!
  530. * renamed all_intregisters to volatile_intregisters and made it
  531. processor dependent
  532. Revision 1.9 2003/06/13 21:19:33 peter
  533. * current_procdef removed, use current_procinfo.procdef instead
  534. Revision 1.8 2003/06/12 19:11:34 jonas
  535. - removed ALL_INTREGISTERS (only the one in rgobj is valid)
  536. Revision 1.7 2003/06/03 21:11:09 peter
  537. * cg.a_load_* get a from and to size specifier
  538. * makeregsize only accepts newregister
  539. * i386 uses generic tcgnotnode,tcgunaryminus
  540. Revision 1.6 2003/06/03 13:01:59 daniel
  541. * Register allocator finished
  542. Revision 1.5 2003/05/30 23:57:08 peter
  543. * more sparc cleanup
  544. * accumulator removed, splitted in function_return_reg (called) and
  545. function_result_reg (caller)
  546. Revision 1.4 2003/04/30 20:53:32 florian
  547. * error when address of an abstract method is taken
  548. * fixed some x86-64 problems
  549. * merged some more x86-64 and i386 code
  550. Revision 1.3 2002/04/25 20:15:40 florian
  551. * block nodes within expressions shouldn't release the used registers,
  552. fixed using a flag till the new rg is ready
  553. Revision 1.2 2002/04/25 16:12:09 florian
  554. * fixed more problems with cpubase and x86-64
  555. Revision 1.1 2003/04/25 11:12:09 florian
  556. * merged i386/cpubase and x86_64/cpubase to x86/cpubase;
  557. different stuff went to cpubase.inc
  558. Revision 1.50 2003/04/25 08:25:26 daniel
  559. * Ifdefs around a lot of calls to cleartempgen
  560. * Fixed registers that are allocated but not freed in several nodes
  561. * Tweak to register allocator to cause less spills
  562. * 8-bit registers now interfere with esi,edi and ebp
  563. Compiler can now compile rtl successfully when using new register
  564. allocator
  565. Revision 1.49 2003/04/22 23:50:23 peter
  566. * firstpass uses expectloc
  567. * checks if there are differences between the expectloc and
  568. location.loc from secondpass in EXTDEBUG
  569. Revision 1.48 2003/04/22 14:33:38 peter
  570. * removed some notes/hints
  571. Revision 1.47 2003/04/22 10:09:35 daniel
  572. + Implemented the actual register allocator
  573. + Scratch registers unavailable when new register allocator used
  574. + maybe_save/maybe_restore unavailable when new register allocator used
  575. Revision 1.46 2003/04/21 19:16:50 peter
  576. * count address regs separate
  577. Revision 1.45 2003/03/28 19:16:57 peter
  578. * generic constructor working for i386
  579. * remove fixed self register
  580. * esi added as address register for i386
  581. Revision 1.44 2003/03/18 18:15:53 peter
  582. * changed reg2opsize to function
  583. Revision 1.43 2003/03/08 08:59:07 daniel
  584. + $define newra will enable new register allocator
  585. + getregisterint will return imaginary registers with $newra
  586. + -sr switch added, will skip register allocation so you can see
  587. the direct output of the code generator before register allocation
  588. Revision 1.42 2003/02/19 22:00:15 daniel
  589. * Code generator converted to new register notation
  590. - Horribily outdated todo.txt removed
  591. Revision 1.41 2003/02/02 19:25:54 carl
  592. * Several bugfixes for m68k target (register alloc., opcode emission)
  593. + VIS target
  594. + Generic add more complete (still not verified)
  595. Revision 1.40 2003/01/13 18:37:44 daniel
  596. * Work on register conversion
  597. Revision 1.39 2003/01/09 20:41:00 daniel
  598. * Converted some code in cgx86.pas to new register numbering
  599. Revision 1.38 2003/01/09 15:49:56 daniel
  600. * Added register conversion
  601. Revision 1.37 2003/01/08 22:32:36 daniel
  602. * Added register convesrion procedure
  603. Revision 1.36 2003/01/08 18:43:57 daniel
  604. * Tregister changed into a record
  605. Revision 1.35 2003/01/05 13:36:53 florian
  606. * x86-64 compiles
  607. + very basic support for float128 type (x86-64 only)
  608. Revision 1.34 2002/11/17 18:26:16 mazen
  609. * fixed a compilation bug accmulator-->FUNCTION_RETURN_REG, in definition of return_result_reg
  610. Revision 1.33 2002/11/17 17:49:08 mazen
  611. + return_result_reg and FUNCTION_RESULT_REG are now used, in all plateforms, to pass functions result between called function and its caller. See the explanation of each one
  612. Revision 1.32 2002/10/05 12:43:29 carl
  613. * fixes for Delphi 6 compilation
  614. (warning : Some features do not work under Delphi)
  615. Revision 1.31 2002/08/14 18:41:48 jonas
  616. - remove valuelow/valuehigh fields from tlocation, because they depend
  617. on the endianess of the host operating system -> difficult to get
  618. right. Use lo/hi(location.valueqword) instead (remember to use
  619. valueqword and not value!!)
  620. Revision 1.30 2002/08/13 21:40:58 florian
  621. * more fixes for ppc calling conventions
  622. Revision 1.29 2002/08/12 15:08:41 carl
  623. + stab register indexes for powerpc (moved from gdb to cpubase)
  624. + tprocessor enumeration moved to cpuinfo
  625. + linker in target_info is now a class
  626. * many many updates for m68k (will soon start to compile)
  627. - removed some ifdef or correct them for correct cpu
  628. Revision 1.28 2002/08/06 20:55:23 florian
  629. * first part of ppc calling conventions fix
  630. Revision 1.27 2002/07/25 18:01:29 carl
  631. + FPURESULTREG -> FPU_RESULT_REG
  632. Revision 1.26 2002/07/07 09:52:33 florian
  633. * powerpc target fixed, very simple units can be compiled
  634. * some basic stuff for better callparanode handling, far from being finished
  635. Revision 1.25 2002/07/01 18:46:30 peter
  636. * internal linker
  637. * reorganized aasm layer
  638. Revision 1.24 2002/07/01 16:23:55 peter
  639. * cg64 patch
  640. * basics for currency
  641. * asnode updates for class and interface (not finished)
  642. Revision 1.23 2002/05/18 13:34:22 peter
  643. * readded missing revisions
  644. Revision 1.22 2002/05/16 19:46:50 carl
  645. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  646. + try to fix temp allocation (still in ifdef)
  647. + generic constructor calls
  648. + start of tassembler / tmodulebase class cleanup
  649. Revision 1.19 2002/05/12 16:53:16 peter
  650. * moved entry and exitcode to ncgutil and cgobj
  651. * foreach gets extra argument for passing local data to the
  652. iterator function
  653. * -CR checks also class typecasts at runtime by changing them
  654. into as
  655. * fixed compiler to cycle with the -CR option
  656. * fixed stabs with elf writer, finally the global variables can
  657. be watched
  658. * removed a lot of routines from cga unit and replaced them by
  659. calls to cgobj
  660. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  661. u32bit then the other is typecasted also to u32bit without giving
  662. a rangecheck warning/error.
  663. * fixed pascal calling method with reversing also the high tree in
  664. the parast, detected by tcalcst3 test
  665. Revision 1.18 2002/04/21 15:31:40 carl
  666. - removed some other stuff to their units
  667. Revision 1.17 2002/04/20 21:37:07 carl
  668. + generic FPC_CHECKPOINTER
  669. + first parameter offset in stack now portable
  670. * rename some constants
  671. + move some cpu stuff to other units
  672. - remove unused constents
  673. * fix stacksize for some targets
  674. * fix generic size problems which depend now on EXTEND_SIZE constant
  675. * removing frame pointer in routines is only available for : i386,m68k and vis targets
  676. Revision 1.16 2002/04/15 19:53:54 peter
  677. * fixed conflicts between the last 2 commits
  678. Revision 1.15 2002/04/15 19:44:20 peter
  679. * fixed stackcheck that would be called recursively when a stack
  680. error was found
  681. * generic changeregsize(reg,size) for i386 register resizing
  682. * removed some more routines from cga unit
  683. * fixed returnvalue handling
  684. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  685. Revision 1.14 2002/04/15 19:12:09 carl
  686. + target_info.size_of_pointer -> pointer_size
  687. + some cleanup of unused types/variables
  688. * move several constants from cpubase to their specific units
  689. (where they are used)
  690. + att_Reg2str -> gas_reg2str
  691. + int_reg2str -> std_reg2str
  692. Revision 1.13 2002/04/14 16:59:41 carl
  693. + att_reg2str -> gas_reg2str
  694. Revision 1.12 2002/04/02 17:11:34 peter
  695. * tlocation,treference update
  696. * LOC_CONSTANT added for better constant handling
  697. * secondadd splitted in multiple routines
  698. * location_force_reg added for loading a location to a register
  699. of a specified size
  700. * secondassignment parses now first the right and then the left node
  701. (this is compatible with Kylix). This saves a lot of push/pop especially
  702. with string operations
  703. * adapted some routines to use the new cg methods
  704. Revision 1.11 2002/03/31 20:26:37 jonas
  705. + a_loadfpu_* and a_loadmm_* methods in tcg
  706. * register allocation is now handled by a class and is mostly processor
  707. independent (+rgobj.pas and i386/rgcpu.pas)
  708. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  709. * some small improvements and fixes to the optimizer
  710. * some register allocation fixes
  711. * some fpuvaroffset fixes in the unary minus node
  712. * push/popusedregisters is now called rg.save/restoreusedregisters and
  713. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  714. also better optimizable)
  715. * fixed and optimized register saving/restoring for new/dispose nodes
  716. * LOC_FPU locations now also require their "register" field to be set to
  717. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  718. - list field removed of the tnode class because it's not used currently
  719. and can cause hard-to-find bugs
  720. Revision 1.10 2002/03/04 19:10:12 peter
  721. * removed compiler warnings
  722. }