Oracle® Developer Studio 12.5:C 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

2.20 针对 SPARC64X 和 SPARC64X+ 平台内部函数的编译器支持

Oracle Developer Studio 编译器提供内部函数类型和函数来支持 SPARC64X 和 SPARC64X+ 所具有的特殊功能,即 SIMD 数据和十进制浮点数。

您必须同时指定 -xarch=[sparcace|sparcaceplus] 和 -m64 选项来编译使用这些内部函数的源文件。

2.20.1 SIMD 内部函数

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

2.20.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.20.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.20.1.3 内部函数

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

__m128d __sparcace_set_m128d(double a, double b)

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

__m128d _mm_set_pd(double z, double y)

这是 __sparcace_set_m128d() 的别名。

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

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

__m128i _mm_set_epi64x(long long a, long long b)

这是 __sparcace_set_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。

long long _mm_extract_epi64(__m128i a, const int imm)

这是 __sparcace_extract_m128i() 的别名。

__m128i __sparcace_cast_m128d_m128i(__m128d a)

此函数返回 __m128i 类型的值,该值具有与参数完全相同的位模式。

__m128i _mm_castpd_si128(__m128d in)

这是 __sparcace_cast_m128d_m128i() 的别名。

__m128d __sparcace_cast_m128i_m128d(__m128i a)

此函数返回 __m128d 类型的值,该值具有与参数完全相同的位模式。

__m128d _mm_castsi128_pd(__m128i in)

这是 __sparcace_cast_m128i_m128d() 的别名。

__m128d __sparcace_fdivd_m128d(__m128d a, __m128d b)

此函数以串行方式执行两个双精度除法,并生成第一个参数除以第二个参数的 __m128d 结果。

__m128d _mm_div_pd(__m128d a, __m128d b)

这是 __sparcace_fdivd_m128d() 的别名。

__m128d __sparcace_fshiftorx_m128d(__m128d a, __m128d b, __m128d c)

此函数在第一个和第二个参数上执行逻辑右移位或左移位,屏蔽它们之外的片段并对它们执行按位 OR 运算来生成 __m128d 结果。移位宽度掩码宽度和掩码偏移量是作为第三个参数提供的。

__m128i __sparcace_fshiftorx_m128i(__m128i a, __m128i b, __m128i c)

此函数在第一个和第二个参数上执行逻辑右移位或左移位,屏蔽它们之外的片段并对它们执行按位 OR 运算来生成 __m128i 结果。移位宽度掩码宽度和掩码偏移量是作为第三个参数提供的。

void __sparcace_stdfr_m128d(__m128d a, __m128d b, __m128d *p)

如果第二个参数的对应浮点数的 MSB 为 1,则此函数将第一个参数的每个双精度浮点数存储到由第三个参数指向的 16 字节对齐地址。否则不执行任何操作。

void __sparcace_stdfr_m128i(__m128i a, __m128i b, __m128i *p)

如果第二个参数的对应 unsigned long long 类型数字的 MSB 为 1,则此函数将第一个参数的每个 unsigned long long 类型数字存储到由第三个参数指向的 16 字节对齐地址。否则不执行任何操作。

__m128d __sparcace_fandnot1_m128d(__m128d a, __m128d b)

此函数在反转的第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128d 结果。

__m128d __sparcace_fandnot1_m128d(__m128d a, __m128d b)

此函数在反转的第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128d 结果。

__m128d _mm_andnot_pd(__m128d a, __m128d b)

这是 __sparcace_fandnot1_m128d() 的别名。

__m128i __sparcace_fandnot1_m128i(__m128i a, __m128i b)

此函数在反转的第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128i 结果。

__m128i _mm_andnot_si128(__m128i a, __m128i b)

这是 __sparcace_fandnot1_m128i() 的别名。

__m128i _mm_andnot_si128(__m128i a, __m128i b)

这是 __sparcace_fandnot1_m128i() 的别名。

