Mert Efe Sensoy
Blog'a Dön

Sekiz Karakter: Berkeley SoftFloat'ı MVS 3.8j'ye Taşımak

4 dakikalık okumaMert Efe Şensoy
IBM ZMVSSoftFloatkayan-noktaC89

1981 tarihli bir anabilgisayar, dışa açık bir sembole sekiz büyük harf verir. Berkeley SoftFloat ise fonksiyonlarını softfloat_roundPackToF64 gibi adlandırır. ONFLY ikisine de mecbur; uzlaştırma, emülatör üzerinde ölçülmüş üç ayrı hataya mal oldu.

Sirkesineği beyni simülasyonu neden kendi kayan noktasını taşıyor

ONFLY, bir sirkesineğinin besleme devresini anabilgisayar iş yükü olarak çalıştırıyor ve aynı isteğin hedeflediği her platformda aynı parmak izini üretmesini şart koşuyor. Donanım aritmetiği bunu S/370 onaltılık kayan nokta ile IEEE ikili biçim arasında sağlayamaz, bu yüzden motor IEEE 754'ü yazılımda gerçekliyor.

Hangi sürümü kullanacağınızı belirleyen kısıt, kütüphanenin kendi sayfasında yazıyor. Release 3'ten beri SoftFloat C'de 64 bitlik bir tamsayı tipine bağımlı; böyle bir tipi olmayan derleyiciler 32 ve 64 bitlik biçimler için eski Release 2c'ye yönlendiriliyor (Berkeley SoftFloat).

GCCMVS tam olarak böyle bir derleyici. Release 3e onun üzerinde dört bağımsız nedenle düştü: dört ayrı noktada iç derleyici hatası, sessizce yanlış sonuç veren değişken kaydırmalı 64 bit sola kaydırma, PDPCLIB'de 64 bit çalışma zamanı yardımcılarının bulunmaması ve bunları yanlış biçimde isteyen bir kod üretimi hatası.

Tek bir PDS üyesine çözümlenen üç include adı

GCCMVS, #include "ad" ifadesini adın ilk sekiz karakterinden oluşan PDS üyesine çözümler: büyük harfe çevrilmiş, noktalama ve uzantı dahil. 11 Eylül 2026'da TK5 üzerinde, tek bir SOFTFLOA üyesine karşı ölçüldü. "softfloat.h", "softfloat-macros", "softfloat-specialize" ve "softfloa.h" yazımlarının dördü de aynı üyeye çözümlendi, dönüş kodu 0.

Release 2c'nin bits32/softfloat.c dosyası bu adlardan üçünü birden include ediyor ve üç dosya tek bir üyeye sığmaz. DD tanımında birden fazla kütüphaneyi art arda vermek de kurtarmıyor, çünkü MVS üyeyi ona sahip ilk kütüphaneden alır. Dosyaları yeniden adlandırmak ise kapalı bir kapı: third_party/ ağacı kayıt altındaki SHA-256 özetleriyle bayt bayt aynı kalmak zorunda.

GCC'nin -remap seçeneği zaten çok kısa adlı dosya sistemleri için var, yani tam bu duruma. Bu portta kabul ediliyor ve hiçbir etkisi olmuyor. Derleme bunun yerine birleştirme yapıyor: include'lar gönderim anında sırayla satır içine alınıyor ve diske hiç yazılmıyor, böylece kaynaktan sapabilecek ikinci bir kopya oluşmuyor.

Assembler XF'in 42 sembolün 38'i hakkında söyledikleri

Include sorunu çözüldükten sonra Release 2c dönüş kodu 0 ile derlendi ve assembler çıktıyı reddetti:

IFO196  FLOAT64@ HAS BEEN PREVIOUSLY DEFINED
IFO196  FLOAT32@ HAS BEEN PREVIOUSLY DEFINED
IFO196  INT32@TO HAS BEEN PREVIOUSLY DEFINED
IFO189  INVALID ENTRY OPERAND, LINKAGE CANNOT BE PERFORMED

Sekiz karaktere kırpıldığında Release 2c'nin 42 dışa açık adından 38'i üç çakışma grubuna düşüyor: on sekiz float32_*, on sekiz float64_* ve iki int32_to_*. Kütüphaneyi ayrı derleme birimlerine bölmek çakışmayı assembler'dan linkage editor'e taşımaktan öteye gitmiyor.

