cpupara.pas 25 KB

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