__m128d __sparcace_fand_m128d(__m128d a, __m128d b)

此函数在第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128d 结果。

__m128d _mm_and_pd(__m128d a, __m128d b)

这是 __sparcace_fand_m128d() 的别名。

__m128i __sparcace_fand_m128i(__m128i a, __m128i b)

此函数在第一个参数和第二个参数之间执行按位 AND 运算来生成 __m128i 结果。

__m128i _mm_and_si128(__m128i a, __m128i b)

这是 __sparcace_fand_m128i() 的别名。

__m128d __sparcace_fnand_m128d(__m128d a, __m128d b)

此函数在第一个参数和第二个参数之间执行按位 NAND 运算来生成 __m128d 结果。

__m128i __sparcace_fnand_m128i(__m128i a, __m128i b)

此函数在第一个参数和第二个参数之间执行按位 NAND 运算来生成 __m128i 结果。

__m128d __sparcace_fnor_m128d(__m128d a, __m128d b)

此函数在第一个参数和第二个参数之间执行按位 NOR 运算来生成 __m128d 结果。

__m128i __sparcace_fnor_m128i(__m128i a, __m128i b)

此函数在第一个参数和第二个参数之间执行按位 NOR 运算来生成 __m128i 结果。

__m128d __sparcace_fnot1_m128d(__m128d a)

此函数执行第一个参数的按位反转运算来生成 __m128d 结果。

__m128i __sparcace_fnot1_m128i(__m128i a)

此函数执行第一个参数的按位反转运算来生成 __m128i 结果。

__m128d __sparcace_fone_m128d()

此函数生成所有位都为 1 的 __m128d 结果。

__m128i __sparcace_fone_m128i()

此函数生成所有位都为 1 的 __m128i 结果。

__m128d __sparcace_fornot1_m128d(__m128d a, __m128d b)

此函数在反转的第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128d 结果。

__m128i __sparcace_fornot1_m128i(__m128i a, __m128i b)

此函数在反转的第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128i 结果。

__m128d __sparcace_for_m128d(__m128d a, __m128d b)

此函数在第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128d 结果。

__m128d _mm_or_pd(__m128d a, __m128d b)

这是 __sparcace_for_m128d() 的别名。

__m128i __sparcace_for_m128i(__m128i a, __m128i b)

此函数在第一个参数和第二个参数之间执行按位 OR 运算来生成 __m128i 结果。

__m128i _mm_or_si128(__m128i a, __m128i b)

这是 __sparcace_for_m128i() 的别名。

__m128d __sparcace_fxnor_m128d(__m128d a, __m128d b)

此函数在第一个参数和第二个参数之间执行按位 XNOR 运算来生成 __m128d 结果。

__m128i __sparcace_fxnor_m128i(__m128i a, __m128i b)

此函数在第一个参数和第二个参数之间执行按位 XNOR 运算来生成 __m128i 结果。

__m128d __sparcace_fxor_m128d(__m128d a, __m128d b)

此函数在第一个参数和第二个参数之间执行按位 XOR 运算来生成 __m128d 结果。

__m128d _mm_xor_pd(__m128d a, __m128d b)

这是 __sparcace_fxor_m128d() 的别名。

__m128i __sparcace_fxor_m128i(__m128i a, __m128i b)

此函数在第一个参数和第二个参数之间执行按位 XOR 运算来生成 __m128i 结果。

__m128i _mm_xor_si128(__m128i a, __m128i b)

这是 __sparcace_fxor_m128i() 的别名。

__m128d __sparcace_fzero_m128d()

此函数生成所有位都为 0 的 __m128d 结果。

__m128d _mm_setzero_pd()

这是 __sparcace_fzero_m128d() 的别名。

__m128i __sparcace_fzero_m128i()

此函数生成所有位都为 0 的 __m128i 结果。

__m128i _mm_setzero_si128()

这是 __sparcace_fzero_m128i() 的别名。

