ncginl.pas 25 KB

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