2024年6月14日发(作者:)

附录 C

INTEL® C/C++ 内置函数及函数替换 ¹

该附录中的两张表列出了Intel C/C++编译器针对MMX技术,SSE,SSE2,SSE3,SSSE3指

令的内置函数和函数替换

.

可能有些新增的内置函数并没有相应的指令替换.请查阅编译器文档中列出的所有

支持的内置函数

/support/performancetools/.

表C-1列出的是简单的内置函数,表C-2列出的复合内置函数.某些内置函数是复合的,

因为这时需要多于一条指令去实现它们

.

Intel C/C++

编译器内置函数均依照以下约定

:

_mm__

其中

:

指示内置函数的基本操作

;

, add

为加

,sub

为减

表示指令的操作数类型.开头的一两个字母指示数据是否是

紧缩

(packed p),

扩展紧缩

(extended packed ep),

或者标量

( scalar s).

剩下的字母记录类型

:

s

d

i128

i64

u64

i32

u32

i16

u16

i8

u8

单精度浮点数

双精度浮点数

128位有符号整数

64位有符号整数

64位无符号整数

32位有符号整数

32位无符号整数

16

位有符号整数

16

位无符号整数

8

位有符号整数

8

位无符号整数

而r一般被用作内置函数的返回值.紧跟一个数字指示一个紧缩对象的元素.如r0表示r

的最低字

.

Vol. 2B C-1

附录 C INTEL® C/C++ 内置函数及函数替换

紧缩值以从右到左的顺序描述,最低值被用作标量操作.考虑以下操作

:

double a[2] = {1.0, 2.0};

m128d t = _mm_load_pd(a);

结果和以下操作相同

:

m128d t = _mm_set_pd(2.0, 1.0);

m128d t = _mm_setr_pd(1.0, 2.0);

换句话说,暂存变量t的MMX寄存器就像下图所示的样子

:

2.0

127 64 63

1.0

0

标量元素即1.0.由于指令本身的关系,某些内置函数需要立即数(整形字面常

量)参数

.

为了使用内置函数,你可以按照下面的样子在你的代码中插入一行

:

data_type intrinsic_name (parameters)

其中

:

data_type

返回值的类型,可以是

void, int, m64, m128,

m128d,

或者

m128i.

仅有

_mm_empty

内置函数

返回

void.

内置函数的名称.它可以在源代码中表现为函数而不是内联

intrinsic_name

parameters

实际指令

.

内置函数需要的参数

.

C.1

简单内置函数

如要查看表C-1中内置函数的详细描述,请查阅《Intel

®

64 和IA-32架

构软件开发者手册 第2卷 A》第3章

指令集参考

, N-Z”

或《Intel

®

64

和IA-32架构软件开发者手册 第2卷 A》第4章

指令集参考

, N-Z”.

C-2 Vol. 2B