SPARC64X 和 SPARC64X+ 提供的 SIMD 数据可存放一对 double 或 unsigned long long 值。编译器有一些内部函数类型和函数可处理这些数据。
在 sparcace_types.h 头文件中声明的原型支持 SPARC64X 和 SPARC64X+ 提供的下面两种 SIMD 数据类型:
一对双精度浮点数
一对带符号/无符号 64 位整数
SIMD 数据类型
被处理成基本类型,不聚集;没有内部结构。您需要使用内部函数获取数据的一部分。
可使用类型修饰符进行修改:const 和/或 volatile。
可使用存储类说明符进行指定:auto、static、register、extern 和/或 typedef。
可以是聚集的元素:array、struct 和/或 union。
SIMD 数据类型变量
可以是函数的正式参数。
可以是函数调用的实际参数。
可以是函数的返回值。
可以是赋值操作符 "=" 的 lhs 或 rhs。
可以是地址运算符 "&" 的操作数。
可以是 sizeof 运算符的操作数。
可以是 typeof 运算符的操作数。
文本字符串语法不受 SIMD 数据类型支持;可以使用适当的内部函数构建 SIMD 数据类型常量。
最多会通过浮点寄存器传递前 8 个 SIMD 参数。前面一半 SIMD 参数会占据 %d0、%d4、%d8 ... %d28。后面一半 SIMD 参数会占据 %d256、%d260、%d264 ... %d284。如果有九个或更多个 SIMD 参数,它们将通过堆栈区域传递。
前面一半 SIMD 返回值会显示在 %d0 中。后面一半会显示在 %d256 中。
为了使用 SIMD load(ldd、s)/store(std、s)进行加载/存储,应以 16 字节对齐地址存储 SIMD 类型的值。
sparcace_types.h 头文件中声明的内部函数如下所示:
该函数会从一对双精度浮点数构建 __m128d 类型的数据并返回对象。
该函数会从一对 unsigned long long 类型的数字构建 __m128i 类型的数据并返回对象。
该函数会从作为第一个参数传递的 __m128d 类型的数据提取双精度浮点数。提取的值由第二个参数控制。第二个参数必须是整数且必须是常量 0 或 1。
该函数会从作为第一个参数传递的 __m128i 类型的数据提取 unsigned long long 类型的数字。提取的值由第二个参数控制。第二个参数必须是整数且必须是常量 0 或 1。