cpupara.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  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. result:=0;
  289. nextintreg := curintreg;
  290. nextfloatreg := curfloatreg;
  291. nextmmreg := curmmreg;
  292. stack_offset := cur_stack_offset;
  293. case target_info.abi of
  294. abi_powerpc_aix:
  295. maxfpureg := RS_F13;
  296. abi_powerpc_sysv:
  297. maxfpureg := RS_F8;
  298. else internalerror(2004070912);
  299. end;
  300. hp:=firstpara;
  301. while assigned(hp) do
  302. begin
  303. hp.paraloc[side].reset;
  304. { currently only support C-style array of const }
  305. if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
  306. is_array_of_const(hp.paratype.def) then
  307. begin
  308. paraloc:=hp.paraloc[side].add_location;
  309. { hack: the paraloc must be valid, but is not actually used }
  310. paraloc^.loc := LOC_REGISTER;
  311. paraloc^.register := NR_R0;
  312. paraloc^.size := OS_ADDR;
  313. break;
  314. end;
  315. if (hp.paratyp in [vs_var,vs_out]) then
  316. begin
  317. paradef:=voidpointertype.def;
  318. loc:=LOC_REGISTER;
  319. paracgsize := OS_ADDR;
  320. end
  321. else
  322. begin
  323. paradef := hp.paratype.def;
  324. loc:=getparaloc(paradef);
  325. paracgsize:=def_cgsize(paradef);
  326. { for things like formaldef }
  327. if paracgsize=OS_NO then
  328. paracgsize:=OS_ADDR;
  329. end;
  330. hp.paraloc[side].alignment:=std_param_align;
  331. hp.paraloc[side].size:=paracgsize;
  332. { First location }
  333. paraloc:=hp.paraloc[side].add_location;
  334. paraloc^.size:=paracgsize;
  335. case loc of
  336. LOC_REGISTER:
  337. begin
  338. is_64bit:=paraloc^.size in [OS_64,OS_S64];
  339. if nextintreg<=(RS_R10-ord(is_64bit)) then
  340. begin
  341. paraloc^.loc:=LOC_REGISTER;
  342. {$ifndef cpu64bit}
  343. if is_64bit then
  344. begin
  345. if odd(nextintreg-RS_R3) and (target_info.abi=abi_powerpc_sysv) Then
  346. inc(nextintreg);
  347. paraloc^.size:=OS_32;
  348. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  349. inc(nextintreg);
  350. paraloc2:=hp.paraloc[side].add_location;
  351. paraloc2^.loc:=LOC_REGISTER;
  352. paraloc2^.size:=OS_32;
  353. paraloc2^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  354. inc(nextintreg);
  355. if target_info.abi=abi_powerpc_aix then
  356. inc(stack_offset,8);
  357. end
  358. else
  359. {$endif cpu64bit}
  360. begin
  361. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  362. inc(nextintreg);
  363. if target_info.abi=abi_powerpc_aix then
  364. inc(stack_offset,sizeof(aword));
  365. end;
  366. end
  367. else
  368. begin
  369. nextintreg:=RS_R11;
  370. paraloc^.loc:=LOC_REFERENCE;
  371. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  372. paraloc^.reference.offset:=stack_offset;
  373. if not is_64bit then
  374. inc(stack_offset,4)
  375. else
  376. inc(stack_offset,8);
  377. end;
  378. end;
  379. LOC_FPUREGISTER:
  380. begin
  381. if nextfloatreg<=maxfpureg then
  382. begin
  383. paraloc^.loc:=LOC_FPUREGISTER;
  384. paraloc^.register:=newreg(R_FPUREGISTER,nextfloatreg,R_SUBWHOLE);
  385. inc(nextfloatreg);
  386. end
  387. else
  388. begin
  389. paraloc^.loc:=LOC_REFERENCE;
  390. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  391. paraloc^.reference.offset:=stack_offset;
  392. end;
  393. if target_info.abi=abi_powerpc_aix then
  394. begin
  395. if paraloc^.size = OS_F32 then
  396. begin
  397. inc(stack_offset,4);
  398. if (nextintreg < RS_R11) then
  399. inc(nextintreg);
  400. end
  401. else
  402. begin
  403. inc(stack_offset,8);
  404. if (nextintreg < RS_R10) then
  405. inc(nextintreg,2)
  406. else
  407. nextintreg := RS_R11;
  408. end;
  409. end;
  410. end;
  411. LOC_REFERENCE:
  412. begin
  413. paraloc^.size:=OS_ADDR;
  414. if push_addr_param(hp.paratyp,paradef,p.proccalloption) or
  415. is_open_array(paradef) or
  416. is_array_of_const(paradef) then
  417. assignintreg
  418. else
  419. begin
  420. paraloc^.loc:=LOC_REFERENCE;
  421. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  422. paraloc^.reference.offset:=stack_offset;
  423. inc(stack_offset,hp.paratype.def.size);
  424. end;
  425. end;
  426. else
  427. internalerror(2002071002);
  428. end;
  429. hp:=tparaitem(hp.next);
  430. end;
  431. curintreg:=nextintreg;
  432. curfloatreg:=nextfloatreg;
  433. curmmreg:=nextmmreg;
  434. cur_stack_offset:=stack_offset;
  435. result:=cur_stack_offset;
  436. end;
  437. function tppcparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;
  438. var
  439. cur_stack_offset: aword;
  440. parasize, l: longint;
  441. curintreg, firstfloatreg, curfloatreg, curmmreg: tsuperregister;
  442. hp: tparaitem;
  443. paraloc: pcgparalocation;
  444. begin
  445. init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
  446. firstfloatreg:=curfloatreg;
  447. result:=create_paraloc_info_intern(p,callerside,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
  448. if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
  449. { just continue loading the parameters in the registers }
  450. result:=create_paraloc_info_intern(p,callerside,tparaitem(varargspara.first),curintreg,curfloatreg,curmmreg,cur_stack_offset)
  451. else
  452. begin
  453. hp:=tparaitem(varargspara.first);
  454. parasize:=cur_stack_offset;
  455. while assigned(hp) do
  456. begin
  457. hp.paraloc[callerside].alignment:=4;
  458. paraloc:=hp.paraloc[callerside].add_location;
  459. paraloc^.loc:=LOC_REFERENCE;
  460. paraloc^.size:=def_cgsize(hp.paratype.def);
  461. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  462. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  463. paraloc^.reference.offset:=parasize;
  464. parasize:=parasize+l;
  465. hp:=tparaitem(hp.next);
  466. end;
  467. result:=parasize;
  468. end;
  469. if curfloatreg<>firstfloatreg then
  470. include(varargspara.varargsinfo,va_uses_float_reg);
  471. end;
  472. function tppcparamanager.parseparaloc(p : tparaitem;const s : string) : boolean;
  473. var
  474. paraloc : pcgparalocation;
  475. begin
  476. result:=false;
  477. case target_info.system of
  478. system_powerpc_morphos:
  479. begin
  480. p.paraloc[callerside].alignment:=4;
  481. paraloc:=p.paraloc[callerside].add_location;
  482. paraloc^.loc:=LOC_REFERENCE;
  483. paraloc^.size:=def_cgsize(p.paratype.def);
  484. paraloc^.reference.index:=NR_R2;
  485. { pattern is always uppercase'd }
  486. if s='D0' then
  487. paraloc^.reference.offset:=0
  488. else if s='D1' then
  489. paraloc^.reference.offset:=4
  490. else if s='D2' then
  491. paraloc^.reference.offset:=8
  492. else if s='D3' then
  493. paraloc^.reference.offset:=12
  494. else if s='D4' then
  495. paraloc^.reference.offset:=16
  496. else if s='D5' then
  497. paraloc^.reference.offset:=20
  498. else if s='D6' then
  499. paraloc^.reference.offset:=24
  500. else if s='D7' then
  501. paraloc^.reference.offset:=28
  502. else if s='A0' then
  503. paraloc^.reference.offset:=32
  504. else if s='A1' then
  505. paraloc^.reference.offset:=36
  506. else if s='A2' then
  507. paraloc^.reference.offset:=40
  508. else if s='A3' then
  509. paraloc^.reference.offset:=44
  510. else if s='A4' then
  511. paraloc^.reference.offset:=48
  512. else if s='A5' then
  513. paraloc^.reference.offset:=52
  514. { 'A6' (offset 56) is used by mossyscall as libbase, so API
  515. never passes parameters in it,
  516. Indeed, but this allows to declare libbase either explicitly
  517. or let the compiler insert it }
  518. else if s='A6' then
  519. paraloc^.reference.offset:=56
  520. { 'A7' is the stack pointer on 68k, can't be overwritten
  521. by API calls, so it has no offset }
  522. else
  523. exit;
  524. { copy to callee side }
  525. p.paraloc[calleeside].add_location^:=paraloc^;
  526. end;
  527. else
  528. internalerror(200404182);
  529. end;
  530. result:=true;
  531. end;
  532. begin
  533. paramanager:=tppcparamanager.create;
  534. end.
  535. {
  536. $Log$
  537. Revision 1.69 2004-09-25 20:28:20 florian
  538. * indention fixed
  539. Revision 1.68 2004/09/21 17:25:13 peter
  540. * paraloc branch merged
  541. Revision 1.67.4.3 2004/09/18 20:21:08 jonas
  542. * fixed ppc, but still needs fix in tgobj
  543. Revision 1.67.4.2 2004/09/10 11:10:08 florian
  544. * first part of ppc fixes
  545. Revision 1.67.4.1 2004/08/31 20:43:06 peter
  546. * paraloc patch
  547. Revision 1.67 2004/07/19 19:15:50 florian
  548. * fixed funcret_paraloc writing in units
  549. Revision 1.66 2004/07/17 13:51:57 florian
  550. * function result location for syscalls on MOS hopefully correctly set now
  551. Revision 1.65 2004/07/09 21:45:24 jonas
  552. * fixed passing of fpu paras on the stack
  553. * fixed number of fpu parameters passed in registers
  554. * skip corresponding integer registers when using an fpu register for a
  555. parameter under the AIX abi
  556. Revision 1.64 2004/07/01 18:00:37 jonas
  557. * fix for broken TP-style constructor handling in the compiler
  558. Revision 1.63 2004/06/20 08:55:32 florian
  559. * logs truncated
  560. Revision 1.62 2004/05/01 22:05:02 florian
  561. + added lib support for Amiga/MorphOS syscalls
  562. Revision 1.61 2004/04/18 23:19:48 karoly
  563. * added correct offsets for PowerPC/MorphOS location support
  564. Revision 1.60 2004/04/18 15:22:24 florian
  565. + location support for arguments, currently PowerPC/MorphOS only
  566. Revision 1.59 2004/02/19 17:07:42 florian
  567. * fixed arg. area calculation
  568. Revision 1.58 2004/02/11 23:18:59 florian
  569. * fixed to compile the rtl again
  570. }