这不是一个简单的问题。
注意:我不需要使用纯汇编的意见或建议。我实际上需要完成我所说的事情:在将结果分配给short int时获取内联汇编,而无需此符号/零扩展操作码。
我正在处理一个滥用16位短整型的库,并对其进行优化。我需要添加一些带有内联汇编的优化函数。问题在于,在许多地方,函数的结果被分配给了short int。也就是说,编译器生成uxth或sxth arm操作码。
我的目标是避免这个问题,并确保不生成这个无用的操作码。 首先,我需要定义我的优化函数以返回short int。这样,如果它被分配给int或short int,就没有额外的操作码来转换结果。
问题在于,我不知道如何跳过编译器在我的函数内生成的int->short转换。
愚蠢的强制转换,例如:
我编译多个编译器,我已经能够解决armcc编译器的问题,但我无法在GCC(我使用4.4.3或4.6.3编译)中完成。在armcc中,我在内联汇编语句中使用short类型。即使我在gcc中使用short,编译器仍然认为需要符号扩展。
这是一个简单的代码片段,我无法让它在GCC中工作,请问如何让它工作?对于这个简单的示例,我将使用clz指令:
以下是使用armcc -c -O3编译后的预期结果:
请注意,如果使用内部变量
获取gcc或armcc的汇编输出的快速方法:
注意:我不需要使用纯汇编的意见或建议。我实际上需要完成我所说的事情:在将结果分配给short int时获取内联汇编,而无需此符号/零扩展操作码。
我正在处理一个滥用16位短整型的库,并对其进行优化。我需要添加一些带有内联汇编的优化函数。问题在于,在许多地方,函数的结果被分配给了short int。也就是说,编译器生成uxth或sxth arm操作码。
我的目标是避免这个问题,并确保不生成这个无用的操作码。 首先,我需要定义我的优化函数以返回short int。这样,如果它被分配给int或short int,就没有额外的操作码来转换结果。
问题在于,我不知道如何跳过编译器在我的函数内生成的int->short转换。
愚蠢的强制转换,例如:
*(short*)(void*)&value
不起作用。编译器要么开始搞乱堆栈,使问题变得更加复杂,要么仍然使用同样的sxth来符号扩展结果。我编译多个编译器,我已经能够解决armcc编译器的问题,但我无法在GCC(我使用4.4.3或4.6.3编译)中完成。在armcc中,我在内联汇编语句中使用short类型。即使我在gcc中使用short,编译器仍然认为需要符号扩展。
这是一个简单的代码片段,我无法让它在GCC中工作,请问如何让它工作?对于这个简单的示例,我将使用clz指令:
static __inline short CLZ(int n)
{
short ret;
#ifdef __GNUC__
__asm__("clz %0, %1" : "=r"(ret) : "r"(n));
#else
__asm { clz ret, n; }
#endif
return ret;
}
//test function
short test_clz(int n)
{
return CLZ(n);
}
以下是使用armcc -c -O3编译后的预期结果:
test_clz:
CLZ r0,r0
BX lr
以下是GCC -c -O3给我的不可接受的结果:
test_clz:
clz r0, r0
sxth r0, r0
bx lr
请注意,如果使用内部变量
int ret;
而不是short ret;
重写CLZ,则armcc生成的结果与GCC相同。获取gcc或armcc的汇编输出的快速方法:
gcc -O3 -c test.c -o test.o && objdump -d test.o > test.s
armcc -O3 --arm --asm -c test.c