mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-20 14:09:12 +02:00
* fixed normalize_ref
git-svn-id: branches/avr@17045 -
This commit is contained in:
parent
88b0db90a6
commit
93e72b7e8a
@ -541,13 +541,14 @@ unit cgcpu;
|
|||||||
end;
|
end;
|
||||||
if assigned(ref.symbol) or (ref.offset<>0) then
|
if assigned(ref.symbol) or (ref.offset<>0) then
|
||||||
begin
|
begin
|
||||||
tmpreg:=getaddressregister(list);
|
getcpuregister(list,NR_R30);
|
||||||
|
getcpuregister(list,NR_R31);
|
||||||
|
tmpreg:=NR_R30;
|
||||||
reference_reset(tmpref,0);
|
reference_reset(tmpref,0);
|
||||||
tmpref.symbol:=ref.symbol;
|
tmpref.symbol:=ref.symbol;
|
||||||
tmpref.offset:=lo(word(ref.offset));
|
tmpref.offset:=ref.offset;
|
||||||
tmpref.refaddr:=addr_lo8;
|
tmpref.refaddr:=addr_lo8;
|
||||||
list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
|
list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
|
||||||
tmpref.offset:=hi(word(ref.offset));
|
|
||||||
tmpref.refaddr:=addr_hi8;
|
tmpref.refaddr:=addr_hi8;
|
||||||
list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(tmpreg),tmpref));
|
list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(tmpreg),tmpref));
|
||||||
if (ref.base<>NR_NO) then
|
if (ref.base<>NR_NO) then
|
||||||
@ -560,17 +561,42 @@ unit cgcpu;
|
|||||||
list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
|
list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
|
||||||
list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
|
list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
|
||||||
end;
|
end;
|
||||||
|
ref.symbol:=nil;
|
||||||
|
ref.offset:=0;
|
||||||
ref.base:=tmpreg;
|
ref.base:=tmpreg;
|
||||||
ref.index:=NR_NO;
|
ref.index:=NR_NO;
|
||||||
end
|
end
|
||||||
else if (ref.base<>NR_NO) and (ref.index<>NR_NO) then
|
else if (ref.base<>NR_NO) and (ref.index<>NR_NO) then
|
||||||
begin
|
begin
|
||||||
tmpreg:=getaddressregister(list);
|
getcpuregister(list,NR_R30);
|
||||||
list.concat(taicpu.op_reg_reg(A_MOVW,tmpreg,ref.index));
|
getcpuregister(list,NR_R31);
|
||||||
|
tmpreg:=NR_R30;
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,tmpreg,ref.index));
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,GetNextReg(tmpreg),GetNextReg(ref.index)));
|
||||||
list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
|
list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
|
||||||
list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
|
list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
|
||||||
ref.base:=tmpreg;
|
ref.base:=tmpreg;
|
||||||
ref.index:=NR_NO;
|
ref.index:=NR_NO;
|
||||||
|
end
|
||||||
|
else if (ref.base<>NR_NO) then
|
||||||
|
begin
|
||||||
|
getcpuregister(list,NR_R30);
|
||||||
|
getcpuregister(list,NR_R31);
|
||||||
|
tmpreg:=NR_R30;
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,tmpreg,ref.base));
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,GetNextReg(tmpreg),GetNextReg(ref.base)));
|
||||||
|
ref.base:=tmpreg;
|
||||||
|
ref.index:=NR_NO;
|
||||||
|
end
|
||||||
|
else if (ref.index<>NR_NO) then
|
||||||
|
begin
|
||||||
|
getcpuregister(list,NR_R30);
|
||||||
|
getcpuregister(list,NR_R31);
|
||||||
|
tmpreg:=NR_R30;
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,tmpreg,ref.index));
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,GetNextReg(tmpreg),GetNextReg(ref.index)));
|
||||||
|
ref.base:=tmpreg;
|
||||||
|
ref.index:=NR_NO;
|
||||||
end;
|
end;
|
||||||
Result:=ref;
|
Result:=ref;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user