【问题标题】:C creating a new type of intC 创建一种新的 int 类型
【发布时间】:2015-04-08 13:42:37
【问题描述】:

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

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

【问题讨论】:

  • 你到底为什么要问?为什么不能使用GMPlib?对于什么处理器,什么编译器(我猜是 GCC,因为你标记了它),什么操作系统?对于什么源代码?请编辑您的问题以改进它!
  • 这个问题只是为了提高我对语言和编译器的知识/理解,没有任何实际结果(将原始数据类型存储在 4 个或更多寄存器上实际上是不切实际的)。所以我从理论的角度要求更多。此外,这可以很容易地使用具有 4 个整数和函数的结构来实现加法/乘法。但同样,问题在于让我的新类型表现得像一个内置类型。
  • 您准备好为此花费数周或数月的时间了吗?
  • @BasileStarynkevitch:我准备花几天时间来了解它是如何完成的。
  • 几天时间还不够理解....

标签: c gcc compiler-construction


【解决方案1】:

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

如果考虑GCC,请尝试修补主干(未来的 GCC 5.0,将于 2015 年春季发布),因为它对所谓的宽整数有更好的支持(参见其gcc/wide-int.h 文件)。您可能还需要修补 gcc/config/i386/,尤其是一些 *.md -machine description- 文件。

请注意,这需要大量的工作(几个月)。你不能只使用一些bignum 库,比如GMPlib 吗?

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

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

如果你只是想用一些编译器来做这件事而不关心性能,那就破解一些更简单的编译器,比如 tinyccnwcc

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

请注意,在 C++11(和一些早期版本的 C++)中,您可以覆盖 operator + 以便能够编写 a + b(其中 ab 都是复杂 @987654344 的一些实例@mpz_class 或者你自己的)

【讨论】:

  • 另一种方法是使用 __int128_t [2] 或 2 个成员结构,但当然所有算术运算符都必须重新实现为函数或宏。
  • 并且可以通过一些在 MELT 中编码的临时优化通道来帮助优化这些宏...
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 C 语言中,您可能正在寻找类似 @​​987654321@ 库的东西,它允许您拥有任意大小的数字。

    将其物理添加到 C 编译器是可能的,但工作量很大,而且大多数有兴趣的人已经在使用 GMP 或许多类似库之一。

    如果你想学习,使用Clue C Compiler 可能会更好,它使用the Sparse parser 作为前端;它们比任何“真正的”C 编译器都要好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2020-10-16
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多