Технологии отображения регистра для эффективной динамической двоичной трансляции

Иллюстрации

Показать все

Изобретение относится к области динамической двоичной трансляции. Техническим результатом является обеспечение эффективной технологии для выполнения динамической двоичной трансляции из архитектуры системы команд ("ISA") с большим количеством регистров в ISA с меньшим количеством регистров. В общем, настоящее раскрытие обеспечивает систему и способ для отображения регистров из системы с большим количеством регистров на систему с меньшим количеством регистров. Могут быть сформированы области, которые включают в себя один или больше блоков кода с относительно частым доступом к регистру. Регистры источника с наиболее частым доступом могут быть отображены на целевые регистры. Каждый блок в области может быть соединен с помощью вводной части и, по меньшей мере, одной заключительной частью. Вводная часть может быть выполнена с возможностью выполнения отображения регистра, и заключительная часть (части) может быть выполнена с возможностью управления потоком программной обработки из блока в данной области в другой блок в этой области или в блок, не находящийся в этой области. 3 н. и 19 з.п. ф-лы, 8 ил., 1 табл.

Реферат

Область техники, к которой относится изобретение

Настоящее раскрытие относится к динамической двоичной трансляции и, более конкретно, к эффективной технологии для выполнения динамической двоичной трансляции из архитектуры системы команд ("ISA") с большим количеством регистров в ISA с меньшим количеством регистров.

Уровень техники

Динамическая двоичная трансляция (DBT) получила широкое распространение как средство работы приложений, созданных для одной архитектуры системы команд (ISA) поверх другой ISA. Учитывая количество программного обеспечения, которое было разработано ранее для PC на основе х86 ISA, было уделено внимание трансляции х86 в другие ISA. Последние тенденции в отрасли как для меньших ультрамобильных ПК, так и для более мощных встроенных и мобильных Интернет-устройств (например, смартфонов) размывают границы между этими отдельными рынками. В результате такого схождения рынков формируется большой интерес к DBT из ISA, которые в настоящий момент доминируют на рынках встроенных и мобильных Интернет-устройств (например, ARM (ARM Holdings), MIPS (MIPS Technologies) и PowerPC (APPLE-IBM-Motorola alliance)) в х86 (Intel Corporation).

Двоичная трансляция ("ВТ") представляет собой общую технологию для перевода двоичных кодов, построенных для одной ISA источника ("гость") в другую целевую ISA ("хост"). Используя ВТ, становится возможным выполнить двоичные коды приложений, построенных для одного процессора ISA на процессоре с другой архитектурой, без необходимости повторной компиляции исходного кода на высоком уровне или перезаписи кода ассемблера. Поскольку большинство старых компьютерных приложений доступно в только двоичных форматах, ВТ является очень привлекательным, учитывая ее потенциал, для обеспечения выполнения процессором приложений, которые не построены и не доступны для него. Несколько успешных проектов ВТ привели к определенному процессу предшествующего уровня техники в последние десятилетия, включая в себя Digital Equipment Corporation ("DEC") FX!32, IA-32 EL компании Intel, GMS ("программное обеспечение для трансформации кода") компании Transmeta, Godson-3 (архитектура MIPS), и DAISY ("Динамически спроектированная система команд из Иорктауна") компании IBM. Большинство этих инструментов предназначены для обеспечения работы старых приложений х86 на таких процессорах, как Alpha (DEC), Itanium (Intel), Crusoe (Transmeta) и MIPS (MIPS Technologies).

Большинство указанных выше инструментов используют динамическую ВТ (DBT), что означает, что они выполняют трансляцию "на ходу", по мере выполнения приложения, то есть, во время выполнения. В качестве альтернативы, ВТ может быть выполнена в автономном режиме, то есть, статическая ВТ (SBT). Модель динамического использования обычно является предпочтительной, поскольку она является более общей (например, выполнена с возможностью обработки самомодифицирующегося кода), и она работает прозрачно для пользователя с простым изменением OS, для автоматического вызова DBT при появлении "неродных" двоичных файлов. Основной недостаток DBT, по сравнению с SBT, состоит в чрезмерно большом объеме служебной информации. Циклы, выполняемые во время трансляции и оптимизации приложения, представляют собой циклы, которые, в противном случае, можно было бы использовать для фактического выполнения кода программы. Поэтому, инструменты DBT вынуждены идти на компромисс между временем, затраченным на трансляцию/оптимизацию, и качеством получаемого в результате кода, что, в свою очередь, отражается на времени исполнения транслированного кода.

