LLVM 的 amd64 输出中向量的对齐

2024-03-13

我正在尝试通过 LLVM 在结构内部使用向量。我的结构有以下 C 定义:

struct Foo
{
    uint32_t len;
    uint32_t data[32] __attribute__ ((aligned (16)));
};

下面是一些 LLVM 代码,用于将 42 添加到data field:

%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 字节对齐,这似乎很浪费,而且也是错误的(据我所知向量应该是 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 字节)似乎是错误的。那么这是怎么回事呢?


我认为您的 GEP 距离最佳代码生成器还差一些。下面是一些执行类似操作的 C 代码:

#include <stdint.h>

struct Foo
{
  uint32_t len;
  uint32_t data[32] __attribute__ ((aligned (16)));
};

void foo(struct Foo *F)
{
  F->data[3] = 4;
}

哪个 clang 变成这样:

; ModuleID = 'foo.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin10.0.0"

%struct.Foo = type { i32, [12 x i8], [32 x i32] }

define void @foo(%struct.Foo* %F) nounwind ssp {
  %1 = alloca %struct.Foo*, align 8
  store %struct.Foo* %F, %struct.Foo** %1, align 8
  %2 = load %struct.Foo** %1, align 8
  %3 = getelementptr inbounds %struct.Foo* %2, i32 0, i32 2
  %4 = getelementptr inbounds [32 x i32]* %3, i32 0, i64 3
  store i32 4, i32* %4
  ret void
}

以及您期望的相应的漂亮代码:

_foo:                                   ## @foo
Leh_func_begin0:
## BB#0:
    pushq   %rbp
Ltmp0:
    movq    %rsp, %rbp
Ltmp1:
    movl    $4, 28(%rdi)
    popq    %rbp
    ret
Leh_func_end0:

也就是说,您的代码不正确,应该是:

_process:                               ## @process
Leh_func_begin1:
## BB#0:                                ## %_L1
        movaps  16(%rdi), %xmm0
        pextrd  $3, %xmm0, %eax
        addl    $42, %eax
        pinsrd  $3, %eax, %xmm0
        movaps  %xmm0, 16(%rdi)
        ret

在 ToT 中情况更糟,因此错误报告不会出错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM 的 amd64 输出中向量的对齐 的相关文章

