Selaa lähdekoodia

Merged revisions 3072-3073 via svnmerge from
http://svn.freepascal.org/svn/fpc/branches/linker/compiler

........
r3072 | peter | 2006-03-29 13:34:42 +0200 (Wed, 29 Mar 2006) | 4 lines

* std_regname generate pair of registers for float doubles
* don't call translate_register for regvars if -sr is passed
* use std_regname in regalloc message

........
r3073 | peter | 2006-03-29 16:00:37 +0200 (Wed, 29 Mar 2006) | 2 lines

* CMP instructions only read operands

........

git-svn-id: trunk@3079 -

peter 19 vuotta sitten
vanhempi
commit
5376d2d570
4 muutettua tiedostoa jossa 38 lisäystä ja 11 poistoa
  1. 2 2
      compiler/aggas.pas
  2. 2 1
      compiler/psub.pas
  3. 10 4
      compiler/sparc/aasmcpu.pas
  4. 24 4
      compiler/sparc/cpubase.pas

+ 2 - 2
compiler/aggas.pas

@@ -91,7 +91,7 @@ implementation
     uses
       cutils,systems,
       fmodule,finput,verbose,
-      itcpugas
+      itcpugas,cpubase
       ;
 
     const
@@ -469,7 +469,7 @@ implementation
                  begin
                    AsmWrite(#9+target_asm.comment+'Register ');
                    repeat
-                     AsmWrite(gas_regname(Tai_regalloc(hp).reg));
+                     AsmWrite(std_regname(Tai_regalloc(hp).reg));
                      if (hp.next=nil) or
                         (tai(hp.next).typ<>ait_regalloc) or
                         (tai_regalloc(hp.next).ratype<>tai_regalloc(hp).ratype) then

+ 2 - 1
compiler/psub.pas

@@ -613,7 +613,8 @@ implementation
             (tabstractnormalvarsym(p).localloc.loc in [LOC_REGISTER,LOC_CREGISTER,LOC_MMREGISTER,
               LOC_CMMREGISTER,LOC_FPUREGISTER,LOC_CFPUREGISTER]) then
            begin
-             cg.translate_register(tabstractnormalvarsym(p).localloc.register);
+             if not(cs_no_regalloc in aktglobalswitches) then
+               cg.translate_register(tabstractnormalvarsym(p).localloc.register);
              if cs_asm_source in aktglobalswitches then
                TAsmList(list).concat(Tai_comment.Create(strpnew('Var '+tabstractnormalvarsym(p).realname+' located in register '+
                  std_regname(tabstractnormalvarsym(p).localloc.register))))

+ 10 - 4
compiler/sparc/aasmcpu.pas

@@ -246,10 +246,16 @@ implementation
 
     function taicpu.spilling_get_operation_type(opnr: longint): topertype;
       begin
-        if opnr=ops-1 then
-          result := operand_write
-        else
-          result := operand_read;
+        result := operand_read;
+        case opcode of
+          A_FCMPs,A_FCMPd,A_FCMPq :
+            ;
+          else
+            begin
+              if opnr=ops-1 then
+                result := operand_write;
+            end;
+        end;
       end;
 
 

+ 24 - 4
compiler/sparc/cpubase.pas

@@ -429,11 +429,31 @@ implementation
       var
         p : tregisterindex;
       begin
-        p:=findreg_by_number(r);
-        if p<>0 then
-          result:=std_regname_table[p]
+        { For double floats show a pair like %f0:%f1 }
+        if (getsubreg(r)=R_SUBFD) and
+           (getsupreg(r)<first_fpu_imreg) then
+          begin
+            setsubreg(r,R_SUBFS);
+            p:=findreg_by_number(r);
+            if p<>0 then
+              result:=std_regname_table[p]
+            else
+              result:=generic_regname(r);
+            setsupreg(r,getsupreg(r)+1);
+            p:=findreg_by_number(r);
+            if p<>0 then
+              result:=result+':'+std_regname_table[p]
+            else
+              result:=result+':'+generic_regname(r);
+          end
         else
-          result:=generic_regname(r);
+          begin
+            p:=findreg_by_number(r);
+            if p<>0 then
+              result:=std_regname_table[p]
+            else
+              result:=generic_regname(r);
+          end;
       end;