webassembly.pp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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. interface
  13. procedure AtomicFence; inline;
  14. function AtomicAdd(var Mem: Int8; Data: Int8): Int8; inline;
  15. function AtomicAdd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  16. function AtomicAdd(var Mem: Int16; Data: Int16): Int16; inline;
  17. function AtomicAdd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  18. function AtomicAdd(var Mem: Int32; Data: Int32): Int32; inline;
  19. function AtomicAdd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  20. function AtomicAdd(var Mem: Int64; Data: Int64): Int64; inline;
  21. function AtomicAdd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  22. function AtomicSub(var Mem: Int8; Data: Int8): Int8; inline;
  23. function AtomicSub(var Mem: UInt8; Data: UInt8): UInt8; inline;
  24. function AtomicSub(var Mem: Int16; Data: Int16): Int16; inline;
  25. function AtomicSub(var Mem: UInt16; Data: UInt16): UInt16; inline;
  26. function AtomicSub(var Mem: Int32; Data: Int32): Int32; inline;
  27. function AtomicSub(var Mem: UInt32; Data: UInt32): UInt32; inline;
  28. function AtomicSub(var Mem: Int64; Data: Int64): Int64; inline;
  29. function AtomicSub(var Mem: UInt64; Data: UInt64): UInt64; inline;
  30. function AtomicAnd(var Mem: Int8; Data: Int8): Int8; inline;
  31. function AtomicAnd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  32. function AtomicAnd(var Mem: Int16; Data: Int16): Int16; inline;
  33. function AtomicAnd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  34. function AtomicAnd(var Mem: Int32; Data: Int32): Int32; inline;
  35. function AtomicAnd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  36. function AtomicAnd(var Mem: Int64; Data: Int64): Int64; inline;
  37. function AtomicAnd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  38. function AtomicOr(var Mem: Int8; Data: Int8): Int8; inline;
  39. function AtomicOr(var Mem: UInt8; Data: UInt8): UInt8; inline;
  40. function AtomicOr(var Mem: Int16; Data: Int16): Int16; inline;
  41. function AtomicOr(var Mem: UInt16; Data: UInt16): UInt16; inline;
  42. function AtomicOr(var Mem: Int32; Data: Int32): Int32; inline;
  43. function AtomicOr(var Mem: UInt32; Data: UInt32): UInt32; inline;
  44. function AtomicOr(var Mem: Int64; Data: Int64): Int64; inline;
  45. function AtomicOr(var Mem: UInt64; Data: UInt64): UInt64; inline;
  46. function AtomicXor(var Mem: Int8; Data: Int8): Int8; inline;
  47. function AtomicXor(var Mem: UInt8; Data: UInt8): UInt8; inline;
  48. function AtomicXor(var Mem: Int16; Data: Int16): Int16; inline;
  49. function AtomicXor(var Mem: UInt16; Data: UInt16): UInt16; inline;
  50. function AtomicXor(var Mem: Int32; Data: Int32): Int32; inline;
  51. function AtomicXor(var Mem: UInt32; Data: UInt32): UInt32; inline;
  52. function AtomicXor(var Mem: Int64; Data: Int64): Int64; inline;
  53. function AtomicXor(var Mem: UInt64; Data: UInt64): UInt64; inline;
  54. function AtomicExchange(var Mem: Int8; Data: Int8): Int8; inline;
  55. function AtomicExchange(var Mem: UInt8; Data: UInt8): UInt8; inline;
  56. function AtomicExchange(var Mem: Int16; Data: Int16): Int16; inline;
  57. function AtomicExchange(var Mem: UInt16; Data: UInt16): UInt16; inline;
  58. function AtomicExchange(var Mem: Int32; Data: Int32): Int32; inline;
  59. function AtomicExchange(var Mem: UInt32; Data: UInt32): UInt32; inline;
  60. function AtomicExchange(var Mem: Int64; Data: Int64): Int64; inline;
  61. function AtomicExchange(var Mem: UInt64; Data: UInt64): UInt64; inline;
  62. implementation
  63. {$I cpuh.inc}
  64. procedure AtomicFence; inline;
  65. begin
  66. fpc_wasm32_atomic_fence;
  67. end;
  68. function AtomicAdd(var Mem: Int8; Data: Int8): Int8; inline;
  69. begin
  70. AtomicAdd:=Int8(fpc_wasm32_i32_atomic_rmw8_add_u(@Mem,Byte(Data)));
  71. end;
  72. function AtomicAdd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  73. begin
  74. AtomicAdd:=UInt8(fpc_wasm32_i32_atomic_rmw8_add_u(@Mem,Data));
  75. end;
  76. function AtomicAdd(var Mem: Int16; Data: Int16): Int16; inline;
  77. begin
  78. AtomicAdd:=Int16(fpc_wasm32_i32_atomic_rmw16_add_u(@Mem,Word(Data)));
  79. end;
  80. function AtomicAdd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  81. begin
  82. AtomicAdd:=UInt16(fpc_wasm32_i32_atomic_rmw16_add_u(@Mem,Data));
  83. end;
  84. function AtomicAdd(var Mem: Int32; Data: Int32): Int32; inline;
  85. begin
  86. AtomicAdd:=Int32(fpc_wasm32_i32_atomic_rmw_add(@Mem,LongWord(Data)));
  87. end;
  88. function AtomicAdd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  89. begin
  90. AtomicAdd:=fpc_wasm32_i32_atomic_rmw_add(@Mem,Data);
  91. end;
  92. function AtomicAdd(var Mem: Int64; Data: Int64): Int64; inline;
  93. begin
  94. AtomicAdd:=Int64(fpc_wasm32_i64_atomic_rmw_add(@Mem,QWord(Data)));
  95. end;
  96. function AtomicAdd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  97. begin
  98. AtomicAdd:=fpc_wasm32_i64_atomic_rmw_add(@Mem,Data);
  99. end;
  100. function AtomicSub(var Mem: Int8; Data: Int8): Int8; inline;
  101. begin
  102. AtomicSub:=Int8(fpc_wasm32_i32_atomic_rmw8_sub_u(@Mem,Byte(Data)));
  103. end;
  104. function AtomicSub(var Mem: UInt8; Data: UInt8): UInt8; inline;
  105. begin
  106. AtomicSub:=UInt8(fpc_wasm32_i32_atomic_rmw8_sub_u(@Mem,Data));
  107. end;
  108. function AtomicSub(var Mem: Int16; Data: Int16): Int16; inline;
  109. begin
  110. AtomicSub:=Int16(fpc_wasm32_i32_atomic_rmw16_sub_u(@Mem,Word(Data)));
  111. end;
  112. function AtomicSub(var Mem: UInt16; Data: UInt16): UInt16; inline;
  113. begin
  114. AtomicSub:=UInt16(fpc_wasm32_i32_atomic_rmw16_sub_u(@Mem,Data));
  115. end;
  116. function AtomicSub(var Mem: Int32; Data: Int32): Int32; inline;
  117. begin
  118. AtomicSub:=Int32(fpc_wasm32_i32_atomic_rmw_sub(@Mem,LongWord(Data)));
  119. end;
  120. function AtomicSub(var Mem: UInt32; Data: UInt32): UInt32; inline;
  121. begin
  122. AtomicSub:=fpc_wasm32_i32_atomic_rmw_sub(@Mem,Data);
  123. end;
  124. function AtomicSub(var Mem: Int64; Data: Int64): Int64; inline;
  125. begin
  126. AtomicSub:=Int64(fpc_wasm32_i64_atomic_rmw_sub(@Mem,QWord(Data)));
  127. end;
  128. function AtomicSub(var Mem: UInt64; Data: UInt64): UInt64; inline;
  129. begin
  130. AtomicSub:=fpc_wasm32_i64_atomic_rmw_sub(@Mem,Data);
  131. end;
  132. function AtomicAnd(var Mem: Int8; Data: Int8): Int8; inline;
  133. begin
  134. AtomicAnd:=Int8(fpc_wasm32_i32_atomic_rmw8_and_u(@Mem,Byte(Data)));
  135. end;
  136. function AtomicAnd(var Mem: UInt8; Data: UInt8): UInt8; inline;
  137. begin
  138. AtomicAnd:=UInt8(fpc_wasm32_i32_atomic_rmw8_and_u(@Mem,Data));
  139. end;
  140. function AtomicAnd(var Mem: Int16; Data: Int16): Int16; inline;
  141. begin
  142. AtomicAnd:=Int16(fpc_wasm32_i32_atomic_rmw16_and_u(@Mem,Word(Data)));
  143. end;
  144. function AtomicAnd(var Mem: UInt16; Data: UInt16): UInt16; inline;
  145. begin
  146. AtomicAnd:=UInt16(fpc_wasm32_i32_atomic_rmw16_and_u(@Mem,Data));
  147. end;
  148. function AtomicAnd(var Mem: Int32; Data: Int32): Int32; inline;
  149. begin
  150. AtomicAnd:=Int32(fpc_wasm32_i32_atomic_rmw_and(@Mem,LongWord(Data)));
  151. end;
  152. function AtomicAnd(var Mem: UInt32; Data: UInt32): UInt32; inline;
  153. begin
  154. AtomicAnd:=fpc_wasm32_i32_atomic_rmw_and(@Mem,Data);
  155. end;
  156. function AtomicAnd(var Mem: Int64; Data: Int64): Int64; inline;
  157. begin
  158. AtomicAnd:=Int64(fpc_wasm32_i64_atomic_rmw_and(@Mem,QWord(Data)));
  159. end;
  160. function AtomicAnd(var Mem: UInt64; Data: UInt64): UInt64; inline;
  161. begin
  162. AtomicAnd:=fpc_wasm32_i64_atomic_rmw_and(@Mem,Data);
  163. end;
  164. function AtomicOr(var Mem: Int8; Data: Int8): Int8; inline;
  165. begin
  166. AtomicOr:=Int8(fpc_wasm32_i32_atomic_rmw8_or_u(@Mem,Byte(Data)));
  167. end;
  168. function AtomicOr(var Mem: UInt8; Data: UInt8): UInt8; inline;
  169. begin
  170. AtomicOr:=UInt8(fpc_wasm32_i32_atomic_rmw8_or_u(@Mem,Data));
  171. end;
  172. function AtomicOr(var Mem: Int16; Data: Int16): Int16; inline;
  173. begin
  174. AtomicOr:=Int16(fpc_wasm32_i32_atomic_rmw16_or_u(@Mem,Word(Data)));
  175. end;
  176. function AtomicOr(var Mem: UInt16; Data: UInt16): UInt16; inline;
  177. begin
  178. AtomicOr:=UInt16(fpc_wasm32_i32_atomic_rmw16_or_u(@Mem,Data));
  179. end;
  180. function AtomicOr(var Mem: Int32; Data: Int32): Int32; inline;
  181. begin
  182. AtomicOr:=Int32(fpc_wasm32_i32_atomic_rmw_or(@Mem,LongWord(Data)));
  183. end;
  184. function AtomicOr(var Mem: UInt32; Data: UInt32): UInt32; inline;
  185. begin
  186. AtomicOr:=fpc_wasm32_i32_atomic_rmw_or(@Mem,Data);
  187. end;
  188. function AtomicOr(var Mem: Int64; Data: Int64): Int64; inline;
  189. begin
  190. AtomicOr:=Int64(fpc_wasm32_i64_atomic_rmw_or(@Mem,QWord(Data)));
  191. end;
  192. function AtomicOr(var Mem: UInt64; Data: UInt64): UInt64; inline;
  193. begin
  194. AtomicOr:=fpc_wasm32_i64_atomic_rmw_or(@Mem,Data);
  195. end;
  196. function AtomicXor(var Mem: Int8; Data: Int8): Int8; inline;
  197. begin
  198. AtomicXor:=Int8(fpc_wasm32_i32_atomic_rmw8_xor_u(@Mem,Byte(Data)));
  199. end;
  200. function AtomicXor(var Mem: UInt8; Data: UInt8): UInt8; inline;
  201. begin
  202. AtomicXor:=UInt8(fpc_wasm32_i32_atomic_rmw8_xor_u(@Mem,Data));
  203. end;
  204. function AtomicXor(var Mem: Int16; Data: Int16): Int16; inline;
  205. begin
  206. AtomicXor:=Int16(fpc_wasm32_i32_atomic_rmw16_xor_u(@Mem,Word(Data)));
  207. end;
  208. function AtomicXor(var Mem: UInt16; Data: UInt16): UInt16; inline;
  209. begin
  210. AtomicXor:=UInt16(fpc_wasm32_i32_atomic_rmw16_xor_u(@Mem,Data));
  211. end;
  212. function AtomicXor(var Mem: Int32; Data: Int32): Int32; inline;
  213. begin
  214. AtomicXor:=Int32(fpc_wasm32_i32_atomic_rmw_xor(@Mem,LongWord(Data)));
  215. end;
  216. function AtomicXor(var Mem: UInt32; Data: UInt32): UInt32; inline;
  217. begin
  218. AtomicXor:=fpc_wasm32_i32_atomic_rmw_xor(@Mem,Data);
  219. end;
  220. function AtomicXor(var Mem: Int64; Data: Int64): Int64; inline;
  221. begin
  222. AtomicXor:=Int64(fpc_wasm32_i64_atomic_rmw_xor(@Mem,QWord(Data)));
  223. end;
  224. function AtomicXor(var Mem: UInt64; Data: UInt64): UInt64; inline;
  225. begin
  226. AtomicXor:=fpc_wasm32_i64_atomic_rmw_xor(@Mem,Data);
  227. end;
  228. function AtomicExchange(var Mem: Int8; Data: Int8): Int8; inline;
  229. begin
  230. AtomicExchange:=Int8(fpc_wasm32_i32_atomic_rmw8_xchg_u(@Mem,Byte(Data)));
  231. end;
  232. function AtomicExchange(var Mem: UInt8; Data: UInt8): UInt8; inline;
  233. begin
  234. AtomicExchange:=UInt8(fpc_wasm32_i32_atomic_rmw8_xchg_u(@Mem,Data));
  235. end;
  236. function AtomicExchange(var Mem: Int16; Data: Int16): Int16; inline;
  237. begin
  238. AtomicExchange:=Int16(fpc_wasm32_i32_atomic_rmw16_xchg_u(@Mem,Word(Data)));
  239. end;
  240. function AtomicExchange(var Mem: UInt16; Data: UInt16): UInt16; inline;
  241. begin
  242. AtomicExchange:=UInt16(fpc_wasm32_i32_atomic_rmw16_xchg_u(@Mem,Data));
  243. end;
  244. function AtomicExchange(var Mem: Int32; Data: Int32): Int32; inline;
  245. begin
  246. AtomicExchange:=Int32(fpc_wasm32_i32_atomic_rmw_xchg(@Mem,LongWord(Data)));
  247. end;
  248. function AtomicExchange(var Mem: UInt32; Data: UInt32): UInt32; inline;
  249. begin
  250. AtomicExchange:=fpc_wasm32_i32_atomic_rmw_xchg(@Mem,Data);
  251. end;
  252. function AtomicExchange(var Mem: Int64; Data: Int64): Int64; inline;
  253. begin
  254. AtomicExchange:=Int64(fpc_wasm32_i64_atomic_rmw_xchg(@Mem,QWord(Data)));
  255. end;
  256. function AtomicExchange(var Mem: UInt64; Data: UInt64): UInt64; inline;
  257. begin
  258. AtomicExchange:=fpc_wasm32_i64_atomic_rmw_xchg(@Mem,Data);
  259. end;
  260. end.