浏览代码

* 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 年之前
父节点
当前提交
cdfb23bf6c
共有 2 个文件被更改,包括 19 次插入7 次删除
  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_cstring_to_pchar;override; }
          { procedure second_string_to_chararray;override; }
          { procedure second_string_to_chararray;override; }
          { procedure second_array_to_pointer;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_chararray_to_string;override; }
          { procedure second_char_to_string;override; }
          { procedure second_char_to_string;override; }
          { procedure second_int_to_real;override; }
          { procedure second_int_to_real;override; }
@@ -63,6 +63,18 @@ uses
 
 
 { tllvmtypeconvnode }
 { 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;
 procedure tllvmtypeconvnode.second_nothing;
   var
   var
     hreg: tregister;
     hreg: tregister;

+ 6 - 6
compiler/ncgcnv.pas

@@ -147,7 +147,7 @@ interface
               begin
               begin
                 location.register := cg.getintregister(current_asmdata.CurrAsmList,newsize);
                 location.register := cg.getintregister(current_asmdata.CurrAsmList,newsize);
                 location.loc := LOC_REGISTER;
                 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;
           end;
       end;
       end;
@@ -424,7 +424,7 @@ interface
                location_force_fpureg(current_asmdata.CurrAsmList,left.location,false);
                location_force_fpureg(current_asmdata.CurrAsmList,left.location,false);
              { round them down to the proper precision }
              { round them down to the proper precision }
              tg.gethltemp(current_asmdata.currasmlist,resultdef,resultdef.size,tt_normal,tr);
              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);
              location_reset_ref(left.location,LOC_REFERENCE,location.size,tr.alignment);
              left.location.reference:=tr;
              left.location.reference:=tr;
              left.resultdef:=resultdef;
              left.resultdef:=resultdef;
@@ -479,14 +479,14 @@ interface
                 case expectloc of
                 case expectloc of
                   LOC_FPUREGISTER:
                   LOC_FPUREGISTER:
                     begin
                     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);
                       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;
                     end;
                   LOC_MMREGISTER:
                   LOC_MMREGISTER:
                     begin
                     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;
                     end;
                   else
                   else
                     internalerror(2003012261);
                     internalerror(2003012261);