访问mm1寄存器部件

Pep*_*uis 0 c++ x86 sse simd mmx

是否可以访问mmx寄存器中的单个字节,如数组?我有这个代码:

movq mm1,vector1
movq mm2,vector2
psubw mm1,mm2
Run Code Online (Sandbox Code Playgroud)

我想把mm1 [1],mm1 [2],mm1 [3] ....放到c ++变量中,比如:

int a,b=0;
mov a,mm1[1]
mov b,mm1[2]
Run Code Online (Sandbox Code Playgroud)

谢谢.

BЈо*_*вић 5

对的,这是可能的。

我可以显示 C++ 的 SSE2 代码,但 MMX 的代码类似:

__m128i a;
unsigned char *p = (unsigned char*) &a;
// access bytes pointed by pointer p
Run Code Online (Sandbox Code Playgroud)

  • 编译器必须将整个寄存器复制到堆栈,然后进行一些指针算术来计算地址,然后提取字节。所以这个解决方案不太有用。 (2认同)

小智 5

除非你想使用VJo的方法,否则没有直接的可能性来处理MMX寄存器中的字节,但这完全破坏了首先使用MMX的好处.

但是,如果您的数据格式良好,则可以将它们全部放在寄存器中并执行一系列解包操作,这将转置数据.

BTW为什么不使用SSE1/2/3/4?MMX已经过时了.IIRC SSE4具有直接8/16/32/64位提取指令.

  • @Brian:是的,仍有遗留系统不支持SSE.但是,如果在正在进行工程工作的性能关键环境中使用它,我会感到非常惊讶.比较购买成本*目前可用的绝对最便宜的x86系统*(它将支持SSE,并且比任何没有的遗留系统快几个数量级)到支付熟练工程师手工调整MMX代码的成本.这是一个明智的选择. (3认同)
  • +1"MMX相当过时",但放弃了"公平".**今天没有理由**为MMX编码.使用SSE. (2认同)