2015-02-08 71 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编译器都好得多。