Трудности, с которыми сталкивается DBT, в большой степени зависят от ISA источника и целевой ISA. В последнее время возникает большой интерес в расширении использования х86 ISA на сегменты рынка ультрамобильных и встроенных устройств (например, процессор Atom компании Intel). С точки зрения пользователя, это очень удобно, поскольку может обеспечить возможность эффективной работы программного обеспечения PC на встроенных и ультрамобильных платформах. Однако для того, чтобы адаптировать х86 в эти новые домены, также необходимо обеспечить возможность для х86 выполнения огромную базу программного обеспечения, доступную в этих сегментах, которые, в основном, основаны на ISA, таких компаний, как ARM (ARM Holdings), MIPS (MIPS Technologies) и PowerPC (APPLE-MOTOROLA alliance). Например, в будущих смартфонах на основе х86, помимо возможности исполнения приложений PC, было бы предпочтительно обеспечить возможность загрузки и работы без стыков приложений на основе ARM, поставляемых, например, iPhone Apple App Store компании Apple. Проблемы обеспечения этого сценария включают в себя поддержание рабочих характеристик для DBT и низкий уровень непроизводительных затрат энергии.

Хотя было предложено множество систем DBT, большинство из них следует одному и тому же потоку исполнения. Вначале двоичный файл, созданный для архитектуры источника (хост), загружают в запоминающее устройство. Участки этого двоичного файла источника затем транслируют в целевой (хост) двоичный код. Эту трансляцию обычно выполняют "по требованию". Другими словами, инструкции исходного кода транслируют по мере того, как поток управления достигает их. Как правило, трансляцию выполняют с грануляцией основных блоков, которые представляют собой последовательности инструкций с одним входом и потенциально множеством выходов. После трансляции основного блока, результат трансляции сохраняют в кэше трансляции (также называется кэшем кода) в запоминающем устройстве для будущего повторного использования. Наиболее агрессивные системы DBT выполняют разные уровни оптимизации. В соответствии с системами CMS Transmeta и другими системами DBT, такие уровни оптимизации называются "приводами". Вначале используют очень быструю трансляцию (Привод 1). Этот привод направлен на очень быстрое выполнение, за счет низкого качества транслируемого кода. Такой компромисс приводит к идеальным результатам для редко исполняемого кода, такого, как код начальной загрузки OS. В Приводе 1, DBT также воплотили пробы (счетчики) для детектирования "горячих" (то есть, часто выполняемых) основных блоков. Как только блок становится горячим, его и его окружающие скоррелированные с ним блоки объединяют в область. Эту область затем повторно транслируют, используя более высокий привод, который применяет дополнительную оптимизацию к коду. Такую же стратегию можно повторять для произвольного количества приводов. Например, CMS компании Transmeta используют четыре привода. В действительности, система на основе приводов обеспечивает, что, чем больший вклад область кода вносит в общее время исполнения, тем больше времени затрачивают на ее оптимизацию для получения более быстрого кода.

Набор, количество и степень агрессивности прикладываемой оптимизации в значительной степени изменяются от одной DBT к другой. Типичная оптимизация включает в себя: планирование инструкций, устранение "мертвого" кода и устранение избыточности. Фактически, аналогично статической оптимизации компилятора, набор для большинства соответствующих оптимизаций зависит от целевой архитектуры. Хотя, в отличие от оптимизации компилятора, в DBT такая оптимизация имеет точную информацию о времени выполнения, которое можно использовать для получения кода более высокого качества. Основной недостаток DBT по сравнению со статическими компиляторами представляет собой намного более плотный бюджет времени оптимизации.

Краткое описание чертежей

Свойства и преимущества заявленного предмета изобретения будут понятны из следующего подробного описания вариантов осуществления, соответствующих им, и это описание следует рассматривать со ссылкой на приложенные чертежи, на которых:

на фиг.1 представлена система запоминающего устройства, соответствующая настоящему изобретению;

на фиг.2A представлена блок-схема последовательности операций примерных операций для динамического двоичного транслятора, соответствующего настоящему изобретению;

