2016-03-23 7 views
1

Я только составил небольшой фрагмент кода 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), а не бит-бит.

Не могли бы вы объяснить, что происходит?

Спасибо!

+0

, по-видимому, это непоследовательно поведение между clang и gcc. Код выше работает правильно с gcc и генерирует исключение с плавающей запятой с clang. –

ответ

0

на самом деле это выглядит как ошибка в звоне:

https://llvm.org/bugs/show_bug.cgi?id=27085

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