cpubase.pas 30 KB

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