随机推荐

  • jQuery UI 对话框的行为不可预测

    jQuery UI 对话框让我感到厌烦 据我所知 它的工作原理如下 当你这样做时 myDialog dialog 它复制 myDialog 元素并将其移动到 body 标记底部的这个奇怪的小部件中 这太疯狂了 执行此操作时 它会复制可能唯一
  • Ruby 按列对 .dat 文件进行排序

    我对红宝石很陌生 我正在尝试打开文件 dat 并按第二列降序排序 到目前为止 我能够打开该文件并阅读全部内容 请问有什么建议吗 非常感谢 file 1 88 59 74 53 8 0 00 280 9 6 270 17 1 6 93 23
  • 使用 Carrierwave 和 rmagick 上传到 s3 的 exif 图像旋转问题

    我的 Rails 应用程序中有照片上传功能 该应用程序通过 rmagick 和雾通过 Carrierwave 直接上传到 s3 我遇到的问题是 当通过手机通过肖像中的 拍照选项 上传照片时 注意这是 iPhone 上的 但我相信 Andro
  • iOS Facebook SDK“必须使用活动访问令牌来查询有关当前用户的信息。”

    我有一个令牌 但不断收到此错误 必须使用活动访问令牌来查询有关当前用户的信息 如有任何帮助 我们将不胜感激 NSLog TOKEN FBSession activeSession accessToken NSString picture N
  • 使用其他自变量的所有可能组合获取许多模型中特定变量的 p 值

    我正在尝试使用一组自变量的所有可能组合来运行许多回归模型 在此示例中 我对以下系数感兴趣cyl与列出的其他变量的所有可能组合xlist df lt mtcars md lt mpg cyl xlist lt c disp hp am n l
  • 为什么 Spring-Data-JPA 异步不起作用?

    我正在尝试使用 Spring Boot 和 Spring data JPA 创建一个非阻塞休息服务 如何使用 Spring Data JPA Async 支持对实体进行异步保存 尽管其他选择似乎在同一实体上工作 但下面的代码对我不起作用 我
  • 从 R 中的箱线图框架中删除顶部和右侧边框

    有谁知道如何删除 R 中箱线图框架的顶部和右侧边框 我尝试过参数frame FALSE 但这会删除除左侧 y轴 之外的所有边 我只想显示 x 轴和 y 轴 提前致谢 我认为你需要使用axis side 1 绘图后 x lt 1 5 boxp
  • 我可以使用什么工具来合并 wsdl 和 xsd 文件?

    我有两个文件 一个包含 Web 服务描述 wsdl 第二个包含 Web 服务中使用的数据结构 xsd 我什么都没有了 网络服务还不能工作 我需要将它们合并为一个 因为 Delphi 7 WSDL Importer 不能很好地处理包含的 xs
  • Python 在池映射中使用列表/多个参数

    我正在尝试将列表作为参数传递给pool map co refresh input list 然而 pool map没有触发该功能co refresh 并且也没有返回错误 看起来这个过程挂在那里 原始代码 from multiprocessi
  • 更改 VS Code 中注释周围字符的颜色

    如何更改 VS Code 中注释前后字符的颜色 我正在谈论 or 或 字符 我知道如何更改评论颜色 如何更改 Visual Studio 代码中注释的颜色 https stackoverflow com questions 45195023
  • TypeScript - 扩展标准库 Math 的类型定义

    我想使用 javascript 库 种子随机 js https github com davidbau seedrandom 在 TypeScript 项目中 尚无法弄清楚如何为此库编写类型定义 该库使用附加方法扩展了标准 javascri
  • 使用下载管理器下载后安装 apk 并退出应用程序

    我已经创建了一个 Android 应用程序 如果有任何新版本发布 它将从服务器自动开始使用内置的 下载管理器 下载 为了在完成下载后自动安装 我创建了一个广播接收器来通知下载已完成并完成 然后我开始安装它 在我停留在应用程序中时它工作正常并
  • 函数重载的用途/优点是什么?

    函数重载的用途 优点是什么 IMO 主要的好处是方法 函数命名的一致性 这些方法 函数在逻辑上执行非常相似的任务 并且在接受不同的参数方面略有不同 这允许在多个实现中重复使用相同的方法名称 例如过载 好 function Person Fi
  • RxJS:如何让一个观察者处理多个可观察对象?

    我正在使用一个调用我实现的函数的框架 我希望这个函数的参数转换为可观察的 并通过一系列观察者发送 我以为我可以为此使用一个主题 但它的行为并不像我预期的那样 为了澄清一下 我有类似以下代码的内容 我想Option 1下面的方法可行 但到目前
  • 使用缓存存储 API 保存自定义响应

    我在用着缓存存储 https developer mozilla org en US docs Web API Cache构建渐进式 Web 应用程序 PWA 我需要一个自定义对象put https developer mozilla or
  • jquery 插件:使用 live() 的工具提示插件

    我需要一个依赖于 live 方法而不是普通的 hoever 和 mousemove 的工具提示插件 只是创建了我自己的插件monnaTip http gadelkareem com 2010 02 25 jquery plugin monn
  • 无论如何,是否可以将 firebase 存储用于 flutter 桌面?

    我正在尝试构建一个跨平台应用程序 我使用 firebase 作为数据库 无论如何要使用 firebase 存储用于 flutter 桌面吗 Windows 目前不支持运行使用 Firebase Realtime Database for W
  • YepNope 和 LabJS 的替代品 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想通过资源加载器加载 javascript 和 css 文件 我最初使用 LabJs 但我发现 Ye
  • 获取文本视图和图像视图相对于屏幕顶部的结束位置

    我有一个位图 它下面是一条时间线 作为一个例子 考虑右侧的布局FIGURE https stackoverflow com questions 17103026 canvas containing bitmap size proper ad
  • LLVM 的 amd64 输出中向量的对齐

    我正在尝试通过 LLVM 在结构内部使用向量 我的结构有以下 C 定义 struct Foo uint32 t len uint32 t data 32 attribute aligned 16 下面是一些 LLVM 代码 用于将 42 添