cpupara.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  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,symsym,
  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:tvarargsparalist):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; paras:tlist;
  40. var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
  41. function parseparaloc(p : tparavarsym;const s : string) : boolean;override;
  42. end;
  43. implementation
  44. uses
  45. verbose,systems,
  46. procinfo,
  47. rgobj,
  48. defutil,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,p.paras,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; paras:tlist;
  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. i : integer;
  266. hp : tparavarsym;
  267. loc : tcgloc;
  268. paracgsize: tcgsize;
  269. is_64bit: boolean;
  270. procedure assignintreg;
  271. begin
  272. if nextintreg<=ord(NR_R10) then
  273. begin
  274. paraloc^.loc:=LOC_REGISTER;
  275. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  276. inc(nextintreg);
  277. if target_info.abi=abi_powerpc_aix then
  278. inc(stack_offset,4);
  279. end
  280. else
  281. begin
  282. paraloc^.loc:=LOC_REFERENCE;
  283. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  284. paraloc^.reference.offset:=stack_offset;
  285. inc(stack_offset,4);
  286. end;
  287. end;
  288. begin
  289. {$ifdef extdebug}
  290. if po_explicitparaloc in p.procoptions then
  291. internalerror(200411141);
  292. {$endif extdebug}
  293. result:=0;
  294. nextintreg := curintreg;
  295. nextfloatreg := curfloatreg;
  296. nextmmreg := curmmreg;
  297. stack_offset := cur_stack_offset;
  298. case target_info.abi of
  299. abi_powerpc_aix:
  300. maxfpureg := RS_F13;
  301. abi_powerpc_sysv:
  302. maxfpureg := RS_F8;
  303. else internalerror(2004070912);
  304. end;
  305. for i:=0 to paras.count-1 do
  306. begin
  307. hp:=tparavarsym(paras[i]);
  308. hp.paraloc[side].reset;
  309. { currently only support C-style array of const }
  310. if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
  311. is_array_of_const(hp.vartype.def) then
  312. begin
  313. paraloc:=hp.paraloc[side].add_location;
  314. { hack: the paraloc must be valid, but is not actually used }
  315. paraloc^.loc := LOC_REGISTER;
  316. paraloc^.register := NR_R0;
  317. paraloc^.size := OS_ADDR;
  318. break;
  319. end;
  320. if (hp.varspez in [vs_var,vs_out]) then
  321. begin
  322. paradef:=voidpointertype.def;
  323. loc:=LOC_REGISTER;
  324. paracgsize := OS_ADDR;
  325. end
  326. else
  327. begin
  328. paradef := hp.vartype.def;
  329. loc:=getparaloc(paradef);
  330. paracgsize:=def_cgsize(paradef);
  331. { for things like formaldef }
  332. if paracgsize=OS_NO then
  333. paracgsize:=OS_ADDR;
  334. end;
  335. hp.paraloc[side].alignment:=std_param_align;
  336. hp.paraloc[side].size:=paracgsize;
  337. { First location }
  338. paraloc:=hp.paraloc[side].add_location;
  339. paraloc^.size:=paracgsize;
  340. case loc of
  341. LOC_REGISTER:
  342. begin
  343. is_64bit:=paraloc^.size in [OS_64,OS_S64];
  344. if nextintreg<=(RS_R10-ord(is_64bit)) then
  345. begin
  346. paraloc^.loc:=LOC_REGISTER;
  347. {$ifndef cpu64bit}
  348. if is_64bit then
  349. begin
  350. if odd(nextintreg-RS_R3) and (target_info.abi=abi_powerpc_sysv) Then
  351. inc(nextintreg);
  352. paraloc^.size:=OS_32;
  353. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  354. inc(nextintreg);
  355. paraloc2:=hp.paraloc[side].add_location;
  356. paraloc2^.loc:=LOC_REGISTER;
  357. paraloc2^.size:=OS_32;
  358. paraloc2^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  359. inc(nextintreg);
  360. if target_info.abi=abi_powerpc_aix then
  361. inc(stack_offset,8);
  362. end
  363. else
  364. {$endif cpu64bit}
  365. begin
  366. paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBNONE);
  367. inc(nextintreg);
  368. if target_info.abi=abi_powerpc_aix then
  369. inc(stack_offset,sizeof(aword));
  370. end;
  371. end
  372. else
  373. begin
  374. nextintreg:=RS_R11;
  375. paraloc^.loc:=LOC_REFERENCE;
  376. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  377. paraloc^.reference.offset:=stack_offset;
  378. if not is_64bit then
  379. inc(stack_offset,4)
  380. else
  381. inc(stack_offset,8);
  382. end;
  383. end;
  384. LOC_FPUREGISTER:
  385. begin
  386. if nextfloatreg<=maxfpureg then
  387. begin
  388. paraloc^.loc:=LOC_FPUREGISTER;
  389. paraloc^.register:=newreg(R_FPUREGISTER,nextfloatreg,R_SUBWHOLE);
  390. inc(nextfloatreg);
  391. end
  392. else
  393. begin
  394. paraloc^.loc:=LOC_REFERENCE;
  395. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  396. paraloc^.reference.offset:=stack_offset;
  397. end;
  398. if target_info.abi=abi_powerpc_aix then
  399. begin
  400. if paraloc^.size = OS_F32 then
  401. begin
  402. inc(stack_offset,4);
  403. if (nextintreg < RS_R11) then
  404. inc(nextintreg);
  405. end
  406. else
  407. begin
  408. inc(stack_offset,8);
  409. if (nextintreg < RS_R10) then
  410. inc(nextintreg,2)
  411. else
  412. nextintreg := RS_R11;
  413. end;
  414. end;
  415. end;
  416. LOC_REFERENCE:
  417. begin
  418. paraloc^.size:=OS_ADDR;
  419. if push_addr_param(hp.varspez,paradef,p.proccalloption) or
  420. is_open_array(paradef) or
  421. is_array_of_const(paradef) then
  422. assignintreg
  423. else
  424. begin
  425. paraloc^.loc:=LOC_REFERENCE;
  426. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  427. paraloc^.reference.offset:=stack_offset;
  428. inc(stack_offset,hp.vartype.def.size);
  429. end;
  430. end;
  431. else
  432. internalerror(2002071002);
  433. end;
  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:tvarargsparalist):longint;
  442. var
  443. cur_stack_offset: aword;
  444. parasize, l: longint;
  445. curintreg, firstfloatreg, curfloatreg, curmmreg: tsuperregister;
  446. i : integer;
  447. hp: tparavarsym;
  448. paraloc: pcgparalocation;
  449. begin
  450. init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
  451. firstfloatreg:=curfloatreg;
  452. result:=create_paraloc_info_intern(p,callerside,p.paras,curintreg,curfloatreg,curmmreg,cur_stack_offset);
  453. if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
  454. { just continue loading the parameters in the registers }
  455. result:=create_paraloc_info_intern(p,callerside,varargspara,curintreg,curfloatreg,curmmreg,cur_stack_offset)
  456. else
  457. begin
  458. parasize:=cur_stack_offset;
  459. for i:=0 to varargspara.count-1 do
  460. begin
  461. hp:=tparavarsym(varargspara[i]);
  462. hp.paraloc[callerside].alignment:=4;
  463. paraloc:=hp.paraloc[callerside].add_location;
  464. paraloc^.loc:=LOC_REFERENCE;
  465. paraloc^.size:=def_cgsize(hp.vartype.def);
  466. paraloc^.reference.index:=NR_STACK_POINTER_REG;
  467. l:=push_size(hp.varspez,hp.vartype.def,p.proccalloption);
  468. paraloc^.reference.offset:=parasize;
  469. parasize:=parasize+l;
  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 : tparavarsym;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.vartype.def);
  486. paraloc:=p.paraloc[callerside].add_location;
  487. paraloc^.loc:=LOC_REFERENCE;
  488. paraloc^.size:=def_cgsize(p.vartype.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.71 2004-11-15 23:35:31 peter
  543. * tparaitem removed, use tparavarsym instead
  544. * parameter order is now calculated from paranr value in tparavarsym
  545. Revision 1.70 2004/11/14 16:26:29 florian
  546. * fixed morphos syscall
  547. Revision 1.69 2004/09/25 20:28:20 florian
  548. * indention fixed
  549. Revision 1.68 2004/09/21 17:25:13 peter
  550. * paraloc branch merged
  551. Revision 1.67.4.3 2004/09/18 20:21:08 jonas
  552. * fixed ppc, but still needs fix in tgobj
  553. Revision 1.67.4.2 2004/09/10 11:10:08 florian
  554. * first part of ppc fixes
  555. Revision 1.67.4.1 2004/08/31 20:43:06 peter
  556. * paraloc patch
  557. Revision 1.67 2004/07/19 19:15:50 florian
  558. * fixed funcret_paraloc writing in units
  559. Revision 1.66 2004/07/17 13:51:57 florian
  560. * function result location for syscalls on MOS hopefully correctly set now
  561. Revision 1.65 2004/07/09 21:45:24 jonas
  562. * fixed passing of fpu paras on the stack
  563. * fixed number of fpu parameters passed in registers
  564. * skip corresponding integer registers when using an fpu register for a
  565. parameter under the AIX abi
  566. Revision 1.64 2004/07/01 18:00:37 jonas
  567. * fix for broken TP-style constructor handling in the compiler
  568. Revision 1.63 2004/06/20 08:55:32 florian
  569. * logs truncated
  570. Revision 1.62 2004/05/01 22:05:02 florian
  571. + added lib support for Amiga/MorphOS syscalls
  572. Revision 1.61 2004/04/18 23:19:48 karoly
  573. * added correct offsets for PowerPC/MorphOS location support
  574. Revision 1.60 2004/04/18 15:22:24 florian
  575. + location support for arguments, currently PowerPC/MorphOS only
  576. Revision 1.59 2004/02/19 17:07:42 florian
  577. * fixed arg. area calculation
  578. Revision 1.58 2004/02/11 23:18:59 florian
  579. * fixed to compile the rtl again
  580. }