Tag: linux x32 abi

如果有或没有x32 ABI,如何为x86_64定义 int_fastN_t类型?

除其他外, x32 ABI为x86_64体系结构生成的代码指定了32位指针。 它结合了x86_64架构(包括64位CPU寄存器)的优点和减少的32位指针开销。 头定义了int_fast8_t , int_fast16_t , int_fast32_t和int_fast64_t (以及相应的无符号类型uint_fast8_t等),每个都是: 一种整数类型,通常在具有至少指定宽度的所有整数类型中运行最快 用脚注: 指定类型不能保证最快用于所有目的; 如果实现没有明确的理由选择一种类型而不是另一种类型,它将简单地选择一些满足符号和宽度要求的整数类型。 (引自N1570 C11草案 。) 问题是,无论是否有x32 ABI,如何为x86_64架构定义[u]int_fast16_t和[u]int_fast32_t类型? 是否有指定这些类型的x32文档? 它们是否应与32位x86定义(均为32位)兼容,或者,由于x32可以访问64位CPU寄存器,它们是否应该具有相同的大小,有或没有x32 ABI? (请注意,无论x32 ABI是否正在使用,x86_64都有64位寄存器。) 这是一个测试程序(取决于特定于gcc的__x86_64__宏): #include #include #include int main(void) { #if defined __x86_64__ && SIZE_MAX == 0xFFFFFFFF puts(“This is x86_64 with the x32 ABI”); #elif defined __x86_64__ && SIZE_MAX > 0xFFFFFFFF puts(“This is x86_64 […]

如何在预处理器中检测X32 ABI或环境?

X32是使用32位指针的amd64 / x86_64 CPU的ABI。 我们的想法是将较大的x86_64寄存器组与32位指针产生的较小内存和高速缓存占用空间相结合。 它提供高达约40%的加速。 有关详细信息并将其设置为chroot环境,请参阅Stack Overflow上的x86,x32和x64体系结构与Debian X32 Ports wiki页面之间的区别 。 我们在环境下有一个来自Debian维护者的错误报告。 报告是adcq是非法指令。 内联汇编是基于预处理器宏激活的,因此我们没有正确检测X32(或者更正确,直到现在都没有)。 对于预处理器宏,最明显的选择(对我来说)就像__X32__ ,但是没有提供。 基于Clang的补丁和Debian的建议 ,看起来可以使用__ILP32__ 。 但是我想要一个更规范的答案,因为_ILP32和__code_model_small__看起来也很有趣。 (我知道SSE2的问题,编译器支持它,但操作系统没有)。 在使用Clang和GCC时,可以使用哪些预处理器宏可靠地检测X32 ABI和环境? 要清楚,我现在不是要修改代码。 我只想知道可以在完全修复中使用的宏。 # cpp -dM < /dev/null | sort #define __amd64 1 #define __amd64__ 1 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_CONSUME 1 #define __ATOMIC_HLE_ACQUIRE 65536 #define __ATOMIC_HLE_RELEASE 131072 #define […]