Oracle Developer Studio 编译器提供内部函数类型和函数来支持 SPARC64X 和 SPARC64X+ 所具有的特殊功能,即 SIMD 数据和十进制浮点数。
您必须同时指定 -xarch=[sparcace|sparcaceplus] 和 -m64 选项来编译使用这些内部函数的源文件。
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 类型的数据并返回对象。
这是 __sparcace_set_m128d() 的别名。
该函数会从一对 unsigned long long 类型的数字构建 __m128i 类型的数据并返回对象。
这是 __sparcace_set_m128i() 的别名。
该函数会从作为第一个参数传递的 __m128d 类型的数据提取双精度浮点数。提取的值由第二个参数控制。第二个参数必须是整数且必须是常量 0 或 1。
该函数会从作为第一个参数传递的 __m128i 类型的数据提取 unsigned long long 类型的数字。提取的值由第二个参数控制。第二个参数必须是整数且必须是常量 0 或 1。
这是 __sparcace_extract_m128i() 的别名。
此函数返回 __m128i 类型的值,该值具有与参数完全相同的位模式。
这是 __sparcace_cast_m128d_m128i() 的别名。
此函数返回 __m128d 类型的值,该值具有与参数完全相同的位模式。
这是 __sparcace_cast_m128i_m128d() 的别名。
此函数以串行方式执行两个双精度除法,并生成第一个参数除以第二个参数的 __m128d 结果。
这是 __sparcace_fdivd_m128d() 的别名。
此函数在第一个和第二个参数上执行逻辑右移位或左移位,屏蔽它们之外的片段并对它们执行按位 OR 运算来生成 __m128d 结果。移位宽度掩码宽度和掩码偏移量是作为第三个参数提供的。
此函数在第一个和第二个参数上执行逻辑右移位或左移位,屏蔽它们之外的片段并对它们执行按位 OR 运算来生成 __m128i 结果。移位宽度掩码宽度和掩码偏移量是作为第三个参数提供的。
如果第二个参数的对应浮点数的 MSB 为 1,则此函数将第一个参数的每个双精度浮点数存储到由第三个参数指向的 16 字节对齐地址。否则不执行任何操作。
如果第二个参数的对应 unsigned long long 类型数字的 MSB 为 1,则此函数将第一个参数的每个 unsigned long long 类型数字存储到由第三个参数指向的 16 字节对齐地址。否则不执行任何操作。
此函数在反转的第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128d 结果。
此函数在反转的第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128d 结果。
这是 __sparcace_fandnot1_m128d() 的别名。
此函数在反转的第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128i 结果。
这是 __sparcace_fandnot1_m128i() 的别名。
这是 __sparcace_fandnot1_m128i() 的别名。
此函数在第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128d 结果。
这是 __sparcace_fand_m128d() 的别名。
此函数在第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128i 结果。
这是 __sparcace_fand_m128i() 的别名。
此函数在第一个参数和第二个参数之间执行按位 NAND 运算来生成 __m128d 结果。
此函数在第一个参数和第二个参数之间执行按位 NAND 运算来生成 __m128i 结果。
此函数在第一个参数和第二个参数之间执行按位 NOR 运算来生成 __m128d 结果。
此函数在第一个参数和第二个参数之间执行按位 NOR 运算来生成 __m128i 结果。
此函数执行第一个参数的按位反转运算来生成 __m128d 结果。
此函数执行第一个参数的按位反转运算来生成 __m128i 结果。
此函数生成所有位都为 1 的 __m128d 结果。
此函数生成所有位都为 1 的 __m128i 结果。
此函数在反转的第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128d 结果。
此函数在反转的第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128i 结果。
此函数在第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128d 结果。
这是 __sparcace_for_m128d() 的别名。
此函数在第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128i 结果。
这是 __sparcace_for_m128i() 的别名。
此函数在第一个参数和第二个参数之间执行按位 XNOR 运算来生成 __m128d 结果。
此函数在第一个参数和第二个参数之间执行按位 XNOR 运算来生成 __m128i 结果。
此函数在第一个参数和第二个参数之间执行按位 XOR 运算来生成 __m128d 结果。
这是 __sparcace_fxor_m128d() 的别名。
此函数在第一个参数和第二个参数之间执行按位 XOR 运算来生成 __m128i 结果。
这是 __sparcace_fxor_m128i() 的别名。
此函数生成所有位都为 0 的 __m128d 结果。
这是 __sparcace_fzero_m128d() 的别名。
此函数生成所有位都为 0 的 __m128i 结果。
这是 __sparcace_fzero_m128i() 的别名。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个小于等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个小于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个不等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个不等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个大于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。
此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个大于等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。
此函数通过复制第一个参数或第二个参数的每个双精度浮点数(考虑第三个参数的 MSB)来生成 __m128d 结果。
此函数通过复制第一个参数或第二个参数的每个 unsigned long long 类型数字(考虑第三个参数的 MSB)来生成 __m128d 结果。
此函数生成 __m128d 结果,该结果具有参数的绝对值。
此函数执行加法来生成 __m128d 结果。
这是 __sparcace_faddd_m128d() 的别名。
此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 (a * b + c) 运算来生成 __m128d 结果。
这是 __sparcace_fmaddd_m128d() 的别名。
此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 (a * b - c) 来生成 __m128d 结果。
这是 __sparcace_fmsubd_m128d() 的别名。
此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 (a * b - c) 来生成 __m128d 结果。
这是 __sparcace_fnmsubd_m128d() 的别名。注意:这不是 __sparcace_fnmaddd_m128d() 的别名。
此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 -(a * b + c) 来生成 __m128d 结果。
这是 __sparcace_fnmaddd_m128d() 的别名。注意:这不是 __sparcace_fnmsubd_m128() 的别名。
此函数通过复制第一个参数或第二个参数的每个双精度浮点数的最大值来生成 __m128d 结果。
这是 __sparcace_fmaxd_m128d() 的别名。
此函数通过复制第一个参数或第二个参数的每个双精度浮点数的最小值来生成 __m128d 结果。
这是 __sparcace_fmind_m128d() 的别名。
此函数执行乘法来生成 __m128d 结果。
这是 __sparcace_fmuld_m128d() 的别名。
此函数对参数的值求反。
此函数执行减法来生成 __m128d 结果。
这是 __sparcace_fsubd_m128d() 的别名。
此函数将 __m128i 类型参数中的一对 unsigned long long 类型值转换为 __m128d 类型结果中的一对双精度浮点数。
此函数将 __m128d 类型值中的一对双精度浮点数转换为 __m128i 类型参数类型结果中的一对 unsigned long long。
此函数对第一个、第二个和第三个参数中的 unsigned long long 数对执行 (a * b + c) 运算,采用结果对中较低的 8 个字节来生成 __m128d 结果。
此函数对第一个、第二个和第三个参数中的 unsigned long long 数对执行 (a * b + c) 运算,采用结果对中较高的 8 个字节来生成 __m128d 结果。
此函数对第一个和第二个参数中的双精度浮点数对执行 -(a - b) 运算来生成 __m128d 结果。
此函数对第一个和第二个参数中的双精度浮点数对执行 -(a * b) 运算来生成 __m128d 结果。
此函数通过复制第一个参数或第二个参数的每个 signed long long 类型数字的最大值来生成 __m128i 结果。
此函数通过复制第一个参数或第二个参数的每个 signed long long 类型数字的最小值来生成 __m128i 结果。
此函数通过复制第一个参数或第二个参数的每个 signed long long 类型数字的最小值来生成 __m128i 结果。
此函数通过复制第一个参数或第二个参数的每个 unsigned long long 类型数字的最小值来生成 __m128i 结果。
此函数通过按第二个参数的 unsigned long long 类型数字指示的移位量对第一个参数的每个 unsigned long long 类型数字进行逻辑左移位来生成 __m128i 结果。
这是 __sparcace_fpsll64x_m128i() 的别名。
此函数通过按第二个参数的 unsigned long long 类型数字指示的移位量对第一个参数的每个 unsigned long long 类型数字进行逻辑右移位来生成 __m128i 结果。
这是 __sparcace_fpsrl64x_m128i() 的别名。
此函数通过按第二个参数的 unsigned long long 类型数字指示的移位量对第一个参数的每个 signed long long 类型数字进行算术右移位来生成 __m128i 结果。
此函数将第一个参数的每个 signed long long 类型数字与第二个参数的对应 signed long long 类型数字进行比较。如果第一个小于等于第二个,则 __m128i 结果的对应 signed long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。
此函数将第一个参数的每个 signed long long 类型数字与第二个参数的对应 signed long long 类型数字进行比较。如果第一个大于第二个,则 __m128i 结果的对应 signed long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。
此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个小于等于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。
此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个不等于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。
此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个大于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。
此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个等于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。
此函数通过将第一个参数的每个 unsigned long long 类型数字和第二个参数的 unsigned long long 类型数字相加来生成 __m128i 结果。
这是 __sparcace_fpadd64_m128i() 的别名。
此函数通过从第一个参数的 unsigned long long 类型数字中减去第二个参数的每个 unsigned long long 类型数字来生成 __m128i 结果。
这是 __sparcace_fpsub64_m128i() 的别名。
SPARC64X 和 SPARC64X+ 支持十进制浮点数据类型和运算。数据格式符合 IEEE 754-2008 中定义的 64 位 DPD。编译器提供了用于处理数据的类型和多个函数。
要表示十进制浮点数,请在 dpd_conf.h 中声明 _Decimal64 内部函数类型。您必须在使用该类型之前包括头文件,如以下示例所示:
#include <dpd_conf.h>
int main(void) {
_Decimal64 dd;
...
return 0;
}
_Decimal64 类型
可使用类型修饰符进行修改:const 和/或 volatile。
可使用存储类说明符进行指定:auto、static、register、extern 和/或 typedef。
可以是聚集的元素:array、struct 和/或 union。
_Decimal64 类型变量
可以是函数的正式参数。
可以是函数调用的实际参数。
可以是函数的返回值。
可以是赋值操作符 "=" 的 lhs 或 rhs。
可以是地址运算符 "&" 的操作数。
可以是 sizeof 运算符的操作数。
可以是 typeof 运算符的操作数。
会为其他运算(例如,算术、比较或类型转换)提供内部函数。
_Decimal64 的文本字符串语法不受支持。请改用类型转换的内部函数。
_Decimal64 类型数字与 64 位二进制浮点数的内存对齐相同。
指定 -xarch=[sparcace|sparcaceplus] 和 -m64 时,__DEC_FP_INTR 宏定义为 1。该宏在确定编译器是否支持十进制浮点内部函数功能时非常有用。
包括 dpd_conf.h 时,IEEE 754-2008 所需的 DEC_EVAL_METHOD 宏定义为 1。
__STDC_DEC_FP__ 宏并未定义,因为该编译器不完全支持 ISO/IEC TR 24732 中所述的功能。
IEEE 754-2008 所需的 #pragma FLOAT_CONST_DECIMAL_64 不受支持。
dpd_conf.h 中声明了下面所列的内部函数。它们在处理 _Decimal64 类型的变量时非常有用。
此函数将 src 存储到由 addr 寻址的内存中。addr 必须在 8 字节边界上对齐,否则无论 -xmemalign 设置为何都不会定义行为。
该函数将从由 addr 寻址的内存中加载 _Decimal64 类型的值并返回该值。addr 必须在 8 字节边界上对齐,否则无论 -xmemalign 设置为何都不会定义行为。
该函数将添加 src1 和 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。
此函数将从 src1 中减去 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。
该函数将 src1 和 src2 相乘并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。
此函数将用 src1 除以 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。
此函数将计算 src 的绝对值并返回结果。即使 src 发出 NaN 信号,也不会抛出浮点异常。
此函数将保留 src 的符号并返回结果。即使 src 发出 NaN 信号,也不会抛出浮点异常。
src1 等于 src2 时,此函数会返回非 0 值,否则将返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。
src1 不等于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。
src1 大于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。
src1 大于或等于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。
src1 小于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。
src1 小于或等于 src2 时,该函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。
此函数将 src 中的 64 位带符号整数值转换为十进制浮点值并返回结果。
此函数将 src 中的 64 位无符号整数值转换为十进制浮点值并返回结果。
此函数将 src 中的二进制浮点值转换为十进制浮点值并返回结果。
此函数的行为就像在 "ISO/IEC TR 24732" 中定义的函数 strtod64() 那样,不同之处在于舍入方向固定为“到最接近的,偶数优先”。
此函数将 src 中的十进制浮点值转换为 64 位带符号整数值并返回结果。
此函数会将 src 中的十进制浮点值转换为 64 位无符号整数值并返回结果。
此函数将 src 中的十进制浮点值转换为二进制浮点值并返回结果。
此函数将 dec 以 %He 格式输出到由 buf 定位的内存中。精度与 dec 的系数一样长。输出字符串在第 (n-1) 个字符处(当字符串长度等于或大于 n 时)或者在字符串结尾处以空字符终止。dec 成功转换为字符串时,此函数返回 buf,否则它返回空指针。
此函数将 dec 以 %Hf 格式输出到由 buf 定位的内存中。精度与 dec 的系数一样长。输出字符串在第 (n-1) 个字符处(当字符串长度等于或大于 n 时)或者在字符串结尾处以空字符终止。dec 成功转换为字符串时,此函数返回 buf,否则它返回空指针。
此函数检索 _Decimal64 的当前舍入模式。该值在 dpd_conf.h 中进行定义,如下所示:
舍入到最接近的,偶数优先
舍入到零
舍入到正无穷大
舍入到负无穷大
舍入到最接近的,远离零
_Decimal64 的舍入模式的初始值为 __DPD_ROUND_NEAREST。请注意,-fround 选项不改变 _Decimal64 的舍入模式。
此函数会将 _Decimal64 的舍入模式设置为 r。r 应为上面所列的值之一。它在成功时返回 0,在失败时返回非 0。