以下示例代码为原创,主要是为了测试SSE各种命令的实际效果,为了更好的理解各种命令。

1.  SSE的算术操作
// 测试SSE的算术操作
void TestSSEArith()
{    __m128 a;
    a.m128_f32[0] = 10.0;
    a.m128_f32[1] = -20.0;
    a.m128_f32[2] = 30.0;
    a.m128_f32[3] = -40.0; __m128 b;
    b.m128_f32[0] = 90.0;
    b.m128_f32[1] = 75.0;
    b.m128_f32[2] = -50.0;
    b.m128_f32[3] = 35.0;  printf("a: (%.2f, %.2f, %.2f, %.2f)\n\n", a.m128_f32[0], a.m128_f32[1], a.m128_f32[2], a.m128_f32[3]);
    printf("b: (%.2f, %.2f, %.2f, %.2f)\n\n", b.m128_f32[0], b.m128_f32[1], b.m128_f32[2], b.m128_f32[3]);    // 加、减、乘、除
    __m128 v1 = _mm_add_ss(a, b);      // a[0] + b[0], a[1], a[2], a[3]
    __m128 v2 = _mm_add_ps(a, b);      // a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]
    __m128 v3 = _mm_sub_ss(a, b);      // a[0] - b[0], a[1], a[2], a[3]
    __m128 v4 = _mm_sub_ps(a, b);      // a[0] - b[0], a[1] - b[1], a[2] - b[2], a[3] - b[3]
    __m128 v5 = _mm_mul_ss(a, b);      // a[0] * b[0], a[1], a[2], a[3]
    __m128 v6 = _mm_mul_ps(a, b);      // a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3]
    __m128 v7 = _mm_div_ss(a, b);      // a[0] / b[0], a[1], a[2], a[3]
    __m128 v8 = _mm_div_ps(a, b);      // a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3]

    printf("v1 = a0 + b0: (%.2f, %.2f, %.2f, %.2f)\n\n", v1.m128_f32[0], v1.m128_f32[1], v1.m128_f32[2], v1.m128_f32[3]);
    printf("v2 = a  + b : (%.2f, %.2f, %.2f, %.2f)\n\n", v2.m128_f32[0], v2.m128_f32[1], v2.m128_f32[2], v2.m128_f32[3]);
    printf("v3 = a0 - b0: (%.2f, %.2f, %.2f, %.2f)\n\n", v3.m128_f32[0], v3.m128_f32[1], v3.m128_f32[2], v3.m128_f32[3]);
    printf("v4 = a  - b : (%.2f, %.2f, %.2f, %.2f)\n\n", v4.m128_f32[0], v4.m128_f32[1], v4.m128_f32[2], v4.m128_f32[3]);
    printf("v5 = a0 * b0: (%.2f, %.2f, %.2f, %.2f)\n\n", v5.m128_f32[0], v5.m128_f32[1], v5.m128_f32[2], v5.m128_f32[3]);
    printf("v6 = a  * b : (%.2f, %.2f, %.2f, %.2f)\n\n", v6.m128_f32[0], v6.m128_f32[1], v6.m128_f32[2], v6.m128_f32[3]);
    printf("v7 = a0 / b0: (%.2f, %.2f, %.2f, %.2f)\n\n", v7.m128_f32[0], v7.m128_f32[1], v7.m128_f32[2], v7.m128_f32[3]);
    printf("v8 = a  / b : (%.2f, %.2f, %.2f, %.2f)\n\n", v8.m128_f32[0], v8.m128_f32[1], v8.m128_f32[2], v8.m128_f32[3]);    // 开方、倒数
    __m128 v9  = _mm_sqrt_ss(a);           // sqrt(a[0]), a[1], a[2], a[3]
    __m128 v10 = _mm_sqrt_ps(a);           // sqrt(a[0]), sqrt(a[1]), sqrt(a[2]), sqrt(a[3])
    __m128 v11 = _mm_rcp_ss(a);            // 1/a[0], a[1], a[2], a[3]
    __m128 v12 = _mm_rcp_ps(a);            // 1/a[0], 1/a[1], 1/a[2], 1/a[3]
    __m128 v13 = _mm_rsqrt_ss(a);          // 1/(sqrt(a[0])), a[1], a[2], a[3]
    __m128 v14 = _mm_rsqrt_ps(a);          // 1/(sqrt(a[0])), 1/(sqrt(a[1])), 1/(sqrt(a[2])), 1/(sqrt(a[3]))
    printf("v9  = sqrt(a0) : (%.2f, %.2f, %.2f, %.2f)\n\n", v9.m128_f32[0],  v9.m128_f32[1],  v9.m128_f32[2],  v9.m128_f32[3]);
    printf("v10 = sqrt(a)  : (%.2f, %.2f, %.2f, %.2f)\n\n", v10.m128_f32[0], v10.m128_f32[1], v10.m128_f32[2], v10.m128_f32[3]);
    printf("v11 =  1 / a0  : (%.2f, %.2f, %.2f, %.2f)\n\n", v11.m128_f32[0], v11.m128_f32[1], v11.m128_f32[2], v11.m128_f32[3]);
    printf("v12 =  1 / a   : (%.2f, %.2f, %.2f, %.2f)\n\n", v12.m128_f32[0], v12.m128_f32[1], v12.m128_f32[2], v12.m128_f32[3]);
    printf("v13 =1/sqrt(a0): (%.2f, %.2f, %.2f, %.2f)\n\n", v13.m128_f32[0], v13.m128_f32[1], v13.m128_f32[2], v13.m128_f32[3]);
    printf("v14 =1/sqrt(a) : (%.2f, %.2f, %.2f, %.2f)\n\n", v14.m128_f32[0], v14.m128_f32[1], v14.m128_f32[2], v14.m128_f32[3]); // 最大值、最小值
    __m128 v15 = _mm_min_ss(a, b);         // min(a[0], b[0]), a[1], a[2], a[3]
    __m128 v16 = _mm_min_ps(a, b);         // min(a[0], b[0]), min(a[1], b[1]), min(a[2], b[2]), min(a[3], b[3])
    __m128 v17 = _mm_max_ss(a, b);         // max(a[0], b[0]), a[1], a[2], a[3]
    __m128 v18 = _mm_max_ps(a, b);         // max(a[0], b[0]), max(a[1], b[1]), max(a[2], b[2]), max(a[3], b[3])
    printf("v15 = min(a0, b0): (%.2f, %.2f, %.2f, %.2f)\n\n", v15.m128_f32[0], v15.m128_f32[1], v15.m128_f32[2], v15.m128_f32[3]);
    printf("v16 = min(a,  b) : (%.2f, %.2f, %.2f, %.2f)\n\n", v16.m128_f32[0], v16.m128_f32[1], v16.m128_f32[2], v16.m128_f32[3]);
    printf("v17 = max(a0, b0): (%.2f, %.2f, %.2f, %.2f)\n\n", v17.m128_f32[0], v17.m128_f32[1], v17.m128_f32[2], v17.m128_f32[3]);
    printf("v18 = max(a , b) : (%.2f, %.2f, %.2f, %.2f)\n\n", v18.m128_f32[0], v18.m128_f32[1], v18.m128_f32[2], v18.m128_f32[3]);
}

