https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92190
--- Comment #9 from Uroš Bizjak <ubizjak at gmail dot com> --- (In reply to Liu Hao from comment #7) > MSDN says 'the upper portions of YMM0-15 and ZMM0-15 are considered volatile > and must be considered destroyed on function calls' explicitly [1]. BTW: MSDN is clear that xMM16-31 are volatile (call_used), so the current definition of CALL_USER_REGISTERS is wrong. At least this part should be: Index: i386.h =================================================================== --- i386.h (revision 278455) +++ i386.h (working copy) @@ -1126,9 +1126,9 @@ /*xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15*/ \ 6, 6, 6, 6, 6, 6, 6, 6, \ /*xmm16,xmm17,xmm18,xmm19,xmm20,xmm21,xmm22,xmm23*/ \ - 6, 6, 6, 6, 6, 6, 6, 6, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ /*xmm24,xmm25,xmm26,xmm27,xmm28,xmm29,xmm30,xmm31*/ \ - 6, 6, 6, 6, 6, 6, 6, 6, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ /* k0, k1, k2, k3, k4, k5, k6, k7*/ \ 1, 1, 1, 1, 1, 1, 1, 1 }