Для хранения двух экземпляров Регистрации.

То время как обычные компиляторы могут видеть каждого источника переменного одной переменной и объединить многих переменных в один регистр назначения, источник переменных Recompiler уже можно из нескольких переменных, так как оригинальный компилятор был карте нескольких источников (C) переменных 1 назначения (PowerPC) зарегистрироваться. Так один источник переменной Recompiler, т.е. зарегистрировать PowerPC, часто может быть разложен на несколько переменных. Давайте называть различные переменные C отображается на PowerPC регистрации различных случаев регистрации.

Каждый экземпляр реестра следует рассматривать как отдельный регистр. Но как мы можем сохранить отдельные экземпляры в разные стороны? Простой способ будет пройти живучести анализа данных инструкций по инструкции. Каждый раз, когда жизнь бесцветных переменных начинает свою жизнь, вся его жизнь пересекается (при соблюдении всех путей) и цветные. Новый номер переменной регистрационный номер в сочетании с цветом.

Если регистр чтения и записи в той же инструкции, то это не считается мертвым между ними, но, если он прочитал в одной инструкции, и записываются в следующем 1.

Этот алгоритм может быть просто подключен в реестр распределитель. Остальное должно работать так же хорошо, с или без него. Это может быть хорошей идеей, чтобы решить Recompiler динамично ли отключить эту функцию или отключить в определенные моменты оптимизации.

Posted in Uncategorized | Comments Off

Порядок байтов и согласования.

Есть два пути решения вопроса байтов:

  1. Swap все данные из коротких и Int доступа к памяти
  2. Храните все целыми в родном формате процессора, своп все короткие, байт и выровнены доступа.

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

Если байт ознакомиться на постоянное место, Recompiler можете изменить адрес, по XORing его 3. Краткое доступ сложнее:

и 3 | результат | ------+----------------------------+-------- ---- 0 | подкачки (короткие (2)) | 1 | подкачки (краткое (а)) | 2 | подкачки (краткий (-2)) | 3 | байт (-3) <<8 + байт (4) | (невыровненных)

Опять же, если адрес является константой, Recompiler может генерировать код, который регулирует адрес и свопы данных. Но если адрес переменной, испытание должно быть сделано во время выполнения.

Но есть и дела, что еще хуже: соответствие Int читает не нужны корректировки на всех, но невыровненных Int читает делать – и это было бы очень неэффективно проверить адрес выровнен каждый раз перед доступом к памяти, на самом деле, все решения будет медленнее, чем просто замена всех шорты и целыми. Единственный способ решить эту проблему являются смещение исключения. Они медленно, если они происходят, но в большинстве случаев, они не произойдет, и никаких дополнительных код не требуется.

Можно i386 бросить исключение на доступ неправильно? Я ничего не нашел. Если я не вижу никакой возможности реализовать эту идею.

Posted in Uncategorized | Comments Off

Реконструкция Подпись Функция.

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

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

Узнать возвращаемого значения (ы) является более сложным. Все регистры, которые либо образом (параметры могут быть возвращены непосредственно) или письменно (все зарегистрировать, которые написаны, либо возврат значения или временных переменных) являются кандидатами на возвращаемые значения. (Если параметр получает прошло через всю функции без какой-либо трогать, это не параметр, а функция сохраняет зарегистрироваться. Это касается, например, если функция C возвращает один параметр, который переводит на сингл ” в отставке “в PowerPC.)

Следующие требования достаточно для возвращаемого значения, но не обязательно: если не существует пути из “отставке”, чтобы команда, где регистр пишется без инструкции, которая гласит зарегистрироваться на путь, регистр возвращаемого значения. К сожалению, возвращаемое значение может быть прочитан для расчета возврата B, так что это правило не будет признавать в качестве возвращаемого значения.

Код, который вызывает функцию полезно узнать, что функция возвращает. Если “вызов” инструкция с аннотацией “меняет все регистры” и живучести анализ проводится по полной функции абонентов, все регистры, которые живы “вызов” являются возвращаемых значений подпрограммы. Но этот метод имеет два минусы:

  • Поскольку абонент имеет право игнорировать (и никогда не используют) любое количество возвращаемых значений, не все возвращаются значения которых получили признание. Все абоненты этой функции должны быть проанализированы. Все абоненты известно только, если функция не вызывается извне (т.е. с неизвестным кодом), и если это так, мы можем также использовать “закрытые” алгоритму, описанному выше.
  • Абонентов функция должна быть известна полностью. Если есть вызов функции, которая до сих пор не проанализированы сразу после вызова функции мы собираемся проанализировать, мы не знаем, что регистрирует второй функция использует в качестве параметров, так живучести анализ не может быть сделано. Таким образом, для того, чтобы сделать анализ живучести функции, оно должно быть известно по крайней мере то, что параметры всех функций, которые называются в рамках этой функции.

