From f37bad774c9f4ff81dc1f7e363c93a62a1c75d7c Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 17 Feb 2018 18:38:03 +0000 Subject: [PATCH] * 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 - --- compiler/ncgset.pas | 53 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/compiler/ncgset.pas b/compiler/ncgset.pas index 61051b8f00..d770209e24 100644 --- a/compiler/ncgset.pas +++ b/compiler/ncgset.pas @@ -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;