Оптимизация деревом с помощью FASM

Тема в разделе "WASM.ASSEMBLER", создана пользователем Miller Rabin, 24 окт 2006.

  1. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Интересно можно ли пользуясь FASM выполнить оптимизацию деревом. Насколько мне известно многие компиляторы умеют это делать.
    Идея заключается в следующем
    Пусть есть переменная Key которая может равнятся одному из пяти значение 1, 2, 3, 4, 5 (Частный случай значения могут быть любыми)
    В зависимости от того какое значения оно приняло программа должна переходить по одной из пяти меток

    Решение в лоб:

    cmp [Key], 1
    je .lbOne
    cmp [Key], 2
    je .lbTwo
    cmp [Key], 3
    je .lbThree
    cmp [Key], 4
    je .lbFour
    cmp [Key], 5
    je .lbFive
    jmp .lbDef
    .lbOne:
    . ...
    .lbTwo:
    . ...
    .lbThree:
    . ...
    .lbFour:
    . ...
    .lbFive:
    . ...
    .lbDef:

    Тут еще должны быть jmp .lbEnd после каждого условия но и так понятно.
    Можно, конечно, тут применить Decобразную оптимизацию. но суть не в этом
    Идея в другом чтобы получилось так:

    cmp [Key], 3
    ja .lbBigger1
    jc .lbSmaller1
    .lbThree:
    ......
    .lbSmaller1:
    cmp [Key], 2
    ja .lbBigger2 (Невозможный переход, но скорее всего такие переходы будут в результате получаться)
    jc .lbSmaller2
    .lbTwo:
    .....
    .lbSmaller2:
    cmp [Key1], 1
    ja .lbBigger3 (Еще один невозможный переход)
    jc .lbDef
    .lbOne:
    ....
    .lbBigger1:
    cmp [Key], 4
    ja .lbBigger3
    jc .lbSmaller3 (И еще один такой)
    .lbFour:
    ......
    .lbBigger3:
    cmp [Key], 5
    ja .lbDef
    jc .lbSmaller4 (Последний невозможный переход)
    .lbFive:
    ......
    .lbDef:
    ......

    Так как сравнений получается намного меньше, то при большом количестве таких значений скорость выполнения такой программы будет напорядок выше.
    Мысль такая как бы написать макрос, который умел бы такое делать
    Примерно он бы выглядел так

    Switch 1,.lbOne, 2, .lbTwo, 3, .lbThree, 4, .lbFour, 5, .lbFive

    или

    Switch 1,2,3,4,5
    Labels .lbOne, .lbTwo, .lbThree, .lbFour, .lbFive

    В результате бы получилось что-то вроде описанного выше кода.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Miller Rabin
    Сделать можно. Но нет смысла в уродстве вида
    Можно писать как обычный switch:
    Код (Text):
    1.  switch [wmsg]
    2.   case WM_CREATE
    3.    ; ...
    4.   case WM_DESTROY
    5.    ; ...
    6.   default
    7.    ; ...
    8.  endswitch
    Switch на основе jump-table уже реализовали. Можно и tree-switch сделать, если подумать.
     
  3. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Так вот я и думаю как можно сделать tree-switch
    Начнем с малого.
    Если взять конструкцию

    switch [wmsg]
    case WM_CREATE
    ; ...
    case WM_DESTROY
    ; ...
    default
    ; ...
    endswitch

    То из всех возможных значений [wmsg] в case нужно выбрать то которое будет ближе всех к середине
    чтобы от него строить дерево.
    Как это сделать в такой конструкции?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Во-первых, если ты слаб в макросах фасма, но хочешь разобраться сам, то почитай мануал и FAQ по макросам на форуме фасма. Или задай вопрос там. Также поищи там последние макросы switch и посмотри их реализацию.

    По реализации: нужно выбирать среднее значение из диапазона констант (case) и строить таблицы переходов. Вообще, обработку можно делать в switch, case, endswitch, но в данном случае должен быть доступен весь набор констант, поэтому реализация откладывается на endswitch. Хотя, глядя на последний макрос (switch-table) я думаю, что можно также использовать проходы ассемблера и разделить реализацию на preprocess-time и assembly-time.

    А вообще, попробуй реализовать этот алгоритм просто на каком-нибудь ЯВУ (си, паскаль), потом будет проще переписать на макроязык фасма.
     
  5. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Ладно, вобщем, я понял что ты хочешь мне сказать.