用于优化矢量移位的汇编代码
我试图编写一个例程,以逻辑方式将n位向右移位,以最有效的方式向下向量类型中的所有元素向右移位:BYTE-> BYTE,WORD-> WORD,DWORD-> DWORD和WORD-> BYTE(假设结果中只有8位存在)。 我想根据处理器的类型(每个类型有三个例程)(支持SSE2,只支持MMX,只支持标准指令se)。 所以我总共需要12个功能。
我已经自己找到了如何备份和恢复我需要的寄存器,如何制作一个循环,如何将数据复制到常规寄存器或MMX寄存器以及如何按照逻辑位移一个位置。
因为我不熟悉与之相关的汇编语言。 我应该为每个指令集使用哪些寄存器? L1缓存中大矢量(图像)的可用性将如何优化? 我如何找到向量的下一个元素(一种指针类型的东西),我知道我可以通过地址做一个mov,我假设我必须根据我的数据类型将地址增加1,2或4?
尽管我有所有的想法,但在这一点上编写代码有点困难。
谢谢。
阿尔诺。
编辑:这是我正在尝试为MMX在DWORD上按1移动:
__asm("push mm"); // backup register
__asm("push cx"); // backup register
__asm("mov %cx, length"); // initialize loop
__asm("loopstart_shift1:"); // start label
__asm("movd %xmm0, r/m32"); // get 32 bits data
__asm("psrlq %xmm0, 1"); // right shift 32 bits data logically (stuffs 0 on the left) by 1
__asm("mov r/m32,%xmm0"); // set 32 bits data
__asm("dec %cx"); // decrement index
__asm("cmp %cx,0");
__asm("jnz loopstart_shift1");
__asm("pop cx"); // restore register
__asm("pop mm"); // restore register
__asm("emms"); // leave MMX state
我强烈建议你暂停并查看使用C或C ++的内在函数而不是尝试编写原始的asm - 这样C / C ++编译器将负责所有寄存器分配,指令调度和一般内务处理任务,并且您可以专注于重要的部分,例如,而不是使用psrlq
请参阅_m_psrlq
中的mmintrin.h
。 (更好的是,看看使用128位SSE内在函数。)
听起来像你会从使用或查看BitMagic的来源中受益。 它的完全内在也是基于它的,这使得它更具可移植性(尽管从它看起来使用GCC,所以它可能必须获得MSVC到GCC内在映射)。
链接地址: http://www.djcxy.com/p/60377.html上一篇: Assembly code for optimized bitshifting of a vector
下一篇: macrodef'd <jar> task not behaving like an implicit fileset?