LLVM 中位播后矢量的位布局
bit layout of vector after bitcasting in llvm
%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)
的第二个要素,还是, 00000000
?
位投射后,%0
是 <2 x i8>
类型的Value
。它不是"指针"。当代码生成为机器代码时,向量很可能存储在寄存器中。
%2
是i8
,因为extractelement
定义为:
<result> = extractelement <n x <ty>> <val>, i32 <idx> ; yields <ty>
该向量有两个元素,每个元素的类型为 i8
。 %2
是保存向量中第二个元素的Value
。
请注意,矢量在内存或寄存器中的布局方式取决于目标。LLVM IR级别并不关心这一点。它将向量视为两个值的抽象容器。
(尽管这个问题很久以前就讨论过了,但在阅读后,回复一个旧问题很好,因为回复提供了另一种验证答案的方法并引用了最近的文档更新)
%2 的值将取决于字节序和目标(向量的内存布局取决于目标和字节序,正如 Eli Bendersky 所提到的);https://gcc.godbolt.org/z/vfcGhb4EK 可能是可视化它的好方法。
<小时 />通过阅读语言参考,这两个有助于推理上述 IR(至少对我来说)
- 比特播的语义
- 矢量类型的内存布局
1和2均从 https://reviews.llvm.org/D94964 更新(归功于作者和审稿人)
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 位整数index
提取 type
d value
s 的 n
长度数组中的元素作为给定type
。
%2 = extractelement <2 x i8> %0, i32 1
这意味着%2
现在是一个 8 位整数,其值为 元素 1(第二个/最后一个 8 位元素)。 假设小端硬件,我希望%2
的价值是0
的。
- 如何使用C/C++在MacOSX中获得键盘布局
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- llvm构建器向基本块添加终止符
- 布局兼容类型的并集
- Qt自定义QPush按钮未显示在布局上
- 正在LLVM中检测整数比较条件
- 如何在LLVM中dyn_cast以识别StoreInst?
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 如何删除 LLVM 中的不规则分支?
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 调整布局上的 QGraphicsView 小部件的大小
- LLVM 内存布局中的矢量和数组之间的任何差异
- LLVM 中位播后矢量的位布局