* avoid unneeded the generation of un-needed shift instructions thlcgobj.in a_load_subsetreg_reg

git-svn-id: trunk@37374 -
This commit is contained in:
florian 2017-10-01 16:13:22 +00:00
parent 6f338bb4b5
commit 75e03a7e62

View File

@ -1281,6 +1281,10 @@ implementation
begin begin
subsetregdef:=cgsize_orddef(sreg.subsetregsize); subsetregdef:=cgsize_orddef(sreg.subsetregsize);
tmpreg:=getintregister(list,subsetregdef); tmpreg:=getintregister(list,subsetregdef);
{ insert shifts only if it changes bits being accessed later on }
if (sreg.startbit<>0) or
(tosize.size*8>sreg.bitlen) then
begin
if is_signed(subsetsize) then if is_signed(subsetsize) then
begin begin
{ sign extend in case the value has a bitsize mod 8 <> 0 } { sign extend in case the value has a bitsize mod 8 <> 0 }
@ -1300,6 +1304,9 @@ implementation
bitmask:=high(aword); bitmask:=high(aword);
a_op_const_reg(list,OP_AND,subsetregdef,tcgint(bitmask),tmpreg); a_op_const_reg(list,OP_AND,subsetregdef,tcgint(bitmask),tmpreg);
end; end;
end
else
a_load_reg_reg(list,subsetregdef,subsetregdef,sreg.subsetreg,tmpreg);
subsetsizereg:=getintregister(list,subsetsize); subsetsizereg:=getintregister(list,subsetsize);
a_load_reg_reg(list,subsetregdef,subsetsize,tmpreg,subsetsizereg); a_load_reg_reg(list,subsetregdef,subsetsize,tmpreg,subsetsizereg);
a_load_reg_reg(list,subsetsize,tosize,subsetsizereg,destreg); a_load_reg_reg(list,subsetsize,tosize,subsetsizereg,destreg);