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

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

Это сработало!

Осталось выделение R0-R3 отдать на откуп компиилятору.

Дочитал раздел описания llvm до конца, нашел про модификаторы.

Мое битье пока ни к чему не привело, но может вас натолкнет на мысли:

         "     STMIA %5!, %M0 \n"

/tmp/ccfqO5Uk.s:684: Error: bad range in register list -- `stmia r2!,{r0-r0}'

 

2 минуты назад, Arlleex сказал:

LDM/STM пофигу, в каком порядке перечислены в {reglist}.

Но gcc ругается:

Цитата

/tmp/cczFIC5s.s:684: Warning: register range not in ascending order

 

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


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

8 минут назад, Сергей Борщ сказал:

Мое битье пока ни к чему не привело, но может вас натолкнет на мысли:

Нет, так я тоже пробовал - не переваривает.  :sad:

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


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

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

Нет, так я тоже пробовал

Изменено: опять поспешил.

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


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

В 12.04.2023 в 14:55, Arlleex сказал:

LDM/STM пофигу, в каком порядке перечислен {reglist}. Там в КОП инструкции эти регистры отмечаются битовой маской. А инструкция проходится по списку этих битов, начиная с младшего.

Поэтому важен порядок лишь загрузки данных в сами регистры, а не то, как они выглядят в списке LDM/STM.

Это понятно. Но как компилятору объяснить, что порядок в reg_list имеет значение? GCC выдает предупреждение, но как заставить соблюдать порядок номеров регистров?

 

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


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

1 час назад, Сергей Борщ сказал:

Мое битье пока ни к чему не привело, но может вас натолкнет на мысли:

С одним %M0 всё прекрасно работает:  STMIA %5!, %M0

Но как туда вставить более чем один регистр??? Перепробовал уже кучу разных вариантов:

STMIA %5!, %M0,%M1

STMIA %5!, %M0,1

STMIA %5!, %M0...%M1

STMIA %5!, %M0-%M1

STMIA %5!, %M0-1

STMIA %5!, %M0...1

...

ничего не сработало.  :sad:

На некоторых типа: STMIA %5!, %M(0,1)  IAR вообще виснет намертво.

 

Максимум - 2 регистра позволяет  впихнуть:

    u64 q;
    asm(
      "p01: LDR   %L0, [%1, #8 * 1]  \n"
      "     LDR   %H0, [%1, #8 * 2]! \n"
      "     SUBS  %3, %3, #2         \n"
      "     STMIA %2!, %M0 \n"
      "     BNE      p01"
      : "=&Rp"(q)
      : "r"(p0), "r"(p1), "r"(i)
      : "cc", "memory");
    q = q;

но уже начинаются приколы..... :sad:

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


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

3 часа назад, jcxz сказал:

Но как туда вставить более чем один регистр???

Вот и я на этом споткнулся. Ничего более продуктивного, чем ковырять исходники gcc или llvm в голову не пришло, а на это нет свободного времени. Так что "сама-сама-сама". Если вдруг победите - поделИтесь решением, может когда-нибудь кому-нибудь пригодится.

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


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

Нашел старенький, но ответ.

Цитата
> So how should I go about wrapping ldm / stm for usage in C land?
There is in general no way to do that.
Sorry.

 

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


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

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

старенький, но ответ

"однако за время пути собака могла подрасти".

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


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

On 4/12/2023 at 7:44 PM, Сергей Борщ said:

может когда-нибудь кому-нибудь пригодится.

Когда-нибудь это просто затеряется в мильене других сообщений форума и никто не найдет 😉

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


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

53 минуты назад, dimka76 сказал:

и никто не найдет 😉

Гугля уже находит эту ветку.

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


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

1 час назад, Сергей Борщ сказал:

Гугля уже находит эту ветку.

Мы меняем мир к лучшему!  :smile:

PS: Хех! - этот микроскопический кусочек на асм уменьшил общую загрузку CPU на ~0.5%! :dance4:  Что существенно, так как при выполнении некоторых операций загрузка CPU иногда превышает 80%. А работа - real-time, не терпит промедлений.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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