ncginl.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl and Carl Eric Codere
  4. Generate generic inline 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 ncginl;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. node,ninl;
  23. type
  24. tcginlinenode = class(tinlinenode)
  25. procedure pass_2;override;
  26. procedure second_assert;virtual;
  27. procedure second_sizeoftypeof;virtual;
  28. procedure second_length;virtual;
  29. procedure second_predsucc;virtual;
  30. procedure second_incdec;virtual;
  31. procedure second_typeinfo;virtual;
  32. procedure second_includeexclude;virtual;
  33. procedure second_pi; virtual;
  34. procedure second_arctan_real; virtual;
  35. procedure second_abs_real; virtual;
  36. procedure second_sqr_real; virtual;
  37. procedure second_sqrt_real; virtual;
  38. procedure second_ln_real; virtual;
  39. procedure second_cos_real; virtual;
  40. procedure second_sin_real; virtual;
  41. end;
  42. implementation
  43. uses
  44. globtype,systems,
  45. cutils,verbose,globals,fmodule,
  46. symconst,symdef,defbase,
  47. aasmbase,aasmtai,aasmcpu,
  48. cginfo,cgbase,pass_1,pass_2,
  49. cpubase,paramgr,
  50. nbas,ncon,ncal,ncnv,nld,
  51. tgobj,ncgutil,cgobj,rgobj,rgcpu
  52. {$ifndef cpu64bit}
  53. ,cg64f32
  54. {$endif cpu64bit}
  55. ;
  56. {*****************************************************************************
  57. TCGINLINENODE
  58. *****************************************************************************}
  59. procedure tcginlinenode.pass_2;
  60. var
  61. asmop : tasmop;
  62. l : longint;
  63. oldpushedparasize : longint;
  64. begin
  65. { save & reset pushedparasize }
  66. oldpushedparasize:=pushedparasize;
  67. pushedparasize:=0;
  68. case inlinenumber of
  69. in_assert_x_y:
  70. begin
  71. second_Assert;
  72. end;
  73. in_sizeof_x,
  74. in_typeof_x :
  75. begin
  76. second_SizeofTypeOf;
  77. end;
  78. in_length_x :
  79. begin
  80. second_Length;
  81. end;
  82. in_pred_x,
  83. in_succ_x:
  84. begin
  85. second_PredSucc;
  86. end;
  87. in_dec_x,
  88. in_inc_x :
  89. begin
  90. second_IncDec;
  91. end;
  92. in_typeinfo_x:
  93. begin
  94. second_TypeInfo;
  95. end;
  96. in_include_x_y,
  97. in_exclude_x_y:
  98. begin
  99. second_IncludeExclude;
  100. end;
  101. in_pi:
  102. begin
  103. second_pi;
  104. end;
  105. in_sin_extended:
  106. begin
  107. second_sin_real;
  108. end;
  109. in_arctan_extended:
  110. begin
  111. second_arctan_real;
  112. end;
  113. in_abs_extended:
  114. begin
  115. second_abs_real;
  116. end;
  117. in_sqr_extended:
  118. begin
  119. second_sqr_real;
  120. end;
  121. in_sqrt_extended:
  122. begin
  123. second_sqrt_real;
  124. end;
  125. in_ln_extended:
  126. begin
  127. second_ln_real;
  128. end;
  129. in_cos_extended:
  130. begin
  131. second_cos_real;
  132. end;
  133. {$ifdef SUPPORT_MMX}
  134. in_mmx_pcmpeqb..in_mmx_pcmpgtw:
  135. begin
  136. location_reset(location,LOC_MMXREGISTER,OS_NO);
  137. if left.location.loc=LOC_REGISTER then
  138. begin
  139. {!!!!!!!}
  140. end
  141. else if tcallparanode(left).left.location.loc=LOC_REGISTER then
  142. begin
  143. {!!!!!!!}
  144. end
  145. else
  146. begin
  147. {!!!!!!!}
  148. end;
  149. end;
  150. {$endif SUPPORT_MMX}
  151. else internalerror(9);
  152. end;
  153. { reset pushedparasize }
  154. pushedparasize:=oldpushedparasize;
  155. end;
  156. {*****************************************************************************
  157. ASSERT GENERIC HANDLING
  158. *****************************************************************************}
  159. procedure tcginlinenode.second_Assert;
  160. var
  161. hp2 : tstringconstnode;
  162. otlabel,oflabel{,l1} : tasmlabel;
  163. begin
  164. { the node should be removed in the firstpass }
  165. if not (cs_do_assertion in aktlocalswitches) then
  166. internalerror(7123458);
  167. otlabel:=truelabel;
  168. oflabel:=falselabel;
  169. objectlibrary.getlabel(truelabel);
  170. objectlibrary.getlabel(falselabel);
  171. secondpass(tcallparanode(left).left);
  172. maketojumpbool(exprasmlist,tcallparanode(left).left,lr_load_regvars);
  173. cg.a_label(exprasmlist,falselabel);
  174. { erroraddr }
  175. cg.a_param_reg(exprasmlist,OS_ADDR,FRAME_POINTER_REG,paramanager.getintparaloc(4));
  176. { lineno }
  177. cg.a_param_const(exprasmlist,OS_INT,aktfilepos.line,paramanager.getintparaloc(3));
  178. { filename string }
  179. hp2:=cstringconstnode.createstr(current_module.sourcefiles.get_file_name(aktfilepos.fileindex),st_shortstring);
  180. firstpass(tnode(hp2));
  181. secondpass(tnode(hp2));
  182. if codegenerror then
  183. exit;
  184. cg.a_paramaddr_ref(exprasmlist,hp2.location.reference,paramanager.getintparaloc(2));
  185. hp2.free;
  186. { push msg }
  187. secondpass(tcallparanode(tcallparanode(left).right).left);
  188. cg.a_paramaddr_ref(exprasmlist,tcallparanode(tcallparanode(left).right).left.location.reference,paramanager.getintparaloc(1));
  189. { call }
  190. cg.a_call_name(exprasmlist,'FPC_ASSERT');
  191. cg.a_label(exprasmlist,truelabel);
  192. truelabel:=otlabel;
  193. falselabel:=oflabel;
  194. end;
  195. {*****************************************************************************
  196. SIZEOF / TYPEOF GENERIC HANDLING
  197. *****************************************************************************}
  198. { second_handle_ the sizeof and typeof routines }
  199. procedure tcginlinenode.second_SizeOfTypeOf;
  200. var
  201. href : treference;
  202. hregister : tregister;
  203. begin
  204. location_reset(location,LOC_REGISTER,OS_ADDR);
  205. { for both cases load vmt }
  206. if left.nodetype=typen then
  207. begin
  208. hregister:=rg.getaddressregister(exprasmlist);
  209. reference_reset_symbol(href,objectlibrary.newasmsymbol(tobjectdef(left.resulttype.def).vmt_mangledname),0);
  210. cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
  211. end
  212. else
  213. begin
  214. secondpass(left);
  215. location_release(exprasmlist,left.location);
  216. hregister:=rg.getaddressregister(exprasmlist);
  217. { load VMT pointer }
  218. inc(left.location.reference.offset,tobjectdef(left.resulttype.def).vmt_offset);
  219. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister);
  220. end;
  221. { in sizeof load size }
  222. if inlinenumber=in_sizeof_x then
  223. begin
  224. reference_reset_base(href,hregister,0);
  225. rg.ungetaddressregister(exprasmlist,hregister);
  226. hregister:=rg.getregisterint(exprasmlist);
  227. cg.a_load_ref_reg(exprasmlist,OS_INT,href,hregister);
  228. end;
  229. location.register:=hregister;
  230. end;
  231. {*****************************************************************************
  232. LENGTH GENERIC HANDLING
  233. *****************************************************************************}
  234. procedure tcginlinenode.second_Length;
  235. var
  236. lengthlab : tasmlabel;
  237. hregister : tregister;
  238. href : treference;
  239. begin
  240. secondpass(left);
  241. { length in ansi strings is at offset -8 }
  242. if is_ansistring(left.resulttype.def) or
  243. is_widestring(left.resulttype.def) then
  244. begin
  245. location_force_reg(exprasmlist,left.location,OS_ADDR,false);
  246. hregister:=left.location.register;
  247. objectlibrary.getlabel(lengthlab);
  248. cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,hregister,lengthlab);
  249. reference_reset_base(href,hregister,-8);
  250. cg.a_load_ref_reg(exprasmlist,OS_32,href,hregister);
  251. cg.a_label(exprasmlist,lengthlab);
  252. location_reset(location,LOC_REGISTER,OS_32);
  253. location.register:=hregister;
  254. end
  255. else
  256. begin
  257. location_copy(location,left.location);
  258. location.size:=OS_8;
  259. end;
  260. end;
  261. {*****************************************************************************
  262. PRED/SUCC GENERIC HANDLING
  263. *****************************************************************************}
  264. procedure tcginlinenode.second_PredSucc;
  265. var
  266. cgsize : TCGSize;
  267. cgop : topcg;
  268. begin
  269. secondpass(left);
  270. if inlinenumber=in_pred_x then
  271. cgop:=OP_SUB
  272. else
  273. cgop:=OP_ADD;
  274. cgsize:=def_cgsize(resulttype.def);
  275. { we need a value in a register }
  276. location_copy(location,left.location);
  277. location_force_reg(exprasmlist,location,cgsize,false);
  278. if cgsize in [OS_64,OS_S64] then
  279. cg64.a_op64_const_reg(exprasmlist,cgop,1,
  280. location.register64)
  281. else
  282. cg.a_op_const_reg(exprasmlist,cgop,1,location.register);
  283. cg.g_overflowcheck(exprasmlist,self);
  284. cg.g_rangecheck(exprasmlist,self,resulttype.def);
  285. end;
  286. {*****************************************************************************
  287. INC/DEC GENERIC HANDLING
  288. *****************************************************************************}
  289. procedure tcginlinenode.second_IncDec;
  290. const
  291. addsubop:array[in_inc_x..in_dec_x] of TOpCG=(OP_ADD,OP_SUB);
  292. var
  293. addvalue : longint;
  294. addconstant : boolean;
  295. hregisterhi,
  296. hregister : tregister;
  297. cgsize : tcgsize;
  298. pushedregs : tmaybesave;
  299. begin
  300. { set defaults }
  301. addconstant:=true;
  302. { load first parameter, must be a reference }
  303. secondpass(tcallparanode(left).left);
  304. cgsize:=def_cgsize(tcallparanode(left).left.resulttype.def);
  305. { get addvalue }
  306. case tcallparanode(left).left.resulttype.def.deftype of
  307. orddef,
  308. enumdef :
  309. addvalue:=1;
  310. pointerdef :
  311. begin
  312. if is_void(tpointerdef(tcallparanode(left).left.resulttype.def).pointertype.def) then
  313. addvalue:=1
  314. else
  315. addvalue:=tpointerdef(tcallparanode(left).left.resulttype.def).pointertype.def.size;
  316. end;
  317. else
  318. internalerror(10081);
  319. end;
  320. { second_ argument specified?, must be a s32bit in register }
  321. if assigned(tcallparanode(left).right) then
  322. begin
  323. maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32,
  324. tcallparanode(left).left.location,pushedregs);
  325. secondpass(tcallparanode(tcallparanode(left).right).left);
  326. maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs);
  327. { when constant, just multiply the addvalue }
  328. if is_constintnode(tcallparanode(tcallparanode(left).right).left) then
  329. addvalue:=addvalue*get_ordinal_value(tcallparanode(tcallparanode(left).right).left)
  330. else
  331. begin
  332. location_force_reg(exprasmlist,tcallparanode(tcallparanode(left).right).left.location,cgsize,false);
  333. hregister:=tcallparanode(tcallparanode(left).right).left.location.register;
  334. hregisterhi:=tcallparanode(tcallparanode(left).right).left.location.registerhigh;
  335. { insert multiply with addvalue if its >1 }
  336. if addvalue>1 then
  337. cg.a_op_const_reg(exprasmlist,OP_IMUL,addvalue,hregister);
  338. addconstant:=false;
  339. end;
  340. end;
  341. { write the add instruction }
  342. if addconstant then
  343. begin
  344. if cgsize in [OS_64,OS_S64] then
  345. cg64.a_op64_const_loc(exprasmlist,addsubop[inlinenumber],
  346. addvalue,tcallparanode(left).left.location)
  347. else
  348. cg.a_op_const_loc(exprasmlist,addsubop[inlinenumber],
  349. addvalue,tcallparanode(left).left.location);
  350. end
  351. else
  352. begin
  353. {$ifndef cpu64bit}
  354. if cgsize in [OS_64,OS_S64] then
  355. cg64.a_op64_reg_loc(exprasmlist,addsubop[inlinenumber],
  356. joinreg64(hregister,hregisterhi),tcallparanode(left).left.location)
  357. else
  358. {$endif cpu64bit}
  359. cg.a_op_reg_loc(exprasmlist,addsubop[inlinenumber],
  360. hregister,tcallparanode(left).left.location);
  361. location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
  362. end;
  363. cg.g_overflowcheck(exprasmlist,tcallparanode(left).left);
  364. cg.g_rangecheck(exprasmlist,tcallparanode(left).left,tcallparanode(left).left.resulttype.def);
  365. end;
  366. {*****************************************************************************
  367. TYPEINFO GENERIC HANDLING
  368. *****************************************************************************}
  369. procedure tcginlinenode.second_typeinfo;
  370. var
  371. href : treference;
  372. begin
  373. location_reset(location,LOC_REGISTER,OS_ADDR);
  374. location.register:=rg.getaddressregister(exprasmlist);
  375. reference_reset_symbol(href,tstoreddef(ttypenode(tcallparanode(left).left).resulttype.def).get_rtti_label(fullrtti),0);
  376. cg.a_loadaddr_ref_reg(exprasmlist,href,location.register);
  377. end;
  378. {*****************************************************************************
  379. INCLUDE/EXCLUDE GENERIC HANDLING
  380. *****************************************************************************}
  381. procedure tcginlinenode.second_IncludeExclude;
  382. var
  383. scratch_reg : boolean;
  384. hregister : tregister;
  385. asmop : tasmop;
  386. L : longint;
  387. pushedregs : TMaybesave;
  388. cgop : topcg;
  389. addrreg, hregister2: tregister;
  390. use_small : boolean;
  391. cgsize : tcgsize;
  392. href : treference;
  393. begin
  394. location_copy(location,left.location);
  395. secondpass(tcallparanode(left).left);
  396. if tcallparanode(tcallparanode(left).right).left.nodetype=ordconstn then
  397. begin
  398. { calculate bit position }
  399. l:=1 shl (tordconstnode(tcallparanode(tcallparanode(left).right).left).value mod 32);
  400. { determine operator }
  401. if inlinenumber=in_include_x_y then
  402. cgop:=OP_OR
  403. else
  404. begin
  405. cgop:=OP_AND;
  406. l:=not(l);
  407. end;
  408. if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
  409. begin
  410. inc(tcallparanode(left).left.location.reference.offset,
  411. (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div 32)*4);
  412. cg.a_op_const_ref(exprasmlist,cgop,OS_INT,l,tcallparanode(left).left.location.reference);
  413. location_release(exprasmlist,tcallparanode(left).left.location);
  414. end
  415. else
  416. { LOC_CREGISTER }
  417. begin
  418. cg.a_op_const_reg(exprasmlist,cgop,l,tcallparanode(left).left.location.register);
  419. end;
  420. end
  421. else
  422. begin
  423. use_small:=
  424. { set type }
  425. (tsetdef(tcallparanode(left).left.resulttype.def).settype=smallset)
  426. and
  427. { elemenut number between 1 and 32 }
  428. ((tcallparanode(tcallparanode(left).right).left.resulttype.def.deftype=orddef) and
  429. (torddef(tcallparanode(tcallparanode(left).right).left.resulttype.def).high<=32) or
  430. (tcallparanode(tcallparanode(left).right).left.resulttype.def.deftype=enumdef) and
  431. (tenumdef(tcallparanode(tcallparanode(left).right).left.resulttype.def).max<=32));
  432. { generate code for the element to set }
  433. maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32,
  434. tcallparanode(left).left.location,pushedregs);
  435. secondpass(tcallparanode(tcallparanode(left).right).left);
  436. maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs);
  437. { bitnumber - which must be loaded into register }
  438. hregister := cg.get_scratch_reg_int(exprasmlist);
  439. hregister2 := rg.getregisterint(exprasmlist);
  440. case tcallparanode(tcallparanode(left).right).left.location.loc of
  441. LOC_CREGISTER,
  442. LOC_REGISTER:
  443. begin
  444. cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,
  445. tcallparanode(tcallparanode(left).right).left.location.register,hregister);
  446. end;
  447. LOC_REFERENCE:
  448. begin
  449. cgsize := def_cgsize(tcallparanode(tcallparanode(left).right).left.resulttype.def);
  450. cg.a_load_ref_reg(exprasmlist,cgsize,
  451. tcallparanode(tcallparanode(left).right).left.location.reference,hregister);
  452. end;
  453. else
  454. internalerror(20020727);
  455. end;
  456. { hregister contains the bitnumber to add }
  457. cg.a_load_const_reg(exprasmlist, OS_INT, 1, hregister2);
  458. cg.a_op_reg_reg(exprasmlist, OP_SHL, OS_INT, hregister, hregister2);
  459. if use_small then
  460. begin
  461. { possiblities :
  462. bitnumber : LOC_REFERENCE, LOC_REGISTER, LOC_CREGISTER
  463. set value : LOC_REFERENCE, LOC_REGISTER
  464. }
  465. { location of set }
  466. if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
  467. begin
  468. if inlinenumber=in_include_x_y then
  469. begin
  470. cg.a_op_reg_ref(exprasmlist, OP_OR, OS_32, hregister2,
  471. tcallparanode(left).left.location.reference);
  472. end
  473. else
  474. begin
  475. cg.a_op_reg_reg(exprasmlist, OP_NOT, OS_32, hregister2,
  476. hregister2);
  477. cg.a_op_reg_ref(exprasmlist, OP_AND, OS_32, hregister2,
  478. tcallparanode(left).left.location.reference);
  479. end;
  480. end
  481. else
  482. internalerror(20020728);
  483. end
  484. else
  485. begin
  486. { possiblities :
  487. bitnumber : LOC_REFERENCE, LOC_REGISTER, LOC_CREGISTER
  488. set value : LOC_REFERENCE
  489. }
  490. { hregister contains the bitnumber (div 32 to get the correct offset) }
  491. cg.a_op_const_reg(exprasmlist, OP_SHR, 5, hregister);
  492. addrreg := cg.get_scratch_reg_address(exprasmlist);
  493. { calculate the correct address of the operand }
  494. cg.a_loadaddr_ref_reg(exprasmlist, tcallparanode(left).left.location.reference,addrreg);
  495. cg.a_op_reg_reg(exprasmlist, OP_ADD, OS_INT, hregister, addrreg);
  496. reference_reset_base(href,addrreg,0);
  497. if inlinenumber=in_include_x_y then
  498. begin
  499. cg.a_op_reg_ref(exprasmlist, OP_OR, OS_32, hregister2, href);
  500. end
  501. else
  502. begin
  503. cg.a_op_reg_reg(exprasmlist, OP_NOT, OS_32, hregister2, hregister2);
  504. cg.a_op_reg_ref(exprasmlist, OP_AND, OS_32, hregister2, href);
  505. end;
  506. cg.free_scratch_reg(exprasmlist, addrreg);
  507. end;
  508. cg.free_scratch_reg(exprasmlist,hregister);
  509. rg.ungetregisterint(exprasmlist,hregister2);
  510. end;
  511. end;
  512. {*****************************************************************************
  513. FLOAT GENERIC HANDLING
  514. *****************************************************************************}
  515. {
  516. These routines all call internal RTL routines, so if they are
  517. called here, they give an internal error
  518. }
  519. procedure tcginlinenode.second_pi;
  520. begin
  521. internalerror(20020718);
  522. end;
  523. procedure tcginlinenode.second_arctan_real;
  524. begin
  525. internalerror(20020718);
  526. end;
  527. procedure tcginlinenode.second_abs_real;
  528. begin
  529. internalerror(20020718);
  530. end;
  531. procedure tcginlinenode.second_sqr_real;
  532. begin
  533. internalerror(20020718);
  534. end;
  535. procedure tcginlinenode.second_sqrt_real;
  536. begin
  537. internalerror(20020718);
  538. end;
  539. procedure tcginlinenode.second_ln_real;
  540. begin
  541. internalerror(20020718);
  542. end;
  543. procedure tcginlinenode.second_cos_real;
  544. begin
  545. internalerror(20020718);
  546. end;
  547. procedure tcginlinenode.second_sin_real;
  548. begin
  549. internalerror(20020718);
  550. end;
  551. begin
  552. cinlinenode:=tcginlinenode;
  553. end.
  554. {
  555. $Log$
  556. Revision 1.16 2002-10-05 12:43:25 carl
  557. * fixes for Delphi 6 compilation
  558. (warning : Some features do not work under Delphi)
  559. Revision 1.15 2002/09/30 07:00:46 florian
  560. * fixes to common code to get the alpha compiler compiled applied
  561. Revision 1.14 2002/09/17 18:54:02 jonas
  562. * a_load_reg_reg() now has two size parameters: source and dest. This
  563. allows some optimizations on architectures that don't encode the
  564. register size in the register name.
  565. Revision 1.13 2002/08/13 18:01:52 carl
  566. * rename swatoperands to swapoperands
  567. + m68k first compilable version (still needs a lot of testing):
  568. assembler generator, system information , inline
  569. assembler reader.
  570. Revision 1.12 2002/08/11 14:32:26 peter
  571. * renamed current_library to objectlibrary
  572. Revision 1.11 2002/08/11 13:24:11 peter
  573. * saving of asmsymbols in ppu supported
  574. * asmsymbollist global is removed and moved into a new class
  575. tasmlibrarydata that will hold the info of a .a file which
  576. corresponds with a single module. Added librarydata to tmodule
  577. to keep the library info stored for the module. In the future the
  578. objectfiles will also be stored to the tasmlibrarydata class
  579. * all getlabel/newasmsymbol and friends are moved to the new class
  580. Revision 1.10 2002/08/05 18:27:48 carl
  581. + more more more documentation
  582. + first version include/exclude (can't test though, not enough scratch for i386 :()...
  583. Revision 1.9 2002/08/04 19:06:41 carl
  584. + added generic exception support (still does not work!)
  585. + more documentation
  586. Revision 1.8 2002/07/31 07:54:59 jonas
  587. * re-enabled second_assigned()
  588. Revision 1.7 2002/07/30 20:50:43 florian
  589. * the code generator knows now if parameters are in registers
  590. Revision 1.6 2002/07/29 21:23:42 florian
  591. * more fixes for the ppc
  592. + wrappers for the tcnvnode.first_* stuff introduced
  593. Revision 1.5 2002/07/28 20:45:22 florian
  594. + added direct assembler reader for PowerPC
  595. Revision 1.4 2002/07/26 09:45:20 florian
  596. * fixed a mistake in yesterday's commit, forgot to commit it
  597. Revision 1.3 2002/07/25 22:58:30 florian
  598. no message
  599. Revision 1.2 2002/07/25 17:55:41 carl
  600. + First working revision
  601. Revision 1.1 2002/07/24 04:07:49 carl
  602. + first revision (incomplete)
  603. }