%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 数组中的元素作为给定值。typevaluetypeindex
%2 = extractelement <2 x i8> %0, i32 1
这意味着%2现在是一个 8 位整数,其值为元素 1(第二个/最后一个 8 位元素)。假设小端硬件,我希望%2值为0.