Visual c++ 将GCC内联asm(SSE2、SSSE3)转换为MSVC内部函数

Visual c++ 将GCC内联asm(SSE2、SSSE3)转换为MSVC内部函数,visual-c++,gcc,inline-assembly,sse2,Visual C++,Gcc,Inline Assembly,Sse2,我从VLC向我的视频播放器借用了一些代码,用MSVC++2010编写,但找不到与其内联asms等效的代码,这些代码与将解码视频帧从GPU内存提取到常规内存有关。 特别是,我不知道如何翻译这个指令: movq %%xmm1, 8(%[dst1]) 这可以在文件vlc/modules/codec/avcodec/copy.c中的函数SplitUV中看到 根据MSDN,movq的本质是\u mm\u move\u epi64,\u mm\u loadl\u epi64和\u mm\u sto

我从VLC向我的视频播放器借用了一些代码,用MSVC++2010编写,但找不到与其内联asms等效的代码,这些代码与将解码视频帧从GPU内存提取到常规内存有关。 特别是,我不知道如何翻译这个指令:

movq   %%xmm1,   8(%[dst1])
这可以在文件
vlc/modules/codec/avcodec/copy.c
中的函数
SplitUV
中看到

根据MSDN,movq的本质是
\u mm\u move\u epi64
\u mm\u loadl\u epi64
\u mm\u storel\u epi64
。 但是,它们需要
\uum128i
参数,如果我在指向
\uuum128i
的指针上添加1,我将获得16个字节的偏移量,而我需要8个字节

整个汇编程序代码如下所示:

for (x = 0; x < (width & ~31); x += 32) {
  asm volatile (
    "movdqu (%[shuffle]), %%xmm7\n"
    "movdqa  0(%[src]), %%xmm0\n"
    "movdqa 16(%[src]), %%xmm1\n"
    "movdqa 32(%[src]), %%xmm2\n"
    "movdqa 48(%[src]), %%xmm3\n"
    "pshufb  %%xmm7, %%xmm0\n"
    "pshufb  %%xmm7, %%xmm1\n"
    "pshufb  %%xmm7, %%xmm2\n"
    "pshufb  %%xmm7, %%xmm3\n"
    "movq   %%xmm0,   0(%[dst1])\n"
    "movq   %%xmm1,   8(%[dst1])\n"
    "movhpd %%xmm0,   0(%[dst2])\n"
    "movhpd %%xmm1,   8(%[dst2])\n"
    "movq   %%xmm2,  16(%[dst1])\n"
    "movq   %%xmm3,  24(%[dst1])\n"
    "movhpd %%xmm2,  16(%[dst2])\n"
    "movhpd %%xmm3,  24(%[dst2])\n"
    : : [dst1]"r"(&dstu[x]), [dst2]"r"(&dstv[x]), [src]"r"(&src[2*x]), 
        [shuffle]"r"(shuffle) 
    : "memory"
 );
 ...
}
我不知道如何指定8字节的偏移量。 另外,我怀疑我是否正确翻译了PSHUFB

非常感谢您的意见和建议


谢谢。

只需使用
char*
指针作为
dst
,您可以将其递增8,并在调用
\u mm\u storel\u epi64
时将其转换为
\u m128i*
,类似于它的操作方式(在该页面上搜索“\u mm\u storel\u epi64”)

我不是这方面的专家,但是我相信两个编译器都有内部函数,你应该使用它们。不,没有这样的东西。用于x86的MSVC也可以使用内联asm,但用于x64的MSVC-不能。同时,有两个错误。(1) 我已切换dstu和dstv(2)pSrc必须在循环体中分配给值(uu m128i*)(src+2*x)
__m128i x0, x1, x2, x3, x7;
__m128i *pshuffle128 = (__m128i *)shuffle;
__m128i *pSrc = (__m128i *)src;

for (x = 0; x < (width & ~31); x += 32) {
    __m128i *dst1 = (__m128i *)dstu + x;
    __m128i *dst2 = (__m128i *)dstv + x; 
    x7 = _mm_loadu_si128(pshuffle128);  //    "movdqu (%[shuffle]), %%xmm7\n"
    x0 = _mm_load_si128(pSrc + 0);      //    "movdqa  0(%[src]),   %%xmm0\n"
    x1 = _mm_load_si128(pSrc + 1);      //    "movdqa 16(%[src]),   %%xmm1\n"
    x2 = _mm_load_si128(pSrc + 2);      //    "movdqa 32(%[src]),   %%xmm2\n"
    x3 = _mm_load_si128(pSrc + 3);      //    "movdqa 48(%[src]),   %%xmm3\n"
    x0 = _mm_shuffle_epi8(x0, x7);      //    "pshufb  %%xmm7, %%xmm0\n"
    x1 = _mm_shuffle_epi8(x1, x7);      //    "pshufb  %%xmm7, %%xmm1\n"
    x2 = _mm_shuffle_epi8(x2, x7);      //    "pshufb  %%xmm7, %%xmm2\n"
    x3 = _mm_shuffle_epi8(x3, x7);      //    "pshufb  %%xmm7, %%xmm3\n"
    _mm_storel_epi64(dst1 + 0, x0);     //    "movq   %%xmm0,   0(%[dst1])\n"
movq   %%xmm1,   8(%[dst1])