summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorsvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2012-11-04 20:29:22 +0000
committersvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2012-11-04 20:29:22 +0000
commit35f408c64b77df7c1eda05b5a2bfc073039b3b25 (patch)
treed254f9a9cf0b4bb011f1d8da40138aad21b79968 /compiler
parente46d10293f611c2150530c592c08a3b41dbc4fb6 (diff)
downloadfpc-35f408c64b77df7c1eda05b5a2bfc073039b3b25.tar.gz
m68k/cgcpu.pas, tcg64k.fixref:
* in the case of ref.base + ref.symbol always add the base to the index; with this the compiler now cycles for Coldfire git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@22931 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler')
-rw-r--r--compiler/m68k/cgcpu.pas26
1 files changed, 23 insertions, 3 deletions
diff --git a/compiler/m68k/cgcpu.pas b/compiler/m68k/cgcpu.pas
index e7116d4c6e..74831001d1 100644
--- a/compiler/m68k/cgcpu.pas
+++ b/compiler/m68k/cgcpu.pas
@@ -521,7 +521,27 @@ unit cgcpu;
begin
if (ref.base<>NR_NO) then
begin
- if assigned(ref.symbol) and (ref.index=NR_NO) then
+ if assigned(ref.symbol) then
+ begin
+ hreg:=cg.getaddressregister(list);
+ reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment);
+ list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
+ if ref.index<>NR_NO then
+ begin
+ idxreg:=getaddressregister(list);
+ list.concat(taicpu.op_reg_reg(A_MOVE,S_L,ref.base,idxreg));
+ list.concat(taicpu.op_reg_reg(A_ADD,S_L,ref.index,idxreg));
+ ref.index:=idxreg;
+ end
+ else
+ ref.index:=ref.base;
+ ref.base:=hreg;
+ ref.offset:=0;
+ ref.symbol:=nil;
+ end;
+ { once the above is verified to work the below code can be
+ removed }
+ {if assigned(ref.symbol) and (ref.index=NR_NO) then
begin
hreg:=cg.getaddressregister(list);
reference_reset_symbol(href,ref.symbol,0,ref.alignment);
@@ -534,10 +554,10 @@ unit cgcpu;
begin
hreg:=getaddressregister(list);
list.concat(taicpu.op_reg_reg(A_MOVE,S_L,ref.base,hreg));
- list.concat(taicpu.op_reg_reg(A_ADD,S_L,hreg,ref.index));
+ list.concat(taicpu.op_reg_reg(A_ADD,S_L,ref.index,hreg));
ref.base:=hreg;
ref.index:=NR_NO;
- end;
+ end;}
{if (ref.index <> NR_NO) and assigned(ref.symbol) then
internalerror(2002081403);}
{ base + reg }