paramgr.pas 24 KB

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