Подчистить код

Тема в разделе "WASM.ASSEMBLER", создана пользователем t00x, 30 окт 2010.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Код (Text):
    1.   mov ecx, $FFFFFF
    2.   call @loop
    3. @loop:
    4.   pop rax
    5.  
    6.   sub ecx, 1
    7.   jz @exit
    8.  
    9.   push rax
    10.   push rax
    11.   ret
    как избавиться от одного push rax?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Код (Text):
    1. sub rsp,4
    2. mov [rsp], rax
    ну можно и другие извраты придумать. через ebp например.
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Заменить pop eax на mov eax, [rsp], а после exit добавить pop eax?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.   push rax
    2.   ret
    Код (Text):
    1. jmp rax
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    n0name
    Насколько я понял это пауза в стиле а-ля 286 :)) значит замена ret на jmp восстанавливающая правильность работы предсказателя ret-ов снизить эффективность (в смысле тормознутость) этой задержки :)))

    t00x
    Код (Text):
    1.  
    2. mov ecx, $FFFFFF
    3.   call @loop
    4. @loop:
    5.  
    6.   sub ecx, 1
    7.   jz @exit
    8.  
    9.   push [rsp]
    10.   ret
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    а чтобы оставалось push rax непосредственное изменение rsp не получиться обойти?
     
  8. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    t00x
    Подчистить микрокод процессора.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    mov rax, [rsp]
    push rax
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Y_Mur
    Спасибо, дошло.
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Жаль я объяснил недоходчиво...
     
  12. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    К сожалению, этот код не совсем эквивалентен исходному: когда сработает jz @exit, в стэке всё ещё останется адрес метки @loop.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    baldr
    есть такое - поленился дописать @exit: pop rax :))
     
  14. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Y_Mur,

    А что означает «пауза a'la 286»? Это код, специально написанный так, чтобы предсказатели ветвлений/возвратов P6+ пролетали, аки фанера над городом Парижем?
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Это значит что в эпоху i286 паузы в виде циклов широко применялись, но с приходом многозадачности они есно потеряли актаульность - гораздо лучше отдать процессорное время ожидания задаче которой оно нужнее. Разумного оправдания как паузам а-ля 286 так и нарушению предсказания переходов не вижу, поэтому на всякий случай прозрачно намекнул ТС о повышенной тормозючести такого решения ;) но если очень хочется разобраться в логике организации таких извратных циклов, то почему бы и не подсказать :))
     
  16. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Y_Mur,

    Меня малость испугало упоминание 286. i386 тоже не имеет BTB и прочих прелестей неупорядоченного спекулятивного исполнения команд. Вроде это началось с PPro и иже с ними.