Из-за этой зависимости, многое должно быть известно для того, чтобы выяснить, возвращаемых значений одной функции. На практике, параметры многих других функций, должны быть известны. Поэтому имеет смысл делать это так:

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

Там может быть одна проблема: рекурсивных вызовов. Простое решение могло бы быть лечить вызова в качестве филиала … давайте посмотрим.

Posted in Uncategorized | Comments Off

Функция обнаружения и распределения регистров – Алгоритмы.

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

1. ассоциированных все инструкции с

  • ID функции он принадлежит
  • набор регистров, которые считываются
  • набор регистров, которые записываются в
  • и набор возможных преемников инструкции

и ассоциированных с каждой функции набор функций, она требует

2. делать DFS на абонента дерева, на пути вверх, выполните следующие действия по каждой функции:

  • сделать анализ живучести этой функции
  • реконструировать подпись
  • Найти распределения регистров для выполнения этой функции
  • повторной перекомпиляции функции с новой распределение регистров

Толкование или первый проход перекомпиляции уже следуют код потока. Таким образом, каждая команда будет достигнуто и набор регистров, которые читаются, набор регистров, которые создаются и набор возможных преемников могут быть легко войти, а инструкция должна быть декодирован толкование или пройти 1 перекомпиляции в любом случае. Кроме того, каждый раз “вызов” инструкция будет найден, функция ID может быть связан с вызываемой функции, а вызываемая функция и все ее указания будут связаны с новым ID: DFS можно легко выяснить, на каком уровне Дерево инструкции. Если это уже отмечалось, игнорировать его. Когда все статистические данные собирались, живучести анализа и зарегистрировать распределение должно быть сделано. Если функция вызывает другую функцию, это может быть сделано только если подпись называется функцией известно, иначе не было бы знать способ выяснить, какие регистры используются и, следовательно, живой в момент вызова функции. Поэтому живучести анализа распределения регистров и подпись реконструкции должно быть сделано на первом называется функцией. Если мы DFS и посмотреть на все функции по дороге вверх, Есть никогда все зависимости от функций с неизвестными подписи.

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

Posted in Uncategorized | Comments Off

При перекомпиляции.

Алгоритм стандартный переводчика Recompiler комбинация проста: Начало перевода. Если основной блок, который вот-вот будет выполнен были казнены п раз, перекомпиляции. Таким образом, только код, который исполняется является не трогал, и только важные части перекомпиляции.

Если мы хотим, чтобы перекомпилировать полный набор функций, этот алгоритм не достаточно. Основные блоки внутри функции, что, например, дело только с обработкой ошибок, возможно, не были проанализированы, потому что они никогда не тронут.

Стандартный алгоритм 1 Пасс

Мой реализации перекомпиляции основных блока основных блока по требованию, то есть, только если это абсолютно необходимо. Это относится к

  • блоки, которые были интерпретированы чаще, чем

раз, и вот-вот будут выполняться раз * блоков, которые следуют блок, который заканчивается призыв

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

Когда мы начинаем перекомпиляции, мы могли бы перекомпилировать несколько блоков, чем один, даже если это единственный блок, который уже достиг порога: Если базовый блок, заканчивающимися на “вызов”, первый основной блок подфункции всегда будет либо уже перекомпиляции или перекомпиляции на следующем этапе, как это будет достичь порога. Потому что подфункции, которые мы можем предположить, как перекомпилировать уже можно вернуться к абоненту с “рублей”, обратного адреса, хранящиеся в ссылку зарегистрироваться абонента должен быть действительным i386 код адреса. Таким образом, блок после звонка всегда должен быть перекомпилирован.

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

Пасс 2 Алгоритм

Регистрация в распределении функций может быть сделано только если все функции были проанализированы. Передать один алгоритм не будет убедиться, что функции полностью проанализированы, и в целом они не являются. Другой алгоритм необходимо. Проще всего сделать DFS. Это не убедитесь, что все функции затронуты (указатели на функции), но это то, что все функции, которые коснулись полностью проанализированы.

Заключение

