【发布时间】:2011-02-21 12:15:22
【问题描述】:
我正在尝试在带有 LLVM 的结构中使用向量。我的结构有以下 C 定义:
struct Foo
{
uint32_t len;
uint32_t data[32] __attribute__ ((aligned (16)));
};
下面是一些 LLVM 代码,用于将 42 添加到 data 字段的第 3 号元素:
%Foo = type { i32, <32 x i32> }
define void @process(%Foo*) {
_L1:
%data = getelementptr %Foo* %0, i32 0, i32 1
%vec = load <32 x i32>* %data
%x = extractelement <32 x i32> %vec, i32 3
%xNew = add i32 42, %x
%vecNew = insertelement <32 x i32> %vec, i32 %xNew, i32 3
store <32 x i32> %vecNew, <32 x i32>* %data
ret void
}
但是,llc 的输出好像向量必须以 128 字节对齐,这似乎很浪费,而且也是错误的(AFAIK 向量应该是 16 字节对齐的):
.file "process.bc"
.text
.globl process
.align 16, 0x90
.type process,@function
process: # @process
.Leh_func_begin0:
# BB#0: # %_L1
movdqa 128(%rdi), %xmm0
pextrd $3, %xmm0, %eax
addl $42, %eax
pinsrd $3, %eax, %xmm0
movdqa %xmm0, 128(%rdi)
ret
.Ltmp0:
.size process, .Ltmp0-process
.Leh_func_end0:
当然,如果我将 C 定义更改为也将数据字段对齐为 128 字节,它可以工作,但浪费 124 字节(与使用 16 字节对齐时的 12 个字节相比)似乎是错误的。那么这里发生了什么?
【问题讨论】:
-
我刚刚意识到 16 字节 = 128 位,所以这可能是一个 LLVM 错误,它不是 128 位,而是以 128 字节对齐向量。