реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
demiurg_spb
сообщение Jan 26 2016, 14:56
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 26 2016, 15:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата
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>.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 26 2016, 15:13
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(aaarrr @ Jan 26 2016, 18:05) *

Спасибо!
Я так и понимаю, но интересно, почему компилятор матерится на SUBS и если я его сам меняю на SUB, в листинге я наблюдаю SUBS?
Это баги или фичи, которые я не знаю?
Хочется окончательного понимания..


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 26 2016, 15:24
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Думаю, просто баг.
cmp r3, #0 тоже не нужен.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 26 2016, 15:32
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(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)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 28 2016, 14:31
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 28 2016, 15:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(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...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 29 2016, 13:10
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Jan 28 2016, 18:09) *
На французском бы я написал лучше)))
Английский нигде не изучал, что запало в голову по мере чтения документации и не слишком частых вылазок за бугор, тем лишь и пользуюсь(((


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 22:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016