__m128d __sparcace_fcmpeqd_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。

__m128d __sparcace_fcmpeqed_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。

__m128d __sparcace_fcmpleed_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个小于等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。

__m128d __sparcace_fcmplted_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个小于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。

__m128d __sparcace_fcmpned_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个不等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。

__m128d __sparcace_fcmpneed_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个不等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。

__m128d __sparcace_fcmpgted_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个大于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。

__m128d __sparcace_fcmpgeed_m128d(__m128d a, __m128d b)

此函数将第一个参数的每个双精度浮点数与第二个参数的对应双精度浮点数进行比较。如果第一个大于等于第二个,则 __m128d 结果的对应双精度浮点数的所有位都设置为 1。如果未排序,则将引发异常。

__m128d __sparcace_fselmovd_m128d(__m128d a, __m128d b, __m128d c)

此函数通过复制第一个参数或第二个参数的每个双精度浮点数(考虑第三个参数的 MSB)来生成 __m128d 结果。

__m128i __sparcace_fselmovd_m128i(__m128i a, __m128i b, __m128i c)

此函数通过复制第一个参数或第二个参数的每个 unsigned long long 类型数字(考虑第三个参数的 MSB)来生成 __m128d 结果。

__m128d __sparcace_fabsd_m128d(__m128d a)

此函数生成 __m128d 结果,该结果具有参数的绝对值。

__m128d __sparcace_faddd_m128d(__m128d a, __m128d b)

此函数执行加法来生成 __m128d 结果。

__m128d _mm_add_pd(__m128d a, __m128d b)

这是 __sparcace_faddd_m128d() 的别名。

__m128d __sparcace_fmaddd_m128d(__m128d a, __m128d b, __m128d c)

此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 (a * b + c) 运算来生成 __m128d 结果。

__m128d _mm_fmadd_pd(__m128d a, __m128d b, __m128d c)

这是 __sparcace_fmaddd_m128d() 的别名。

__m128d __sparcace_fmsubd_m128d(__m128d a, __m128d b, __m128d c)

此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 (a * b - c) 来生成 __m128d 结果。

__m128d _mm_fmsub_pd(__m128d a, __m128d b, __m128d c)

这是 __sparcace_fmsubd_m128d() 的别名。

__m128d __sparcace_fnmsubd_m128d(__m128d a, __m128d b, __m128d c)

此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 (a * b - c) 来生成 __m128d 结果。

__m128d _mm_fnmadd_pd(__m128d a, __m128d b, __m128d c)

这是 __sparcace_fnmsubd_m128d() 的别名。注意:这不是 __sparcace_fnmaddd_m128d() 的别名。

__m128d __sparcace_fnmaddd_m128d(__m128d a, __m128d b, __m128d c)

此函数对第一个、第二个和第三个参数中的双精度浮点数对执行 -(a * b + c) 来生成 __m128d 结果。

__m128d _mm_fnmsub_pd(__m128d a, __m128d b, __m128d c)

这是 __sparcace_fnmaddd_m128d() 的别名。注意:这不是 __sparcace_fnmsubd_m128() 的别名。

__m128d __sparcace_fmaxd_m128d(__m128d a, __m128d b)

此函数通过复制第一个参数或第二个参数的每个双精度浮点数的最大值来生成 __m128d 结果。

__m128d _mm_max_pd(__m128d a, __m128d b)

这是 __sparcace_fmaxd_m128d() 的别名。

__m128d __sparcace_fmind_m128d(__m128d a, __m128d b)

此函数通过复制第一个参数或第二个参数的每个双精度浮点数的最小值来生成 __m128d 结果。

__m128d _mm_min_pd(__m128d a, __m128d b)

这是 __sparcace_fmind_m128d() 的别名。

__m128d __sparcace_fmuld_m128d(__m128d a, __m128d b)

此函数执行乘法来生成 __m128d 结果。

