macpas.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. {
  2. This file is part of the Free Pascal Run time library.
  3. Copyright (c) 2004 by Olle Raab
  4. This unit contain procedures specific for mode MacPas.
  5. It should be platform independant.
  6. See the file COPYING.FPC, included in this distribution,
  7. For details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$mode objfpc}
  13. unit MacPas;
  14. interface
  15. { Using inlining for small system functions/wrappers }
  16. {$inline on}
  17. {$ifndef DISABLE_SYSTEMINLINE}
  18. {$define SYSTEMINLINE}
  19. {$endif}
  20. type
  21. {$ifndef FPUNONE}
  22. LongDouble = ValReal;
  23. {$endif}
  24. FourCharArray = packed array[1..4] of AnsiChar;
  25. UnsignedByte = Byte;
  26. UnsignedWord = Word;
  27. UnsignedLong = Longword;
  28. {FourCharCode coercion
  29. This routine coreces string literals to a FourCharCode.}
  30. function FCC(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  31. {Same as FCC, to be compatible with GPC}
  32. function FOUR_CHAR_CODE(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  33. { Same as the "is" operator }
  34. Function Member (Instance : TObject; AClass : TClass) : boolean; {$ifdef systeminline}inline;{$endif}
  35. function ord4(i: smallint): smallint; {$ifdef systeminline}inline;{$endif}
  36. function ord4(l: longint): longint; {$ifdef systeminline}inline;{$endif}
  37. function ord4(c: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  38. function ord4(p: pointer): ptrint; {$ifdef systeminline}inline;{$endif}
  39. function BAnd(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  40. function BAnd(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  41. function BAnd(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  42. function BAnd(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  43. function BOr(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  44. function BOr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  45. function BOr(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  46. function BOr(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  47. function BXor(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  48. function BXor(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  49. function BXor(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  50. function BXor(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  51. function Bsr(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  52. function Bsr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  53. function Bsr(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  54. function Bsr(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  55. function Bsl(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  56. function Bsl(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  57. function Bsl(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  58. function Bsl(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  59. function BTst(i: longint; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  60. function BTst(i,j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  61. function BTst(i: int64; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  62. function BTst(i: qword; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  63. procedure BSet(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  64. procedure BSet(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  65. procedure BSet(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  66. procedure BSet(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  67. procedure BClr(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  68. procedure BClr(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  69. procedure BClr(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  70. procedure BClr(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  71. function BRotL(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  72. function BRotL(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  73. function BRotL(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  74. function BRotL(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  75. function BRotR(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  76. function BRotR(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  77. function BRotR(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  78. function BRotR(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  79. function BNot(i: longint): longint; {$ifdef systeminline}inline;{$endif}
  80. function BNot(i: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  81. function BNot(i: int64): int64; {$ifdef systeminline}inline;{$endif}
  82. function BNot(i: qword): qword; {$ifdef systeminline}inline;{$endif}
  83. implementation
  84. {$IFDEF FPC_DOTTEDUNITS}
  85. uses
  86. System.Math;
  87. {$ELSE}
  88. uses
  89. math;
  90. {$ENDIF}
  91. {$r-}
  92. {$q-}
  93. function FCC(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  94. begin
  95. {$ifdef FPC_LITTLE_ENDIAN}
  96. FCC := (ord(literal[1]) shl 24) or (ord(literal[2]) shl 16) or (ord(literal[3]) shl 8) or ord(literal[4]);
  97. {$else FPC_LITTLE_ENDIAN}
  98. FCC := PLongWord(@literal[1])^;
  99. {$endif FPC_LITTLE_ENDIAN}
  100. end;
  101. function FOUR_CHAR_CODE(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  102. begin
  103. {$ifdef FPC_LITTLE_ENDIAN}
  104. FOUR_CHAR_CODE := (ord(literal[1]) shl 24) or (ord(literal[2]) shl 16) or (ord(literal[3]) shl 8) or ord(literal[4]);
  105. {$else FPC_LITTLE_ENDIAN}
  106. FOUR_CHAR_CODE := PLongWord(@literal[1])^;
  107. {$endif FPC_LITTLE_ENDIAN}
  108. end;
  109. Function Member (Instance : TObject; AClass : TClass) : boolean; {$ifdef systeminline}inline;{$endif}
  110. begin
  111. Result:=Instance is AClass;
  112. end;
  113. function ord4(i: smallint): smallint; {$ifdef systeminline}inline;{$endif}
  114. begin
  115. result:=i;
  116. end;
  117. function ord4(l: longint): longint; {$ifdef systeminline}inline;{$endif}
  118. begin
  119. result := l;
  120. end;
  121. function ord4(c: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  122. begin
  123. result := c;
  124. end;
  125. function ord4(p: pointer): ptrint; {$ifdef systeminline}inline;{$endif}
  126. begin
  127. result := ptrint(p);
  128. end;
  129. function BAnd(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  130. begin
  131. result := i and j;
  132. end;
  133. function BAnd(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  134. begin
  135. result := i and j;
  136. end;
  137. function BAnd(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  138. begin
  139. result := i and j;
  140. end;
  141. function BAnd(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  142. begin
  143. result := i and j;
  144. end;
  145. function BOr(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  146. begin
  147. result := i or j;
  148. end;
  149. function BOr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  150. begin
  151. result := i or j;
  152. end;
  153. function BOr(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  154. begin
  155. result := i or j;
  156. end;
  157. function BOr(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  158. begin
  159. result := i or j;
  160. end;
  161. function BXor(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  162. begin
  163. result := i xor j;
  164. end;
  165. function BXor(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  166. begin
  167. result := i xor j;
  168. end;
  169. function BXor(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  170. begin
  171. result := i xor j;
  172. end;
  173. function BXor(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  174. begin
  175. result := i xor j;
  176. end;
  177. function Bsr(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  178. begin
  179. result := i shr j;
  180. end;
  181. function Bsr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  182. begin
  183. result := i shr j;
  184. end;
  185. function Bsr(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  186. begin
  187. result := i shr j;
  188. end;
  189. function Bsr(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  190. begin
  191. result := i shr j;
  192. end;
  193. function Bsl(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  194. begin
  195. result := i shl j;
  196. end;
  197. function Bsl(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  198. begin
  199. result := i shl j;
  200. end;
  201. function Bsl(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  202. begin
  203. result := i shl j;
  204. end;
  205. function Bsl(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  206. begin
  207. result := i shl j;
  208. end;
  209. function BTst(i: longint; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  210. begin
  211. result := ((i shr j) and 1) <> 0;
  212. end;
  213. function BTst(i,j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  214. begin
  215. result := ((i shr j) and 1) <> 0;
  216. end;
  217. function BTst(i: int64; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  218. begin
  219. result := (cardinal(i shr j) and 1) <> 0;
  220. end;
  221. function BTst(i: qword; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  222. begin
  223. result := (cardinal(i shr j) and 1) <> 0;
  224. end;
  225. procedure BSet(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  226. begin
  227. i := i or (1 shl j);
  228. end;
  229. procedure BSet(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  230. begin
  231. i := i or (cardinal(1) shl j);
  232. end;
  233. procedure BSet(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  234. begin
  235. i := i or (int64(1) shl j);
  236. end;
  237. procedure BSet(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  238. begin
  239. i := i or (qword(1) shl j);
  240. end;
  241. procedure BClr(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  242. begin
  243. i := i and not (1 shl j);
  244. end;
  245. procedure BClr(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  246. begin
  247. i := i and not (1 shl j);
  248. end;
  249. procedure BClr(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  250. begin
  251. i := i and not (int64(1) shl j);
  252. end;
  253. procedure BClr(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  254. begin
  255. i := i and not (qword(1) shl j);
  256. end;
  257. function BRotL(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  258. begin
  259. result := (i shl j) or (i shr (32-j));
  260. end;
  261. function BRotL(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  262. begin
  263. result := (i shl j) or (i shr (32-j));
  264. end;
  265. function BRotL(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  266. begin
  267. result := (i shl j) or (i shr (64-j));
  268. end;
  269. function BRotL(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  270. begin
  271. result := (i shl j) or (i shr (64-j));
  272. end;
  273. function BRotR(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  274. begin
  275. result := (i shr j) or (i shl (32-j));
  276. end;
  277. function BRotR(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  278. begin
  279. result := (i shr j) or (i shl (32-j));
  280. end;
  281. function BRotR(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  282. begin
  283. result := (i shr j) or (i shl (64-j));
  284. end;
  285. function BRotR(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  286. begin
  287. result := (i shr j) or (i shl (64-j));
  288. end;
  289. function BNot(i: longint): longint; {$ifdef systeminline}inline;{$endif}
  290. begin
  291. result := not(i);
  292. end;
  293. function BNot(i: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  294. begin
  295. result := not(i);
  296. end;
  297. function BNot(i: int64): int64; {$ifdef systeminline}inline;{$endif}
  298. begin
  299. result := not(i);
  300. end;
  301. function BNot(i: qword): qword; {$ifdef systeminline}inline;{$endif}
  302. begin
  303. result := not(i);
  304. end;
  305. {$ifndef FPUNONE}
  306. begin
  307. SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision])
  308. {$endif}
  309. end.