Оба алгоритма не требуется. Если пользователь Recompiler настроен сделать только один проход и не пройти 2, не имеет смысла анализировать и перекомпилировать весь код, лучше только перекомпилировать код, который никогда не будет выполнен. Если Recompiler настроен делать проходит 1 и 2, то имеет смысл сделать полный анализ и быстро пройти перекомпиляции в 1: С полной анализ должен делать в любом случае для прохода 2, быстрее, чтобы сделать полный анализ, чем принять решение Какие основные блоки являются наиболее важными, их перекомпиляции, и перекомпилировать остальное позже.

Posted in Uncategorized | Comments Off

Создание / Destroy стека

Стек рамки создаются и уничтожаются на PowerPC с помощью следующей последовательности:

stwu R1,-п (R1)

и

R1 дополнительного, R1, п

В проход 1, они переведены на:

мов% ESP,-п (% ESP) ниже $ п% ESP

и

добавить $ п% ESP

На i386, стек создания и удаления кадра выглядит следующим образом, в соответствии с вызовом конвенций:

толкать% EBP MOV% ESP, EBP югу% $ п% ESP (*)

и

мов% EBP, ESP% (*)% еЬр поп-

В случае, если функция не имеет локальные переменные, отмеченные (*) инструкции опущены.

I386 как правило, не делать ESP, индексированные доступ к параметрам и локальных переменных, но EBP-индексированных доступа. Для исторических целей, оригинальный указатель стека копируется в EBP (BP = указатель базы) регистрировать в самом начале, после сохранения оригинального содержания EBP в стек.

Мы можем решить, следует ли использовать EBP, а также, и испускают i386-типичных последовательностей, или использовать ESP, индексированные доступа. Таким образом, порожденных стека код будет выглядеть следующим образом:

ниже $ п% ESP

и

добавить $ п% ESP

В обоих случаях одинаково легко реализовать: КПП стека создания / удаления инструкции могут быть легко обнаружены, и может быть переведена на любой последовательности. Значения индекса в стек доступ может быть изменен в любом случае, поэтому изменение ESP% в% в EBP i386 код также не составило большого труда.

Параметр Стек очистки

В i386 C соглашение о вызове, абонент, чтобы удалить параметры, он поставил на стеке. Так при переводе “Ы” в последовательности толчков следует назвать, “ниже $ п% ESP”, но выделяться, п это количество байтов параметров занят (= число толчков * 4).

“Рублей” инструкции (ы) в конце (а) каждая функция может быть переведен в простые i386 “в отставке” инструкции.

Posted in Uncategorized | Comments Off

LR последовательностей.

Если функция не требует какой-либо другой функции, а не использовать более локальных переменных, чем может быть в регистрах, компилятор C обычно не выделяет код, который создает кадр стека. Во всех других случаях, LR ссылку зарегистрировать сохраняется в начале и восстановить на использование используя эти последовательности:

сохранить:

mfspr R2, Л. STW R2, 0x8 (R1)

восстановить:

lwz R2, 0x58 (R1) mtspr LR, R2

На i386, эти последовательности не являются необходимыми, как вызов / отставке позаботимся обо всем этом уже.

Mfspr mtspr и инструкции, которые зарегистрированы в ссылке один операнд может быть просто проигнорированы, они не будут переведены.СТВ и lwz инструкции в этих последовательностей следует игнорировать. “STW R2, 8 (R1)” инструкции легко обнаружить, как “8″ и “r1″ постоянные, и “R2″ должны быть такими же, как первый операнд mfspr, которые должны были прежде. Но ППГ неважно, команда может быть обнаружена более легко: она всегда находится перед корректировкой стек указатель (который выглядит как “stwu R1,-п (R1)”), которые могут быть легко обнаружены. Любой доступ к 8 (R1) до этой корректировки, написать к сохраненной LR месте.

“Lwz R2, 0×58 (R1)” также могут быть легко обнаружены: Каждая функция должна быть связана с размером его стека, в данном случае 0×50.Каждый lwz, которые обращаются N 8 (R1), п время размер стека, читает из сохраненного LR месте. Никакой дополнительной проверки необходимы, потому что смещение> 8 всегда будет между созданием и исключение стека.

Итак, что же алгоритм?

Пасс-1:

  • Когда “stwu R1,-п (R1)” Инструкция нашли, доцент функции стека п размер и адрес stwu инструкции

Пасс-2:

  • Когда “mfspr р-н, / г” или “mtspr / г, р-н” будет найден, не выделяют i386 код
  • Когда “STW р-н, 8 (R1)” находится и адрес, если инструкция> адрес стека создания “stwu” встречается в 1 проход, не выделяют i386 код
  • Когда “lwz р-н, п 8 (R1) будет найден, п время размер стека, не выделяют i386 код