на фиг.2B представлена блок-схема последовательности операций примерных операций для оптимизации кода, соответствующего настоящему изобретению;

на фиг.3 представлена примерная блок-схема управления, включающая в себя область часто исполняемых кодовых блоков;

на фиг.4 представлен примерный оптимизированный целевой блок двоичного кода, включающий в себя вводную часть, тело, условный переход и, по меньшей мере, одну заключительную часть, в соответствии с настоящим изобретением;

на фиг.5 представлена блок-схема последовательности операций примерных операций для выполнения целевых блоков двоичного кода, включая в себя оптимизацию, в соответствии с настоящим изобретением;

на фиг.6 представлена примерная оптимизированная блок-схема управления, соответствующая блок-схеме управления по фиг.3; и

на фиг.7 показан график, иллюстрирующий сравнение результатов сравнительных тестов рабочих характеристик динамической двоичной трансляции, включающей в себя отображение регистра блочного уровня и отображение регистра уровня области, в соответствии с настоящим изобретением.

Подробное описание изобретения

Проблема, с которой сталкивается динамическая двоичная трансляция ("DBT"), представляет собой непроизводительные издержки, которым она подвергается. Такие непроизводительные издержки, в основном, возникают из-за относительно часто используемых особенностей в ISA ("источника") хоста, которые не просто отображаются на ("целевые") ISA хоста. Например, когда ISA-источник имеет больший набор регистров, чем у целевой ISA, становится важным использовать эффективное отображение регистра из регистров источника в целевые регистры для уменьшения непроизводительных издержек во время эмуляции регистра, например, при доступе к памяти. Это, в частности, важно для целевых ISA, таких как х86 и х86-64, которые имеют относительно небольшое количество регистров общего назначения/регистров целых чисел (например, 8 и 16) по сравнению с другими ISA, например, PowerPC, ARM и MIPS, которые имеют 32 регистра и Itanium, которые имеют 128 регистров.

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

В настоящем раскрытии предусмотрена система и способ, выполненные с возможностью обеспечения отображения регистра на уровне области. Способ включает в себя, для каждого блока двоичного кода в области, отображение, по меньшей мере, некоторых из наиболее часто используемых регистров процессора источника, в области для регистров целевого процессора. Наиболее часто используемые регистры процессора источника могут быть определены по пробе (пробам), включающей в себя счетчики, воплощенные с блоками целевого двоичного кода, соответствующими блокам двоичного кода источника. Блок оптимизированного целевого двоичного кода может быть затем сгенерирован для каждого блока двоичного кода источника в области, выбранной для оптимизации. Блок оптимизированного целевого двоичного кода может включать в себя вводную часть, тело, включающее в себя транслированный двоичный код источника, условный переход и, по меньшей мере, одну заключительную часть. Вводная часть выполнена с возможностью загрузки отображаемых или отображаемых внутренних регистров для области. Условный переход выполнен с возможностью управления потоком на основе, выполняется ли переход на границе блока двоичного кода источника к следующему двоичному блоку в области или к следующему двоичному блоку, который не находится в этой области. Заключительную часть (части) выполняют с возможностью перехода в тело блока, если следующий двоичный блок находится в области, или вначале следующего двоичного блока, если следующий двоичный блок не находится в области. Начало может соответствовать вводной части оптимизированного целевого блока двоичного кода в другой области или неоптимизированного целевого блока двоичного кода. Если следующий двоичный блок не является областью, внешние регистры для области могут быть сохранены в запоминающем устройстве. Предпочтительно, доступ к запоминающему устройству может быть уменьшен путем загрузки отображаемых или отображаемых внешних регистров для области при пересечении границ области, вместо выполнения каждый раз оптимизированного блока целевого двоичного кода.

Способ и/или система, соответствующая настоящему раскрытию, выполнена для обеспечения отображения регистра на уровне области. Области могут быть относительно сложными. Например, область может включать в себя произвольное количество вложенных контуров, то есть, произвольную комбинацию (комбинации) контуров, например, множество одноуровневых элементов могут включать в себя родительский контур, как будет понятно для специалиста в данной области техники. В другом примере область может включать в себя целевые блоки двоичного кода, соответствующие не сокращаемому потоковому графу, например множество возможных входов в контур. Область может быть сформирована из непрерывных и/или не являющихся непрерывными целевых блоков двоичного кода.

