123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by the Free Pascal development team
- This file contains some helper routines for qword
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$Q- no overflow checking }
- {$R- no range checking }
- {$ifndef FPC_SYSTEM_HAS_DIV_QWORD}
- {$define FPC_SYSTEM_HAS_DIV_QWORD}
- function fpc_div_qword(n,z : qword) : qword; compilerproc;
- var
- signmask, tmpz: qword;
- tmpq, rest: int64;
- begin
- { emulate unsigned division using signed division, see
- http://hackers-delight.org.ua/060.htm }
- signmask:=qword(not(SarInt64(int64(n),63)));
- tmpz:=z and signmask;
- tmpq:=(int64(tmpz shr 1) div int64(n)) * 2;
- rest:=z-tmpq*n;
- fpc_div_qword:=tmpq+ord(rest>=n);
- end;
- {$endif FPC_SYSTEM_HAS_DIV_QWORD}
- {$ifndef FPC_SYSTEM_HAS_MOD_QWORD}
- {$define FPC_SYSTEM_HAS_MOD_QWORD}
- function fpc_mod_qword(n,z : qword) : qword; compilerproc;
- var
- signmask, tmpz: qword;
- tmpq: int64;
- begin
- { emulate unsigned division using signed division, see
- http://hackers-delight.org.ua/060.htm }
- signmask:=qword(not(SarInt64(int64(n),63)));
- tmpz:=z and signmask;
- tmpq:=(int64(tmpz shr 1) div int64(n)) * 2;
- fpc_mod_qword:=z-tmpq*n;
- if fpc_mod_qword>=n then
- dec(fpc_mod_qword,n);
- end;
- {$endif FPC_SYSTEM_HAS_MOD_QWORD}
- { lie to prevent two overloads for sqr(jlong) }
- {$define FPC_SYSTEM_HAS_SQR_QWORD}
|