размещение кода на странице

Тема в разделе "WASM.BEGINNERS", создана пользователем one_man, 21 май 2006.

  1. one_man

    one_man New Member

    Публикаций:
    0
    Регистрация:
    21 май 2006
    Сообщения:
    1
    меня интересует следующий вопрос: в случае, если команда не помещается на странице (к примеру, осталось два байта, а для jmp'а нужно больше =) ), то как такая ситуация эффективно разрешается (помимо очевидного решения: переход на другую страницу с забиванием оставшегося места nop'ами)? извиняюсь за, возможно, глупый вопрос. заранее спасибо
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    one_man

    Интересно, почему у тебя возник вопрос иммено о страницах ?

    Дело в том, что частная и редкая ситуация разбивки инструкции границей страниц практически не отличается от общей и значительно более частой ситуации разбивки инструкций границами линеек кэша или 16-байтных блоков декодирования в P6+. При повторных проходах куска кода (следующая страница инициализирована, ее запись есть в TLB, первая линейка находится в кэше) - разницы вообще нет. В противном случае возникают большие тормоза независимо от того бъется инструкция границей страницы или нет.



    Ну а в общем случае возиться с выравниваниями имеет смысл только при оптимизации циклов, когда экономия одного такта декодирования может дать заметный выигрыш в бщем времени обработки. И тут выталкивание инструкции перехода (jcc,jmp,call) в следующий блок декодирования ничего не дает, т.к. в P6+ процессор все равно вынужден подгружать "лишние" 16 байт кода ради одной инструкции и затем сразу грузить другие 16 байт по метке перехода (в P4 NetBurst это вообще не важно - там кэш трасс рулит). Эффективнее наоборот пытаться "ужать" предыдущий код, чтобы уместить инструкцию перехода целиком в текущем блоке. Это как раз та ситуация, когда не следует тупо следовать рекомендации выравнивания метки цикла на 16 байт - "при ловле блох" нужно смотреть конкретный код и экспериментировать - часто бывает, что смещение метки цикла в P6+ ускоряет обработку именно за счет того, что устраняет разбивку и\или "перескок" jсс в следующий блок