This is similar to the discussion that happened some time ago about
extending return values. The decisions for that was that the callee
could just leave the higher bits undefined and the caller would
extent the result if it needed to.
We have a similar issue with function arguments. We compile
void g(short);
void f(short a) {
g(a);
}
into
f:
.LFB2:
movswl %di,%edi
jmp g
we should really be able to remove the movswl. If the caller
is required to do sign extension, who called f has
extended the argument already. If the callee is required,
then g will do it and there is no need for f to do it.
What is more interesting is the case
void g(int);
void f(short a) {
g(a);
}
Can f assume that its caller did a sign extension or
it is its responsibility to extend A?
Cheers,
--
Rafael Avila de Espindola
Google | Gordon House | Barrow Street | Dublin 4 | Ireland
Registered in Dublin, Ireland | Registration Number: 368047