Я только составил небольшой фрагмент кода C с использованием лязг 3.7:bitcast целое с вектором полукокса
typedef unsigned char char4 __attribute__ ((vector_size (4)));
char4 f1 (char4 v)
{
return v/2;
}
, что функции компилировать (я удалил DebugInfo):
define <4 x i8> @f1(<4 x i8> %v) {
entry:
%div = udiv <4 x i8> %v, bitcast (<1 x i32> <i32 2> to <4 x i8>)
ret <4 x i8> %div
}
В соответствии с LLVM documentation , бит-бит не изменяет бит, то есть < 4 x i8> должен давать < 2, 0, 0, 0> (или < 0, 0, 0, 2>). Я прав? Поэтому я получу исключение Division by Zero.
Код, который я написал, предназначался для трансляции (или splat), а не бит-бит.
Не могли бы вы объяснить, что происходит?
Спасибо!
, по-видимому, это непоследовательно поведение между clang и gcc. Код выше работает правильно с gcc и генерирует исключение с плавающей запятой с clang. –