Pārlūkot izejas kodu

* implements RegInInstruction and fixes RegModifiedByInstruction for avr

git-svn-id: trunk@30647 -
florian 10 gadi atpakaļ
vecāks
revīzija
3e8766290d
2 mainītis faili ar 18 papildinājumiem un 0 dzēšanām
  1. 11 0
      compiler/avr/aoptcpu.pas
  2. 7 0
      compiler/avr/aoptcpub.pas

+ 11 - 0
compiler/avr/aoptcpu.pas

@@ -33,6 +33,7 @@ uses cpubase, cgbase, aasmtai, aopt, aoptcpub;
 Type
   TCpuAsmOptimizer = class(TAsmOptimizer)
     Function GetNextInstructionUsingReg(Current: tai; Var Next: tai;reg : TRegister): Boolean;
+    function RegInInstruction(Reg: TRegister; p1: tai): Boolean; override;
 
     { uses the same constructor as TAopObj }
     function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
@@ -52,6 +53,16 @@ Implementation
     end;
 
 
+  function TCpuAsmOptimizer.RegInInstruction(Reg: TRegister; p1: tai): Boolean;
+    begin
+      If (p1.typ = ait_instruction) and (taicpu(p1).opcode in [A_MUL,A_MULS,A_FMUL,A_FMULS,A_FMULSU]) and
+              ((getsupreg(reg)=RS_R0) or (getsupreg(reg)=RS_R1)) then
+        Result:=true
+      else
+        Result:=inherited RegInInstruction(Reg, p1);
+    end;
+
+
   function TCpuAsmOptimizer.GetNextInstructionUsingReg(Current: tai;
     var Next: tai; reg: TRegister): Boolean;
     begin

+ 7 - 0
compiler/avr/aoptcpub.pas

@@ -121,6 +121,13 @@ Implementation
       i : Longint;
     begin
       result:=false;
+      If (p1.typ = ait_instruction) and (taicpu(p1).opcode in [A_MUL,A_MULS,A_FMUL,A_FMULS,A_FMULSU]) and
+              ((getsupreg(reg)=RS_R0) or (getsupreg(reg)=RS_R1)) then
+        begin
+          Result:=true;
+          exit;
+        end;
+
       for i:=0 to taicpu(p1).ops-1 do
         if (taicpu(p1).oper[i]^.typ=top_reg) and (taicpu(p1).oper[i]^.reg=Reg) and (taicpu(p1).spilling_get_operation_type(i) in [operand_write,operand_readwrite]) then
           begin