فهرست منبع

+ added wasm32 inline procedure for generating the 'unreachable' instruction

git-svn-id: branches/wasm@48442 -
nickysn 4 سال پیش
والد
کامیت
4ef1367019
4فایلهای تغییر یافته به همراه21 افزوده شده و 1 حذف شده
  1. 2 1
      compiler/wasm32/ccpuinnr.inc
  2. 17 0
      compiler/wasm32/nwasminl.pas
  3. 1 0
      rtl/wasm32/cpuh.inc
  4. 1 0
      rtl/wasm32/cpuinnr.inc

+ 2 - 1
compiler/wasm32/ccpuinnr.inc

@@ -13,5 +13,6 @@
  **********************************************************************}
 
   in_wasm32_memory_size = in_cpu_first,
-  in_wasm32_memory_grow = in_cpu_first+1
+  in_wasm32_memory_grow = in_cpu_first+1,
+  in_wasm32_unreachable = in_cpu_first+2
 

+ 17 - 0
compiler/wasm32/nwasminl.pas

@@ -36,6 +36,7 @@ interface
       private
         procedure second_memory_size;
         procedure second_memory_grow;
+        procedure second_unreachable;
       public
         function pass_typecheck_cpu: tnode; override;
         function first_cpu: tnode; override;
@@ -84,6 +85,13 @@ implementation
       end;
 
 
+    procedure twasminlinenode.second_unreachable;
+      begin
+        location_reset(location,LOC_VOID,OS_NO);
+        current_asmdata.CurrAsmList.Concat(taicpu.op_none(a_unreachable));
+      end;
+
+
     function twasminlinenode.pass_typecheck_cpu: tnode;
       begin
         Result:=nil;
@@ -98,6 +106,11 @@ implementation
               CheckParameters(1);
               resultdef:=u32inttype;
             end;
+          in_wasm32_unreachable:
+            begin
+              CheckParameters(0);
+              resultdef:=voidtype;
+            end;
           else
             Result:=inherited pass_typecheck_cpu;
         end;
@@ -111,6 +124,8 @@ implementation
           in_wasm32_memory_size,
           in_wasm32_memory_grow:
             expectloc:=LOC_REGISTER;
+          in_wasm32_unreachable:
+            expectloc:=LOC_VOID;
           else
             Result:=inherited first_cpu;
         end;
@@ -124,6 +139,8 @@ implementation
             second_memory_size;
           in_wasm32_memory_grow:
             second_memory_grow;
+          in_wasm32_unreachable:
+            second_unreachable;
           else
             inherited pass_generate_code_cpu;
         end;

+ 1 - 0
rtl/wasm32/cpuh.inc

@@ -19,3 +19,4 @@ const
 
 function fpc_wasm32_memory_size: longword;[internproc:fpc_in_wasm32_memory_size];
 function fpc_wasm32_memory_grow(n: longword): longword;[internproc:fpc_in_wasm32_memory_grow];
+procedure fpc_wasm32_unreachable;[internproc:fpc_in_wasm32_unreachable];

+ 1 - 0
rtl/wasm32/cpuinnr.inc

@@ -14,4 +14,5 @@
 
   fpc_in_wasm32_memory_size = fpc_in_cpu_first;
   fpc_in_wasm32_memory_grow = fpc_in_cpu_first+1;
+  fpc_in_wasm32_unreachable = fpc_in_cpu_first+2;