Цитата
Я так думаю.
К сожалению, гнуся, да еще и под PPC под рукой нет. Могу показать, как компилит аналогичный код IAR под ARM.
Код
void foo1(const char *, ...);
#pragma optimize=no_inline
void foo2(char c)
{
unsigned int d=123;
d=d-c;
foo1("blabla",d,c);
}
Код
SECTION `.text`:CODE:NOROOT(2)
ARM
// 135 void foo2(char c)
// 136 {
// 137 unsigned int d=123;
// 138 d=d-c;
// 139 foo1("blabla",d,c);
foo2:
MOV R2,R0
RSB R1,R0,#+123
LDR R0,??foo2_0 ;; `?<Constant "blabla">`
B foo1 ;; tailcall
DATA
??foo2_0:
DC32 `?<Constant "blabla">`
// 140 }
Обратите внимание, несмотря на размер переменной 8 бит (char c), компилятор не собирается прочищать какие-либо битики. Просто так договоренно, что этим занимается вызывающая функция.
Правда вот получить из IAR'а такое-же поведения, как и ожидаемое мной у гнуся, не получается - тот хоть и матом орет на неинициализированную переменную, но ноликом ее прочищает. Правда, на малых уровнях оптимизации он этого не делает, но зато втыкает and с мусорным регистром.
В общем, тут все зависит от поведения компилятора при вызове функции с неинициализированным аргументом. Рубль за сто, что там гнусь с регистром, в котором происходит передача параметра, ничего не делает, что летит только мусор...
Более точно нам может ответить топикстартер, показав асмовский листинг своего творения.
Цитата
ЗЫ. И интересно на всякий случай посмотреть на объявление Xuint8. Вдруг это пресловутый uint_least8_t?
Кстати, тоже вариант