Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: умножение для ARM7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zhek
Господа, знает кто-нибудь, как заставить компилятор (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. И результат правильный, и время небольшое.
Можно написать свою ассемблерную функцию, но в ней нужно будет сохранять регистры в стеке, а это опять потери времени. Компилятор мог бы это сделать лучше, т. к. переменные уже лежат в регистрах.
vmp
Что-то вы не так делаете:
Код
##############################################################################
#                                                                            #
# 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 делается вызов библиотечной функции.
zhek
Спасибо, я действительно делал не так, как написал)) Теперь все работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.