__m128d _mm_mul_pd(__m128d a, __m128d b)

这是 __sparcace_fmuld_m128d() 的别名。

__m128d __sparcace_fnegd_m128d(__m128d a)

此函数对参数的值求反。

__m128d __sparcace_fsubd_m128d(__m128d a, __m128d b)

此函数执行减法来生成 __m128d 结果。

__m128d _mm_sub_pd(__m128d a, __m128d b)

这是 __sparcace_fsubd_m128d() 的别名。

__m128d __sparcace_fxtod_m128i_m128d(__m128i a)

此函数将 __m128i 类型参数中的一对 unsigned long long 类型值转换为 __m128d 类型结果中的一对双精度浮点数。

__m128i __sparcace_fdtox_m128d_m128i(__m128d a)

此函数将 __m128d 类型值中的一对双精度浮点数转换为 __m128i 类型参数类型结果中的一对 unsigned long long

__m128i __sparcace_fpmaddx_m128i(__m128i a, __m128i b, __m128i c)

此函数对第一个、第二个和第三个参数中的 unsigned long long 数对执行 (a * b + c) 运算,采用结果对中较低的 8 个字节来生成 __m128d 结果。

__m128i __sparcace_fpmaddxhi_m128i(__m128i a, __m128i b, __m128i c)

此函数对第一个、第二个和第三个参数中的 unsigned long long 数对执行 (a * b + c) 运算,采用结果对中较高的 8 个字节来生成 __m128d 结果。

__m128d __sparcace_fnaddd_m128d(__m128d a, __m128d b)

此函数对第一个和第二个参数中的双精度浮点数对执行 -(a - b) 运算来生成 __m128d 结果。

__m128d __sparcace_fnmuld_m128d(__m128d a, __m128d b)

此函数对第一个和第二个参数中的双精度浮点数对执行 -(a * b) 运算来生成 __m128d 结果。

__m128i __sparcace_fpmax64x_m128i(__m128i a, __m128i b)

此函数通过复制第一个参数或第二个参数的每个 signed long long 类型数字的最大值来生成 __m128i 结果。

__m128i __sparcace_fpmin64x_m128i(__m128i a, __m128i b)

此函数通过复制第一个参数或第二个参数的每个 signed long long 类型数字的最小值来生成 __m128i 结果。

__m128i __sparcace_fpmin64x_m128i(__m128i a, __m128i b)

此函数通过复制第一个参数或第二个参数的每个 signed long long 类型数字的最小值来生成 __m128i 结果。

__m128i __sparcace_fpminu64x_m128i(__m128i a, __m128i b)

此函数通过复制第一个参数或第二个参数的每个 unsigned long long 类型数字的最小值来生成 __m128i 结果。

__m128i __sparcace_fpsll64x_m128i(__m128i a, __m128i b)

此函数通过按第二个参数的 unsigned long long 类型数字指示的移位量对第一个参数的每个 unsigned long long 类型数字进行逻辑左移位来生成 __m128i 结果。

__m128i _mm_sll_epi64(__m128i a, __m128i b)

这是 __sparcace_fpsll64x_m128i() 的别名。

__m128i __sparcace_fpsrl64x_m128i(__m128i a, __m128i b)

此函数通过按第二个参数的 unsigned long long 类型数字指示的移位量对第一个参数的每个 unsigned long long 类型数字进行逻辑右移位来生成 __m128i 结果。

__m128i _mm_srl_epi64(__m128i a, __m128i b)

这是 __sparcace_fpsrl64x_m128i() 的别名。

__m128i __sparcace_fpsra64x_m128i(__m128i a, __m128i b)

此函数通过按第二个参数的 unsigned long long 类型数字指示的移位量对第一个参数的每个 signed long long 类型数字进行算术右移位来生成 __m128i 结果。

__m128i __sparcace_fpcmple64x_m128i(__m128i a, __m128i b)

