Browse Source

* corrected accidently made changs in 01a449c8, resolves #39424

florian 3 years ago
parent
commit
44051b4af3
1 changed files with 11 additions and 11 deletions
  1. 11 11
      compiler/x86/aoptx86.pas

+ 11 - 11
compiler/x86/aoptx86.pas

@@ -9078,6 +9078,7 @@ unit aoptx86;
                           if (l<=4) and (l>0) then
                           if (l<=4) and (l>0) then
                             begin
                             begin
                               condition:=inverse_cond(taicpu(p).condition);
                               condition:=inverse_cond(taicpu(p).condition);
+                              UpdateUsedRegs(tai(p.next));
                               GetNextInstruction(p,hp1);
                               GetNextInstruction(p,hp1);
                               repeat
                               repeat
                                 if not Assigned(hp1) then
                                 if not Assigned(hp1) then
@@ -9085,7 +9086,7 @@ unit aoptx86;
 
 
                                 taicpu(hp1).opcode:=A_CMOVcc;
                                 taicpu(hp1).opcode:=A_CMOVcc;
                                 taicpu(hp1).condition:=condition;
                                 taicpu(hp1).condition:=condition;
-                                UpdateUsedRegs(hp1);
+                                UpdateUsedRegs(tai(hp1.next));
                                 GetNextInstruction(hp1,hp1);
                                 GetNextInstruction(hp1,hp1);
                               until not(CanBeCMOV(hp1));
                               until not(CanBeCMOV(hp1));
 
 
@@ -9127,6 +9128,7 @@ unit aoptx86;
                               { Remove the original jump }
                               { Remove the original jump }
                               RemoveInstruction(p); { Note, the choice to not use RemoveCurrentp is deliberate }
                               RemoveInstruction(p); { Note, the choice to not use RemoveCurrentp is deliberate }
 
 
+                              UpdateUsedRegs(tai(hp2.next));
                               GetNextInstruction(hp2, p); { Instruction after the label }
                               GetNextInstruction(hp2, p); { Instruction after the label }
 
 
                               { Remove the label if this is its final reference }
                               { Remove the label if this is its final reference }
@@ -9134,10 +9136,7 @@ unit aoptx86;
                                 StripLabelFast(hp1);
                                 StripLabelFast(hp1);
 
 
                               if Assigned(p) then
                               if Assigned(p) then
-                                begin
-                                  UpdateUsedRegs(p);
-                                  result:=true;
-                                end;
+                                result:=true;
                               exit;
                               exit;
                             end;
                             end;
                         end
                         end
@@ -9187,29 +9186,33 @@ unit aoptx86;
                                  FindLabel(tasmlabel(taicpu(hp2).oper[0]^.ref^.symbol),hp1) then
                                  FindLabel(tasmlabel(taicpu(hp2).oper[0]^.ref^.symbol),hp1) then
                                  begin
                                  begin
                                     condition:=inverse_cond(taicpu(p).condition);
                                     condition:=inverse_cond(taicpu(p).condition);
+                                    UpdateUsedRegs(tai(p.next));
                                     GetNextInstruction(p,hp1);
                                     GetNextInstruction(p,hp1);
                                     repeat
                                     repeat
                                       taicpu(hp1).opcode:=A_CMOVcc;
                                       taicpu(hp1).opcode:=A_CMOVcc;
                                       taicpu(hp1).condition:=condition;
                                       taicpu(hp1).condition:=condition;
-                                      UpdateUsedRegs(hp1);
+                                      UpdateUsedRegs(tai(hp1.next));
                                       GetNextInstruction(hp1,hp1);
                                       GetNextInstruction(hp1,hp1);
                                     until not(assigned(hp1)) or
                                     until not(assigned(hp1)) or
                                       not(CanBeCMOV(hp1));
                                       not(CanBeCMOV(hp1));
 
 
                                     condition:=inverse_cond(condition);
                                     condition:=inverse_cond(condition);
+                                    if GetLastInstruction(hpmov2,hp1) then
+                                      UpdateUsedRegs(tai(hp1.next));
                                     hp1 := hpmov2;
                                     hp1 := hpmov2;
                                     { hp1 is now at <several movs 2> }
                                     { hp1 is now at <several movs 2> }
                                     while Assigned(hp1) and CanBeCMOV(hp1) do
                                     while Assigned(hp1) and CanBeCMOV(hp1) do
                                       begin
                                       begin
                                         taicpu(hp1).opcode:=A_CMOVcc;
                                         taicpu(hp1).opcode:=A_CMOVcc;
                                         taicpu(hp1).condition:=condition;
                                         taicpu(hp1).condition:=condition;
-                                        UpdateUsedRegs(hp1);
+                                        UpdateUsedRegs(tai(hp1.next));
                                         GetNextInstruction(hp1,hp1);
                                         GetNextInstruction(hp1,hp1);
                                       end;
                                       end;
 
 
                                     hp1 := p;
                                     hp1 := p;
 
 
                                     { Get first instruction after label }
                                     { Get first instruction after label }
+                                    UpdateUsedRegs(tai(hp3.next));
                                     GetNextInstruction(hp3, p);
                                     GetNextInstruction(hp3, p);
 
 
                                     if assigned(p) and (hp3.typ = ait_align) then
                                     if assigned(p) and (hp3.typ = ait_align) then
@@ -9244,10 +9247,7 @@ unit aoptx86;
                                       StripLabelFast(hp3);
                                       StripLabelFast(hp3);
 
 
                                     if Assigned(p) then
                                     if Assigned(p) then
-                                      begin
-                                        UpdateUsedRegs(p);
-                                        result:=true;
-                                      end;
+                                      result:=true;
                                     exit;
                                     exit;
                                  end;
                                  end;
                              end;
                              end;