Перейти к содержанию
    

Инструкция SUBS для armv6-m

Делаю асмовую вставку с инструкцией 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 изменяет состояние флагов в регистре статуса или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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>.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

Я так и понимаю, но интересно, почему компилятор матерится на SUBS и если я его сам меняю на SUB, в листинге я наблюдаю SUBS?

Это баги или фичи, которые я не знаю?

Хочется окончательного понимания..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ок. Укрепили меня в подозрениях.

Напишу баг-репорт или даже два.

 

Из интересных наблюдений:

Размер прошивки при смене лишь только архитектуры с 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Один баг-репорт написал 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
            ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Один баг-репорт написал 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:

 

Update:

наверное, всё-таки "had already set". Вот трудно мне даётся past perfect tense...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На французском бы я написал лучше)))

Английский нигде не изучал, что запало в голову по мере чтения документации и не слишком частых вылазок за бугор, тем лишь и пользуюсь(((

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...