此函数将第一个参数的每个 signed long long 类型数字与第二个参数的对应 signed long long 类型数字进行比较。如果第一个小于等于第二个,则 __m128i 结果的对应 signed long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。

__m128i __sparcace_fpcmpgt64x_m128i(__m128i a, __m128i b)

此函数将第一个参数的每个 signed long long 类型数字与第二个参数的对应 signed long long 类型数字进行比较。如果第一个大于第二个,则 __m128i 结果的对应 signed long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。

__m128i __sparcace_fpcmpule64x_m128i(__m128i a, __m128i b)

此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个小于等于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。

__m128i __sparcace_fpcmpune64x_m128i(__m128i a, __m128i b)

此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个不等于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。

__m128i __sparcace_fpcmpugt64x_m128i(__m128i a, __m128i b)

此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个大于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。

__m128i __sparcace_fpcmpueq64x_m128i(__m128i a, __m128i b)

此函数将第一个参数的每个 unsigned long long 类型数字与第二个参数的对应 unsigned long long 类型数字进行比较。如果第一个等于第二个,则 __m128i 结果的对应 unsigned long long 类型数字的 MSB 设置为 1。0 到 62 位设置为 0。

__m128i __sparcace_fpadd64_m128i(__m128i a, __m128i b)

此函数通过将第一个参数的每个 unsigned long long 类型数字和第二个参数的 unsigned long long 类型数字相加来生成 __m128i 结果。

__m128i _mm_add_epi64(__m128i a, __m128i b)

这是 __sparcace_fpadd64_m128i() 的别名。

__m128i __sparcace_fpsub64_m128i(__m128i a, __m128i b)

此函数通过从第一个参数的 unsigned long long 类型数字中减去第二个参数的每个 unsigned long long 类型数字来生成 __m128i 结果。

__m128i _mm_sub_epi64(__m128i a, __m128i b)

这是 __sparcace_fpsub64_m128i() 的别名。

2.20.2 十进制浮点内部函数

SPARC64X 和 SPARC64X+ 支持十进制浮点数据类型和运算。数据格式符合 IEEE 754-2008 中定义的 64 位 DPD。编译器提供了用于处理数据的类型和多个函数。

2.20.2.1 类型和运算

要表示十进制浮点数,请在 dpd_conf.h 中声明 _Decimal64 内部函数类型。您必须在使用该类型之前包括头文件,如以下示例所示:

#include <dpd_conf.h>
int main(void) {
  _Decimal64 dd;
  ...
  return 0;
}

_Decimal64 类型

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

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

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

_Decimal64 类型变量

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

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

  • 可以是函数的返回值。

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

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

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

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

会为其他运算(例如,算术、比较或类型转换)提供内部函数。

_Decimal64 的文本字符串语法不受支持。请改用类型转换的内部函数。

_Decimal64 类型数字与 64 位二进制浮点数的内存对齐相同。

2.20.2.2 宏和 pragma

指定 -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 受支持。

2.20.2.3 内部函数

dpd_conf.h 中声明了下面所列的内部函数。它们在处理 _Decimal64 类型的变量时非常有用。

void __dpd64_store(const _Decimal64 src, _Decimal64 * const addr)

此函数将 src 存储到由 addr 寻址的内存中。addr 必须在 8 字节边界上对齐,否则无论 -xmemalign 设置为何都不会定义行为。

_Decimal64 __dpd64_load(const _Decimal64 * const addr)

该函数将从由 addr 寻址的内存中加载 _Decimal64 类型的值并返回该值。addr 必须在 8 字节边界上对齐,否则无论 -xmemalign 设置为何都不会定义行为。

_Decimal64 __dpd64_add(_Decimal64 src1, _Decimal64 src2)

该函数将添加 src1src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_sub(_Decimal64 src1, _Decimal64 src2)

此函数将从 src1 中减去 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_mul(_Decimal64 src1, _Decimal64 src2)