На фиг.1 представлена система 100 в соответствии с настоящим раскрытием. Система 100 включает в себя процессор ("CPU") 102, соединенный с системным запоминающим устройством 104. Система 100 может включать в себя запоминающее устройство 105 кэш (которое может быть включено в системное запоминающее устройство 104) и/или сверхоперативное запоминающее устройство 107, аналогичное запоминающему устройству кэш, но управляемое программным средством. CPU 102 может включать в себя множество регистров 106-1, 106-2, …, 106 m процессора, совместно обозначенных 106. CPU 102 может включать в себя множество модулей обработки кода ядро (ниже "ядер" или в единственном числе "ядро"), и каждое ядро может быть выполнено с возможностью выполнения множества потоков. Системное запоминающее устройство 104 может содержать двоичное приложение 110 - источник, систему 115 динамической двоичной трансляции и операционную систему-хост управления ("OS") 120. Система 115 динамической двоичной трансляции может включать в себя целевой блок (блоки) 112 двоичного кода, код 114 динамического двоичного транслятора, включающий в себя модуль 116 отображения регистра, и/или накопитель 118 регистра источника. Двоичное приложение 110 - источник может включать в себя множество блоков двоичного кода источника, соответствующих источнику ISA. Целевой блок (блоки) двоичного кода соответствует целевой ISA. Блок двоичного кода источника представляет собой последовательность из одной или больше инструкций, которые включают в себя, например, окончание с командами перехода. Целевой блок двоичного кода выполнен с возможностью включения функций соответствующего блока двоичного кода источника. Оптимизированный целевой блок двоичного кода может включать в себя функции соответствующего блока двоичного кода источника в теле оптимизированного целевого блока двоичного кода. Оптимизированный целевой блок двоичного кода может включать в себя дополнительную функцию, как описано здесь.

Целевой блок (блоки) 112 двоичного кода может быть сохранен в области системного запоминающего устройства, обозначенного "кэш" 111 кода. Кэш 111 кода можно понимать, как накопитель для целевого блока (блоков) 112 двоичного кода, то есть, одного или больше целевого блока (блоков) 112 двоичного кода, которые были транслированы из одного или больше соответствующих блока (блоков) двоичного кода источника. Системное запоминающее устройство 104 может содержать накопитель 118 регистра источника, выполненный с возможностью загрузки/сохранения данных в/из регистров 106 процессора. В некоторых вариантах осуществления запоминающее устройство 105 кэш и/или сверхоперативное запоминающее устройство 107 выполнены с возможность загрузки/сохранения данных в/из регистра (регистров) 106 процессора.

Код 114 динамического двоичного транслятора и модуль 116 отображения регистра могут быть выполнены с помощью одного или больше ядер, которые предназначены для работы над двоичным приложением 110 источника, для преобразования блока (блоков) двоичного приложения 110 источника в целевой блок (блоки) 112 двоичного кода. Блок двоичного кода источника может быть транслирован в целевой блок двоичного кода динамически. Другими словами, блок двоичного кода источника может быть транслирован в целевой блок двоичного кода, в ответ на вызов на выполнение двоичного блока, а не статически, то есть, еще до времени выполнении программы. Целевой блок двоичного кода может затем быть сохранен в системном запоминающее устройстве 104 в кэш 111 кода и может быть предоставлен в CPU 102 для исполнения. Блок (блоки) преобразования двоичного кода 110 источника в целевой блок (блоки) 112 двоичного кода может включать в себя отображение одного или больше регистров источника на один или больше целевых регистров, например, на регистр (регистры) 106 процессора, на основе, по меньшей мере, частично частоты доступа регистра в область. Например, ISA-источник может включать в себя Ns регистров источника, и целевая ISA может включать в себя Nt целевых регистров, например, регистры 106, где Nt меньше, чем Ns.