测试结果:

   
   Remark: 注意以上的 -1.#J 是因为负数开方出错导致的。

 2.  SSE的逻辑操作

// 测试SSE的逻辑操作
void TestSSELogic()
{    __m128 a;
    a.m128_i32[0] = 0x96;
    a.m128_i32[1] = 0x15;
    a.m128_i32[2] = 0xB4;
    a.m128_i32[3] = 0x7A;  __m128 b;
    b.m128_i32[0] = 0x34;
    b.m128_i32[1] = 0x57;
    b.m128_i32[2] = 0x9C;
    b.m128_i32[3] = 0xD1;  __m128 v1 = _mm_and_ps(a, b);          // a & b
    __m128 v2 = _mm_andnot_ps(a, b);       // ~a & b
    __m128 v3 = _mm_or_ps(a, b);           // a | b
    __m128 v4 = _mm_xor_ps(a, b);          // a ^ b        printf("a : (0x%x, 0x%x, 0x%x, 0x%x)\n\n", a.m128_i32[0], a.m128_i32[1], a.m128_i32[2], a.m128_i32[3]); printf("b : (0x%x, 0x%x, 0x%x, 0x%x)\n\n", b.m128_i32[0], b.m128_i32[1], b.m128_i32[2], b.m128_i32[3]);
    printf("v1 = a & b: (%d, %d, %d, %d)\n\n", v1.m128_i32[0], v1.m128_i32[1], v1.m128_i32[2], v1.m128_i32[3]);
    printf("v2 =~a & b: (%d, %d, %d, %d)\n\n", v2.m128_i32[0], v2.m128_i32[1], v2.m128_i32[2], v2.m128_i32[3]);
    printf("v3 = a | b: (%d, %d, %d, %d)\n\n", v3.m128_i32[0], v3.m128_i32[1], v3.m128_i32[2], v3.m128_i32[3]);
    printf("v4 = a ^ b: (%d, %d, %d, %d)\n\n", v4.m128_i32[0], v4.m128_i32[1], v4.m128_i32[2], v4.m128_i32[3]);
}

