cpubase.pas 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  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 x8664op.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. { Number of first imaginary register }
  87. first_int_imreg = $10;
  88. { Float Super registers }
  89. RS_ST0 = $00;
  90. RS_ST1 = $01;
  91. RS_ST2 = $02;
  92. RS_ST3 = $03;
  93. RS_ST4 = $04;
  94. RS_ST5 = $05;
  95. RS_ST6 = $06;
  96. RS_ST7 = $07;
  97. { Number of first imaginary register }
  98. first_fpu_imreg = $08;
  99. { MM Super registers }
  100. RS_XMM0 = $00;
  101. RS_XMM1 = $01;
  102. RS_XMM2 = $02;
  103. RS_XMM3 = $03;
  104. RS_XMM4 = $04;
  105. RS_XMM5 = $05;
  106. RS_XMM6 = $06;
  107. RS_XMM7 = $07;
  108. RS_XMM8 = $08;
  109. RS_XMM9 = $09;
  110. RS_XMM10 = $0a;
  111. RS_XMM11 = $0b;
  112. RS_XMM12 = $0c;
  113. RS_XMM13 = $0d;
  114. RS_XMM14 = $0e;
  115. RS_XMM15 = $0f;
  116. { Number of first imaginary register }
  117. {$ifdef x86_64}
  118. first_sse_imreg = $10;
  119. {$else x86_64}
  120. first_sse_imreg = $08;
  121. {$endif x86_64}
  122. { The subregister that specifies the entire register }
  123. {$ifdef x86_64}
  124. R_SUBWHOLE = R_SUBQ; {Hammer}
  125. {$else x86_64}
  126. R_SUBWHOLE = R_SUBD; {i386}
  127. {$endif x86_64}
  128. { Available Registers }
  129. {$ifdef x86_64}
  130. {$i r8664con.inc}
  131. {$else x86_64}
  132. {$i r386con.inc}
  133. {$endif x86_64}
  134. type
  135. { Number of registers used for indexing in tables }
  136. {$ifdef x86_64}
  137. tregisterindex=0..{$i r8664nor.inc}-1;
  138. {$else x86_64}
  139. tregisterindex=0..{$i r386nor.inc}-1;
  140. {$endif x86_64}
  141. const
  142. {$warning TODO Calculate bsstart}
  143. regnumber_count_bsstart = 64;
  144. regnumber_table : array[tregisterindex] of tregister = (
  145. {$ifdef x86_64}
  146. {$i r8664num.inc}
  147. {$else x86_64}
  148. {$i r386num.inc}
  149. {$endif x86_64}
  150. );
  151. regstabs_table : array[tregisterindex] of shortint = (
  152. {$ifdef x86_64}
  153. {$i r8664stab.inc}
  154. {$else x86_64}
  155. {$i r386stab.inc}
  156. {$endif x86_64}
  157. );
  158. type
  159. totherregisterset = set of tregisterindex;
  160. {*****************************************************************************
  161. Conditions
  162. *****************************************************************************}
  163. type
  164. TAsmCond=(C_None,
  165. C_A,C_AE,C_B,C_BE,C_C,C_E,C_G,C_GE,C_L,C_LE,C_NA,C_NAE,
  166. C_NB,C_NBE,C_NC,C_NE,C_NG,C_NGE,C_NL,C_NLE,C_NO,C_NP,
  167. C_NS,C_NZ,C_O,C_P,C_PE,C_PO,C_S,C_Z
  168. );
  169. const
  170. cond2str:array[TAsmCond] of string[3]=('',
  171. 'a','ae','b','be','c','e','g','ge','l','le','na','nae',
  172. 'nb','nbe','nc','ne','ng','nge','nl','nle','no','np',
  173. 'ns','nz','o','p','pe','po','s','z'
  174. );
  175. inverse_cond:array[TAsmCond] of TAsmCond=(C_None,
  176. C_NA,C_NAE,C_NB,C_NBE,C_NC,C_NE,C_NG,C_NGE,C_NL,C_NLE,C_A,C_AE,
  177. C_B,C_BE,C_C,C_E,C_G,C_GE,C_L,C_LE,C_O,C_P,
  178. C_S,C_Z,C_NO,C_NP,C_NP,C_P,C_NS,C_NZ
  179. );
  180. {*****************************************************************************
  181. Flags
  182. *****************************************************************************}
  183. type
  184. TResFlags = (F_E,F_NE,F_G,F_L,F_GE,F_LE,F_C,F_NC,
  185. F_A,F_AE,F_B,F_BE,
  186. F_S,F_NS,F_O,F_NO);
  187. {*****************************************************************************
  188. Reference
  189. *****************************************************************************}
  190. type
  191. { reference record, reordered for best alignment }
  192. preference = ^treference;
  193. treference = record
  194. offset : aint;
  195. symbol,
  196. relsymbol : tasmsymbol;
  197. segment,
  198. base,
  199. index : tregister;
  200. refaddr : trefaddr;
  201. scalefactor : byte;
  202. end;
  203. { reference record }
  204. pparareference = ^tparareference;
  205. tparareference = packed record
  206. index : tregister;
  207. offset : aint;
  208. end;
  209. {*****************************************************************************
  210. Generic Location
  211. *****************************************************************************}
  212. type
  213. { tparamlocation describes where a parameter for a procedure is stored.
  214. References are given from the caller's point of view. The usual
  215. TLocation isn't used, because contains a lot of unnessary fields.
  216. }
  217. tparalocation = record
  218. size : TCGSize;
  219. loc : TCGLoc;
  220. { Location type of registerhigh, for x86_64 this can
  221. be different from loc when pushing structures of 16 bytes }
  222. lochigh : TCGLoc;
  223. alignment : byte;
  224. case TCGLoc of
  225. LOC_REFERENCE : (reference : tparareference);
  226. { segment in reference at the same place as in loc_register }
  227. LOC_REGISTER,LOC_CREGISTER : (
  228. case longint of
  229. 1 : (register,registerhigh : tregister);
  230. { overlay a registerlow }
  231. 2 : (registerlow : tregister);
  232. {$ifndef cpu64bit}
  233. { overlay a 64 Bit register type }
  234. 3 : (register64 : tregister64);
  235. {$endif cpu64bit}
  236. );
  237. { it's only for better handling }
  238. LOC_MMXREGISTER,LOC_CMMXREGISTER : (
  239. case longint of
  240. 0: (mmxreg : tregister);
  241. 1: (mmxregset : Tregistermmxset);
  242. );
  243. end;
  244. tlocation = packed record
  245. loc : TCGLoc;
  246. size : TCGSize;
  247. case TCGLoc of
  248. LOC_FLAGS : (resflags : tresflags);
  249. LOC_CONSTANT : (
  250. case longint of
  251. 1 : (value : AWord);
  252. { can't do this, this layout depends on the host cpu. Use }
  253. { lo(valueqword)/hi(valueqword) instead (JM) }
  254. { 2 : (valuelow, valuehigh:AWord); }
  255. { overlay a complete 64 Bit value }
  256. 3 : (valueqword : qword);
  257. );
  258. LOC_CREFERENCE,
  259. LOC_REFERENCE : (reference : treference);
  260. { segment in reference at the same place as in loc_register }
  261. LOC_REGISTER,LOC_CREGISTER : (
  262. case longint of
  263. 1 : (register,registerhigh,segment : tregister);
  264. { overlay a registerlow }
  265. 2 : (registerlow : tregister);
  266. { overlay a 64 Bit register type }
  267. 3 : (reg64 : tregister64);
  268. 4 : (register64 : tregister64);
  269. );
  270. { it's only for better handling }
  271. LOC_MMXREGISTER,LOC_CMMXREGISTER : (mmxreg : tregister);
  272. end;
  273. {*****************************************************************************
  274. Constants
  275. *****************************************************************************}
  276. const
  277. { declare aliases }
  278. LOC_SSEREGISTER = LOC_MMREGISTER;
  279. LOC_CSSEREGISTER = LOC_CMMREGISTER;
  280. max_operands = 3;
  281. maxfpuregs = 8;
  282. {*****************************************************************************
  283. CPU Dependent Constants
  284. *****************************************************************************}
  285. {$i cpubase.inc}
  286. {*****************************************************************************
  287. Helpers
  288. *****************************************************************************}
  289. function cgsize2subreg(s:Tcgsize):Tsubregister;
  290. function reg2opsize(r:Tregister):topsize;
  291. function is_calljmp(o:tasmop):boolean;
  292. procedure inverse_flags(var f: TResFlags);
  293. function flags_to_cond(const f: TResFlags) : TAsmCond;
  294. function is_segment_reg(r:tregister):boolean;
  295. function findreg_by_number(r:Tregister):tregisterindex;
  296. function std_regnum_search(const s:string):Tregister;
  297. function std_regname(r:Tregister):string;
  298. implementation
  299. uses
  300. rgbase,verbose;
  301. const
  302. {$ifdef x86_64}
  303. std_regname_table : array[tregisterindex] of string[7] = (
  304. {$i r8664std.inc}
  305. );
  306. regnumber_index : array[tregisterindex] of tregisterindex = (
  307. {$i r8664rni.inc}
  308. );
  309. std_regname_index : array[tregisterindex] of tregisterindex = (
  310. {$i r8664sri.inc}
  311. );
  312. {$else x86_64}
  313. std_regname_table : array[tregisterindex] of string[7] = (
  314. {$i r386std.inc}
  315. );
  316. regnumber_index : array[tregisterindex] of tregisterindex = (
  317. {$i r386rni.inc}
  318. );
  319. std_regname_index : array[tregisterindex] of tregisterindex = (
  320. {$i r386sri.inc}
  321. );
  322. {$endif x86_64}
  323. {*****************************************************************************
  324. Helpers
  325. *****************************************************************************}
  326. function cgsize2subreg(s:Tcgsize):Tsubregister;
  327. begin
  328. case s of
  329. OS_8,OS_S8:
  330. cgsize2subreg:=R_SUBL;
  331. OS_16,OS_S16:
  332. cgsize2subreg:=R_SUBW;
  333. OS_32,OS_S32:
  334. cgsize2subreg:=R_SUBD;
  335. OS_64,OS_S64:
  336. cgsize2subreg:=R_SUBQ;
  337. OS_M64:
  338. cgsize2subreg:=R_SUBNONE;
  339. OS_F32,OS_F64,
  340. OS_M128,OS_MS128:
  341. cgsize2subreg:=R_SUBWHOLE;
  342. else
  343. internalerror(200301231);
  344. end;
  345. end;
  346. function reg2opsize(r:Tregister):topsize;
  347. const
  348. subreg2opsize : array[tsubregister] of topsize =
  349. (S_NO,S_B,S_B,S_W,S_L,S_Q,S_NO,S_NO);
  350. begin
  351. reg2opsize:=S_L;
  352. case getregtype(r) of
  353. R_INTREGISTER :
  354. reg2opsize:=subreg2opsize[getsubreg(r)];
  355. R_FPUREGISTER :
  356. reg2opsize:=S_FL;
  357. R_MMXREGISTER,
  358. R_MMREGISTER :
  359. reg2opsize:=S_MD;
  360. R_SPECIALREGISTER :
  361. begin
  362. case r of
  363. NR_CS,NR_DS,NR_ES,
  364. NR_SS,NR_FS,NR_GS :
  365. reg2opsize:=S_W;
  366. end;
  367. end;
  368. else
  369. internalerror(200303181);
  370. end;
  371. end;
  372. function is_calljmp(o:tasmop):boolean;
  373. begin
  374. case o of
  375. A_CALL,
  376. A_JCXZ,
  377. A_JECXZ,
  378. A_JMP,
  379. A_LOOP,
  380. A_LOOPE,
  381. A_LOOPNE,
  382. A_LOOPNZ,
  383. A_LOOPZ,
  384. A_Jcc :
  385. is_calljmp:=true;
  386. else
  387. is_calljmp:=false;
  388. end;
  389. end;
  390. procedure inverse_flags(var f: TResFlags);
  391. const
  392. inv_flags: array[TResFlags] of TResFlags =
  393. (F_NE,F_E,F_LE,F_GE,F_L,F_G,F_NC,F_C,
  394. F_BE,F_B,F_AE,F_A,
  395. F_NS,F_S,F_NO,F_O);
  396. begin
  397. f:=inv_flags[f];
  398. end;
  399. function flags_to_cond(const f: TResFlags) : TAsmCond;
  400. const
  401. flags_2_cond : array[TResFlags] of TAsmCond =
  402. (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,C_O,C_NO);
  403. begin
  404. result := flags_2_cond[f];
  405. end;
  406. function is_segment_reg(r:tregister):boolean;
  407. begin
  408. result:=false;
  409. case r of
  410. NR_CS,NR_DS,NR_ES,
  411. NR_SS,NR_FS,NR_GS :
  412. result:=true;
  413. end;
  414. end;
  415. function findreg_by_number(r:Tregister):tregisterindex;
  416. begin
  417. result:=findreg_by_number_table(r,regnumber_index);
  418. end;
  419. function std_regnum_search(const s:string):Tregister;
  420. begin
  421. result:=regnumber_table[findreg_by_name_table(s,std_regname_table,std_regname_index)];
  422. end;
  423. function std_regname(r:Tregister):string;
  424. var
  425. p : tregisterindex;
  426. begin
  427. p:=findreg_by_number_table(r,regnumber_index);
  428. if p<>0 then
  429. result:=std_regname_table[p]
  430. else
  431. result:=generic_regname(r);
  432. end;
  433. end.
  434. {
  435. $Log$
  436. Revision 1.42 2004-02-27 10:21:06 florian
  437. * top_symbol killed
  438. + refaddr to treference added
  439. + refsymbol to treference added
  440. * top_local stuff moved to an extra record to save memory
  441. + aint introduced
  442. * tppufile.get/putint64/aint implemented
  443. Revision 1.41 2004/02/22 18:27:21 florian
  444. * fixed exception reason size for 64 bit systems
  445. Revision 1.40 2004/02/05 18:28:37 peter
  446. * x86_64 fixes for opsize
  447. Revision 1.39 2004/02/04 22:01:13 peter
  448. * first try to get cpupara working for x86_64
  449. Revision 1.38 2004/01/30 13:42:03 florian
  450. * fixed more alignment issues
  451. Revision 1.37 2004/01/15 14:01:32 florian
  452. + x86 instruction tables for x86-64 extended
  453. Revision 1.36 2004/01/14 23:39:05 florian
  454. * another bunch of x86-64 fixes mainly calling convention and
  455. assembler reader related
  456. Revision 1.35 2004/01/12 16:37:59 peter
  457. * moved spilling code from taicpu to rg
  458. Revision 1.34 2003/12/26 13:19:16 florian
  459. * rtl and compiler compile with -Cfsse2
  460. Revision 1.33 2003/12/25 01:07:09 florian
  461. + $fputype directive support
  462. + single data type operations with sse unit
  463. * fixed more x86-64 stuff
  464. Revision 1.32 2003/12/19 22:08:44 daniel
  465. * Some work to restore the MMX capabilities
  466. Revision 1.31 2003/12/15 21:25:49 peter
  467. * reg allocations for imaginary register are now inserted just
  468. before reg allocation
  469. * tregister changed to enum to allow compile time check
  470. * fixed several tregister-tsuperregister errors
  471. Revision 1.30 2003/10/31 09:22:55 mazen
  472. * using findreg_by_<name|number>_table directly to decrease heap overheading
  473. Revision 1.29 2003/10/30 17:13:18 peter
  474. * fixed findreg_by_number
  475. * renamed rghelper to rgbase
  476. Revision 1.28 2003/10/30 15:03:18 mazen
  477. * now uses standard routines in rgHelper unit to search registers by number and by name
  478. Revision 1.27 2003/10/17 15:08:34 peter
  479. * commented out more obsolete constants
  480. Revision 1.26 2003/10/17 14:38:32 peter
  481. * 64k registers supported
  482. * fixed some memory leaks
  483. Revision 1.25 2003/10/11 16:06:42 florian
  484. * fixed some MMX<->SSE
  485. * started to fix ppc, needs an overhaul
  486. + stabs info improve for spilling, not sure if it works correctly/completly
  487. - MMX_SUPPORT removed from Makefile.fpc
  488. Revision 1.24 2003/10/09 21:31:37 daniel
  489. * Register allocator splitted, ans abstract now
  490. Revision 1.23 2003/10/03 22:00:33 peter
  491. * parameter alignment fixes
  492. Revision 1.22 2003/10/01 20:34:51 peter
  493. * procinfo unit contains tprocinfo
  494. * cginfo renamed to cgbase
  495. * moved cgmessage to verbose
  496. * fixed ppc and sparc compiles
  497. Revision 1.21 2003/09/28 21:49:39 peter
  498. * removed emitjmp
  499. Revision 1.20 2003/09/25 21:29:23 peter
  500. * remove sp_fixup
  501. Revision 1.19 2003/09/24 17:12:36 florian
  502. * x86-64 adaptions
  503. Revision 1.18 2003/09/23 17:56:06 peter
  504. * locals and paras are allocated in the code generation
  505. * tvarsym.localloc contains the location of para/local when
  506. generating code for the current procedure
  507. Revision 1.17 2003/09/07 22:09:35 peter
  508. * preparations for different default calling conventions
  509. * various RA fixes
  510. Revision 1.16 2003/09/04 21:07:03 florian
  511. * ARM compiler compiles again
  512. Revision 1.15 2003/09/03 15:55:02 peter
  513. * NEWRA branch merged
  514. Revision 1.14 2003/09/03 11:18:37 florian
  515. * fixed arm concatcopy
  516. + arm support in the common compiler sources added
  517. * moved some generic cg code around
  518. + tfputype added
  519. * ...
  520. Revision 1.13.2.8 2003/08/31 19:31:51 daniel
  521. * FIxed superregister constants
  522. Revision 1.13.2.7 2003/08/31 16:18:05 peter
  523. * more fixes
  524. Revision 1.13.2.6 2003/08/31 15:46:26 peter
  525. * more updates for tregister
  526. Revision 1.13.2.5 2003/08/31 13:50:16 daniel
  527. * Remove sorting and use pregenerated indexes
  528. * Some work on making things compile
  529. Revision 1.13.2.4 2003/08/29 17:29:00 peter
  530. * next batch of updates
  531. Revision 1.13.2.3 2003/08/28 18:35:08 peter
  532. * tregister changed to cardinal
  533. Revision 1.13.2.2 2003/08/27 21:06:34 peter
  534. * more updates
  535. Revision 1.13.2.1 2003/08/27 19:55:54 peter
  536. * first tregister patch
  537. Revision 1.13 2003/08/20 07:48:04 daniel
  538. * Made internal assembler use new register coding
  539. Revision 1.12 2003/08/17 16:59:20 jonas
  540. * fixed regvars so they work with newra (at least for ppc)
  541. * fixed some volatile register bugs
  542. + -dnotranslation option for -dnewra, which causes the registers not to
  543. be translated from virtual to normal registers. Requires support in
  544. the assembler writer as well, which is only implemented in aggas/
  545. agppcgas currently
  546. Revision 1.11 2003/07/06 21:50:33 jonas
  547. * fixed ppc compilation problems and changed VOLATILE_REGISTERS for x86
  548. so that it doesn't include ebp and esp anymore
  549. Revision 1.10 2003/06/17 16:34:45 jonas
  550. * lots of newra fixes (need getfuncretparaloc implementation for i386)!
  551. * renamed all_intregisters to volatile_intregisters and made it
  552. processor dependent
  553. Revision 1.9 2003/06/13 21:19:33 peter
  554. * current_procdef removed, use current_procinfo.procdef instead
  555. Revision 1.8 2003/06/12 19:11:34 jonas
  556. - removed ALL_INTREGISTERS (only the one in rgobj is valid)
  557. Revision 1.7 2003/06/03 21:11:09 peter
  558. * cg.a_load_* get a from and to size specifier
  559. * makeregsize only accepts newregister
  560. * i386 uses generic tcgnotnode,tcgunaryminus
  561. Revision 1.6 2003/06/03 13:01:59 daniel
  562. * Register allocator finished
  563. Revision 1.5 2003/05/30 23:57:08 peter
  564. * more sparc cleanup
  565. * accumulator removed, splitted in function_return_reg (called) and
  566. function_result_reg (caller)
  567. Revision 1.4 2003/04/30 20:53:32 florian
  568. * error when address of an abstract method is taken
  569. * fixed some x86-64 problems
  570. * merged some more x86-64 and i386 code
  571. Revision 1.3 2002/04/25 20:15:40 florian
  572. * block nodes within expressions shouldn't release the used registers,
  573. fixed using a flag till the new rg is ready
  574. Revision 1.2 2002/04/25 16:12:09 florian
  575. * fixed more problems with cpubase and x86-64
  576. Revision 1.1 2003/04/25 11:12:09 florian
  577. * merged i386/cpubase and x86_64/cpubase to x86/cpubase;
  578. different stuff went to cpubase.inc
  579. Revision 1.50 2003/04/25 08:25:26 daniel
  580. * Ifdefs around a lot of calls to cleartempgen
  581. * Fixed registers that are allocated but not freed in several nodes
  582. * Tweak to register allocator to cause less spills
  583. * 8-bit registers now interfere with esi,edi and ebp
  584. Compiler can now compile rtl successfully when using new register
  585. allocator
  586. Revision 1.49 2003/04/22 23:50:23 peter
  587. * firstpass uses expectloc
  588. * checks if there are differences between the expectloc and
  589. location.loc from secondpass in EXTDEBUG
  590. Revision 1.48 2003/04/22 14:33:38 peter
  591. * removed some notes/hints
  592. Revision 1.47 2003/04/22 10:09:35 daniel
  593. + Implemented the actual register allocator
  594. + Scratch registers unavailable when new register allocator used
  595. + maybe_save/maybe_restore unavailable when new register allocator used
  596. Revision 1.46 2003/04/21 19:16:50 peter
  597. * count address regs separate
  598. Revision 1.45 2003/03/28 19:16:57 peter
  599. * generic constructor working for i386
  600. * remove fixed self register
  601. * esi added as address register for i386
  602. Revision 1.44 2003/03/18 18:15:53 peter
  603. * changed reg2opsize to function
  604. Revision 1.43 2003/03/08 08:59:07 daniel
  605. + $define newra will enable new register allocator
  606. + getregisterint will return imaginary registers with $newra
  607. + -sr switch added, will skip register allocation so you can see
  608. the direct output of the code generator before register allocation
  609. Revision 1.42 2003/02/19 22:00:15 daniel
  610. * Code generator converted to new register notation
  611. - Horribily outdated todo.txt removed
  612. Revision 1.41 2003/02/02 19:25:54 carl
  613. * Several bugfixes for m68k target (register alloc., opcode emission)
  614. + VIS target
  615. + Generic add more complete (still not verified)
  616. Revision 1.40 2003/01/13 18:37:44 daniel
  617. * Work on register conversion
  618. Revision 1.39 2003/01/09 20:41:00 daniel
  619. * Converted some code in cgx86.pas to new register numbering
  620. Revision 1.38 2003/01/09 15:49:56 daniel
  621. * Added register conversion
  622. Revision 1.37 2003/01/08 22:32:36 daniel
  623. * Added register convesrion procedure
  624. Revision 1.36 2003/01/08 18:43:57 daniel
  625. * Tregister changed into a record
  626. Revision 1.35 2003/01/05 13:36:53 florian
  627. * x86-64 compiles
  628. + very basic support for float128 type (x86-64 only)
  629. Revision 1.34 2002/11/17 18:26:16 mazen
  630. * fixed a compilation bug accmulator-->FUNCTION_RETURN_REG, in definition of return_result_reg
  631. Revision 1.33 2002/11/17 17:49:08 mazen
  632. + 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
  633. Revision 1.32 2002/10/05 12:43:29 carl
  634. * fixes for Delphi 6 compilation
  635. (warning : Some features do not work under Delphi)
  636. Revision 1.31 2002/08/14 18:41:48 jonas
  637. - remove valuelow/valuehigh fields from tlocation, because they depend
  638. on the endianess of the host operating system -> difficult to get
  639. right. Use lo/hi(location.valueqword) instead (remember to use
  640. valueqword and not value!!)
  641. Revision 1.30 2002/08/13 21:40:58 florian
  642. * more fixes for ppc calling conventions
  643. Revision 1.29 2002/08/12 15:08:41 carl
  644. + stab register indexes for powerpc (moved from gdb to cpubase)
  645. + tprocessor enumeration moved to cpuinfo
  646. + linker in target_info is now a class
  647. * many many updates for m68k (will soon start to compile)
  648. - removed some ifdef or correct them for correct cpu
  649. Revision 1.28 2002/08/06 20:55:23 florian
  650. * first part of ppc calling conventions fix
  651. Revision 1.27 2002/07/25 18:01:29 carl
  652. + FPURESULTREG -> FPU_RESULT_REG
  653. Revision 1.26 2002/07/07 09:52:33 florian
  654. * powerpc target fixed, very simple units can be compiled
  655. * some basic stuff for better callparanode handling, far from being finished
  656. Revision 1.25 2002/07/01 18:46:30 peter
  657. * internal linker
  658. * reorganized aasm layer
  659. Revision 1.24 2002/07/01 16:23:55 peter
  660. * cg64 patch
  661. * basics for currency
  662. * asnode updates for class and interface (not finished)
  663. Revision 1.23 2002/05/18 13:34:22 peter
  664. * readded missing revisions
  665. Revision 1.22 2002/05/16 19:46:50 carl
  666. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  667. + try to fix temp allocation (still in ifdef)
  668. + generic constructor calls
  669. + start of tassembler / tmodulebase class cleanup
  670. Revision 1.19 2002/05/12 16:53:16 peter
  671. * moved entry and exitcode to ncgutil and cgobj
  672. * foreach gets extra argument for passing local data to the
  673. iterator function
  674. * -CR checks also class typecasts at runtime by changing them
  675. into as
  676. * fixed compiler to cycle with the -CR option
  677. * fixed stabs with elf writer, finally the global variables can
  678. be watched
  679. * removed a lot of routines from cga unit and replaced them by
  680. calls to cgobj
  681. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  682. u32bit then the other is typecasted also to u32bit without giving
  683. a rangecheck warning/error.
  684. * fixed pascal calling method with reversing also the high tree in
  685. the parast, detected by tcalcst3 test
  686. Revision 1.18 2002/04/21 15:31:40 carl
  687. - removed some other stuff to their units
  688. Revision 1.17 2002/04/20 21:37:07 carl
  689. + generic FPC_CHECKPOINTER
  690. + first parameter offset in stack now portable
  691. * rename some constants
  692. + move some cpu stuff to other units
  693. - remove unused constents
  694. * fix stacksize for some targets
  695. * fix generic size problems which depend now on EXTEND_SIZE constant
  696. * removing frame pointer in routines is only available for : i386,m68k and vis targets
  697. Revision 1.16 2002/04/15 19:53:54 peter
  698. * fixed conflicts between the last 2 commits
  699. Revision 1.15 2002/04/15 19:44:20 peter
  700. * fixed stackcheck that would be called recursively when a stack
  701. error was found
  702. * generic changeregsize(reg,size) for i386 register resizing
  703. * removed some more routines from cga unit
  704. * fixed returnvalue handling
  705. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  706. Revision 1.14 2002/04/15 19:12:09 carl
  707. + target_info.size_of_pointer -> pointer_size
  708. + some cleanup of unused types/variables
  709. * move several constants from cpubase to their specific units
  710. (where they are used)
  711. + att_Reg2str -> gas_reg2str
  712. + int_reg2str -> std_reg2str
  713. Revision 1.13 2002/04/14 16:59:41 carl
  714. + att_reg2str -> gas_reg2str
  715. Revision 1.12 2002/04/02 17:11:34 peter
  716. * tlocation,treference update
  717. * LOC_CONSTANT added for better constant handling
  718. * secondadd splitted in multiple routines
  719. * location_force_reg added for loading a location to a register
  720. of a specified size
  721. * secondassignment parses now first the right and then the left node
  722. (this is compatible with Kylix). This saves a lot of push/pop especially
  723. with string operations
  724. * adapted some routines to use the new cg methods
  725. Revision 1.11 2002/03/31 20:26:37 jonas
  726. + a_loadfpu_* and a_loadmm_* methods in tcg
  727. * register allocation is now handled by a class and is mostly processor
  728. independent (+rgobj.pas and i386/rgcpu.pas)
  729. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  730. * some small improvements and fixes to the optimizer
  731. * some register allocation fixes
  732. * some fpuvaroffset fixes in the unary minus node
  733. * push/popusedregisters is now called rg.save/restoreusedregisters and
  734. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  735. also better optimizable)
  736. * fixed and optimized register saving/restoring for new/dispose nodes
  737. * LOC_FPU locations now also require their "register" field to be set to
  738. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  739. - list field removed of the tnode class because it's not used currently
  740. and can cause hard-to-find bugs
  741. Revision 1.10 2002/03/04 19:10:12 peter
  742. * removed compiler warnings
  743. }