解决Linux下内联汇编的宏融合寻址问题

Windows下生成DLL时,直接使用内联汇编的宏融合(Macro Fusion)模式,可以提高效率,如

__asm {

  movdqa    xmm0, g_data0;

  paddw      xmm0, g_data1;

  movdqa      g_data2, xmm0;

}

 

这里的g_data0|g_data1|g_data2都是全局变量。

 

类似的代码,移植到Linux时,会遇到SIGSEGV问题,原因如下:

Linux下生成so库时,需要使用-fPIC编译选项,但PIC即位置无关代码却与Windows的Relocatable即可重定位表是冲突的。

Linux下如此修改则可:

__asm {

  lea        eax, g_data0;

  mov         eax, [eax];

  movdqa    xmm0, [eax];

  lea        eax, g_data1;

  mov         eax, [eax];

  movdqa    xmm1, [eax];

  paddw      xmm0, xmm1;

  lea        eax, g_data0;

  mov         eax, [eax];

  movdqa      [eax], xmm0;

}

 

 

可见PIC模式会导致代码量增加,效率变慢,但其主要优势在于代码可以多进程共享的情况下占用更少的空间。

 

 一键加速网络访问Google、Facebook:

http://my.yizhihongxing.com/aff.php?aff=343


你可能感兴趣的:(解决Linux下内联汇编的宏融合寻址问题)