demiurg_spb 0 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Делаю асмовую вставку с инструкцией 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 63 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба 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 0 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Спасибо! Я так и понимаю, но интересно, почему компилятор матерится на SUBS и если я его сам меняю на SUB, в листинге я наблюдаю SUBS? Это баги или фичи, которые я не знаю? Хочется окончательного понимания.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Думаю, просто баг. cmp r3, #0 тоже не нужен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 26 января, 2016 Опубликовано 26 января, 2016 · Жалоба Ок. Укрепили меня в подозрениях. Напишу баг-репорт или даже два. Из интересных наблюдений: Размер прошивки при смене лишь только архитектуры с 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 0 28 января, 2016 Опубликовано 28 января, 2016 · Жалоба Один баг-репорт написал 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 1 28 января, 2016 Опубликовано 28 января, 2016 · Жалоба Один баг-репорт написал 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 29 января, 2016 Опубликовано 29 января, 2016 · Жалоба На французском бы я написал лучше))) Английский нигде не изучал, что запало в голову по мере чтения документации и не слишком частых вылазок за бугор, тем лишь и пользуюсь((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться