Jump to content
    

LDM/STM в inline asm

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...