ncgbas.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. {
  2. $Id$
  3. Copyright (c) 2000-2002 by Florian Klaempfl
  4. This unit implements some basic nodes
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit ncgbas;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. cpubase,
  23. node,nbas;
  24. type
  25. tcgnothingnode = class(tnothingnode)
  26. procedure pass_2;override;
  27. end;
  28. tcgasmnode = class(tasmnode)
  29. procedure pass_2;override;
  30. end;
  31. tcgstatementnode = class(tstatementnode)
  32. procedure pass_2;override;
  33. end;
  34. tcgblocknode = class(tblocknode)
  35. procedure pass_2;override;
  36. end;
  37. tcgtempcreatenode = class(ttempcreatenode)
  38. procedure pass_2;override;
  39. end;
  40. tcgtemprefnode = class(ttemprefnode)
  41. procedure pass_2;override;
  42. { Changes the location of this temp to ref. Useful when assigning }
  43. { another temp to this one. The current location will be freed. }
  44. { Can only be called in pass 2 (since earlier, the temp location }
  45. { isn't known yet) }
  46. procedure changelocation(const ref: treference);
  47. end;
  48. tcgtempdeletenode = class(ttempdeletenode)
  49. procedure pass_2;override;
  50. end;
  51. implementation
  52. uses
  53. globtype,systems,
  54. cutils,verbose,cpuinfo,
  55. aasmbase,aasmtai,aasmcpu,symsym,
  56. defutil,
  57. nflw,pass_2,
  58. cgbase,
  59. cgutils,cgobj,
  60. procinfo,
  61. tgobj
  62. ;
  63. {*****************************************************************************
  64. TNOTHING
  65. *****************************************************************************}
  66. procedure tcgnothingnode.pass_2;
  67. begin
  68. location_reset(location,LOC_VOID,OS_NO);
  69. { avoid an abstract rte }
  70. end;
  71. {*****************************************************************************
  72. TSTATEMENTNODE
  73. *****************************************************************************}
  74. procedure tcgstatementnode.pass_2;
  75. var
  76. hp : tstatementnode;
  77. begin
  78. location_reset(location,LOC_VOID,OS_NO);
  79. hp:=self;
  80. while assigned(hp) do
  81. begin
  82. if assigned(hp.left) then
  83. begin
  84. secondpass(hp.left);
  85. { Compiler inserted blocks can return values }
  86. location_copy(hp.location,hp.left.location);
  87. end;
  88. hp:=tstatementnode(hp.right);
  89. end;
  90. end;
  91. {*****************************************************************************
  92. TASMNODE
  93. *****************************************************************************}
  94. procedure tcgasmnode.pass_2;
  95. procedure ReLabel(var p:tasmsymbol);
  96. begin
  97. { Only relabel local tasmlabels }
  98. if (p.defbind = AB_LOCAL) and
  99. (p is tasmlabel) then
  100. begin
  101. if not assigned(p.altsymbol) then
  102. objectlibrary.GenerateAltSymbol(p);
  103. p:=p.altsymbol;
  104. p.increfs;
  105. end;
  106. end;
  107. procedure ResolveRef(var op:toper);
  108. var
  109. sym : tvarsym;
  110. {$ifdef x86}
  111. scale : byte;
  112. {$endif x86}
  113. getoffset : boolean;
  114. indexreg : tregister;
  115. sofs : longint;
  116. begin
  117. if (op.typ=top_local) then
  118. begin
  119. sofs:=op.localoper^.localsymofs;
  120. indexreg:=op.localoper^.localindexreg;
  121. {$ifdef x86}
  122. scale:=op.localoper^.localscale;
  123. {$endif x86}
  124. getoffset:=op.localoper^.localgetoffset;
  125. sym:=tvarsym(pointer(op.localoper^.localsym));
  126. case sym.localloc.loc of
  127. LOC_REFERENCE :
  128. begin
  129. if getoffset then
  130. begin
  131. if indexreg=NR_NO then
  132. begin
  133. op.typ:=top_const;
  134. op.val:=aword(sym.localloc.reference.offset+sofs);
  135. end
  136. else
  137. begin
  138. op.typ:=top_ref;
  139. new(op.ref);
  140. reference_reset_base(op.ref^,indexreg,
  141. sym.localloc.reference.offset+sofs);
  142. end;
  143. end
  144. else
  145. begin
  146. op.typ:=top_ref;
  147. new(op.ref);
  148. reference_reset_base(op.ref^,sym.localloc.reference.index,
  149. sym.localloc.reference.offset+sofs);
  150. op.ref^.index:=indexreg;
  151. {$ifdef x86}
  152. op.ref^.scalefactor:=scale;
  153. {$endif x86}
  154. end;
  155. end;
  156. LOC_REGISTER :
  157. begin
  158. if getoffset then
  159. Message(asmr_e_invalid_reference_syntax);
  160. { Subscribed access }
  161. if sofs<>0 then
  162. begin
  163. op.typ:=top_ref;
  164. new(op.ref);
  165. reference_reset_base(op.ref^,sym.localloc.register,sofs);
  166. end
  167. else
  168. begin
  169. op.typ:=top_reg;
  170. op.reg:=sym.localloc.register;
  171. end;
  172. end;
  173. end;
  174. end;
  175. end;
  176. var
  177. hp,hp2 : tai;
  178. i : longint;
  179. skipnode : boolean;
  180. begin
  181. location_reset(location,LOC_VOID,OS_NO);
  182. if getposition then
  183. begin
  184. { Add a marker, to be sure the list is not empty }
  185. exprasmlist.concat(tai_marker.create(marker_position));
  186. currenttai:=tai(exprasmlist.last);
  187. exit;
  188. end;
  189. { Allocate registers used in the assembler block }
  190. cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,used_regs_int);
  191. if (current_procinfo.procdef.proccalloption=pocall_inline) then
  192. begin
  193. objectlibrary.CreateUsedAsmSymbolList;
  194. hp:=tai(p_asm.first);
  195. while assigned(hp) do
  196. begin
  197. hp2:=tai(hp.getcopy);
  198. skipnode:=false;
  199. case hp2.typ of
  200. ait_label :
  201. ReLabel(tasmsymbol(tai_label(hp2).l));
  202. ait_const_rva,
  203. ait_const_symbol :
  204. ReLabel(tai_const_symbol(hp2).sym);
  205. ait_instruction :
  206. begin
  207. { remove cached insentry, because the new code can
  208. require an other less optimized instruction }
  209. {$ifdef i386}
  210. {$ifndef NOAG386BIN}
  211. taicpu(hp2).ResetPass1;
  212. {$endif}
  213. {$endif}
  214. { fixup the references }
  215. for i:=1 to taicpu(hp2).ops do
  216. begin
  217. ResolveRef(taicpu(hp2).oper[i-1]^);
  218. with taicpu(hp2).oper[i-1]^ do
  219. begin
  220. case typ of
  221. top_ref :
  222. begin
  223. if assigned(ref^.symbol) then
  224. ReLabel(ref^.symbol);
  225. if assigned(ref^.relsymbol) then
  226. ReLabel(ref^.relsymbol);
  227. end;
  228. end;
  229. end;
  230. end;
  231. end;
  232. ait_marker :
  233. begin
  234. { it's not an assembler block anymore }
  235. if (tai_marker(hp2).kind in [AsmBlockStart, AsmBlockEnd]) then
  236. skipnode:=true;
  237. end;
  238. end;
  239. if not skipnode then
  240. exprasmList.concat(hp2)
  241. else
  242. hp2.free;
  243. hp:=tai(hp.next);
  244. end;
  245. { restore used symbols }
  246. objectlibrary.UsedAsmSymbolListResetAltSym;
  247. objectlibrary.DestroyUsedAsmSymbolList;
  248. end
  249. else
  250. begin
  251. hp:=tai(p_asm.first);
  252. while assigned(hp) do
  253. begin
  254. case hp.typ of
  255. ait_instruction :
  256. begin
  257. { remove cached insentry, because the new code can
  258. require an other less optimized instruction }
  259. {$ifdef i386}
  260. {$ifndef NOAG386BIN}
  261. taicpu(hp).ResetPass1;
  262. {$endif}
  263. {$endif}
  264. { fixup the references }
  265. for i:=1 to taicpu(hp).ops do
  266. ResolveRef(taicpu(hp).oper[i-1]^);
  267. end;
  268. end;
  269. hp:=tai(hp.next);
  270. end;
  271. { insert the list }
  272. exprasmList.concatlist(p_asm);
  273. end;
  274. { Release register used in the assembler block }
  275. cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,used_regs_int);
  276. end;
  277. {*****************************************************************************
  278. TBLOCKNODE
  279. *****************************************************************************}
  280. procedure tcgblocknode.pass_2;
  281. var
  282. hp : tstatementnode;
  283. begin
  284. location_reset(location,LOC_VOID,OS_NO);
  285. { do second pass on left node }
  286. if assigned(left) then
  287. begin
  288. hp:=tstatementnode(left);
  289. while assigned(hp) do
  290. begin
  291. if assigned(hp.left) then
  292. begin
  293. secondpass(hp.left);
  294. location_copy(hp.location,hp.left.location);
  295. end;
  296. location_copy(location,hp.location);
  297. hp:=tstatementnode(hp.right);
  298. end;
  299. end;
  300. end;
  301. {*****************************************************************************
  302. TTEMPCREATENODE
  303. *****************************************************************************}
  304. procedure tcgtempcreatenode.pass_2;
  305. var
  306. cgsize: tcgsize;
  307. begin
  308. location_reset(location,LOC_VOID,OS_NO);
  309. { if we're secondpassing the same tcgtempcreatenode twice, we have a bug }
  310. if tempinfo^.valid then
  311. internalerror(200108222);
  312. { get a (persistent) temp }
  313. if tempinfo^.restype.def.needs_inittable then
  314. begin
  315. tg.GetTempTyped(exprasmlist,tempinfo^.restype.def,tempinfo^.temptype,tempinfo^.loc.ref);
  316. tempinfo^.loc.loc := LOC_REFERENCE;
  317. end
  318. else if may_be_in_reg then
  319. begin
  320. cgsize := def_cgsize(tempinfo^.restype.def);
  321. if (TCGSize2Size[cgsize]>TCGSize2Size[OS_INT]) then
  322. internalerror(2004020202);
  323. tempinfo^.loc.reg := cg.getintregister(exprasmlist,cgsize);
  324. if (tempinfo^.temptype = tt_persistent) then
  325. begin
  326. { !!tell rgobj this register is now a regvar, so it can't be freed!! }
  327. tempinfo^.loc.loc := LOC_CREGISTER
  328. end
  329. else
  330. tempinfo^.loc.loc := LOC_REGISTER;
  331. end
  332. else
  333. begin
  334. tg.GetTemp(exprasmlist,size,tempinfo^.temptype,tempinfo^.loc.ref);
  335. tempinfo^.loc.loc := LOC_REFERENCE;
  336. end;
  337. tempinfo^.valid := true;
  338. end;
  339. {*****************************************************************************
  340. TTEMPREFNODE
  341. *****************************************************************************}
  342. procedure tcgtemprefnode.pass_2;
  343. begin
  344. { check if the temp is valid }
  345. if not tempinfo^.valid then
  346. internalerror(200108231);
  347. case tempinfo^.loc.loc of
  348. LOC_REFERENCE:
  349. begin
  350. { set the temp's location }
  351. location_reset(location,LOC_REFERENCE,def_cgsize(tempinfo^.restype.def));
  352. location.reference := tempinfo^.loc.ref;
  353. inc(location.reference.offset,offset);
  354. end;
  355. LOC_REGISTER,
  356. LOC_CREGISTER:
  357. begin
  358. if offset <> 0 then
  359. internalerror(2004020205);
  360. { LOC_CREGISTER, not LOC_REGISTER, otherwise we can't assign anything to it }
  361. location_reset(location,tempinfo^.loc.loc,def_cgsize(tempinfo^.restype.def));
  362. location.register := tempinfo^.loc.reg;
  363. end;
  364. else
  365. internalerror(2004020204);
  366. end;
  367. end;
  368. procedure tcgtemprefnode.changelocation(const ref: treference);
  369. begin
  370. { check if the temp is valid }
  371. if not tempinfo^.valid then
  372. internalerror(200306081);
  373. if (tempinfo^.loc.loc = LOC_REGISTER) then
  374. internalerror(2004020203);
  375. if (tempinfo^.temptype = tt_persistent) then
  376. tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tt_normal);
  377. tg.ungettemp(exprasmlist,tempinfo^.loc.ref);
  378. tempinfo^.loc.ref := ref;
  379. tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tempinfo^.temptype);
  380. { adapt location }
  381. location.reference := ref;
  382. inc(location.reference.offset,offset);
  383. end;
  384. {*****************************************************************************
  385. TTEMPDELETENODE
  386. *****************************************************************************}
  387. procedure tcgtempdeletenode.pass_2;
  388. begin
  389. location_reset(location,LOC_VOID,OS_NO);
  390. case tempinfo^.loc.loc of
  391. LOC_REFERENCE:
  392. begin
  393. if release_to_normal then
  394. tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tt_normal)
  395. else
  396. tg.UnGetTemp(exprasmlist,tempinfo^.loc.ref);
  397. end;
  398. LOC_CREGISTER,
  399. LOC_REGISTER:
  400. begin
  401. { make sure the register allocator doesn't reuse the }
  402. { register e.g. in the middle of a loop }
  403. cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,tempinfo^.loc.reg,
  404. tempinfo^.loc.reg);
  405. if release_to_normal then
  406. tempinfo^.loc.loc := LOC_REGISTER
  407. else
  408. { !!tell rgobj this register is no longer a regvar!! }
  409. cg.ungetregister(exprasmlist,tempinfo^.loc.reg);
  410. end;
  411. end;
  412. end;
  413. begin
  414. cnothingnode:=tcgnothingnode;
  415. casmnode:=tcgasmnode;
  416. cstatementnode:=tcgstatementnode;
  417. cblocknode:=tcgblocknode;
  418. ctempcreatenode:=tcgtempcreatenode;
  419. ctemprefnode:=tcgtemprefnode;
  420. ctempdeletenode:=tcgtempdeletenode;
  421. end.
  422. {
  423. $Log$
  424. Revision 1.57 2004-02-27 19:30:23 jonas
  425. * fixed relsymbol copy/paste bug
  426. Revision 1.56 2004/02/27 10:21:05 florian
  427. * top_symbol killed
  428. + refaddr to treference added
  429. + refsymbol to treference added
  430. * top_local stuff moved to an extra record to save memory
  431. + aint introduced
  432. * tppufile.get/putint64/aint implemented
  433. Revision 1.55 2004/02/04 18:45:29 jonas
  434. + some more usage of register temps
  435. Revision 1.54 2004/02/03 19:48:06 jonas
  436. * fixed and re-enabled temps in registers
  437. Revision 1.53 2004/02/03 17:55:50 jonas
  438. * cleanup
  439. Revision 1.52 2004/02/03 16:46:51 jonas
  440. + support to store ttempcreate/ref/deletenodes in registers
  441. * put temps for withnodes and some newnodes in registers
  442. Note: this currently only works because calling ungetregister()
  443. multiple times for the same register doesn't matter. We need again
  444. a way to specify that a register is currently a regvar and as such
  445. should not be freed when you call ungetregister() on it.
  446. Revision 1.51 2003/11/07 15:58:32 florian
  447. * Florian's culmutative nr. 1; contains:
  448. - invalid calling conventions for a certain cpu are rejected
  449. - arm softfloat calling conventions
  450. - -Sp for cpu dependend code generation
  451. - several arm fixes
  452. - remaining code for value open array paras on heap
  453. Revision 1.50 2003/11/04 15:35:13 peter
  454. * fix for referencecounted temps
  455. Revision 1.49 2003/11/02 13:30:05 jonas
  456. * fixed ppc compilation
  457. Revision 1.48 2003/10/30 19:59:00 peter
  458. * support scalefactor for opr_local
  459. * support reference with opr_local set, fixes tw2631
  460. Revision 1.47 2003/10/29 15:40:20 peter
  461. * support indexing and offset retrieval for locals
  462. Revision 1.46 2003/10/24 17:39:41 peter
  463. * asmnode.get_position now inserts a marker
  464. Revision 1.45 2003/10/21 15:15:36 peter
  465. * taicpu_abstract.oper[] changed to pointers
  466. Revision 1.44 2003/10/10 17:48:13 peter
  467. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  468. * tregisteralloctor renamed to trgobj
  469. * removed rgobj from a lot of units
  470. * moved location_* and reference_* to cgobj
  471. * first things for mmx register allocation
  472. Revision 1.43 2003/10/09 21:31:37 daniel
  473. * Register allocator splitted, ans abstract now
  474. Revision 1.42 2003/10/07 18:18:16 peter
  475. * fix register calling for assembler procedures
  476. * fix result loading for assembler procedures
  477. Revision 1.41 2003/10/01 20:34:48 peter
  478. * procinfo unit contains tprocinfo
  479. * cginfo renamed to cgbase
  480. * moved cgmessage to verbose
  481. * fixed ppc and sparc compiles
  482. Revision 1.40 2003/09/23 17:56:05 peter
  483. * locals and paras are allocated in the code generation
  484. * tvarsym.localloc contains the location of para/local when
  485. generating code for the current procedure
  486. Revision 1.39 2003/09/07 22:09:35 peter
  487. * preparations for different default calling conventions
  488. * various RA fixes
  489. Revision 1.38 2003/09/03 15:55:00 peter
  490. * NEWRA branch merged
  491. Revision 1.37.2.1 2003/08/27 20:23:55 peter
  492. * remove old ra code
  493. Revision 1.37 2003/06/13 21:19:30 peter
  494. * current_procdef removed, use current_procinfo.procdef instead
  495. Revision 1.36 2003/06/09 18:26:46 peter
  496. * remove temptype, use tempinfo.temptype instead
  497. Revision 1.35 2003/06/09 12:20:47 peter
  498. * getposition added to retrieve the the current tai item
  499. Revision 1.34 2003/05/17 13:30:08 jonas
  500. * changed tt_persistant to tt_persistent :)
  501. * tempcreatenode now doesn't accept a boolean anymore for persistent
  502. temps, but a ttemptype, so you can also create ansistring temps etc
  503. Revision 1.33 2003/04/27 11:21:33 peter
  504. * aktprocdef renamed to current_procinfo.procdef
  505. * procinfo renamed to current_procinfo
  506. * procinfo will now be stored in current_module so it can be
  507. cleaned up properly
  508. * gen_main_procsym changed to create_main_proc and release_main_proc
  509. to also generate a tprocinfo structure
  510. * fixed unit implicit initfinal
  511. Revision 1.32 2002/04/25 20:15:39 florian
  512. * block nodes within expressions shouldn't release the used registers,
  513. fixed using a flag till the new rg is ready
  514. Revision 1.31 2003/04/22 23:50:22 peter
  515. * firstpass uses expectloc
  516. * checks if there are differences between the expectloc and
  517. location.loc from secondpass in EXTDEBUG
  518. Revision 1.30 2003/04/17 07:50:24 daniel
  519. * Some work on interference graph construction
  520. Revision 1.29 2003/03/28 19:16:56 peter
  521. * generic constructor working for i386
  522. * remove fixed self register
  523. * esi added as address register for i386
  524. Revision 1.28 2002/11/27 15:33:19 peter
  525. * fixed relabeling to relabel only tasmlabel (formerly proclocal)
  526. Revision 1.27 2002/11/27 02:37:13 peter
  527. * case statement inlining added
  528. * fixed inlining of write()
  529. * switched statementnode left and right parts so the statements are
  530. processed in the correct order when getcopy is used. This is
  531. required for tempnodes
  532. Revision 1.26 2002/11/17 16:31:56 carl
  533. * memory optimization (3-4%) : cleanup of tai fields,
  534. cleanup of tdef and tsym fields.
  535. * make it work for m68k
  536. Revision 1.25 2002/11/15 16:29:30 peter
  537. * made tasmsymbol.refs private (merged)
  538. Revision 1.24 2002/11/15 01:58:51 peter
  539. * merged changes from 1.0.7 up to 04-11
  540. - -V option for generating bug report tracing
  541. - more tracing for option parsing
  542. - errors for cdecl and high()
  543. - win32 import stabs
  544. - win32 records<=8 are returned in eax:edx (turned off by default)
  545. - heaptrc update
  546. - more info for temp management in .s file with EXTDEBUG
  547. Revision 1.23 2002/08/23 16:14:48 peter
  548. * tempgen cleanup
  549. * tt_noreuse temp type added that will be used in genentrycode
  550. Revision 1.22 2002/08/11 14:32:26 peter
  551. * renamed current_library to objectlibrary
  552. Revision 1.21 2002/08/11 13:24:11 peter
  553. * saving of asmsymbols in ppu supported
  554. * asmsymbollist global is removed and moved into a new class
  555. tasmlibrarydata that will hold the info of a .a file which
  556. corresponds with a single module. Added librarydata to tmodule
  557. to keep the library info stored for the module. In the future the
  558. objectfiles will also be stored to the tasmlibrarydata class
  559. * all getlabel/newasmsymbol and friends are moved to the new class
  560. Revision 1.20 2002/07/01 18:46:22 peter
  561. * internal linker
  562. * reorganized aasm layer
  563. Revision 1.19 2002/05/18 13:34:09 peter
  564. * readded missing revisions
  565. Revision 1.18 2002/05/16 19:46:37 carl
  566. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  567. + try to fix temp allocation (still in ifdef)
  568. + generic constructor calls
  569. + start of tassembler / tmodulebase class cleanup
  570. Revision 1.16 2002/05/13 19:54:37 peter
  571. * removed n386ld and n386util units
  572. * maybe_save/maybe_restore added instead of the old maybe_push
  573. Revision 1.15 2002/05/12 16:53:07 peter
  574. * moved entry and exitcode to ncgutil and cgobj
  575. * foreach gets extra argument for passing local data to the
  576. iterator function
  577. * -CR checks also class typecasts at runtime by changing them
  578. into as
  579. * fixed compiler to cycle with the -CR option
  580. * fixed stabs with elf writer, finally the global variables can
  581. be watched
  582. * removed a lot of routines from cga unit and replaced them by
  583. calls to cgobj
  584. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  585. u32bit then the other is typecasted also to u32bit without giving
  586. a rangecheck warning/error.
  587. * fixed pascal calling method with reversing also the high tree in
  588. the parast, detected by tcalcst3 test
  589. Revision 1.14 2002/04/23 19:16:34 peter
  590. * add pinline unit that inserts compiler supported functions using
  591. one or more statements
  592. * moved finalize and setlength from ninl to pinline
  593. Revision 1.13 2002/04/21 19:02:03 peter
  594. * removed newn and disposen nodes, the code is now directly
  595. inlined from pexpr
  596. * -an option that will write the secondpass nodes to the .s file, this
  597. requires EXTDEBUG define to actually write the info
  598. * fixed various internal errors and crashes due recent code changes
  599. Revision 1.12 2002/04/04 19:05:57 peter
  600. * removed unused units
  601. * use tlocation.size in cg.a_*loc*() routines
  602. Revision 1.11 2002/03/31 20:26:34 jonas
  603. + a_loadfpu_* and a_loadmm_* methods in tcg
  604. * register allocation is now handled by a class and is mostly processor
  605. independent (+rgobj.pas and i386/rgcpu.pas)
  606. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  607. * some small improvements and fixes to the optimizer
  608. * some register allocation fixes
  609. * some fpuvaroffset fixes in the unary minus node
  610. * push/popusedregisters is now called rg.save/restoreusedregisters and
  611. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  612. also better optimizable)
  613. * fixed and optimized register saving/restoring for new/dispose nodes
  614. * LOC_FPU locations now also require their "register" field to be set to
  615. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  616. - list field removed of the tnode class because it's not used currently
  617. and can cause hard-to-find bugs
  618. }