diff --git a/compiler/popt386.pas b/compiler/popt386.pas index d590b0f30f..6ddf2f407a 100644 --- a/compiler/popt386.pas +++ b/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