На фиг.2A представлена блок-схема 200 последовательности операций для динамического двоичного транслятора. Операции в блок-схеме 200 последовательности операций могут быть выполнены кодом 114 динамического двоичного транслятора. Ход выполнения программы может начаться с приема вызова для выполнения блока (блоков) 202 двоичного кода. Предполагается, что перед вызовом для выполнения блока (блоков) 202 двоичного кода, двоичное приложение 110 источника было загружено в системное запоминающее устройство 104. Во время операции 204 может определяться, находится или нет один или больше блоков целевого двоичного кода в кэш для кода, например в кэш 111 кода. Каждый блок целевого двоичного кода соответствует блоку двоичного кода источника двоичного приложения 110 источника. Если блок (блоки) целевого двоичного кода не находится в кэш для кода, операция 206 может включать в себя трансляцию блока (блоков) двоичного кода источника в целевой двоичный блок (блоки), осуществляя пробу (пробы) и сохранение целевого двоичного блока (блоков) и пробу (пробы) в кэш для кода. Такая трансляция может быть организована для относительно быстрого применения. Например, проба (пробы) может включать в себя счетчик (счетчики), выполненный с возможностью поддерживания величины подсчета количества раз, какой двоичной блок был выполнен. Регистр (регистры) процессора источника могут быть отображены на накопителе регистров, например накопитель 118 регистра источника, в системном запоминающем устройстве 104, в запоминающем устройстве 105 кэш и/или в сверхоперативном запоминающем устройстве 107. Ход выполнения программы может затем перейти к операции 211. Во время операции 211 может быть выполнен транслированный блок (блоки) кода. Если во время операции 204 целевой блок (блоки) двоичного кода находится в кэш для кода, ход выполнения программы может перейти к операции 208.

Во время операции 208 может определяться, было ли достигнуто пороговое значение. Было ли достигнуто пороговое значение, может быть определено на основе, по меньшей мере, частично, пробы (проб), воплощенной при операции 206, в ответ на предыдущий вызов, для выполнения блока (блоков) кода. Например, величина подсчета может быть последовательно увеличена каждый раз, когда выполняют двоичный блок. Если величина подсчета достигает заданного порогового значения, тогда проба может быть выполнена с возможностью возврата потока программы (то есть, перехода) в динамический двоичный транслятор для дальнейшей обработки. Заданное пороговое значение может быть выполнено с возможностью обозначения относительно часто выполняемого двоичного блока, который мог быть получен предпочтительно после оптимизации. Если пороговое значение не было достигнуто, поток программы (ход выполнения программы) может перейти к операции 211, выполнить блок (блоки) транслированного кода. Если пороговое значение было достигнуто, поток программы может перейти к операции 210 для оптимизации кода. Оптимизация кода 210 выполняется так, что она включает в себя формирование области и отображение регистра, как описано здесь. Поток программы может затем перейти к операции 211, выполнить блок (блоки) транслированного кода.

На фиг.2B представлена блок-схема 210 последовательности операций для оптимизации кода, в соответствии с настоящим раскрытием. Поток программы может начаться в начале 212. Операции блок-схемы 210 последовательности операций могут быть выполнены с помощью динамического двоичного транслятора кода 114, включая в себя модуль 116 отображения регистра. Во время операции 214 может быть произведен поиск соседних двоичных блоков, которые удовлетворяют и/или превышают пороговое значение сродства. Соседние двоичные блоки могут быть сопоставлены с двоичным блоком, который инициировал оптимизацию кода. Например, соседний двоичный блок (блоки) может быть выполнен так, чтобы он выполнялся непосредственно перед или сразу после двоичного блока, который инициировал оптимизацию кода. Соседний двоичный блок (блоки) может быть непрерывным с инициирующим двоичным блоком и/или может быть связан с инициирующим двоичным блоком, ответвлением или переходом. Под сродством между или внутри двоичных блоков можно понимать корреляцию при вероятности выполнения двоичных блоков. Например, корреляция может возникать из-за ответвления от одного двоичного блока в другой двоичный блок. Во время операции 216 затем может быть сформирована область, включающая в себя соседние двоичные блоки, которые достигают и/или превышают пороговое значение сродства.

Во время операции 218 множество доступов может быть определено для каждого регистра источника, доступ к которому осуществляют в области. Инструкция в области может использовать регистр источника, то есть, считывать из него, и/или может определять регистр источника, то есть, записывать в него. Доступ к регистру, то есть, использование регистра, включает в себя использование и/или определение регистра. Отображение регистра может быть основано на общем количестве доступов в каждом регистре источника в области.

