cpubase.pas 30 KB

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