Yazmaçların yeniden adlandırılması

**Yazmaçların yeniden adlandırılması**, işlemcilerde, yürütülen buyruklardaki, aynı yazmaçların tekrar kullanımından doğan sahte bağımlılıkları gidermek için kullanılan bir yöntemdir.

## Sorun
Programlar bazı değerler üretmek için kullanılan komutlardan oluşmuştur. İşlemci içerisinde komutlara girdi ve çıktı olarak kullanılan değerler yazmaçlardan okunur ve yazmaçlara yazılır. İşlemci içerisinde farklı buyruklar farklı sürelerde işlenirler.

Mesela, bir işlemci ana bellekten bir yükleme işlemini gerçekleştirdiği sürede yüzlerce buyruğu işleyebilir. Kısa buyrukların işlenmesi daha hızlı olduğundan işlemci içerisinde buyrukların işlenmesinin tamamlanması program sırasından bağımsız gerçekleşir. Yüksek performanslı işlemciler tarafından yüksek hızlara ulaşmak için sırasız yürütüm kullanılır.

Aşağıda sırasız yürütüm yapan bir işlemcinin buyrukları görülmektedir;

# Yazmaç 1'e bellek konumu 1024'teki veriyi yükle.
# Yazmaç 1'e 24 sayısını ekle.
# Yazmaç 1'deki veriyi bellek konumu 1031'ye sakla.
# Yazmaç 1'e bellek konumu 2048'deki veriyi yükle.
# Yazmaç 1'e 4 sayısını ekle.
# Yazmaç 1'deki veriyi bellek konumu 2056'ya sakla.

Yukarıda görüldüğü üzere, 4. 5. ve 6. buyruklar 1. 2. ve 3. buyruklardan bağımsızdır fakat işlemci 3. buyruğu tamamlamadan 4. buyruğu işleyemez. 4. buyruk 3. buyruktan önce işlenirse 3. buyrukta bellek konumu 1032'ye yanlış değer yazılmış olur.

Bu karşılaştığımız sınırlamayı bazı yazmaçların ismini değiştirerek çözebiliriz. Mesela,
 
# Yazmaç 1'e bellek konumu 1024'teki veriyi yükle.
# Yazmaç 1'e 2 sayısını ekle.
# Yazmaç 1'deki veriyi bellek konumu 1032'ye sakla.
# **Yazmaç 2'ye** bellek konumu 2048'deki veriyi yükle.
# **Yazmaç 2'ye** 4 sayısını ekle.
# **Yazmaç 2'deki** veriyi bellek konumu 2056'ya sakla.

Yukarıda görülen düzenlemeyle, artık 4. 5. ve 6. buyruklar, 1. 2. ve 3. buyruklarla aynı anda işlenebilir, bu sayede işlemler daha hızlı bir şekilde tamamlanabilir.

Yazmaç yeniden adlandırma işlemi derleyici tarafından yapılır ancak buyruk kümesinde bulunan sınırlı sayıdaki yazmaçlar derleyicileri sınırlandırır. Birçok yüksek performanslı işlemci buyruk kümesinde mümkün olduğunca çok fiziksel yazmaç kullanır.

## Bağımlılıklar
Bir yazmaca birden fazla buyruk yazmaçtaki veriyi okumak ya da yazmak için erişmek isterse ve buyruklar program sırasının dışında yürütülürse, üç çeşit bağımlılık meydana gelebilir. 
    
;Bu sorunlar

### Yazmadan Sonra Okuma (YSO)
Yazmaçtan ya da bellekten okunan veri, yazmaca veya belleğe program sırasına göre, başka değil, en son yazılan veri olmalıdır. Bu bağımlılık türüne **gerçek bağımlılık** denir.

### Yazmadan Sonra Yazma (YSY)
Birden fazla komut aynı bellek konumunu veya yazmacı güncellemek istiyorsa alanı doğru sırada güncellemeleri gerekir. Bu bağımlılığa **çıktı bağımlılığı** denir.

### Okumadan Sonra Yazma (OSY)
Bir buyruk, bir yazmaca veya bellek alanına yazma yapacaksa bu buyruk yazmacın veya bellek alanının önceki değerini okuyacak olan tüm buyrukların işlenmesinin tamamlanmasını beklemelidir. Bu tür bağımlılıklara **sahte bağımlılık** denir.

Bütün okuma işlemlerinin tamamlanmasını beklemek yerine, alanın eski verisini ve yeni verisini tutan iki farklı kopyası tutulabilir. Program sırasınca bir yazma işleminden önce gelen okuma buyrukları eski veriyi tutan alanı kullanırken, program sırasınca yazma işleminden sonra gelen okuma işlemleri de yeni veriyi tutan alanı kullanır. OSY bağımlılığı bu sayede aşılmış olur ve buyruklar program sırasından bağımsız işletilmeye devam edebilir. Eski veriyi tutan alanı okuyacak tüm buyruklar bittiğinde bu alan bırakılabilir. Yazmaç yeniden adlandırmanın arkasındaki ana fikir budur.

Eğer programın yazmaçları hemen kullanmaları kaçınılabilir olursa yazmaç yeniden adlandırmaya gerek kalmazdı. Bu sebepten IA–64 gibi bazı buyruk kümeleri çok büyük miktarda yazmaç kullanırlar. Fakat yazmaç sayısını arttırmanın bazı sınırlamaları vardır;

* Derleyiciler için kod miktarını arttırmadan yazmaçların yeniden kullanımından kaçınmak çok zordur. Örneğin döngü yapıları için aynı kodun defalarca kez farklı yazmaçlar kullanılarak tekrarlanması gerekir. Kod sayısının artması önemli bir etkendir, çünkü program kodu arttıkça buyruk önbelleğinde bulamama oranı da artar ve bu yüzden işlemci yeni komut için bekleme gecikmesi yaşar.
* Çok sayıda yazmaç gösterilebilmek için çok sayıda bite ihtiyaç duyulur ve bu da kod büyüklüğünü arttırır.
* Birçok buyruk kümesi eskiden az sayıda yazmaç tanımlamıştır ve bunu artık değiştirmek zordur.