汇编指令与Intrinsics指令的对应关系汇总

参考网址:https://software.intel.com/sites/landingpage/IntrinsicsGuide/

1、赋值指令:movq

使用方法:movq xmm, m64

功能:把源存储器低64位内容送入目的寄存器的低64位,高64位清零

对应的Intrinsics

__m128i _mm_loadl_epi64 (__m128i const* mem_addr)

介绍

__m128i _mm_loadl_epi64 (__m128i const* mem_addr)

#include "emmintrin.h"  //SSE2

Instruction: movq xmm, m64

CPUID Flags: SSE2

功能

Load 64-bit integer from memory into the first element of dst.

方法

dst[63:0] := MEM[mem_addr+63:mem_addr]
dst[MAX:64] := 0

2、加法指令:paddw

使用方法:paddw xmm, xmm

功能:源存储器与目的寄存器按字对齐无符号普通相加,内存变量必须对齐内存16字节

对应的Intrinsics

<pre name="code" class="html">__m128i _mm_add_epi16 (__m128i a, __m128i b)

介绍

__m128i _mm_add_epi16 (__m128i a, __m128i b)

#include "emmintrin.h"

Instruction: paddw xmm, xmm

CPUID Flags: SSE2

功能

Add packed 16-bit integers in a and b, and store the results in dst.

方法

<pre name="code" class="html">FOR j := 0 to 7
	i := j*16
	dst[i+15:i] := a[i+15:i] + b[i+15:i]
ENDFOR

3、减法指令:psubw

使用方法:psubw xmm, xmm

功能:源存储器与目的寄存器按字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节

对应的Intrinsics

<pre name="code" class="html">__m128i _mm_sub_epi16 (__m128i a, __m128i b)

介绍

__m128i _mm_sub_epi16 (__m128i a, __m128i b)

#include "emmintrin.h"

Instruction: psubw xmm, xmm

CPUID Flags: SSE2

功能

Subtract packed 16-bit integers in b from packed 16-bit integers in a, and store the results in dst.

方法

<pre name="code" class="html">FOR j := 0 to 7
	i := j*16
	dst[i+15:i] := a[i+15:i] - b[i+15:i]
ENDFOR

4、低64位按字交错排列指令:punpcklwd

使用方法:punpcklwd xmm, xmm

功能:源存储器与目的寄存器低64位按字交错排列,内存变量必须对齐内存16字节

高64位 | 低64位

目的寄存器:        a7 a6 a5 a4 a3 a2 a1 a0

源寄存器:            b7 b6 b5 b4 b3 b2 b1 b0

目的寄存器结果:b3 a3 b2 a2 b1 a1 b0 a0

对应的Intrinsics

<pre name="code" class="html">__m128i _mm_unpacklo_epi16 (__m128i a, __m128i b)

介绍

__m128i _mm_unpacklo_epi16 (__m128i a, __m128i b)

#include "emmintrin.h"

Instruction: punpcklwd xmm, xmm

CPUID Flags: SSE2

功能

Unpack and interleave 16-bit integers from the low half of a and b, and store the results in dst.

方法

<pre name="code" class="html">INTERLEAVE_WORDS(src1[127:0], src2[127:0]){
	dst[15:0] := src1[15:0]
	dst[31:16] := src2[15:0]
	dst[47:32] := src1[31:16]
	dst[63:48] := src2[31:16]
	dst[79:64] := src1[47:32]
	dst[95:80] := src2[47:32]
	dst[111:96] := src1[63:48]
	dst[127:112] := src2[63:48]
	RETURN dst[127:0]
}	

dst[127:0] := INTERLEAVE_WORDS(a[127:0], b[127:0])

5、高64位按字交错排列指令:punpckhwd

使用方法:punpckhwd xmm, xmm

功能:源存储器与目的寄存器高64位按字交错排列,内存变量必须对齐内存16字节

高64位 | 低64位

目的寄存器:        a7 a6 a5 a4 a3 a2 a1 a0

源寄存器:            b7 b6 b5 b4 b3 b2 b1 b0

目的寄存器结果:b7 a7 b6 a6 b5 a5 b4 a4

对应的Intrinsics

<pre name="code" class="html">__m128i _mm_unpackhi_epi16 (__m128i a, __m128i b)

介绍

__m128i _mm_unpackhi_epi16 (__m128i a, __m128i b)

#include "emmintrin.h"

Instruction: punpckhwd xmm, xmm

CPUID Flags: SSE2

功能

Unpack and interleave 16-bit integers from the high half of a and b, and store the results in dst.

方法

<pre name="code" class="html">INTERLEAVE_HIGH_WORDS(src1[127:0], src2[127:0]){
	dst[15:0] := src1[79:64]
	dst[31:16] := src2[79:64]
	dst[47:32] := src1[95:80]
	dst[63:48] := src2[95:80]
	dst[79:64] := src1[111:96]
	dst[95:80] := src2[111:96]
	dst[111:96] := src1[127:112]
	dst[127:112] := src2[127:112]
	RETURN dst[127:0]
}

dst[127:0] := INTERLEAVE_HIGH_WORDS(a[127:0], b[127:0])

6、低64位按双字交错排列指令:punpckldq

使用方法:punpckldq xmm, xmm

功能:源存储器与目的寄存器低64位按双字交错排列,内存变量必须对齐内存16字节

高64位 | 低64位

目的寄存器:        a3 a2 a1 a0

源寄存器:            b3 b2 b1 b0

目的寄存器结果:b1 a1 b0 a0

对应的Intrinsics

<pre name="code" class="html">__m128i _mm_unpacklo_epi32 (__m128i a, __m128i b)

介绍

__m128i _mm_unpacklo_epi32 (__m128i a, __m128i b)

