C创建一个新类型的int

时间:2015-02-08 20:54:28

标签: c gcc compiler-construction

我知道编译器在64位体系结构上支持某些类型,如__int128_t。它基本上在2个寄存器中存储一个数字。现在,有没有办法在64位机器上创建像__int256_t这样的东西?

基本上,我想知道是否有办法扩展编译器以支持在4个寄存器上存储数字的数据类型,并且以某种方式重载+运算符以正确添加它们。

3 个答案:

答案 0 :(得分:3)

不在C中。数字数据类型在编译器中实现,不能由应用程序扩展。

这在C ++中是可行的,尽管该对象通常最终存储在堆栈中,而不是存储在寄存器中。

答案 1 :(得分:3)

您可能需要为编译器配置新目标。

如果考虑GCC,请尝试修补主干(未来的GCC 5.0,将于2015年春季发布),因为它有更好的支持(请参阅其gcc/wide-int.h文件)以获得所谓的广告。您可能还需要修补gcc/config/i386/,特别是某些*.md - 机器描述文件。

要注意,这是一项大量工作(数月)。你不能只使用像bignum这样的GMPlib库吗?

顺便说一下,你还需要定义一个新的ABI和新的calling conventions ......

我认为不值得努力。一个更简单的工作(仍需数周的努力)可能是使用MELT在GCC中自定义一些优化传递,以帮助使用 GMPlib (或您的struct myint256_t)或许通过其他内置函数等....

如果您只是想使用某些编译器来执行此操作并且不关心性能,请修改一些更简单的编译器,如tinyccnwcc

一个更简单的项目是从你的方言C到256位int到一些更普通的C代码(将int256_t翻译成某些struct myint256_t等)的翻译器。您还可以查看内置支持bignums的语言,例如Common Lisp及其SBCL实现。请注意,有效的bignum算法在算法上非常棘手。

请注意,在C++11(以及某些早期版本的C ++)中,您可以覆盖operator +以便能够编写a + ba和{{1}复制b mpz_class或您自己的一个实例

答案 2 :(得分:3)

在C中,您可能正在寻找类似GMP库的内容,它允许您拥有任意大小的数字。

可以将它物理地添加到C编译器中,但这将是很多工作,并且大多数有兴趣的人已经使用GMP或许多类似的库之一。

如果您想了解,使用Clue C Compiler作为其前端的the Sparse parser可能会更好;他们比任何真实的'更好。 C编译器。