|
IAR ARM ассемблер, Преобразовать процедуру в макрос |
|
|
|
Aug 28 2017, 13:42
|
Частый гость
 
Группа: Свой
Сообщений: 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-файла?
|
|
|
|
|
 |
Ответов
|
Aug 28 2017, 14:01
|
Местный
  
Группа: Свой
Сообщений: 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]
|
|
|
|
|
Aug 28 2017, 14:43
|
Частый гость
 
Группа: Свой
Сообщений: 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 не получится.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|