Например, область, сформированная во время операции 216, может включать в себя один или больше блока (блоков) двоичного кода. Проба, включающая в себя величину подсчета количества исполнений двоичного блока, может быть ассоциирована с каждым блоком двоичного кода. Для каждого двоичного блока количество доступов к регистру может быть определено на основе величины подсчета количества исполнений двоичного блока, инструкций в двоичном блоке и регистров, доступ к которым осуществляет каждая инструкция. Общее количество доступов к каждому регистру, доступ к которому осуществляют в области, может быть затем определено путем суммирования количества доступов для каждого регистра в каждом двоичном блоке в области.

На фиг.3 представлен примерный график 300 потока управления, включающий в себя примерную область 305 кода. График 300 потока управления включает в себя пять блоков кода: блок А 310, блок В 320, блок С 330, блок D 340 и блок Е 350. Каждый блок имеет ассоциированный подсчет 312, 322, 332, 342, 352, соответствующий количеству исполнений блока, определенный на основе воплощенной пробы (проб), например, во время операции 206 (фигура 2A). Например, каждый из блока А, блока С и блока Е имеет ассоциированную величину подсчета десять. Блок В имеет ассоциированную величину подсчета одна тысяча, и блок D имеет ассоциированную величину подсчета девятьсот девяносто. В этом примере блок В может соответствовать заданному порогу, описанному в отношении операции 208 по фиг.2A, то есть, блок В является часто исполняемым блоком двоичного кода источника. Блок А, блок С и блок D могут быть соседними блоками для блока В. При выполнении операции 214 на фиг.2B, поиск соседних блоков, которые удовлетворяют/превышают пороговое значение сродства, может привести к блоку D. Блок D представляет собой соседний блок двоичного кода источника, который удовлетворяет или превышает пороговое значение сродства для блока В.

Сродство соответствует корреляции вероятностей выполнения часто выполняемого блока двоичного кода источника и соседнего блока двоичного кода источника. Другими словами, блок В имеет относительно высокую вероятность исполнения (величина подсчета = 1000). Блок D также имеет относительно высокую вероятность исполнения (величина подсчета = 990). "Вероятность исполнения" используется, поскольку информация подсчета является исторической, и будущие частоты исполнения могут изменяться. Вероятность исполнения блока D взаимосвязана с вероятностью исполнения блока В, например, на основе ответвления между блоком В и блоком D. Другими словами, вероятность исполнения блока D скоррелирована с вероятностью исполнения блока В.

В этом примере, из пяти блоков кода блок В и блок D с относительно высокими частотами исполнения (то есть, величины подсчета) 1000 и 990, соответственно, и которые удовлетворяют или превышают пороговое значение сродства, включены в область 305. Инструкции в блоке В обращаются к регистрам r1, r2, r3, r4 и r5. Регистры r1 и r4 определены (в них записывают) и регистры r1, r2, r3, r4 и r4 используются (из них считывают). Другими словами, для каждого исполнения блока В, к r1 и r4 обращаются дважды, и к каждому из остальных регистров обращаются один раз. В соответствии с этим, для блока В с частотой исполнения 1000, к каждому из r1 и r4 обращаются 2000 раз, и к каждому из остальных регистров обращаются 1000 раз. Блок D включает в себя одну инструкцию, которая обращается к регистру r2 дважды (один раз для считывания и второй раз для записи) и к регистру r5 один раз (считывание). Соответственно, для блока D, с частотой исполнения 990, доступ к r2 выполняют 1980 раз, и доступ к r5 выполняют 990 раз. Поэтому, для области 305, которая включает в себя блок В и блок D, к r1 в сумме обращаются 2000 раз, к r2 в сумме обращаются 2980 раз, к r3 обращаются в сумме 1000 раз, к r4 обращаются, в общем, 2000 раз, и к r5 обращаются, в общем, 1990 раз. Сортируя регистры по количеству доступов к регистру, начиная с регистров с наиболее частым обращением и кончая регистрами с наименее частым обращением, получают: r2, r1 и r4, r5 и затем r3.

