[sisyphus] Странности при переходе объединении двух целых в вещественное на x86_64

Roman Savochenko rom_as на diyaorg.dp.ua
Чт Авг 6 11:17:09 MSD 2009


Alexey Rusakov wrote:
>> Имеется некая целевая задачка собрать из двух 16-разрядных целых 
>> вещественное (float), 32 разряда.
>> Казалось-бы тривиальная задача, которая решается кодом типа
>> int w1 = 62915, w2 = 16456;
>> ui32 vl = ((w2&0xffff)<<16) | w1&0xffff;
>> //sleep(1);
>> printf("TEST 00: %f\n",*(float*)&vl);
>>
>> И как ожидалось на x86_32 он работает корректно при различной нагрузке.
>> А вот на x86_64 замечается ситуация когда вместо 3.14 получаем ноль.
>> Причём в тестовой программке с единственным потоком всё работает 
>> нормально, а на высоконагруженном процессе с десятками потоков, из 
>> которых около пяти работают с периодом 5мс. устойчиво получатся 0.
>> Если раскомментирую sleep, то получаю номальный результат 3.14.
>>
>> Кто нибуть может такое поведение объяснить?
>>     
> Объяснить не могу, но поиграйтесь с опциями отладки и оптимизации(-O,
> -g) и смотрите объектный код, генерируемый компилятором (-S).
>   
Да действительно, проблема связана с ключом -O2. Сменил на -O1 всё 
заработало нормально.

Багу на компилятор по этому поводу вешать?

С уважением, Роман
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : rom_as.vcf
Тип     : text/x-vcard
Размер  : 229 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20090806/b9d5a85f/attachment.vcf>


Подробная информация о списке рассылки Sisyphus