该函数将 src1src2 相乘并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_div(_Decimal64 src1, _Decimal64 src2)

此函数将用 src1 除以 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_abs(_Decimal64 src)

此函数将计算 src 的绝对值并返回结果。即使 src 发出 NaN 信号,也不会抛出浮点异常。

_Decimal64 __dpd64_neg(_Decimal64 src)

此函数将保留 src 的符号并返回结果。即使 src 发出 NaN 信号,也不会抛出浮点异常。

int __dpd64_cmpeq(_Decimal64 src1, _Decimal64 src2)

src1 等于 src2 时,此函数会返回非 0 值,否则将返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmpne(_Decimal64 src1, _Decimal64 src2)

src1 不等于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmpgt(_Decimal64 src1, _Decimal64 src2)

src1 大于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmpge(_Decimal64 src1, _Decimal64 src2)

src1 大于或等于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmplt(_Decimal64 src1, _Decimal64 src2)

src1 小于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmple(_Decimal64 src1, _Decimal64 src2)

src1 小于或等于 src2 时,该函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

_Decimal64 __dpd64_convert_from_int64(int64_t src)

此函数将 src 中的 64 位带符号整数值转换为十进制浮点值并返回结果。

_Decimal64 __dpd64_convert_from_uint64(uint64_t src)

此函数将 src 中的 64 位无符号整数值转换为十进制浮点值并返回结果。

_Decimal64 __dpd64_convert_from_double(double src)

此函数将 src 中的二进制浮点值转换为十进制浮点值并返回结果。

_Decimal64 __dpd64_convert_from_str(const char * restrict nptr, char ** restrict endptr);

此函数的行为就像在 "ISO/IEC TR 24732" 中定义的函数 strtod64() 那样,不同之处在于舍入方向固定为“到最接近的,偶数优先”。

int64_t __dpd64_convert_to_int64(_Decimal64 src)

此函数将 src 中的十进制浮点值转换为 64 位带符号整数值并返回结果。

uint64_t __dpd64_convert_to_uint64(_Decimal64 src)

此函数会将 src 中的十进制浮点值转换为 64 位无符号整数值并返回结果。

double __dpd64_convert_to_double(_Decimal64 src)

此函数将 src 中的十进制浮点值转换为二进制浮点值并返回结果。

char *__dpd64_convert_to_stre(_Decimal64 dec, char *buf, size_t n);

此函数将 dec%He 格式输出到由 buf 定位的内存中。精度与 dec 的系数一样长。输出字符串在第 (n-1) 个字符处(当字符串长度等于或大于 n 时)或者在字符串结尾处以空字符终止。dec 成功转换为字符串时,此函数返回 buf,否则它返回空指针。

char *__dpd64_convert_to_strf(_Decimal64 dec, char *buf, size_t n);

此函数将 dec%Hf 格式输出到由 buf 定位的内存中。精度与 dec 的系数一样长。输出字符串在第 (n-1) 个字符处(当字符串长度等于或大于 n 时)或者在字符串结尾处以空字符终止。dec 成功转换为字符串时,此函数返回 buf,否则它返回空指针。

int __dpd_getround(void)

此函数检索 _Decimal64 的当前舍入模式。该值在 dpd_conf.h 中进行定义,如下所示:

__DPD_ROUND_NEAREST

舍入到最接近的,偶数优先

__DPD_ROUND_TOZERO

舍入到零

__DPD_ROUND_POSITIVE

舍入到正无穷大

__DPD_ROUND_NEGATIVE

舍入到负无穷大

__DPD_ROUND_NEARESTFROMZERO

舍入到最接近的,远离零

_Decimal64 的舍入模式的初始值为 __DPD_ROUND_NEAREST。请注意,-fround 选项不改变 _Decimal64 的舍入模式。

int __dpd_setround(int r)

此函数会将 _Decimal64 的舍入模式设置为 rr 应为上面所列的值之一。它在成功时返回 0,在失败时返回非 0。