ZHCUAU3J January 2018 – March 2024
还提供了内在函数,以促进内在函数与相应 C7000 指令之间的直接映射。因此,这些内在函数不会过载;它们是通过从硬件中进行少量抽象化而得出的,并且被认为是低级别。这些低级别内在函数的主要目的是确保不会生成除程序员所需指令以外的其他指令。这对于需要在输入时操作数交错 或在输出时操作数去交错 的操作特别有用。
所有直接映射的内在函数都列在顶层 c7x.h
文件所含的 c7x_direct.h
中。
例如,C7000 指令 VCMATMPYHW(向量复数矩阵乘法)要求其第二个源操作数沿 64 位边界交错。它还要求其输出也沿 64 位边界去交错。如 c7x.h
和 c7x_direct.h
所列,C7000 编译器为此指令提供了两个接口:
/*-----------------------------------------------------------------------------
* ID: __cmatmpy_ext
*----------------------------------------------------------------------------*/
/*
VCMATMPYHW
cint2 = __cmatmpy_ext(cshort2, cshort4);
cint4 = __cmatmpy_ext(cshort4, cshort8);
cint8 = __cmatmpy_ext(cshort8, cshort16);
*/
/*-----------------------------------------------------------------------------
* ID: __vcmatmpyhw_vww
*----------------------------------------------------------------------------*/
/*
VCMATMPYHW
__vcmatmpyhw_vww(cshort16, cshort16, cshort16, cint8&, cint8&);
*/
如果选择使用过载的“__cmatmpy_ext(…)”内在函数,编译器将假定输入和输出数据都是非交错的,并将尝试对此进行抽象处理。因此,编译器将在指令执行之前插入特殊指令以交错输入,并在指令执行之后插入特殊指令以去交错输出。这种方法便于程序员使用,但却以牺牲指令周期为代价。
更高级的编程器可能会选择使用直接映射的低级别“__vcmatmpyhw_vww(…)”内在函数,并自行管理交错和去交错。在这种情况下,交错输入显示为一对 cshort16
向量,输出显示为一对 cint8
向量,每个向量由 VCMATMPYHW 指令支持的最大宽度和基本类型确定。