cpubase.pas 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  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,F_S,F_NS);
  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,F_NS,F_S);
  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,C_S,C_NS);
  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.21 2003-09-28 21:49:39 peter
  479. * removed emitjmp
  480. Revision 1.20 2003/09/25 21:29:23 peter
  481. * remove sp_fixup
  482. Revision 1.19 2003/09/24 17:12:36 florian
  483. * x86-64 adaptions
  484. Revision 1.18 2003/09/23 17:56:06 peter
  485. * locals and paras are allocated in the code generation
  486. * tvarsym.localloc contains the location of para/local when
  487. generating code for the current procedure
  488. Revision 1.17 2003/09/07 22:09:35 peter
  489. * preparations for different default calling conventions
  490. * various RA fixes
  491. Revision 1.16 2003/09/04 21:07:03 florian
  492. * ARM compiler compiles again
  493. Revision 1.15 2003/09/03 15:55:02 peter
  494. * NEWRA branch merged
  495. Revision 1.14 2003/09/03 11:18:37 florian
  496. * fixed arm concatcopy
  497. + arm support in the common compiler sources added
  498. * moved some generic cg code around
  499. + tfputype added
  500. * ...
  501. Revision 1.13.2.8 2003/08/31 19:31:51 daniel
  502. * FIxed superregister constants
  503. Revision 1.13.2.7 2003/08/31 16:18:05 peter
  504. * more fixes
  505. Revision 1.13.2.6 2003/08/31 15:46:26 peter
  506. * more updates for tregister
  507. Revision 1.13.2.5 2003/08/31 13:50:16 daniel
  508. * Remove sorting and use pregenerated indexes
  509. * Some work on making things compile
  510. Revision 1.13.2.4 2003/08/29 17:29:00 peter
  511. * next batch of updates
  512. Revision 1.13.2.3 2003/08/28 18:35:08 peter
  513. * tregister changed to cardinal
  514. Revision 1.13.2.2 2003/08/27 21:06:34 peter
  515. * more updates
  516. Revision 1.13.2.1 2003/08/27 19:55:54 peter
  517. * first tregister patch
  518. Revision 1.13 2003/08/20 07:48:04 daniel
  519. * Made internal assembler use new register coding
  520. Revision 1.12 2003/08/17 16:59:20 jonas
  521. * fixed regvars so they work with newra (at least for ppc)
  522. * fixed some volatile register bugs
  523. + -dnotranslation option for -dnewra, which causes the registers not to
  524. be translated from virtual to normal registers. Requires support in
  525. the assembler writer as well, which is only implemented in aggas/
  526. agppcgas currently
  527. Revision 1.11 2003/07/06 21:50:33 jonas
  528. * fixed ppc compilation problems and changed VOLATILE_REGISTERS for x86
  529. so that it doesn't include ebp and esp anymore
  530. Revision 1.10 2003/06/17 16:34:45 jonas
  531. * lots of newra fixes (need getfuncretparaloc implementation for i386)!
  532. * renamed all_intregisters to volatile_intregisters and made it
  533. processor dependent
  534. Revision 1.9 2003/06/13 21:19:33 peter
  535. * current_procdef removed, use current_procinfo.procdef instead
  536. Revision 1.8 2003/06/12 19:11:34 jonas
  537. - removed ALL_INTREGISTERS (only the one in rgobj is valid)
  538. Revision 1.7 2003/06/03 21:11:09 peter
  539. * cg.a_load_* get a from and to size specifier
  540. * makeregsize only accepts newregister
  541. * i386 uses generic tcgnotnode,tcgunaryminus
  542. Revision 1.6 2003/06/03 13:01:59 daniel
  543. * Register allocator finished
  544. Revision 1.5 2003/05/30 23:57:08 peter
  545. * more sparc cleanup
  546. * accumulator removed, splitted in function_return_reg (called) and
  547. function_result_reg (caller)
  548. Revision 1.4 2003/04/30 20:53:32 florian
  549. * error when address of an abstract method is taken
  550. * fixed some x86-64 problems
  551. * merged some more x86-64 and i386 code
  552. Revision 1.3 2002/04/25 20:15:40 florian
  553. * block nodes within expressions shouldn't release the used registers,
  554. fixed using a flag till the new rg is ready
  555. Revision 1.2 2002/04/25 16:12:09 florian
  556. * fixed more problems with cpubase and x86-64
  557. Revision 1.1 2003/04/25 11:12:09 florian
  558. * merged i386/cpubase and x86_64/cpubase to x86/cpubase;
  559. different stuff went to cpubase.inc
  560. Revision 1.50 2003/04/25 08:25:26 daniel
  561. * Ifdefs around a lot of calls to cleartempgen
  562. * Fixed registers that are allocated but not freed in several nodes
  563. * Tweak to register allocator to cause less spills
  564. * 8-bit registers now interfere with esi,edi and ebp
  565. Compiler can now compile rtl successfully when using new register
  566. allocator
  567. Revision 1.49 2003/04/22 23:50:23 peter
  568. * firstpass uses expectloc
  569. * checks if there are differences between the expectloc and
  570. location.loc from secondpass in EXTDEBUG
  571. Revision 1.48 2003/04/22 14:33:38 peter
  572. * removed some notes/hints
  573. Revision 1.47 2003/04/22 10:09:35 daniel
  574. + Implemented the actual register allocator
  575. + Scratch registers unavailable when new register allocator used
  576. + maybe_save/maybe_restore unavailable when new register allocator used
  577. Revision 1.46 2003/04/21 19:16:50 peter
  578. * count address regs separate
  579. Revision 1.45 2003/03/28 19:16:57 peter
  580. * generic constructor working for i386
  581. * remove fixed self register
  582. * esi added as address register for i386
  583. Revision 1.44 2003/03/18 18:15:53 peter
  584. * changed reg2opsize to function
  585. Revision 1.43 2003/03/08 08:59:07 daniel
  586. + $define newra will enable new register allocator
  587. + getregisterint will return imaginary registers with $newra
  588. + -sr switch added, will skip register allocation so you can see
  589. the direct output of the code generator before register allocation
  590. Revision 1.42 2003/02/19 22:00:15 daniel
  591. * Code generator converted to new register notation
  592. - Horribily outdated todo.txt removed
  593. Revision 1.41 2003/02/02 19:25:54 carl
  594. * Several bugfixes for m68k target (register alloc., opcode emission)
  595. + VIS target
  596. + Generic add more complete (still not verified)
  597. Revision 1.40 2003/01/13 18:37:44 daniel
  598. * Work on register conversion
  599. Revision 1.39 2003/01/09 20:41:00 daniel
  600. * Converted some code in cgx86.pas to new register numbering
  601. Revision 1.38 2003/01/09 15:49:56 daniel
  602. * Added register conversion
  603. Revision 1.37 2003/01/08 22:32:36 daniel
  604. * Added register convesrion procedure
  605. Revision 1.36 2003/01/08 18:43:57 daniel
  606. * Tregister changed into a record
  607. Revision 1.35 2003/01/05 13:36:53 florian
  608. * x86-64 compiles
  609. + very basic support for float128 type (x86-64 only)
  610. Revision 1.34 2002/11/17 18:26:16 mazen
  611. * fixed a compilation bug accmulator-->FUNCTION_RETURN_REG, in definition of return_result_reg
  612. Revision 1.33 2002/11/17 17:49:08 mazen
  613. + 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
  614. Revision 1.32 2002/10/05 12:43:29 carl
  615. * fixes for Delphi 6 compilation
  616. (warning : Some features do not work under Delphi)
  617. Revision 1.31 2002/08/14 18:41:48 jonas
  618. - remove valuelow/valuehigh fields from tlocation, because they depend
  619. on the endianess of the host operating system -> difficult to get
  620. right. Use lo/hi(location.valueqword) instead (remember to use
  621. valueqword and not value!!)
  622. Revision 1.30 2002/08/13 21:40:58 florian
  623. * more fixes for ppc calling conventions
  624. Revision 1.29 2002/08/12 15:08:41 carl
  625. + stab register indexes for powerpc (moved from gdb to cpubase)
  626. + tprocessor enumeration moved to cpuinfo
  627. + linker in target_info is now a class
  628. * many many updates for m68k (will soon start to compile)
  629. - removed some ifdef or correct them for correct cpu
  630. Revision 1.28 2002/08/06 20:55:23 florian
  631. * first part of ppc calling conventions fix
  632. Revision 1.27 2002/07/25 18:01:29 carl
  633. + FPURESULTREG -> FPU_RESULT_REG
  634. Revision 1.26 2002/07/07 09:52:33 florian
  635. * powerpc target fixed, very simple units can be compiled
  636. * some basic stuff for better callparanode handling, far from being finished
  637. Revision 1.25 2002/07/01 18:46:30 peter
  638. * internal linker
  639. * reorganized aasm layer
  640. Revision 1.24 2002/07/01 16:23:55 peter
  641. * cg64 patch
  642. * basics for currency
  643. * asnode updates for class and interface (not finished)
  644. Revision 1.23 2002/05/18 13:34:22 peter
  645. * readded missing revisions
  646. Revision 1.22 2002/05/16 19:46:50 carl
  647. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  648. + try to fix temp allocation (still in ifdef)
  649. + generic constructor calls
  650. + start of tassembler / tmodulebase class cleanup
  651. Revision 1.19 2002/05/12 16:53:16 peter
  652. * moved entry and exitcode to ncgutil and cgobj
  653. * foreach gets extra argument for passing local data to the
  654. iterator function
  655. * -CR checks also class typecasts at runtime by changing them
  656. into as
  657. * fixed compiler to cycle with the -CR option
  658. * fixed stabs with elf writer, finally the global variables can
  659. be watched
  660. * removed a lot of routines from cga unit and replaced them by
  661. calls to cgobj
  662. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  663. u32bit then the other is typecasted also to u32bit without giving
  664. a rangecheck warning/error.
  665. * fixed pascal calling method with reversing also the high tree in
  666. the parast, detected by tcalcst3 test
  667. Revision 1.18 2002/04/21 15:31:40 carl
  668. - removed some other stuff to their units
  669. Revision 1.17 2002/04/20 21:37:07 carl
  670. + generic FPC_CHECKPOINTER
  671. + first parameter offset in stack now portable
  672. * rename some constants
  673. + move some cpu stuff to other units
  674. - remove unused constents
  675. * fix stacksize for some targets
  676. * fix generic size problems which depend now on EXTEND_SIZE constant
  677. * removing frame pointer in routines is only available for : i386,m68k and vis targets
  678. Revision 1.16 2002/04/15 19:53:54 peter
  679. * fixed conflicts between the last 2 commits
  680. Revision 1.15 2002/04/15 19:44:20 peter
  681. * fixed stackcheck that would be called recursively when a stack
  682. error was found
  683. * generic changeregsize(reg,size) for i386 register resizing
  684. * removed some more routines from cga unit
  685. * fixed returnvalue handling
  686. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  687. Revision 1.14 2002/04/15 19:12:09 carl
  688. + target_info.size_of_pointer -> pointer_size
  689. + some cleanup of unused types/variables
  690. * move several constants from cpubase to their specific units
  691. (where they are used)
  692. + att_Reg2str -> gas_reg2str
  693. + int_reg2str -> std_reg2str
  694. Revision 1.13 2002/04/14 16:59:41 carl
  695. + att_reg2str -> gas_reg2str
  696. Revision 1.12 2002/04/02 17:11:34 peter
  697. * tlocation,treference update
  698. * LOC_CONSTANT added for better constant handling
  699. * secondadd splitted in multiple routines
  700. * location_force_reg added for loading a location to a register
  701. of a specified size
  702. * secondassignment parses now first the right and then the left node
  703. (this is compatible with Kylix). This saves a lot of push/pop especially
  704. with string operations
  705. * adapted some routines to use the new cg methods
  706. Revision 1.11 2002/03/31 20:26:37 jonas
  707. + a_loadfpu_* and a_loadmm_* methods in tcg
  708. * register allocation is now handled by a class and is mostly processor
  709. independent (+rgobj.pas and i386/rgcpu.pas)
  710. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  711. * some small improvements and fixes to the optimizer
  712. * some register allocation fixes
  713. * some fpuvaroffset fixes in the unary minus node
  714. * push/popusedregisters is now called rg.save/restoreusedregisters and
  715. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  716. also better optimizable)
  717. * fixed and optimized register saving/restoring for new/dispose nodes
  718. * LOC_FPU locations now also require their "register" field to be set to
  719. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  720. - list field removed of the tnode class because it's not used currently
  721. and can cause hard-to-find bugs
  722. Revision 1.10 2002/03/04 19:10:12 peter
  723. * removed compiler warnings
  724. }