I'm writing some optimized functions for gcc-arm in a library that obuses 
shorts. So the problem I have is that in extremely many places resutls of my 
optimized functions are needlessly sign or zero extended. That is, gcc adds 
UXTH or SXTH opcode.

For example, imagine if I use clz instructions (count leading zeros). Result of 
the function will be positive number between 0 and 32. So, in places where 
result of that clz functions is assigned to a short int it shouldn't 
sign-extend the result.

I use inline asm, and it works with arm's armcc if I use short as a result of 
inline asm expression:

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 generates this code:
test_clz:
    CLZ      r0,r0
    BX       lr

GCC generates this code:
test_clz:
    clz   r0, r0
    sxth r0, r0    <--- offending line.
    bx   lr


any way to make gcc not sign-extend results?
Thank you

Reply via email to