Assembly 将2个连续双精度寄存器加载到2个sse寄存器的低半部分
我想做到这一点:Assembly 将2个连续双精度寄存器加载到2个sse寄存器的低半部分,assembly,sse,intrinsics,Assembly,Sse,Intrinsics,我想做到这一点: xmm0[0..63] = mem[0..63] xmm0[64..127] = 0 xmm1[0..63] = mem[64..127] xmm1[64..127] = 0 事实上,它不必完全像这样。只要: xmm0[0..63] + xmm0[64..127] = mem[0..63] xmm1[0..63] + xmm1[64..127] = mem[64..127] 我应该如何使用xmm内在函数来实现这一点?我只需要使用\u mm\u set\u pd或\u mm\
xmm0[0..63] = mem[0..63]
xmm0[64..127] = 0
xmm1[0..63] = mem[64..127]
xmm1[64..127] = 0
事实上,它不必完全像这样。只要:
xmm0[0..63] + xmm0[64..127] = mem[0..63]
xmm1[0..63] + xmm1[64..127] = mem[64..127]
我应该如何使用xmm内在函数来实现这一点?我只需要使用
\u mm\u set\u pd
或\u mm\u set1\u pd
内在函数,看看编译器生成的是什么-它应该是相当有效的,如果不是,那么生成的代码可能会让您知道如何使用更明确的内在函数来改进它,例如:
double d[2];
__m128d v0 = _mm_set_pd(d[0], 0.0);
__m128d v1 = _mm_set_pd(d[1], 0.0);
或者,正如@Mystical和@Anycorn所指出的,您可以使用\u mm\u load\u sd
:
double d[2];
__m128d v0 = _mm_load_sd(&d[0]);
__m128d v1 = _mm_load_sd(&d[1]);
我只需使用
\u mm\u set\u pd
或\u mm\u set1\u pd
内部函数,看看编译器生成的是什么-它应该是相当有效的,如果不是,那么生成的代码可能会让您了解如何使用更明确的内部函数来改进它,例如:
double d[2];
__m128d v0 = _mm_set_pd(d[0], 0.0);
__m128d v1 = _mm_set_pd(d[1], 0.0);
或者,正如@Mystical和@Anycorn所指出的,您可以使用\u mm\u load\u sd
:
double d[2];
__m128d v0 = _mm_load_sd(&d[0]);
__m128d v1 = _mm_load_sd(&d[1]);
我只需使用
\u mm\u set\u pd
或\u mm\u set1\u pd
内部函数,看看编译器生成的是什么-它应该是相当有效的,如果不是,那么生成的代码可能会让您了解如何使用更明确的内部函数来改进它,例如:
double d[2];
__m128d v0 = _mm_set_pd(d[0], 0.0);
__m128d v1 = _mm_set_pd(d[1], 0.0);
或者,正如@Mystical和@Anycorn所指出的,您可以使用\u mm\u load\u sd
:
double d[2];
__m128d v0 = _mm_load_sd(&d[0]);
__m128d v1 = _mm_load_sd(&d[1]);
我只需使用
\u mm\u set\u pd
或\u mm\u set1\u pd
内部函数,看看编译器生成的是什么-它应该是相当有效的,如果不是,那么生成的代码可能会让您了解如何使用更明确的内部函数来改进它,例如:
double d[2];
__m128d v0 = _mm_set_pd(d[0], 0.0);
__m128d v1 = _mm_set_pd(d[1], 0.0);
或者,正如@Mystical和@Anycorn所指出的,您可以使用\u mm\u load\u sd
:
double d[2];
__m128d v0 = _mm_load_sd(&d[0]);
__m128d v1 = _mm_load_sd(&d[1]);
我认为没有一条指令可以做到这一点。@Anycorn在多条指令中实现这一点的合理方法是什么?您可以只使用两条独立的
movsd
(\u mm\u load\u sd
)。或者,您可以将整个段加载到第一个寄存器中,以聚合内存加载,然后将较低部分复制到第二个寄存器,然后将第一个寄存器中的较低部分归零。但那可能会更糟。我认为没有一条指令可以做到这一点。@Anycorn在多条指令中这样做的合理方式是什么?您可以只使用两条独立的movsd
(\u mm\u load\u sd
内在)。或者,您可以将整个段加载到第一个寄存器中,以聚合内存加载,然后将较低部分复制到第二个寄存器,然后将第一个寄存器中的较低部分归零。但那可能会更糟。我认为没有一条指令可以做到这一点。@Anycorn在多条指令中这样做的合理方式是什么?您可以只使用两条独立的movsd
(\u mm\u load\u sd
内在)。或者,您可以将整个段加载到第一个寄存器中,以聚合内存加载,然后将较低部分复制到第二个寄存器,然后将第一个寄存器中的较低部分归零。但那可能会更糟。我认为没有一条指令可以做到这一点。@Anycorn在多条指令中这样做的合理方式是什么?您可以只使用两条独立的movsd
(\u mm\u load\u sd
内在)。或者,您可以将整个段加载到第一个寄存器中,以聚合内存加载,然后将较低部分复制到第二个寄存器,然后将第一个寄存器中的较低部分归零。但这可能会更糟。是的,这可能是最好的解决方案-答案更新。你可能是指\u mm\u load\u sd(&d[0])
@Anycorn:谢谢-复制并粘贴得太快-现在修复。是的,这可能是最好的解决方案-答案更新。你可能是指\u mm\u load\u sd(&d[0]))
@Anycorn:Thank-复制粘贴过快-现在修复。是的,这可能是最好的解决方案-答案更新。你可能是指\u mm\u load\u sd(&d[0])
@Anycorn:Thank-复制粘贴过快-现在修复。是的,这可能是最好的解决方案-答案更新。你可能是指\u mm\u load\u sd(&d[0])
@Anycorn:谢谢-快速复制粘贴-现已修复。