реклама на сайте
подробности

 
 
> IAR ARM ассемблер, Преобразовать процедуру в макрос
Sergey_Aleksandr...
сообщение Aug 28 2017, 13:42
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Здравствуйте. В проекте функция реализована как ассемблерная процедура. Состоит из одной инструкции и хотелось бы преобразовать её в макрос, чтобы не тратить такты на вход и выход.
Реализована в *.s файле в виде
Код
    SECTION .text:CODE:NOROOT(2)
    PUBLIC MULSHIFT32
    THUMB
MULSHIFT32
    smull    r2, r0, r1, r0
    BX lr

Далее используется в *.c файлах как обычная функция b2 = MULSHIFT32(*cptr++, a1 - a2) << (s1);

Не зная тонкостей синтаксиса ассемблера IAR попробовал "в лоб" реализовать таким образом
Код
MULSHIFT32 MACRO
    smull    r2, r0, r1, r0
    ENDM


Линкер ругается на неизвестное имя MULSHIFT32. Ключевые слова PUBLIC и EXTERN вызывают ошибку. Кто подскажет, как этот макрос правильно оформить, чтобы можно было использовать его вне *.s-файла?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VladislavS
сообщение Aug 28 2017, 14:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Не занимайтесь ерундой. Умножать с нужной разрядностью - дело компилятора.

Код
  int32_t x=1L,y=2L;
  int64_t z;
  z = (int64_t)x*y;


Дадут вам
Код
//  106   int32_t x=1L,y=2L;
        MOVS     R0,#+1
        STR      R0,[SP, #+4]
        MOVS     R0,#+2
        STR      R0,[SP, #+0]
//  107   int64_t z;
//  108   z = (int64_t)x*y;
        LDR      R0,[SP, #+4]
        LDR      R1,[SP, #+0]
        SMULL    R0,R1,R1,R0
        STRD     R0,R1,[SP, #+8]
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Aug 28 2017, 14:43
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



VladislavS, спасибо за идею. Это не совсем то, что нужно, но получилось слегка ускорить алгоритм.
Создал обычный макрос
Код
#define MULSHIFT32(arg1, arg2)    ((((long long)arg1)*((long long)arg2))>>32)

Всё-равно получается избыточно, если верить листингу.

Было до
Код
        b0 = a0 + a7;       b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
      0x59ac0: 0xf8d4 0xa010  LDR.W     R10, [R4, #0x10]
        b0 = a0 + a7;       b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
      0x59ac4: 0x1846         ADDS      R6, R0, R1
        b0 = a0 + a7;       b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
      0x59ac6: 0x1a09         SUBS      R1, R1, R0
      0x59ac8: 0xf855 0x0b04  LDR.W     R0, [R5], #0x4
      0x59acc: 0xf7fd 0xf9ea  BL        MULSHIFT32             ; 0x56ea4
        MULSHIFT32:
              0x56ea4: 0xfb81 0x2000  SMULL     R2, R0, R1, R0
              0x56ea8: 0x4770         BX        LR
      0x59ad0: 0x4680         MOV       R8, R0
      0x59ad2: 0xea4f 0x0848  LSL.W     R8, R8, #1


Стало после
Код
        b0 = a0 + a7;       b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
      0x58dee: 0xf851 0x6b04  LDR.W     R6, [R1], #0x4
      0x58df2: 0x17f7         ASRS      R7, R6, #31
      0x58df4: 0x17e5         ASRS      R5, R4, #31
      0x58df6: 0x17d3         ASRS      R3, R2, #31
      0x58df8: 0x1aa2         SUBS      R2, R4, R2
      0x58dfa: 0xeb65 0x0303  SBC.W     R3, R5, R3
      0x58dfe: 0x4634         MOV       R4, R6
      0x58e00: 0x463d         MOV       R5, R7
      0x58e02: 0xfba2 0x6704  UMULL     R6, R7, R2, R4
      0x58e06: 0xfb02 0x7705  MLA       R7, R2, R5, R7
      0x58e0a: 0xfb03 0x7704  MLA       R7, R3, R4, R7
      0x58e0e: 0x46b8         MOV       R8, R7
      0x58e10: 0xea4f 0x0848  LSL.W     R8, R8, #1


В моём случае объявить, как в Вашем примере 64-битную переменную и положить в неё результат 32х32 не получится.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 28 2017, 15:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Sergey_Aleksandrovi4 @ Aug 28 2017, 17:43) *
Код
#define MULSHIFT32(arg1, arg2)    ((((long long)arg1)*((long long)arg2))>>32)

Если Вам нужны только старшие 32 бита (как следует из этого макроса), то всё просто:
#define MULSHIFT32(x, y) __SMMUL(x, y)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sergey_Aleksandrovi4   IAR ARM ассемблер   Aug 28 2017, 13:42
- - scifi   Из любопытства попробовал на GCC вот такое: Код#de...   Aug 28 2017, 15:18
- - VladislavS   Во-первых, очень некрасиво не показывать типы испо...   Aug 28 2017, 16:00
|- - jcxz   Цитата(VladislavS @ Aug 28 2017, 19:00) П...   Aug 28 2017, 16:04
- - VladislavS   Дарю Код#define MULSHIFT32(arg1, arg2) ...   Aug 28 2017, 16:14
|- - jcxz   Цитата(VladislavS @ Aug 28 2017, 19:14) Д...   Aug 30 2017, 08:26
- - scifi   Кстати, если в моём эксперименте с GCC сделать так...   Aug 29 2017, 09:41
- - Sergey_Aleksandrovi4   jcxz, всё верно, чужие библиотеки. Портирую mp3-де...   Aug 29 2017, 09:53
|- - jcxz   Цитата(Sergey_Aleksandrovi4 @ Aug 29 2017, 12...   Aug 29 2017, 10:58
- - scifi   Цитата(Sergey_Aleksandrovi4 @ Aug 29 2017, 12...   Aug 29 2017, 10:29
- - Sergey_Aleksandrovi4   Цитата(scifi @ Aug 29 2017, 13:29) Это ма...   Aug 29 2017, 13:04
- - VladislavS   Если есть возможность не уходить от чистого С/C++,...   Aug 30 2017, 11:34
|- - scifi   Цитата(VladislavS @ Aug 30 2017, 14:34) К...   Aug 30 2017, 16:28
- - VladislavS   Не надо ничего ловить. Надо правильно применять яз...   Aug 30 2017, 17:58
|- - jcxz   Цитата(VladislavS @ Aug 30 2017, 20:58) С...   Aug 30 2017, 20:18
- - VladislavS   Могли бы показать пример кода, где вы CLZ применяе...   Aug 31 2017, 03:58
|- - jcxz   Цитата(VladislavS @ Aug 31 2017, 06:58) М...   Aug 31 2017, 06:12
|- - VladislavS   Цитата(jcxz @ Aug 31 2017, 09:12) А какой...   Aug 31 2017, 07:53
|- - jcxz   Цитата(VladislavS @ Aug 31 2017, 10:53) U...   Aug 31 2017, 08:35
- - KRS   Так у IAR теперь есть GCC inline assembler так что...   Aug 31 2017, 11:15
|- - Obam   Цитата(KRS @ Aug 31 2017, 15:15) Так у IA...   Aug 31 2017, 14:41
|- - KRS   Цитата(Obam @ Aug 31 2017, 17:41) IAR с G...   Sep 3 2017, 17:13
- - Obam   Да, но не GCC.   Sep 4 2017, 07:36
- - KRS   Цитата(Obam @ Sep 4 2017, 10:36) Да, но н...   Sep 4 2017, 08:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016