Actions
Bug #9479
closedНекорректная "оптимизация" в *.nml при конкатенации "::"
Start date:
02/06/2019
Due date:
% Done:
0%
Estimated time:
Detected in build:
svn
Platform:
Published in build:
Description
Некорректный код, из-за конкатенации "::"
tmp_qword = MEM[mem_index + 1]::MEM[mem_index]; tmp_word = tmp_qword<tmp_bit_offset + 31..tmp_bit_offset>;
Изменяем на код:
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>;
И получаем ту же самую ошибку, из-за конкатенации "::".
Предположительно из-за "оптимизации" кода, т.к. выражение во втором фрагменте, сводится к выражению из первого.
Корректный вариант:
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>; elif tmp_address_op<1..0> == 2 then tmp_word = tmp_dword1<15..0>::tmp_dword2<63..48>; else tmp_word = tmp_dword1<23..0>::tmp_dword2<63..56>; endif;
Связанная задача: #9472
Updated by Alexander Protsenko almost 6 years ago
Пояснение:
tmp_bit_offset = zero_extend(card(6), tmp_address_op<2..0>) * 8;
Правильный вариант кода:
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>; elif tmp_address_op<1..0> == 2 then tmp_word = tmp_dword1<15..0>::tmp_dword2<63..48>; else tmp_word = tmp_dword1<23..0>::tmp_dword2<63..56>; endif;
Updated by Alexander Kamkin almost 5 years ago
- Status changed from New to Closed
- Target version set to 2.5
Проблема в том, что tmp_bit_offset
имеет тип card(6)
, а не card(7)
.
При обрезании значения нужно выдавать предупреждение или ошибку. На это есть отдельная ошибка.
Actions