Browse Source

+ removal of "lea (reg), reg)", "imul $1, reg", change "mov reg1, reg2; mov (reg2), reg2" to "mov (reg1), reg2"

Jonas Maebe 27 years ago
parent
commit
3bf7d9a724
1 changed files with 82 additions and 23 deletions
  1. 82 23
      compiler/popt386.pas

+ 82 - 23
compiler/popt386.pas

@@ -292,7 +292,28 @@ Begin
                 Begin
                   If (Pai386(p)^.op1t = Top_Const) And
                      (Pai386(p)^.op2t = Top_Reg) And
-                     (Pai386(p)^.Size = S_L) And
+                     (Pai386(p)^.Size = S_L) Then
+                    If (Longint(Pai386(p)^.op1) = 1) Then
+                      If (Pai386(p)^.op3t = Top_None) Then
+                       {remove "imul $1, reg"}
+                        Begin
+                          hp1 := Pai(p^.Next);
+                          AsmL^.Remove(p);
+                          Dispose(p, Done);
+                          p := hp1;
+                          Continue;
+                        End
+                      Else
+                       {change "imul $1, reg1, reg2" to "mov reg1, reg2"}
+                        Begin
+                          hp1 := New(Pai386, Op_Reg_Reg(A_MOV, S_L, TRegister(TwoWords(Pai386(p)^.op2).Word1),
+                                                        TRegister(TwoWords(Pai386(p)^.op2).Word2)));
+                          hp1^.fileinfo := p^.fileinfo;
+                          InsertLLItem(AsmL, p^.previous, p^.next, hp1);
+                          Dispose(p, Done);
+                          p := hp1;
+                        End
+                    Else If
                      ((Pai386(p)^.op3t = Top_Reg) or
                       (Pai386(p)^.op3t = Top_None)) And
                      (aktoptprocessor < ClassP6) And
@@ -316,8 +337,8 @@ Begin
                                 lea (reg1,reg1,2), reg2
                               imul 3, reg1 to
                                 lea (reg1,reg1,2), reg1}
-                               TmpRef^.base := TRegister(Pai386(p)^.op2);
-                               TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                               TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
+                               TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                TmpRef^.ScaleFactor := 2;
                                If (Pai386(p)^.op3t = Top_None)
                                  Then hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef, TRegister(Pai386(p)^.op2)))
@@ -333,8 +354,8 @@ Begin
                                lea (reg1,reg1,4), reg2
                              imul 5, reg1 to
                                lea (reg1,reg1,4), reg1}
-                              TmpRef^.base := TRegister(Pai386(p)^.op2);
-                              TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                              TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
+                              TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                               TmpRef^.ScaleFactor := 4;
                               If (Pai386(p)^.op3t = Top_None)
                                 Then hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef, TRegister(Pai386(p)^.op2)))
@@ -355,7 +376,7 @@ Begin
                               If (aktoptprocessor <= Class386)
                                 Then
                                   Begin
-                                    TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                                    TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                     If (Pai386(p)^.op3t = Top_Reg)
                                       Then
                                         Begin
@@ -377,7 +398,7 @@ Begin
                                     TmpRef^.symbol := nil;
                                     TmpRef^.isintvalue := false;
                                     TmpRef^.offset := 0;
-                                    TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                                    TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                     TmpRef^.ScaleFactor := 2;
                                     If (Pai386(p)^.op3t = Top_Reg)
                                       Then
@@ -403,8 +424,8 @@ Begin
                                 lea (reg1,reg1,8), reg2
                               imul 9, reg1 to
                                 lea (reg1,reg1,8), reg1}
-                               TmpRef^.base := TRegister(Pai386(p)^.op2);
-                               TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                               TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
+                               TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                TmpRef^.ScaleFactor := 8;
                                If (Pai386(p)^.op3t = Top_None)
                                    Then hp1 := New(Pai386, op_ref_reg(A_LEA, S_L, TmpRef, TRegister(Pai386(p)^.op2)))
@@ -433,8 +454,8 @@ Begin
                                               TRegister(Pai386(p)^.op2), TRegister(Pai386(p)^.op2)));
                                    hp1^.fileinfo := p^.fileinfo;
                                    InsertLLItem(AsmL,p, p^.next, hp1);
-                                   TmpRef^.base := TRegister(Pai386(p)^.op2);
-                                   TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                                   TmpRef^.base := TRegister(twowords(Pai386(p)^.op2).Word1);
+                                   TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                    TmpRef^.ScaleFactor := 4;
                                    If (Pai386(p)^.op3t = Top_Reg)
                                      Then