Снова возвращаясь к фиг.2B, во время операции 220, регистры источника могут быть отображены в целевые регистры. Регистр (регистры) источника, соответствующие наибольшему количеству доступов, то есть, с наиболее частым обращением, для области могут быть отображены на целевой регистр (регистры). Например, целевая ISA может иметь Ns целевых регистров процессора, и ISA источника может иметь Ns регистров источника процессора, где Nt меньше, чем Ns. Среди Nt целевых регистров процессора N могут быть доступны для отображения, где N меньше чем или равно Nt. Продолжая пример, показанный на фиг.3, если N равно трем, тогда регистры r1, r2 и r4 могут быть отображены на целевые регистры процессора для этой области. Регистры r3 и r5 могут не быть отображены на целевые регистры процессора и могут, поэтому, быть вызваны из запоминающего устройства, по мере необходимости.

В некоторых вариантах осуществления число N целевых регистров процессора, доступных для отображения, может быть меньше, чем число Nt регистров процессора целевой ISA. Другими словами, один или больше целевых регистров процессора могут быть зарезервированы для инструкций, которые, например, используют или определяют не отображенные регистры источника. Например, один или два регистра целевого процессора могут быть зарезервированы для таких инструкций.

Таблица 1 включает в себя псевдокод, соответствующий одному примеру, для определения общего количества доступов к регистру для каждого регистра источника в области и отображения N регистров источника на N целевых регистров.

ТАБЛИЦА 1
find_opt_reg_map (область R исходного кода)
i=1
for для каждого регистра в исходной архитектуре do
usage[i].count=0
usage[i].reg=r
i=i+1
for каждого блока В в R do
for каждой инструкции I в В do
for каждого регистра r используемого I do
пусть usage[i].reg==r
usage[i].count+=exec_freq[B]
for каждого регистра r определенного по I do
пусть usage[i].reg==r
usage[i].count+=exec_freq[B]
сортировать массив usage в порядке убывания величины поля подсчета
for i от 1 до N do
назначить usage[i].reg исходного регистра для target_reg[i]

В соответствии с этим, после окончания операции 220, N регистров источника могут быть отображены на N целевых регистров. Регистр (регистры) источника, не отображенный на целевой регистр (регистры), может быть отображен на накопитель 118 в регистре источника в системном запоминающем устройстве 104, в запоминающем устройстве 105 кэш и/или в сверхоперативном запоминающем устройстве 107.

Во время операции 222, внутренние регистры и/или внешние регистры могут быть идентифицированы для каждого двоичного блока в области. Внутренние регистры обозначают регистры, которые используются (то есть, из которых считывают) в двоичном блоке, без необходимости их вначале определить (то есть, записать в них) в двоичном блоке. Например, в области 305, представленной на фиг.3, регистры r2, r3 и r5 используются, без необходимости вначале их определения в блоке В, и регистр r2 используется до его определения в блоке D. В соответствии с этим, регистры r2, r3 и r5 представляют собой внутренние регистры для области 305. Внешние регистры соответствуют регистру (регистрам), значение (значения) которых могут быть изменены по инструкциям в двоичном блоке. Например, в области 305, значения регистров r1 и r4 могут быть изменены по инструкциям в Блоке В, и значение r2 может быть изменено по инструкции в Блоке D. В соответствии с этим, r1, r2 и r4 представляют собой внешние регистры для области 305. В некоторых вариантах осуществления, операция 222 может не быть выполнена, что обозначено пунктирной линией, окружающей прямоугольник, окружающий операцию 222.

Во время операции 224, для каждого двоичного блока в области, например в области 305, может быть сгенерирован оптимизированный целевой блок двоичного кода. Например, каждый оптимизированный целевой блок двоичного кода может включать в себя вводную часть, тело блока, которое включает в себя транслированный код источника соответствующего блока двоичного кода источника, и условный переход, и, по меньшей мере, одну заключительную часть. На фиг.4 представлен пример блока 400 целевого кода, включающего в себя вводную часть 410, тело 420 блока и две заключительные части 430, 440. Условный переход включен в тело 420 блока.

