Лекція №11.
Емуляція множини ММХ інструкцій. Стан ММХ та злиття ММХ регістрів. Спроможність контекстного перемкнення регістрів в залежності від задачі. Виключення при виконанні ММХ інструкцій. Налаштування ММХ програм.
Процесори Intel Architecture не підтримують емуляцію MMX, як це робиться для інструкцій з плаваючою комою. Прапорець EM в регістрі управління CR0 не може бути застосований для емуляції інструкцій MMX. Якщо виконується інструкція MMX при встановленому прапорці EM, генерується виключення Invalid Opcode.
Стан MMX склаждається з восьми 64-бітових регістрів(від MM0 до MM7). Ці регістри зсилаються на регістри плаваючої коми R0 - R7. Коли відбувається запис значення в регістр MMX, значення також з’являються у відповідних регістрах плаваючої коми. Аналогічно, при записі даних в регістр плаваючої коми, воно з’являються і в регістрі MMX.
Виконання інструкції MMX може викликати як наслідок декілька побічних ефектів у регістрах FPU, FPU tag word, FPU status word:
При записі інструкцією MMX значення в регістр MMX, одночасно біти 64-79 відповідних регістрів плаваючої коми встановлюються в 1.
При виконанні інструкції MMX кожен з полів тегів в FPU tag word встановлюється в 00B.
При виконанні інструкції EMMS кожен з полів тегів в FPU tag word встановлюється в 11B.
Кожного разу при виконанні інструкції MMX значення TOS встановлюється в 000B.
EMBED PBrush Виконання інструкцій MMX не має впливу на інші біти в FPU Status Word або вміст інших регістрів FPU.
В таблиці зведено вплив інструкцій MMX на стан FPU.
При переключенні з одної задачі на іншу або одного контексту на інший часто буває необхідним збереження стану MMX. В загальному, якщо наявний код переключення задач для оперційної системи включає можливості для запису стану FPU, ці можливості можна розхповсюдити для MMX.
При розробці нових засобів збереження стану MMX(FPU) для операційної системи, наявними є декілька підходів:
Операційна система може вимагати, щоб програма брала відповідальність за збереження стану MMX.
Операційна система повинна брати відповідальність за автоматичне збереженя стану MMX як частину процесу переключення задач і автоматичне відновлення стану MMX при відновленні роботи призупиненої задачі. Так, стан MMX повинен бути збережений як частина стану задачі. Цей підхід може бути застосовний для багатозадачності типу Preemptive.
Операційна система бере відповідальність за збереження стану MMX як частину процесу переключення задач, але затримує збереження стану до тих пір, доки нова задача дійсно не виконає інструкцію MMX.
Інструкції MMX не генерують виключень плаваючої коми і не змінюють стану прапорців регістру EFLAGS або FPU status word. При виконанні інструкцій MMX можуть виникнути наступні виключення:
Виключення доступу до пам’яті
Stack-segment fault(збій сегменту стеку)
General protection(загальний захист)
Page fault(збій сторінки)
Alignment check.(перевірка вирівнювання)
Системні виключення:
Невірний код операції, якщо прапорець EM в керуючому регістрі CR0 встановлений при виконанні інструкції MMX
Пристрій недоступний, якщо інструкція MMX виконується при встановленому прапорці TS керуючого регістру CR0.
Помилка плаваючої коми
Інші виключення можуть трапитись при неявному звертанні до обробників виключень.
Якщо виключення плаваючої коми очікує і процесор починає виконувати інструкцію MMX, процесор генерує помилку плаваючої коми(floating-point error) перед виконанням інструкції MMX, для дозволу виключенню бути обслуженим обробником виключень плаваючої коми. Поки виконується обробник, стан FPU зберігається і є видимим для обробника. Після повернення з обробника виключень, інструкція MMX виконується і може змінити стан FPU.
Можливості відлагодження в архітектурі Inel для інструкцій MMX подібні до відлагодження звичайних інструкцій.
Для коректної інтерпретації вмісту регістрів MMX або FPU з образу FSAVE в пам’яті, відлагоджувачу потрібно зробити підрахунок зв’язків між логічним розташуванням регістрів FPU і фізичним розташуванням TOS і регістрів MMX.
На рисунку зображено внутрішній цикл посилання на фізичне розташування регістрів FPU і MMX. Зовнішній цикл посилається на регістри FPU відносно розташування біжучого TOS.
EMBED PBrush Коли TOS рівний 0, ST0 вказує на фізичне розташування R0 в стеку плаваючої коми(float-point stack). MM0 мапується в ST0, MM1 мапується в ST1 і т.д.
Якщо TOS рівний 2, ST0 вказує на фізичне розташування R2. MM0 мапується в ST6, MM1 мапується в ST7, MM2 в ST0 і т.д.