2015-02-08 234 views
4

我知道編譯器支持64位體系結構中的一些類型,如__int128_t。它基本上在2個寄存器中存儲一個數字。現在,有沒有辦法在64位機器上創建類似__int256_t的東西?C創建一個新類型的int

基本上,我想知道是否有一種方法來擴展編譯器以支持在4個寄存器上存儲數字的數據類型,例如,以某種方式重載+運算符以正確添加它們。

+0

你爲什麼問到?爲什麼你不能使用[GMPlib](http://gmplib.org/)?什麼處理器,什麼編譯器(我猜GCC,因爲你標記它),什麼操作系統?對於什麼源代碼?請編輯您的問題以改進它! – 2015-02-08 21:06:18

+1

這個問題只是爲了提高我對語言和編譯器的知識/理解,沒有任何實際的結果(將原始數據類型存儲在4個或更多寄存器中實際上是不切實際的)。所以我從理論的角度要求更多。而且,這可以通過使用具有4個整數並且功能增加/增加的結構來輕鬆實現。但是,問題的另一個問題是如何讓我的新類型表現得像一個內置的類型。 – Paul92 2015-02-08 21:09:43

+0

你準備花費數週或數月的工作? – 2015-02-08 21:10:22

回答

3

您可能需要爲編譯器配置新的目標。

如果想到GCC,試着修補trunk(未來的GCC 5.0,將在2015年春季發佈),因爲它有更好的支持(見gcc/wide-int.h文件)用於所謂的寬整數。您可能還需要修補gcc/config/i386/,特別是某些*.md-機器描述文件。

當心,這是一個很大的工作(月)。難道你不能僅僅使用一些bignum庫,如GMPlib而不是?

順便說一句,你需要定義一個新的ABI和新calling conventions太...

我會認爲這是不值得的。一個簡單的工作(還是周的努力)可能是定製使用MELT幫助使用GMPlib在GCC一些優化過程(或您struct myint256_t的)也許直通附加建宏等....

如果你只是想一些編譯器做到這一點,不關心性能發揮,黑客就像tinyccnwcc

一些更簡單的編譯一個簡單的項目是從256位整數的C方言翻譯到一些普通的C代碼(將int256_t翻譯成一些struct myint256_t等)。您也可以查看bignums的內置支持語言,如Common Lisp及其SBCL實施。請注意,高效的算術算法在算法上非常棘手。

請注意,在C++11(和一些早期版本的C++),你可以重寫operator +要能寫a + b(其中兩個ab是一個複雜的classmpz_class或自己一個某些情況下)

+0

另一種方法是使用'__int128_t [2]'或一個2成員結構,但當然所有的算術運算符將不得不重新實現爲函數或宏。 – ouah 2015-02-08 21:06:43

+0

我們可以通過MELT中的某些特別優化代碼來幫助優化這些宏... – 2015-02-08 21:07:43

3

不在C中。數字數據類型在編譯器中實現,不能由應用程序擴展。

這將在C++中可行,儘管對象通常最終會存儲在堆棧中,而不是寄存器中。

3

在C中,您可能正在尋找類似GMP庫的庫,它允許您擁有任意大小的數字。

將它物理地添加到C編譯器是可能的,但這將是很多工作,大多數人會有興趣使用GMP或許多類似的庫之一。

如果你想學習,你可能會更好Clue C Compiler它使用the Sparse parser作爲它的前端;它們比任何'真正'的C編譯器都好得多。