Browse Source

+ support the f32.const and f64.const instructions in twasmreader.HandlePlainInstruction

Nikolay Nikolov 1 year ago
parent
commit
09f2fa0daf
2 changed files with 49 additions and 2 deletions
  1. 4 1
      compiler/rautils.pas
  2. 45 1
      compiler/wasm32/rawasmtext.pas

+ 4 - 1
compiler/rautils.pas

@@ -45,7 +45,7 @@ type
   TOprType=(OPR_NONE,OPR_CONSTANT,OPR_SYMBOL,OPR_LOCAL,
             OPR_REFERENCE,OPR_REGISTER,OPR_COND,OPR_REGSET,
             OPR_SHIFTEROP,OPR_MODEFLAGS,OPR_SPECIALREG,
-            OPR_REGPAIR,OPR_FENCEFLAGS,OPR_INDEXEDREG);
+            OPR_REGPAIR,OPR_FENCEFLAGS,OPR_INDEXEDREG,OPR_FLOATCONSTANT);
 
   TOprRec = record
     case typ:TOprType of
@@ -89,6 +89,9 @@ type
 {$if defined(riscv32) or defined(riscv64)}
       OPR_FENCEFLAGS: (fenceflags : TFenceFlags);
 {$endif aarch64}
+{$ifdef wasm32}
+      OPR_FLOATCONSTANT: (floatval:double);
+{$endif wasm32}
   end;
 
   TInstruction = class;

+ 45 - 1
compiler/wasm32/rawasmtext.pas

@@ -55,6 +55,7 @@ Unit rawasmtext;
         actasmtoken   : tasmtoken;
         prevasmtoken  : tasmtoken;
         actinttoken   : aint;
+        actfloattoken : double;
         procedure SetupTables;
         procedure GetToken;
         function consume(t : tasmtoken):boolean;
@@ -146,6 +147,20 @@ Unit rawasmtext;
             end;
         end;
 
+      function GetFloatToken: double;
+        var
+          s: string;
+        begin
+          s:=actasmpattern;
+          if is_hex then
+            begin
+              { TODO: parse hex floats }
+              internalerror(2024071501);
+            end
+          else
+            Val(s,result);
+        end;
+
       var
         len: Integer;
         tmpS: string;
@@ -337,7 +352,10 @@ Unit rawasmtext;
                 end;
               actasmpattern[0]:=chr(len);
               if is_float then
-                actasmtoken:=AS_REALNUM
+                begin
+                  actasmtoken:=AS_REALNUM;
+                  actfloattoken:=GetFloatToken;
+                end
               else
                 begin
                   actasmtoken:=AS_INTNUM;
@@ -770,6 +788,32 @@ Unit rawasmtext;
                         Consume(AS_INTNUM);
                       end;
                   end;
+                { instructions with a float const operand }
+                a_f32_const,
+                a_f64_const:
+                  begin
+                    case actasmtoken of
+                      AS_INTNUM:
+                        begin
+                          result.operands[1].opr.typ:=OPR_FLOATCONSTANT;
+                          result.operands[1].opr.floatval:=actinttoken;
+                          Consume(AS_INTNUM);
+                        end;
+                      AS_REALNUM:
+                        begin
+                          result.operands[1].opr.typ:=OPR_FLOATCONSTANT;
+                          result.operands[1].opr.floatval:=actfloattoken;
+                          Consume(AS_REALNUM);
+                        end;
+                      else
+                        begin
+                          { error: expected real }
+                          result.Free;
+                          result:=nil;
+                          Consume(AS_REALNUM);
+                        end;
+                    end;
+                  end;
                 else
                   internalerror(2024071401);
               end;