Oracle® Solaris Studio 12.4:C 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

2.19.1 SIMD 内部函数

SPARC64X 和 SPARC64X+ 提供的 SIMD 数据可存放一对 doubleunsigned long long 值。编译器有一些内部函数类型和函数可处理这些数据。

2.19.1.1 类型和运算

sparcace_types.h 头文件中声明的原型支持 SPARC64X 和 SPARC64X+ 提供的下面两种 SIMD 数据类型:

__m128d

一对双精度浮点数

__m128i

一对带符号/无符号 64 位整数

SIMD 数据类型

  • 被处理成基本类型,不聚集;没有内部结构。您需要使用内部函数获取数据的一部分。

  • 可使用类型修饰符进行修改:const 和/或 volatile

  • 可使用存储类说明符进行指定:autostaticregisterextern 和/或 typedef

  • 可以是聚集的元素:arraystruct 和/或 union

SIMD 数据类型变量

  • 可以是函数的正式参数。

  • 可以是函数调用的实际参数。

  • 可以是函数的返回值。

  • 可以是赋值操作符 "=" 的 lhs 或 rhs。

  • 可以是地址运算符 "&" 的操作数。

  • 可以是 sizeof 运算符的操作数。

  • 可以是 typeof 运算符的操作数。

文本字符串语法不受 SIMD 数据类型支持;可以使用适当的内部函数构建 SIMD 数据类型常量。

2.19.1.2 对应用程序二进制接口的扩展

将 SIMD 值传递至函数/从函数接收 SIMD 值

最多会通过浮点寄存器传递前 8 个 SIMD 参数。前面一半 SIMD 参数会占据 %d0%d4%d8 ... %d28。后面一半 SIMD 参数会占据 %d256%d260%d264 ... %d284。如果有九个或更多个 SIMD 参数,它们将通过堆栈区域传递。

从函数返回 SIMD 值

前面一半 SIMD 返回值会显示在 %d0 中。后面一半会显示在 %d256 中。

在内存中存储 SIMD 值

为了使用 SIMD loadldds)/storestds)进行加载/存储,应以 16 字节对齐地址存储 SIMD 类型的值。

2.19.1.3 内部函数

sparcace_types.h 头文件中声明的内部函数如下所示:

__m128d __sparcace_set_m128d(double a, double b)

该函数会从一对双精度浮点数构建 __m128d 类型的数据并返回对象。

__m128i __sparcace_set_m128i(unsigned long long a, unsigned long long b)

该函数会从一对 unsigned long long 类型的数字构建 __m128i 类型的数据并返回对象。

double __sparcace_extract_m128d(__m128d a, int imm

该函数会从作为第一个参数传递的 __m128d 类型的数据提取双精度浮点数。提取的值由第二个参数控制。第二个参数必须是整数且必须是常量 0 或 1。

unsigned long long __sparcace_extract_m128i(__m128i a, int imm)

该函数会从作为第一个参数传递的 __m128i 类型的数据提取 unsigned long long 类型的数字。提取的值由第二个参数控制。第二个参数必须是整数且必须是常量 0 或 1。