Ver código fonte

+ llvm implementation of second_int_to_real()

git-svn-id: branches/hlcgllvm@28207 -
Jonas Maebe 11 anos atrás
pai
commit
27e350fa9a
1 arquivos alterados com 23 adições e 1 exclusões
  1. 23 1
      compiler/llvm/nllvmcnv.pas

+ 23 - 1
compiler/llvm/nllvmcnv.pas

@@ -31,6 +31,7 @@ interface
     type
        tllvmtypeconvnode = class(tcgtypeconvnode)
          protected
+          function first_int_to_real: tnode; override;
           procedure second_int_to_int;override;
          { procedure second_string_to_string;override; }
          { procedure second_cstring_to_pchar;override; }
@@ -39,7 +40,7 @@ interface
          procedure second_pointer_to_array;override;
          { procedure second_chararray_to_string;override; }
          { procedure second_char_to_string;override; }
-         { procedure second_int_to_real;override; }
+         procedure second_int_to_real;override;
          { procedure second_real_to_real;override; }
          { procedure second_cord_to_pointer;override; }
          { procedure second_proc_to_procvar;override; }
@@ -64,6 +65,12 @@ uses
 
 { tllvmtypeconvnode }
 
+function tllvmtypeconvnode.first_int_to_real: tnode;
+  begin
+    expectloc:=LOC_FPUREGISTER;
+    result:=nil;
+  end;
+
 procedure tllvmtypeconvnode.second_int_to_int;
   var
     fromsize, tosize: tcgint;
@@ -101,6 +108,21 @@ procedure tllvmtypeconvnode.second_pointer_to_array;
   end;
 
 
+procedure tllvmtypeconvnode.second_int_to_real;
+  var
+    op: tllvmop;
+  begin
+    if is_signed(left.resultdef) then
+      op:=la_sitofp
+    else
+      op:=la_uitofp;
+    location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
+    location.register:=hlcg.getfpuregister(current_asmdata.CurrAsmList,resultdef);
+    hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
+    current_asmdata.CurrAsmList.concat(taillvm.op_reg_size_reg_size(op,location.register,left.resultdef,left.location.register,resultdef));
+  end;
+
+
 procedure tllvmtypeconvnode.second_nothing;
   var
     hreg: tregister;