Browse Source

* do not generate conditional jump with full references
+ more assembler optimizer output

git-svn-id: trunk@43520 -

florian 5 years ago
parent
commit
40c54e9d37
1 changed files with 17 additions and 12 deletions
  1. 17 12
      compiler/x86/aoptx86.pas

+ 17 - 12
compiler/x86/aoptx86.pas

@@ -111,16 +111,6 @@ unit aoptx86;
       and having an offset }
     function MatchReferenceWithOffset(const ref : treference;base,index : TRegister) : Boolean;
 
-{$ifdef DEBUG_AOPTCPU}
-  const
-    SPeepholeOptimization: shortstring = 'Peephole Optimization: ';
-{$else DEBUG_AOPTCPU}
-  { Empty strings help the optimizer to remove string concatenations that won't
-    ever appear to the user on release builds. [Kit] }
-  const
-    SPeepholeOptimization = '';
-{$endif DEBUG_AOPTCPU}
-
   implementation
 
     uses
@@ -134,6 +124,16 @@ unit aoptx86;
       cgx86,
       itcpugas;
 
+{$ifdef DEBUG_AOPTCPU}
+    const
+      SPeepholeOptimization: shortstring = 'Peephole Optimization: ';
+{$else DEBUG_AOPTCPU}
+    { Empty strings help the optimizer to remove string concatenations that won't
+      ever appear to the user on release builds. [Kit] }
+    const
+      SPeepholeOptimization = '';
+{$endif DEBUG_AOPTCPU}
+
     function MatchInstruction(const instr: tai; const op: TAsmOp; const opsize: topsizes): boolean;
       begin
         result :=
@@ -3427,9 +3427,9 @@ unit aoptx86;
               jmp<inv_cond> @Lbl2
               ret
           }
-            if MatchInstruction(hp1, A_JMP, []) then
+            if MatchInstruction(hp1,A_JMP,[]) and (taicpu(hp1).oper[0]^.ref^.refaddr=addr_full) then
               begin
-                hp2 := getlabelwithsym(TAsmLabel(symbol));
+                hp2:=getlabelwithsym(TAsmLabel(symbol));
                 if Assigned(hp2) and SkipLabels(hp2,hp2) and
                   MatchInstruction(hp2,A_RET,[S_NO]) then
                   begin
@@ -3442,6 +3442,7 @@ unit aoptx86;
                     taicpu(hp1).opcode := A_RET;
                     taicpu(hp1).is_jmp := false;
                     taicpu(hp1).ops := taicpu(hp2).ops;
+                    DebugMsg(SPeepholeOptimization+'JccJmpRet2J!ccRet',p);
                     case taicpu(hp2).ops of
                       0:
                         taicpu(hp1).clearop(0);
@@ -3522,6 +3523,8 @@ unit aoptx86;
                           { Now we can safely decrement the reference count }
                           tasmlabel(symbol).decrefs;
 
+                          DebugMsg(SPeepholeOptimization+'JccMov2CMov',p);
+
                           { Remove the original jump }
                           asml.Remove(p);
                           p.Free;
@@ -3619,6 +3622,8 @@ unit aoptx86;
                                   optional align marker. [Kit] }
                                 GetNextInstruction(hp2, hp4);
 
+                                DebugMsg(SPeepholeOptimization+'JccMovJmpMov2CMovCMov',hp1);
+
                                 { remove jCC }
                                 asml.remove(hp1);
                                 hp1.free;