From c7e6d07ff0c179d420387e53fcf5403ca6ae6329 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 9 Mar 2011 19:46:05 +0000 Subject: [PATCH] * fix tavraddnode.second_cmp * optimized register usage + implemented concatcopy for len<16 git-svn-id: branches/avr@17106 - --- compiler/avr/cgcpu.pas | 18 +++++++++++------- compiler/avr/navradd.pas | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/compiler/avr/cgcpu.pas b/compiler/avr/cgcpu.pas index 5d87b337d8..e79eef2fa7 100644 --- a/compiler/avr/cgcpu.pas +++ b/compiler/avr/cgcpu.pas @@ -516,7 +516,11 @@ unit cgcpu; shift:=0; for i:=1 to tcgsize2size[size] do begin - list.concat(taicpu.op_reg_const(A_LDI,reg,(qword(a) and mask) shr shift)); + if ((qword(a) and mask) shr shift)=0 then + emit_mov(list,reg,NR_R1) + else + list.concat(taicpu.op_reg_const(A_LDI,reg,(qword(a) and mask) shr shift)); + mask:=mask shl 8; inc(shift,8); reg:=GetNextReg(reg); @@ -578,8 +582,8 @@ unit cgcpu; 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))); + emit_mov(list,tmpreg,ref.index); + emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index)); list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base)); list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base))); ref.base:=tmpreg; @@ -590,8 +594,8 @@ unit cgcpu; 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))); + emit_mov(list,tmpreg,ref.base); + emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.base)); ref.base:=tmpreg; ref.index:=NR_NO; end @@ -600,8 +604,8 @@ unit cgcpu; 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))); + emit_mov(list,tmpreg,ref.index); + emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index)); ref.base:=tmpreg; ref.index:=NR_NO; end; diff --git a/compiler/avr/navradd.pas b/compiler/avr/navradd.pas index cb5dc6da43..ccab06b4e4 100644 --- a/compiler/avr/navradd.pas +++ b/compiler/avr/navradd.pas @@ -182,6 +182,8 @@ interface for i:=2 to tcgsize2size[left.location.size] do begin + tmpreg1:=GetNextReg(tmpreg1); + tmpreg2:=GetNextReg(tmpreg2); if i=5 then begin tmpreg1:=left.location.registerhi;