Bug #9479
Updated by Alexander Protsenko almost 6 years ago
Некорректный код, из-за конкатенации "::" <pre> tmp_qword = MEM[mem_index + 1]::MEM[mem_index]; tmp_word = tmp_qword<tmp_bit_offset + 31..tmp_bit_offset>; </pre> Изменяем на код: <pre> tmp_dword1 = MEM[mem_index + 1]; tmp_dword2 = MEM[mem_index]; tmp_qword = tmp_dword1::tmp_dword2; tmp_word = tmp_qword<tmp_bit_offset + 31..tmp_bit_offset>; </pre> И получаем ту же самую ошибку, из-за конкатенации "::". Предположительно из-за "оптимизации" кода, т.к. выражение во втором фрагменте, сводится к выражению из первого. Корректный вариант: <pre> tmp_dword1 = MEM[mem_index + 1]; tmp_dword2 = MEM[mem_index]; if tmp_address_op<1..0> == 1 then tmp_word = tmp_dword1<7..0>::tmp_dword2<63..40>; tmp_dword1<7+32..0+32>::tmp_dword2<31+32..8+32>; elif tmp_address_op<1..0> == 2 then tmp_word = tmp_dword1<15..0>::tmp_dword2<63..48>; tmp_dword1<15+32..0+32>::tmp_dword2<31+32..16+32>; else tmp_word = tmp_dword1<23..0>::tmp_dword2<63..56>; tmp_dword1<23+32..0+32>::tmp_dword2<31+32..24+32>; endif; </pre> Связанная задача: #9472