diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-09-05 20:25:32 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-09-05 20:25:32 +0000 |
commit | fc6f169bbef3193c9ef2b7ebda9414e86b2e8830 (patch) | |
tree | 0a587951f0d784a2bdb2adebf3113f622e681cac /compiler/xtensa | |
parent | 86232778d7cd1509abd3ebbc9f29e79984152510 (diff) | |
download | fpc-fc6f169bbef3193c9ef2b7ebda9414e86b2e8830.tar.gz |
* Xtensa: handle references with offset only properly
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@46784 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/xtensa')
-rw-r--r-- | compiler/xtensa/cgcpu.pas | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/compiler/xtensa/cgcpu.pas b/compiler/xtensa/cgcpu.pas index 86c3305615..deae00dbfe 100644 --- a/compiler/xtensa/cgcpu.pas +++ b/compiler/xtensa/cgcpu.pas @@ -286,7 +286,8 @@ implementation (href.index<>NR_NO) or ((op=A_L8UI) and ((href.offset<0) or (href.offset>255))) or ((op in [A_L16SI,A_L16UI]) and ((href.offset<0) or (href.offset>510) or (href.offset mod 2<>0))) or - ((op=A_L32I) and ((href.offset<0) or (href.offset>1020) or (href.offset mod 4<>0))) then + ((op=A_L32I) and ((href.offset<0) or (href.offset>1020) or (href.offset mod 4<>0))) or + ((href.base=NR_NO) and (href.index=NR_NO)) then fixref(list,href); list.concat(taicpu.op_reg_ref(op,reg,href)); @@ -329,15 +330,21 @@ implementation l : tasmlabel; begin { create consts entry } - if assigned(ref.symbol) or (ref.offset<-2048) or (ref.offset>2047) then + if assigned(ref.symbol) or (ref.offset<-2048) or (ref.offset>2047) or + ((ref.base=NR_NO) and (ref.index=NR_NO)) then begin reference_reset(tmpref,4,[]); tmpreg:=NR_NO; { load consts entry } tmpreg:=getintregister(list,OS_INT); - tmpref.symbol:=create_data_entry(ref.symbol,ref.offset); - list.concat(taicpu.op_reg_ref(A_L32R,tmpreg,tmpref)); + if ref.symbol=nil then + a_load_const_reg(list,OS_ADDR,ref.offset,tmpreg) + else + begin + tmpref.symbol:=create_data_entry(ref.symbol,ref.offset); + list.concat(taicpu.op_reg_ref(A_L32R,tmpreg,tmpref)); + end; if ref.base<>NR_NO then begin |