Arlleex 189 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба Всем привет. Хочу оптимизировать алгоритм переупаковки битов. Смысл в том, что в некотором простом алгоритме обрабатываются бинарные данные, причем сразу "пачками" по разрядности регистра (32 бита). Банальный алгоритм "фильтрации" состояний кнопок матричной клавиатуры с помощью Си-шной операции '&' текущего и прошлого значения регистра на некотором интервале многократного семплирования. На выходе алгоритма имею регистр(-ы) с битами. Они все, естественно, не сходятся "как есть" с заложенным порядком в протоколе обмена. Значит, перед отправкой по интерфейсу их надо перекодировать в другой порядок. Соответственно, у меня есть регистр R0 (например) с исходными битами, и я хочу найти красивую удобную инструкцию копирования бита i из R0 в бит j в R1 (R1 как пример). Есть инструкция UBFX, но она копирует битовое поле строго в LSB регистра-назначения, что не подходит Найти то, что мне нужно что-то не смог. Или плохо смотрел? P.S. Видимо, придется на каждое "перенаправление" бита использовать пару UBFX + BFI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 3 hours ago, Arlleex said: Всем привет. Есть Bit-banding Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 189 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба И? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 4 часа назад, Arlleex сказал: Видимо, придется на каждое "перенаправление" бита использовать пару UBFX + BFI. typedef struct s_b { union { DWORD dw; struct { DWORD b0:1; DWORD b1:1; ... DWORD b30:1; DWORD b31:1; }; }; } s_b; void foo(void) { s_b src, dst; src.dw = var_1; dst.b0 = src.b10; dst.b1 = src.b11; dst.b2 = src.b12; dst.b3 = src.b8; ... dst.b28 = src.b23; dst.b29 = src.b20; dst.b30 = src.b24; dst.b31 = src.b25; var_2 = dst.dw; } Тупо в лоб на Си: Цитата 800060a: f3c3 2280 ubfx r2, r3, #10, #1 800060e: f362 0000 bfi r0, r2, #0, #1 dst.b1 = src.b11; 8000612: f3c3 22c0 ubfx r2, r3, #11, #1 8000616: f362 0041 bfi r0, r2, #1, #1 dst.b2 = src.b12; 800061a: f3c3 3200 ubfx r2, r3, #12, #1 800061e: f362 0082 bfi r0, r2, #2, #1 dst.b3 = src.b8; 8000622: f3c3 2200 ubfx r2, r3, #8, #1 8000626: f362 00c3 bfi r0, r2, #3, #1 dst.b4 = src.b7; 800062a: f3c3 12c0 ubfx r2, r3, #7, #1 800062e: f362 1004 bfi r0, r2, #4, #1 dst.b5 = src.b6; 8000632: f3c3 1280 ubfx r2, r3, #6, #1 8000636: f362 1045 bfi r0, r2, #5, #1 dst.b6 = src.b9; 800063a: f3c3 2240 ubfx r2, r3, #9, #1 800063e: f362 1086 bfi r0, r2, #6, #1 Видим, что Си все сделает за вас (без сдвигов и масок). Правда, смежные битики в одну транзакцию не объединяет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 189 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 7 часов назад, adnega сказал: Видим, что Си все сделает за вас (без сдвигов и масок)... У Вас какой тулз? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба Сдвиг + таблица Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 1 час назад, Arlleex сказал: У Вас какой тулз? Довольно старенький Цитата arm-none-eabi-gcc.exe (GNU Tools for Arm Embedded Processors 8-2019-q3-update) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 13 часов назад, dimka76 сказал: Есть Bit-banding Не в каждом Cortex-M он есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 13 минут назад, jcxz сказал: Не в каждом Cortex-M он есть. Как и Цитата UBFX + BFI Поэтому лучше не мудрить с ASM и сделать на Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 1 час назад, adnega сказал: Как и UBFX+BFI - есть в каждом Cortex-M3. См.тему - у ТС именно Cortex-M3. А значит у него однозначно они есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба Цитата Не в каждом Cortex-M он есть. Существует Cortex-M0. Есть там UBFX+BFI ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 8 минут назад, adnega сказал: Существует Cortex-M0. Есть там UBFX+BFI ? А ещё существуют STM8, только при чём тут они?? У автора Cortex-M3. Он это явно написал. Причём тут Cortex-M0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 22 минуты назад, jcxz сказал: А ещё существуют STM8, только при чём тут они?? У автора Cortex-M3. Он это явно написал. Причём тут Cortex-M0? Тогда можете показать Cortex-M без Bit-banding ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 189 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба Cortex-M3 у меня, да. Но bit-banding он просто сожрет куда больше тактов - не гуд. Остановился на UBFX + BFI; на оптимизации Си-шный вариант как раз это генерит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2022 Опубликовано 19 апреля, 2022 · Жалоба 1 час назад, adnega сказал: Тогда можете показать Cortex-M без Bit-banding ? XMC4xxx. Cortex-M4 без bit-banding. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться