瀏覽代碼

* 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 年之前
父節點
當前提交
f37bad774c
共有 1 個文件被更改,包括 46 次插入7 次删除
  1. 46 7
      compiler/ncgset.pas

+ 46 - 7
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;