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

 
 
 
Reply to this topicStart new topic
> умножение для ARM7, long*long=long long
zhek
сообщение Oct 8 2009, 08:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692



Господа, знает кто-нибудь, как заставить компилятор (IAR) использовать команду SMULL? Пример такой:
long x, y;
long long z;

z = x*y;//генерится команда MUL, умножение делается в long, старшие 32 бита отбрасываются, потом дополняются до long long знаком, результат неправильный
z=(long long)x*y;//генерится набор команд для выполнения 64-битного умножения, результат правильный, но вычисления занимают большое время

А как бы использовать SMULL, тогда получим long*long = long long. И результат правильный, и время небольшое.
Можно написать свою ассемблерную функцию, но в ней нужно будет сохранять регистры в стеке, а это опять потери времени. Компилятор мог бы это сделать лучше, т. к. переменные уже лежат в регистрах.
Go to the top of the page
 
+Quote Post
vmp
сообщение Oct 8 2009, 09:07
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Что-то вы не так делаете:
Код
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.41A/W32 EVALUATION    08/Oct/2009  12:55:42 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
#                                                                            #
#    Cpu mode        =  interwork                                            #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
[i](путм поскипаны)[/i]
##############################################################################


   \                                 In segment CODE, align 4, keep-with-next
smull.c
      1          long long mysmull(long a, long b)
      2          {
      3           return (long long)a * b;
   \                     ??mysmull:
   \   00000000   9021C3E0           SMULL    R2,R3,R0,R1
   \   00000004   0200A0E1           MOV      R0,R2
   \   00000008   0310A0E1           MOV      R1,R3
   \   0000000C   1EFF2FE1           BX       LR            ;; return
      4          }

   Maximum stack usage in bytes:

     Function            CSTACK
     --------            ------
     mysmull(long, long)     0


   Segment part sizes:

     Function/Label      Bytes
     --------------      -----
     mysmull(long, long)   16
      Others                4


20 bytes in segment CODE

16 bytes of CODE memory (+ 4 bytes shared)

Errors: none
Warnings: none

P.S. На 5.20 - то же самое. Код должен генериться для режима ARM, в THUMB делается вызов библиотечной функции.
Go to the top of the page
 
+Quote Post
zhek
сообщение Oct 8 2009, 09:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692



Спасибо, я действительно делал не так, как написал)) Теперь все работает.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 22:28
Рейтинг@Mail.ru


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