Преглед изворни кода

* added extra boolean parameter to getelementptr taillvm constructors to
indicate whether or not an implicit indirection should be added (always
was done until now)

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

Jonas Maebe пре 11 година
родитељ
комит
e70175a10e
3 измењених фајлова са 41 додато и 19 уклоњено
  1. 37 15
      compiler/llvm/aasmllvm.pas
  2. 1 1
      compiler/llvm/hlcgllvm.pas
  3. 3 3
      compiler/llvm/nllvmmem.pas

+ 37 - 15
compiler/llvm/aasmllvm.pas

@@ -91,9 +91,9 @@ interface
         { e.g. la_ret retdef retval }
         constructor op_size_reg(op:tllvmop;def: tdef;reg: tregister);
 
-        { e.g. dst = getelementptr ptrsize ref, i32 0 (implicit), index1type index1 }
-        constructor getelementptr_reg_size_ref_size_reg(dst:tregister;ptrsize:tdef;const ref:treference;indextype: tdef;index1:tregister);
-        constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype: tdef;index1:ptrint);
+        { e.g. dst = getelementptr ptrsize ref, i32 0 (if indirect), index1type index1 }
+        constructor getelementptr_reg_size_ref_size_reg(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:tregister;indirect:boolean);
+        constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:ptrint;indirect:boolean);
 
         procedure loaddef(opidx: longint; _def: tdef);
         procedure loaddouble(opidx: longint; _dval: double);
@@ -648,31 +648,53 @@ uses
       end;
 
 
-    constructor taillvm.getelementptr_reg_size_ref_size_reg(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: tregister);
+    constructor taillvm.getelementptr_reg_size_ref_size_reg(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: tregister; indirect: boolean);
+      var
+        index: longint;
       begin
         create_llvm(la_getelementptr);
-        ops:=7;
+        if indirect then
+          ops:=7
+        else
+          ops:=5;
         loadreg(0,dst);
         loaddef(1,ptrsize);
         loadref(2,ref);
-        loaddef(3,s32inttype);
-        loadconst(4,0);
-        loaddef(5,indextype);
-        loadreg(6,index1);
+        if indirect then
+          begin
+            loaddef(3,s32inttype);
+            loadconst(4,0);
+            index:=5;
+          end
+        else
+          index:=3;
+        loaddef(index,indextype);
+        loadreg(index+1,index1);
       end;
 
 
-    constructor taillvm.getelementptr_reg_size_ref_size_const(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: ptrint);
+    constructor taillvm.getelementptr_reg_size_ref_size_const(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: ptrint; indirect: boolean);
+      var
+        index: longint;
       begin
         create_llvm(la_getelementptr);
-        ops:=7;
+        if indirect then
+          ops:=7
+        else
+          ops:=5;
         loadreg(0,dst);
         loaddef(1,ptrsize);
         loadref(2,ref);
-        loaddef(3,s32inttype);
-        loadconst(4,0);
-        loaddef(5,indextype);
-        loadconst(6,index1);
+        if indirect then
+          begin
+            loaddef(3,s32inttype);
+            loadconst(4,0);
+            index:=5;
+          end
+        else
+          index:=3;
+        loaddef(index,indextype);
+        loadconst(index+1,index1);
       end;
 
 end.

+ 1 - 1
compiler/llvm/hlcgllvm.pas

@@ -926,7 +926,7 @@ implementation
           if ref.base<>NR_NO then
             internalerror(2012111301);
           reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment);
-          list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg1,getpointerdef(def),tmpref,ptruinttype,0));
+          list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg1,getpointerdef(def),tmpref,ptruinttype,0,true));
         end
       else if ref.base<>NR_NO then
         begin

+ 3 - 3
compiler/llvm/nllvmmem.pas

@@ -99,7 +99,7 @@ implementation
           getarrelementptrdef;
           hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,arrptrelementdef);
           current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,getpointerdef(left.resultdef),
-            locref^,ptruinttype,constarrayoffset));
+            locref^,ptruinttype,constarrayoffset,true));
           reference_reset_base(locref^,hreg,0,locref^.alignment);
         end;
 
@@ -131,7 +131,7 @@ implementation
       { get address of indexed array element and convert pointer to array into
         pointer to the elementdef in the process }
       current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,getpointerdef(left.resultdef),
-        location.reference,ptruinttype,maybe_const_reg));
+        location.reference,ptruinttype,maybe_const_reg,true));
       arraytopointerconverted:=true;
       reference_reset_base(location.reference,hreg,0,location.reference.alignment);
       location.reference.alignment:=newalignment(location.reference.alignment,l);
@@ -185,7 +185,7 @@ implementation
       { index the array using this chunk index }
       basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(defloadsize));
       current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(basereg,getpointerdef(left.resultdef),
-        sref.ref,ptruinttype,offsetreg));
+        sref.ref,ptruinttype,offsetreg,true));
       arraytopointerconverted:=true;
       reference_reset_base(sref.ref,basereg,0,sref.ref.alignment);
       { calculate the bit index inside that chunk }