Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инструкция SUBS для armv6-m
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
demiurg_spb
Делаю асмовую вставку с инструкцией SUBS.
Для CM3 работало отлично.
Портирую софт под СМ1...
Код
        uint32_t cy;
        ...
        __asm__ __volatile__
        (
            "loop%=:"                 "\n\t"
            "    subs %[cnt],#1"  "\n\t"
            "    bne  loop%="     "\n\t"
            : [cnt]"+r"(cy)        // output:  +r means input+output
            :                           // input:
            : "cc"                     // clobbers:
        );

Получаю маты на этапе линковки (c LTO).
Код
... instruction not supported in Thumb16 mode -- 'subs r3,#1'

Меняю subs на sub - всё собирается молча, хотя и есть вопросы
Код
80034ba:    2304          movs    r3, #4
80034bc:    3b01          subs    r3, #1  - почему в листинге я вижу subs, хотя в asm вставке я написал sub?
80034be:    d1fd          bne.n    80034bc

Будет ли работать это - не факт, т.к. если написать этот цикл на чистом Си, компилятор под CM1 генерит следующее:
Код
8003522:    2304          movs    r3, #4
8003524:    3b01          subs    r3, #1
8003526:    2b00          cmp    r3, #0              - это вроде как излишне или нет???
8003528:    d1fc          bne.n    8003524

Прочитал ARMv6-M architecture reference manual, но так и не понял:

1) для armv6-m есть инструкция subs или только sub?
2) sub/subs для armv6-m изменяет состояние флагов в регистре статуса или нет?
aaarrr
Цитата
A6.7.65 SUB (immediate)
This instruction subtracts an immediate value from a register value, and writes the result to the destination
register. The condition flags are updated based on the result.


В синтаксисе всегда SUBS, кроме случая Rn = SP, тогда флаги не ставятся, и, соответственно SUB{<q>} {<Rd>,} SP, #<const>.
demiurg_spb
Цитата(aaarrr @ Jan 26 2016, 18:05) *

Спасибо!
Я так и понимаю, но интересно, почему компилятор матерится на SUBS и если я его сам меняю на SUB, в листинге я наблюдаю SUBS?
Это баги или фичи, которые я не знаю?
Хочется окончательного понимания..
aaarrr
Думаю, просто баг.
cmp r3, #0 тоже не нужен.
demiurg_spb
Цитата(aaarrr @ Jan 26 2016, 18:24) *
Ок. Укрепили меня в подозрениях.
Напишу баг-репорт или даже два.

Из интересных наблюдений:
Размер прошивки при смене лишь только архитектуры с corter-m3 (ARMv7-m) на corter-m1 (ARMv6-m) вырос на 22,5%
Тулчейн: gcc version 5.2.1 20151202 (release) [ARM/embedded-5-branch revision 231848] (GNU Tools for ARM Embedded Processors)
demiurg_spb
Один баг-репорт написал https://bugs.launchpad.net/gcc-arm-embedded/+bug/1538629
А другой баг - это и не баг вовсе оказался.
Для CM3 по умолчанию используется unified синтаксис ассемблера, а для CM0 CM1 используется синтаксис thumb-1.
Чтобы не писать все асмовые вставки дважды, достаточно сделать так:
Код
        __asm__ __volatile__
        (
            ".syntax unified"          "\n\t"  // is to prevent CM0,CM1 non-unified sintax
            ...
scifi
Цитата(demiurg_spb @ Jan 28 2016, 17:31) *
Один баг-репорт написал https://bugs.launchpad.net/gcc-arm-embedded/+bug/1538629

Лучше напишите без русского акцента:
"this instruction is redundant since the SUBS instruction above has already set condition flags properly"
laughing.gif

Update:
наверное, всё-таки "had already set". Вот трудно мне даётся past perfect tense...
demiurg_spb
Цитата(scifi @ Jan 28 2016, 18:09) *
На французском бы я написал лучше)))
Английский нигде не изучал, что запало в голову по мере чтения документации и не слишком частых вылазок за бугор, тем лишь и пользуюсь(((
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.