【问题标题】:How do I load all 1's into a mmx register? Why doesn't this work?如何将所有 1 加载到 mmx 寄存器中?为什么这不起作用?
【发布时间】:2011-03-07 22:04:30
【问题描述】:

当我搜索时,除了关于 64/32 位内容的意见问题之外似乎找不到任何东西。

__asm__ {
  mov rbx, 0xFFFFffffFFFFffffull
  movq mm2, rbx 
}

根据我的 xcode 调试器(这是 C++ 中的内联 asm),在这 2 条指令之后,mm2 寄存器保存值 0x30500004ffffffff。现在我是 x86 程序集的新手,我的程序集课程是在我很久以前学习的 MIPS 中教授的,但我想这不起作用,因为我正在以 32 位模式和 rbx 编译(这是 photoshop 插件的一部分)( ebx、bx 等的 64 位版本,对吗?)在技术上可能不存在。我尝试了其他方法来获得所有 1,例如将 0xfffffffful 加载到 mm2 和另一个寄存器并进行乘法,但这似乎也不起作用。

我正在修复使用一些 SIMD 指令优化我的插件,但我似乎无法弄清楚或找到任何不会让我眼睛受伤的文档。非常感谢任何帮助!

【问题讨论】:

    标签: x86 x86-64 inline-assembly simd


    【解决方案1】:

    您不能在 32 位程序中运行 64 位汇编代码。您可以将值从内存位置读入 MMX 寄存器,也可以使用以下内容:

    mov ebx, 0xffffffff
    movd mm2, ebx       //copy value to lower 32 bits
    punpckldq mm2, mm2  //copy lower 32-bits to upper 32 bits
    

    【讨论】:

    • 感谢您的回答,非常感谢!你对好的文档有什么建议吗?像 intel 这样的手册开始让我头疼,我从来没有找到 punpckldq =/
    • @Tom:这不是很好,但this site 有一个概述和 MMX 指令列表。在Intel manual中,第1卷有描述和MMX指令列表,第2卷详细描述了每条指令。
    • +1 用于提及 64 位代码与 32 位代码问题,但 -1 用于建议 3 条指令的笨拙解决方案,而其他答案中只有一条。总的来说,我根本没有投票。
    【解决方案2】:

    虽然 interjay 的代码可以满足您的要求,但还有一种更简单的方法可以将 MMX 寄存器(或 XMM 寄存器,就此而言)设置为全 1(此处为 mm2):

    pcmpeqw mm2, mm2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 2020-09-11
      • 2010-10-31
      相关资源
      最近更新 更多