cpupara.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. {
  2. $Id$
  3. Copyright (c) 2002 by Florian Klaempfl
  4. PowerPC specific calling conventions
  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 cpupara;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. globtype,
  23. cclasses,
  24. aasmtai,
  25. cpubase,cpuinfo,
  26. symconst,symbase,symtype,symdef,
  27. paramgr,parabase,cgbase;
  28. type
  29. tppcparamanager = class(tparamanager)
  30. function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
  31. function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
  32. function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
  33. procedure getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);override;
  34. function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
  35. function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;override;
  36. procedure create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
  37. private
  38. procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
  39. function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
  40. var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
  41. function parseparaloc(p : tparaitem;const s : string) : boolean;override;
  42. end;
  43. implementation
  44. uses
  45. verbose,systems,
  46. procinfo,
  47. rgobj,
  48. defutil,symsym,cpupi;
  49. function tppcparamanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
  50. begin
  51. result := [RS_R3..RS_R12];
  52. end;
  53. function tppcparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
  54. begin
  55. case target_info.abi of
  56. abi_powerpc_aix:
  57. result := [RS_F0..RS_F13];
  58. abi_powerpc_sysv:
  59. {$warning: the 64bit sysv abi also uses RS_F0..RS_F13 like the aix abi above }
  60. result := [RS_F0..RS_F8];
  61. else
  62. internalerror(2003091401);
  63. end;
  64. end;
  65. procedure tppcparamanager.getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);
  66. var
  67. paraloc : pcgparalocation;
  68. begin
  69. cgpara.reset;
  70. cgpara.size:=OS_INT;
  71. cgpara.alignment:=get_para_align(calloption);
  72. paraloc:=cgpara.add_location;
  73. with paraloc^ do
  74. begin
  75. size:=OS_INT;
  76. if (nr<=8) then
  77. begin
  78. if nr=0 then
  79. internalerror(200309271);
  80. loc:=LOC_REGISTER;
  81. register:=newreg(R_INTREGISTER,RS_R2+nr,R_SUBWHOLE);
  82. end
  83. else
  84. begin
  85. loc:=LOC_REFERENCE;
  86. reference.index:=NR_STACK_POINTER_REG;
  87. reference.offset:=sizeof(aint)*(nr-8);
  88. end;
  89. end;
  90. end;
  91. function getparaloc(p : tdef) : tcgloc;
  92. begin
  93. { Later, the LOC_REFERENCE is in most cases changed into LOC_REGISTER
  94. if push_addr_param for the def is true
  95. }
  96. case p.deftype of
  97. orddef:
  98. result:=LOC_REGISTER;
  99. floatdef:
  100. result:=LOC_FPUREGISTER;
  101. enumdef:
  102. result:=LOC_REGISTER;
  103. pointerdef:
  104. result:=LOC_REGISTER;
  105. formaldef:
  106. result:=LOC_REGISTER;
  107. classrefdef:
  108. result:=LOC_REGISTER;
  109. recorddef:
  110. result:=LOC_REFERENCE;
  111. objectdef:
  112. if is_object(p) then
  113. result:=LOC_REFERENCE
  114. else
  115. result:=LOC_REGISTER;
  116. stringdef:
  117. if is_shortstring(p) or is_longstring(p) then
  118. result:=LOC_REFERENCE
  119. else
  120. result:=LOC_REGISTER;
  121. procvardef:
  122. if (po_methodpointer in tprocvardef(p).procoptions) then
  123. result:=LOC_REFERENCE
  124. else
  125. result:=LOC_REGISTER;
  126. filedef:
  127. result:=LOC_REGISTER;
  128. arraydef:
  129. result:=LOC_REFERENCE;
  130. setdef:
  131. if is_smallset(p) then
  132. result:=LOC_REGISTER
  133. else
  134. result:=LOC_REFERENCE;
  135. variantdef:
  136. result:=LOC_REFERENCE;
  137. { avoid problems with errornous definitions }
  138. errordef:
  139. result:=LOC_REGISTER;
  140. else
  141. internalerror(2002071001);
  142. end;
  143. end;
  144. function tppcparamanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  145. begin
  146. { var,out always require address }
  147. if varspez in [vs_var,vs_out] then
  148. begin
  149. result:=true;
  150. exit;
  151. end;
  152. case def.deftype of
  153. recorddef:
  154. result:=true;
  155. arraydef:
  156. result:=(tarraydef(def).highrange>=tarraydef(def).lowrange) or
  157. is_open_array(def) or
  158. is_array_of_const(def) or
  159. is_array_constructor(def);
  160. setdef :
  161. result:=(tsetdef(def).settype<>smallset);
  162. stringdef :
  163. result:=tstringdef(def).string_typ in [st_shortstring,st_longstring];
  164. procvardef :
  165. result:=po_methodpointer in tprocvardef(def).procoptions;
  166. else
  167. result:=inherited push_addr_param(varspez,def,calloption);
  168. end;
  169. end;
  170. procedure tppcparamanager.init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
  171. begin
  172. case target_info.abi of
  173. abi_powerpc_aix:
  174. cur_stack_offset:=24;
  175. abi_powerpc_sysv:
  176. cur_stack_offset:=8;
  177. else
  178. internalerror(2003051901);
  179. end;
  180. curintreg:=RS_R3;
  181. curfloatreg:=RS_F1;
  182. curmmreg:=RS_M1;
  183. end;
  184. procedure tppcparamanager.create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
  185. var
  186. hiparaloc,
  187. paraloc : pcgparalocation;
  188. retcgsize : tcgsize;
  189. begin
  190. { Constructors return self instead of a boolean }
  191. if (p.proctypeoption=potype_constructor) then
  192. retcgsize:=OS_ADDR
  193. else
  194. retcgsize:=def_cgsize(p.rettype.def);
  195. p.funcret_paraloc[side].reset;
  196. p.funcret_paraloc[side].Alignment:=std_param_align;
  197. p.funcret_paraloc[side].size:=retcgsize;
  198. { void has no location }
  199. if is_void(p.rettype.def) then
  200. exit;
  201. paraloc:=p.funcret_paraloc[side].add_location;
  202. { Return in FPU register? }
  203. if p.rettype.def.deftype=floatdef then
  204. begin
  205. paraloc^.loc:=LOC_FPUREGISTER;
  206. paraloc^.register:=NR_FPU_RESULT_REG;
  207. paraloc^.size:=retcgsize;
  208. end
  209. else
  210. { Return in register? }
  211. if not ret_in_param(p.rettype.def,p.proccalloption) then
  212. begin
  213. {$ifndef cpu64bit}
  214. if retcgsize in [OS_64,OS_S64] then
  215. begin
  216. { low 32bits }
  217. paraloc^.loc:=LOC_REGISTER;
  218. paraloc^.size:=OS_32;
  219. if side=callerside then
  220. paraloc^.register:=NR_FUNCTION_RESULT64_HIGH_REG
  221. else
  222. paraloc^.register:=NR_FUNCTION_RETURN64_HIGH_REG;
  223. { high 32bits }
  224. hiparaloc:=p.funcret_paraloc[side].add_location;
  225. hiparaloc^.loc:=LOC_REGISTER;
  226. hiparaloc^.size:=OS_32;
  227. if side=callerside then
  228. hiparaloc^.register:=NR_FUNCTION_RESULT64_LOW_REG
  229. else
  230. hiparaloc^.register:=NR_FUNCTION_RETURN64_LOW_REG;
  231. end
  232. else
  233. {$endif cpu64bit}
  234. begin
  235. paraloc^.loc:=LOC_REGISTER;
  236. paraloc^.size:=retcgsize;
  237. if side=callerside then
  238. paraloc^.register:=newreg(R_INTREGISTER,RS_FUNCTION_RESULT_REG,cgsize2subreg(retcgsize))
  239. else
  240. paraloc^.register:=newreg(R_INTREGISTER,RS_FUNCTION_RETURN_REG,cgsize2subreg(retcgsize));
  241. end;
  242. end
  243. else
  244. begin
  245. paraloc^.loc:=LOC_REFERENCE;
  246. paraloc^.size:=retcgsize;
  247. end;
  248. end;
  249. function tppcparamanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  250. var
  251. cur_stack_offset: aword;
  252. curintreg, curfloatreg, curmmreg: tsuperregister;
  253. begin
  254. init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
  255. result := create_paraloc_info_intern(p,side,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
  256. create_funcret_paraloc_info(p,side);
  257. end;
  258. function tppcparamanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
  259. var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
  260. var
  261. stack_offset: aword;
  262. nextintreg,nextfloatreg,nextmmreg, maxfpureg : tsuperregister;
  263. paradef : tdef;
  264. paraloc,paraloc2 : pcgparalocation;
  265. hp : tparaitem;
  266. loc : tcgloc;
  267. paracgsize: tcgsize;
  268. is_64bit: boolean;
  269. procedure assignintreg;
  270. begin
  271. if nextintreg<=ord(NR_R10) then
  272. begin
  273. paraloc^.loc:=LOC_REGISTER;
  274. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  275. inc(nextintreg);
  276. if target_info.abi=abi_powerpc_aix then
  277. inc(stack_offset,4);
  278. end
  279. else
  280. begin
  281. paraloc^.loc:=LOC_REFERENCE;
  282. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  283. paraloc^.reference.offset:=stack_offset;
  284. inc(stack_offset,4);
  285. end;
  286. end;
  287. begin
  288. {$ifdef extdebug}
  289. if po_explicitparaloc in p.procoptions then
  290. internalerror(200411141);
  291. {$endif extdebug}
  292. result:=0;
  293. nextintreg := curintreg;
  294. nextfloatreg := curfloatreg;
  295. nextmmreg := curmmreg;
  296. stack_offset := cur_stack_offset;
  297. case target_info.abi of
  298. abi_powerpc_aix:
  299. maxfpureg := RS_F13;
  300. abi_powerpc_sysv:
  301. maxfpureg := RS_F8;
  302. else internalerror(2004070912);
  303. end;
  304. hp:=firstpara;
  305. while assigned(hp) do
  306. begin
  307. hp.paraloc[side].reset;
  308. { currently only support C-style array of const }
  309. if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
  310. is_array_of_const(hp.paratype.def) then
  311. begin
  312. paraloc:=hp.paraloc[side].add_location;
  313. { hack: the paraloc must be valid, but is not actually used }
  314. paraloc^.loc := LOC_REGISTER;
  315. paraloc^.register := NR_R0;
  316. paraloc^.size := OS_ADDR;
  317. break;
  318. end;
  319. if (hp.paratyp in [vs_var,vs_out]) then
  320. begin
  321. paradef:=voidpointertype.def;
  322. loc:=LOC_REGISTER;
  323. paracgsize := OS_ADDR;
  324. end
  325. else
  326. begin
  327. paradef := hp.paratype.def;
  328. loc:=getparaloc(paradef);
  329. paracgsize:=def_cgsize(paradef);
  330. { for things like formaldef }
  331. if paracgsize=OS_NO then
  332. paracgsize:=OS_ADDR;
  333. end;
  334. hp.paraloc[side].alignment:=std_param_align;
  335. hp.paraloc[side].size:=paracgsize;
  336. { First location }
  337. paraloc:=hp.paraloc[side].add_location;
  338. paraloc^.size:=paracgsize;
  339. case loc of
  340. LOC_REGISTER:
  341. begin
  342. is_64bit:=paraloc^.size in [OS_64,OS_S64];
  343. if nextintreg<=(RS_R10-ord(is_64bit)) then
  344. begin
  345. paraloc^.loc:=LOC_REGISTER;
  346. {$ifndef cpu64bit}
  347. if is_64bit then
  348. begin
  349. if odd(nextintreg-RS_R3) and (target_info.abi=abi_powerpc_sysv) Then
  350. inc(nextintreg);
  351. paraloc^.size:=OS_32;
  352. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  353. inc(nextintreg);
  354. paraloc2:=hp.paraloc[side].add_location;
  355. paraloc2^.loc:=LOC_REGISTER;
  356. paraloc2^.size:=OS_32;
  357. paraloc2^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  358. inc(nextintreg);
  359. if target_info.abi=abi_powerpc_aix then
  360. inc(stack_offset,8);
  361. end
  362. else
  363. {$endif cpu64bit}
  364. begin
  365. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  366. inc(nextintreg);
  367. if target_info.abi=abi_powerpc_aix then
  368. inc(stack_offset,sizeof(aword));
  369. end;
  370. end
  371. else
  372. begin
  373. nextintreg:=RS_R11;
  374. paraloc^.loc:=LOC_REFERENCE;
  375. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  376. paraloc^.reference.offset:=stack_offset;
  377. if not is_64bit then
  378. inc(stack_offset,4)
  379. else
  380. inc(stack_offset,8);
  381. end;
  382. end;
  383. LOC_FPUREGISTER:
  384. begin
  385. if nextfloatreg<=maxfpureg then
  386. begin
  387. paraloc^.loc:=LOC_FPUREGISTER;
  388. paraloc^.register:=newreg(R_FPUREGISTER,nextfloatreg,R_SUBWHOLE);
  389. inc(nextfloatreg);
  390. end
  391. else
  392. begin
  393. paraloc^.loc:=LOC_REFERENCE;
  394. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  395. paraloc^.reference.offset:=stack_offset;
  396. end;
  397. if target_info.abi=abi_powerpc_aix then
  398. begin
  399. if paraloc^.size = OS_F32 then
  400. begin
  401. inc(stack_offset,4);
  402. if (nextintreg < RS_R11) then
  403. inc(nextintreg);
  404. end
  405. else
  406. begin
  407. inc(stack_offset,8);
  408. if (nextintreg < RS_R10) then
  409. inc(nextintreg,2)
  410. else
  411. nextintreg := RS_R11;
  412. end;
  413. end;
  414. end;
  415. LOC_REFERENCE:
  416. begin
  417. paraloc^.size:=OS_ADDR;
  418. if push_addr_param(hp.paratyp,paradef,p.proccalloption) or
  419. is_open_array(paradef) or
  420. is_array_of_const(paradef) then
  421. assignintreg
  422. else
  423. begin
  424. paraloc^.loc:=LOC_REFERENCE;
  425. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  426. paraloc^.reference.offset:=stack_offset;
  427. inc(stack_offset,hp.paratype.def.size);
  428. end;
  429. end;
  430. else
  431. internalerror(2002071002);
  432. end;
  433. hp:=tparaitem(hp.next);
  434. end;
  435. curintreg:=nextintreg;
  436. curfloatreg:=nextfloatreg;
  437. curmmreg:=nextmmreg;
  438. cur_stack_offset:=stack_offset;
  439. result:=cur_stack_offset;
  440. end;
  441. function tppcparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;
  442. var
  443. cur_stack_offset: aword;
  444. parasize, l: longint;
  445. curintreg, firstfloatreg, curfloatreg, curmmreg: tsuperregister;
  446. hp: tparaitem;
  447. paraloc: pcgparalocation;
  448. begin
  449. init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
  450. firstfloatreg:=curfloatreg;
  451. result:=create_paraloc_info_intern(p,callerside,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
  452. if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
  453. { just continue loading the parameters in the registers }
  454. result:=create_paraloc_info_intern(p,callerside,tparaitem(varargspara.first),curintreg,curfloatreg,curmmreg,cur_stack_offset)
  455. else
  456. begin
  457. hp:=tparaitem(varargspara.first);
  458. parasize:=cur_stack_offset;
  459. while assigned(hp) do
  460. begin
  461. hp.paraloc[callerside].alignment:=4;
  462. paraloc:=hp.paraloc[callerside].add_location;
  463. paraloc^.loc:=LOC_REFERENCE;
  464. paraloc^.size:=def_cgsize(hp.paratype.def);
  465. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  466. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  467. paraloc^.reference.offset:=parasize;
  468. parasize:=parasize+l;
  469. hp:=tparaitem(hp.next);
  470. end;
  471. result:=parasize;
  472. end;
  473. if curfloatreg<>firstfloatreg then
  474. include(varargspara.varargsinfo,va_uses_float_reg);
  475. end;
  476. function tppcparamanager.parseparaloc(p : tparaitem;const s : string) : boolean;
  477. var
  478. paraloc : pcgparalocation;
  479. begin
  480. result:=false;
  481. case target_info.system of
  482. system_powerpc_morphos:
  483. begin
  484. p.paraloc[callerside].alignment:=4;
  485. p.paraloc[callerside].size:=def_cgsize(p.paratype.def);
  486. paraloc:=p.paraloc[callerside].add_location;
  487. paraloc^.loc:=LOC_REFERENCE;
  488. paraloc^.size:=def_cgsize(p.paratype.def);
  489. paraloc^.reference.index:=newreg(R_INTREGISTER,RS_R2,R_SUBWHOLE);
  490. { pattern is always uppercase'd }
  491. if s='D0' then
  492. paraloc^.reference.offset:=0
  493. else if s='D1' then
  494. paraloc^.reference.offset:=4
  495. else if s='D2' then
  496. paraloc^.reference.offset:=8
  497. else if s='D3' then
  498. paraloc^.reference.offset:=12
  499. else if s='D4' then
  500. paraloc^.reference.offset:=16
  501. else if s='D5' then
  502. paraloc^.reference.offset:=20
  503. else if s='D6' then
  504. paraloc^.reference.offset:=24
  505. else if s='D7' then
  506. paraloc^.reference.offset:=28
  507. else if s='A0' then
  508. paraloc^.reference.offset:=32
  509. else if s='A1' then
  510. paraloc^.reference.offset:=36
  511. else if s='A2' then
  512. paraloc^.reference.offset:=40
  513. else if s='A3' then
  514. paraloc^.reference.offset:=44
  515. else if s='A4' then
  516. paraloc^.reference.offset:=48
  517. else if s='A5' then
  518. paraloc^.reference.offset:=52
  519. { 'A6' (offset 56) is used by mossyscall as libbase, so API
  520. never passes parameters in it,
  521. Indeed, but this allows to declare libbase either explicitly
  522. or let the compiler insert it }
  523. else if s='A6' then
  524. paraloc^.reference.offset:=56
  525. { 'A7' is the stack pointer on 68k, can't be overwritten
  526. by API calls, so it has no offset }
  527. else
  528. exit;
  529. { copy to callee side }
  530. p.paraloc[calleeside].add_location^:=paraloc^;
  531. end;
  532. else
  533. internalerror(200404182);
  534. end;
  535. result:=true;
  536. end;
  537. begin
  538. paramanager:=tppcparamanager.create;
  539. end.
  540. {
  541. $Log$
  542. Revision 1.70 2004-11-14 16:26:29 florian
  543. * fixed morphos syscall
  544. Revision 1.69 2004/09/25 20:28:20 florian
  545. * indention fixed
  546. Revision 1.68 2004/09/21 17:25:13 peter
  547. * paraloc branch merged
  548. Revision 1.67.4.3 2004/09/18 20:21:08 jonas
  549. * fixed ppc, but still needs fix in tgobj
  550. Revision 1.67.4.2 2004/09/10 11:10:08 florian
  551. * first part of ppc fixes
  552. Revision 1.67.4.1 2004/08/31 20:43:06 peter
  553. * paraloc patch
  554. Revision 1.67 2004/07/19 19:15:50 florian
  555. * fixed funcret_paraloc writing in units
  556. Revision 1.66 2004/07/17 13:51:57 florian
  557. * function result location for syscalls on MOS hopefully correctly set now
  558. Revision 1.65 2004/07/09 21:45:24 jonas
  559. * fixed passing of fpu paras on the stack
  560. * fixed number of fpu parameters passed in registers
  561. * skip corresponding integer registers when using an fpu register for a
  562. parameter under the AIX abi
  563. Revision 1.64 2004/07/01 18:00:37 jonas
  564. * fix for broken TP-style constructor handling in the compiler
  565. Revision 1.63 2004/06/20 08:55:32 florian
  566. * logs truncated
  567. Revision 1.62 2004/05/01 22:05:02 florian
  568. + added lib support for Amiga/MorphOS syscalls
  569. Revision 1.61 2004/04/18 23:19:48 karoly
  570. * added correct offsets for PowerPC/MorphOS location support
  571. Revision 1.60 2004/04/18 15:22:24 florian
  572. + location support for arguments, currently PowerPC/MorphOS only
  573. Revision 1.59 2004/02/19 17:07:42 florian
  574. * fixed arg. area calculation
  575. Revision 1.58 2004/02/11 23:18:59 florian
  576. * fixed to compile the rtl again
  577. }