浏览代码

+ added AtomicStore() to the WebAssembly unit

Nikolay Nikolov 3 年之前
父节点
当前提交
7cac9d2f02
共有 3 个文件被更改,包括 53 次插入2 次删除
  1. 1 1
      rtl/wasi/Makefile
  2. 1 1
      rtl/wasi/Makefile.fpc
  3. 51 0
      rtl/wasm32/webassembly.pp

+ 1 - 1
rtl/wasi/Makefile

@@ -3031,7 +3031,7 @@ si_prc$(PPUEXT) : si_prc.pp $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $<
 si_dll$(PPUEXT) : si_dll.pp $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $<
-webassembly$(PPUEXT) : $(PROCINC)/webassembly.pp $(SYSTEMUNIT)$(PPUEXT) $(PROCINC)/cpuh.inc $(PROCINC)/cpuinnr.inc
+webassembly$(PPUEXT) : $(PROCINC)/webassembly.pp $(SYSTEMUNIT)$(PPUEXT) $(PROCINC)/cpuh.inc $(PROCINC)/cpuinnr.inc objpas$(PPUEXT)
 	$(COMPILER) $<
 wasiapi$(PPUEXT) : wasiapi.pp wasiinc/wasitypes.inc wasiinc/wasiprocs.inc $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $< -Fiwasiinc

+ 1 - 1
rtl/wasi/Makefile.fpc

@@ -96,7 +96,7 @@ si_dll$(PPUEXT) : si_dll.pp $(SYSTEMUNIT)$(PPUEXT)
 # Other $(SYSTEMUNIT)-dependent RTL Units
 #
 
-webassembly$(PPUEXT) : $(PROCINC)/webassembly.pp $(SYSTEMUNIT)$(PPUEXT) $(PROCINC)/cpuh.inc $(PROCINC)/cpuinnr.inc
+webassembly$(PPUEXT) : $(PROCINC)/webassembly.pp $(SYSTEMUNIT)$(PPUEXT) $(PROCINC)/cpuh.inc $(PROCINC)/cpuinnr.inc objpas$(PPUEXT)
         $(COMPILER) $<
 
 wasiapi$(PPUEXT) : wasiapi.pp wasiinc/wasitypes.inc wasiinc/wasiprocs.inc $(SYSTEMUNIT)$(PPUEXT)

+ 51 - 0
rtl/wasm32/webassembly.pp

@@ -15,6 +15,8 @@
 
 unit WebAssembly;
 
+{$mode objfpc}
+
 interface
 
 procedure AtomicFence; inline;
@@ -28,6 +30,15 @@ function AtomicLoad(constref Mem: UInt32): UInt32; inline;
 function AtomicLoad(constref Mem: Int64): Int64; inline;
 function AtomicLoad(constref Mem: UInt64): UInt64; inline;
 
+procedure AtomicStore(out Mem: Int8; Data: Int8); inline;
+procedure AtomicStore(out Mem: UInt8; Data: UInt8); inline;
+procedure AtomicStore(out Mem: Int16; Data: Int16); inline;
+procedure AtomicStore(out Mem: UInt16; Data: UInt16); inline;
+procedure AtomicStore(out Mem: Int32; Data: Int32); inline;
+procedure AtomicStore(out Mem: UInt32; Data: UInt32); inline;
+procedure AtomicStore(out Mem: Int64; Data: Int64); inline;
+procedure AtomicStore(out Mem: UInt64; Data: UInt64); inline;
+
 function AtomicAdd(var Mem: Int8; Data: Int8): Int8; inline;
 function AtomicAdd(var Mem: UInt8; Data: UInt8): UInt8; inline;
 function AtomicAdd(var Mem: Int16; Data: Int16): Int16; inline;
@@ -140,6 +151,46 @@ begin
   AtomicLoad:=UInt64(fpc_wasm32_i64_atomic_load(@Mem));
 end;
 
+procedure AtomicStore(out Mem: Int8; Data: Int8); inline;
+begin
+  fpc_wasm32_i32_atomic_store8(@Mem,Byte(Data));
+end;
+
+procedure AtomicStore(out Mem: UInt8; Data: UInt8); inline;
+begin
+  fpc_wasm32_i32_atomic_store8(@Mem,Data);
+end;
+
+procedure AtomicStore(out Mem: Int16; Data: Int16); inline;
+begin
+  fpc_wasm32_i32_atomic_store16(@Mem,Word(Data));
+end;
+
+procedure AtomicStore(out Mem: UInt16; Data: UInt16); inline;
+begin
+  fpc_wasm32_i32_atomic_store16(@Mem,Data);
+end;
+
+procedure AtomicStore(out Mem: Int32; Data: Int32); inline;
+begin
+  fpc_wasm32_i32_atomic_store(@Mem,LongWord(Data));
+end;
+
+procedure AtomicStore(out Mem: UInt32; Data: UInt32); inline;
+begin
+  fpc_wasm32_i32_atomic_store(@Mem,Data);
+end;
+
+procedure AtomicStore(out Mem: Int64; Data: Int64); inline;
+begin
+  fpc_wasm32_i64_atomic_store(@Mem,QWord(Data));
+end;
+
+procedure AtomicStore(out Mem: UInt64; Data: UInt64); inline;
+begin
+  fpc_wasm32_i64_atomic_store(@Mem,Data);
+end;
+
 function AtomicAdd(var Mem: Int8; Data: Int8): Int8; inline;
 begin
   AtomicAdd:=Int8(fpc_wasm32_i32_atomic_rmw8_add_u(@Mem,Byte(Data)));