Browse Source

* 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 -
florian 7 years ago
parent
commit
f37bad774c
1 changed files with 46 additions and 7 deletions
  1. 46 7
      compiler/ncgset.pas

+ 46 - 7
compiler/ncgset.pas

@@ -257,17 +257,56 @@ implementation
          genjumps := checkgenjumps(setparts,numparts,use_small);
          genjumps := checkgenjumps(setparts,numparts,use_small);
 
 
          orgopsize := def_cgsize(left.resultdef);
          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
            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
            end
          else
          else
+{$endif defined(cpu8bitalu)}
            begin
            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;
            end;
          needslabel := false;
          needslabel := false;