Для 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:
);
...
__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
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
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 изменяет состояние флагов в регистре статуса или нет?