%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
吗?
在位转换之后,%0
是一个Value
类型<2 x i8>
。它不是“指针”。当代码生成到机器代码时,向量很可能存储在寄存器中。
%2
是i8
,因为extractelement
定义为:
<result> = extractelement <n x <ty>> <val>, i32 <idx> ; yields <ty>
向量有两个元素,每个元素的类型为i8
。%2
是 a Value
,它保存向量中的第二个元素。
请注意,向量在内存或寄存器中的布局方式取决于目标。LLVM IR 级别并不关心这一点。它将向量视为两个值的抽象容器。
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 数组中的元素作为给定值。type
value
type
index
%2 = extractelement <2 x i8> %0, i32 1
这意味着%2
现在是一个 8 位整数,其值为元素 1(第二个/最后一个 8 位元素)。假设小端硬件,我希望%2
值为0
.