ncgbas.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  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_indirect_symbol,
  203. ait_const_rva,
  204. ait_const_symbol :
  205. ReLabel(tai_const_symbol(hp2).sym);
  206. ait_instruction :
  207. begin
  208. { remove cached insentry, because the new code can
  209. require an other less optimized instruction }
  210. {$ifdef i386}
  211. {$ifndef NOAG386BIN}
  212. taicpu(hp2).ResetPass1;
  213. {$endif}
  214. {$endif}
  215. { fixup the references }
  216. for i:=1 to taicpu(hp2).ops do
  217. begin
  218. ResolveRef(taicpu(hp2).oper[i-1]^);
  219. with taicpu(hp2).oper[i-1]^ do
  220. begin
  221. case typ of
  222. top_ref :
  223. begin
  224. if assigned(ref^.symbol) then
  225. ReLabel(ref^.symbol);
  226. if assigned(ref^.relsymbol) then
  227. ReLabel(ref^.relsymbol);
  228. end;
  229. end;
  230. end;
  231. end;
  232. end;
  233. ait_marker :
  234. begin
  235. { it's not an assembler block anymore }
  236. if (tai_marker(hp2).kind in [AsmBlockStart, AsmBlockEnd]) then
  237. skipnode:=true;
  238. end;
  239. end;
  240. if not skipnode then
  241. exprasmList.concat(hp2)
  242. else
  243. hp2.free;
  244. hp:=tai(hp.next);
  245. end;
  246. { restore used symbols }
  247. objectlibrary.UsedAsmSymbolListResetAltSym;
  248. objectlibrary.DestroyUsedAsmSymbolList;
  249. end
  250. else
  251. begin
  252. hp:=tai(p_asm.first);
  253. while assigned(hp) do
  254. begin
  255. case hp.typ of
  256. ait_instruction :
  257. begin
  258. { remove cached insentry, because the new code can
  259. require an other less optimized instruction }
  260. {$ifdef i386}
  261. {$ifndef NOAG386BIN}
  262. taicpu(hp).ResetPass1;
  263. {$endif}
  264. {$endif}
  265. { fixup the references }
  266. for i:=1 to taicpu(hp).ops do
  267. ResolveRef(taicpu(hp).oper[i-1]^);
  268. end;
  269. end;
  270. hp:=tai(hp.next);
  271. end;
  272. { insert the list }
  273. exprasmList.concatlist(p_asm);
  274. end;
  275. { Release register used in the assembler block }
  276. cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,used_regs_int);
  277. end;
  278. {*****************************************************************************
  279. TBLOCKNODE
  280. *****************************************************************************}
  281. procedure tcgblocknode.pass_2;
  282. var
  283. hp : tstatementnode;
  284. begin
  285. location_reset(location,LOC_VOID,OS_NO);
  286. { do second pass on left node }
  287. if assigned(left) then
  288. begin
  289. hp:=tstatementnode(left);
  290. while assigned(hp) do
  291. begin
  292. if assigned(hp.left) then
  293. begin
  294. secondpass(hp.left);
  295. location_copy(hp.location,hp.left.location);
  296. end;
  297. location_copy(location,hp.location);
  298. hp:=tstatementnode(hp.right);
  299. end;
  300. end;
  301. end;
  302. {*****************************************************************************
  303. TTEMPCREATENODE
  304. *****************************************************************************}
  305. procedure tcgtempcreatenode.pass_2;
  306. var
  307. cgsize: tcgsize;
  308. begin
  309. location_reset(location,LOC_VOID,OS_NO);
  310. { if we're secondpassing the same tcgtempcreatenode twice, we have a bug }
  311. if tempinfo^.valid then
  312. internalerror(200108222);
  313. { get a (persistent) temp }
  314. if tempinfo^.restype.def.needs_inittable then
  315. begin
  316. tg.GetTempTyped(exprasmlist,tempinfo^.restype.def,tempinfo^.temptype,tempinfo^.loc.ref);
  317. tempinfo^.loc.loc := LOC_REFERENCE;
  318. end
  319. else if tempinfo^.may_be_in_reg then
  320. begin
  321. cgsize := def_cgsize(tempinfo^.restype.def);
  322. if (TCGSize2Size[cgsize]>TCGSize2Size[OS_INT]) then
  323. internalerror(2004020202);
  324. tempinfo^.loc.reg := cg.getintregister(exprasmlist,cgsize);
  325. if (tempinfo^.temptype = tt_persistent) then
  326. begin
  327. { !!tell rgobj this register is now a regvar, so it can't be freed!! }
  328. tempinfo^.loc.loc := LOC_CREGISTER
  329. end
  330. else
  331. tempinfo^.loc.loc := LOC_REGISTER;
  332. end
  333. else
  334. begin
  335. tg.GetTemp(exprasmlist,size,tempinfo^.temptype,tempinfo^.loc.ref);
  336. tempinfo^.loc.loc := LOC_REFERENCE;
  337. end;
  338. tempinfo^.valid := true;
  339. end;
  340. {*****************************************************************************
  341. TTEMPREFNODE
  342. *****************************************************************************}
  343. procedure tcgtemprefnode.pass_2;
  344. begin
  345. { check if the temp is valid }
  346. if not tempinfo^.valid then
  347. internalerror(200108231);
  348. case tempinfo^.loc.loc of
  349. LOC_REFERENCE:
  350. begin
  351. { set the temp's location }
  352. location_reset(location,LOC_REFERENCE,def_cgsize(tempinfo^.restype.def));
  353. location.reference := tempinfo^.loc.ref;
  354. inc(location.reference.offset,offset);
  355. end;
  356. LOC_REGISTER,
  357. LOC_CREGISTER:
  358. begin
  359. if offset <> 0 then
  360. internalerror(2004020205);
  361. { LOC_CREGISTER, not LOC_REGISTER, otherwise we can't assign anything to it }
  362. location_reset(location,tempinfo^.loc.loc,def_cgsize(tempinfo^.restype.def));
  363. location.register := tempinfo^.loc.reg;
  364. end;
  365. else
  366. internalerror(2004020204);
  367. end;
  368. end;
  369. procedure tcgtemprefnode.changelocation(const ref: treference);
  370. begin
  371. { check if the temp is valid }
  372. if not tempinfo^.valid then
  373. internalerror(200306081);
  374. if (tempinfo^.loc.loc = LOC_REGISTER) then
  375. internalerror(2004020203);
  376. if (tempinfo^.temptype = tt_persistent) then
  377. tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tt_normal);
  378. tg.ungettemp(exprasmlist,tempinfo^.loc.ref);
  379. tempinfo^.loc.ref := ref;
  380. tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tempinfo^.temptype);
  381. { adapt location }
  382. location.reference := ref;
  383. inc(location.reference.offset,offset);
  384. end;
  385. {*****************************************************************************
  386. TTEMPDELETENODE
  387. *****************************************************************************}
  388. procedure tcgtempdeletenode.pass_2;
  389. begin
  390. location_reset(location,LOC_VOID,OS_NO);
  391. case tempinfo^.loc.loc of
  392. LOC_REFERENCE:
  393. begin
  394. if release_to_normal then
  395. tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tt_normal)
  396. else
  397. tg.UnGetTemp(exprasmlist,tempinfo^.loc.ref);
  398. end;
  399. LOC_CREGISTER,
  400. LOC_REGISTER:
  401. begin
  402. { make sure the register allocator doesn't reuse the }
  403. { register e.g. in the middle of a loop }
  404. cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,tempinfo^.loc.reg,
  405. tempinfo^.loc.reg);
  406. if release_to_normal then
  407. tempinfo^.loc.loc := LOC_REGISTER
  408. else
  409. { !!tell rgobj this register is no longer a regvar!! }
  410. cg.ungetregister(exprasmlist,tempinfo^.loc.reg);
  411. end;
  412. end;
  413. end;
  414. begin
  415. cnothingnode:=tcgnothingnode;
  416. casmnode:=tcgasmnode;
  417. cstatementnode:=tcgstatementnode;
  418. cblocknode:=tcgblocknode;
  419. ctempcreatenode:=tcgtempcreatenode;
  420. ctemprefnode:=tcgtemprefnode;
  421. ctempdeletenode:=tcgtempdeletenode;
  422. end.
  423. {
  424. $Log$
  425. Revision 1.59 2004-03-10 20:41:17 peter
  426. * maybe_in_reg moved to tempinfo
  427. * fixed expectloc for maybe_in_reg
  428. Revision 1.58 2004/03/02 17:32:12 florian
  429. * make cycle fixed
  430. + pic support for darwin
  431. + support of importing vars from shared libs on darwin implemented
  432. Revision 1.57 2004/02/27 19:30:23 jonas
  433. * fixed relsymbol copy/paste bug
  434. Revision 1.56 2004/02/27 10:21:05 florian
  435. * top_symbol killed
  436. + refaddr to treference added
  437. + refsymbol to treference added
  438. * top_local stuff moved to an extra record to save memory
  439. + aint introduced
  440. * tppufile.get/putint64/aint implemented
  441. Revision 1.55 2004/02/04 18:45:29 jonas
  442. + some more usage of register temps
  443. Revision 1.54 2004/02/03 19:48:06 jonas
  444. * fixed and re-enabled temps in registers
  445. Revision 1.53 2004/02/03 17:55:50 jonas
  446. * cleanup
  447. Revision 1.52 2004/02/03 16:46:51 jonas
  448. + support to store ttempcreate/ref/deletenodes in registers
  449. * put temps for withnodes and some newnodes in registers
  450. Note: this currently only works because calling ungetregister()
  451. multiple times for the same register doesn't matter. We need again
  452. a way to specify that a register is currently a regvar and as such
  453. should not be freed when you call ungetregister() on it.
  454. Revision 1.51 2003/11/07 15:58:32 florian
  455. * Florian's culmutative nr. 1; contains:
  456. - invalid calling conventions for a certain cpu are rejected
  457. - arm softfloat calling conventions
  458. - -Sp for cpu dependend code generation
  459. - several arm fixes
  460. - remaining code for value open array paras on heap
  461. Revision 1.50 2003/11/04 15:35:13 peter
  462. * fix for referencecounted temps
  463. Revision 1.49 2003/11/02 13:30:05 jonas
  464. * fixed ppc compilation
  465. Revision 1.48 2003/10/30 19:59:00 peter
  466. * support scalefactor for opr_local
  467. * support reference with opr_local set, fixes tw2631
  468. Revision 1.47 2003/10/29 15:40:20 peter
  469. * support indexing and offset retrieval for locals
  470. Revision 1.46 2003/10/24 17:39:41 peter
  471. * asmnode.get_position now inserts a marker
  472. Revision 1.45 2003/10/21 15:15:36 peter
  473. * taicpu_abstract.oper[] changed to pointers
  474. Revision 1.44 2003/10/10 17:48:13 peter
  475. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  476. * tregisteralloctor renamed to trgobj
  477. * removed rgobj from a lot of units
  478. * moved location_* and reference_* to cgobj
  479. * first things for mmx register allocation
  480. Revision 1.43 2003/10/09 21:31:37 daniel
  481. * Register allocator splitted, ans abstract now
  482. Revision 1.42 2003/10/07 18:18:16 peter
  483. * fix register calling for assembler procedures
  484. * fix result loading for assembler procedures
  485. Revision 1.41 2003/10/01 20:34:48 peter
  486. * procinfo unit contains tprocinfo
  487. * cginfo renamed to cgbase
  488. * moved cgmessage to verbose
  489. * fixed ppc and sparc compiles
  490. Revision 1.40 2003/09/23 17:56:05 peter
  491. * locals and paras are allocated in the code generation
  492. * tvarsym.localloc contains the location of para/local when
  493. generating code for the current procedure
  494. Revision 1.39 2003/09/07 22:09:35 peter
  495. * preparations for different default calling conventions
  496. * various RA fixes
  497. Revision 1.38 2003/09/03 15:55:00 peter
  498. * NEWRA branch merged
  499. Revision 1.37.2.1 2003/08/27 20:23:55 peter
  500. * remove old ra code
  501. Revision 1.37 2003/06/13 21:19:30 peter
  502. * current_procdef removed, use current_procinfo.procdef instead
  503. Revision 1.36 2003/06/09 18:26:46 peter
  504. * remove temptype, use tempinfo.temptype instead
  505. Revision 1.35 2003/06/09 12:20:47 peter
  506. * getposition added to retrieve the the current tai item
  507. Revision 1.34 2003/05/17 13:30:08 jonas
  508. * changed tt_persistant to tt_persistent :)
  509. * tempcreatenode now doesn't accept a boolean anymore for persistent
  510. temps, but a ttemptype, so you can also create ansistring temps etc
  511. Revision 1.33 2003/04/27 11:21:33 peter
  512. * aktprocdef renamed to current_procinfo.procdef
  513. * procinfo renamed to current_procinfo
  514. * procinfo will now be stored in current_module so it can be
  515. cleaned up properly
  516. * gen_main_procsym changed to create_main_proc and release_main_proc
  517. to also generate a tprocinfo structure
  518. * fixed unit implicit initfinal
  519. Revision 1.32 2002/04/25 20:15:39 florian
  520. * block nodes within expressions shouldn't release the used registers,
  521. fixed using a flag till the new rg is ready
  522. Revision 1.31 2003/04/22 23:50:22 peter
  523. * firstpass uses expectloc
  524. * checks if there are differences between the expectloc and
  525. location.loc from secondpass in EXTDEBUG
  526. Revision 1.30 2003/04/17 07:50:24 daniel
  527. * Some work on interference graph construction
  528. Revision 1.29 2003/03/28 19:16:56 peter
  529. * generic constructor working for i386
  530. * remove fixed self register
  531. * esi added as address register for i386
  532. Revision 1.28 2002/11/27 15:33:19 peter
  533. * fixed relabeling to relabel only tasmlabel (formerly proclocal)
  534. Revision 1.27 2002/11/27 02:37:13 peter
  535. * case statement inlining added
  536. * fixed inlining of write()
  537. * switched statementnode left and right parts so the statements are
  538. processed in the correct order when getcopy is used. This is
  539. required for tempnodes
  540. Revision 1.26 2002/11/17 16:31:56 carl
  541. * memory optimization (3-4%) : cleanup of tai fields,
  542. cleanup of tdef and tsym fields.
  543. * make it work for m68k
  544. Revision 1.25 2002/11/15 16:29:30 peter
  545. * made tasmsymbol.refs private (merged)
  546. Revision 1.24 2002/11/15 01:58:51 peter
  547. * merged changes from 1.0.7 up to 04-11
  548. - -V option for generating bug report tracing
  549. - more tracing for option parsing
  550. - errors for cdecl and high()
  551. - win32 import stabs
  552. - win32 records<=8 are returned in eax:edx (turned off by default)
  553. - heaptrc update
  554. - more info for temp management in .s file with EXTDEBUG
  555. Revision 1.23 2002/08/23 16:14:48 peter
  556. * tempgen cleanup
  557. * tt_noreuse temp type added that will be used in genentrycode
  558. Revision 1.22 2002/08/11 14:32:26 peter
  559. * renamed current_library to objectlibrary
  560. Revision 1.21 2002/08/11 13:24:11 peter
  561. * saving of asmsymbols in ppu supported
  562. * asmsymbollist global is removed and moved into a new class
  563. tasmlibrarydata that will hold the info of a .a file which
  564. corresponds with a single module. Added librarydata to tmodule
  565. to keep the library info stored for the module. In the future the
  566. objectfiles will also be stored to the tasmlibrarydata class
  567. * all getlabel/newasmsymbol and friends are moved to the new class
  568. Revision 1.20 2002/07/01 18:46:22 peter
  569. * internal linker
  570. * reorganized aasm layer
  571. Revision 1.19 2002/05/18 13:34:09 peter
  572. * readded missing revisions
  573. Revision 1.18 2002/05/16 19:46:37 carl
  574. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  575. + try to fix temp allocation (still in ifdef)
  576. + generic constructor calls
  577. + start of tassembler / tmodulebase class cleanup
  578. Revision 1.16 2002/05/13 19:54:37 peter
  579. * removed n386ld and n386util units
  580. * maybe_save/maybe_restore added instead of the old maybe_push
  581. Revision 1.15 2002/05/12 16:53:07 peter
  582. * moved entry and exitcode to ncgutil and cgobj
  583. * foreach gets extra argument for passing local data to the
  584. iterator function
  585. * -CR checks also class typecasts at runtime by changing them
  586. into as
  587. * fixed compiler to cycle with the -CR option
  588. * fixed stabs with elf writer, finally the global variables can
  589. be watched
  590. * removed a lot of routines from cga unit and replaced them by
  591. calls to cgobj
  592. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  593. u32bit then the other is typecasted also to u32bit without giving
  594. a rangecheck warning/error.
  595. * fixed pascal calling method with reversing also the high tree in
  596. the parast, detected by tcalcst3 test
  597. Revision 1.14 2002/04/23 19:16:34 peter
  598. * add pinline unit that inserts compiler supported functions using
  599. one or more statements
  600. * moved finalize and setlength from ninl to pinline
  601. Revision 1.13 2002/04/21 19:02:03 peter
  602. * removed newn and disposen nodes, the code is now directly
  603. inlined from pexpr
  604. * -an option that will write the secondpass nodes to the .s file, this
  605. requires EXTDEBUG define to actually write the info
  606. * fixed various internal errors and crashes due recent code changes
  607. Revision 1.12 2002/04/04 19:05:57 peter
  608. * removed unused units
  609. * use tlocation.size in cg.a_*loc*() routines
  610. Revision 1.11 2002/03/31 20:26:34 jonas
  611. + a_loadfpu_* and a_loadmm_* methods in tcg
  612. * register allocation is now handled by a class and is mostly processor
  613. independent (+rgobj.pas and i386/rgcpu.pas)
  614. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  615. * some small improvements and fixes to the optimizer
  616. * some register allocation fixes
  617. * some fpuvaroffset fixes in the unary minus node
  618. * push/popusedregisters is now called rg.save/restoreusedregisters and
  619. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  620. also better optimizable)
  621. * fixed and optimized register saving/restoring for new/dispose nodes
  622. * LOC_FPU locations now also require their "register" field to be set to
  623. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  624. - list field removed of the tnode class because it's not used currently
  625. and can cause hard-to-find bugs
  626. }