* due to avr's harvard architecture, loads of code labels need to use the gs(...) macro

git-svn-id: trunk@30559 -
This commit is contained in:
florian 2015-04-12 20:29:13 +00:00
parent 34c7f45637
commit 4d01271944
3 changed files with 27 additions and 4 deletions

View File

@ -128,8 +128,12 @@ unit agavrgas;
case refaddr of case refaddr of
addr_hi8: addr_hi8:
s:='hi8('+s+')'; s:='hi8('+s+')';
addr_hi8_gs:
s:='hi8(gs('+s+'))';
addr_lo8: addr_lo8:
s:='lo8('+s+')'; s:='lo8('+s+')';
addr_lo8_gs:
s:='lo8(gs('+s+'))';
else else
s:='('+s+')'; s:='('+s+')';
end; end;

View File

@ -843,12 +843,20 @@ unit cgcpu;
reference_reset(tmpref,0); reference_reset(tmpref,0);
tmpref.symbol:=ref.symbol; tmpref.symbol:=ref.symbol;
tmpref.offset:=ref.offset; tmpref.offset:=ref.offset;
tmpref.refaddr:=addr_lo8; if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
tmpref.refaddr:=addr_lo8_gs
else
tmpref.refaddr:=addr_lo8;
maybegetcpuregister(list,tmpreg); maybegetcpuregister(list,tmpreg);
list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref)); list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
tmpref.refaddr:=addr_hi8;
if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
tmpref.refaddr:=addr_hi8_gs
else
tmpref.refaddr:=addr_hi8;
maybegetcpuregister(list,GetNextReg(tmpreg)); maybegetcpuregister(list,GetNextReg(tmpreg));
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
begin begin
list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base)); list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
@ -1623,10 +1631,19 @@ unit cgcpu;
reference_reset(tmpref,0); reference_reset(tmpref,0);
tmpref.symbol:=ref.symbol; tmpref.symbol:=ref.symbol;
tmpref.offset:=ref.offset; tmpref.offset:=ref.offset;
tmpref.refaddr:=addr_lo8;
if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
tmpref.refaddr:=addr_lo8_gs
else
tmpref.refaddr:=addr_lo8;
list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref)); list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref));
tmpref.refaddr:=addr_hi8;
if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
tmpref.refaddr:=addr_hi8_gs
else
tmpref.refaddr:=addr_hi8;
list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(r),tmpref)); list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(r),tmpref));
if (ref.base<>NR_NO) then if (ref.base<>NR_NO) then
begin begin
list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base)); list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base));

View File

@ -95,7 +95,9 @@ interface
{$ENDIF} {$ENDIF}
{$IFDEF AVR} {$IFDEF AVR}
,addr_lo8 ,addr_lo8
,addr_lo8_gs
,addr_hi8 ,addr_hi8
,addr_hi8_gs
{$ENDIF} {$ENDIF}
{$IFDEF i8086} {$IFDEF i8086}
,addr_dgroup // the data segment group ,addr_dgroup // the data segment group