diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index 005e054f6a..35d37a84f6 100644 --- a/compiler/cgobj.pas +++ b/compiler/cgobj.pas @@ -1947,11 +1947,14 @@ implementation procedure tcg.a_op_const_ref(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; const ref: TReference); var tmpreg : tregister; + tmpref : treference; begin if assigned(ref.symbol) { for avrtiny, the code generator generates a ref which is Z relative and while using it, Z is changed, so the following code breaks } - {$ifdef avr}and not(CPUAVR_16_REGS in cpu_capabilities[current_settings.cputype]){$endif avr} then + {$ifdef avr} + and not((CPUAVR_16_REGS in cpu_capabilities[current_settings.cputype]) or (tcgsize2size[size]=1)) + {$endif avr} then begin tmpreg:=getaddressregister(list); a_loadaddr_ref_reg(list,ref,tmpreg); @@ -1960,9 +1963,9 @@ implementation else tmpref:=ref; tmpreg:=getintregister(list,size); - a_load_ref_reg(list,size,size,ref,tmpreg); + a_load_ref_reg(list,size,size,tmpref,tmpreg); a_op_const_reg(list,op,size,a,tmpreg); - a_load_reg_ref(list,size,size,tmpreg,ref); + a_load_reg_ref(list,size,size,tmpreg,tmpref); end; @@ -1982,11 +1985,14 @@ implementation procedure tcg.a_op_reg_ref(list : TAsmList; Op: TOpCG; size: TCGSize;reg: TRegister; const ref: TReference); var tmpreg : tregister; + tmpref : treference; begin if assigned(ref.symbol) { for avrtiny, the code generator generates a ref which is Z relative and while using it, Z is changed, so the following code breaks } - {$ifdef avr}and not(CPUAVR_16_REGS in cpu_capabilities[current_settings.cputype]){$endif avr} then + {$ifdef avr} + and not((CPUAVR_16_REGS in cpu_capabilities[current_settings.cputype]) or (tcgsize2size[size]=1)) + {$endif avr} then begin tmpreg:=getaddressregister(list); a_loadaddr_ref_reg(list,ref,tmpreg);