cpubase.pas 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  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. sp_fixup : longint;
  226. case TCGLoc of
  227. LOC_REFERENCE : (reference : tparareference);
  228. { segment in reference at the same place as in loc_register }
  229. LOC_REGISTER,LOC_CREGISTER : (
  230. case longint of
  231. 1 : (register,registerhigh : tregister);
  232. { overlay a registerlow }
  233. 2 : (registerlow : tregister);
  234. { overlay a 64 Bit register type }
  235. 3 : (reg64 : tregister64);
  236. 4 : (register64 : tregister64);
  237. );
  238. { it's only for better handling }
  239. LOC_MMXREGISTER,LOC_CMMXREGISTER : (mmxreg : tregister);
  240. end;
  241. tlocation = packed record
  242. loc : TCGLoc;
  243. size : TCGSize;
  244. case TCGLoc of
  245. LOC_FLAGS : (resflags : tresflags);
  246. LOC_CONSTANT : (
  247. case longint of
  248. 1 : (value : AWord);
  249. { can't do this, this layout depends on the host cpu. Use }
  250. { lo(valueqword)/hi(valueqword) instead (JM) }
  251. { 2 : (valuelow, valuehigh:AWord); }
  252. { overlay a complete 64 Bit value }
  253. 3 : (valueqword : qword);
  254. );
  255. LOC_CREFERENCE,
  256. LOC_REFERENCE : (reference : treference);
  257. { segment in reference at the same place as in loc_register }
  258. LOC_REGISTER,LOC_CREGISTER : (
  259. case longint of
  260. 1 : (register,registerhigh,segment : tregister);
  261. { overlay a registerlow }
  262. 2 : (registerlow : tregister);
  263. { overlay a 64 Bit register type }
  264. 3 : (reg64 : tregister64);
  265. 4 : (register64 : tregister64);
  266. );
  267. { it's only for better handling }
  268. LOC_MMXREGISTER,LOC_CMMXREGISTER : (mmxreg : tregister);
  269. end;
  270. {*****************************************************************************
  271. Constants
  272. *****************************************************************************}
  273. const
  274. { declare aliases }
  275. LOC_MMREGISTER = LOC_SSEREGISTER;
  276. LOC_CMMREGISTER = LOC_CSSEREGISTER;
  277. max_operands = 3;
  278. { low and high of the available maximum width integer general purpose }
  279. { registers }
  280. LoGPReg = RS_EAX;
  281. HiGPReg = RS_EDX;
  282. { Table of registers which can be allocated by the code generator
  283. internally, when generating the code.
  284. }
  285. { legend: }
  286. { xxxregs = set of all possibly used registers of that type in the code }
  287. { generator }
  288. { usableregsxxx = set of all 32bit components of registers that can be }
  289. { possible allocated to a regvar or using getregisterxxx (this }
  290. { excludes registers which can be only used for parameter }
  291. { passing on ABI's that define this) }
  292. { c_countusableregsxxx = amount of registers in the usableregsxxx set }
  293. // maxintregs = 4;
  294. // intregs = [R_EAX..R_BL]-[R_ESI,R_SI];
  295. { to determine how many registers to use for regvars }
  296. maxintscratchregs = 1;
  297. maxfpuregs = 8;
  298. usableregsfpu = [];
  299. c_countusableregsfpu = 0;
  300. usableregsmm = [RS_MM0..RS_MM7];
  301. c_countusableregsmm = 8;
  302. {*****************************************************************************
  303. CPU Dependent Constants
  304. *****************************************************************************}
  305. {$i cpubase.inc}
  306. {*****************************************************************************
  307. Helpers
  308. *****************************************************************************}
  309. function cgsize2subreg(s:Tcgsize):Tsubregister;
  310. function reg2opsize(r:Tregister):topsize;
  311. function is_calljmp(o:tasmop):boolean;
  312. procedure inverse_flags(var f: TResFlags);
  313. function flags_to_cond(const f: TResFlags) : TAsmCond;
  314. function is_segment_reg(r:tregister):boolean;
  315. function findreg_by_number(r:Tregister):tregisterindex;
  316. function std_regnum_search(const s:string):Tregister;
  317. function std_regname(r:Tregister):string;
  318. implementation
  319. uses
  320. verbose;
  321. const
  322. {$ifdef x86_64}
  323. std_regname_table : array[tregisterindex] of string[7] = (
  324. {$i r8664std.inc}
  325. );
  326. regnumber_index : array[tregisterindex] of tregisterindex = (
  327. {$i r8664rni.inc}
  328. );
  329. std_regname_index : array[tregisterindex] of tregisterindex = (
  330. {$i r8664sri.inc}
  331. );
  332. {$else x86_64}
  333. std_regname_table : array[tregisterindex] of string[7] = (
  334. {$i r386std.inc}
  335. );
  336. regnumber_index : array[tregisterindex] of tregisterindex = (
  337. {$i r386rni.inc}
  338. );
  339. std_regname_index : array[tregisterindex] of tregisterindex = (
  340. {$i r386sri.inc}
  341. );
  342. {$endif x86_64}
  343. {*****************************************************************************
  344. Helpers
  345. *****************************************************************************}
  346. function cgsize2subreg(s:Tcgsize):Tsubregister;
  347. begin
  348. case s of
  349. OS_8,OS_S8:
  350. cgsize2subreg:=R_SUBL;
  351. OS_16,OS_S16:
  352. cgsize2subreg:=R_SUBW;
  353. OS_32,OS_S32:
  354. cgsize2subreg:=R_SUBD;
  355. OS_64,OS_S64:
  356. cgsize2subreg:=R_SUBQ;
  357. else
  358. internalerror(200301231);
  359. end;
  360. end;
  361. function reg2opsize(r:Tregister):topsize;
  362. const
  363. subreg2opsize : array[tsubregister] of topsize =
  364. (S_NO,S_B,S_B,S_W,S_L,S_D);
  365. begin
  366. reg2opsize:=S_L;
  367. case getregtype(r) of
  368. R_INTREGISTER :
  369. reg2opsize:=subreg2opsize[getsubreg(r)];
  370. R_FPUREGISTER :
  371. reg2opsize:=S_FL;
  372. R_MMXREGISTER,
  373. R_MMREGISTER :
  374. reg2opsize:=S_D;
  375. R_SPECIALREGISTER :
  376. begin
  377. case r of
  378. NR_CS,NR_DS,NR_ES,
  379. NR_SS,NR_FS,NR_GS :
  380. reg2opsize:=S_W;
  381. end;
  382. end;
  383. else
  384. internalerror(200303181);
  385. end;
  386. end;
  387. function is_calljmp(o:tasmop):boolean;
  388. begin
  389. case o of
  390. A_CALL,
  391. A_JCXZ,
  392. A_JECXZ,
  393. A_JMP,
  394. A_LOOP,
  395. A_LOOPE,
  396. A_LOOPNE,
  397. A_LOOPNZ,
  398. A_LOOPZ,
  399. A_Jcc :
  400. is_calljmp:=true;
  401. else
  402. is_calljmp:=false;
  403. end;
  404. end;
  405. procedure inverse_flags(var f: TResFlags);
  406. const
  407. inv_flags: array[TResFlags] of TResFlags =
  408. (F_NE,F_E,F_LE,F_GE,F_L,F_G,F_NC,F_C,F_BE,F_B,F_AE,F_A);
  409. begin
  410. f:=inv_flags[f];
  411. end;
  412. function flags_to_cond(const f: TResFlags) : TAsmCond;
  413. const
  414. flags_2_cond : array[TResFlags] of TAsmCond =
  415. (C_E,C_NE,C_G,C_L,C_GE,C_LE,C_C,C_NC,C_A,C_AE,C_B,C_BE);
  416. begin
  417. result := flags_2_cond[f];
  418. end;
  419. function is_segment_reg(r:tregister):boolean;
  420. begin
  421. result:=false;
  422. case r of
  423. NR_CS,NR_DS,NR_ES,
  424. NR_SS,NR_FS,NR_GS :
  425. result:=true;
  426. end;
  427. end;
  428. function findreg_by_stdname(const s:string):byte;
  429. var
  430. i,p : tregisterindex;
  431. begin
  432. {Binary search.}
  433. p:=0;
  434. i:=regnumber_count_bsstart;
  435. repeat
  436. if (p+i<=high(tregisterindex)) and (std_regname_table[std_regname_index[p+i]]<=s) then
  437. p:=p+i;
  438. i:=i shr 1;
  439. until i=0;
  440. if std_regname_table[std_regname_index[p]]=s then
  441. result:=std_regname_index[p]
  442. else
  443. result:=0;
  444. end;
  445. function findreg_by_number(r:Tregister):tregisterindex;
  446. var
  447. i,p : tregisterindex;
  448. begin
  449. {Binary search.}
  450. p:=0;
  451. i:=regnumber_count_bsstart;
  452. repeat
  453. if (p+i<=high(tregisterindex)) and (regnumber_table[regnumber_index[p+i]]<=r) then
  454. p:=p+i;
  455. i:=i shr 1;
  456. until i=0;
  457. if regnumber_table[regnumber_index[p]]=r then
  458. result:=regnumber_index[p]
  459. else
  460. result:=0;
  461. end;
  462. function std_regnum_search(const s:string):Tregister;
  463. begin
  464. result:=regnumber_table[findreg_by_stdname(s)];
  465. end;
  466. function std_regname(r:Tregister):string;
  467. var
  468. p : tregisterindex;
  469. begin
  470. p:=findreg_by_number(r);
  471. if p<>0 then
  472. result:=std_regname_table[p]
  473. else
  474. result:=generic_regname(r);
  475. end;
  476. end.
  477. {
  478. $Log$
  479. Revision 1.19 2003-09-24 17:12:36 florian
  480. * x86-64 adaptions
  481. Revision 1.18 2003/09/23 17:56:06 peter
  482. * locals and paras are allocated in the code generation
  483. * tvarsym.localloc contains the location of para/local when
  484. generating code for the current procedure
  485. Revision 1.17 2003/09/07 22:09:35 peter
  486. * preparations for different default calling conventions
  487. * various RA fixes
  488. Revision 1.16 2003/09/04 21:07:03 florian
  489. * ARM compiler compiles again
  490. Revision 1.15 2003/09/03 15:55:02 peter
  491. * NEWRA branch merged
  492. Revision 1.14 2003/09/03 11:18:37 florian
  493. * fixed arm concatcopy
  494. + arm support in the common compiler sources added
  495. * moved some generic cg code around
  496. + tfputype added
  497. * ...
  498. Revision 1.13.2.8 2003/08/31 19:31:51 daniel
  499. * FIxed superregister constants
  500. Revision 1.13.2.7 2003/08/31 16:18:05 peter
  501. * more fixes
  502. Revision 1.13.2.6 2003/08/31 15:46:26 peter
  503. * more updates for tregister
  504. Revision 1.13.2.5 2003/08/31 13:50:16 daniel
  505. * Remove sorting and use pregenerated indexes
  506. * Some work on making things compile
  507. Revision 1.13.2.4 2003/08/29 17:29:00 peter
  508. * next batch of updates
  509. Revision 1.13.2.3 2003/08/28 18:35:08 peter
  510. * tregister changed to cardinal
  511. Revision 1.13.2.2 2003/08/27 21:06:34 peter
  512. * more updates
  513. Revision 1.13.2.1 2003/08/27 19:55:54 peter
  514. * first tregister patch
  515. Revision 1.13 2003/08/20 07:48:04 daniel
  516. * Made internal assembler use new register coding
  517. Revision 1.12 2003/08/17 16:59:20 jonas
  518. * fixed regvars so they work with newra (at least for ppc)
  519. * fixed some volatile register bugs
  520. + -dnotranslation option for -dnewra, which causes the registers not to
  521. be translated from virtual to normal registers. Requires support in
  522. the assembler writer as well, which is only implemented in aggas/
  523. agppcgas currently
  524. Revision 1.11 2003/07/06 21:50:33 jonas
  525. * fixed ppc compilation problems and changed VOLATILE_REGISTERS for x86
  526. so that it doesn't include ebp and esp anymore
  527. Revision 1.10 2003/06/17 16:34:45 jonas
  528. * lots of newra fixes (need getfuncretparaloc implementation for i386)!
  529. * renamed all_intregisters to volatile_intregisters and made it
  530. processor dependent
  531. Revision 1.9 2003/06/13 21:19:33 peter
  532. * current_procdef removed, use current_procinfo.procdef instead
  533. Revision 1.8 2003/06/12 19:11:34 jonas
  534. - removed ALL_INTREGISTERS (only the one in rgobj is valid)
  535. Revision 1.7 2003/06/03 21:11:09 peter
  536. * cg.a_load_* get a from and to size specifier
  537. * makeregsize only accepts newregister
  538. * i386 uses generic tcgnotnode,tcgunaryminus
  539. Revision 1.6 2003/06/03 13:01:59 daniel
  540. * Register allocator finished
  541. Revision 1.5 2003/05/30 23:57:08 peter
  542. * more sparc cleanup
  543. * accumulator removed, splitted in function_return_reg (called) and
  544. function_result_reg (caller)
  545. Revision 1.4 2003/04/30 20:53:32 florian
  546. * error when address of an abstract method is taken
  547. * fixed some x86-64 problems
  548. * merged some more x86-64 and i386 code
  549. Revision 1.3 2002/04/25 20:15:40 florian
  550. * block nodes within expressions shouldn't release the used registers,
  551. fixed using a flag till the new rg is ready
  552. Revision 1.2 2002/04/25 16:12:09 florian
  553. * fixed more problems with cpubase and x86-64
  554. Revision 1.1 2003/04/25 11:12:09 florian
  555. * merged i386/cpubase and x86_64/cpubase to x86/cpubase;
  556. different stuff went to cpubase.inc
  557. Revision 1.50 2003/04/25 08:25:26 daniel
  558. * Ifdefs around a lot of calls to cleartempgen
  559. * Fixed registers that are allocated but not freed in several nodes
  560. * Tweak to register allocator to cause less spills
  561. * 8-bit registers now interfere with esi,edi and ebp
  562. Compiler can now compile rtl successfully when using new register
  563. allocator
  564. Revision 1.49 2003/04/22 23:50:23 peter
  565. * firstpass uses expectloc
  566. * checks if there are differences between the expectloc and
  567. location.loc from secondpass in EXTDEBUG
  568. Revision 1.48 2003/04/22 14:33:38 peter
  569. * removed some notes/hints
  570. Revision 1.47 2003/04/22 10:09:35 daniel
  571. + Implemented the actual register allocator
  572. + Scratch registers unavailable when new register allocator used
  573. + maybe_save/maybe_restore unavailable when new register allocator used
  574. Revision 1.46 2003/04/21 19:16:50 peter
  575. * count address regs separate
  576. Revision 1.45 2003/03/28 19:16:57 peter
  577. * generic constructor working for i386
  578. * remove fixed self register
  579. * esi added as address register for i386
  580. Revision 1.44 2003/03/18 18:15:53 peter
  581. * changed reg2opsize to function
  582. Revision 1.43 2003/03/08 08:59:07 daniel
  583. + $define newra will enable new register allocator
  584. + getregisterint will return imaginary registers with $newra
  585. + -sr switch added, will skip register allocation so you can see
  586. the direct output of the code generator before register allocation
  587. Revision 1.42 2003/02/19 22:00:15 daniel
  588. * Code generator converted to new register notation
  589. - Horribily outdated todo.txt removed
  590. Revision 1.41 2003/02/02 19:25:54 carl
  591. * Several bugfixes for m68k target (register alloc., opcode emission)
  592. + VIS target
  593. + Generic add more complete (still not verified)
  594. Revision 1.40 2003/01/13 18:37:44 daniel
  595. * Work on register conversion
  596. Revision 1.39 2003/01/09 20:41:00 daniel
  597. * Converted some code in cgx86.pas to new register numbering
  598. Revision 1.38 2003/01/09 15:49:56 daniel
  599. * Added register conversion
  600. Revision 1.37 2003/01/08 22:32:36 daniel
  601. * Added register convesrion procedure
  602. Revision 1.36 2003/01/08 18:43:57 daniel
  603. * Tregister changed into a record
  604. Revision 1.35 2003/01/05 13:36:53 florian
  605. * x86-64 compiles
  606. + very basic support for float128 type (x86-64 only)
  607. Revision 1.34 2002/11/17 18:26:16 mazen
  608. * fixed a compilation bug accmulator-->FUNCTION_RETURN_REG, in definition of return_result_reg
  609. Revision 1.33 2002/11/17 17:49:08 mazen
  610. + 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
  611. Revision 1.32 2002/10/05 12:43:29 carl
  612. * fixes for Delphi 6 compilation
  613. (warning : Some features do not work under Delphi)
  614. Revision 1.31 2002/08/14 18:41:48 jonas
  615. - remove valuelow/valuehigh fields from tlocation, because they depend
  616. on the endianess of the host operating system -> difficult to get
  617. right. Use lo/hi(location.valueqword) instead (remember to use
  618. valueqword and not value!!)
  619. Revision 1.30 2002/08/13 21:40:58 florian
  620. * more fixes for ppc calling conventions
  621. Revision 1.29 2002/08/12 15:08:41 carl
  622. + stab register indexes for powerpc (moved from gdb to cpubase)
  623. + tprocessor enumeration moved to cpuinfo
  624. + linker in target_info is now a class
  625. * many many updates for m68k (will soon start to compile)
  626. - removed some ifdef or correct them for correct cpu
  627. Revision 1.28 2002/08/06 20:55:23 florian
  628. * first part of ppc calling conventions fix
  629. Revision 1.27 2002/07/25 18:01:29 carl
  630. + FPURESULTREG -> FPU_RESULT_REG
  631. Revision 1.26 2002/07/07 09:52:33 florian
  632. * powerpc target fixed, very simple units can be compiled
  633. * some basic stuff for better callparanode handling, far from being finished
  634. Revision 1.25 2002/07/01 18:46:30 peter
  635. * internal linker
  636. * reorganized aasm layer
  637. Revision 1.24 2002/07/01 16:23:55 peter
  638. * cg64 patch
  639. * basics for currency
  640. * asnode updates for class and interface (not finished)
  641. Revision 1.23 2002/05/18 13:34:22 peter
  642. * readded missing revisions
  643. Revision 1.22 2002/05/16 19:46:50 carl
  644. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  645. + try to fix temp allocation (still in ifdef)
  646. + generic constructor calls
  647. + start of tassembler / tmodulebase class cleanup
  648. Revision 1.19 2002/05/12 16:53:16 peter
  649. * moved entry and exitcode to ncgutil and cgobj
  650. * foreach gets extra argument for passing local data to the
  651. iterator function
  652. * -CR checks also class typecasts at runtime by changing them
  653. into as
  654. * fixed compiler to cycle with the -CR option
  655. * fixed stabs with elf writer, finally the global variables can
  656. be watched
  657. * removed a lot of routines from cga unit and replaced them by
  658. calls to cgobj
  659. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  660. u32bit then the other is typecasted also to u32bit without giving
  661. a rangecheck warning/error.
  662. * fixed pascal calling method with reversing also the high tree in
  663. the parast, detected by tcalcst3 test
  664. Revision 1.18 2002/04/21 15:31:40 carl
  665. - removed some other stuff to their units
  666. Revision 1.17 2002/04/20 21:37:07 carl
  667. + generic FPC_CHECKPOINTER
  668. + first parameter offset in stack now portable
  669. * rename some constants
  670. + move some cpu stuff to other units
  671. - remove unused constents
  672. * fix stacksize for some targets
  673. * fix generic size problems which depend now on EXTEND_SIZE constant
  674. * removing frame pointer in routines is only available for : i386,m68k and vis targets
  675. Revision 1.16 2002/04/15 19:53:54 peter
  676. * fixed conflicts between the last 2 commits
  677. Revision 1.15 2002/04/15 19:44:20 peter
  678. * fixed stackcheck that would be called recursively when a stack
  679. error was found
  680. * generic changeregsize(reg,size) for i386 register resizing
  681. * removed some more routines from cga unit
  682. * fixed returnvalue handling
  683. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  684. Revision 1.14 2002/04/15 19:12:09 carl
  685. + target_info.size_of_pointer -> pointer_size
  686. + some cleanup of unused types/variables
  687. * move several constants from cpubase to their specific units
  688. (where they are used)
  689. + att_Reg2str -> gas_reg2str
  690. + int_reg2str -> std_reg2str
  691. Revision 1.13 2002/04/14 16:59:41 carl
  692. + att_reg2str -> gas_reg2str
  693. Revision 1.12 2002/04/02 17:11:34 peter
  694. * tlocation,treference update
  695. * LOC_CONSTANT added for better constant handling
  696. * secondadd splitted in multiple routines
  697. * location_force_reg added for loading a location to a register
  698. of a specified size
  699. * secondassignment parses now first the right and then the left node
  700. (this is compatible with Kylix). This saves a lot of push/pop especially
  701. with string operations
  702. * adapted some routines to use the new cg methods
  703. Revision 1.11 2002/03/31 20:26:37 jonas
  704. + a_loadfpu_* and a_loadmm_* methods in tcg
  705. * register allocation is now handled by a class and is mostly processor
  706. independent (+rgobj.pas and i386/rgcpu.pas)
  707. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  708. * some small improvements and fixes to the optimizer
  709. * some register allocation fixes
  710. * some fpuvaroffset fixes in the unary minus node
  711. * push/popusedregisters is now called rg.save/restoreusedregisters and
  712. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  713. also better optimizable)
  714. * fixed and optimized register saving/restoring for new/dispose nodes
  715. * LOC_FPU locations now also require their "register" field to be set to
  716. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  717. - list field removed of the tnode class because it's not used currently
  718. and can cause hard-to-find bugs
  719. Revision 1.10 2002/03/04 19:10:12 peter
  720. * removed compiler warnings
  721. }