#include "emmintrin.h"

Instruction: punpckldq xmm, xmm

CPUID Flags: SSE2

功能

Unpack and interleave 32-bit integers from the low half of a and b, and store the results in dst.

方法

<pre name="code" class="html">INTERLEAVE_DWORDS(src1[127:0], src2[127:0]){
	dst[31:0] := src1[31:0]
	dst[63:32] := src2[31:0]
	dst[95:64] := src1[63:32]
	dst[127:96] := src2[63:32]
	RETURN dst[127:0]
}	

dst[127:0] := INTERLEAVE_DWORDS(a[127:0], b[127:0])

7、高64位按双字交错排列指令:punpckhdq

使用方法:punpckhdq xmm, xmm

功能:源存储器与目的寄存器高64位按双字交错排列,内存变量必须对齐内存16字节

高64位 | 低64位

目的寄存器:        a3 a2 a1 a0

源寄存器:            b3 b2 b1 b0

目的寄存器结果:b3 a3 b2 a2

对应的Intrinsics

<pre name="code" class="html">__m128i _mm_unpackhi_epi32 (__m128i a, __m128i b)

介绍

__m128i _mm_unpackhi_epi32 (__m128i a, __m128i b)

#include "emmintrin.h"

Instruction: punpckhdq xmm, xmm

CPUID Flags: SSE2

功能

Unpack and interleave 32-bit integers from the high half of a and b, and store the results in dst.

方法

<pre name="code" class="html">INTERLEAVE_HIGH_DWORDS(src1[127:0], src2[127:0]){
	dst[31:0] := src1[95:64]
	dst[63:32] := src2[95:64]
	dst[95:64] := src1[127:96]
	dst[127:96] := src2[127:96]
	RETURN dst[127:0]
}	

dst[127:0] := INTERLEAVE_HIGH_DWORDS(a[127:0], b[127:0])
												

汇编指令与Intrinsics指令的对应关系汇总的更多相关文章

  1. 五、案例-指令参考-freemarker指令、表达式

    案例-指令参考描述:本人自己测试写了一遍,如有错的地方,懂freemarker的朋友望指点指点! 案例-指令参考 表达式 一. Assign 1.<#assign name1="北京& ...

  2. emms指令在MMX指令中的作用

    emms指令在MMX指令中的作用 转自:http://blog.csdn.net/psusong/archive/2009/01/08/3737047.aspx MMX和SSE都是INTEL开发的基于 ...

  3. ARM指令协处理器处理指令

    ARM支持16个协处理器,在程序执行过程中,每个协处理器忽略属于ARM处理器和其他协处理器指令,当一个协处理器硬件不能执行属于她的协处理器指令时,就会产生一个未定义的异常中断,在异常中断处理程序中,可 ...

  4. ARM指令和Thumb指令区别

    Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...

  5. int指令(软件中断指令)

    INT(软件中断指令)是CALL指令的一种特殊形式.call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序. 中断服务子程序和标准过程的最大区别是 ...

  6. AngularJS -- 指令(创建自定义指令)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/   什么是指令 注:本指南是针对已经熟悉AngularJS基础知识的开发人员.如果你才刚 ...

  7. JSP中的编译指令和动作指令的区别

    JSP中的编译指令和动作指令的区别 1.编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的脚本动作 2.编译指令是在将JSP编译成Servlet时起作用,而动作指令可替换成JSP脚本, ...

  8. Javaweb学习笔记——(十二)——————JSP指令:page指令、include指令、taglib指令,JavaBean,内省,EL表达式

    JSP指令JSP指令分类 JSP有三大指令: *page指令 *include指令 *taglib指令 在JSP中没有任何指令是必须的. 但基本上每个JSP都是使用page指令============ ...

  9. vue 基础-->进阶 教程(2): 指令、自定义指令、组件

    第二章 建议学习时间4小时  课程共3章 前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零 ...

随机推荐

  1. JavaScript关于闭包

    在学习JavaScript这条路上,对于闭包这个JS中极其重要的应用技巧或者说是一个语言特性一直停留在最最表层的: 函数α内部的函数β被函数外部所调用,然后内部的函数β因为被调用使得其生存周期得以延长 ...

  2. Python实现生命游戏

    1. 生命游戏是什么 生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个 ...

  3. Lisp语言简介

    摘自维基百科,原链接为:http://zh.wikipedia.org/zh/LISP 因为Clojure是Lisp的一种的方言,所以我们可以先来了解一下Lisp这个比较小众的编程到底是什么~ --- ...

  4. Android studio Unsupported major.minor version 52.0

    从目前以及我从网上搜索到的解决方案来说,出现此问题可以从以下两个方法入手: 1. JDK的版本和class版本不一致,通常是jdk版本过低解决方法: 1)使用Java -version和javac - ...

  5. 移动APP自动化测试框架

    简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是单元测试,最容易实现 ...

  6. mysql utf8字符集下使用DES_ENCRYPT

    DES_ENCRYPT() 加密字符串后内容为空 改变字符集latin1  可以保存和解密(DES_DECRYPT)

  7. VS2008里的代码如何格式化

    选中要格式化的代码, 先按Ctrl+K 再按Ctrl+F 从菜单中也可以 "编辑"->"高级"->"设置文档的格式Ctrl+K Ctrl+ ...

  8. 12.php中无比坑爹的构造函数。

    当你在php类中,写一个构造方法时,记得,一定要用__这是两个下划线,而不是一个.......... <?php class Car { // function _construct() { / ...

  9. 查看python对象的属性

    在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...

  10. Shell正则表达式和文本处理工具

    作业一:整理正则表达式博客 一.什么是正则 正则就是用一些具有特殊含义的符号组合而成(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 通配符是由shell解释得. ...