Syn*_*ror 2 c++ assembly gcc inline-assembly
Hello Everyone我想执行以下形式的内联汇编指令
BLENDPD xmm1,xmm2/m128, imm8
Run Code Online (Sandbox Code Playgroud)
我是内联装配的新手,所以我遇到了一些困难.我的代码是:
#include<iostream>
using namespace std;
int main()
{
long long y;
__asm("blendpd %0,$0xabcd000000001111abcd000000001111,$0x1":
"=r" (y):
);
cout<<y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的第一个错误是得到一个128位操作数,所以我使用了长十六进制数,但我仍然需要输出为128位,因为我希望2能够在屏幕上打印y.最重要的是我知道我的__asm语法是错误的,但无法弄清楚,加上我不确定使用英特尔或AT&T语法进行编译会在使用__asm时产生影响.
欢迎任何帮助.干杯! =)
编辑:我现在有这个版本,并得到一个未定义的函数错误.
#include<iostream>
#include<emmintrin.h>
using namespace std;
int main()
{
const int mask=5;
__m128d v2 = _mm_set_pd(1.0, 2.0);
__m128d v1;
v1=_mm_blend_pd(v1, v2, mask);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
首先,对于这类事情,您很少需要使用内联汇编.GCC通常提供"编译器内在"函数,允许您使用C函数语法而不是汇编语法调用给定的特殊指令.
在这种情况下,您想要的内在函数是_mm_blend_pd(),它具有此函数签名
#include <smmintrin.h>
__m128d _mm_blend_pd(__m128d v1, __m128d v2, const int mask);
Run Code Online (Sandbox Code Playgroud)
编译器将用单个blendpd指令替换它; 这实际上不是函数调用.
__m128d数据类型是一个包含两个双精度浮点值的向量; 你可以从像这样的双打数组中创建一个:
__m128d v = _mm_set_pd(1.0, 2.0);
Run Code Online (Sandbox Code Playgroud)
要从矢量中检索值以打印它们,可以将矢量存储到双精度浮点数组中:
double a[2];
_mm_store_pd(a, v);
Run Code Online (Sandbox Code Playgroud)
所有这些都基于英特尔内在函数手册,网址为http://www.info.univ-angers.fr/~richer/ens/l3info/ao/intel_intrinsics.pdf ; 虽然这是指英特尔C++编译器,但GCC支持相同的语法.
编辑:错误emmintrin.h替换正确smmintrin.h.另请注意,该mask值必须为2位(向量中每个值一位); 0,1,2或3以外的值会产生错误.当然,您需要使用-msse4GCC选项进行编译.
| 归档时间: |
|
| 查看次数: |
2670 次 |
| 最近记录: |