SSE命令示例代码(转换、加载、置位、存储)
// 测试SSE的转换操作 void TestSSEConvert() { // 浮点数组 __declspec(align(16)) float A[4] = { 5.35, 10.70, 16.05, 21.40 }; __declspec(align(16)) float B[4] = { 5.75, 11.50, 17.25, -25.3 }; __m128 *p = (__m128 *)A; __m128 *q = (__m128 *)B; __m128 a = p[0]; __m128 b = q[0]; printf("a: (%.2f, %.2f, %.2f, %.2f)\t b: (%.2f, %.2f, %.2f, %.2f)\n\n", p->m128_f32[0], p->m128_f32[1], p->m128_f32[2], p->m128_f32[3], q->m128_f32[0], q->m128_f32[1], q->m128_f32[2], q->m128_f32[3]); int v1 = _mm_cvtss_si32(a); int v2 = _mm_cvtss_si32(b); int v3 = _mm_cvttss_si32(a); int v4 = _mm_cvttss_si32(b); printf("(v1, v2, v3, v4): (%d, %d, %d, %d)\n\n", v1, v2, v3, v4); //__int64 v5 = _mm_cvtss_si64(a); //__int64 v6 = _mm_cvttss_si64(a); __m64 v5 = _mm_cvtps_pi32(a); __m64 v6 = _mm_cvttps_pi32(a); printf("v5: (%d, %d)\t v6: (%d, %d)\n\n", v5.m64_i32[0], v5.m64_i32[1], v6.m64_i32[0], v6.m64_i32[1]); //__m128 v7 = _mm_cvtsi64_ss(a, 123); __m128 v7 = _mm_cvtsi32_ss(a, 123); __m128 v8 = _mm_cvtpi32_ps(a, v5); printf("v7: (%.2f, %.2f, %.2f, %.2f)\n\n", v7.m128_f32[0], v7.m128_f32[1], v7.m128_f32[2], v7.m128_f32[3]); printf("v8: (%.2f, %.2f, %.2f, %.2f)\n\n", v8.m128_f32[0], v8.m128_f32[1], v8.m128_f32[2], v8.m128_f32[3]); __m64 v9 = _mm_cvtps_pi16(b); __m128 v10 = _mm_cvtpi16_ps(v9); __m128 v11 = _mm_cvtpu16_ps(v9); printf("v9: (%d, %d, %d, %d)\n\n", v9.m64_i16[0], v9.m64_i16[1], v9.m64_i16[2], v9.m64_i16[3]); printf("v10: (%.2f, %.2f, %.2f, %.2f)\n\n", v10.m128_f32[0], v10.m128_f32[1], v10.m128_f32[2], v10.m128_f32[3]); printf("v11: (%.2f, %.2f, %.2f, %.2f)\n\n", v11.m128_f32[0], v11.m128_f32[1], v11.m128_f32[2], v11.m128_f32[3]); __m64 temp; temp.m64_i8[0] = -1; temp.m64_i8[1] = 2; temp.m64_i8[2] = -3; temp.m64_i8[3] = 4; __m128 v12 = _mm_cvtpi8_ps(temp); __m128 v13 = _mm_cvtpu8_ps(temp); printf("v12: (%.2f, %.2f, %.2f, %.2f)\n\n", v12.m128_f32[0], v12.m128_f32[1], v12.m128_f32[2], v12.m128_f32[3]); printf("v13: (%.2f, %.2f, %.2f, %.2f)\n\n", v13.m128_f32[0], v13.m128_f32[1], v13.m128_f32[2], v13.m128_f32[3]); __m64 a1, a2; a1.m64_i32[0] = -120; a1.m64_i32[1] = 120; a2.m64_i32[0] = 256; a2.m64_i32[1] = -256; __m128 v14 = _mm_cvtpi32x2_ps(a1, a2); __m64 v15 = _mm_cvtps_pi16(v14); printf("v14: (%.2f, %.2f, %.2f, %.2f)\n\n", v14.m128_f32[0], v14.m128_f32[1], v14.m128_f32[2], v14.m128_f32[3]); printf("v15: (%d, %d, %d, %d)\n\n", v15.m64_i16[0], v15.m64_i16[1], v15.m64_i16[2], v15.m64_i16[3]); float f = _mm_cvtss_f32(a); printf("_mm_cvtss_f32(a) = %.2f\n\n", f); __m64 v16 = _mm_cvtps_pi8(v14); printf("v16: (%d, %d, %d, %d)\n\n", v16.m64_i8[0], v16.m64_i8[1], v16.m64_i8[2], v16.m64_i8[3]); }
Remark: 由于一些奇怪的原因,上面出现 -1.#J 的地方是显示错误,分别纠正如下:
// 测试SSE加载操作 void TestSSELoad() { // 浮点数组 __declspec(align(16)) float A[2] = { 5.35, 10.70 }; const __m64 *p = (const __m64 *)A; printf("(p0, p1): (%.2f, %.2f)\n\n", p->m64_f32[0], p->m64_f32[1]); __m128 a; a.m128_f32[0] = 80.45; a.m128_f32[1] = 85.55; a.m128_f32[2] = 90.65; a.m128_f32[3] = 95.75; __m128 v1 = _mm_loadh_pi(a, p); __m128 v2 = _mm_loadl_pi(a, p); printf("v1: (%.2f, %.2f, %.2f, %.2f)\n\n", v1.m128_f32[0], v1.m128_f32[1], v1.m128_f32[2], v1.m128_f32[3]); printf("v2: (%.2f, %.2f, %.2f, %.2f)\n\n", v2.m128_f32[0], v2.m128_f32[1], v2.m128_f32[2], v2.m128_f32[3]); const float f = 100.85; const float *q = &f; __m128 v3 = _mm_load_ss(q); __m128 v4 = _mm_load1_ps(q); printf("v3: (%.2f, %.2f, %.2f, %.2f)\n\n", v3.m128_f32[0], v3.m128_f32[1], v3.m128_f32[2], v3.m128_f32[3]); printf("v4: (%.2f, %.2f, %.2f, %.2f)\n\n", v4.m128_f32[0], v4.m128_f32[1], v4.m128_f32[2], v4.m128_f32[3]); __declspec(align(16)) const float r[4] = {1.11, 2.22, 3.33, 4.44}; __m128 v5 = _mm_loadu_ps(r); __m128 v6 = _mm_loadr_ps(r); // 注意此处地址r必须16字节对齐 printf("v5: (%.2f, %.2f, %.2f, %.2f)\n\n", v5.m128_f32[0], v5.m128_f32[1], v5.m128_f32[2], v5.m128_f32[3]); printf("v6: (%.2f, %.2f, %.2f, %.2f)\n\n", v6.m128_f32[0], v6.m128_f32[1], v6.m128_f32[2], v6.m128_f32[3]); }
测试结果:
// 测试SSE置位操作 void TestSSESet() { __m128 v0 = _mm_setzero_ps(); __m128 v1 = _mm_set_ss(3.55); __m128 v2 = _mm_set1_ps(3.55); __m128 v3 = _mm_set_ps(1.11, 2.22, 3.33, 4.44); __m128 v4 = _mm_setr_ps(1.11, 2.22, 3.33, 4.44); printf("v0: (%.2f, %.2f, %.2f, %.2f)\n\n", v0.m128_f32[0], v0.m128_f32[1], v0.m128_f32[2], v0.m128_f32[3]); printf("v1: (%.2f, %.2f, %.2f, %.2f)\n\n", v1.m128_f32[0], v1.m128_f32[1], v1.m128_f32[2], v1.m128_f32[3]); printf("v2: (%.2f, %.2f, %.2f, %.2f)\n\n", v2.m128_f32[0], v2.m128_f32[1], v2.m128_f32[2], v2.m128_f32[3]); printf("v3: (%.2f, %.2f, %.2f, %.2f)\n\n", v3.m128_f32[0], v3.m128_f32[1], v3.m128_f32[2], v3.m128_f32[3]); printf("v4: (%.2f, %.2f, %.2f, %.2f)\n\n", v4.m128_f32[0], v4.m128_f32[1], v4.m128_f32[2], v4.m128_f32[3]); }
测试结果:
4. SSE的存储操作
// 测试SSE存储操作 void TestSSEStore() { __m128 a; a.m128_f32[0] = 80.45; a.m128_f32[1] = 85.55; a.m128_f32[2] = 90.65; a.m128_f32[3] = 95.75; __declspec(align(16)) float A[2] = { 0 }; __declspec(align(16)) float B[2] = { 0 }; __m64 *p = (__m64 *)A; __m64 *q = (__m64 *)B; _mm_storeh_pi(p, a); _mm_storel_pi(q, a); printf("(p0, p1): (%.2f, %.2f)\n\n", p->m64_f32[0], p->m64_f32[1]); printf("(q0, q1): (%.2f, %.2f)\n\n", q->m64_f32[0], q->m64_f32[1]); __declspec(align(16)) float f[4] = { 0 }; _mm_store_ss(&f[0], a); printf("f[0]: %.2f\n\n", f[0]); _mm_store1_ps(f, a); printf("f: (%.2f, %.2f, %.2f, %.2f)\n\n", f[0], f[1], f[2], f[3]); _mm_store_ps(f, a); printf("f: (%.2f, %.2f, %.2f, %.2f)\n\n", f[0], f[1], f[2], f[3]); float g[4] = { 0 }; _mm_storeu_ps(g, a); printf("g: (%.2f, %.2f, %.2f, %.2f)\n\n", f[0], f[1], f[2], f[3]); _mm_storer_ps(f, a); printf("f: (%.2f, %.2f, %.2f, %.2f)\n\n", f[0], f[1], f[2], f[3]); }
测试结果:
SSE命令示例代码(转换、加载、置位、存储)相关推荐
- SSE命令示例代码(算术、逻辑、比较)
以下示例代码为原创,主要是为了测试SSE各种命令的实际效果,为了更好的理解各种命令. 1. SSE的算术操作 // 测试SSE的算术操作 void TestSSEArith() { __m128 a ...
- SSE命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)
1. SSE的整型指令 // 测试SSE的整型指令 void TestSSEInteger() { __m64 a; a.m64_i16[0] = 654; a.m64_i16[1] = -25; a ...
- 深入理解Java虚拟机——加载和存储指令
目录 一.加载和存储指令的概述 二.加载和存储指令的内容 三.加载和存储指令的示例 一.加载和存储指令的概述 加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输. 二.加载和存储指令的 ...
- python数据批量写入iq数据库_通过Load table命令将数据文件加载到Sybase IQ数据库里面的Python脚本...
CREATE TABLE poc_app.sys_ftp_cfg ( ftp_id varchar(100) NOT NULL, --话单文件名标记 ftp ...
- js文件代码未加载或者没有js效果
问题:在页面中js文件中的代码未加载或者没有任何效果. 原因: 成功引用了js文件,但无效果或者提示未加载该文档中的代码. 可能页面引用js文件的路径存在问题 解决: 重新检查你引用的js文件的路径是 ...
- linux 下tar怎样解压zip文件,linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令(示例代码)...
简介这篇文章主要介绍了linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令(示例代码)以及相关的经验技巧,文章约6037字,浏览量504,点赞数7,值得推荐! .tar 解包:ta ...
- 《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式
第1章 准备工作 第2章 Python语法基础,IPython和Jupyter 第3章 Python的数据结构.函数和文件 第4章 NumPy基础:数组和矢量计算 第5章 pandas入门 第6章 数 ...
- ARMv8体系结构基础03:加载和存储指令
目录 1 A64指令集概述 1.1 A64指令集特征 1.1.1 指令定长 1.1.2 可使用64位指针 1.1.3 使用一致的编码结构(consistent encoding scheme) 1.1 ...
- 借由ARM CORTEX-M芯片分析C程序加载和存储模型
https://zhuanlan.zhihu.com/p/22048373 写文章 借由ARM CORTEX-M芯片分析C程序加载和存储模型 王小军 1 年前 阿军最近在忙着血氧手环嵌入式系统的技术预 ...
最新文章
- Python处理PDF与CDF
- DataFrame 删除与增减行列
- App设计灵感之十二组精美的手机文件管理App设计案例
- adc如何获取周期_LOL:千珏拥有ADC最需要的位移和无敌能力,为什么没人用她打下路?...
- 灵魂拷问!一起刷完了这份1307页的安卓面试宝典吧,不吃透都对不起自己
- .写一个方法 void printScore(int score),输出相应的等级。score代表分数,等级格式如下:
- 10本最火的中台与数字化转型图书,朋友圈都在传
- reentrantlock失效了?_ReentrantLock 源码简单分析
- TeXstudio中文编码踩坑实录
- bzoj3110树套树
- ArcGIS Runtime for Android开发教程V2.0(9)基础篇-----查询检索
- 记一次mysql千万订单汇总查询优化
- vb listview扁平表头的列表框
- 导出已安装的插件_明明flash插件已安装,但是网页依然不能正常显示的解决办法...
- WPF——GridView
- 数据分析之 假设检验
- java导出doc文档
- 获取cookies(pyppeteer)
- 鸿蒙系统应用(HarmonyOS)2
- 京东 appck 一键转换 cookie