Gcc Cygwin中.seh_savexmm的寄存器无效

Gcc Cygwin中.seh_savexmm的寄存器无效,gcc,assembly,cygwin,avx512,Gcc,Assembly,Cygwin,Avx512,$make 我曾与cygwin合作过,但遇到编译错误。 我不确定.seh_savexmm的无效寄存器是什么 请帮帮我。 我在谷歌上搜索了这个问题,但没有找到 问题很多,但解决不了。 请帮帮我 perl ./generate-functions.pl -file operationMetadata.csv g++ -std=c++14 -O3 -Wall -g -mavx512vl -mavx512f -mavx512pf -mavx512er -mavx512cd -fno-common -c

$make 我曾与cygwin合作过,但遇到编译错误。 我不确定.seh_savexmm的无效寄存器是什么 请帮帮我。 我在谷歌上搜索了这个问题,但没有找到 问题很多,但解决不了。 请帮帮我

perl ./generate-functions.pl -file operationMetadata.csv
g++ -std=c++14 -O3 -Wall -g -mavx512vl -mavx512f -mavx512pf -mavx512er -mavx512cd -fno-common -c int-test.c -o int-test.o
g++ -std=c++14 -O3 -Wall -g -mavx512vl -mavx512f -mavx512pf -mavx512er -mavx512cd -fno-common -c generated-functions.c -o generated-functions.o
/tmp/cczD9mlv.s: Assembler messages:
/tmp/cczD9mlv.s:39: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:41: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:43: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:45: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:47: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:49: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:51: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:53: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:55: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:57: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:59: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:61: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:63: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:65: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:67: Error: invalid register for .seh_savexmm
/tmp/cczD9mlv.s:69: Error: invalid register for .seh_savexmm

罗斯·里奇是对的。我解决了只添加-fno异步展开表的问题。谢谢Ross。

我最近也遇到了这个bug。我找到了另一种方法:使用
-ffix reg
选项禁用xmm16..31寄存器的使用。必须分别为每个寄存器指定它。以下是您必须使用的选项的完整列表:

-ffixed-xmm16 -ffixed-xmm17 -ffixed-xmm18 -ffixed-xmm19
-ffixed-xmm20 -ffixed-xmm21 -ffixed-xmm22 -ffixed-xmm23
-ffixed-xmm24 -ffixed-xmm25 -ffixed-xmm26 -ffixed-xmm27
-ffixed-xmm28 -ffixed-xmm29 -ffixed-xmm30 -ffixed-xmm31
这样做之后,编译器将无法使用它们,所以它将不得不在堆栈上而不是寄存器上存储一些数据。这很可能会导致代码变慢


您也可以尝试使用
-flto
标志,一些人报告说它也有帮助。在我的例子中,它只减少了错误的数量,所以请检查它是否适合您。

您使用的是哪个版本的g++。可能是Cygwin的GCC的一个bug。我用的是5.4版,它在我的ubuntu中运行得很好。现在我想在Cygwini中编译如果您不需要Windows结构化异常支持,您可以尝试使用
-fno asynchronous unwind tables
选项。然而,这可能只是掩盖了其他一些潜在问题。此外,您启用的某些AVX512指令集仅在Intel Xeon Phi x200上受支持,除非您在其中一个指令集上运行Windows,否则您的代码可能无法工作。谢谢。我解决了我添加的-fno异步展开表,它解决了底层问题。谢谢:):):)我也用libvpx mingw64解决了这个问题。当使用-mavx512vl选项编译时,我在G++7.4.0 Cygwin中遇到了同样的错误-fno异步展开表解决了这个问题。这个错误被修复了吗?有人报告它是一个错误吗?这个错误还没有被修复。看@a-fog,情况好转了吗?我在您链接的bug中看到,它在GCC 8分支中标记为2020年2月已解决。我也无法在MinGW上重现GCC 10.2.0的崩溃,但可能我出了什么问题……GCC不知道xmm16..31在Windows x64上被调用了吗?只有xmm6..15保留调用(并且只有xmm部分,而不是ymm或zmm上层通道)。SEH大概只能对xmm0..15的展开信息进行编码。如果LTO有帮助的话,它可能只是通过启用更多的内联来实现的。我假设叶函数仍然需要SEH unwind信息,但可能有更多的内联gcc使用不同的寄存器?无论如何,
-ffix reg
似乎是一个令人讨厌的解决方法,直到底层的gcc错误被修复。感谢链接,我将把它添加到gcc错误报告()。我希望gcc的人能最终解决这个问题。看来LTO在其他方面有所帮助。当我启用它时,我得到了大小约为14.8MB的有问题的.cpp文件的.s文件,以及大小约为480KB的myapp.exe.ltrans0.s文件。仅针对后一个报告了错误。看来这个文件已经消除了死代码。如果死代码中有错误,它们也会消失。另外,您提到的内联也可能在这里有所帮助。嗯,
-flto
-fwhole程序
并不完全相同,但在链接可执行文件(而不是DLL)时,它仍然可以删除某些函数的独立定义。
.s
文件总是很大的,因为LTO会发出GIMPLE内部表示(在一个特殊部分中)以及x86 asm,而链接时间优化器(链接器插件)只会读取GIMPLE以基于此进行内联/优化。但是
.s
仍然必须组装成有效的
.o
,而且听起来问题似乎是在组装时,而不是链接时。