Browse Source

+ implemented int to real conversion

git-svn-id: branches/wasm@48081 -
nickysn 4 years ago
parent
commit
9bd282eb3b
1 changed files with 79 additions and 4 deletions
  1. 79 4
      compiler/wasm32/nwasmcnv.pas

+ 79 - 4
compiler/wasm32/nwasmcnv.pas

@@ -25,7 +25,7 @@ unit nwasmcnv;
 interface
 
     uses
-      ncnv,ncgcnv;
+      node,ncnv,ncgcnv;
 
     type
 
@@ -33,20 +33,95 @@ interface
 
        twasmtypeconvnode = class(tcgtypeconvnode)
        protected
+         function first_int_to_real: tnode; override;
+         procedure second_int_to_real;override;
          procedure second_int_to_bool;override;
        end;
 
 implementation
 
    uses
-      globals,aasmdata,
-      defutil,
-      cgbase,cgutils,pass_2,
+      verbose,globals,globtype,aasmdata,
+      defutil,cpubase,
+      cgbase,cgutils,pass_1,pass_2,
+      aasmcpu,
+      symdef,
       hlcgobj,hlcgcpu;
 
 
 { twasmtypeconvnode }
 
+    function twasmtypeconvnode.first_int_to_real: tnode;
+      begin
+        first_int_to_real:=nil;
+        if left.resultdef.size<4 then
+          begin
+            inserttypeconv(left,s32inttype);
+            firstpass(left);
+          end;
+        expectloc:=LOC_FPUREGISTER;
+      end;
+
+
+    procedure twasmtypeconvnode.second_int_to_real;
+      var
+        op: TAsmOp;
+      begin
+        secondpass(left);
+        if codegenerror then
+          exit;
+
+        case tfloatdef(resultdef).floattype of
+          s32real:
+            begin
+              if is_64bitint(left.resultdef) or
+                is_currency(left.resultdef) then
+                begin
+                  if is_signed(left.resultdef) then
+                    op:=a_f32_convert_s_i64
+                  else
+                    op:=a_f32_convert_u_i64;
+                end
+              else
+                { other integers are supposed to be 32 bit }
+                begin
+                  if is_signed(left.resultdef) then
+                    op:=a_f32_convert_s_i32
+                  else
+                    op:=a_f32_convert_u_i32;
+                end;
+            end;
+          s64real:
+            begin
+              if is_64bitint(left.resultdef) or
+                is_currency(left.resultdef) then
+                begin
+                  if is_signed(left.resultdef) then
+                    op:=a_f64_convert_s_i64
+                  else
+                    op:=a_f64_convert_u_i64;
+                end
+              else
+                { other integers are supposed to be 32 bit }
+                begin
+                  if is_signed(left.resultdef) then
+                    op:=a_f64_convert_s_i32
+                  else
+                    op:=a_f64_convert_u_i32;
+                end;
+            end;
+          else
+            internalerror(2021010501);
+        end;
+
+        thlcgwasm(hlcg).a_load_loc_stack(current_asmdata.CurrAsmList,left.resultdef,left.location);
+        current_asmdata.CurrAsmList.concat(taicpu.op_none(op));
+        location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
+        location.register := hlcg.getfpuregister(current_asmdata.CurrAsmList,resultdef);
+        thlcgwasm(hlcg).a_load_stack_loc(current_asmdata.CurrAsmList,resultdef,location);
+      end;
+
+
     procedure twasmtypeconvnode.second_int_to_bool;
       begin
         secondpass(left);