ZHCU876Z July 2001 – October 2023 SM320F28335-EP
表 7-9 中列出的内在函数可使用硬件快速整数除法支持功能更快速地执行除法运算。如果使用 --idiv_support=idiv0 编译器选项,则会启用这些内在函数。
若要使用这些内在函数,您的代码必须包含 stdlib.h
头文件,且 --float_support 选项必须设为 fpu32 或 fpu64。快速整数除法支持功能仅适用于 EABI。
这些内在函数遵循 ldiv 和 lldiv 标准库函数的格式。它们将 dividend 和 divisor 作为输入,并返回商和余数,分别显示在 quot 和 rem 字段中。__uldiv_t 和 __ulldiv_t 类型是由 stdlib.h
提供的 ldiv 和 lldiv 的无符号等效类型。此外,还额外提供了以下结构类型,以返回超长整型商和长整型余数:
typedef struct { long long quot; long rem; } __llldiv_t;
typedef struct { unsigned long long quot; unsigned long rem; } __ullldiv_t;
这些内在函数支持三种类型的整数除法:
在三种除法运算中,被除数 都等于商 * 除数 + 余数。如果余数为零或者被除数和除数为正数,则三种除法运算得出的商和余数都相同。
两个无符号值经过传统、欧几里得和模数除法计算得到的结果没有变化,因此只为无符号输入提供传统除法计算结果。
一般情况下,如果被除数和除数类型不同,除数会转换为被除数的类型,然后再进行计算。但是,如果被除数类型是有符号的,除数类型是无符号的,且被除数类型不大于除数类型,即对于 *_div_i32byu32 和 *_div_i64byu64 内在函数,则会使用比被除数和除数都更大的有符号类型执行除法运算,然后再转换为被除数的类型。
除以 0 的运算一直都是不明确的。
除了这些内在函数之外,当使用 --idiv_support=idiv0 编译器选项时,内置整数除法和模运算符(“/”和“%”)使用适当的更快速指令,如 节 7.8.2 中所述。无论是否包含 stdlib.h
头文件,都将使用这些内置运算符的更快速版本。
内在函数 | 汇编指令 | 说明 |
---|---|---|
16 位/16 位 | ||
ldiv_t __traditional_div_i16byi16( int dividend, int divisor ); |
|
返回 16 位/16 位传统除法的结果。 |
ldiv_t __euclidean_div_i16byi16( int dividend, int divisor ); |
|
返回 16 位/16 位欧几里得除法的结果。 |
ldiv_t __modulo_div_i16byi16( int dividend, int divisor ); |
|
返回 16 位/16 位模数除法的结果。 |
__uldiv_t __traditional_div_u16byu16( unsigned int dividend, unsigned int divisor); |
|
当被除数和除数无符号时,返回 16 位/16 位传统除法的无符号结果。 |
32 位/32 位 | ||
ldiv_t __traditional_div_i32byi32( long dividend, long divisor); |
|
返回 32 位/32 位传统除法的结果。 |
ldiv_t __euclidean_div_i32byi32( long dividend, long divisor ); |
|
返回 32 位/32 位欧几里得除法的结果。 |
ldiv_t __modulo_div_i32byi32( long dividend, long divisor ); |
|
返回 32 位/32 位模数除法的结果。 |
ldiv_t __traditional_div_i32byu32( long dividend, unsigned long divisor); |
|
当除数无符号时,返回 32 位/32 位传统除法的结果。 |
ldiv_t __euclidean_div_i32byu32( long dividend, unsigned long divisor ); |
|
当除数无符号时,返回 32 位/32 位欧几里得除法的结果。 |
ldiv_t __modulo_div_i32byu32( long dividend, unsigned long divisor ); |
|
当除数无符号时,返回 32 位/32 位模数除法的结果。 |
__uldiv_t __traditional_div_u32byu32( unsigned long dividend, unsigned long divisor); |
|
当被除数和除数无符号时,返回 32 位/32 位传统除法的无符号结果。 |
32 位/16 位 | ||
ldiv_t __traditional_div_i32byi16( long dividend, int divisor); |
|
返回 32 位/16 位传统除法的结果。 |
ldiv_t __euclidean_div_i32byi16( long dividend, int divisor ); |
|
返回 32 位/16 位欧几里得除法的结果。 |
ldiv_t __modulo_div_i32byi16( long dividend, int divisor ); |
|
返回 32 位/16 位模数除法的结果。 |
__uldiv_t __traditional_div_u32byu16( unsigned long dividend, unsigned int divisor); |
|
当被除数和除数无符号时,返回 32 位/16 位传统除法的无符号结果。 |
64 位/64 位 | ||
lldiv_t __traditional_div_i64byi64( long long dividend, long long divisor); |
|
返回 64 位/64 位传统除法的结果。 |
lldiv_t __euclidean_div_i64byi64( long long dividend, long long divisor); |
|
返回 64 位/64 位欧几里得除法的结果。 |
lldiv_t __modulo_div_i64byi64( long long dividend, long long divisor); |
|
返回 64 位/64 位模数除法的结果。 |
lldiv_t __traditional_div_i64byu64( long long dividend, unsigned long long divisor); |
|
当除数无符号时,返回 64 位/64 位传统除法的结果。 |
lldiv_t __euclidean_div_i64byu64( long long dividend, unsigned long long divisor); |
|
当除数无符号时,返回 64 位/64 位欧几里得除法的结果。 |
lldiv_t __modulo_div_i64byu64( long long dividend, unsigned long long divisor); |
|
当除数无符号时,返回 64 位/64 位模数除法的结果。 |
__ulldiv_t __traditional_div_u64byu64( unsigned long long dividend, unsigned long long divisor); |
|
当被除数和除数无符号时,返回 64 位/64 位传统除法的无符号结果。 |
64 位/32 位 | ||
__llldiv_t __traditional_div_i64byi32( signed long long dividend, long divisor); |
|
返回 64 位/32 位传统除法的结果。 |
__llldiv_t __euclidean_div_i64byi32( signed long long dividend, long divisor); |
|
返回 64 位/32 位欧几里得除法的结果。 |
__llldiv_t __modulo_div_i64byi32( signed long long dividend, long divisor); |
|
返回 64 位/32 位模数除法的结果。 |
__llldiv_t __traditional_div_i64byu32( signed long long dividend, unsigned long divisor); |
|
当除数无符号时,返回 64 位/32 位传统除法的结果。 |
__llldiv_t __euclidean_div_i64byu32( signed long long dividend, unsigned long divisor); |
|
当除数无符号时,返回 64 位/32 位欧几里得除法的结果。 |
__llldiv_t __modulo_div_i64byu32( unsigned long long dividend, unsigned long divisor); |
|
当除数无符号时,返回 64 位/32 位模数除法的结果。 |
__ullldiv_t __traditional_div_u64byu32( unsigned long long dividend, unsigned long divisor); |
|
当被除数和除数无符号时,返回 64 位/32 位传统除法的无符号结果。 |