* do not use 32 bit operations on 8 bit cpu in tcginnode.pass_generate_code if not needed, resolves #32071

git-svn-id: trunk@38271 -
This commit is contained in:
florian 2018-02-17 18:38:03 +00:00
parent c3a0a4e252
commit f37bad774c

View File

@ -257,17 +257,56 @@ implementation
genjumps := checkgenjumps(setparts,numparts,use_small);
orgopsize := def_cgsize(left.resultdef);
uopsize := OS_32;
uopdef := u32inttype;
if is_signed(left.resultdef) then
{$if defined(cpu8bitalu)}
if (tsetdef(right.resultdef).setbase>=-128) and
(tsetdef(right.resultdef).setmax-tsetdef(right.resultdef).setbase+1<=256) then
begin
opsize := OS_S32;
opdef := s32inttype;
uopsize := OS_8;
uopdef := u8inttype;
if is_signed(left.resultdef) then
begin
opsize := OS_S8;
opdef := s8inttype;
end
else
begin
opsize := uopsize;
opdef := uopdef;
end;
end
{$endif defined(cpu8bitalu)}
{$if defined(cpu8bitalu)}
else if (tsetdef(right.resultdef).setbase>=-32768) and
(tsetdef(right.resultdef).setmax-tsetdef(right.resultdef).setbase+1<=65536) then
begin
uopsize := OS_16;
uopdef := u16inttype;
if is_signed(left.resultdef) then
begin
opsize := OS_S16;
opdef := s16inttype;
end
else
begin
opsize := uopsize;
opdef := uopdef;
end;
end
else
{$endif defined(cpu8bitalu)}
begin
opsize := uopsize;
opdef := uopdef;
uopsize := OS_32;
uopdef := u32inttype;
if is_signed(left.resultdef) then
begin
opsize := OS_S32;
opdef := s32inttype;
end
else
begin
opsize := uopsize;
opdef := uopdef;
end;
end;
needslabel := false;