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

Есть ли в Cortex-M3 инструкция копирования битов?

Всем привет.

Хочу оптимизировать алгоритм переупаковки битов. Смысл в том, что в некотором простом алгоритме обрабатываются бинарные данные, причем сразу "пачками" по разрядности регистра (32 бита). Банальный алгоритм "фильтрации" состояний кнопок матричной клавиатуры с помощью Си-шной операции '&' текущего и прошлого значения регистра на некотором интервале многократного семплирования. На выходе алгоритма имею регистр(-ы) с битами. Они все, естественно, не сходятся "как есть" с заложенным порядком в протоколе обмена. Значит, перед отправкой по интерфейсу их надо перекодировать в другой порядок. Соответственно, у меня есть регистр R0 (например) с исходными битами, и я хочу найти красивую удобную инструкцию копирования бита i из R0 в бит j в R1 (R1 как пример). Есть инструкция UBFX, но она копирует битовое поле строго в LSB регистра-назначения, что не подходит:negative: Найти то, что мне нужно что-то не смог. Или плохо смотрел?

P.S. Видимо, придется на каждое "перенаправление" бита использовать пару UBFX + BFI.

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


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

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

Видим, что Си все сделает за вас (без сдвигов и масок). Правда, смежные битики в одну транзакцию не объединяет.

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


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

7 часов назад, adnega сказал:

Видим, что Си все сделает за вас (без сдвигов и масок)...

У Вас какой тулз?

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


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

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]

 

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


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

13 минут назад, jcxz сказал:

Не в каждом Cortex-M он есть.

Как и

Цитата

UBFX + BFI

Поэтому лучше не мудрить с ASM и сделать на Си.

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


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

1 час назад, adnega сказал:

Как и

UBFX+BFI - есть в каждом Cortex-M3. См.тему - у ТС именно Cortex-M3. А значит у него однозначно они есть.

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


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

Цитата

Не в каждом Cortex-M он есть.

Существует Cortex-M0. Есть там UBFX+BFI ?

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


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

8 минут назад, adnega сказал:

Существует Cortex-M0. Есть там UBFX+BFI ?

А ещё существуют STM8, только при чём тут они??

У автора Cortex-M3. Он это явно написал. Причём тут Cortex-M0?

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


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

22 минуты назад, jcxz сказал:

А ещё существуют STM8, только при чём тут они??

У автора Cortex-M3. Он это явно написал. Причём тут Cortex-M0?

Тогда можете показать Cortex-M без Bit-banding ?

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


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

Cortex-M3 у меня, да. Но bit-banding он просто сожрет куда больше тактов - не гуд.

Остановился на UBFX + BFI; на оптимизации Си-шный вариант как раз это генерит.

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


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

1 час назад, adnega сказал:

Тогда можете показать Cortex-M без Bit-banding ?

XMC4xxx. Cortex-M4 без bit-banding.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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