代码之家  ›  专栏  ›  技术社区  ›  Tom

如何将所有1加载到MMX寄存器中?为什么这个不行?

  •  3
  • Tom  · 技术社区  · 14 年前

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

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

    在这2个指令之后,MM2寄存器根据我的XCODER调试器(这是C++中的内联ASM)保存值0x30500、4FFFFFFF。现在我刚开始接触x86程序集,我的程序集课程是在MIPS中教授的,这是我很久以前学的,但我想这不起作用,因为我正在32位模式下编译(这是Photoshop插件的一部分)和RBX(64位版本的EBX、BX等,对吗?)技术上可能不存在。我尝试了其他方法来获得所有的1,比如将0xfffffffful加载到mm2和另一个寄存器并进行乘法,但这似乎也不起作用。

    I'm fixing to optimize my plugin with some SIMD instructions but I can't seem to figure it out or find any documentation that doesn't make my eyes hurt. 非常感谢您的帮助!

    2 回复  |  直到 14 年前
        1
  •  8
  •   PhiS    14 年前

    尽管Interjay的代码可以满足您的需要,但有一种更简单的方法可以将mmx寄存器(或xmm寄存器)设置为all-1(此处用于 mm2 ):

    pcmpeqw mm2, mm2
    
        2
  •  1
  •   interjay    14 年前

    不能在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