测试结果:

   

3.  SSE的比较操作

// 测试SSE的比较操作
void TestSSECompare()
{    __m128 a;
    a.m128_i32[0] = 1200;
    a.m128_i32[1] = 100;
    a.m128_i32[2] = 350;
    a.m128_i32[3] = 800;   __m128 b;
    b.m128_i32[0] = 900;
    b.m128_i32[1] = 400;
    b.m128_i32[2] = 350;
    b.m128_i32[3] = 600;   __m128 v[30];
    v[0]  = _mm_cmpeq_ss(a, b);
    v[1]  = _mm_cmpeq_ps(a, b);
    v[2]  = _mm_cmplt_ss(a, b);
    v[3]  = _mm_cmplt_ps(a, b);
    v[4]  = _mm_cmple_ss(a, b);
    v[5]  = _mm_cmple_ps(a, b);
    v[6]  = _mm_cmpgt_ss(a, b);
    v[7]  = _mm_cmpgt_ps(a, b);
    v[8]  = _mm_cmpge_ss(a, b);
    v[9]  = _mm_cmpge_ps(a, b);
    v[10] = _mm_cmpneq_ss(a, b);
    v[11] = _mm_cmpneq_ps(a, b);
    v[12] = _mm_cmpnlt_ss(a, b);
    v[13] = _mm_cmpnlt_ps(a, b);
    v[14] = _mm_cmpnle_ss(a, b);
    v[15] = _mm_cmpnle_ps(a, b);
    v[16] = _mm_cmpngt_ss(a, b);
    v[17] = _mm_cmpngt_ps(a, b);
    v[18] = _mm_cmpnge_ss(a, b);
    v[19] = _mm_cmpnge_ps(a, b);   v[20] = _mm_cmpord_ss(a, b);
    v[21] = _mm_cmpord_ps(a, b);
    v[22] = _mm_cmpunord_ss(a, b);
    v[23] = _mm_cmpunord_ps(a, b); int r[12];
    r[0] = _mm_comieq_ss(a, b);
    r[1] = _mm_comilt_ss(a, b);
    r[2] = _mm_comile_ss(a, b);
    r[3] = _mm_comigt_ss(a, b);
    r[4] = _mm_comige_ss(a, b);
    r[5] = _mm_comineq_ss(a, b);
    r[6] = _mm_ucomieq_ss(a, b);
    r[7] = _mm_ucomilt_ss(a, b);
    r[8] = _mm_ucomile_ss(a, b);
    r[9] = _mm_ucomigt_ss(a, b);
    r[10] = _mm_ucomige_ss(a, b);
    r[11] = _mm_ucomineq_ss(a, b); for(int i = 0; i < 24; i += 2)
    {        printf("v[%2d]: (%d, %d, %d, %d)\t v[%2d]: (%d, %d, %d, %d)\n", i, v[i].m128_i32[0], v[i].m128_i32[1], v[i].m128_i32[2],                         v[i].m128_i32[3], i+1, v[i+1].m128_i32[0], v[i+1].m128_i32[1], v[i+1].m128_i32[2], v[i+1].m128_i32[3]);
    }
    printf("\n");
    for(int i = 0; i < 12; i += 4)
        printf("r[%2d]: %d\t r[%2d]: %d\t r[%2d]: %d\t r[%2d]: %d\n", i, r[i], i+1, r[i+1], i+2, r[i+2], i+3, r[i+3]);
}

