这不是一个微不足道的问题。
注意:我不需要意见或建议使用纯 asm。我实际上需要完成我正在谈论的事情:在将结果分配给短整数时,在没有这个符号/零扩展 optcode 的情况下获得内联 asm。
我正在处理一个为许多功能滥用 16 位短裤的库,并且我正在对其进行优化。我需要使用内联 asm 添加一些优化的函数。问题是在许多地方函数的结果被分配给一个短整数。也就是说,编译器生成 uxth 或 sxth arm 操作码。
我的目标是避免这个问题,并确保不会生成这个无用的操作码。首先,我需要定义我的优化函数以返回 short int。这样,如果它被分配给一个 int 或一个短 int 就没有额外的操作码来转换结果。
问题是我不知道如何跳过编译器在我自己的函数中生成的 int->short 转换。
像这样的愚蠢演员:*(short*)(void*)&value
不起作用。编译器要么开始弄乱堆栈制造问题,要么它仍然使用相同的 sxth 对结果进行符号扩展。
我为多个编译器编译,我能够为 arm 的 armcc 编译器解析它,但我无法用 GCC 完成它(我用 4.4.3 或 4.6.3 编译)。使用 armcc,我在内联 asm 语句中使用短类型。在 gcc 中,即使我使用短编译器仍然出于某种原因认为需要符号扩展。
这是一个我无法使用 GCC 的简单代码片段,关于如何让它工作的任何建议?对于这个简单的示例,我将使用 clz 指令:
示例文件test.c文件:
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;
armcc 重写 CLZ,则生成与 GCC 相同的结果。
使用 gcc 或 armcc 获取 asm 输出的快速行:
gcc -O3 -c test.c -o test.o && objdump -d test.o > test.s
armcc -O3 --arm --asm -c test.c