Çözüm, her dışa açık ada uyumlu bir karşılık veren üretilmiş bir #define önsözü. Bu önsöz x86'da da uygulanıyor, böylece yeniden adlandırma mekanizmasını olağan test paketi çalıştırıyor ve keşfi MVS'e bırakılmıyor.

#define ile yeniden adlandırılamayan, silinecek olan beş ad

Release 3e kendi derlemesi için aynı işlemi gerektiriyordu ve çakışan on üç adından beşi bunu kaldıramadı. Her biri hem primitives.h içinde hem de kendi kaynak dosyasında #ifndef <ad> biçiminde yazılmış. Bu, yukarı akımın belgelenmiş genişletme noktası: adı tanımlamak "bu fonksiyonu platform sağlıyor" demek, ve yukarı akım hem bildirimi hem tanımı atlıyor.

Yeniden adlandırma amaçlı bir makro dolayısıyla o beş fonksiyonu silerdi. ONFLY genişletme noktasını tasarlandığı gibi kullanıyor: softfloat/onfprim.c yukarı akımın kendi gövdelerini uyumlu adlar altında, bir betikle mekanik olarak türetilmiş halde taşıyor ve third_party/ hiç ellenmiyor.

Bir fonksiyon gövdesini kopyalamak, kopyanın aynı davrandığını kanıtlamaz. Kanıt, bunların hiçbiri yokken hesaplanmış olan altın kabul parmak izleri; bir ilkel değişseydi onlar da değişirdi.

Haftalarca çakışmayı raporlayıp hiçbir şeyi zorlamayan lint

Projenin C-04 lint'i, port başlamadan önce de SoftFloat'ın sekiz karakteri aşan sembollerini listeliyordu, ama yalnızca ONFLY'ın kendi adlarında ihlal sayıyordu. Release 2c'nin Assembler XF'e kadar fark edilmeden ulaşması bu yüzden oldu. Artık zorluyor ve yeniden adlandırılmamış nesne üzerinde çalıştırıldığında assembler'ın bulduğu üç grubun aynısını üretiyor.

Asıl korktuğu hata sessiz olanı. Yalnızca sekizinci karakterden sonra veya yalnızca büyük küçük harf bakımından farklılaşan iki ad, MVS linkage editor için aynı semboldür; program temiz bağlanır ve yanlış fonksiyonu çağırır.

İki SoftFloat sürümünün uyumu, ikisi de taşınmadan önce x86 üzerinde ve birbirlerine karşı değil Berkeley TestFloat'a karşı kapatıldı: altı işlemde 260.376 vaka, sıfır uyuşmazlık, 18.408 NaN vakası hariç (TestFloat). Bağımsız bir kahin ile uyuşan iki kütüphane, birbiriyle uyuşan iki kütüphaneden fazlasını söyler.

MVS üzerinde bugüne kadar gerçekten derlenenler

Kayan nokta kütüphanesi ve üç test sürücüsü, Hercules altındaki MVS 3.8j TK5 üzerinde çalışıyor. ONFLY motor kodunun hiçbiri orada henüz derlenmedi: motor, çekirdek, çözücü ve istek döngüsü başka platformlarda sınandı. MVS üzerindeki TestFloat koşusu x86'daki 260.376 vakaya karşılık 4.500 vaka kapsıyor; akış boyunca katmanlı örneklenmiş olsa da bir örneklem.

Dört geçici çözüm taşıyıcı durumda ve hiçbiri depoda değil: iki ayrı derleyici hatasının arasından geçen -O1 sabitlemesi, Hercules'in 819/1047 kod sayfası, include birleştirmesi ve sembol yeniden adlandırmaları. Hercules yeniden başlatılınca kod sayfası sessizce eski haline döner, bu yüzden gönderim aracı böyle bir durumda işi göndermeyi reddediyor.

PDS tabanlı bir araç zincirine bir şey taşıyorsanız, ONFLY deposundaki C-04 lint'ini ve yeniden adlandırma üreteçlerini inceleyin; sekiz karakter kuralı sizi test paketinizden önce bulacak.

Kaynaklar

Yukarıdaki her iddia bu kaynaklardan birine dayanıyor. Bağlantılar yeni sekmede açılır.

  1. ONFLY

    GitHubDepoerişim 16 Eyl 2026

  2. Berkeley SoftFloat

    John R. HauserÜretici araştırmasıerişim 16 Eyl 2026

  3. Berkeley TestFloat

    John R. HauserÜretici araştırmasıerişim 16 Eyl 2026