2013-09-24 3 views
1
%0 = bitcast i16 %arg1 to <2 x i8> 
%2 = extractelement <2 x i8> %0, i32 1 

%arg1 в памяти:битого расположение вектора после bitcasting в LLVM

00000000 11111111 

|--8bit--||--8bit--| 

После bitcasting, %0 представляет собой указатель на вектор.

Значит, %0 также адрес первого элемента вектора?

А что такое %2? Является ли это вторым элементом vector(11111111) или, 00000000?

ответ

0

bitcast <type1> <value> to <type2> преобразует value, %arg1 в вашем случае, от type1 к type2 без изменения битов, учитывая, что число битов в двух типах одинаковы.

%0 = bitcast i16 %arg1 to <2 x i8> 

Это означает, что %0 теперь массив/вектор из двух 8-битовых целых чисел вместо одного 16-разрядного целого числа. Рассматривая связанную документацию, это выглядит только как значение.

extractelement <n x <type>> <value>, i32 <index> извлекает элемент в n -длиной массив type д value ов как данный type с использованием 32-разрядное целого числа index.

%2 = extractelement <2 x i8> %0, i32 1 

Это означает, что %2 теперь является 8-битовое целое число со значением элемента 1 (второй/последней 8-битовый элемент). Предполагая, что малое аппаратное обеспечение конца, я ожидаю, что значение %2 будет 0.

+0

У вас есть две ошибки здесь: во-первых, вы пишете, что «'% 0' является массивом/вектором »- в то время как это явно вектор, а не массив. Кроме того, 'extractelement' является значением типа' i8', а не 'i32' -' i32' является типом индекса. – Oak

+0

Вектор логически обрабатывается как массив, поэтому я называет его косой чертой. Хороший улов на 32-битном и 8-битном; Я определенно неправильно читаю документацию по этому. – pickypg

1

После биткадинга %0 является Value типа <2 x i8>. Это не «указатель». Вектор может быть очень хорошо сохранен в регистре, когда происходит генерация кода для машинного кода.

%2 является i8, потому что extractelement определяется как:

<result> = extractelement <n x <ty>> <val>, i32 <idx> ; yields <ty> 

вектор имеет два элемента, каждый с типа i8. %2 - это Value, который содержит второй элемент в векторе.

Обратите внимание, что как вектор выложен в памяти или регистры зависят от цели. Уровень LLVM IR не заботится об этом. Он видит вектор как абстрактный контейнер двух значений.

Смежные вопросы