浏览代码

Bug fixes to magic division and vectorcall code that trigger -CriotR checks

J. Gareth "Curious Kit" Moreton 3 年之前
父节点
当前提交
3ce6c478cc
共有 2 个文件被更改,包括 14 次插入5 次删除
  1. 1 1
      compiler/x86/nx86mat.pas
  2. 13 4
      compiler/x86_64/cpupara.pas

+ 1 - 1
compiler/x86/nx86mat.pas

@@ -705,7 +705,7 @@ interface
               end
             else
               begin
-                d:=tordconstnode(right).value.svalue;
+                d:=tordconstnode(right).value.uvalue;
                 if d>=aword(1) shl (left.resultdef.size*8-1) then
                   begin
 

+ 13 - 4
compiler/x86_64/cpupara.pas

@@ -661,7 +661,9 @@ unit cpupara;
 
                     { Split into 2 Singles again so they correctly fall into separate XMM registers }
                     classes[0].typ := X86_64_SSESF_CLASS;
-                    classes[0].def := tdef(tarraydef(classes[0].def).elementdef); { Break up the array }
+                    if classes[0].def.typ = arraydef then
+                       { Break up the array }
+                      classes[0].def := tdef(tarraydef(classes[0].def).elementdef); { Break up the array }
                     classes[1].typ := X86_64_SSESF_CLASS;
                     classes[1].def := classes[0].def;
                     result := 2;
@@ -676,7 +678,9 @@ unit cpupara;
                     classes[2].typ := X86_64_SSESF_CLASS;
                     classes[2].def := classes[1].def; { Transfer class 1 to class 2 }
                     classes[0].typ := X86_64_SSESF_CLASS;
-                    classes[0].def := tdef(tarraydef(classes[0].def).elementdef); { Break up the array }
+                    if classes[0].def.typ = arraydef then
+                      { Break up the array }
+                      classes[0].def := tdef(tarraydef(classes[0].def).elementdef);
                     classes[1].typ := X86_64_SSESF_CLASS;
                     classes[1].def := classes[0].def;
                     result := 3;
@@ -688,8 +692,13 @@ unit cpupara;
                         { HFA too large (or not a true HFA) }
                         Exit(0);
 
-                    classes[0].def := tdef(tarraydef(classes[0].def).elementdef); { Break up the arrays }
-                    classes[2].def := tdef(tarraydef(classes[1].def).elementdef);
+                    if classes[0].def.typ = arraydef then
+                       { Break up the array }
+                      classes[0].def := tdef(tarraydef(classes[0].def).elementdef);
+                    if classes[1].def.typ = arraydef then
+                       { Break up the array }
+                      classes[2].def := tdef(tarraydef(classes[1].def).elementdef);
+
                     classes[1].def := classes[0].def;
                     classes[3].def := classes[2].def;