Project

General

Profile

Bug #9479

Updated by Alexander Protsenko about 5 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

Back