测试结果:

  

SSE命令示例代码(算术、逻辑、比较)相关推荐

  1. SSE命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)

    1. SSE的整型指令 // 测试SSE的整型指令 void TestSSEInteger() { __m64 a; a.m64_i16[0] = 654; a.m64_i16[1] = -25; a ...

  2. SSE命令示例代码(转换、加载、置位、存储)

    1.   SSE的转换操作 // 测试SSE的转换操作 void TestSSEConvert() { // 浮点数组 __declspec(align(16)) float A[4] = { 5.3 ...

  3. linux 下tar怎样解压zip文件,linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令(示例代码)...

    简介这篇文章主要介绍了linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令(示例代码)以及相关的经验技巧,文章约6037字,浏览量504,点赞数7,值得推荐! .tar 解包:ta ...

  4. linux上传文件操作,每天一个linux命令(文件上传下载文件操作):【转载】gzip命令(示例代码)...

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...

  5. linux系统的ftp命令大全,linux系统ftp命令(示例代码)

    先来一段简单的ftp 下载脚本 ftp -i -n< open 14.2.33.211 user etl etl cd /etlfile/ftpfile lcd /etlfile/getfile ...

  6. linux显示磁盘使用情况命令,Linux查看磁盘使用情况命令(示例代码)

    一.df -lh 命令df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置:文件系统                 容量   ...

  7. c语言有效的预处理命令,9、C语言之预处理命令(示例代码)

    预处理命令 基本概念:ANSI C标准规定可以在C源程序中加入一些"预处理命令",以改进程序设计环境,提高编程效率. 这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本 ...

  8. c语言实现pwd,20155222 c语言实现pwd命令(示例代码)

    20155222 c语言实现linux的pwd命令 1.学习pwd命令在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录.然 ...

  9. linux命令hwclock,Linux命令篇之hwclock命令和man命令(示例代码)

    hwclock:功能说明 显示与设定硬件时钟. 语法 hwclock[--adjust][--debug][--directisa][--hctosys][--show][--systohc][--t ...

最新文章

  1. Java多线程复习:3(在操作系统中查看和杀死进程线程)
  2. 企业开发与社交开发相辅相成
  3. python限定方法参数类型、返回值类型、变量类型
  4. 【放置奇兵】封印之地各阵营boss和小怪属性
  5. BZOJ-2001-city城市建设-HNOI2010-CDQ分治
  6. mysql免费框架_MySQL(ORM框架)
  7. linux方向键ascii_Linux
  8. Flutter Provider框架实现简单的购物车
  9. Mongo 多语言模糊匹配
  10. Java JDK8下载 (jdk-8u251-windows-x64和jdk-8u271-linux-x64.tar)
  11. 电压跟随器的问答汇总
  12. linux给文件夹图标,Linux 如何在启动器中自定义图标
  13. macOS 控件教程(1)
  14. Java Swing编写的一个猜拳小游戏
  15. 9款好看又实用的手机APP UI模板
  16. 科学计算机怎么锁死,人类的技术科学被“锁死”,科学家已证实,仍有很多人不相信!...
  17. 关于UWB汽车钥匙介绍
  18. 计蒜客 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin(求乘法逆元)
  19. pc2环境配置指南(windows)
  20. 抖音怎么去赚钱?小白也能快速上手的抖音测试号项目。丨国仁网络资讯

热门文章

  1. Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法
  2. acwing算法题--二维费用的背包问题
  3. TIME_WAIT和CLOSE_WAIT状态
  4. Google 修补多项 Android 高危漏洞
  5. C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎
  6. Sitecore 9有什么新功能
  7. PHPRAP v1.0.8 版本发布,安装时数据库不存在自动创建
  8. Oracle ASM 翻译系列第七弹:高级知识 How many partners?
  9. WinrRar4.2 扩展名欺骗0Day
  10. 2013 ACM/ICPC Asia Regional Chengdu Online We Love MOE Girls 字符串STL 的应用