Visual C++ ARM64平台下128位整数对应特性咨询
ARM64平台下Visual C++对应Intel SSE特性的替代方案
针对ARM64目标平台,Visual C++提供对ARM NEON指令集的原生支持,以此替代Intel平台的SSE相关特性(如__m128i和_mm_set1_epi8等函数)。以下是核心对应特性的详细说明:
1. 向量数据类型替代
Intel的__m128i是通用128位整数向量类型,ARM64下对应NEON的强类型128位向量类型,需根据元素的位宽和符号选择:
- 8位整数向量:
__int8x16_t(16个有符号8位整数)、__uint8x16_t(16个无符号8位整数) - 16位整数向量:
__int16x8_t(8个有符号16位整数)、__uint16x8_t(8个无符号16位整数) - 32位整数向量:
__int32x4_t(4个有符号32位整数)、__uint32x4_t(4个无符号32位整数) - 64位整数向量:
__int64x2_t(2个有符号64位整数)、__uint64x2_t(2个无符号64位整数)
2. 核心内置函数对应示例
NEON内置函数命名遵循ARM标准规范(前缀v、q表示128位向量,后缀标识元素类型和操作),以下是和Intel SSE常用函数的对应关系:
广播操作(将单个值填充到向量所有元素)
- Intel
_mm_set1_epi8(int8_t a)→ ARM64vdupq_n_s8(int8_t a)(有符号)/vdupq_n_u8(uint8_t a)(无符号) - Intel
_mm_set1_epi16(int16_t a)→ ARM64vdupq_n_s16(int16_t a)/vdupq_n_u16(uint16_t a) - Intel
_mm_set1_epi32(int32_t a)→ ARM64vdupq_n_s32(int32_t a)/vdupq_n_u32(uint32_t a)
加载/存储操作
- Intel
_mm_load_si128(__m128i const* ptr)→ ARM64vld1q_s8(int8_t const* ptr)/vld1q_u8(uint8_t const* ptr)(根据元素类型选择) - Intel
_mm_store_si128(__m128i* ptr, __m128i val)→ ARM64vst1q_s8(int8_t* ptr, __int8x16_t val)/vst1q_u8(uint8_t* ptr, __uint8x16_t val)
算术运算
- Intel
_mm_add_epi8(__m128i a, __m128i b)→ ARM64vaddq_s8(__int8x16_t a, __int8x16_t b)/vaddq_u8(__uint8x16_t a, __uint8x16_t b) - Intel
_mm_sub_epi8(__m128i a, __m128i b)→ ARM64vsubq_s8(__int8x16_t a, __int8x16_t b)/vsubq_u8(__uint8x16_t a, __uint8x16_t b) - Intel
_mm_mullo_epi16(__m128i a, __m128i b)→ ARM64vmulq_s16(__int16x8_t a, __int16x8_t b)/vmulq_u16(__uint16x8_t a, __uint16x8_t b)
比较运算
- Intel
_mm_cmpeq_epi8(__m128i a, __m128i b)→ ARM64vceqq_s8(__int8x16_t a, __int8x16_t b)/vceqq_u8(__uint8x16_t a, __uint8x16_t b) - Intel
_mm_cmpgt_epi8(__m128i a, __m128i b)→ ARM64vcgtq_s8(__int8x16_t a, __int8x16_t b)/vcgtq_u8(__uint8x16_t a, __uint8x16_t b)
3. 使用注意事项
- ARM64项目默认启用NEON支持,若需手动配置,可在项目属性的“C/C++ → 代码生成”中确保“启用NEON”选项开启
- NEON函数是强类型的,必须匹配向量的元素类型(符号、位宽),否则会编译报错
- 部分SSE操作的行为与NEON存在细微差异(如饱和运算的触发条件),需根据ARM指令特性调整逻辑
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

