cpupara.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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. unit cpupara;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. globtype,
  23. aasmtai,cpubase,cgbase,
  24. symconst,symtype,symsym,symdef,
  25. parabase,paramgr;
  26. type
  27. ti386paramanager = class(tparamanager)
  28. function param_use_paraloc(const cgpara:tcgpara):boolean;override;
  29. function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;override;
  30. function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
  31. function get_para_align(calloption : tproccalloption):byte;override;
  32. function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
  33. function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
  34. function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
  35. { Returns the location for the nr-st 32 Bit int parameter
  36. if every parameter before is an 32 Bit int parameter as well
  37. and if the calling conventions for the helper routines of the
  38. rtl are used.
  39. }
  40. procedure getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);override;
  41. function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
  42. function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override;
  43. procedure createtempparaloc(list: taasmoutput;calloption : tproccalloption;parasym : tparavarsym;var cgpara:TCGPara);override;
  44. private
  45. procedure create_funcretloc_info(p : tabstractprocdef; side: tcallercallee);
  46. procedure create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee;paras:tparalist;var parasize:longint);
  47. procedure create_register_paraloc_info(p : tabstractprocdef; side: tcallercallee;paras:tparalist;var parareg,parasize:longint);
  48. end;
  49. implementation
  50. uses
  51. cutils,
  52. systems,verbose,
  53. defutil,
  54. cgutils;
  55. const
  56. parasupregs : array[0..2] of tsuperregister = (RS_EAX,RS_EDX,RS_ECX);
  57. {****************************************************************************
  58. TI386PARAMANAGER
  59. ****************************************************************************}
  60. function ti386paramanager.param_use_paraloc(const cgpara:tcgpara):boolean;
  61. var
  62. paraloc : pcgparalocation;
  63. begin
  64. if not assigned(cgpara.location) then
  65. internalerror(200410102);
  66. result:=true;
  67. { All locations are LOC_REFERENCE }
  68. paraloc:=cgpara.location;
  69. while assigned(paraloc) do
  70. begin
  71. if (paraloc^.loc<>LOC_REFERENCE) then
  72. result:=false;
  73. paraloc:=paraloc^.next;
  74. end;
  75. end;
  76. function ti386paramanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
  77. begin
  78. case target_info.system of
  79. system_i386_win32 :
  80. begin
  81. case def.deftype of
  82. recorddef :
  83. begin
  84. { Win32 GCC returns small records in the FUNCTION_RETURN_REG.
  85. For stdcall we follow delphi instead of GCC }
  86. if (calloption in [pocall_cdecl,pocall_cppdecl]) and
  87. (def.size<=8) then
  88. begin
  89. result:=false;
  90. exit;
  91. end;
  92. end;
  93. end;
  94. end;
  95. end;
  96. result:=inherited ret_in_param(def,calloption);
  97. end;
  98. function ti386paramanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  99. begin
  100. case target_info.system of
  101. system_i386_win32 :
  102. begin
  103. case def.deftype of
  104. recorddef :
  105. begin
  106. { Win32 passes small records on the stack for call by
  107. value }
  108. if (calloption in [pocall_stdcall,pocall_cdecl,pocall_cppdecl]) and
  109. (varspez=vs_value) and
  110. (def.size<=8) then
  111. begin
  112. result:=false;
  113. exit;
  114. end;
  115. end;
  116. arraydef :
  117. begin
  118. { Win32 passes arrays on the stack for call by
  119. value }
  120. if (calloption in [pocall_stdcall,pocall_cdecl,pocall_cppdecl]) and
  121. (varspez=vs_value) and
  122. (tarraydef(def).highrange>=tarraydef(def).lowrange) then
  123. begin
  124. result:=false;
  125. exit;
  126. end;
  127. end;
  128. end;
  129. end;
  130. end;
  131. result:=inherited push_addr_param(varspez,def,calloption);
  132. end;
  133. function ti386paramanager.get_para_align(calloption : tproccalloption):byte;
  134. begin
  135. if calloption=pocall_oldfpccall then
  136. begin
  137. if target_info.system in [system_i386_go32v2,system_i386_watcom] then
  138. result:=2
  139. else
  140. result:=4;
  141. end
  142. else
  143. result:=std_param_align;
  144. end;
  145. function ti386paramanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
  146. begin
  147. case calloption of
  148. pocall_internproc :
  149. result:=[];
  150. pocall_compilerproc :
  151. begin
  152. if pocall_default=pocall_oldfpccall then
  153. result:=[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI,RS_EBX]
  154. else
  155. result:=[RS_EAX,RS_EDX,RS_ECX];
  156. end;
  157. pocall_inline,
  158. pocall_register,
  159. pocall_safecall,
  160. pocall_stdcall,
  161. pocall_cdecl,
  162. pocall_cppdecl :
  163. result:=[RS_EAX,RS_EDX,RS_ECX];
  164. pocall_far16,
  165. pocall_pascal,
  166. pocall_oldfpccall :
  167. result:=[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI,RS_EBX];
  168. else
  169. internalerror(200309071);
  170. end;
  171. end;
  172. function ti386paramanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
  173. begin
  174. result:=[0..first_fpu_imreg-1];
  175. end;
  176. function ti386paramanager.get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;
  177. begin
  178. result:=[0..first_mm_imreg-1];
  179. end;
  180. procedure ti386paramanager.getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);
  181. var
  182. paraloc : pcgparalocation;
  183. begin
  184. cgpara.reset;
  185. cgpara.size:=OS_INT;
  186. cgpara.intsize:=tcgsize2size[OS_INT];
  187. cgpara.alignment:=get_para_align(calloption);
  188. paraloc:=cgpara.add_location;
  189. with paraloc^ do
  190. begin
  191. size:=OS_INT;
  192. if calloption=pocall_register then
  193. begin
  194. if (nr<=high(parasupregs)+1) then
  195. begin
  196. if nr=0 then
  197. internalerror(200309271);
  198. loc:=LOC_REGISTER;
  199. register:=newreg(R_INTREGISTER,parasupregs[nr-1],R_SUBWHOLE);
  200. end
  201. else
  202. begin
  203. loc:=LOC_REFERENCE;
  204. reference.index:=NR_STACK_POINTER_REG;
  205. reference.offset:=sizeof(aint)*nr;
  206. end;
  207. end
  208. else
  209. begin
  210. loc:=LOC_REFERENCE;
  211. reference.index:=NR_STACK_POINTER_REG;
  212. reference.offset:=sizeof(aint)*nr;
  213. end;
  214. end;
  215. end;
  216. procedure ti386paramanager.create_funcretloc_info(p : tabstractprocdef; side: tcallercallee);
  217. var
  218. retcgsize : tcgsize;
  219. begin
  220. { Constructors return self instead of a boolean }
  221. if (p.proctypeoption=potype_constructor) then
  222. retcgsize:=OS_ADDR
  223. else
  224. retcgsize:=def_cgsize(p.rettype.def);
  225. location_reset(p.funcretloc[side],LOC_INVALID,OS_NO);
  226. { void has no location }
  227. if is_void(p.rettype.def) then
  228. begin
  229. location_reset(p.funcretloc[side],LOC_VOID,OS_NO);
  230. exit;
  231. end;
  232. { Return in FPU register? }
  233. if p.rettype.def.deftype=floatdef then
  234. begin
  235. p.funcretloc[side].loc:=LOC_FPUREGISTER;
  236. p.funcretloc[side].register:=NR_FPU_RESULT_REG;
  237. p.funcretloc[side].size:=retcgsize;
  238. end
  239. else
  240. { Return in register? }
  241. if not ret_in_param(p.rettype.def,p.proccalloption) then
  242. begin
  243. if retcgsize in [OS_64,OS_S64] then
  244. begin
  245. { low 32bits }
  246. p.funcretloc[side].loc:=LOC_REGISTER;
  247. p.funcretloc[side].size:=OS_64;
  248. if side=callerside then
  249. p.funcretloc[side].register64.reglo:=NR_FUNCTION_RESULT64_LOW_REG
  250. else
  251. p.funcretloc[side].register64.reglo:=NR_FUNCTION_RETURN64_LOW_REG;
  252. { high 32bits }
  253. if side=callerside then
  254. p.funcretloc[side].register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG
  255. else
  256. p.funcretloc[side].register64.reghi:=NR_FUNCTION_RETURN64_HIGH_REG;
  257. end
  258. else
  259. begin
  260. p.funcretloc[side].loc:=LOC_REGISTER;
  261. p.funcretloc[side].size:=retcgsize;
  262. if side=callerside then
  263. p.funcretloc[side].register:=newreg(R_INTREGISTER,RS_FUNCTION_RESULT_REG,cgsize2subreg(retcgsize))
  264. else
  265. p.funcretloc[side].register:=newreg(R_INTREGISTER,RS_FUNCTION_RETURN_REG,cgsize2subreg(retcgsize));
  266. end;
  267. end
  268. else
  269. begin
  270. p.funcretloc[side].loc:=LOC_REFERENCE;
  271. p.funcretloc[side].size:=retcgsize;
  272. end;
  273. end;
  274. procedure ti386paramanager.create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee;paras:tparalist;var parasize:longint);
  275. var
  276. i : integer;
  277. hp : tparavarsym;
  278. paraloc : pcgparalocation;
  279. l,
  280. paralen,
  281. varalign : longint;
  282. paraalign : shortint;
  283. pushaddr : boolean;
  284. paracgsize : tcgsize;
  285. begin
  286. paraalign:=get_para_align(p.proccalloption);
  287. { we push Flags and CS as long
  288. to cope with the IRETD
  289. and we save 6 register + 4 selectors }
  290. if po_interrupt in p.procoptions then
  291. inc(parasize,8+6*4+4*2);
  292. { Offset is calculated like:
  293. sub esp,12
  294. mov [esp+8],para3
  295. mov [esp+4],para2
  296. mov [esp],para1
  297. call function
  298. That means for pushes the para with the
  299. highest offset (see para3) needs to be pushed first
  300. }
  301. for i:=0 to paras.count-1 do
  302. begin
  303. hp:=tparavarsym(paras[i]);
  304. pushaddr:=push_addr_param(hp.varspez,hp.vartype.def,p.proccalloption);
  305. if pushaddr then
  306. begin
  307. paralen:=sizeof(aint);
  308. paracgsize:=OS_ADDR;
  309. end
  310. else
  311. begin
  312. paralen:=push_size(hp.varspez,hp.vartype.def,p.proccalloption);
  313. paracgsize:=def_cgsize(hp.vartype.def);
  314. end;
  315. hp.paraloc[side].reset;
  316. hp.paraloc[side].size:=paracgsize;
  317. hp.paraloc[side].intsize:=paralen;
  318. hp.paraloc[side].Alignment:=paraalign;
  319. { Copy to stack? }
  320. if paracgsize=OS_NO then
  321. begin
  322. paraloc:=hp.paraloc[side].add_location;
  323. paraloc^.loc:=LOC_REFERENCE;
  324. paraloc^.size:=paracgsize;
  325. if side=callerside then
  326. paraloc^.reference.index:=NR_STACK_POINTER_REG
  327. else
  328. paraloc^.reference.index:=NR_FRAME_POINTER_REG;
  329. varalign:=used_align(size_2_align(paralen),paraalign,paraalign);
  330. paraloc^.reference.offset:=parasize;
  331. parasize:=align(parasize+paralen,varalign);
  332. end
  333. else
  334. begin
  335. if paralen=0 then
  336. internalerror(200501163);
  337. while (paralen>0) do
  338. begin
  339. { We can allocate at maximum 32 bits per location }
  340. if paralen>sizeof(aint) then
  341. l:=sizeof(aint)
  342. else
  343. l:=paralen;
  344. paraloc:=hp.paraloc[side].add_location;
  345. paraloc^.loc:=LOC_REFERENCE;
  346. paraloc^.size:=int_cgsize(l);
  347. if side=callerside then
  348. paraloc^.reference.index:=NR_STACK_POINTER_REG
  349. else
  350. paraloc^.reference.index:=NR_FRAME_POINTER_REG;
  351. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  352. paraloc^.reference.offset:=parasize;
  353. parasize:=align(parasize+l,varalign);
  354. dec(paralen,l);
  355. end;
  356. end;
  357. end;
  358. { Adapt offsets for left-to-right calling }
  359. if p.proccalloption in pushleftright_pocalls then
  360. begin
  361. for i:=0 to paras.count-1 do
  362. begin
  363. hp:=tparavarsym(paras[i]);
  364. l:=push_size(hp.varspez,hp.vartype.def,p.proccalloption);
  365. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  366. l:=align(l,varalign);
  367. with hp.paraloc[side].location^ do
  368. begin
  369. reference.offset:=parasize-reference.offset-l;
  370. if side=calleeside then
  371. inc(reference.offset,target_info.first_parm_offset);
  372. end;
  373. end;
  374. end
  375. else
  376. begin
  377. { Only need to adapt the callee side to include the
  378. standard stackframe size }
  379. if side=calleeside then
  380. begin
  381. for i:=0 to paras.count-1 do
  382. begin
  383. hp:=tparavarsym(paras[i]);
  384. inc(hp.paraloc[side].location^.reference.offset,target_info.first_parm_offset);
  385. end;
  386. end;
  387. end;
  388. end;
  389. procedure ti386paramanager.create_register_paraloc_info(p : tabstractprocdef; side: tcallercallee;paras:tparalist;
  390. var parareg,parasize:longint);
  391. var
  392. hp : tparavarsym;
  393. paraloc : pcgparalocation;
  394. paracgsize : tcgsize;
  395. i : integer;
  396. l,
  397. paralen,
  398. varalign : longint;
  399. pushaddr : boolean;
  400. paraalign : shortint;
  401. begin
  402. paraalign:=get_para_align(p.proccalloption);
  403. { Register parameters are assigned from left to right }
  404. for i:=0 to paras.count-1 do
  405. begin
  406. hp:=tparavarsym(paras[i]);
  407. pushaddr:=push_addr_param(hp.varspez,hp.vartype.def,p.proccalloption);
  408. if pushaddr then
  409. begin
  410. paralen:=sizeof(aint);
  411. paracgsize:=OS_ADDR;
  412. end
  413. else
  414. begin
  415. paralen:=push_size(hp.varspez,hp.vartype.def,p.proccalloption);
  416. paracgsize:=def_cgsize(hp.vartype.def);
  417. end;
  418. hp.paraloc[side].reset;
  419. hp.paraloc[side].size:=paracgsize;
  420. hp.paraloc[side].intsize:=paralen;
  421. hp.paraloc[side].Alignment:=paraalign;
  422. {
  423. EAX
  424. EDX
  425. ECX
  426. Stack
  427. Stack
  428. 64bit values,floats,arrays and records are always
  429. on the stack.
  430. }
  431. if (parareg<=high(parasupregs)) and
  432. (paralen<=sizeof(aint)) and
  433. (
  434. not(hp.vartype.def.deftype in [floatdef,recorddef,arraydef]) or
  435. pushaddr
  436. ) then
  437. begin
  438. paraloc:=hp.paraloc[side].add_location;
  439. paraloc^.size:=paracgsize;
  440. paraloc^.loc:=LOC_REGISTER;
  441. paraloc^.register:=newreg(R_INTREGISTER,parasupregs[parareg],cgsize2subreg(paracgsize));
  442. inc(parareg);
  443. end
  444. else
  445. begin
  446. { Copy to stack? }
  447. if paracgsize=OS_NO then
  448. begin
  449. paraloc:=hp.paraloc[side].add_location;
  450. paraloc^.loc:=LOC_REFERENCE;
  451. paraloc^.size:=paracgsize;
  452. if side=callerside then
  453. paraloc^.reference.index:=NR_STACK_POINTER_REG
  454. else
  455. paraloc^.reference.index:=NR_FRAME_POINTER_REG;
  456. varalign:=used_align(size_2_align(paralen),paraalign,paraalign);
  457. paraloc^.reference.offset:=parasize;
  458. parasize:=align(parasize+paralen,varalign);
  459. end
  460. else
  461. begin
  462. if paralen=0 then
  463. internalerror(200501163);
  464. while (paralen>0) do
  465. begin
  466. { We can allocate at maximum 32 bits per location }
  467. if paralen>sizeof(aint) then
  468. l:=sizeof(aint)
  469. else
  470. l:=paralen;
  471. paraloc:=hp.paraloc[side].add_location;
  472. paraloc^.loc:=LOC_REFERENCE;
  473. paraloc^.size:=int_cgsize(l);
  474. if side=callerside then
  475. paraloc^.reference.index:=NR_STACK_POINTER_REG
  476. else
  477. paraloc^.reference.index:=NR_FRAME_POINTER_REG;
  478. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  479. paraloc^.reference.offset:=parasize;
  480. parasize:=align(parasize+l,varalign);
  481. dec(paralen,l);
  482. end;
  483. end;
  484. end;
  485. end;
  486. { Register parameters are assigned from left-to-right, adapt offset
  487. for calleeside to be reversed }
  488. for i:=0 to paras.count-1 do
  489. begin
  490. hp:=tparavarsym(paras[i]);
  491. with hp.paraloc[side].location^ do
  492. begin
  493. if (loc=LOC_REFERENCE) then
  494. begin
  495. l:=push_size(hp.varspez,hp.vartype.def,p.proccalloption);
  496. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  497. l:=align(l,varalign);
  498. reference.offset:=parasize-reference.offset-l;
  499. if side=calleeside then
  500. inc(reference.offset,target_info.first_parm_offset);
  501. end;
  502. end;
  503. end;
  504. end;
  505. function ti386paramanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  506. var
  507. parasize,
  508. parareg : longint;
  509. begin
  510. parasize:=0;
  511. parareg:=0;
  512. case p.proccalloption of
  513. pocall_register :
  514. create_register_paraloc_info(p,side,p.paras,parareg,parasize);
  515. pocall_inline,
  516. pocall_compilerproc,
  517. pocall_internproc :
  518. begin
  519. { Use default calling }
  520. if (pocall_default=pocall_register) then
  521. create_register_paraloc_info(p,side,p.paras,parareg,parasize)
  522. else
  523. create_stdcall_paraloc_info(p,side,p.paras,parasize);
  524. end;
  525. else
  526. create_stdcall_paraloc_info(p,side,p.paras,parasize);
  527. end;
  528. create_funcretloc_info(p,side);
  529. result:=parasize;
  530. end;
  531. function ti386paramanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;
  532. var
  533. parasize : longint;
  534. begin
  535. parasize:=0;
  536. { calculate the registers for the normal parameters }
  537. create_stdcall_paraloc_info(p,callerside,p.paras,parasize);
  538. { append the varargs }
  539. create_stdcall_paraloc_info(p,callerside,varargspara,parasize);
  540. result:=parasize;
  541. end;
  542. procedure ti386paramanager.createtempparaloc(list: taasmoutput;calloption : tproccalloption;parasym : tparavarsym;var cgpara:TCGPara);
  543. var
  544. paraloc : pcgparalocation;
  545. begin
  546. paraloc:=parasym.paraloc[callerside].location;
  547. { No need for temps when value is pushed }
  548. if assigned(paraloc) and
  549. (paraloc^.loc=LOC_REFERENCE) and
  550. (paraloc^.reference.index=NR_STACK_POINTER_REG) then
  551. duplicateparaloc(list,calloption,parasym,cgpara)
  552. else
  553. inherited createtempparaloc(list,calloption,parasym,cgpara);
  554. end;
  555. begin
  556. paramanager:=ti386paramanager.create;
  557. end.
  558. {
  559. $Log$
  560. Revision 1.62 2005-01-18 22:19:20 peter
  561. * multiple location support for i386 a_param_ref
  562. * remove a_param_copy_ref for i386
  563. Revision 1.61 2005/01/10 21:50:05 jonas
  564. + support for passing records in registers under darwin
  565. * tcgpara now also has an intsize field, which contains the size in
  566. bytes of the whole parameter
  567. Revision 1.60 2004/11/22 22:01:19 peter
  568. * fixed varargs
  569. * replaced dynarray with tlist
  570. Revision 1.59 2004/11/21 17:54:59 peter
  571. * ttempcreatenode.create_reg merged into .create with parameter
  572. whether a register is allowed
  573. * funcret_paraloc renamed to funcretloc
  574. Revision 1.58 2004/11/21 17:17:04 florian
  575. * changed funcret location back to tlocation
  576. Revision 1.57 2004/11/15 23:35:31 peter
  577. * tparaitem removed, use tparavarsym instead
  578. * parameter order is now calculated from paranr value in tparavarsym
  579. Revision 1.56 2004/10/31 21:45:03 peter
  580. * generic tlocation
  581. * move tlocation to cgutils
  582. Revision 1.55 2004/09/21 17:25:12 peter
  583. * paraloc branch merged
  584. Revision 1.54.4.1 2004/08/31 20:43:06 peter
  585. * paraloc patch
  586. Revision 1.54 2004/07/09 23:30:13 jonas
  587. * changed first_sse_imreg to first_mm_imreg
  588. Revision 1.53 2004/07/09 23:09:02 peter
  589. * varargs calculation fixed, it's now the same as the other
  590. targets
  591. Revision 1.52 2004/06/20 08:55:31 florian
  592. * logs truncated
  593. Revision 1.51 2004/06/16 20:07:10 florian
  594. * dwarf branch merged
  595. Revision 1.50.2.3 2004/05/02 21:37:35 florian
  596. * setting of func. ret. for i386 fixed
  597. Revision 1.50.2.2 2004/05/02 12:45:32 peter
  598. * enabled cpuhasfixedstack for x86-64 again
  599. * fixed size of temp allocation for parameters
  600. Revision 1.50.2.1 2004/05/01 16:02:10 peter
  601. * POINTER_SIZE replaced with sizeof(aint)
  602. * aint,aword,tconst*int moved to globtype
  603. Revision 1.50 2004/02/09 22:14:17 peter
  604. * more x86_64 parameter fixes
  605. * tparalocation.lochigh is now used to indicate if register64.reghi
  606. is used and what the type is
  607. }