i386.inc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1993,97 by the Free Pascal development team.
  5. Processor dependent implementation for the system unit for
  6. intel i386+
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  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.
  12. **********************************************************************}
  13. {****************************************************************************
  14. Move / Fill
  15. ****************************************************************************}
  16. procedure Move(var source;var dest;count:longint);
  17. begin
  18. asm
  19. movl dest,%edi
  20. movl source,%esi
  21. movl %edi,%eax
  22. movl count,%ebx
  23. { Check for back or forward }
  24. sub %esi,%eax
  25. jz .LMoveEnd { Do nothing when source=dest }
  26. jc .LFMove { Do forward, dest<source }
  27. cmp %ebx,%eax
  28. jb .LBMove { Dest is in range of move, do backward }
  29. { Forward Copy }
  30. .LFMove:
  31. cld
  32. cmpl $15,%ebx
  33. jl .LFMove1
  34. movl %edi,%ecx { Align on 32bits }
  35. negl %ecx
  36. andl $3,%ecx
  37. subl %ecx,%ebx
  38. rep
  39. movsb
  40. movl %ebx,%ecx
  41. andl $3,%ebx
  42. shrl $2,%ecx
  43. rep
  44. movsl
  45. .LFMove1:
  46. movl %ebx,%ecx
  47. rep
  48. movsb
  49. jmp .LMoveEnd
  50. { Backward Copy }
  51. .LBMove:
  52. std
  53. addl %ebx,%esi
  54. addl %ebx,%edi
  55. movl %edi,%ecx
  56. decl %esi
  57. decl %edi
  58. cmpl $15,%ebx
  59. jl .LBMove1
  60. negl %ecx { Align on 32bits }
  61. andl $3,%ecx
  62. subl %ecx,%ebx
  63. rep
  64. movsb
  65. movl %ebx,%ecx
  66. andl $3,%ebx
  67. shrl $2,%ecx
  68. subl $3,%esi
  69. subl $3,%edi
  70. rep
  71. movsl
  72. addl $3,%esi
  73. addl $3,%edi
  74. .LBMove1:
  75. movl %ebx,%ecx
  76. rep
  77. movsb
  78. cld
  79. .LMoveEnd:
  80. end;
  81. end;
  82. Procedure FillChar(var x;count:longint;value:byte);[alias: 'FILL_OBJECT'];
  83. begin
  84. asm
  85. cld
  86. movl x,%edi
  87. movl value,%eax { Only lower 8 bits will be used }
  88. movl count,%ecx
  89. cmpl $7,%ecx
  90. jl .LFill1
  91. movb %al,%ah
  92. movl %eax,%ebx
  93. shll $16,%eax
  94. movl %ecx,%edx
  95. movw %bx,%ax
  96. movl %edi,%ecx { Align on 32bits }
  97. negl %ecx
  98. andl $3,%ecx
  99. subl %ecx,%edx
  100. rep
  101. stosb
  102. movl %edx,%ecx
  103. andl $3,%edx
  104. shrl $2,%ecx
  105. rep
  106. stosl
  107. movl %edx,%ecx
  108. .LFill1:
  109. rep
  110. stosb
  111. end;
  112. end;
  113. procedure fillword(var x;count : longint;value : word);
  114. begin
  115. asm
  116. movl 8(%ebp),%edi
  117. movl 12(%ebp),%ecx
  118. movl 16(%ebp),%eax
  119. movl %eax,%edx
  120. shll $16,%eax
  121. movw %dx,%ax
  122. movl %ecx,%edx
  123. shrl $1,%ecx
  124. cld
  125. rep
  126. stosl
  127. movl %edx,%ecx
  128. andl $1,%ecx
  129. rep
  130. stosw
  131. end ['EAX','ECX','EDX','EDI'];
  132. end;
  133. {****************************************************************************
  134. Object Helpers
  135. ****************************************************************************}
  136. {$I386_DIRECT}
  137. procedure int_help_constructor;assembler; [public,alias:'HELP_CONSTRUCTOR'];
  138. asm
  139. { Entry without preamble, since we need the ESP of the constructor
  140. Stack (relative to %ebp):
  141. 12 Self
  142. 8 VMT-Address
  143. 4 main programm-Addr
  144. 0 %ebp
  145. }
  146. { eax isn't touched anywhere, so it doesn't have to reloaded }
  147. movl 8(%ebp),%eax
  148. { initialise self ? }
  149. orl %esi,%esi
  150. jne .LHC_4
  151. { get memory, but save register first temporary variable }
  152. subl $4,%esp
  153. movl %esp,%esi
  154. { Save Register}
  155. pushal
  156. { Memory size }
  157. pushl (%eax)
  158. pushl %esi
  159. call GETMEM
  160. popal
  161. { Memory size to %esi }
  162. movl (%esi),%esi
  163. addl $4,%esp
  164. { If no memory available : fail() }
  165. orl %esi,%esi
  166. jz .LHC_5
  167. { init self for the constructor }
  168. movl %esi,12(%ebp)
  169. .LHC_4:
  170. { is there a VMT address ? }
  171. orl %eax,%eax
  172. jnz .LHC_7
  173. { In case the constructor doesn't do anything, the Zero-Flag }
  174. { can't be put, because this calls Fail() }
  175. incl %eax
  176. ret
  177. .LHC_7:
  178. { set zero inside the object }
  179. pushal
  180. pushw $0
  181. pushl (%eax)
  182. pushl %esi
  183. call FILL_OBJECT
  184. popal
  185. { set the VMT address for the new created object }
  186. movl %eax,(%esi)
  187. orl %eax,%eax
  188. .LHC_5:
  189. end;
  190. procedure help_fail;assembler;
  191. asm
  192. end;
  193. procedure int_new_class;assembler;[public,alias:'NEW_CLASS'];
  194. asm
  195. { create class ? }
  196. movl 8(%ebp),%edi
  197. orl %edi,%edi
  198. jz .LNEW_CLASS1
  199. { esi contains the vmt }
  200. pushl %esi
  201. { call newinstance (class method!) }
  202. call 16(%esi)
  203. { newinstance returns a pointer to the new created }
  204. { instance in eax }
  205. { load esi and insert self }
  206. movl %eax,8(%ebp)
  207. movl %eax,%esi
  208. ret
  209. .LNEW_CLASS1:
  210. movl %esi,8(%ebp)
  211. end;
  212. procedure int_dispose_class;assembler;[public,alias:'DISPOSE_CLASS'];
  213. asm
  214. { destroy class ? }
  215. movl 8(%ebp),%edi
  216. { save self }
  217. movl %esi,8(%ebp)
  218. orl %edi,%edi
  219. jz .LDISPOSE_CLASS1
  220. { no inherited call }
  221. movl (%esi),%edi
  222. { push self }
  223. pushl %esi
  224. { call freeinstance }
  225. call 20(%edi)
  226. .LDISPOSE_CLASS1:
  227. { load self }
  228. movl 8(%ebp),%esi
  229. end;
  230. { checks for a correct vmt pointer }
  231. procedure int_check_object;assembler;[public,alias:'CHECK_OBJECT'];
  232. asm
  233. pushl %edi
  234. movl 8(%esp),%edi
  235. pushl %eax
  236. { Here we must check if the VMT pointer is nil before }
  237. { accessing it... }
  238. { WARNING: Will only probably work with GAS, as fields }
  239. { are ZEROED automatically in BSS, which might not be }
  240. { the case with other linkers/assemblers... }
  241. orl %edi,%edi
  242. jz .Lco_re
  243. movl (%edi),%eax
  244. addl 4(%edi),%eax
  245. jnz .Lco_re
  246. popl %eax
  247. popl %edi
  248. ret $4
  249. .Lco_re:
  250. pushw $210
  251. call runerror
  252. end;
  253. procedure int_help_destructor;assembler;[public,alias:'HELP_DESTRUCTOR'];
  254. asm
  255. { Stack (relative to %ebp):
  256. 12 Self
  257. 8 VMT-Address
  258. 4 Main program-Addr
  259. 0 %ebp
  260. }
  261. { temporary Variable }
  262. subl $4,%esp
  263. movl %esp,%edi
  264. pushal
  265. { Should the object be resolved ? }
  266. movl 8(%ebp),%eax
  267. orl %eax,%eax
  268. jz .LHD_3
  269. { Yes, get size from SELF! }
  270. movl 12(%ebp),%eax
  271. { get VMT-pointer (from Self) to %ebx }
  272. movl (%eax),%ebx
  273. { And put size on the Stack }
  274. pushl (%ebx)
  275. { SELF }
  276. { I think for precaution }
  277. { that we should clear the VMT here }
  278. movl $0,(%eax)
  279. movl %eax,(%edi)
  280. pushl %edi
  281. call FREEMEM
  282. .LHD_3:
  283. popal
  284. addl $4,%esp
  285. end;
  286. {****************************************************************************
  287. String
  288. ****************************************************************************}
  289. procedure strcopy(dstr,sstr:pointer;len:longint);[public,alias:'STRCOPY'];
  290. {
  291. this procedure must save all modified registers except EDI and ESI !!!
  292. }
  293. begin
  294. asm
  295. pushl %eax
  296. pushl %ecx
  297. cld
  298. movl 16(%ebp),%edi
  299. movl 12(%ebp),%esi
  300. xorl %eax,%eax
  301. movl 8(%ebp),%ecx
  302. lodsb
  303. cmpl %ecx,%eax
  304. jbe .LStrCopy1
  305. movl %ecx,%eax
  306. .LStrCopy1:
  307. stosb
  308. cmpl $7,%eax
  309. jl .LStrCopy2
  310. movl %edi,%ecx { Align on 32bits }
  311. negl %ecx
  312. andl $3,%ecx
  313. subl %ecx,%eax
  314. rep
  315. movsb
  316. movl %eax,%ecx
  317. andl $3,%eax
  318. shrl $2,%ecx
  319. rep
  320. movsl
  321. .LStrCopy2:
  322. movl %eax,%ecx
  323. rep
  324. movsb
  325. popl %ecx
  326. popl %eax
  327. end ['ECX','EAX','ESI','EDI'];
  328. end;
  329. procedure strconcat(s1,s2 : pointer);[public,alias: 'STRCONCAT'];
  330. begin
  331. asm
  332. xorl %ecx,%ecx
  333. movl 12(%ebp),%edi
  334. movl 8(%ebp),%esi
  335. movl %edi,%ebx
  336. movb (%edi),%cl
  337. lea 1(%edi,%ecx),%edi
  338. negl %ecx
  339. xor %eax,%eax
  340. addl $0xff,%ecx
  341. lodsb
  342. cmpl %ecx,%eax
  343. jbe .LStrConcat1
  344. movl %ecx,%eax
  345. .LStrConcat1:
  346. addb %al,(%ebx)
  347. cmpl $7,%eax
  348. jl .LStrConcat2
  349. movl %edi,%ecx { Align on 32bits }
  350. negl %ecx
  351. andl $3,%ecx
  352. subl %ecx,%eax
  353. rep
  354. movsb
  355. movl %eax,%ecx
  356. andl $3,%eax
  357. shrl $2,%ecx
  358. rep
  359. movsl
  360. .LStrConcat2:
  361. movl %eax,%ecx
  362. rep
  363. movsb
  364. end ['EBX','ECX','EAX','ESI','EDI'];
  365. end;
  366. procedure strcmp(dstr,sstr : pointer);[public,alias: 'STRCMP'];
  367. begin
  368. asm
  369. cld
  370. xorl %ebx,%ebx
  371. xorl %eax,%eax
  372. movl 12(%ebp),%esi
  373. movl 8(%ebp),%edi
  374. movb (%esi),%al
  375. movb (%edi),%bl
  376. movl %eax,%edx
  377. incl %esi
  378. incl %edi
  379. cmpl %ebx,%eax
  380. jbe .LStrCmp1
  381. movl %ebx,%eax
  382. .LStrCmp1:
  383. cmpl $7,%eax
  384. jl .LStrCmp2
  385. movl %edi,%ecx { Align on 32bits }
  386. negl %ecx
  387. andl $3,%ecx
  388. subl %ecx,%eax
  389. orl %ecx,%ecx
  390. rep
  391. cmpsb
  392. jne .LStrCmp3
  393. movl %eax,%ecx
  394. andl $3,%eax
  395. shrl $2,%ecx
  396. orl %ecx,%ecx
  397. rep
  398. cmpsl
  399. je .LStrCmp2
  400. movl $4,%eax
  401. sub %eax,%esi
  402. sub %eax,%edi
  403. .LStrCmp2:
  404. movl %eax,%ecx
  405. orl %eax,%eax
  406. rep
  407. cmpsb
  408. jne .LStrCmp3
  409. cmp %ebx,%edx
  410. .LStrCmp3:
  411. end ['EDX','ECX','EBX','EAX','ESI','EDI'];
  412. end;
  413. function strpas(p:pchar):string;
  414. begin
  415. asm
  416. cld
  417. movl 12(%ebp),%edi
  418. movl $0xff,%ecx
  419. xorl %eax,%eax
  420. movl %edi,%esi
  421. repne
  422. scasb
  423. movl %ecx,%eax
  424. movl 8(%ebp),%edi
  425. notb %al
  426. decl %eax
  427. stosb
  428. cmpl $7,%eax
  429. jl .LStrPas2
  430. movl %edi,%ecx { Align on 32bits }
  431. negl %ecx
  432. andl $3,%ecx
  433. subl %ecx,%eax
  434. rep
  435. movsb
  436. movl %eax,%ecx
  437. andl $3,%eax
  438. shrl $2,%ecx
  439. rep
  440. movsl
  441. .LStrPas2:
  442. movl %eax,%ecx
  443. rep
  444. movsb
  445. end ['ECX','EAX','ESI','EDI'];
  446. end;
  447. function strlen(p:pchar):longint;assembler;
  448. asm
  449. movl p,%edi
  450. movl $0xffffffff,%ecx
  451. xorl %eax,%eax
  452. cld
  453. repne
  454. scasb
  455. movl $0xfffffffe,%eax
  456. subl %ecx,%eax
  457. end ['EDI','ECX','EAX'];
  458. {****************************************************************************
  459. Other
  460. ****************************************************************************}
  461. function get_addr(addrbp:longint):longint;assembler;
  462. asm
  463. movl addrbp,%eax
  464. orl %eax,%eax
  465. jz .Lg_a_null
  466. movl 4(%eax),%eax
  467. .Lg_a_null:
  468. end ['EAX'];
  469. function get_next_frame(framebp:longint):longint;assembler;
  470. asm
  471. movl framebp,%eax
  472. orl %eax,%eax
  473. jz .Lgnf_null
  474. movl (%eax),%eax
  475. .Lgnf_null:
  476. end ['EAX'];
  477. procedure runerror(w : word);[alias: 'runerror'];
  478. function get_addr : longint;
  479. begin
  480. asm
  481. movl (%ebp),%eax
  482. movl 4(%eax),%eax
  483. movl %eax,__RESULT
  484. end ['EAX'];
  485. end;
  486. function get_error_bp : longint;
  487. begin
  488. asm
  489. movl (%ebp),%eax {%ebp of run_error}
  490. movl %eax,__RESULT
  491. end ['EAX'];
  492. end;
  493. begin
  494. errorcode:=w;
  495. exitcode:=w;
  496. erroraddr:=pointer(get_addr);
  497. errorbase:=get_error_bp;
  498. doError:=True;
  499. halt(errorcode);
  500. end;
  501. procedure int_iocheck(addr : longint);[public,alias: 'IOCHECK'];
  502. var
  503. l : longint;
  504. begin
  505. { Since IOCHECK is called directly and only later the optimiser }
  506. { Maybe also save global registers }
  507. asm
  508. pushal
  509. end;
  510. l:=ioresult;
  511. if l<>0 then
  512. begin
  513. writeln('IO-Error ',l,' at ',addr);
  514. halt(l);
  515. end;
  516. asm
  517. popal
  518. end;
  519. end;
  520. procedure int_re_overflow;[public,alias: 'RE_OVERFLOW'];
  521. var
  522. addr : longint;
  523. begin
  524. { Overflow was shortly before the return address }
  525. asm
  526. movl 4(%ebp),%edi
  527. movl %edi,addr
  528. end;
  529. writeln('Overflow at ',addr);
  530. RunError(215);
  531. end;
  532. function abs(l:longint):longint;assembler;
  533. asm
  534. movl l,%eax
  535. orl %eax,%eax
  536. jns .LMABS1
  537. negl %eax
  538. .LMABS1:
  539. end ['EAX'];
  540. function odd(l:longint):boolean;assembler;
  541. asm
  542. movl l,%eax
  543. andl $1,%eax
  544. setnz %al
  545. end ['EAX'];
  546. function sqr(l:longint):longint;assembler;
  547. asm
  548. mov l,%eax
  549. imull %eax,%eax
  550. end ['EAX'];
  551. procedure int_str(l : longint;var s : string);
  552. var
  553. buffer : array[0..11] of byte;
  554. begin
  555. { Workaround: }
  556. if l=$80000000 then
  557. begin
  558. s:='-2147483648';
  559. exit;
  560. end;
  561. asm
  562. movl 8(%ebp),%eax // load Integer
  563. movl 12(%ebp),%edi // Load String address
  564. xorl %ecx,%ecx // String length=0
  565. xorl %ebx,%ebx // Buffer length=0
  566. movl $0x0a,%esi // load 10 as dividing constant.
  567. or %eax,%eax // Sign ?
  568. jns .LM2
  569. neg %eax
  570. movb $0x2d,1(%edi) // put '-' in String
  571. incl %ecx
  572. .LM2:
  573. cdq
  574. idivl %esi,%eax
  575. addb $0x30,%dl // convert Rest to ASCII.
  576. movb %dl,-12(%ebp,%ebx)
  577. incl %ebx
  578. cmpl $0,%eax
  579. jnz .LM2
  580. // copy String
  581. .LM3:
  582. movb -13(%ebp,%ebx),%al // -13 because EBX is decreased only
  583. // later.
  584. movb %al,1(%edi,%ecx)
  585. incl %ecx
  586. decl %ebx
  587. jnz .LM3
  588. movb %cl,(%edi) // Copy String length
  589. end;
  590. end;
  591. procedure int_str(c : cardinal;var s : string);
  592. var
  593. buffer : array[0..14] of byte;
  594. begin
  595. asm
  596. movl 8(%ebp),%eax // load CARDINAL
  597. movl 12(%ebp),%edi // Load String address
  598. xorl %ecx,%ecx // String length=0
  599. xorl %ebx,%ebx // Buffer length=0
  600. movl $0x0a,%esi // load 10 as dividing constant.
  601. .LM4:
  602. xorl %edx,%edx
  603. divl %esi,%eax
  604. addb $0x30,%dl // convert Rest to ASCII.
  605. movb %dl,-12(%ebp,%ebx)
  606. incl %ebx
  607. cmpl $0,%eax
  608. jnz .LM4
  609. { now copy the string }
  610. .LM5:
  611. movb -13(%ebp,%ebx),%al // -13 because EBX is decreased only
  612. // later.
  613. movb %al,1(%edi,%ecx)
  614. incl %ecx
  615. decl %ebx
  616. jnz .LM5
  617. movb %cl,(%edi) // Copy String length
  618. end;
  619. end;
  620. procedure f1;[public,alias: 'FLUSH_STDOUT'];
  621. begin
  622. asm
  623. pushal
  624. end;
  625. FileFunc(textrec(output).flushfunc)(textrec(output));
  626. asm
  627. popal
  628. end;
  629. end;
  630. Function Sptr : Longint;
  631. begin
  632. asm
  633. movl %esp,%eax
  634. addl $8,%eax
  635. movl %eax,-4(%ebp)
  636. end ['EAX'];
  637. end;
  638. {$I386_ATT}
  639. Function Random(L: LongInt): LongInt;assembler;
  640. asm
  641. movl $134775813,%eax
  642. mull RandSeed
  643. incl %eax
  644. movl %eax,RandSeed
  645. mull 4(%esp)
  646. movl %edx,%eax
  647. end;
  648. {$I386_DIRECT}
  649. {
  650. $Log$
  651. Revision 1.10 1998-05-25 10:40:49 peter
  652. * remake3 works again on tflily
  653. Revision 1.5 1998/04/29 13:28:19 peter
  654. * some cleanup and i386_att usage
  655. Revision 1.4 1998/04/10 15:41:54 florian
  656. + some small comments added
  657. Revision 1.3 1998/04/10 15:25:23 michael
  658. - Removed so-called better random function
  659. Revision 1.2 1998/04/08 07:53:31 michael
  660. + Changed Random() function. Moved from system to processor dependent files (from Pedro Gimeno)
  661. Revision 1.1.1.1 1998/03/25 11:18:43 root
  662. * Restored version
  663. Revision 1.30 1998/03/20 05:11:17 carl
  664. * bugfix of register usage list for strcmp and strconcat
  665. Revision 1.29 1998/03/15 19:38:41 peter
  666. * fixed a bug in Move()
  667. Revision 1.28 1998/03/10 23:50:39 florian
  668. * strcopy saves now the used registers except ESI and EDI, solves
  669. a problem with the optimizer
  670. Revision 1.27 1998/03/10 16:25:52 jonas
  671. * removed reloading of eax with 8(ebp), in int_help_constructor, as eax is nowhere modified
  672. Revision 1.25 1998/03/02 11:44:43 florian
  673. * writing of large cardinals fixed
  674. Revision 1.24 1998/03/02 04:14:02 carl
  675. * page fault bug fix with CHECK_OBJECT
  676. warning: Will only work with GAS as VMT pointer field is an
  677. .lcomm and will be ZEROED by linker (might not be true for TASM)
  678. Revision 1.23 1998/02/24 17:50:46 peter
  679. * upto 100% (255's char is different ;) faster STRCMP
  680. * faster StrPas from i386.inc also strings.pp
  681. Revision 1.22 1998/02/22 22:01:26 carl
  682. + IOCHECK halts with the correct errorcode now
  683. Revision 1.21 1998/02/11 16:55:14 michael
  684. fixed cardinal printing. Large cardinals (>0fffffff) not yet working
  685. Revision 1.20 1998/02/06 09:12:39 florian
  686. * bug in CHECK_OBJECT fixed
  687. Revision 1.19 1998/02/05 22:30:25 florian
  688. + CHECK_OBJECT to check for an valid VMT (before calling a virtual method)
  689. Revision 1.18 1998/02/04 14:46:36 daniel
  690. * Some small tweaks
  691. Revision 1.17 1998/01/27 22:05:07 florian
  692. * again small fixes to DOM (Delphi Object Model)
  693. Revision 1.16 1998/01/26 11:59:01 michael
  694. + Added log at the end
  695. revision 1.15
  696. date: 1998/01/25 22:52:52; author: peter; state: Exp; lines: +140 -122
  697. * Faster string functions by using aligning
  698. ----------------------------
  699. revision 1.14
  700. date: 1998/01/25 22:30:48; author: florian; state: Exp; lines: +14 -2
  701. * DOM: some fixes to tobject and the con-/destructor help routines
  702. ----------------------------
  703. revision 1.13
  704. date: 1998/01/23 18:08:29; author: florian; state: Exp; lines: +10 -4
  705. * more bugs in FCL object model removed
  706. ----------------------------
  707. revision 1.12
  708. date: 1998/01/23 15:54:47; author: florian; state: Exp; lines: +5 -5
  709. + small extensions to FCL object model
  710. ----------------------------
  711. revision 1.11
  712. date: 1998/01/20 00:14:24; author: peter; state: Exp; lines: +18 -5
  713. * .type is linux only, go32v2 doesn't like it
  714. ----------------------------
  715. revision 1.10
  716. date: 1998/01/19 16:19:53; author: peter; state: Exp; lines: +7 -1
  717. * Works now correct with shared libs, .globl always needs a .type
  718. ----------------------------
  719. revision 1.9
  720. date: 1998/01/19 10:21:35; author: michael; state: Exp; lines: +1 -6
  721. * moved Fillchar t(..,char) to system.inc
  722. ----------------------------
  723. revision 1.8
  724. date: 1998/01/19 09:15:05; author: michael; state: Exp; lines: +40 -132
  725. * Bugfixes in Move and FillChar
  726. ----------------------------
  727. revision 1.7
  728. date: 1998/01/16 23:10:52; author: florian; state: Exp; lines: +23 -1
  729. + some tobject stuff
  730. ----------------------------
  731. revision 1.6
  732. date: 1998/01/16 22:21:35; author: michael; state: Exp; lines: +601 -493
  733. + Installed pentium-optimized move (optional)
  734. ----------------------------
  735. revision 1.5
  736. date: 1998/01/12 03:39:17; author: carl; state: Exp; lines: +2 -2
  737. * bugfix of RE_OVERFLOW, gives out now a Runerror(215)
  738. ----------------------------
  739. revision 1.4
  740. date: 1998/01/01 16:57:36; author: michael; state: Exp; lines: +1 -21
  741. Moved DO_EXIT to system.inc. Now processor independent
  742. ----------------------------
  743. revision 1.3
  744. date: 1997/12/10 12:12:31; author: michael; state: Exp; lines: +2 -2
  745. * changed dateifunc to FileFunc
  746. ----------------------------
  747. revision 1.2
  748. date: 1997/12/01 12:34:36; author: michael; state: Exp; lines: +13 -0
  749. + added copyright reference in header.
  750. ----------------------------
  751. revision 1.1
  752. date: 1997/11/27 08:33:48; author: michael; state: Exp;
  753. Initial revision
  754. ----------------------------
  755. revision 1.1.1.1
  756. date: 1997/11/27 08:33:48; author: michael; state: Exp; lines: +0 -0
  757. FPC RTL CVS start
  758. =============================================================================
  759. }