Task #4094
closed[template] Отладка шаблона Euclide
Added by Alexander Kamkin over 11 years ago. Updated over 10 years ago.
100%
Description
Выяснить причину зацикливания и устранить (возможно с помощью Андрея).
Updated by Andrei Tatarnikov over 11 years ago
Проблема 1: FIXED - Revision r1188
Неправильная конкатенация буферов.
При трансляции конструкций типа:
carry::ALU_OUT = GPR[src2] + src3;
(где "::" означает конкатенацию: carry - higher part, ALU_OUT - lower part) получается Java код типа:
carry.access().concat(ALU_OUT.access())
Метод concat неправильно объединяет буферы. Получается, что: carry - lower part, а ALU_OUT - higher part.
Должно быть наоборот.
Проблема 2: FIXED - Revision r1189
Проблема при симуляции следующего шаблона:
CMP blank, REG(0), register1 SUB greaterThan, setsOff, REG(0), REG(0), register1 SUB lessThan, setsOff, REG(1), REG(1), register0
Выполняются обе команды SUB (обе изменяют значение регистров), хотя должна выполняться только одна, а вторая не выполнять никаких действий. Похоже, что-то нет с флагами, которые выставляет CMP или с проверкой этих флагов.
Проблема может быть в спецификации (Sim-nML) или в API модели. Нужно разбираться.
Похоже, что-то к коде инструкции CMP не чисто (Sim-nML). Нужно разбираться.
Нашёл проблему. Спецификация условия greaterThan отличалась от, того что написано в ARM Reference Manual.
Updated by Andrei Tatarnikov over 11 years ago
После исправления Sim-nML спецификации зацикливание прекратилось (я обновил примитивы условий greaterThan и lessThan в соответствии с ARM Reference Manual). Корректность остальных аспектов работы алгоритма Евклида нужно проверять.
Updated by Andrei Tatarnikov over 11 years ago
Вообще зацикливание всё же не совсем пропало - пару раз удалось воспроизвести. Но теперь в большинстве случаев цикл завершается. Нужно отлаживать дальше.
Updated by Alexander Kamkin over 11 years ago
- Assignee changed from Artemiy Utekhin to Andrei Tatarnikov
Updated by Andrei Tatarnikov almost 11 years ago
- Status changed from New to Open
Сейчас arm_demo_euclid.rb не работает. Не реализованы некоторые операции над битовыми векторами. До реакторинга IR, эти операции выполнялись над встроенными типами Java. Нужно дореализовать все операции или вернуть старое поведение.
Updated by Alexander Kamkin over 10 years ago
- Due date set to 04/30/2014
- Priority changed from Normal to High
- Target version set to 2.0
Updated by Andrei Tatarnikov over 10 years ago
- Status changed from Open to Resolved
- % Done changed from 40 to 100
Нашел ещё одну причину зацикливания и исправил её в r1876. Теперь вроде бы всё нормально.
Проблема была в следующем: Шаблон описывает программу, которая ищет наибольших общий делитель для двух случайных чисел. Если одно из них равно нулю, что поиск решения не имеет смысла (результат не определён). Алгоритм не предусматривает этот случай и программа зацикливается. Исключил 0 из возможных значений.
Также разделил данный пример на два и описал в комментариях:
- arm_demo_euclid.rb (простой вариант - ищет решение один раз)
- arm_demo_euclid_loop.rb (исходный вариант - ищёт решение пять раз, дублирует код при помощи цикла, даёт длинную программу с пятью метками)
Updated by Alexander Kamkin over 10 years ago
- Status changed from Resolved to Closed
- Published in build set to 140417