paramgr.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. {
  2. $Id$
  3. Copyright (c) 2002 by Florian Klaempfl
  4. Generic calling convention handling
  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. {# Parameter passing manager. Used to manage how
  19. parameters are passed to routines.
  20. }
  21. unit paramgr;
  22. {$i fpcdefs.inc}
  23. interface
  24. uses
  25. cclasses,globtype,
  26. cpubase,cgbase,
  27. aasmtai,
  28. symconst,symtype,symdef;
  29. type
  30. {# This class defines some methods to take care of routine
  31. parameters. It should be overriden for each new processor
  32. }
  33. tparamanager = class
  34. {# Returns true if the return value is actually a parameter
  35. pointer.
  36. }
  37. function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;virtual;
  38. function push_high_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
  39. { Returns true if a parameter is too large to copy and only
  40. the address is pushed
  41. }
  42. function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
  43. { return the size of a push }
  44. function push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
  45. { Returns true if a parameter needs to be copied on the stack, this
  46. is required for cdecl procedures
  47. }
  48. function copy_value_on_stack(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
  49. {# Returns a structure giving the information on
  50. the storage of the parameter (which must be
  51. an integer parameter). This is only used when calling
  52. internal routines directly, where all parameters must
  53. be 4-byte values.
  54. In case the location is a register, this register is allocated.
  55. Call freeintparaloc() after the call to free the locations again.
  56. Default implementation: don't do anything at all (in case you don't
  57. use register parameter passing)
  58. @param(list Current assembler list)
  59. @param(nr Parameter number of routine, starting from 1)
  60. }
  61. function get_para_align(calloption : tproccalloption):byte;virtual;
  62. function get_volatile_registers_int(calloption : tproccalloption):tsuperregisterset;virtual;
  63. function get_volatile_registers_fpu(calloption : tproccalloption):tsuperregisterset;virtual;
  64. function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;virtual;abstract;
  65. {# allocate a parameter location created with create_paraloc_info
  66. @param(list Current assembler list)
  67. @param(loc Parameter location)
  68. }
  69. procedure allocparaloc(list: taasmoutput; const loc: tparalocation); virtual;
  70. {# free a parameter location allocated with allocparaloc
  71. @param(list Current assembler list)
  72. @param(loc Parameter location)
  73. }
  74. procedure freeparaloc(list: taasmoutput; const loc: tparalocation); virtual;
  75. { This is used to populate the location information on all parameters
  76. for the routine as seen in either the caller or the callee. It returns
  77. the size allocated on the stack
  78. }
  79. function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;virtual;abstract;
  80. { This is used to populate the location information on all parameters
  81. for the routine when it is being inlined. It returns
  82. the size allocated on the stack
  83. }
  84. function create_inline_paraloc_info(p : tabstractprocdef):longint;virtual;
  85. { This is used to populate the location information on all parameters
  86. for the routine that are passed as varargs. It returns
  87. the size allocated on the stack (including the normal parameters)
  88. }
  89. function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;virtual;abstract;
  90. { Return the location of the low and high part of a 64bit parameter }
  91. procedure splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);virtual;
  92. procedure alloctempregs(list: taasmoutput;var locpara:tparalocation);virtual;
  93. end;
  94. var
  95. paramanager : tparamanager;
  96. implementation
  97. uses
  98. cpuinfo,globals,systems,
  99. symbase,symsym,
  100. rgobj,cgobj,
  101. defutil,verbose;
  102. { true if uses a parameter as return value }
  103. function tparamanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
  104. begin
  105. ret_in_param:=(def.deftype in [arraydef,recorddef]) or
  106. ((def.deftype=stringdef) and (tstringdef(def).string_typ in [st_shortstring,st_longstring])) or
  107. ((def.deftype=procvardef) and (po_methodpointer in tprocvardef(def).procoptions)) or
  108. ((def.deftype=objectdef) and is_object(def)) or
  109. (def.deftype=variantdef) or
  110. ((def.deftype=setdef) and (tsetdef(def).settype<>smallset));
  111. end;
  112. function tparamanager.push_high_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  113. begin
  114. push_high_param:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and
  115. (
  116. is_open_array(def) or
  117. is_open_string(def) or
  118. is_array_of_const(def)
  119. );
  120. end;
  121. { true if a parameter is too large to copy and only the address is pushed }
  122. function tparamanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  123. begin
  124. result:=false;
  125. { var,out always require address }
  126. if varspez in [vs_var,vs_out] then
  127. begin
  128. result:=true;
  129. exit;
  130. end;
  131. { Only vs_const, vs_value here }
  132. case def.deftype of
  133. variantdef,
  134. formaldef :
  135. result:=true;
  136. recorddef :
  137. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (def.size>pointer_size);
  138. arraydef :
  139. begin
  140. if (calloption in [pocall_cdecl,pocall_cppdecl]) then
  141. begin
  142. { array of const values are pushed on the stack }
  143. result:=not is_array_of_const(def);
  144. end
  145. else
  146. begin
  147. result:=(
  148. (tarraydef(def).highrange>=tarraydef(def).lowrange) and
  149. (def.size>pointer_size)
  150. ) or
  151. is_open_array(def) or
  152. is_array_of_const(def) or
  153. is_array_constructor(def);
  154. end;
  155. end;
  156. objectdef :
  157. result:=is_object(def);
  158. stringdef :
  159. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (tstringdef(def).string_typ in [st_shortstring,st_longstring]);
  160. procvardef :
  161. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (po_methodpointer in tprocvardef(def).procoptions);
  162. setdef :
  163. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (tsetdef(def).settype<>smallset);
  164. end;
  165. end;
  166. { true if a parameter is too large to push and needs a concatcopy to get the value on the stack }
  167. function tparamanager.copy_value_on_stack(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  168. begin
  169. copy_value_on_stack:=false;
  170. { this is only for cdecl procedures with vs_const,vs_value }
  171. if not(
  172. (calloption in [pocall_cdecl,pocall_cppdecl]) and
  173. (varspez in [vs_value,vs_const])
  174. ) then
  175. exit;
  176. case def.deftype of
  177. variantdef,
  178. formaldef :
  179. copy_value_on_stack:=true;
  180. recorddef :
  181. copy_value_on_stack:=(def.size>pointer_size);
  182. arraydef :
  183. copy_value_on_stack:=(tarraydef(def).highrange>=tarraydef(def).lowrange) and
  184. (def.size>pointer_size);
  185. objectdef :
  186. copy_value_on_stack:=is_object(def);
  187. stringdef :
  188. copy_value_on_stack:=tstringdef(def).string_typ in [st_shortstring,st_longstring];
  189. procvardef :
  190. copy_value_on_stack:=(po_methodpointer in tprocvardef(def).procoptions);
  191. setdef :
  192. copy_value_on_stack:=(tsetdef(def).settype<>smallset);
  193. end;
  194. end;
  195. { return the size of a push }
  196. function tparamanager.push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
  197. begin
  198. push_size:=-1;
  199. case varspez of
  200. vs_out,
  201. vs_var :
  202. push_size:=pointer_size;
  203. vs_value,
  204. vs_const :
  205. begin
  206. if push_addr_param(varspez,def,calloption) then
  207. push_size:=pointer_size
  208. else
  209. begin
  210. { special array are normally pushed by addr, only for
  211. cdecl array of const it comes here and the pushsize
  212. is unknown }
  213. if is_array_of_const(def) then
  214. push_size:=0
  215. else
  216. push_size:=def.size;
  217. end;
  218. end;
  219. end;
  220. end;
  221. function tparamanager.get_para_align(calloption : tproccalloption):byte;
  222. begin
  223. result:=std_param_align;
  224. end;
  225. function tparamanager.get_volatile_registers_int(calloption : tproccalloption):tsuperregisterset;
  226. begin
  227. result:=[];
  228. end;
  229. function tparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tsuperregisterset;
  230. begin
  231. result:=[];
  232. end;
  233. procedure tparamanager.allocparaloc(list: taasmoutput; const loc: tparalocation);
  234. begin
  235. case loc.loc of
  236. LOC_REGISTER, LOC_CREGISTER:
  237. begin
  238. { NR_NO means we don't need to allocate the parameter.
  239. This is used for inlining parameters which allocates
  240. the parameters in gen_alloc_parast (PFV) }
  241. if loc.register<>NR_NO then
  242. begin
  243. {$ifndef cpu64bit}
  244. if (loc.size in [OS_64,OS_S64,OS_F64]) then
  245. begin
  246. cg.getexplicitregister(list,loc.registerhigh);
  247. cg.getexplicitregister(list,loc.registerlow);
  248. end
  249. else
  250. {$endif cpu64bit}
  251. cg.getexplicitregister(list,loc.register);
  252. end;
  253. end;
  254. LOC_FPUREGISTER, LOC_CFPUREGISTER:
  255. begin
  256. if loc.register<>NR_NO then
  257. cg.getexplicitregister(list,loc.register);
  258. end;
  259. LOC_REFERENCE,LOC_CREFERENCE:
  260. { do nothing by default, most of the time it's the framepointer }
  261. else
  262. internalerror(200306091);
  263. end;
  264. end;
  265. procedure tparamanager.freeparaloc(list: taasmoutput; const loc: tparalocation);
  266. begin
  267. case loc.loc of
  268. LOC_REGISTER, LOC_CREGISTER:
  269. begin
  270. {$ifndef cpu64bit}
  271. if (loc.size in [OS_64,OS_S64,OS_F64]) then
  272. begin
  273. cg.ungetregister(list,loc.registerhigh);
  274. cg.ungetregister(list,loc.registerlow);
  275. end
  276. else
  277. {$endif cpu64bit}
  278. cg.ungetregister(list,loc.register);
  279. end;
  280. LOC_FPUREGISTER, LOC_CFPUREGISTER:
  281. cg.ungetregister(list,loc.register);
  282. LOC_REFERENCE,LOC_CREFERENCE:
  283. { do nothing by default, most of the time it's the framepointer }
  284. else
  285. internalerror(200306091);
  286. end;
  287. end;
  288. procedure tparamanager.splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);
  289. begin
  290. if not(locpara.size in [OS_64,OS_S64]) then
  291. internalerror(200307023);
  292. lochipara:=locpara;
  293. loclopara:=locpara;
  294. if locpara.size=OS_S64 then
  295. lochipara.size:=OS_S32
  296. else
  297. lochipara.size:=OS_32;
  298. loclopara.size:=OS_32;
  299. case locpara.loc of
  300. LOC_REGISTER,LOC_CREGISTER:
  301. begin
  302. loclopara.register:=locpara.registerlow;
  303. lochipara.register:=locpara.registerhigh;
  304. end;
  305. LOC_REFERENCE:
  306. begin
  307. if target_info.endian=endian_big then
  308. inc(loclopara.reference.offset,4)
  309. else
  310. inc(lochipara.reference.offset,4);
  311. end;
  312. else
  313. internalerror(200307024);
  314. end;
  315. end;
  316. procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
  317. begin
  318. if locpara.loc<>LOC_REGISTER then
  319. internalerror(200308123);
  320. {$ifndef cpu64bit}
  321. if locpara.size in [OS_64,OS_S64] then
  322. begin
  323. locpara.registerlow:=cg.getintregister(list,OS_32);
  324. locpara.registerhigh:=cg.getintregister(list,OS_32);
  325. end
  326. else
  327. {$endif cpu64bit}
  328. locpara.register:=cg.getintregister(list,locpara.size);
  329. end;
  330. function tparamanager.create_inline_paraloc_info(p : tabstractprocdef):longint;
  331. var
  332. hp : tparaitem;
  333. paraloc : tparalocation;
  334. parasize : longint;
  335. begin
  336. parasize:=0;
  337. hp:=tparaitem(p.para.first);
  338. while assigned(hp) do
  339. begin
  340. if push_addr_param(hp.paratyp,hp.paratype.def,p.proccalloption) then
  341. paraloc.size:=OS_ADDR
  342. else
  343. paraloc.size:=def_cgsize(hp.paratype.def);
  344. if paraloc.size=OS_NO then
  345. internalerror(200309301);
  346. { Indicate parameter is loaded in register, the register
  347. will be allocated when the allocpara is called }
  348. paraloc.loc:=LOC_REGISTER;
  349. paraloc.register:=NR_NO;
  350. (*
  351. paraloc.loc:=LOC_REFERENCE;
  352. paraloc.reference.index:=NR_FRAME_POINTER_REG;
  353. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  354. varalign:=size_2_align(l);
  355. paraloc.reference.offset:=parasize+target_info.first_parm_offset;
  356. varalign:=used_align(varalign,p.paraalign,p.paraalign);
  357. parasize:=align(parasize+l,varalign);
  358. *)
  359. hp.paraloc[callerside]:=paraloc;
  360. hp.paraloc[calleeside]:=paraloc;
  361. hp:=tparaitem(hp.next);
  362. end;
  363. { We need to return the size allocated }
  364. result:=parasize;
  365. end;
  366. initialization
  367. ;
  368. finalization
  369. paramanager.free;
  370. end.
  371. {
  372. $Log$
  373. Revision 1.61 2003-10-09 21:31:37 daniel
  374. * Register allocator splitted, ans abstract now
  375. Revision 1.60 2003/10/05 21:21:52 peter
  376. * c style array of const generates callparanodes
  377. * varargs paraloc fixes
  378. Revision 1.59 2003/10/03 22:00:33 peter
  379. * parameter alignment fixes
  380. Revision 1.58 2003/10/01 20:34:49 peter
  381. * procinfo unit contains tprocinfo
  382. * cginfo renamed to cgbase
  383. * moved cgmessage to verbose
  384. * fixed ppc and sparc compiles
  385. Revision 1.57 2003/09/30 21:02:37 peter
  386. * updates for inlining
  387. Revision 1.56 2003/09/23 17:56:05 peter
  388. * locals and paras are allocated in the code generation
  389. * tvarsym.localloc contains the location of para/local when
  390. generating code for the current procedure
  391. Revision 1.55 2003/09/16 16:17:01 peter
  392. * varspez in calls to push_addr_param
  393. Revision 1.54 2003/09/10 08:31:47 marco
  394. * Patch from Peter for paraloc
  395. Revision 1.53 2003/09/07 22:09:35 peter
  396. * preparations for different default calling conventions
  397. * various RA fixes
  398. Revision 1.52 2003/09/04 15:39:58 peter
  399. * released useparatemp
  400. Revision 1.51 2003/09/03 15:55:01 peter
  401. * NEWRA branch merged
  402. Revision 1.50.2.1 2003/08/29 17:28:59 peter
  403. * next batch of updates
  404. Revision 1.50 2003/08/11 21:18:20 peter
  405. * start of sparc support for newra
  406. Revision 1.49 2003/07/08 21:24:59 peter
  407. * sparc fixes
  408. Revision 1.48 2003/07/05 20:11:41 jonas
  409. * create_paraloc_info() is now called separately for the caller and
  410. callee info
  411. * fixed ppc cycle
  412. Revision 1.47 2003/07/02 22:18:04 peter
  413. * paraloc splitted in callerparaloc,calleeparaloc
  414. * sparc calling convention updates
  415. Revision 1.46 2003/06/17 16:32:03 peter
  416. * allocpara/freepara 64bit support
  417. Revision 1.45 2003/06/13 21:19:30 peter
  418. * current_procdef removed, use current_procinfo.procdef instead
  419. Revision 1.44 2003/06/12 21:11:10 peter
  420. * ungetregisterfpu gets size parameter
  421. Revision 1.43 2003/06/09 14:54:26 jonas
  422. * (de)allocation of registers for parameters is now performed properly
  423. (and checked on the ppc)
  424. - removed obsolete allocation of all parameter registers at the start
  425. of a procedure (and deallocation at the end)
  426. Revision 1.42 2003/06/08 10:54:41 jonas
  427. - disabled changing of LOC_*REGISTER to LOC_C*REGISTER in setparalocs,
  428. this is not necessary anymore (doesn't do anything anymore actually,
  429. except making sure the interface crc changes)
  430. Revision 1.41 2003/06/07 18:57:04 jonas
  431. + added freeintparaloc
  432. * ppc get/freeintparaloc now check whether the parameter regs are
  433. properly allocated/deallocated (and get an extra list para)
  434. * ppc a_call_* now internalerrors if pi_do_call is not yet set
  435. * fixed lot of missing pi_do_call's
  436. Revision 1.40 2003/05/31 15:05:28 peter
  437. * FUNCTION_RESULT64_LOW/HIGH_REG added for int64 results
  438. Revision 1.39 2003/05/30 23:57:08 peter
  439. * more sparc cleanup
  440. * accumulator removed, splitted in function_return_reg (called) and
  441. function_result_reg (caller)
  442. Revision 1.38 2003/05/13 15:16:13 peter
  443. * removed ret_in_acc, it's the reverse of ret_in_param
  444. * fixed ret_in_param for win32 cdecl array
  445. Revision 1.37 2003/04/30 22:15:59 florian
  446. * some 64 bit adaptions in ncgadd
  447. * x86-64 now uses ncgadd
  448. * tparamanager.ret_in_acc doesn't return true anymore for a void-def
  449. Revision 1.36 2003/04/27 11:21:33 peter
  450. * aktprocdef renamed to current_procinfo.procdef
  451. * procinfo renamed to current_procinfo
  452. * procinfo will now be stored in current_module so it can be
  453. cleaned up properly
  454. * gen_main_procsym changed to create_main_proc and release_main_proc
  455. to also generate a tprocinfo structure
  456. * fixed unit implicit initfinal
  457. Revision 1.35 2003/04/27 07:29:50 peter
  458. * current_procinfo.procdef cleanup, current_procdef is now always nil when parsing
  459. a new procdef declaration
  460. * aktprocsym removed
  461. * lexlevel removed, use symtable.symtablelevel instead
  462. * implicit init/final code uses the normal genentry/genexit
  463. * funcret state checking updated for new funcret handling
  464. Revision 1.34 2003/04/23 13:15:04 peter
  465. * fix push_high_param for cdecl
  466. Revision 1.33 2003/04/23 10:14:30 peter
  467. * cdecl array of const has no addr push
  468. Revision 1.32 2003/04/22 13:47:08 peter
  469. * fixed C style array of const
  470. * fixed C array passing
  471. * fixed left to right with high parameters
  472. Revision 1.31 2003/02/02 19:25:54 carl
  473. * Several bugfixes for m68k target (register alloc., opcode emission)
  474. + VIS target
  475. + Generic add more complete (still not verified)
  476. Revision 1.30 2003/01/08 18:43:56 daniel
  477. * Tregister changed into a record
  478. Revision 1.29 2002/12/23 20:58:03 peter
  479. * remove unused global var
  480. Revision 1.28 2002/12/17 22:19:33 peter
  481. * fixed pushing of records>8 bytes with stdcall
  482. * simplified hightree loading
  483. Revision 1.27 2002/12/06 16:56:58 peter
  484. * only compile cs_fp_emulation support when cpufpuemu is defined
  485. * define cpufpuemu for m68k only
  486. Revision 1.26 2002/11/27 20:04:09 peter
  487. * tvarsym.get_push_size replaced by paramanager.push_size
  488. Revision 1.25 2002/11/27 02:33:19 peter
  489. * copy_value_on_stack method added for cdecl record passing
  490. Revision 1.24 2002/11/25 17:43:21 peter
  491. * splitted defbase in defutil,symutil,defcmp
  492. * merged isconvertable and is_equal into compare_defs(_ext)
  493. * made operator search faster by walking the list only once
  494. Revision 1.23 2002/11/18 17:31:58 peter
  495. * pass proccalloption to ret_in_xxx and push_xxx functions
  496. Revision 1.22 2002/11/16 18:00:04 peter
  497. * only push small arrays on the stack for win32
  498. Revision 1.21 2002/10/05 12:43:25 carl
  499. * fixes for Delphi 6 compilation
  500. (warning : Some features do not work under Delphi)
  501. Revision 1.20 2002/09/30 07:07:25 florian
  502. * fixes to common code to get the alpha compiler compiled applied
  503. Revision 1.19 2002/09/30 07:00:47 florian
  504. * fixes to common code to get the alpha compiler compiled applied
  505. Revision 1.18 2002/09/09 09:10:51 florian
  506. + added generic tparamanager.getframepointerloc
  507. Revision 1.17 2002/09/07 19:40:39 florian
  508. * tvarsym.paraitem is set now
  509. Revision 1.16 2002/09/01 21:04:48 florian
  510. * several powerpc related stuff fixed
  511. Revision 1.15 2002/08/25 19:25:19 peter
  512. * sym.insert_in_data removed
  513. * symtable.insertvardata/insertconstdata added
  514. * removed insert_in_data call from symtable.insert, it needs to be
  515. called separatly. This allows to deref the address calculation
  516. * procedures now calculate the parast addresses after the procedure
  517. directives are parsed. This fixes the cdecl parast problem
  518. * push_addr_param has an extra argument that specifies if cdecl is used
  519. or not
  520. Revision 1.14 2002/08/17 22:09:47 florian
  521. * result type handling in tcgcal.pass_2 overhauled
  522. * better tnode.dowrite
  523. * some ppc stuff fixed
  524. Revision 1.13 2002/08/17 09:23:38 florian
  525. * first part of procinfo rewrite
  526. Revision 1.12 2002/08/16 14:24:58 carl
  527. * issameref() to test if two references are the same (then emit no opcodes)
  528. + ret_in_reg to replace ret_in_acc
  529. (fix some register allocation bugs at the same time)
  530. + save_std_register now has an extra parameter which is the
  531. usedinproc registers
  532. Revision 1.11 2002/08/12 15:08:40 carl
  533. + stab register indexes for powerpc (moved from gdb to cpubase)
  534. + tprocessor enumeration moved to cpuinfo
  535. + linker in target_info is now a class
  536. * many many updates for m68k (will soon start to compile)
  537. - removed some ifdef or correct them for correct cpu
  538. Revision 1.10 2002/08/10 17:15:20 jonas
  539. * register parameters are now LOC_CREGISTER instead of LOC_REGISTER
  540. Revision 1.9 2002/08/09 07:33:02 florian
  541. * a couple of interface related fixes
  542. Revision 1.8 2002/08/06 20:55:21 florian
  543. * first part of ppc calling conventions fix
  544. Revision 1.7 2002/08/05 18:27:48 carl
  545. + more more more documentation
  546. + first version include/exclude (can't test though, not enough scratch for i386 :()...
  547. Revision 1.6 2002/07/30 20:50:43 florian
  548. * the code generator knows now if parameters are in registers
  549. Revision 1.5 2002/07/26 21:15:39 florian
  550. * rewrote the system handling
  551. Revision 1.4 2002/07/20 11:57:55 florian
  552. * types.pas renamed to defbase.pas because D6 contains a types
  553. unit so this would conflicts if D6 programms are compiled
  554. + Willamette/SSE2 instructions to assembler added
  555. Revision 1.3 2002/07/13 19:38:43 florian
  556. * some more generic calling stuff fixed
  557. Revision 1.2 2002/07/13 07:17:15 jonas
  558. * fixed memory leak reported by Sergey Korshunoff
  559. Revision 1.1 2002/07/11 14:41:28 florian
  560. * start of the new generic parameter handling
  561. }