Procházet zdrojové kódy

+ AArch64 optimized version of a_load_regconst_subsetreg_intern()

git-svn-id: trunk@29963 -
Jonas Maebe před 10 roky
rodič
revize
d4d9e361fc
1 změnil soubory, kde provedl 38 přidání a 17 odebrání
  1. 38 17
      compiler/aarch64/hlcgcpu.pas

+ 38 - 17
compiler/aarch64/hlcgcpu.pas

@@ -38,6 +38,8 @@ interface
     thlcgaarch64 = class(thlcg2ll)
       procedure a_load_subsetreg_reg(list: TAsmList; subsetsize, tosize: tdef; const sreg: tsubsetregister; destreg: tregister); override;
       procedure a_load_subsetreg_subsetreg(list: TAsmlist; fromsubsetsize, tosubsetsize: tdef; const fromsreg, tosreg: tsubsetregister); override;
+     protected
+      procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
     end;
 
   procedure create_hlcodegen;
@@ -88,36 +90,39 @@ implementation
     end;
 
 
+  procedure makeregssamesize(list: tasmlist; fromsize, tosize: tcgsize; orgfromreg, orgtoreg: tregister; out newfromreg, newtoreg: tregister);
+    begin
+      if (fromsize in [OS_S64,OS_64])<>
+         (tosize in [OS_S64,OS_64]) then
+        begin
+          newfromreg:=cg.makeregsize(list,orgfromreg,OS_64);
+          newtoreg:=cg.makeregsize(list,orgtoreg,OS_64);
+        end
+      else
+        begin
+          newfromreg:=orgfromreg;
+          newtoreg:=orgtoreg;
+        end;
+    end;
+
+
   procedure thlcgaarch64.a_load_subsetreg_subsetreg(list: TAsmlist; fromsubsetsize, tosubsetsize: tdef; const fromsreg, tosreg: tsubsetregister);
     var
       fromreg, toreg: tregister;
 
-    procedure getfromtoregs;
-      begin
-        if (fromsreg.subsetregsize in [OS_S64,OS_64])<>
-           (tosreg.subsetregsize in [OS_S64,OS_64]) then
-          begin
-            fromreg:=cg.makeregsize(list,fromsreg.subsetreg,OS_64);
-            toreg:=cg.makeregsize(list,tosreg.subsetreg,OS_64);
-          end
-        else
-          begin
-            fromreg:=fromsreg.subsetreg;
-            toreg:=tosreg.subsetreg;
-          end;
-      end;
-
     begin
+      { BFM can only insert a bitfield that starts at position 0 in the source
+        source or destination register }
       if (tosreg.startbit=0) and
          (fromsreg.bitlen>=tosreg.bitlen) then
         begin
-          getfromtoregs;
+          makeregssamesize(list,fromsreg.subsetregsize,tosreg.subsetregsize,fromsreg.subsetreg,tosreg.subsetreg,fromreg,toreg);
           list.concat(taicpu.op_reg_reg_const_const(A_BFXIL,toreg,fromreg,fromsreg.startbit,tosreg.bitlen))
         end
       else if (fromsreg.startbit=0) and
          (fromsreg.bitlen>=tosreg.bitlen) then
         begin
-          getfromtoregs;
+          makeregssamesize(list,fromsreg.subsetregsize,tosreg.subsetregsize,fromsreg.subsetreg,tosreg.subsetreg,fromreg,toreg);
           list.concat(taicpu.op_reg_reg_const_const(A_BFI,toreg,fromreg,tosreg.startbit,tosreg.bitlen))
         end
       else
@@ -125,6 +130,22 @@ implementation
     end;
 
 
+  procedure thlcgaarch64.a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt);
+    var
+      toreg: tregister;
+    begin
+      if slopt in [SL_SETZERO,SL_SETMAX] then
+        inherited
+      else if not(sreg.bitlen in [32,64]) then
+        begin
+          makeregssamesize(list,def_cgsize(fromsize),sreg.subsetregsize,fromreg,sreg.subsetreg,fromreg,toreg);
+          list.concat(taicpu.op_reg_reg_const_const(A_BFI,toreg,fromreg,sreg.startbit,sreg.bitlen))
+        end
+      else
+        a_load_reg_reg(list,fromsize,subsetsize,fromreg,sreg.subsetreg);
+    end;
+
+
   procedure create_hlcodegen;
     begin
       hlcg:=thlcgaarch64.create;