cpubase.pas 28 KB

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