i386.inc 21 KB

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