Что вызывает сбой SunCC в bfd_asm.c?

Я пытаюсь найти причину сбоя компилятора SunCC. Он существует с ранних дней SunCC 12.x и присутствует в последней версии SunCC 12.6. Сбой происходит при попытке умножения многочленов в системах x86. Код ниже является частью алгоритма GCM:

$ cat test.cxx
# include <emmintrin.h>
# include <tmmintrin.h>
# include <wmmintrin.h>

__m128i GCM_Reduce_CLMUL(__m128i c0, __m128i c1, __m128i c2, const __m128i &r)
{
  __m128i t = r;
  c1 = _mm_xor_si128(c1, _mm_slli_si128(c0, 8));
  t = _mm_clmulepi64_si128(c0, r, 0x10);
  c1 = _mm_xor_si128(c1, t);
  c0 = _mm_srli_si128(c0, 8);
  c0 = _mm_xor_si128(c0, c1);
  c0 = _mm_slli_epi64(c0, 1);
  c0 = _mm_clmulepi64_si128(c0, r, 0x0);
  c2 = _mm_xor_si128(c2, c0);
  t = _mm_srli_si128(c1, 8);
  c2 = _mm_xor_si128(c2, t);
  c1 = _mm_unpacklo_epi64(c1, c2);
  c1 = _mm_srli_epi64(c1, 63);
  c2 = _mm_slli_epi64(c2, 1);
  return _mm_xor_si128(c2, c1);
}

А также:

$ /opt/developerstudio12.6/bin/CC -DNDEBUG -g3 -xO3 -m64 -KPIC -template=no%extdef -xarch=aes -c test.cxx
lf    25 PCLMULP_Xx      REG %x4    UND 0      REG %x4    REG %x0    UND 0      UND 0      UND 0      UND 0      UND 0      UND 0      off:0 uc:2 nxt: 29 bb:   3 FDI:F Ln:10 Ex:22

"test.cxx", [__1cQGCM_Reduce_CLMUL6FXXXrkX_X_]: assertion failed in function dump_asm_instruction() @ bfd_asm.c:2602
assert(nd_not_null_( disp.disp[0]) || (hf_dump_node(bfd_lf_node), 0))

CC: ube failed for test.cxx

Я не смог найти информацию о сбое, которое происходит из-за bfd_asm.c:2602, Я считаю, что это тот же сбой в Что вызывает сбой SunCC в g3mangler.cc при использовании -std=XXX ?, но он просто двигался.

На сегодняшний день наша стратегия заключается в том, чтобы отключить пути кода во время ожидания исправления. Не похоже, что это будет исправлено в ближайшее время, поэтому мы хотим найти обходной путь и повторно включить код.

Что является причиной сбоя и как я могу это исправить?


Я думаю, что это MCVE, хотя это не очень полезно:

$ cat test.cxx
# include <emmintrin.h>
# include <tmmintrin.h>
# include <wmmintrin.h>

__m128i GCM_Reduce_CLMUL(__m128i c0, __m128i c1, __m128i c2, const __m128i &r)
{
  __m128i t = r;
  t = _mm_clmulepi64_si128(c0, t, 0x10);
  c0 = _mm_clmulepi64_si128(c0, t, 0x0);
  return _mm_xor_si128(c1, c0);
}

jwalton@solaris2:~/cryptopp$ /opt/developerstudio12.6/bin/CC -DNDEBUG -g3 -xO3 -m64 -KPIC -template=no%extdef -xarch=aes -c test.cxx
lf    17 PCLMULP_Xx      REG %x2    UND 0      REG %x2    REG %x0    UND 0      UND 0      UND 0      UND 0      UND 0      UND 0      off:0 uc:2 nxt: 21 bb:   3 FDI:F Ln:9 Ex:15

"test.cxx", [__1cQGCM_Reduce_CLMUL6FXXXrkX_X_]: assertion failed in function dump_asm_instruction() @ bfd_asm.c:2602
assert(nd_not_null_( disp.disp[0]) || (hf_dump_node(bfd_lf_node), 0))

CC: ube failed for test.cxx

0 ответов

Это ошибка компилятора. Из дампа внутреннего представления я вижу неправильный тип для второго входного операндаPCLMULинструкция. Это должно быть немедленно, но в дампе это XMM.

Печально то, что исправить это вряд ли удастся. Единственный обходной путь, о котором я могу думать, - это использовать-xarch=avx или выше, так как это будет использовать другое представление инструкций, и ошибка не появится.

Другие вопросы по тегам