webassembly.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2022 by Nikolay Nikolov
  4. This unit contains some WebAssembly-specific routines
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit WebAssembly;
  12. {$mode objfpc}
  13. interface
  14. procedure AtomicFence; inline;
  15. function AtomicLoad(constref Mem: Int8): Int8; inline;
  16. function AtomicLoad(constref Mem: UInt8): UInt8; inline;
  17. function AtomicLoad(constref Mem: Int16): Int16; inline;
  18. function AtomicLoad(constref Mem: UInt16): UInt16; inline;
  19. function AtomicLoad(constref Mem: Int32): Int32; inline;
  20. function AtomicLoad(constref Mem: UInt32): UInt32; inline;
  21. function AtomicLoad(constref Mem: Int64): Int64; inline;
  22. function AtomicLoad(constref Mem: UInt64): UInt64; inline;
  23. procedure AtomicStore(out Mem: Int8; Data: Int8); inline;
  24. procedure AtomicStore(out Mem: UInt8; Data: UInt8); inline;
  25. procedure AtomicStore(out Mem: Int16; Data: Int16); inline;
  26. procedure AtomicStore(out Mem: UInt16; Data: UInt16); inline;
  27. procedure AtomicStore(out Mem: Int32; Data: Int32); inline;
  28. procedure AtomicStore(out Mem: UInt32; Data: UInt32); inline;
  29. procedure AtomicStore(out Mem: Int64; Data: Int64); inline;
  30. procedure AtomicStore(out Mem: UInt64; Data: UInt64); inline;
  31. function AtomicAdd(var Mem: Int8; Data: Int8): Int8; inline;
  32. function AtomicAdd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  33. function AtomicAdd(var Mem: Int16; Data: Int16): Int16; inline;
  34. function AtomicAdd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  35. function AtomicAdd(var Mem: Int32; Data: Int32): Int32; inline;
  36. function AtomicAdd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  37. function AtomicAdd(var Mem: Int64; Data: Int64): Int64; inline;
  38. function AtomicAdd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  39. function AtomicSub(var Mem: Int8; Data: Int8): Int8; inline;
  40. function AtomicSub(var Mem: UInt8; Data: UInt8): UInt8; inline;
  41. function AtomicSub(var Mem: Int16; Data: Int16): Int16; inline;
  42. function AtomicSub(var Mem: UInt16; Data: UInt16): UInt16; inline;
  43. function AtomicSub(var Mem: Int32; Data: Int32): Int32; inline;
  44. function AtomicSub(var Mem: UInt32; Data: UInt32): UInt32; inline;
  45. function AtomicSub(var Mem: Int64; Data: Int64): Int64; inline;
  46. function AtomicSub(var Mem: UInt64; Data: UInt64): UInt64; inline;
  47. function AtomicAnd(var Mem: Int8; Data: Int8): Int8; inline;
  48. function AtomicAnd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  49. function AtomicAnd(var Mem: Int16; Data: Int16): Int16; inline;
  50. function AtomicAnd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  51. function AtomicAnd(var Mem: Int32; Data: Int32): Int32; inline;
  52. function AtomicAnd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  53. function AtomicAnd(var Mem: Int64; Data: Int64): Int64; inline;
  54. function AtomicAnd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  55. function AtomicOr(var Mem: Int8; Data: Int8): Int8; inline;
  56. function AtomicOr(var Mem: UInt8; Data: UInt8): UInt8; inline;
  57. function AtomicOr(var Mem: Int16; Data: Int16): Int16; inline;
  58. function AtomicOr(var Mem: UInt16; Data: UInt16): UInt16; inline;
  59. function AtomicOr(var Mem: Int32; Data: Int32): Int32; inline;
  60. function AtomicOr(var Mem: UInt32; Data: UInt32): UInt32; inline;
  61. function AtomicOr(var Mem: Int64; Data: Int64): Int64; inline;
  62. function AtomicOr(var Mem: UInt64; Data: UInt64): UInt64; inline;
  63. function AtomicXor(var Mem: Int8; Data: Int8): Int8; inline;
  64. function AtomicXor(var Mem: UInt8; Data: UInt8): UInt8; inline;
  65. function AtomicXor(var Mem: Int16; Data: Int16): Int16; inline;
  66. function AtomicXor(var Mem: UInt16; Data: UInt16): UInt16; inline;
  67. function AtomicXor(var Mem: Int32; Data: Int32): Int32; inline;
  68. function AtomicXor(var Mem: UInt32; Data: UInt32): UInt32; inline;
  69. function AtomicXor(var Mem: Int64; Data: Int64): Int64; inline;
  70. function AtomicXor(var Mem: UInt64; Data: UInt64): UInt64; inline;
  71. function AtomicExchange(var Mem: Int8; Data: Int8): Int8; inline;
  72. function AtomicExchange(var Mem: UInt8; Data: UInt8): UInt8; inline;
  73. function AtomicExchange(var Mem: Int16; Data: Int16): Int16; inline;
  74. function AtomicExchange(var Mem: UInt16; Data: UInt16): UInt16; inline;
  75. function AtomicExchange(var Mem: Int32; Data: Int32): Int32; inline;
  76. function AtomicExchange(var Mem: UInt32; Data: UInt32): UInt32; inline;
  77. function AtomicExchange(var Mem: Int64; Data: Int64): Int64; inline;
  78. function AtomicExchange(var Mem: UInt64; Data: UInt64): UInt64; inline;
  79. function AtomicCompareExchange(var Mem: Int8; Compare, Data: Int8): Int8; inline;
  80. function AtomicCompareExchange(var Mem: UInt8; Compare, Data: UInt8): UInt8; inline;
  81. function AtomicCompareExchange(var Mem: Int16; Compare, Data: Int16): Int16; inline;
  82. function AtomicCompareExchange(var Mem: UInt16; Compare, Data: UInt16): UInt16; inline;
  83. function AtomicCompareExchange(var Mem: Int32; Compare, Data: Int32): Int32; inline;
  84. function AtomicCompareExchange(var Mem: UInt32; Compare, Data: UInt32): UInt32; inline;
  85. function AtomicCompareExchange(var Mem: Int64; Compare, Data: Int64): Int64; inline;
  86. function AtomicCompareExchange(var Mem: UInt64; Compare, Data: UInt64): UInt64; inline;
  87. implementation
  88. {$I cpuh.inc}
  89. procedure AtomicFence; inline;
  90. begin
  91. fpc_wasm32_atomic_fence;
  92. end;
  93. function AtomicLoad(constref Mem: Int8): Int8; inline;
  94. begin
  95. AtomicLoad:=Int8(fpc_wasm32_i32_atomic_load8_u(@Mem));
  96. end;
  97. function AtomicLoad(constref Mem: UInt8): UInt8; inline;
  98. begin
  99. AtomicLoad:=UInt8(fpc_wasm32_i32_atomic_load8_u(@Mem));
  100. end;
  101. function AtomicLoad(constref Mem: Int16): Int16; inline;
  102. begin
  103. AtomicLoad:=Int16(fpc_wasm32_i32_atomic_load16_u(@Mem));
  104. end;
  105. function AtomicLoad(constref Mem: UInt16): UInt16; inline;
  106. begin
  107. AtomicLoad:=UInt16(fpc_wasm32_i32_atomic_load16_u(@Mem));
  108. end;
  109. function AtomicLoad(constref Mem: Int32): Int32; inline;
  110. begin
  111. AtomicLoad:=Int32(fpc_wasm32_i32_atomic_load(@Mem));
  112. end;
  113. function AtomicLoad(constref Mem: UInt32): UInt32; inline;
  114. begin
  115. AtomicLoad:=UInt32(fpc_wasm32_i32_atomic_load(@Mem));
  116. end;
  117. function AtomicLoad(constref Mem: Int64): Int64; inline;
  118. begin
  119. AtomicLoad:=Int64(fpc_wasm32_i64_atomic_load(@Mem));
  120. end;
  121. function AtomicLoad(constref Mem: UInt64): UInt64; inline;
  122. begin
  123. AtomicLoad:=UInt64(fpc_wasm32_i64_atomic_load(@Mem));
  124. end;
  125. procedure AtomicStore(out Mem: Int8; Data: Int8); inline;
  126. begin
  127. fpc_wasm32_i32_atomic_store8(@Mem,Byte(Data));
  128. end;
  129. procedure AtomicStore(out Mem: UInt8; Data: UInt8); inline;
  130. begin
  131. fpc_wasm32_i32_atomic_store8(@Mem,Data);
  132. end;
  133. procedure AtomicStore(out Mem: Int16; Data: Int16); inline;
  134. begin
  135. fpc_wasm32_i32_atomic_store16(@Mem,Word(Data));
  136. end;
  137. procedure AtomicStore(out Mem: UInt16; Data: UInt16); inline;
  138. begin
  139. fpc_wasm32_i32_atomic_store16(@Mem,Data);
  140. end;
  141. procedure AtomicStore(out Mem: Int32; Data: Int32); inline;
  142. begin
  143. fpc_wasm32_i32_atomic_store(@Mem,LongWord(Data));
  144. end;
  145. procedure AtomicStore(out Mem: UInt32; Data: UInt32); inline;
  146. begin
  147. fpc_wasm32_i32_atomic_store(@Mem,Data);
  148. end;
  149. procedure AtomicStore(out Mem: Int64; Data: Int64); inline;
  150. begin
  151. fpc_wasm32_i64_atomic_store(@Mem,QWord(Data));
  152. end;
  153. procedure AtomicStore(out Mem: UInt64; Data: UInt64); inline;
  154. begin
  155. fpc_wasm32_i64_atomic_store(@Mem,Data);
  156. end;
  157. function AtomicAdd(var Mem: Int8; Data: Int8): Int8; inline;
  158. begin
  159. AtomicAdd:=Int8(fpc_wasm32_i32_atomic_rmw8_add_u(@Mem,Byte(Data)));
  160. end;
  161. function AtomicAdd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  162. begin
  163. AtomicAdd:=UInt8(fpc_wasm32_i32_atomic_rmw8_add_u(@Mem,Data));
  164. end;
  165. function AtomicAdd(var Mem: Int16; Data: Int16): Int16; inline;
  166. begin
  167. AtomicAdd:=Int16(fpc_wasm32_i32_atomic_rmw16_add_u(@Mem,Word(Data)));
  168. end;
  169. function AtomicAdd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  170. begin
  171. AtomicAdd:=UInt16(fpc_wasm32_i32_atomic_rmw16_add_u(@Mem,Data));
  172. end;
  173. function AtomicAdd(var Mem: Int32; Data: Int32): Int32; inline;
  174. begin
  175. AtomicAdd:=Int32(fpc_wasm32_i32_atomic_rmw_add(@Mem,LongWord(Data)));
  176. end;
  177. function AtomicAdd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  178. begin
  179. AtomicAdd:=fpc_wasm32_i32_atomic_rmw_add(@Mem,Data);
  180. end;
  181. function AtomicAdd(var Mem: Int64; Data: Int64): Int64; inline;
  182. begin
  183. AtomicAdd:=Int64(fpc_wasm32_i64_atomic_rmw_add(@Mem,QWord(Data)));
  184. end;
  185. function AtomicAdd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  186. begin
  187. AtomicAdd:=fpc_wasm32_i64_atomic_rmw_add(@Mem,Data);
  188. end;
  189. function AtomicSub(var Mem: Int8; Data: Int8): Int8; inline;
  190. begin
  191. AtomicSub:=Int8(fpc_wasm32_i32_atomic_rmw8_sub_u(@Mem,Byte(Data)));
  192. end;
  193. function AtomicSub(var Mem: UInt8; Data: UInt8): UInt8; inline;
  194. begin
  195. AtomicSub:=UInt8(fpc_wasm32_i32_atomic_rmw8_sub_u(@Mem,Data));
  196. end;
  197. function AtomicSub(var Mem: Int16; Data: Int16): Int16; inline;
  198. begin
  199. AtomicSub:=Int16(fpc_wasm32_i32_atomic_rmw16_sub_u(@Mem,Word(Data)));
  200. end;
  201. function AtomicSub(var Mem: UInt16; Data: UInt16): UInt16; inline;
  202. begin
  203. AtomicSub:=UInt16(fpc_wasm32_i32_atomic_rmw16_sub_u(@Mem,Data));
  204. end;
  205. function AtomicSub(var Mem: Int32; Data: Int32): Int32; inline;
  206. begin
  207. AtomicSub:=Int32(fpc_wasm32_i32_atomic_rmw_sub(@Mem,LongWord(Data)));
  208. end;
  209. function AtomicSub(var Mem: UInt32; Data: UInt32): UInt32; inline;
  210. begin
  211. AtomicSub:=fpc_wasm32_i32_atomic_rmw_sub(@Mem,Data);
  212. end;
  213. function AtomicSub(var Mem: Int64; Data: Int64): Int64; inline;
  214. begin
  215. AtomicSub:=Int64(fpc_wasm32_i64_atomic_rmw_sub(@Mem,QWord(Data)));
  216. end;
  217. function AtomicSub(var Mem: UInt64; Data: UInt64): UInt64; inline;
  218. begin
  219. AtomicSub:=fpc_wasm32_i64_atomic_rmw_sub(@Mem,Data);
  220. end;
  221. function AtomicAnd(var Mem: Int8; Data: Int8): Int8; inline;
  222. begin
  223. AtomicAnd:=Int8(fpc_wasm32_i32_atomic_rmw8_and_u(@Mem,Byte(Data)));
  224. end;
  225. function AtomicAnd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  226. begin
  227. AtomicAnd:=UInt8(fpc_wasm32_i32_atomic_rmw8_and_u(@Mem,Data));
  228. end;
  229. function AtomicAnd(var Mem: Int16; Data: Int16): Int16; inline;
  230. begin
  231. AtomicAnd:=Int16(fpc_wasm32_i32_atomic_rmw16_and_u(@Mem,Word(Data)));
  232. end;
  233. function AtomicAnd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  234. begin
  235. AtomicAnd:=UInt16(fpc_wasm32_i32_atomic_rmw16_and_u(@Mem,Data));
  236. end;
  237. function AtomicAnd(var Mem: Int32; Data: Int32): Int32; inline;
  238. begin
  239. AtomicAnd:=Int32(fpc_wasm32_i32_atomic_rmw_and(@Mem,LongWord(Data)));
  240. end;
  241. function AtomicAnd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  242. begin
  243. AtomicAnd:=fpc_wasm32_i32_atomic_rmw_and(@Mem,Data);
  244. end;
  245. function AtomicAnd(var Mem: Int64; Data: Int64): Int64; inline;
  246. begin
  247. AtomicAnd:=Int64(fpc_wasm32_i64_atomic_rmw_and(@Mem,QWord(Data)));
  248. end;
  249. function AtomicAnd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  250. begin
  251. AtomicAnd:=fpc_wasm32_i64_atomic_rmw_and(@Mem,Data);
  252. end;
  253. function AtomicOr(var Mem: Int8; Data: Int8): Int8; inline;
  254. begin
  255. AtomicOr:=Int8(fpc_wasm32_i32_atomic_rmw8_or_u(@Mem,Byte(Data)));
  256. end;
  257. function AtomicOr(var Mem: UInt8; Data: UInt8): UInt8; inline;
  258. begin
  259. AtomicOr:=UInt8(fpc_wasm32_i32_atomic_rmw8_or_u(@Mem,Data));
  260. end;
  261. function AtomicOr(var Mem: Int16; Data: Int16): Int16; inline;
  262. begin
  263. AtomicOr:=Int16(fpc_wasm32_i32_atomic_rmw16_or_u(@Mem,Word(Data)));
  264. end;
  265. function AtomicOr(var Mem: UInt16; Data: UInt16): UInt16; inline;
  266. begin
  267. AtomicOr:=UInt16(fpc_wasm32_i32_atomic_rmw16_or_u(@Mem,Data));
  268. end;
  269. function AtomicOr(var Mem: Int32; Data: Int32): Int32; inline;
  270. begin
  271. AtomicOr:=Int32(fpc_wasm32_i32_atomic_rmw_or(@Mem,LongWord(Data)));
  272. end;
  273. function AtomicOr(var Mem: UInt32; Data: UInt32): UInt32; inline;
  274. begin
  275. AtomicOr:=fpc_wasm32_i32_atomic_rmw_or(@Mem,Data);
  276. end;
  277. function AtomicOr(var Mem: Int64; Data: Int64): Int64; inline;
  278. begin
  279. AtomicOr:=Int64(fpc_wasm32_i64_atomic_rmw_or(@Mem,QWord(Data)));
  280. end;
  281. function AtomicOr(var Mem: UInt64; Data: UInt64): UInt64; inline;
  282. begin
  283. AtomicOr:=fpc_wasm32_i64_atomic_rmw_or(@Mem,Data);
  284. end;
  285. function AtomicXor(var Mem: Int8; Data: Int8): Int8; inline;
  286. begin
  287. AtomicXor:=Int8(fpc_wasm32_i32_atomic_rmw8_xor_u(@Mem,Byte(Data)));
  288. end;
  289. function AtomicXor(var Mem: UInt8; Data: UInt8): UInt8; inline;
  290. begin
  291. AtomicXor:=UInt8(fpc_wasm32_i32_atomic_rmw8_xor_u(@Mem,Data));
  292. end;
  293. function AtomicXor(var Mem: Int16; Data: Int16): Int16; inline;
  294. begin
  295. AtomicXor:=Int16(fpc_wasm32_i32_atomic_rmw16_xor_u(@Mem,Word(Data)));
  296. end;
  297. function AtomicXor(var Mem: UInt16; Data: UInt16): UInt16; inline;
  298. begin
  299. AtomicXor:=UInt16(fpc_wasm32_i32_atomic_rmw16_xor_u(@Mem,Data));
  300. end;
  301. function AtomicXor(var Mem: Int32; Data: Int32): Int32; inline;
  302. begin
  303. AtomicXor:=Int32(fpc_wasm32_i32_atomic_rmw_xor(@Mem,LongWord(Data)));
  304. end;
  305. function AtomicXor(var Mem: UInt32; Data: UInt32): UInt32; inline;
  306. begin
  307. AtomicXor:=fpc_wasm32_i32_atomic_rmw_xor(@Mem,Data);
  308. end;
  309. function AtomicXor(var Mem: Int64; Data: Int64): Int64; inline;
  310. begin
  311. AtomicXor:=Int64(fpc_wasm32_i64_atomic_rmw_xor(@Mem,QWord(Data)));
  312. end;
  313. function AtomicXor(var Mem: UInt64; Data: UInt64): UInt64; inline;
  314. begin
  315. AtomicXor:=fpc_wasm32_i64_atomic_rmw_xor(@Mem,Data);
  316. end;
  317. function AtomicExchange(var Mem: Int8; Data: Int8): Int8; inline;
  318. begin
  319. AtomicExchange:=Int8(fpc_wasm32_i32_atomic_rmw8_xchg_u(@Mem,Byte(Data)));
  320. end;
  321. function AtomicExchange(var Mem: UInt8; Data: UInt8): UInt8; inline;
  322. begin
  323. AtomicExchange:=UInt8(fpc_wasm32_i32_atomic_rmw8_xchg_u(@Mem,Data));
  324. end;
  325. function AtomicExchange(var Mem: Int16; Data: Int16): Int16; inline;
  326. begin
  327. AtomicExchange:=Int16(fpc_wasm32_i32_atomic_rmw16_xchg_u(@Mem,Word(Data)));
  328. end;
  329. function AtomicExchange(var Mem: UInt16; Data: UInt16): UInt16; inline;
  330. begin
  331. AtomicExchange:=UInt16(fpc_wasm32_i32_atomic_rmw16_xchg_u(@Mem,Data));
  332. end;
  333. function AtomicExchange(var Mem: Int32; Data: Int32): Int32; inline;
  334. begin
  335. AtomicExchange:=Int32(fpc_wasm32_i32_atomic_rmw_xchg(@Mem,LongWord(Data)));
  336. end;
  337. function AtomicExchange(var Mem: UInt32; Data: UInt32): UInt32; inline;
  338. begin
  339. AtomicExchange:=fpc_wasm32_i32_atomic_rmw_xchg(@Mem,Data);
  340. end;
  341. function AtomicExchange(var Mem: Int64; Data: Int64): Int64; inline;
  342. begin
  343. AtomicExchange:=Int64(fpc_wasm32_i64_atomic_rmw_xchg(@Mem,QWord(Data)));
  344. end;
  345. function AtomicExchange(var Mem: UInt64; Data: UInt64): UInt64; inline;
  346. begin
  347. AtomicExchange:=fpc_wasm32_i64_atomic_rmw_xchg(@Mem,Data);
  348. end;
  349. function AtomicCompareExchange(var Mem: Int8; Compare, Data: Int8): Int8; inline;
  350. begin
  351. AtomicCompareExchange:=Int8(fpc_wasm32_i32_atomic_rmw8_cmpxchg_u(@Mem,Byte(Compare),Byte(Data)));
  352. end;
  353. function AtomicCompareExchange(var Mem: UInt8; Compare, Data: UInt8): UInt8; inline;
  354. begin
  355. AtomicCompareExchange:=UInt8(fpc_wasm32_i32_atomic_rmw8_cmpxchg_u(@Mem,Compare,Data));
  356. end;
  357. function AtomicCompareExchange(var Mem: Int16; Compare, Data: Int16): Int16; inline;
  358. begin
  359. AtomicCompareExchange:=Int16(fpc_wasm32_i32_atomic_rmw16_cmpxchg_u(@Mem,Word(Compare),Word(Data)));
  360. end;
  361. function AtomicCompareExchange(var Mem: UInt16; Compare, Data: UInt16): UInt16; inline;
  362. begin
  363. AtomicCompareExchange:=UInt16(fpc_wasm32_i32_atomic_rmw16_cmpxchg_u(@Mem,Compare,Data));
  364. end;
  365. function AtomicCompareExchange(var Mem: Int32; Compare, Data: Int32): Int32; inline;
  366. begin
  367. AtomicCompareExchange:=Int32(fpc_wasm32_i32_atomic_rmw_cmpxchg_u(@Mem,LongWord(Compare),LongWord(Data)));
  368. end;
  369. function AtomicCompareExchange(var Mem: UInt32; Compare, Data: UInt32): UInt32; inline;
  370. begin
  371. AtomicCompareExchange:=fpc_wasm32_i32_atomic_rmw_cmpxchg_u(@Mem,Compare,Data);
  372. end;
  373. function AtomicCompareExchange(var Mem: Int64; Compare, Data: Int64): Int64; inline;
  374. begin
  375. AtomicCompareExchange:=Int64(fpc_wasm32_i64_atomic_rmw_cmpxchg_u(@Mem,QWord(Compare),QWord(Data)));
  376. end;
  377. function AtomicCompareExchange(var Mem: UInt64; Compare, Data: UInt64): UInt64; inline;
  378. begin
  379. AtomicCompareExchange:=fpc_wasm32_i64_atomic_rmw_cmpxchg_u(@Mem,Compare,Data);
  380. end;
  381. end.