Помогите с оптимизацией

Тема в разделе "WASM.ASSEMBLER", создана пользователем yaskhan, 28 ноя 2011.

  1. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Подскажите пожалуйста как можно оптимизировать такую конструкцию?

    тут может и быть или не быть:
    Код (Text):
    1. shl r2,1
    и дальше:

    Код (Text):
    1. cmp r1,r2
    2. j[cond] label
    3. add r1,r2
    4. mov r0,r1
    5. label:
    и еще сработает ли такое в FASMe:

    Код (Text):
    1. macro haha
    2. {irps inst, add sub mov shl shr ; и т.д.
    3. \{
    4.             irps cond, eq c z ae ge b nc ne le l be a o no s ns ; и т.д.
    5.     \\{
    6.         ;inst\#cond fix inst cond ,
    7.     \\}
    8. \}
    9. }
    addeq fix add eq,
    addz fix add z,
    и т.д.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    yaskhan
    Оптимизация по скорости или по величине кода?
    shl r1,1 можно заменить на
    1) add r1,r1
    2) imul r1,2
    3) lea r1,[r1+r1]
    4) lea r1,[r1*2]
     
  3. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    --Оптимизация по скорости или по величине кода?
    по скорости

    мне надо избавится от прыжка

    короче хочу создать эквивалент АРМ типа addeq r0,r1,r2,shl,1

    макрос уже создал, но думал что можно оптимизировать.
    Хочу создать АРМ\Интел\32\64 совместимый ассемлер на основе ФАСМ макросов
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    yaskhan
    по скорости нужно делать цикл в 1000000 и замерять количество тактов через RDTSC лучше перечитай цикл статей Агнера Фога на сайте, но лучше всего тебе сможет ответить leo
    r0, r1, r2 это обобщенное название регистров или это не Intel?
    cmp r1,r2/j[cond] label можно заменить на fcmov[cond], set[cond], cmov[cond]
    если [cond] подразумевает анализ CarryFlag, то можно использовать
    SBB r1,r1 ADC r1,0 и SALC
     
  5. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    --r0, r1, r2 это обобщенное название регистров или это не Intel?

    обобщенное


    FASMPRE.exe говорит что можно, но есть ошибка:

    Код (Text):
    1. inst\\#cond fix inst cond ,
     
  6. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    я оптимизировал так, не знаю быстрее или нет:

    Код (Text):
    1. ; cmp r1,r2
    2. ; j[cond] label
    3. ; add r1,r2
    4. ; mov r0,r1
    5. ; label:
    6.  
    7. push    r3
    8. xor     r3,r3
    9.  
    10. shl              r2, 1 ;# -- могут и не быть
    11. cmp               r1, r2
    12. cmov[]    r3, r2
    13. add               r1, r3
    14. mov             r0, r1 ;# -- могут и не быть
    15.  
    16. pop     r3
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    yaskhan
    Давай попроще
    if r1 > r2 then r0:=r1+r2 else r0:=?
     
  8. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    ааа я же написал:

    Код (Text):
    1.  cmp r1,r2
    2.  j[cond] label
    3.  add r1,r2
    4.  label:
    5.  mov r0,r1
    тогда так чтоли?

    Код (Text):
    1. push    r3
    2. xor     r3,r3
    3.  
    4. shl              r2, 1 ;# -- могут и не быть
    5. cmp               r1, r2
    6. cmov[]       r3, r2
    7. add               r1, r3
    8. сmov[]            r0, r1 ;# -- могут и не быть
    9.  
    10. pop        r3
    если ты имел ввиду написать мою версию понятным языком, то вот:

    Код (Text):
    1. temp=0
    2. if r1 > r2
    3.  
    4. temp=r2
    5. r0=r1+temp
    6.  
    7. else
    8.  
    9. r1=r1+temp
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    yaskhan
    как вариант
    mov r0,r1
    cmp r1,r2
    sbb r3,r3; if Carry=1 r3=-1 else r3=0
    and r3,r2; if Carry=1 r3=r2 else r3=0
    add r0,r3
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    yaskhan
    Во-первых, если уж Вы используете fix, то эта директива должна быть строго вторым символом на строке. А у Вас четвёртым, а то и пятым (после inst\\, потом #, потом cond, а потом уже fix). Естесственно, fix в такой ситуации обрабатываться не будет.

    Во-вторых, даже если сделать таки fix вторым символом, он здесь вообще не поможет, т.к. он обрабатывается перед всеми раскрытиями макросов. В результате ни inst, ни cond подставлены не будут. По этой же причине имеет место "во-первых".

    В общем, переопределять здесь надо либо с помощью define/equ либо с помощью macro. Как-то так:
    Код (Text):
    1. macro haha
    2. {
    3.     irps inst, add sub mov shl shr
    4.     \{
    5.         irps cond, eq c z ae ge b nc ne le l be a o no s ns
    6.         \\{
    7.             inst\\#cond equ inst cond ,
    8.         \\}
    9.     \}
    10. }
    P.S. Используйте fix по-реже. Она необходима только в очень редких случаях. Например, когда надо переопределить директиву препроцессора.
     
  11. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    l_inc
    Но в ФасмПре.ехе работает же


    Вчера ночью провел тест, и вот результаты. Но в оптимизированной версии не было команды пуш и поп потому что компилятор почему то выдавал ошибки

    стандартный вариант:

    127 тактов

    опт. вариант:

    53 тактов

    Так как это мое первое тестирование, я чета сомневаюсь что правильно все сделал. Прикрепил исходник теста если что не так, скажите пожалуйста. И потом, че за ошибка с пуш и поп?
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    yaskhan
    И что? Вам достаточно выхода после fasmpre.exe? Тогда в чём вопрос? Пользуйтесь fasmpre.exe.

    Кстати, советую проверить, соответствует ли выход fasmpre.exe Вашим ожиданиям.
     
  13. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Вот как быть в током случае? нужно чтобы при использовании регистра устанавливался флаг


    Код (Text):
    1. reguse equ 0
    2.  
    3. ...
    4.  
    5. macro r3 {
    6.     [ebp-4]
    7. reguse equ 1
    8. }
    9. ...
    10.  
    11. mov r0,r3
    так не работает :dntknw:
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    yaskhan
    Инлайн-макросы в fasm не допускаются. Соответственно макрос (определённый через macro) раскрывается только тогда, когда обращение к нему является первым символом в строке (не считая метки, определённые через двоеточие). r3 в данном случае — четвёртый символ. Поэтому и не работает. Чтобы иметь возможность проверять использование регистра в инструкции, придётся переопределять макросами все возможные инструкции и проверять их аргументы.

    Кроме того, если этим ограничиться, то, например, констркуция times 3 mov r0, r3 отрабатывать ожидаемым образом не будет. Поэтому нужно также переопределить и директиву times, причём рекурсивно (т.к. несколько times можно вкладывать друг в друга).
     
  15. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Блин, наверное буду переходить на язык D. Который будет компилировать с помощью ФАСМ
     
  16. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    l_inc
    ОЙ, я вчера ваш пост не заметил
    вы писали:
    примерчик не помешал бы
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    yaskhan
    Ну я надеюсь, понятно, почему такая конструкция не будет использовать макрос mov:
    Код (Text):
    1. macro mov arg1*,arg2*
    2. {
    3.     display 'mov',13,10
    4. }
    5. times 3 mov ax,bx
    mov не является первым символом на строке, поэтому раскрыт не будет. Соответстенно код скомпилируется просто в три инструкции mov ax,bx.

    Соответственно следует переопределить директиву times примерно следующим образом (учитывая опциональную возможность применения двоеточия):
    Код (Text):
    1. macro times [args]
    2. {
    3.     common
    4.         match count remainder1, args
    5.         \{
    6.             define matched -
    7.             match : remainder2, remainder1
    8.             \\{
    9.                 repeat count
    10.                     remainder2
    11.                 end repeat
    12.                 restore matched
    13.                 define matched +
    14.             \\}
    15.             match -, matched
    16.             \\{
    17.                 repeat count
    18.                     remainder1
    19.                 end repeat
    20.             \\}
    21.             restore matched
    22.         \}
    23. }
    Тогда прекрасно раскроется times 3 mov ax,bx, но облом будет с вариантом times 3 times 1 mov ax,bx, т.к. при раскрытии внешнего times вложенный times согласно fasm'овым правилам использует определение не в данный момент раскрываемого макроса, а предыдущее определение (т.е. оригинальное значение times).

    Соответственно нужно определить times рекурсивно:
    Код (Text):
    1. macro define_times
    2. {
    3.     macro times [args]
    4.     \{
    5.         \common
    6.             match count remainder1, args
    7.             \\{
    8.                 define matched -
    9.                 match : remainder2, remainder1
    10.                 \\\{
    11.                     define_times
    12.                     repeat count
    13.                         remainder2
    14.                     end repeat
    15.                     purge times
    16.                    
    17.                     restore matched
    18.                     define matched +
    19.                 \\\}
    20.                 match -, matched
    21.                 \\\{
    22.                     define_times
    23.                     repeat count
    24.                         remainder1
    25.                     end repeat
    26.                     purge times
    27.                 \\\}
    28.                 restore matched
    29.             \\}
    30.     \}
    31. }
    32. define_times
    Вот теперь times переопределена верно. Даже times 3 times %:mov ax,bx раскроется правильно, т.к. знак процента используется директивой repeat так же, как и директивой times.
     
  18. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Если у кого есть идей или там хотите помочь на тему
    АРМ\Интел\32\64 совместимый ассемлер на основе ФАСМ макросов
    то пишите сюда: yaskhan<>jabber.ru
     
  19. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Бээлииин, почему я это раньше не нашел?

    http://sun.hasenbraten.de/vasm/

    добавлено:
    упс, рано обрадовался :-(