ncgcnv.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. {
  2. $Id$
  3. Copyright (c) 2000-2002 by Florian Klaempfl
  4. Generate assembler for nodes that handle type conversions which are
  5. the same for all (most) processors
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ****************************************************************************
  18. }
  19. unit ncgcnv;
  20. {$i fpcdefs.inc}
  21. interface
  22. uses
  23. node,ncnv,defutil,defcmp;
  24. type
  25. tcgtypeconvnode = class(ttypeconvnode)
  26. procedure second_int_to_int;override;
  27. procedure second_cstring_to_pchar;override;
  28. procedure second_string_to_chararray;override;
  29. procedure second_array_to_pointer;override;
  30. procedure second_pointer_to_array;override;
  31. procedure second_char_to_string;override;
  32. procedure second_real_to_real;override;
  33. procedure second_cord_to_pointer;override;
  34. procedure second_proc_to_procvar;override;
  35. procedure second_bool_to_int;override;
  36. procedure second_bool_to_bool;override;
  37. procedure second_ansistring_to_pchar;override;
  38. procedure second_class_to_intf;override;
  39. procedure second_char_to_char;override;
  40. procedure second_nothing;override;
  41. {$ifdef TESTOBJEXT2}
  42. procedure checkobject;virtual;
  43. {$endif TESTOBJEXT2}
  44. procedure second_call_helper(c : tconverttype);virtual;abstract;
  45. procedure pass_2;override;
  46. end;
  47. tcgasnode = class(tasnode)
  48. procedure pass_2;override;
  49. end;
  50. implementation
  51. uses
  52. cutils,verbose,
  53. aasmbase,aasmtai,aasmcpu,symconst,symdef,paramgr,
  54. ncon,ncal,
  55. cpubase,cpuinfo,cpupara,systems,
  56. pass_2,
  57. cginfo,cgbase,
  58. cgobj,cgcpu,
  59. ncgutil,
  60. tgobj,rgobj
  61. ;
  62. procedure tcgtypeconvnode.second_int_to_int;
  63. var
  64. newsize : tcgsize;
  65. ressize, leftsize: cardinal;
  66. begin
  67. newsize:=def_cgsize(resulttype.def);
  68. { insert range check if not explicit conversion }
  69. if not(nf_explizit in flags) then
  70. cg.g_rangecheck(exprasmlist,left,resulttype.def);
  71. { is the result size smaller? when typecasting from void
  72. we always reuse the current location, because there is
  73. nothing that we can load in a register }
  74. ressize := resulttype.def.size;
  75. leftsize := left.resulttype.def.size;
  76. if (ressize<>leftsize) and
  77. not is_void(left.resulttype.def) then
  78. begin
  79. location_copy(location,left.location);
  80. { reuse a loc_reference when the newsize is smaller than
  81. than the original, else load it to a register }
  82. if (location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) and
  83. (ressize<leftsize) then
  84. begin
  85. location.size:=newsize;
  86. if (target_info.endian = ENDIAN_BIG) then
  87. inc(location.reference.offset,leftsize-ressize);
  88. end
  89. else
  90. location_force_reg(exprasmlist,location,newsize,false);
  91. end
  92. else
  93. begin
  94. { no special loading is required, reuse current location }
  95. location_copy(location,left.location);
  96. location.size:=newsize;
  97. end;
  98. end;
  99. procedure tcgtypeconvnode.second_cstring_to_pchar;
  100. var
  101. hr : treference;
  102. begin
  103. location_release(exprasmlist,left.location);
  104. location_reset(location,LOC_REGISTER,OS_ADDR);
  105. case tstringdef(left.resulttype.def).string_typ of
  106. st_shortstring :
  107. begin
  108. inc(left.location.reference.offset);
  109. location.register:=rg.getaddressregister(exprasmlist);
  110. cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
  111. end;
  112. st_ansistring :
  113. begin
  114. if (left.nodetype=stringconstn) and
  115. (str_length(left)=0) then
  116. begin
  117. reference_reset(hr);
  118. hr.symbol:=objectlibrary.newasmsymbol('FPC_EMPTYCHAR');
  119. location.register:=rg.getaddressregister(exprasmlist);
  120. cg.a_loadaddr_ref_reg(exprasmlist,hr,location.register);
  121. end
  122. else
  123. begin
  124. location.register:=rg.getaddressregister(exprasmlist);
  125. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,location.register);
  126. end;
  127. end;
  128. st_longstring:
  129. begin
  130. {!!!!!!!}
  131. internalerror(8888);
  132. end;
  133. st_widestring:
  134. begin
  135. if (left.nodetype=stringconstn) and
  136. (str_length(left)=0) then
  137. begin
  138. reference_reset(hr);
  139. hr.symbol:=objectlibrary.newasmsymbol('FPC_EMPTYCHAR');
  140. location.register:=rg.getaddressregister(exprasmlist);
  141. cg.a_loadaddr_ref_reg(exprasmlist,hr,location.register);
  142. end
  143. else
  144. begin
  145. location.register:=rg.getregisterint(exprasmlist,OS_INT);
  146. {$ifdef fpc}
  147. {$warning Todo: convert widestrings to ascii when typecasting them to pchars}
  148. {$endif}
  149. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
  150. location.register);
  151. end;
  152. end;
  153. end;
  154. end;
  155. procedure tcgtypeconvnode.second_string_to_chararray;
  156. var
  157. arrsize: longint;
  158. begin
  159. with tarraydef(resulttype.def) do
  160. arrsize := highrange-lowrange+1;
  161. if (left.nodetype = stringconstn) and
  162. { left.length+1 since there's always a terminating #0 character (JM) }
  163. (tstringconstnode(left).len+1 >= arrsize) and
  164. (tstringdef(left.resulttype.def).string_typ=st_shortstring) then
  165. begin
  166. location_copy(location,left.location);
  167. inc(location.reference.offset);
  168. exit;
  169. end
  170. else
  171. { should be handled already in resulttype pass (JM) }
  172. internalerror(200108292);
  173. end;
  174. procedure tcgtypeconvnode.second_array_to_pointer;
  175. begin
  176. location_release(exprasmlist,left.location);
  177. location_reset(location,LOC_REGISTER,OS_ADDR);
  178. location.register:=rg.getaddressregister(exprasmlist);
  179. cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
  180. end;
  181. procedure tcgtypeconvnode.second_pointer_to_array;
  182. begin
  183. location_reset(location,LOC_REFERENCE,OS_NO);
  184. case left.location.loc of
  185. LOC_REGISTER :
  186. begin
  187. if not rg.isaddressregister(left.location.register) then
  188. begin
  189. location_release(exprasmlist,left.location);
  190. location.reference.base:=rg.getaddressregister(exprasmlist);
  191. cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
  192. left.location.register,location.reference.base);
  193. end
  194. else
  195. location.reference.base := left.location.register;
  196. end;
  197. LOC_CREGISTER :
  198. begin
  199. location.reference.base:=rg.getaddressregister(exprasmlist);
  200. cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,
  201. location.reference.base);
  202. end;
  203. LOC_REFERENCE,
  204. LOC_CREFERENCE :
  205. begin
  206. location_release(exprasmlist,left.location);
  207. location.reference.base:=rg.getaddressregister(exprasmlist);
  208. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
  209. location.reference.base);
  210. location_freetemp(exprasmlist,left.location);
  211. end;
  212. else
  213. internalerror(2002032216);
  214. end;
  215. end;
  216. procedure tcgtypeconvnode.second_char_to_string;
  217. begin
  218. location_reset(location,LOC_REFERENCE,OS_NO);
  219. case tstringdef(resulttype.def).string_typ of
  220. st_shortstring :
  221. begin
  222. tg.GetTemp(exprasmlist,256,tt_normal,location.reference);
  223. cg.a_load_loc_ref(exprasmlist,left.location,
  224. location.reference);
  225. location_release(exprasmlist,left.location);
  226. location_freetemp(exprasmlist,left.location);
  227. end;
  228. { the rest is removed in the resulttype pass and converted to compilerprocs }
  229. else
  230. internalerror(4179);
  231. end;
  232. end;
  233. procedure tcgtypeconvnode.second_real_to_real;
  234. begin
  235. location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
  236. case left.location.loc of
  237. LOC_FPUREGISTER,
  238. LOC_CFPUREGISTER:
  239. begin
  240. location_copy(location,left.location);
  241. location.size:=def_cgsize(resulttype.def);
  242. exit;
  243. end;
  244. LOC_CREFERENCE,
  245. LOC_REFERENCE:
  246. begin
  247. location_release(exprasmlist,left.location);
  248. location.register:=rg.getregisterfpu(exprasmlist);
  249. cg.a_loadfpu_loc_reg(exprasmlist,left.location,location.register);
  250. location_freetemp(exprasmlist,left.location);
  251. end;
  252. else
  253. internalerror(2002032215);
  254. end;
  255. end;
  256. procedure tcgtypeconvnode.second_cord_to_pointer;
  257. begin
  258. { this can't happen because constants are already processed in
  259. pass 1 }
  260. internalerror(47423985);
  261. end;
  262. procedure tcgtypeconvnode.second_proc_to_procvar;
  263. begin
  264. { method pointer ? }
  265. if assigned(tunarynode(left).left) then
  266. begin
  267. location_copy(location,left.location);
  268. end
  269. else
  270. begin
  271. location_release(exprasmlist,left.location);
  272. location_reset(location,LOC_REGISTER,OS_ADDR);
  273. location.register:=rg.getaddressregister(exprasmlist);
  274. cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,location.register);
  275. end;
  276. end;
  277. procedure tcgtypeconvnode.second_bool_to_int;
  278. var
  279. oldtruelabel,oldfalselabel : tasmlabel;
  280. begin
  281. oldtruelabel:=truelabel;
  282. oldfalselabel:=falselabel;
  283. objectlibrary.getlabel(truelabel);
  284. objectlibrary.getlabel(falselabel);
  285. secondpass(left);
  286. location_copy(location,left.location);
  287. { byte(boolean) or word(wordbool) or longint(longbool) must }
  288. { be accepted for var parameters }
  289. if not((nf_explizit in flags) and
  290. (left.resulttype.def.size=resulttype.def.size) and
  291. (left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE,LOC_CREGISTER])) then
  292. location_force_reg(exprasmlist,location,def_cgsize(resulttype.def),false);
  293. truelabel:=oldtruelabel;
  294. falselabel:=oldfalselabel;
  295. end;
  296. procedure tcgtypeconvnode.second_bool_to_bool;
  297. begin
  298. { we can reuse the conversion already available
  299. in bool_to_int to resize the value. But when the
  300. size of the new boolean is smaller we need to calculate
  301. the value as is done in int_to_bool. This is needed because
  302. the bits that define the true status can be outside the limits
  303. of the new size and truncating the register can result in a 0
  304. value }
  305. if resulttype.def.size<left.resulttype.def.size then
  306. second_int_to_bool
  307. else
  308. second_bool_to_int;
  309. end;
  310. procedure tcgtypeconvnode.second_ansistring_to_pchar;
  311. var
  312. l1 : tasmlabel;
  313. hr : treference;
  314. begin
  315. location_reset(location,LOC_REGISTER,OS_ADDR);
  316. objectlibrary.getlabel(l1);
  317. case left.location.loc of
  318. LOC_CREGISTER,LOC_REGISTER:
  319. begin
  320. if not rg.isaddressregister(left.location.register) then
  321. begin
  322. location_release(exprasmlist,left.location);
  323. location.register:=rg.getaddressregister(exprasmlist);
  324. cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,
  325. left.location.register,location.register);
  326. end
  327. else
  328. location.register := left.location.register;
  329. end;
  330. LOC_CREFERENCE,LOC_REFERENCE:
  331. begin
  332. location_release(exprasmlist,left.location);
  333. location.register:=rg.getaddressregister(exprasmlist);
  334. cg.a_load_ref_reg(exprasmlist,OS_32,left.location.reference,location.register);
  335. location_freetemp(exprasmlist,left.location);
  336. end;
  337. else
  338. internalerror(2002032214);
  339. end;
  340. cg.a_cmp_const_reg_label(exprasmlist,OS_32,OC_NE,0,location.register,l1);
  341. reference_reset(hr);
  342. hr.symbol:=objectlibrary.newasmsymbol('FPC_EMPTYCHAR');
  343. cg.a_loadaddr_ref_reg(exprasmlist,hr,location.register);
  344. cg.a_label(exprasmlist,l1);
  345. end;
  346. procedure tcgtypeconvnode.second_class_to_intf;
  347. var
  348. l1 : tasmlabel;
  349. hd : tobjectdef;
  350. begin
  351. location_reset(location,LOC_REGISTER,OS_ADDR);
  352. case left.location.loc of
  353. LOC_CREFERENCE,
  354. LOC_REFERENCE:
  355. begin
  356. location_release(exprasmlist,left.location);
  357. location.register:=rg.getaddressregister(exprasmlist);
  358. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,location.register);
  359. location_freetemp(exprasmlist,left.location);
  360. end;
  361. LOC_CREGISTER:
  362. begin
  363. location.register:=rg.getaddressregister(exprasmlist);
  364. cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,location.register);
  365. end;
  366. LOC_REGISTER:
  367. location.register:=left.location.register;
  368. else
  369. internalerror(121120001);
  370. end;
  371. objectlibrary.getlabel(l1);
  372. cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,location.register,l1);
  373. hd:=tobjectdef(left.resulttype.def);
  374. while assigned(hd) do
  375. begin
  376. if hd.implementedinterfaces.searchintf(resulttype.def)<>-1 then
  377. begin
  378. cg.a_op_const_reg(exprasmlist,OP_ADD,aword(
  379. hd.implementedinterfaces.ioffsets(
  380. hd.implementedinterfaces.searchintf(
  381. resulttype.def))^),location.register);
  382. break;
  383. end;
  384. hd:=hd.childof;
  385. end;
  386. if hd=nil then
  387. internalerror(2002081301);
  388. cg.a_label(exprasmlist,l1);
  389. end;
  390. procedure tcgtypeconvnode.second_char_to_char;
  391. begin
  392. {$ifdef fpc}
  393. {$warning todo: add RTL routine for widechar-char conversion }
  394. {$endif}
  395. { Quick hack to atleast generate 'working' code (PFV) }
  396. second_int_to_int;
  397. end;
  398. procedure tcgtypeconvnode.second_nothing;
  399. begin
  400. { we reuse the old value }
  401. location_copy(location,left.location);
  402. { Floats should never be returned as LOC_CONSTANT, do the
  403. moving to memory before the new size is set }
  404. if (resulttype.def.deftype=floatdef) and
  405. (location.loc=LOC_CONSTANT) then
  406. location_force_mem(exprasmlist,location);
  407. { but use the new size, but we don't know the size of all arrays }
  408. location.size:=def_cgsize(resulttype.def);
  409. end;
  410. {$ifdef TESTOBJEXT2}
  411. procedure tcgtypeconvnode.checkobject;
  412. begin
  413. { no checking by default }
  414. end;
  415. {$endif TESTOBJEXT2}
  416. procedure tcgtypeconvnode.pass_2;
  417. begin
  418. { the boolean routines can be called with LOC_JUMP and
  419. call secondpass themselves in the helper }
  420. if not(convtype in [tc_bool_2_int,tc_bool_2_bool,tc_int_2_bool]) then
  421. begin
  422. secondpass(left);
  423. if codegenerror then
  424. exit;
  425. end;
  426. second_call_helper(convtype);
  427. {$ifdef TESTOBJEXT2}
  428. { Check explicit conversions to objects pointers !! }
  429. if p^.explizit and
  430. (p^.resulttype.def.deftype=pointerdef) and
  431. (tpointerdef(p^.resulttype.def).definition.deftype=objectdef) and not
  432. (tobjectdef(tpointerdef(p^.resulttype.def).definition).isclass) and
  433. ((tobjectdef(tpointerdef(p^.resulttype.def).definition).options and oo_hasvmt)<>0) and
  434. (cs_check_range in aktlocalswitches) then
  435. checkobject;
  436. {$endif TESTOBJEXT2}
  437. end;
  438. procedure tcgasnode.pass_2;
  439. begin
  440. secondpass(call);
  441. location_copy(location,call.location);
  442. end;
  443. begin
  444. ctypeconvnode := tcgtypeconvnode;
  445. casnode := tcgasnode;
  446. end.
  447. {
  448. $Log$
  449. Revision 1.36 2003-02-19 22:00:14 daniel
  450. * Code generator converted to new register notation
  451. - Horribily outdated todo.txt removed
  452. Revision 1.35 2003/01/02 22:20:51 peter
  453. * fix typecasts from void to int
  454. Revision 1.34 2002/11/25 17:43:17 peter
  455. * splitted defbase in defutil,symutil,defcmp
  456. * merged isconvertable and is_equal into compare_defs(_ext)
  457. * made operator search faster by walking the list only once
  458. Revision 1.33 2002/10/05 12:43:25 carl
  459. * fixes for Delphi 6 compilation
  460. (warning : Some features do not work under Delphi)
  461. Revision 1.32 2002/09/17 18:54:02 jonas
  462. * a_load_reg_reg() now has two size parameters: source and dest. This
  463. allows some optimizations on architectures that don't encode the
  464. register size in the register name.
  465. Revision 1.31 2002/09/16 13:08:44 jonas
  466. * big endian fix for second_int_to_int
  467. Revision 1.30 2002/09/07 15:25:02 peter
  468. * old logs removed and tabs fixed
  469. Revision 1.29 2002/09/02 18:46:00 peter
  470. * reuse a reference when resizing ordinal values to smaller sizes,
  471. this is required for constructions like byte(w):=1 that are
  472. allowed in tp mode only
  473. Revision 1.28 2002/08/25 09:06:58 peter
  474. * add calls to release temps
  475. Revision 1.27 2002/08/23 16:14:48 peter
  476. * tempgen cleanup
  477. * tt_noreuse temp type added that will be used in genentrycode
  478. Revision 1.26 2002/08/20 18:23:32 jonas
  479. * the as node again uses a compilerproc
  480. + (untested) support for interface "as" statements
  481. Revision 1.25 2002/08/13 18:01:52 carl
  482. * rename swatoperands to swapoperands
  483. + m68k first compilable version (still needs a lot of testing):
  484. assembler generator, system information , inline
  485. assembler reader.
  486. Revision 1.24 2002/08/12 20:39:17 florian
  487. * casting of classes to interface fixed when the interface was
  488. implemented by a parent class
  489. Revision 1.23 2002/08/11 14:32:26 peter
  490. * renamed current_library to objectlibrary
  491. Revision 1.22 2002/08/11 13:24:11 peter
  492. * saving of asmsymbols in ppu supported
  493. * asmsymbollist global is removed and moved into a new class
  494. tasmlibrarydata that will hold the info of a .a file which
  495. corresponds with a single module. Added librarydata to tmodule
  496. to keep the library info stored for the module. In the future the
  497. objectfiles will also be stored to the tasmlibrarydata class
  498. * all getlabel/newasmsymbol and friends are moved to the new class
  499. Revision 1.21 2002/07/20 11:57:53 florian
  500. * types.pas renamed to defbase.pas because D6 contains a types
  501. unit so this would conflicts if D6 programms are compiled
  502. + Willamette/SSE2 instructions to assembler added
  503. Revision 1.20 2002/07/11 14:41:28 florian
  504. * start of the new generic parameter handling
  505. Revision 1.19 2002/07/07 09:52:32 florian
  506. * powerpc target fixed, very simple units can be compiled
  507. * some basic stuff for better callparanode handling, far from being finished
  508. Revision 1.18 2002/07/04 20:43:01 florian
  509. * first x86-64 patches
  510. Revision 1.17 2002/07/01 18:46:22 peter
  511. * internal linker
  512. * reorganized aasm layer
  513. Revision 1.16 2002/07/01 16:23:53 peter
  514. * cg64 patch
  515. * basics for currency
  516. * asnode updates for class and interface (not finished)
  517. Revision 1.15 2002/05/18 13:34:09 peter
  518. * readded missing revisions
  519. Revision 1.14 2002/05/16 19:46:37 carl
  520. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  521. + try to fix temp allocation (still in ifdef)
  522. + generic constructor calls
  523. + start of tassembler / tmodulebase class cleanup
  524. Revision 1.12 2002/05/12 16:53:07 peter
  525. * moved entry and exitcode to ncgutil and cgobj
  526. * foreach gets extra argument for passing local data to the
  527. iterator function
  528. * -CR checks also class typecasts at runtime by changing them
  529. into as
  530. * fixed compiler to cycle with the -CR option
  531. * fixed stabs with elf writer, finally the global variables can
  532. be watched
  533. * removed a lot of routines from cga unit and replaced them by
  534. calls to cgobj
  535. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  536. u32bit then the other is typecasted also to u32bit without giving
  537. a rangecheck warning/error.
  538. * fixed pascal calling method with reversing also the high tree in
  539. the parast, detected by tcalcst3 test
  540. Revision 1.11 2002/04/21 19:02:03 peter
  541. * removed newn and disposen nodes, the code is now directly
  542. inlined from pexpr
  543. * -an option that will write the secondpass nodes to the .s file, this
  544. requires EXTDEBUG define to actually write the info
  545. * fixed various internal errors and crashes due recent code changes
  546. Revision 1.10 2002/04/19 15:39:34 peter
  547. * removed some more routines from cga
  548. * moved location_force_reg/mem to ncgutil
  549. * moved arrayconstructnode secondpass to ncgld
  550. Revision 1.9 2002/04/15 19:44:19 peter
  551. * fixed stackcheck that would be called recursively when a stack
  552. error was found
  553. * generic changeregsize(reg,size) for i386 register resizing
  554. * removed some more routines from cga unit
  555. * fixed returnvalue handling
  556. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  557. }