* fixed normalize_ref

git-svn-id: branches/avr@17045 -
This commit is contained in:
florian 2011-02-27 21:09:41 +00:00
parent 88b0db90a6
commit 93e72b7e8a

View File

@ -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;