Browse Source

- <op> ....; cmp ...,#0 cmps ... optimization deactivated
* optimize ldr/ldr if possible

git-svn-id: trunk@20416 -

florian 13 years ago
parent
commit
bb2df48aa9
1 changed files with 36 additions and 2 deletions
  1. 36 2
      compiler/arm/aoptcpu.pas

+ 36 - 2
compiler/arm/aoptcpu.pas

@@ -84,6 +84,7 @@ Implementation
       case p.typ of
       case p.typ of
         ait_instruction:
         ait_instruction:
           begin
           begin
+            (* optimization proved not to be safe, see tw4768.pp
             {
             {
               change
               change
               <op> reg,x,y
               <op> reg,x,y
@@ -118,6 +119,7 @@ Implementation
                hp1.free;
                hp1.free;
              end
              end
            else
            else
+           *)
               case taicpu(p).opcode of
               case taicpu(p).opcode of
                 A_STR:
                 A_STR:
                   begin
                   begin
@@ -129,7 +131,7 @@ Implementation
                       mov reg2,reg1
                       mov reg2,reg1
                     }
                     }
                     if (taicpu(p).oper[1]^.ref^.addressmode=AM_OFFSET) and
                     if (taicpu(p).oper[1]^.ref^.addressmode=AM_OFFSET) and
-                       getnextinstruction(p,hp1) and
+                       GetNextInstruction(p,hp1) and
                        (hp1.typ = ait_instruction) and
                        (hp1.typ = ait_instruction) and
                        (taicpu(hp1).opcode = A_LDR) and
                        (taicpu(hp1).opcode = A_LDR) and
                        RefsEqual(taicpu(p).oper[1]^.ref^,taicpu(hp1).oper[1]^.ref^) and
                        RefsEqual(taicpu(p).oper[1]^.ref^,taicpu(hp1).oper[1]^.ref^) and
@@ -148,7 +150,39 @@ Implementation
                           end;
                           end;
                         result := true;
                         result := true;
                       end;
                       end;
-                  end;
+                  end;                
+                A_LDR:
+                  begin
+                    { change
+                      ldr reg1,ref
+                      ldr reg2,ref
+                      into
+                      ldr reg1,ref
+                      mov reg2,reg1
+                    }
+                    if (taicpu(p).oper[1]^.ref^.addressmode=AM_OFFSET) and
+                       GetNextInstruction(p,hp1) and
+                       (hp1.typ = ait_instruction) and
+                       (taicpu(hp1).opcode = A_LDR) and
+                       RefsEqual(taicpu(p).oper[1]^.ref^,taicpu(hp1).oper[1]^.ref^) and
+                       (taicpu(p).oper[0]^.reg<>taicpu(hp1).oper[1]^.ref^.index) and
+                       (taicpu(p).oper[0]^.reg<>taicpu(hp1).oper[1]^.ref^.base) and
+                       (taicpu(hp1).oper[1]^.ref^.addressmode=AM_OFFSET) then
+                      begin
+                        if taicpu(hp1).oper[0]^.reg=taicpu(p).oper[0]^.reg then
+                          begin
+                            asml.remove(hp1);
+                            hp1.free;
+                          end
+                        else
+                          begin
+                            taicpu(hp1).opcode:=A_MOV;
+                            taicpu(hp1).oppostfix:=PF_None;
+                            taicpu(hp1).loadreg(1,taicpu(p).oper[0]^.reg);
+                          end;
+                        result := true;
+                      end;                      
+                  end;                  
                 A_MOV:
                 A_MOV:
                   begin
                   begin
                     { fold
                     { fold