macpas.pp 11 KB

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