@@ -460,7 +481,7 @@ Begin
                                If (aktoptprocessor <= Class386)
                                  Then
                                    Begin
-                                     TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                                     TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                      If (Pai386(p)^.op3t = Top_Reg)
                                        Then
                                          Begin
@@ -483,7 +504,7 @@ Begin
                                      TmpRef^.symbol := nil;
                                      TmpRef^.isintvalue := false;
                                      TmpRef^.offset := 0;
-                                     TmpRef^.Index := TRegister(Pai386(p)^.op2);
+                                     TmpRef^.Index := TRegister(twowords(Pai386(p)^.op2).Word1);
                                      If (Pai386(p)^.op3t = Top_Reg)
                                        Then
                                          Begin
@@ -517,15 +538,25 @@ Begin
                      (PReference(Pai386(p)^.op1)^.Index = R_NO) And
                      (PReference(Pai386(p)^.op1)^.Offset = 0) And
                      (Not(Assigned(PReference(Pai386(p)^.op1)^.Symbol))) Then
-                    Begin
-                      hp1 := New(Pai386, op_reg_reg(A_MOV, S_L,PReference(Pai386(p)^.op1)^.Base,
-                        TRegister(Pai386(p)^.op2)));
-                      hp1^.fileinfo := p^.fileinfo;
-                      InsertLLItem(AsmL,p^.previous,p^.next, hp1);
-                      Dispose(p, Done);
-                      p := hp1;
-                      Continue;
-                    End;
+                    If (PReference(Pai386(p)^.op1)^.Base <> TRegister(Pai386(p)^.op2))
+                      Then
+                        Begin
+                          hp1 := New(Pai386, op_reg_reg(A_MOV, S_L,PReference(Pai386(p)^.op1)^.Base,
+                            TRegister(Pai386(p)^.op2)));
+                          hp1^.fileinfo := p^.fileinfo;
+                         InsertLLItem(AsmL,p^.previous,p^.next, hp1);
+                         Dispose(p, Done);
+                         p := hp1;
+                         Continue;
+                       End
+                     Else
+                       Begin
+                         hp1 := Pai(p^.Next);
+                         AsmL^.Remove(p);
+                         Dispose(p, Done);
+                         p := hp1;
+                         Continue;
+                       End;
                 End;
               A_MOV:
                 Begin
@@ -1299,6 +1330,31 @@ Begin
         Ait_Instruction:
           Begin
             Case Pai386(p)^._operator Of
+              A_MOV:
+                Begin
+                  If (Pai386(p)^.op1t = top_reg) And
+                     (Pai386(p)^.op2t = top_reg) And
+                     GetNextInstruction(p, hp1) And
+                     (hp1^.typ = ait_Instruction) And
+                     (Pai386(hp1)^._operator = A_MOV) And
+                     (Pai386(hp1)^.op1t = top_ref) And
+                     (Pai386(hp1)^.op2t = top_reg) And
+                     ((TReference(Pai386(hp1)^.op1^).Base = TRegister(Pai386(p)^.op2)) Or
+                      (TReference(Pai386(hp1)^.op1^).Index = TRegister(Pai386(p)^.op2))) And
+                     (TRegister(Pai386(hp1)^.op2) = TRegister(Pai386(p)^.op2)) Then
+              {mov reg1, reg2
+               mov (reg2, ..), reg2      to   mov (reg1, ..), reg2}
+                    Begin
+                      If (TReference(Pai386(hp1)^.op1^).Base = TRegister(Pai386(p)^.op2)) Then
+                        TReference(Pai386(hp1)^.op1^).Base := TRegister(Pai386(p)^.op1);
+                      If (TReference(Pai386(hp1)^.op1^).Index = TRegister(Pai386(p)^.op2)) Then
+                        TReference(Pai386(hp1)^.op1^).Index := TRegister(Pai386(p)^.op1);
+                      AsmL^.Remove(p);
+                      Dispose(p, Done);
+                      p := hp1;
+                      Continue;
+                    End;
+                End;
               A_MOVZX:
                 Begin
                   If (Pai386(p)^.op2t = top_reg) Then
@@ -1363,7 +1419,10 @@ End.
 
 {
  $Log$
- Revision 1.16  1998-10-01 20:19:57  jonas
+ Revision 1.17  1998-10-02 17:29:56  jonas
+   + removal of "lea (reg), reg)", "imul $1, reg", change "mov reg1, reg2; mov (reg2), reg2" to "mov (reg1), reg2"
+
+ Revision 1.16  1998/10/01 20:19:57  jonas
    * moved UpdateUsedRegs (+ bugfix) to daopt386
 
  Revision 1.15  1998/09/30 12:18:29  peter