瀏覽代碼

* set register size correctly for popcnt(<byte>), resolves #37400

git-svn-id: trunk@45828 -
florian 5 年之前
父節點
當前提交
ed158f1e52
共有 3 個文件被更改,包括 19 次插入0 次删除
  1. 1 0
      .gitattributes
  2. 6 0
      compiler/x86/nx86inl.pas
  3. 12 0
      tests/webtbs/tw37400.pp

+ 1 - 0
.gitattributes

@@ -18383,6 +18383,7 @@ tests/webtbs/tw37339.pp svneol=native#text/pascal
 tests/webtbs/tw37393.pp svneol=native#text/pascal
 tests/webtbs/tw37393.pp svneol=native#text/pascal
 tests/webtbs/tw37397.pp svneol=native#text/plain
 tests/webtbs/tw37397.pp svneol=native#text/plain
 tests/webtbs/tw37398.pp svneol=native#text/pascal
 tests/webtbs/tw37398.pp svneol=native#text/pascal
+tests/webtbs/tw37400.pp svneol=native#text/pascal
 tests/webtbs/tw3742.pp svneol=native#text/plain
 tests/webtbs/tw3742.pp svneol=native#text/plain
 tests/webtbs/tw3751.pp svneol=native#text/plain
 tests/webtbs/tw3751.pp svneol=native#text/plain
 tests/webtbs/tw3758.pp svneol=native#text/plain
 tests/webtbs/tw3758.pp svneol=native#text/plain

+ 6 - 0
compiler/x86/nx86inl.pas

@@ -1111,6 +1111,12 @@ implementation
           emit_reg_reg(A_POPCNT,TCGSize2OpSize[opsize],left.location.register,location.register)
           emit_reg_reg(A_POPCNT,TCGSize2OpSize[opsize],left.location.register,location.register)
         else
         else
           emit_ref_reg(A_POPCNT,TCGSize2OpSize[opsize],left.location.reference,location.register);
           emit_ref_reg(A_POPCNT,TCGSize2OpSize[opsize],left.location.reference,location.register);
+
+        if resultdef.size=1 then
+          begin
+            location.size:=OS_8;
+            location.register:=cg.makeregsize(current_asmdata.CurrAsmList,location.register,location.size);
+          end;
       end;
       end;
 
 
 
 

+ 12 - 0
tests/webtbs/tw37400.pp

@@ -0,0 +1,12 @@
+{ %cpu=i386,x86_64 }
+{ %opt=-Cpcoreavx2 }
+function popc ( a, b: byte):byte;
+var z,v: byte;
+begin  
+     z:=a+b;
+     v:=popcnt(z); //-- this line
+     popc:=v;
+end;
+
+begin
+end.