Project

General

Profile

Actions

Bug #9479

closed

Некорректная "оптимизация" в *.nml при конкатенации "::"

Added by Alexander Protsenko almost 6 years ago. Updated almost 5 years ago.

Status:
Closed
Priority:
Normal
Category:
nML Translator
Target version:
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

Actions #1

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;

Actions #2

Updated by Alexander Protsenko almost 6 years ago

  • Description updated (diff)
Actions #3

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

Also available in: Atom PDF