Posted in Uncategorized | Comments Off

Проект.

Перевод Вызов конвенций

Если мы знаем, подпись, а также оптимального распределения реестр всех функций, мы можем перевести весь код. Но Есть еще ряд нерешенных вопросов:

  • Каким образом абоненту передавать параметры?
  • Каким образом вызываемого принимают параметры?
  • Каким образом вызываемого работы с локальными переменными?
  • Как LR сохранения и восстановления последовательности переводить?
  • Как создает / разрушить стек последовательности переводить?
  • который очищает параметров стека?

Передача параметров

Код КПП движется параметры регистров R3 +. Если это слишком много параметров, они получают записывается в стек. На i386, параметры в стек. В pass2, звонок может быть просто переведен с некоторыми инструкциями и нажмите i386-родной “вызов” обучения. Хотя похоже на первый взгляд, это не так, как оптимальное составлен i386 код, а код КПП может перейти параметры регистров R3 + раньше – это будет переведена 1:1, что не является необходимым.

Прием параметров

Большую часть времени, код КПП все параметры в регистрах уже. Если это слишком много, некоторые из них в стеке. На i386, все параметры извлекаются из стека. В начале каждой функции, все PPC-регистров параметры должны быть загружены в i386 эквиваленты R3 + регистров.Параметры, которые в стек на КПП может оставить на стеке, все смещения, возможно, придется скорректировать.

Локальные переменные

На КПП, наиболее важных локальных переменных отображаются на регистры. В случае, если их слишком много, или они должны быть отображенные на память (Есть указатели на них), находятся в стеке. Это же, как на i386 – PPC регистры, которые не вписываются в i386 регистров будет жить в стеке, и КПП стек регистров, а также.

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

КПП стека локальных переменных, возможно, придется скорректировать для i386, то есть все смещения R1-относительная доступ должен быть изменен.

Posted in Uncategorized | Comments Off

Статус.

В настоящее время мы концентрируем внимание на два отдельных подпроектов: одни работают над системой, чтобы  КПП приложения выполняются на Darwin/x86. Другие работают над “О внесении КПП” S Mach-O файлы запускать на Linux / PPC.

Наша нынешняя реализация позволяет запускать определенные консольные приложения в Mac OS X под Linux или FreeBSD или (на i386 машин) или под Mac OS X сама по себе (последнее очень полезно для тестирования). PearPC общего процессорного ядра работает замечательно в SoftPear, но больше работы предстоит сделать в отношении погрузчик, эмуляция динамический компоновщик и библиотеки поддержки. Хотя мы и нашли способ переадресовывать вызовы на стандартной библиотеки C Дарвина в стандартной библиотеке C хозяина, мы должны найти более общий путь для других библиотек.

Параллельно с этим мы продолжаем развитие собственного основного Recompiler которые ускорят эмуляции tremedously.

Posted in Uncategorized | Comments Off

About.

Проект направлен на создание программного обеспечения совместимости между IBM PC и Apple Macintosh архитектуры.

В Mac OS X, отличная операционная система доступна, к сожалению, работаеттолько на аппаратное Macintosh. Поэтому данный проект направлен на создание слоев совместимости для запуска Mac OS X на ПК аппаратных IBM.

Мы не развивать эмулятор для PowerPC машины Macintosh (например, “PearPC” или как “Василиск” и “ОАЭ” для других платформ), хотя, проект все больше сходства с Digital, “FX! 32″, FreeBSD, “Linux двоичных Compatbility “и” WINE “.

Вместо этого, Darwin/x86 или GNU / Linux будет работать на PC и Mac OS X пользовательского интерфейса, его библиотеки и все приложения, работающие на нем будут работать на Дарвина или GNU / Linux с использованием слоя совместимости SoftPear в.

Эта совместимость слой состоит из эмулятора / динамические Recompilerпользователей PowerPC код режиме и слой между PowerPC код x86 и родной код, который обрабатывает байтов вопросов.

Другой слой можно сделать x86 приложений, запущенных на вершине PowerPC Mac OS X библиотеки, которая, в свою очередь, работают на базе x86, так что Mac OS X приложений, которые были разработаны для PowerPC можно перекомпилировать x86 CPU. Кроме того, все, что knowlegde, которые будут получены путем Mac OS X работать на архитектуре IBM PC может помочь создать инструментарий, запасных частей и в конечном итоге все в Mac OS X под GPL, предоставляя полностью открытым исходным кодом Mac OS X клон для других процессоров, чем просто PowerPC.

Posted in Uncategorized | Comments Off