macpas.pp 11 KB

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