summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter <peter@3ad0048d-3df7-0310-abae-a5850022a9f2>2006-03-29 11:34:42 +0000
committerpeter <peter@3ad0048d-3df7-0310-abae-a5850022a9f2>2006-03-29 11:34:42 +0000
commitc356ea00411850b58fe4ccbebc2d304053cd57bf (patch)
tree165ceddf26da83f3fb961d8c94d5be41b508b98b
parent6fea5c3aa3a04a6fdb5ef1ceb884da3d54205f3c (diff)
downloadfpc-c356ea00411850b58fe4ccbebc2d304053cd57bf.tar.gz
* 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 git-svn-id: http://svn.freepascal.org/svn/fpc/branches/linker@3072 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--compiler/aggas.pas4
-rw-r--r--compiler/psub.pas3
-rw-r--r--compiler/sparc/cpubase.pas28
3 files changed, 28 insertions, 7 deletions
diff --git a/compiler/aggas.pas b/compiler/aggas.pas
index 9ef4dba729..2551449cc6 100644
--- a/compiler/aggas.pas
+++ b/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
diff --git a/compiler/psub.pas b/compiler/psub.pas
index 4dafe8d221..7cc69aaae8 100644
--- a/compiler/psub.pas
+++ b/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))))
diff --git a/compiler/sparc/cpubase.pas b/compiler/sparc/cpubase.pas
index 48f44024f6..73e53a81cd 100644
--- a/compiler/sparc/cpubase.pas
+++ b/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;