ZHCUAU3J January 2018 – March 2024
C7000 编译器提供的第一组内在函数与应用多种标量和矢量类型的运算有关。因此,对于它们应用的每个操作,这些内在函数具有相同的名称并根据输入类型进行重载。这些内在函数属于重载函数,因此在支持的所有内在函数中是最抽象也是级别最高的。
例如,C7000 ISA 为字节矢量(最多 64 个元素的 VABSB)、半字矢量(最多 32 个元素的 VABSH)、字矢量(最多 16 个元素的 VABSW)、双字矢量(最多 8 个元素的 VABSD)、单精度浮点矢量(最多 16 个元素的 VABSSP)和双精度浮点矢量(最多 8 个元素的 VABSDP)定义了一组绝对值指令。尽管存在这种可变性,但在进行所有运算时都使用相同的内在函数名称,并且仅根据输入操作数类型来区分运算。这包含在 c7x.h
中,如下所示:
/*-----------------------------------------------------------------------------
* ID: __abs
*-----------------------------------------------------------------------------*/
VABSB
char = __abs(char);
char2 = __abs(char2);
char3 = __abs(char3);
char4 = __abs(char4);
char8 = __abs(char8);
char16 = __abs(char16);
char32 = __abs(char32);
char64 = __abs(char64);
VABSH
short = __abs(short);
short2 = __abs(short2);
short3 = __abs(short3);
short4 = __abs(short4);
short8 = __abs(short8);
short16 = __abs(short16);
short32 = __abs(short32);
VABSW
int = __abs(int);
int2 = __abs(int2);
int3 = __abs(int3);
int4 = __abs(int4);
int8 = __abs(int8);
int16 = __abs(int16);
VABSD
long = __abs(long);
long2 = __abs(long2);
long3 = __abs(long3);
long4 = __abs(long4);
long8 = __abs(long8);
VABSSP
float = __abs(float);
float2 = __abs(float2);
float3 = __abs(float3);
float4 = __abs(float4);
float8 = __abs(float8);
float16 = __abs(float16);
VABSDP
double = __abs(double);
double2 = __abs(double2);
double3 = __abs(double3);
double4 = __abs(double4);
double8 = __abs(double8);
只要使用内在函数名称(在本例中为 __abs(…)
),编译器就会为所使用的输入类型生成正确的对应指令。如需完整列表,请参阅 c7x.h
。