首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“Visual 2019年的无符号__int128`

“Visual 2019年的无符号__int128`
EN

Stack Overflow用户
提问于 2021-07-13 08:33:59
回答 1查看 1.2K关注 0票数 0

我正在尝试编译QuickJS,它通常是在linux下开发的,gcc对这些代码没有问题。但是,我在Visual 2019上编译它时遇到了困难:

代码语言:javascript
复制
typedef unsigned __int128 uint128_t;

有人知道怎样才能让这件事发挥作用吗?

错误是:

error C4235: Non-standard extension: The __int128 keyword is not supported for this architecture.

但是,__m128是受支持的,而不是unsigned,所以这对此没有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-13 10:16:10

因此,__m128被定义为一个联合:

代码语言:javascript
复制
typedef union __declspec(intrin_type) __declspec(align(16)) __m128 {
     float               m128_f32[4];
     unsigned __int64    m128_u64[2];
     __int8              m128_i8[16];
     __int16             m128_i16[8];
     __int32             m128_i32[4];
     __int64             m128_i64[2];
     unsigned __int8     m128_u8[16];
     unsigned __int16    m128_u16[8];
     unsigned __int32    m128_u32[4];
 } __m128;

显然,它可以通过其m128_uXX成员用于无符号操作,但它不能像内置数据类型(包括用unsigned进行限定)那样在语义上使用,也不能用于内置算术操作--它需要专门定义的函数/扩展对其进行操作。它打算与SSE/SSE 2 SIMD扩展一起使用

微软的实现不包括扩展128位整数类型。

就QuickJS代码而言,问题在前面的libbf.h代码中有:

代码语言:javascript
复制
#if defined(__x86_64__)
#define LIMB_LOG2_BITS 6
#else
#define LIMB_LOG2_BITS 5
#endif

#define LIMB_BITS (1 << LIMB_LOG2_BITS)

因此,对于64位编译LIMB_BITS == 64。我建议两种解决方案之一:

  • 使用32位编译使LIMB_BITS == 32
  • 因此修改libbf.h:#如果定义了(__x86_64__) 因此在MS构建中省略了128位定义。
  • 使用具有内置__int128的Windows编译器,如Mingw64。

我注意到有一个QuickJS Visual端口这里,但是看看生成VS解决方案的代码和lua脚本,我并不清楚这个问题是如何解决的,即使解决了这个问题。readme.md文件说要下载和安装premake5,但是链接被破坏了。我当时就放弃了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68359067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档