macpas.pp 11 KB

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