n386cnv.pas 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. Generate i386 assembler for type converting nodes
  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. unit n386cnv;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. node,ncgcnv,types;
  23. type
  24. ti386typeconvnode = class(tcgtypeconvnode)
  25. protected
  26. { procedure second_int_to_int;override; }
  27. { procedure second_string_to_string;override; }
  28. { procedure second_cstring_to_pchar;override; }
  29. { procedure second_string_to_chararray;override; }
  30. { procedure second_array_to_pointer;override; }
  31. { procedure second_pointer_to_array;override; }
  32. { procedure second_chararray_to_string;override; }
  33. { procedure second_char_to_string;override; }
  34. procedure second_int_to_real;override;
  35. { procedure second_real_to_real;override; }
  36. { procedure second_cord_to_pointer;override; }
  37. { procedure second_proc_to_procvar;override; }
  38. { procedure second_bool_to_int;override; }
  39. procedure second_int_to_bool;override;
  40. { procedure second_load_smallset;override; }
  41. { procedure second_ansistring_to_pchar;override; }
  42. { procedure second_pchar_to_string;override; }
  43. { procedure second_class_to_intf;override; }
  44. { procedure second_char_to_char;override; }
  45. {$ifdef TESTOBJEXT2}
  46. procedure checkobject;override;
  47. {$endif TESTOBJEXT2}
  48. procedure second_call_helper(c : tconverttype);override;
  49. end;
  50. implementation
  51. uses
  52. verbose,systems,
  53. symconst,symdef,aasm,
  54. cginfo,cgbase,pass_2,
  55. ncon,ncal,ncnv,
  56. cpubase,cpuasm,
  57. cgobj,cga,tgobj,rgobj,rgcpu,ncgutil;
  58. {*****************************************************************************
  59. SecondTypeConv
  60. *****************************************************************************}
  61. procedure ti386typeconvnode.second_int_to_real;
  62. var
  63. href : treference;
  64. hregister : tregister;
  65. l1,l2 : tasmlabel;
  66. freereg : boolean;
  67. begin
  68. location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
  69. hregister:=R_NO;
  70. freereg:=false;
  71. { for u32bit a solution is to push $0 and to load a comp }
  72. { does this first, it destroys maybe EDI }
  73. if torddef(left.resulttype.def).typ=u32bit then
  74. exprasmlist.concat(taicpu.op_const(A_PUSH,S_L,0));
  75. case left.location.loc of
  76. LOC_REGISTER,
  77. LOC_CREGISTER :
  78. begin
  79. case left.location.size of
  80. OS_64,OS_S64 :
  81. begin
  82. exprasmlist.concat(taicpu.op_reg(A_PUSH,S_L,left.location.registerhigh));
  83. hregister:=left.location.registerlow;
  84. end;
  85. OS_32,OS_S32 :
  86. hregister:=left.location.register;
  87. else
  88. begin
  89. hregister:=cg.get_scratch_reg(exprasmlist);
  90. freereg:=true;
  91. cg.a_load_reg_reg(exprasmlist,left.location.size,left.location.register,hregister);
  92. end;
  93. end;
  94. end;
  95. LOC_REFERENCE,
  96. LOC_CREFERENCE :
  97. begin
  98. hregister:=cg.get_scratch_reg(exprasmlist);
  99. freereg:=true;
  100. if left.location.size in [OS_64,OS_S64] then
  101. begin
  102. href:=left.location.reference;
  103. inc(href.offset,4);
  104. cg.a_load_ref_reg(exprasmlist,OS_32,href,hregister);
  105. exprasmlist.concat(taicpu.op_reg(A_PUSH,S_L,hregister));
  106. cg.a_load_ref_reg(exprasmlist,OS_32,left.location.reference,hregister);
  107. end
  108. else
  109. cg.a_load_ref_reg(exprasmlist,left.location.size,left.location.reference,hregister);
  110. end;
  111. else
  112. internalerror(2002032218);
  113. end;
  114. location_release(exprasmlist,left.location);
  115. location_freetemp(exprasmlist,left.location);
  116. { for 64 bit integers, the high dword is already pushed }
  117. exprasmlist.concat(taicpu.op_reg(A_PUSH,S_L,hregister));
  118. if freereg then
  119. cg.free_scratch_reg(exprasmlist,hregister);
  120. reference_reset_base(href,R_ESP,0);
  121. case torddef(left.resulttype.def).typ of
  122. u32bit:
  123. begin
  124. emit_ref(A_FILD,S_IQ,href);
  125. emit_const_reg(A_ADD,S_L,8,R_ESP);
  126. end;
  127. s64bit:
  128. begin
  129. emit_ref(A_FILD,S_IQ,href);
  130. emit_const_reg(A_ADD,S_L,8,R_ESP);
  131. end;
  132. u64bit:
  133. begin
  134. { unsigned 64 bit ints are harder to handle: }
  135. { we load bits 0..62 and then check bit 63: }
  136. { if it is 1 then we add $80000000 000000000 }
  137. { as double }
  138. inc(href.offset,4);
  139. rg.getexplicitregisterint(exprasmlist,R_EDI);
  140. emit_ref_reg(A_MOV,S_L,href,R_EDI);
  141. reference_reset_base(href,R_ESP,4);
  142. emit_const_ref(A_AND,S_L,$7fffffff,href);
  143. emit_const_reg(A_TEST,S_L,longint($80000000),R_EDI);
  144. rg.ungetregisterint(exprasmlist,R_EDI);
  145. reference_reset_base(href,R_ESP,0);
  146. emit_ref(A_FILD,S_IQ,href);
  147. getdatalabel(l1);
  148. getlabel(l2);
  149. emitjmp(C_Z,l2);
  150. Consts.concat(Tai_label.Create(l1));
  151. { I got this constant from a test progtram (FK) }
  152. Consts.concat(Tai_const.Create_32bit(0));
  153. Consts.concat(Tai_const.Create_32bit(1138753536));
  154. reference_reset_symbol(href,l1,0);
  155. emit_ref(A_FADD,S_FL,href);
  156. cg.a_label(exprasmlist,l2);
  157. emit_const_reg(A_ADD,S_L,8,R_ESP);
  158. end
  159. else
  160. begin
  161. emit_ref(A_FILD,S_IL,href);
  162. rg.getexplicitregisterint(exprasmlist,R_EDI);
  163. emit_reg(A_POP,S_L,R_EDI);
  164. rg.ungetregisterint(exprasmlist,R_EDI);
  165. end;
  166. end;
  167. inc(trgcpu(rg).fpuvaroffset);
  168. location.register:=R_ST;
  169. end;
  170. procedure ti386typeconvnode.second_int_to_bool;
  171. var
  172. hregister : tregister;
  173. pref : treference;
  174. resflags : tresflags;
  175. hlabel,oldtruelabel,oldfalselabel : tasmlabel;
  176. begin
  177. oldtruelabel:=truelabel;
  178. oldfalselabel:=falselabel;
  179. getlabel(truelabel);
  180. getlabel(falselabel);
  181. secondpass(left);
  182. if codegenerror then
  183. exit;
  184. { byte(boolean) or word(wordbool) or longint(longbool) must }
  185. { be accepted for var parameters }
  186. if (nf_explizit in flags) and
  187. (left.resulttype.def.size=resulttype.def.size) and
  188. (left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE,LOC_CREGISTER]) then
  189. begin
  190. location_copy(location,left.location);
  191. truelabel:=oldtruelabel;
  192. falselabel:=oldfalselabel;
  193. exit;
  194. end;
  195. { Load left node into flag F_NE/F_E }
  196. resflags:=F_NE;
  197. location_release(exprasmlist,left.location);
  198. case left.location.loc of
  199. LOC_CREFERENCE,
  200. LOC_REFERENCE :
  201. begin
  202. if left.location.size in [OS_64,OS_S64] then
  203. begin
  204. hregister:=rg.getregisterint(exprasmlist);
  205. emit_ref_reg(A_MOV,S_L,left.location.reference,hregister);
  206. pref:=left.location.reference;
  207. inc(pref.offset,4);
  208. emit_ref_reg(A_OR,S_L,pref,hregister);
  209. end
  210. else
  211. begin
  212. location_force_reg(exprasmlist,left.location,left.location.size,true);
  213. cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
  214. end;
  215. end;
  216. LOC_FLAGS :
  217. begin
  218. resflags:=left.location.resflags;
  219. end;
  220. LOC_REGISTER,LOC_CREGISTER :
  221. begin
  222. if left.location.size in [OS_64,OS_S64] then
  223. begin
  224. hregister:=cg.get_scratch_reg(exprasmlist);
  225. cg.a_load_reg_reg(exprasmlist,OS_32,left.location.registerlow,hregister);
  226. cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
  227. cg.free_scratch_reg(exprasmlist,hregister);
  228. end
  229. else
  230. cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
  231. end;
  232. LOC_JUMP :
  233. begin
  234. hregister:=rg.getregisterint(exprasmlist);
  235. getlabel(hlabel);
  236. cg.a_label(exprasmlist,truelabel);
  237. cg.a_load_const_reg(exprasmlist,OS_INT,1,hregister);
  238. cg.a_jmp_always(exprasmlist,hlabel);
  239. cg.a_label(exprasmlist,falselabel);
  240. cg.a_load_const_reg(exprasmlist,OS_INT,0,hregister);
  241. cg.a_label(exprasmlist,hlabel);
  242. cg.a_op_reg_reg(exprasmlist,OP_OR,OS_INT,hregister,hregister);
  243. end;
  244. else
  245. internalerror(10062);
  246. end;
  247. { load flags to register }
  248. location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def));
  249. location.register:=def_getreg(resulttype.def);
  250. cg.g_flags2reg(exprasmlist,resflags,location.register);
  251. truelabel:=oldtruelabel;
  252. falselabel:=oldfalselabel;
  253. end;
  254. {$ifdef TESTOBJEXT2}
  255. procedure ti386typeconvnode.checkobject;
  256. var
  257. r : preference;
  258. nillabel : plabel;
  259. begin
  260. new(r);
  261. reset_reference(r^);
  262. if p^.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
  263. r^.base:=p^.location.register
  264. else
  265. begin
  266. rg.getexplicitregisterint(exprasmlist,R_EDI);
  267. emit_mov_loc_reg(p^.location,R_EDI);
  268. r^.base:=R_EDI;
  269. end;
  270. { NIL must be accepted !! }
  271. emit_reg_reg(A_OR,S_L,r^.base,r^.base);
  272. rg.ungetregisterint(exprasmlist,R_EDI);
  273. getlabel(nillabel);
  274. emitjmp(C_E,nillabel);
  275. { this is one point where we need vmt_offset (PM) }
  276. r^.offset:= tobjectdef(tpointerdef(p^.resulttype.def).definition).vmt_offset;
  277. rg.getexplicitregisterint(exprasmlist,R_EDI);
  278. emit_ref_reg(A_MOV,S_L,r,R_EDI);
  279. emit_sym(A_PUSH,S_L,
  280. newasmsymbol(tobjectdef(tpointerdef(p^.resulttype.def).definition).vmt_mangledname));
  281. emit_reg(A_PUSH,S_L,R_EDI);
  282. rg.ungetregister32(exprasmlist,R_EDI);
  283. emitcall('FPC_CHECK_OBJECT_EXT');
  284. emitlab(nillabel);
  285. end;
  286. {$endif TESTOBJEXT2}
  287. procedure ti386typeconvnode.second_call_helper(c : tconverttype);
  288. const
  289. secondconvert : array[tconverttype] of pointer = (
  290. @second_nothing, {equal}
  291. @second_nothing, {not_possible}
  292. @second_nothing, {second_string_to_string, handled in resulttype pass }
  293. @second_char_to_string,
  294. @second_nothing, {char_to_charray}
  295. @second_nothing, { pchar_to_string, handled in resulttype pass }
  296. @second_nothing, {cchar_to_pchar}
  297. @second_cstring_to_pchar,
  298. @second_ansistring_to_pchar,
  299. @second_string_to_chararray,
  300. @second_nothing, { chararray_to_string, handled in resulttype pass }
  301. @second_array_to_pointer,
  302. @second_pointer_to_array,
  303. @second_int_to_int,
  304. @second_int_to_bool,
  305. @second_bool_to_bool,
  306. @second_bool_to_int,
  307. @second_real_to_real,
  308. @second_int_to_real,
  309. @second_proc_to_procvar,
  310. @second_nothing, { arrayconstructor_to_set }
  311. @second_nothing, { second_load_smallset, handled in first pass }
  312. @second_cord_to_pointer,
  313. @second_nothing, { interface 2 string }
  314. @second_nothing, { interface 2 guid }
  315. @second_class_to_intf,
  316. @second_char_to_char,
  317. @second_nothing, { normal_2_smallset }
  318. @second_nothing { dynarray_2_openarray }
  319. );
  320. type
  321. tprocedureofobject = procedure of object;
  322. var
  323. r : packed record
  324. proc : pointer;
  325. obj : pointer;
  326. end;
  327. begin
  328. { this is a little bit dirty but it works }
  329. { and should be quite portable too }
  330. r.proc:=secondconvert[c];
  331. r.obj:=self;
  332. tprocedureofobject(r){$ifdef FPC}();{$endif FPC}
  333. end;
  334. begin
  335. ctypeconvnode:=ti386typeconvnode;
  336. end.
  337. {
  338. $Log$
  339. Revision 1.40 2002-05-16 19:46:51 carl
  340. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  341. + try to fix temp allocation (still in ifdef)
  342. + generic constructor calls
  343. + start of tassembler / tmodulebase class cleanup
  344. Revision 1.38 2002/05/12 16:53:17 peter
  345. * moved entry and exitcode to ncgutil and cgobj
  346. * foreach gets extra argument for passing local data to the
  347. iterator function
  348. * -CR checks also class typecasts at runtime by changing them
  349. into as
  350. * fixed compiler to cycle with the -CR option
  351. * fixed stabs with elf writer, finally the global variables can
  352. be watched
  353. * removed a lot of routines from cga unit and replaced them by
  354. calls to cgobj
  355. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  356. u32bit then the other is typecasted also to u32bit without giving
  357. a rangecheck warning/error.
  358. * fixed pascal calling method with reversing also the high tree in
  359. the parast, detected by tcalcst3 test
  360. Revision 1.37 2002/04/21 19:02:07 peter
  361. * removed newn and disposen nodes, the code is now directly
  362. inlined from pexpr
  363. * -an option that will write the secondpass nodes to the .s file, this
  364. requires EXTDEBUG define to actually write the info
  365. * fixed various internal errors and crashes due recent code changes
  366. Revision 1.36 2002/04/21 15:35:23 carl
  367. * changeregsize -> rg.makeregsize
  368. Revision 1.35 2002/04/19 15:39:35 peter
  369. * removed some more routines from cga
  370. * moved location_force_reg/mem to ncgutil
  371. * moved arrayconstructnode secondpass to ncgld
  372. Revision 1.34 2002/04/15 19:44:21 peter
  373. * fixed stackcheck that would be called recursively when a stack
  374. error was found
  375. * generic changeregsize(reg,size) for i386 register resizing
  376. * removed some more routines from cga unit
  377. * fixed returnvalue handling
  378. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  379. Revision 1.33 2002/04/04 19:06:10 peter
  380. * removed unused units
  381. * use tlocation.size in cg.a_*loc*() routines
  382. Revision 1.32 2002/04/02 17:11:36 peter
  383. * tlocation,treference update
  384. * LOC_CONSTANT added for better constant handling
  385. * secondadd splitted in multiple routines
  386. * location_force_reg added for loading a location to a register
  387. of a specified size
  388. * secondassignment parses now first the right and then the left node
  389. (this is compatible with Kylix). This saves a lot of push/pop especially
  390. with string operations
  391. * adapted some routines to use the new cg methods
  392. Revision 1.31 2002/03/31 20:26:38 jonas
  393. + a_loadfpu_* and a_loadmm_* methods in tcg
  394. * register allocation is now handled by a class and is mostly processor
  395. independent (+rgobj.pas and i386/rgcpu.pas)
  396. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  397. * some small improvements and fixes to the optimizer
  398. * some register allocation fixes
  399. * some fpuvaroffset fixes in the unary minus node
  400. * push/popusedregisters is now called rg.save/restoreusedregisters and
  401. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  402. also better optimizable)
  403. * fixed and optimized register saving/restoring for new/dispose nodes
  404. * LOC_FPU locations now also require their "register" field to be set to
  405. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  406. - list field removed of the tnode class because it's not used currently
  407. and can cause hard-to-find bugs
  408. Revision 1.30 2002/03/04 19:10:13 peter
  409. * removed compiler warnings
  410. Revision 1.29 2001/12/30 17:24:46 jonas
  411. * range checking is now processor independent (part in cgobj,
  412. part in cg64f32) and should work correctly again (it needed
  413. some changes after the changes of the low and high of
  414. tordef's to int64)
  415. * maketojumpbool() is now processor independent (in ncgutil)
  416. * getregister32 is now called getregisterint
  417. Revision 1.28 2001/12/11 08:14:17 jonas
  418. * part of my fix for dynarray -> open array conversion, forgot to
  419. commit yesterday :(
  420. Revision 1.27 2001/11/02 23:24:12 jonas
  421. * fixed web bug 1665 (allow char to chararray type conversion) ("merged")
  422. Revision 1.26 2001/09/30 21:28:34 peter
  423. * int64->boolean fixed
  424. Revision 1.25 2001/09/30 16:12:47 jonas
  425. - removed unnecessary i386 pass_2 of as- and isnode and added dummy generic ones
  426. Revision 1.24 2001/09/29 21:32:47 jonas
  427. * almost all second pass typeconvnode helpers are now processor independent
  428. * fixed converting boolean to int64/qword
  429. * fixed register allocation bugs which could cause internalerror 10
  430. * isnode and asnode are completely processor indepent now as well
  431. * fpc_do_as now returns its class argument (necessary to be able to use it
  432. properly with compilerproc)
  433. Revision 1.23 2001/09/03 13:27:42 jonas
  434. * compilerproc implementation of set addition/substraction/...
  435. * changed the declaration of some set helpers somewhat to accomodate the
  436. above change
  437. * i386 still uses the old code for comparisons of sets, because its
  438. helpers return the results in the flags
  439. * dummy tc_normal_2_small_set type conversion because I need the original
  440. resulttype of the set add nodes
  441. NOTE: you have to start a cycle with 1.0.5!
  442. Revision 1.22 2001/08/29 19:49:03 jonas
  443. * some fixes in compilerprocs for chararray to string conversions
  444. * conversion from string to chararray is now also done via compilerprocs
  445. Revision 1.21 2001/08/28 13:24:47 jonas
  446. + compilerproc implementation of most string-related type conversions
  447. - removed all code from the compiler which has been replaced by
  448. compilerproc implementations (using $ifdef hascompilerproc is not
  449. necessary in the compiler)
  450. Revision 1.20 2001/08/26 13:36:57 florian
  451. * some cg reorganisation
  452. * some PPC updates
  453. Revision 1.19 2001/08/01 21:44:59 peter
  454. * fixed empty pwidechar register allocation
  455. Revision 1.18 2001/07/30 20:59:29 peter
  456. * m68k updates from v10 merged
  457. Revision 1.17 2001/07/16 13:19:08 jonas
  458. * fixed allocation of register before release in second_cstring_to_pchar
  459. Revision 1.16 2001/07/08 21:00:17 peter
  460. * various widestring updates, it works now mostly without charset
  461. mapping supported
  462. Revision 1.15 2001/05/08 21:06:33 florian
  463. * some more support for widechars commited especially
  464. regarding type casting and constants
  465. Revision 1.14 2001/04/13 01:22:18 peter
  466. * symtable change to classes
  467. * range check generation and errors fixed, make cycle DEBUG=1 works
  468. * memory leaks fixed
  469. Revision 1.13 2001/04/02 21:20:36 peter
  470. * resulttype rewrite
  471. Revision 1.12 2001/01/08 21:45:11 peter
  472. * internalerror for string to chararray
  473. Revision 1.11 2000/12/25 00:07:32 peter
  474. + new tlinkedlist class (merge of old tstringqueue,tcontainer and
  475. tlinkedlist objects)
  476. Revision 1.10 2000/12/07 17:19:46 jonas
  477. * new constant handling: from now on, hex constants >$7fffffff are
  478. parsed as unsigned constants (otherwise, $80000000 got sign extended
  479. and became $ffffffff80000000), all constants in the longint range
  480. become longints, all constants >$7fffffff and <=cardinal($ffffffff)
  481. are cardinals and the rest are int64's.
  482. * added lots of longint typecast to prevent range check errors in the
  483. compiler and rtl
  484. * type casts of symbolic ordinal constants are now preserved
  485. * fixed bug where the original resulttype.def wasn't restored correctly
  486. after doing a 64bit rangecheck
  487. Revision 1.9 2000/12/05 11:44:33 jonas
  488. + new integer regvar handling, should be much more efficient
  489. Revision 1.8 2000/11/29 00:30:46 florian
  490. * unused units removed from uses clause
  491. * some changes for widestrings
  492. Revision 1.7 2000/11/16 15:27:48 jonas
  493. * fixed web bug 1242
  494. Revision 1.6 2000/11/13 11:30:56 florian
  495. * some bugs with interfaces and NIL fixed
  496. Revision 1.5 2000/11/12 23:24:14 florian
  497. * interfaces are basically running
  498. Revision 1.4 2000/11/11 16:00:10 jonas
  499. * optimize converting of 8/16/32 bit constants to 64bit ones
  500. Revision 1.3 2000/11/04 14:25:23 florian
  501. + merged Attila's changes for interfaces, not tested yet
  502. Revision 1.2 2000/10/31 22:02:56 peter
  503. * symtable splitted, no real code changes
  504. Revision 1.1 2000/10/15 09:33:31 peter
  505. * moved n386*.pas to i386/ cpu_target dir
  506. Revision 1.1 2000/10/14 10:14:48 peter
  507. * moehrendorf oct 2000 rewrite
  508. }