Browse Source

* converted some leftovers in tcgtypeconvnode.second_int_to_int/
second_real_to_real to thlcgobj
+ added type conversion to second_pointer_to_array for llvm

git-svn-id: branches/hlcgllvm@27000 -

Jonas Maebe 11 years ago
parent
commit
cdfb23bf6c
2 changed files with 19 additions and 7 deletions
  1. 13 1
      compiler/llvm/nllvmcnv.pas
  2. 6 6
      compiler/ncgcnv.pas

+ 13 - 1
compiler/llvm/nllvmcnv.pas

@@ -36,7 +36,7 @@ interface
          { procedure second_cstring_to_pchar;override; }
          { procedure second_string_to_chararray;override; }
          { procedure second_array_to_pointer;override; }
-         { procedure second_pointer_to_array;override; }
+         procedure second_pointer_to_array;override;
          { procedure second_chararray_to_string;override; }
          { procedure second_char_to_string;override; }
          { procedure second_int_to_real;override; }
@@ -63,6 +63,18 @@ uses
 
 { tllvmtypeconvnode }
 
+procedure tllvmtypeconvnode.second_pointer_to_array;
+  var
+    hreg: tregister;
+  begin
+    inherited;
+    { insert type conversion }
+    hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(resultdef));
+    hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,tpointerdef(left.resultdef).pointeddef,getpointerdef(resultdef),location.reference,hreg);
+    reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+  end;
+
+
 procedure tllvmtypeconvnode.second_nothing;
   var
     hreg: tregister;

+ 6 - 6
compiler/ncgcnv.pas

@@ -147,7 +147,7 @@ interface
               begin
                 location.register := cg.getintregister(current_asmdata.CurrAsmList,newsize);
                 location.loc := LOC_REGISTER;
-                cg.a_load_reg_reg(current_asmdata.CurrAsmList,orgsize,newsize,left.location.register,location.register);
+                hlcg.a_load_reg_reg(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.register,location.register);
               end;
           end;
       end;
@@ -424,7 +424,7 @@ interface
                location_force_fpureg(current_asmdata.CurrAsmList,left.location,false);
              { round them down to the proper precision }
              tg.gethltemp(current_asmdata.currasmlist,resultdef,resultdef.size,tt_normal,tr);
-             cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.location.size,location.size,left.location.register,tr);
+             hlcg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.register,tr);
              location_reset_ref(left.location,LOC_REFERENCE,location.size,tr.alignment);
              left.location.reference:=tr;
              left.resultdef:=resultdef;
@@ -479,14 +479,14 @@ interface
                 case expectloc of
                   LOC_FPUREGISTER:
                     begin
-                      location_force_fpureg(current_asmdata.CurrAsmList,left.location,false);
+                      hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,false);
                       location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
-                      cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmList,left.location.size,location.size,left.location.register,location.register);
+                      hlcg.a_loadfpu_reg_reg(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.register,location.register);
                     end;
                   LOC_MMREGISTER:
                     begin
-                      location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size);
-                      cg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,left.location.size,location.size,left.location.register,location.register,mms_movescalar);
+                      location.register:=hlcg.getmmregister(current_asmdata.CurrAsmList,resultdef);
+                      hlcg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.register,location.register,mms_movescalar);
                     end;
                   else
                     internalerror(2003012261);