1
%0 = bitcast i16 %arg1 to <2 x i8>
%2 = extractelement <2 x i8> %0, i32 1

%arg1在记忆中:

 00000000  11111111

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

在位转换之后,%0是一个指向向量的指针。

那么%0向量的第一个元素的地址也是如此吗?

究竟是%2什么?vector(11111111)它是or 的第二个元素00000000吗?

4

2 回答 2

1

在位转换之后,%0是一个Value类型<2 x i8>。它不是“指针”。当代码生成到机器代码时,向量很可能存储在寄存器中。

%2i8,因为extractelement定义为:

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

向量有两个元素,每个元素的类型为i8%2是 a Value,它保存向量中的第二个元素。

请注意,向量在内存或寄存器中的布局方式取决于目标。LLVM IR 级别并不关心这一点。它将向量视为两个值的抽象容器。

于 2013-09-24T04:42:11.943 回答
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>使用 32 位整数提取d的n-length 数组中的元素作为给定值。typevaluetypeindex

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

这意味着%2现在是一个 8 位整数,其值为元素 1(第二个/最后一个 8 位元素)。假设小端硬件,我希望%2值为0.

于 2013-09-24T04:43:24.557 回答