• Nie Znaleziono Wyników

Zadanie domowe 8 Wielki finał!

N/A
N/A
Protected

Academic year: 2021

Share "Zadanie domowe 8 Wielki finał!"

Copied!
2
0
0

Pełen tekst

(1)

Zadanie domowe 8 Wielki finał!

W tym zadaniu poskładacie do kupy wszystkie składniki kompilatora, nad którymi pracowaliście przez cały semestr i w rezultacie otrzymacie kompilator generujący kod MIPS-a, który naprawdę działa!

• Tym razem niczego nie trzeba ściągąć ani rozpakowywać, będziecie tylko lekko modyfikowali istniejące już pliki.

• W regalloc.sml zaimplementujcie uproszczoną wersję spillingu opisaną poniżej.

• Teraz, gdy macie już do dyspozycji wszystkie moduły i rozumiecie, jak wszystko działa, od- wiedźcie raz jeszcze plik codegen.sml i poprawcie adnotacje use/def generowanych przez Was instrukcji skokowych. Jeśli trzeba, zmodyfikujcie też zliczanie def-use w liveness.sml, ale nie zmieniajcie niczego w mips.sml.

• Przetestujcie Wasz kompilator w możliwie najbardziej dokładny sposób. Kompilacja niektórych programów może się przerywać, jeśli wymagana dla nich będzie pełna wersja spillingu. Tak czy inaczej upewnijcie się, że skompilowane przez Was programy nie posypią się po uruchomieniu w Spimie.

• Prześlijcie mailem pliki README oraz gzipowany katalog z wszystkimi plikami potrzebnymi do zbudowania i uruchomienia Waszego kompilatora. W osobnym pliku mytests.gz prześlijcie wszystkie programy, jakie wykorzystaliście do testowania Waszego kompilatora. W pliku RE- ADME opiszcie szczegółowo, które z dostarczonych programów testowych skompilowały się bez przeszkód. Jeśli coś nie działa, opiszcie problem i Wasze próby jego rozwiązania. Zaznaczcie też, co i w których z plików codegen i liveness zmodyfikowaliście i dlaczego. Termin zadania mija w czwartek, 6 lutego. Proszę pamiętać o oznaczeniu maila tagiem [aghtk].

Uproszczony spilling

To, co jeszcze zostało do zrobienia, to zaimplementowanie przechowywania i ładowania ”rozlanych”

rejestrów tymczasowych. Zostanie to zrobione w całości wewnątrz regalloc.sml

W uproszczonej wersji spillingu zakładamy, że każde rejestr tymczasowy, jaki się ”rozleje” pojawia się jedynie w instrukcjach Move oraz że żadna z instrukcji Move nie ”rozlewa” rejestrów tymczasowych równocześnie dla swojego źródła i celu. Niestety, te uproszczone założenia nie są zawsze spełnione, ale spełnione są wystarczająco często, aby udało nam się skompilować kilka programów w Fun-ie.

Bardziej szczegółowo, należy:

• w RegAlloc.alloc zliczyć liczbę n ”rozlanych” rejestrów tymczasowych;

• na samym początku prologu funkcji, tuż przed pierwszą instrukcją pierwszego bloku, wpisać instrukcję odejmującą n*wordSize ze wskaźnika stosu;

• zarezerwować offsety (0, 1, 2, ...) dla ”rozlanych” rejestrów tymczasowych;

• przetrawersować wszystkie instrukcje we wszystkich blokach funkcji; dla każdej instrukcji, dla której wszystkie use i def mają już przypisane kolory, użyć Mips.rename regs celem ich prze- pisania tak, aby możliwe było użycie rzeczywistych rejestrów wyspecyfikowanych przez alloc;

• w powyższym kroku, za każdym razem, gdy natraficie na instrukcję Move, której cel jest ”roz- lanym” rejestrem tymczasowym, skonwertujcie są do instrukcji Sw z odpowiednim offsetem ze wskaźnika stosu, a za każdym razem, gdy natraficie na instrukcję Move, której źródło jest ”roz- lanym” rejestrem tymczasowym, skonwertujcie są do instrukcji Lw z odpowiednim offsetem ze wskaźnika stosu;

• dla każdej instrukcji innej niż Move, dla której nie wszystkie use i def są odwzorowane przez funk- cję alloc, uproszczony spilling nie zadziała; w takim wypadku wywołajcie ErrorMsg.impossible;

• tuż za etykietą function.epilog wpiszcie instrukcję dodającą n*wordSize do wskaźnika stosu.

1

(2)

2

I to wszystko! Teraz nadszedł właściwy czas na odkorkowanie szampanów, bowiem mamy oto działa- jący kompilator generujący kod MIPS-a, który można przetestować na licznych programach z użyciem Spima. Jeżeli na tym etapie wykryjecie jeszcze jakieś błędy, poprawcie je!

Cytaty

Powiązane dokumenty

[r]

Napisanie, że okres obiegu musi być równy okresowi obrotu Ziemi dooko- ła osi, kierunek obrotu zgodny z kierunkiem obrotu Ziemi, płaszczyzna orbity musi leżeć w

• rozwiązad zadanie tekstowe związane z objętością graniastosłupa 11,12/229 13,15/230..

stosowad zamianę jednostek objętości w zadaniach

• obliczad pole powierzchni sześcianu, znając jego objętośd

(zadania wykonaj w zeszycie, zrób zdjęcie - czytelne i prześlij na sp17grudziadz@gmail.com do piątku 27 marca do godz.15) ZADANIE 1. Podane ułamki dziesiętne

a) Wyodrębnij poprawnie już sklasyfikowane wzorce należące do zbioru uczącego W kółeczkach różowych zaznaczone są wzorce źle sklasyfikowane. b) Dla niepoprawnie

Istnieje pewien szablon, pewne konwencje, które powtarzają się co roku.. Za każdym razem podobny problem, za każdym razem należy pisać