cpupara.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. {
  2. $Id$
  3. Copyright (c) 2002 by Florian Klaempfl
  4. Generates the argument location information for i386
  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 bymethodpointer
  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. { Generates the argument location information for i386.
  19. }
  20. unit cpupara;
  21. {$i fpcdefs.inc}
  22. interface
  23. uses
  24. cclasses,globtype,
  25. aasmtai,
  26. cpubase,
  27. cgbase,
  28. symconst,symtype,symdef,paramgr;
  29. type
  30. ti386paramanager = class(tparamanager)
  31. function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;override;
  32. function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
  33. function get_para_align(calloption : tproccalloption):byte;override;
  34. function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
  35. function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
  36. function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
  37. { Returns the location for the nr-st 32 Bit int parameter
  38. if every parameter before is an 32 Bit int parameter as well
  39. and if the calling conventions for the helper routines of the
  40. rtl are used.
  41. }
  42. function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;override;
  43. function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
  44. function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;override;
  45. private
  46. procedure create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
  47. function create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  48. function create_register_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  49. end;
  50. implementation
  51. uses
  52. cutils,
  53. systems,verbose,
  54. defutil,
  55. cpuinfo;
  56. const
  57. parasupregs : array[0..2] of tsuperregister = (RS_EAX,RS_EDX,RS_ECX);
  58. {****************************************************************************
  59. TI386PARAMANAGER
  60. ****************************************************************************}
  61. function ti386paramanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
  62. begin
  63. case target_info.system of
  64. system_i386_win32 :
  65. begin
  66. case def.deftype of
  67. recorddef :
  68. begin
  69. { Win32 GCC returns small records in the FUNCTION_RETURN_REG.
  70. For stdcall we follow delphi instead of GCC }
  71. if (calloption in [pocall_cdecl,pocall_cppdecl]) and
  72. (def.size<=8) then
  73. begin
  74. result:=false;
  75. exit;
  76. end;
  77. end;
  78. end;
  79. end;
  80. end;
  81. result:=inherited ret_in_param(def,calloption);
  82. end;
  83. function ti386paramanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  84. begin
  85. case target_info.system of
  86. system_i386_win32 :
  87. begin
  88. case def.deftype of
  89. recorddef :
  90. begin
  91. { Win32 passes small records on the stack for call by
  92. value }
  93. if (calloption in [pocall_stdcall,pocall_cdecl,pocall_cppdecl]) and
  94. (varspez=vs_value) and
  95. (def.size<=8) then
  96. begin
  97. result:=false;
  98. exit;
  99. end;
  100. end;
  101. arraydef :
  102. begin
  103. { Win32 passes arrays on the stack for call by
  104. value }
  105. if (calloption in [pocall_stdcall,pocall_cdecl,pocall_cppdecl]) and
  106. (varspez=vs_value) and
  107. (tarraydef(def).highrange>=tarraydef(def).lowrange) then
  108. begin
  109. result:=true;
  110. exit;
  111. end;
  112. end;
  113. end;
  114. end;
  115. end;
  116. result:=inherited push_addr_param(varspez,def,calloption);
  117. end;
  118. function ti386paramanager.get_para_align(calloption : tproccalloption):byte;
  119. begin
  120. if calloption=pocall_oldfpccall then
  121. begin
  122. if target_info.system in [system_i386_go32v2,system_i386_watcom] then
  123. result:=2
  124. else
  125. result:=4;
  126. end
  127. else
  128. result:=std_param_align;
  129. end;
  130. function ti386paramanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
  131. begin
  132. case calloption of
  133. pocall_internproc :
  134. result:=[];
  135. pocall_compilerproc :
  136. begin
  137. if pocall_default=pocall_oldfpccall then
  138. result:=[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI,RS_EBX]
  139. else
  140. result:=[RS_EAX,RS_EDX,RS_ECX];
  141. end;
  142. pocall_inline,
  143. pocall_register,
  144. pocall_safecall,
  145. pocall_stdcall,
  146. pocall_cdecl,
  147. pocall_cppdecl :
  148. result:=[RS_EAX,RS_EDX,RS_ECX];
  149. pocall_far16,
  150. pocall_pascal,
  151. pocall_oldfpccall :
  152. result:=[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI,RS_EBX];
  153. else
  154. internalerror(200309071);
  155. end;
  156. end;
  157. function ti386paramanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
  158. begin
  159. result:=[0..first_fpu_imreg-1];
  160. end;
  161. function ti386paramanager.get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;
  162. begin
  163. result:=[0..first_sse_imreg-1];
  164. end;
  165. function ti386paramanager.getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;
  166. begin
  167. fillchar(result,sizeof(tparalocation),0);
  168. result.size:=OS_INT;
  169. result.lochigh:=LOC_INVALID;
  170. result.alignment:=get_para_align(calloption);
  171. if calloption=pocall_register then
  172. begin
  173. if (nr<=high(parasupregs)+1) then
  174. begin
  175. if nr=0 then
  176. internalerror(200309271);
  177. result.loc:=LOC_REGISTER;
  178. result.register:=newreg(R_INTREGISTER,parasupregs[nr-1],R_SUBWHOLE);
  179. end
  180. else
  181. begin
  182. result.loc:=LOC_REFERENCE;
  183. result.reference.index:=NR_STACK_POINTER_REG;
  184. result.reference.offset:=POINTER_SIZE*nr;
  185. end;
  186. end
  187. else
  188. begin
  189. result.loc:=LOC_REFERENCE;
  190. result.reference.index:=NR_STACK_POINTER_REG;
  191. result.reference.offset:=POINTER_SIZE*nr;
  192. end;
  193. end;
  194. procedure ti386paramanager.create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
  195. var
  196. paraloc : tparalocation;
  197. begin
  198. { Function return }
  199. fillchar(paraloc,sizeof(tparalocation),0);
  200. paraloc.size:=def_cgsize(p.rettype.def);
  201. paraloc.lochigh:=LOC_INVALID;
  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. end
  208. else
  209. { Return in register? }
  210. if not ret_in_param(p.rettype.def,p.proccalloption) then
  211. begin
  212. paraloc.loc:=LOC_REGISTER;
  213. {$ifndef cpu64bit}
  214. if paraloc.size in [OS_64,OS_S64] then
  215. begin
  216. paraloc.register64.reglo:=NR_FUNCTION_RETURN64_LOW_REG;
  217. paraloc.register64.reghi:=NR_FUNCTION_RETURN64_HIGH_REG;
  218. end
  219. else
  220. {$endif cpu64bit}
  221. begin
  222. paraloc.register:=NR_FUNCTION_RETURN_REG;
  223. end;
  224. end
  225. else
  226. begin
  227. paraloc.loc:=LOC_REFERENCE;
  228. end;
  229. p.funcret_paraloc[side]:=paraloc;
  230. end;
  231. function ti386paramanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;
  232. var
  233. hp : tparaitem;
  234. paraloc : tparalocation;
  235. l,
  236. varalign,
  237. paraalign,
  238. parasize : longint;
  239. begin
  240. parasize:=0;
  241. paraalign:=get_para_align(p.proccalloption);
  242. { Retrieve last know info from normal parameters }
  243. hp:=tparaitem(p.para.last);
  244. if assigned(hp) then
  245. parasize:=hp.paraloc[callerside].reference.offset;
  246. { Assign varargs }
  247. hp:=tparaitem(varargspara.first);
  248. while assigned(hp) do
  249. begin
  250. paraloc.size:=def_cgsize(hp.paratype.def);
  251. paraloc.loc:=LOC_REFERENCE;
  252. paraloc.lochigh:=LOC_INVALID;
  253. paraloc.alignment:=paraalign;
  254. paraloc.reference.index:=NR_STACK_POINTER_REG;
  255. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  256. varalign:=size_2_align(l);
  257. paraloc.reference.offset:=parasize;
  258. varalign:=used_align(varalign,paraalign,paraalign);
  259. parasize:=align(parasize+l,varalign);
  260. hp.paraloc[callerside]:=paraloc;
  261. hp:=tparaitem(hp.next);
  262. end;
  263. { We need to return the size allocated }
  264. result:=parasize;
  265. end;
  266. function ti386paramanager.create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  267. var
  268. hp : tparaitem;
  269. paraloc : tparalocation;
  270. l,
  271. varalign,
  272. paraalign,
  273. parasize : longint;
  274. begin
  275. parasize:=0;
  276. paraalign:=get_para_align(p.proccalloption);
  277. { we push Flags and CS as long
  278. to cope with the IRETD
  279. and we save 6 register + 4 selectors }
  280. if po_interrupt in p.procoptions then
  281. inc(parasize,8+6*4+4*2);
  282. { Offset is calculated like:
  283. sub esp,12
  284. mov [esp+8],para3
  285. mov [esp+4],para2
  286. mov [esp],para1
  287. call function
  288. That means the for pushes the para with the
  289. highest offset (see para3) needs to be pushed first
  290. }
  291. hp:=tparaitem(p.para.first);
  292. while assigned(hp) do
  293. begin
  294. if hp.paratyp in [vs_var,vs_out] then
  295. paraloc.size:=OS_ADDR
  296. else
  297. paraloc.size:=def_cgsize(hp.paratype.def);
  298. paraloc.loc:=LOC_REFERENCE;
  299. paraloc.lochigh:=LOC_INVALID;
  300. paraloc.alignment:=paraalign;
  301. if side=callerside then
  302. paraloc.reference.index:=NR_STACK_POINTER_REG
  303. else
  304. paraloc.reference.index:=NR_FRAME_POINTER_REG;
  305. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  306. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  307. paraloc.reference.offset:=parasize;
  308. parasize:=align(parasize+l,varalign);
  309. hp.paraloc[side]:=paraloc;
  310. hp:=tparaitem(hp.next);
  311. end;
  312. { Adapt offsets for left-to-right calling }
  313. if p.proccalloption in pushleftright_pocalls then
  314. begin
  315. hp:=tparaitem(p.para.first);
  316. while assigned(hp) do
  317. begin
  318. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  319. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  320. l:=align(l,varalign);
  321. hp.paraloc[side].reference.offset:=parasize-hp.paraloc[side].reference.offset-l;
  322. if side=calleeside then
  323. inc(hp.paraloc[side].reference.offset,target_info.first_parm_offset);
  324. hp:=tparaitem(hp.next);
  325. end;
  326. end
  327. else
  328. begin
  329. { Only need to adapt the callee side to include the
  330. standard stackframe size }
  331. if side=calleeside then
  332. begin
  333. hp:=tparaitem(p.para.first);
  334. while assigned(hp) do
  335. begin
  336. inc(hp.paraloc[side].reference.offset,target_info.first_parm_offset);
  337. hp:=tparaitem(hp.next);
  338. end;
  339. end;
  340. end;
  341. { We need to return the size allocated }
  342. result:=parasize;
  343. end;
  344. function ti386paramanager.create_register_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  345. var
  346. hp : tparaitem;
  347. paraloc : tparalocation;
  348. subreg : tsubregister;
  349. pushaddr,
  350. is_64bit : boolean;
  351. l,parareg,
  352. varalign,
  353. paraalign,
  354. parasize : longint;
  355. begin
  356. parareg:=0;
  357. parasize:=0;
  358. paraalign:=get_para_align(p.proccalloption);
  359. { Register parameters are assigned from left to right }
  360. hp:=tparaitem(p.para.first);
  361. while assigned(hp) do
  362. begin
  363. pushaddr:=push_addr_param(hp.paratyp,hp.paratype.def,p.proccalloption);
  364. if pushaddr then
  365. paraloc.size:=OS_ADDR
  366. else
  367. paraloc.size:=def_cgsize(hp.paratype.def);
  368. paraloc.alignment:=paraalign;
  369. is_64bit:=(paraloc.size in [OS_64,OS_S64,OS_F64]);
  370. {
  371. EAX
  372. EDX
  373. ECX
  374. Stack
  375. Stack
  376. 64bit values,floats,arrays and records are always
  377. on the stack.
  378. }
  379. if (parareg<=high(parasupregs)) and
  380. not(
  381. is_64bit or
  382. ((hp.paratype.def.deftype in [floatdef,recorddef,arraydef]) and
  383. (not pushaddr))
  384. ) then
  385. begin
  386. paraloc.loc:=LOC_REGISTER;
  387. paraloc.lochigh:=LOC_INVALID;
  388. if (paraloc.size=OS_NO) or is_64bit then
  389. subreg:=R_SUBWHOLE
  390. else
  391. subreg:=cgsize2subreg(paraloc.size);
  392. paraloc.alignment:=paraalign;
  393. paraloc.register:=newreg(R_INTREGISTER,parasupregs[parareg],subreg);
  394. inc(parareg);
  395. end
  396. else
  397. begin
  398. paraloc.loc:=LOC_REFERENCE;
  399. paraloc.lochigh:=LOC_INVALID;
  400. if side=callerside then
  401. paraloc.reference.index:=NR_STACK_POINTER_REG
  402. else
  403. paraloc.reference.index:=NR_FRAME_POINTER_REG;
  404. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  405. varalign:=size_2_align(l);
  406. paraloc.reference.offset:=parasize;
  407. varalign:=used_align(varalign,paraalign,paraalign);
  408. parasize:=align(parasize+l,varalign);
  409. end;
  410. hp.paraloc[side]:=paraloc;
  411. hp:=tparaitem(hp.next);
  412. end;
  413. { Register parameters are assigned from left-to-right, adapt offset
  414. for calleeside to be reversed }
  415. hp:=tparaitem(p.para.first);
  416. while assigned(hp) do
  417. begin
  418. if (hp.paraloc[side].loc=LOC_REFERENCE) then
  419. begin
  420. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  421. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  422. l:=align(l,varalign);
  423. hp.paraloc[side].reference.offset:=parasize-hp.paraloc[side].reference.offset-l;
  424. if side=calleeside then
  425. inc(hp.paraloc[side].reference.offset,target_info.first_parm_offset);
  426. end;
  427. hp:=tparaitem(hp.next);
  428. end;
  429. { We need to return the size allocated }
  430. result:=parasize;
  431. end;
  432. function ti386paramanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  433. begin
  434. result:=0;
  435. case p.proccalloption of
  436. pocall_register :
  437. result:=create_register_paraloc_info(p,side);
  438. pocall_inline,
  439. pocall_compilerproc,
  440. pocall_internproc :
  441. begin
  442. { Use default calling }
  443. if (pocall_default=pocall_register) then
  444. result:=create_register_paraloc_info(p,side)
  445. else
  446. result:=create_stdcall_paraloc_info(p,side);
  447. end;
  448. else
  449. result:=create_stdcall_paraloc_info(p,side);
  450. end;
  451. create_funcret_paraloc_info(p,side);
  452. end;
  453. begin
  454. paramanager:=ti386paramanager.create;
  455. end.
  456. {
  457. $Log$
  458. Revision 1.50 2004-02-09 22:14:17 peter
  459. * more x86_64 parameter fixes
  460. * tparalocation.lochigh is now used to indicate if registerhigh
  461. is used and what the type is
  462. Revision 1.49 2004/02/05 18:28:37 peter
  463. * x86_64 fixes for opsize
  464. Revision 1.48 2003/12/28 22:09:12 florian
  465. + setting of bit 6 of cr for c var args on ppc implemented
  466. Revision 1.47 2003/12/03 23:13:20 peter
  467. * delayed paraloc allocation, a_param_*() gets extra parameter
  468. if it needs to allocate temp or real paralocation
  469. * optimized/simplified int-real loading
  470. Revision 1.46 2003/12/01 18:44:15 peter
  471. * fixed some crashes
  472. * fixed varargs and register calling probs
  473. Revision 1.45 2003/11/28 17:24:22 peter
  474. * reversed offset calculation for caller side so it works
  475. correctly for interfaces
  476. Revision 1.44 2003/11/23 17:05:16 peter
  477. * register calling is left-right
  478. * parameter ordering
  479. * left-right calling inserts result parameter last
  480. Revision 1.43 2003/11/11 21:11:23 peter
  481. * check for push_addr
  482. Revision 1.42 2003/10/19 01:34:30 florian
  483. * some ppc stuff fixed
  484. * memory leak fixed
  485. Revision 1.41 2003/10/17 14:38:32 peter
  486. * 64k registers supported
  487. * fixed some memory leaks
  488. Revision 1.40 2003/10/11 16:06:42 florian
  489. * fixed some MMX<->SSE
  490. * started to fix ppc, needs an overhaul
  491. + stabs info improve for spilling, not sure if it works correctly/completly
  492. - MMX_SUPPORT removed from Makefile.fpc
  493. Revision 1.39 2003/10/10 17:48:14 peter
  494. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  495. * tregisteralloctor renamed to trgobj
  496. * removed rgobj from a lot of units
  497. * moved location_* and reference_* to cgobj
  498. * first things for mmx register allocation
  499. Revision 1.38 2003/10/07 15:17:07 peter
  500. * inline supported again, LOC_REFERENCEs are used to pass the
  501. parameters
  502. * inlineparasymtable,inlinelocalsymtable removed
  503. * exitlabel inserting fixed
  504. Revision 1.37 2003/10/05 21:21:52 peter
  505. * c style array of const generates callparanodes
  506. * varargs paraloc fixes
  507. Revision 1.36 2003/10/03 22:00:33 peter
  508. * parameter alignment fixes
  509. Revision 1.35 2003/10/01 20:34:49 peter
  510. * procinfo unit contains tprocinfo
  511. * cginfo renamed to cgbase
  512. * moved cgmessage to verbose
  513. * fixed ppc and sparc compiles
  514. Revision 1.34 2003/09/30 21:02:37 peter
  515. * updates for inlining
  516. Revision 1.33 2003/09/28 17:55:04 peter
  517. * parent framepointer changed to hidden parameter
  518. * tloadparentfpnode added
  519. Revision 1.32 2003/09/28 13:35:24 peter
  520. * register calling updates
  521. Revision 1.31 2003/09/25 21:30:11 peter
  522. * parameter fixes
  523. Revision 1.30 2003/09/23 17:56:06 peter
  524. * locals and paras are allocated in the code generation
  525. * tvarsym.localloc contains the location of para/local when
  526. generating code for the current procedure
  527. Revision 1.29 2003/09/16 16:17:01 peter
  528. * varspez in calls to push_addr_param
  529. Revision 1.28 2003/09/10 08:31:47 marco
  530. * Patch from Peter for paraloc
  531. Revision 1.27 2003/09/09 21:03:17 peter
  532. * basics for x86 register calling
  533. Revision 1.26 2003/09/09 15:55:05 peter
  534. * winapi doesn't like pushing 8 byte record
  535. Revision 1.25 2003/09/08 18:28:51 peter
  536. * fix compilerproc for default=oldfpccall
  537. Revision 1.24 2003/09/07 22:09:35 peter
  538. * preparations for different default calling conventions
  539. * various RA fixes
  540. Revision 1.23 2003/09/03 15:55:01 peter
  541. * NEWRA branch merged
  542. Revision 1.22.2.2 2003/08/28 18:35:08 peter
  543. * tregister changed to cardinal
  544. Revision 1.22.2.1 2003/08/27 19:55:54 peter
  545. * first tregister patch
  546. Revision 1.22 2003/08/11 21:18:20 peter
  547. * start of sparc support for newra
  548. Revision 1.21 2003/07/05 20:11:41 jonas
  549. * create_paraloc_info() is now called separately for the caller and
  550. callee info
  551. * fixed ppc cycle
  552. Revision 1.20 2003/07/02 22:18:04 peter
  553. * paraloc splitted in callerparaloc,calleeparaloc
  554. * sparc calling convention updates
  555. Revision 1.19 2003/06/17 16:34:19 peter
  556. * freeintparaloc added
  557. Revision 1.18 2003/06/07 18:57:04 jonas
  558. + added freeintparaloc
  559. * ppc get/freeintparaloc now check whether the parameter regs are
  560. properly allocated/deallocated (and get an extra list para)
  561. * ppc a_call_* now internalerrors if pi_do_call is not yet set
  562. * fixed lot of missing pi_do_call's
  563. Revision 1.17 2003/06/06 14:41:22 peter
  564. * needs cpuinfo
  565. Revision 1.16 2003/06/06 07:36:06 michael
  566. + Forgot a line in patch from peter
  567. Revision 1.15 2003/06/06 07:35:14 michael
  568. + Patch to Patch from peter
  569. Revision 1.14 2003/06/06 07:34:11 michael
  570. + Patch from peter
  571. Revision 1.13 2003/06/05 20:58:05 peter
  572. * updated
  573. Revision 1.12 2003/05/30 23:57:08 peter
  574. * more sparc cleanup
  575. * accumulator removed, splitted in function_return_reg (called) and
  576. function_result_reg (caller)
  577. Revision 1.11 2003/05/13 15:16:13 peter
  578. * removed ret_in_acc, it's the reverse of ret_in_param
  579. * fixed ret_in_param for win32 cdecl array
  580. Revision 1.10 2003/04/22 23:50:23 peter
  581. * firstpass uses expectloc
  582. * checks if there are differences between the expectloc and
  583. location.loc from secondpass in EXTDEBUG
  584. Revision 1.9 2003/04/22 14:33:38 peter
  585. * removed some notes/hints
  586. Revision 1.8 2003/01/08 18:43:57 daniel
  587. * Tregister changed into a record
  588. Revision 1.7 2002/12/24 15:56:50 peter
  589. * stackpointer_alloc added for adjusting ESP. Win32 needs
  590. this for the pageprotection
  591. Revision 1.6 2002/12/17 22:19:33 peter
  592. * fixed pushing of records>8 bytes with stdcall
  593. * simplified hightree loading
  594. Revision 1.5 2002/11/18 17:32:00 peter
  595. * pass proccalloption to ret_in_xxx and push_xxx functions
  596. Revision 1.4 2002/11/15 01:58:56 peter
  597. * merged changes from 1.0.7 up to 04-11
  598. - -V option for generating bug report tracing
  599. - more tracing for option parsing
  600. - errors for cdecl and high()
  601. - win32 import stabs
  602. - win32 records<=8 are returned in eax:edx (turned off by default)
  603. - heaptrc update
  604. - more info for temp management in .s file with EXTDEBUG
  605. Revision 1.3 2002/08/09 07:33:04 florian
  606. * a couple of interface related fixes
  607. Revision 1.2 2002/07/11 14:41:32 florian
  608. * start of the new generic parameter handling
  609. Revision 1.1 2002/07/07 09:52:33 florian
  610. * powerpc target fixed, very simple units can be compiled
  611. * some basic stuff for better callparanode handling, far from being finished
  612. }