Вводная часть выполнена с возможностью загрузки в целевые регистры данных, соответствующих отображенным или отображенным внутренним регистрам источников из, например, накопителя 118 регистров источников. Будут ли отображенные или отображенные и внутренние регистры источника загружены, может зависеть от непродуктивных расходов, то есть, непродуктивных расходов, связанных с идентификацией внутренних регистров источника для каждого блока двоичного кода источника в области, в зависимости от непродуктивных расходов, ассоциированных с нагрузкой всех отображенных регистров источника после входа в область. Например, для области 305, представленной на фиг.3, регистры r1, r2 и r4 отображены на целевые регистры для области 305. В соответствии с этим, в этом примере, каждая вводная часть, ассоциированная с блоком В и блоком D, соответственно, может быть выполнена с возможностью загрузки регистров r1, r2 и r4 источника из запоминающего устройства в целевые регистры. В другом примере, регистр r2 является одновременно отображенным и внутренним для области 305. В соответствии с этим, каждая вводная часть, ассоциированная с блоком В и блоком D, соответственно, выполнена с возможностью загрузки регистра r2, в результате чего выполняется меньшее количество доступов к запоминающему устройству по сравнению с загрузкой всех (то есть, r1, r2 и r4) отображенных регистров источника.

По меньшей мере, одна заключительная часть может включать в себя первую заключительную часть и вторую заключительную часть. Условный переход выполнен с возможностью управления, будет ли продолжаться поток обработки до первой заключительной части или второй заключительной части, на основе, должно ли ответвление, которое заканчивает блок двоичного кода источника, находиться в пределах блока целевого двоичного кода области или блока целевого двоичного кода, не находящегося в области. Блок целевого двоичного кода внутри области представляет собой оптимизированный блок целевого двоичного кода, как описано ниже. Целевой блок двоичного кода, не находящийся в области, может быть неоптимизированным целевым блоком двоичного кода или оптимизированным целевым блоком двоичного кода, ассоциированным с другой областью.

Первая заключительная часть включает в себя переход к целевому блоку двоичного кода, находящемуся внутри области. Например, обращаясь снова к фиг.3, переход из блока В в блок D соответствует переходу к целевому блоку двоичного кода внутри области. Вторая заключительная часть включает в себя переход к целевому блоку двоичного кода, который находится за пределами области, например, не находится в области 305. Вторая заключительная часть дополнительно выполнена с возможностью сохранения отдельных регистров перед переходом к следующему целевому блоку двоичного кода. Аналогично загрузке внутренних регистров, как описано здесь, вторая заключительная часть может быть выполнена с возможностью сохранения отображенных или отображенных внешних регистров перед переходом к следующему целевому блоку двоичного кода.

Рассмотрим снова фигуру 3, переход из блока В в блок С соответствует переходу в целевой блок двоичного кода, который находится за пределами области. Этот переход к целевому блоку двоичного кода в пределах области выполнен с возможностью перехода к телу блока двоичного кода области, находящегося в пределах области, с обходом вводной части, ассоциированной с блоком двоичного кода, находящегося в пределах области. Переход к целевому блоку двоичного кода за пределами области выполнен с возможностью перехода к началу целевого блока двоичного кода за пределами области. Если целевой блок двоичного кода за пределами области представляет собой оптимизированный целевой блок двоичного кода, ассоциированный с другой областью, переход осуществляют к вводной части оптимизированного целевого блока двоичного кода.

Следует понимать, что система во время работы, то есть, операционная система - хост 120, выполнена с возможностью выполнения функции, которые могут не обрабатываться непосредственно целевым кодом, например, обработки прерывания. Для того, чтобы эти функции работали правильно, важно, чтобы состояние гостя представляло собой последовательную точку, то есть, последовательное состояние гостя представляет собой соответствующие структуры данных в запоминающем устройстве. Состояния гостя могут не быть последовательными во время выполнения блока, но являются последовательными в границах блока. В соответствии с этим, динамический двоичный транслятор, такой как QEMU с открытым исходным кодом, выполнен для задержки обработки прерываний до конца блока кода. Для того, что иметь последовательное состояние гостя в конце блока, внешние регистры могут быть сохранены (например, в накопителе 118 регистра источника) после перехода к блоку в пределах области, перед возвратом к работающей системе. Для переход к блоку, не находящемуся в данной области, внешние регистры могут быть сохранены перед переходом в блок, который не находится в данной области. После перехода к блоку, который не находится в данной области, управление может возвратиться к работающей системе.

На фиг.5 представлена примерная блок-схема 500 последовательности операций для выполнения целевых блоков двоичного кода, соответствующих двоичному приложению источника, к