AVX256指令集

所有函数

16 位/32位/8位有符号整数向量的绝对值

__m256i _mm256_abs_epi16 (__m256i a)
__m256i _mm256_abs_epi32 (__m256i a)
__m256i _mm256_abs_epi8 (__m256i a)

分别获取16个16位/8个32位/32个8位有符号整数向量的取绝对值的结果。

16 位/32位/64位/8位有符号整数向量的相加

__m256i _mm256_add_epi16 (__m256i a, __m256i b)
__m256i _mm256_add_epi32 (__m256i a, __m256i b)
__m256i _mm256_add_epi64 (__m256i a, __m256i b)
__m256i _mm256_add_epi8 (__m256i a, __m256i b)

分别获取16个16位/8个32位/4个64位/32个8位有符号整数向量的对应相加的结果。

16 位/8位有符号/16位/8位无符号整数向量的包和处理相加

__m256i _mm256_adds_epi16 (__m256i a, __m256i b)
__m256i _mm256_adds_epi8 (__m256i a, __m256i b)
__m256i _mm256_adds_epu16 (__m256i a, __m256i b)
__m256i _mm256_adds_epu8 (__m256i a, __m256i b)

对于有符号整数,饱和处理会将结果限制在特定的范围内,以防止溢出。例如,如果进行加法运算时结果超过了有符号整数的最大值(例如,对于16位有符号整数,最大值为32767),饱和处理会将结果设为最大值(32767);如果结果小于最小值(例如,对于16位有符号整数,最小值为-32768),饱和处理会将结果设为最小值(-32768)。相当于clamp了一下。

没明白的指令

__m256i _mm256_alignr_epi8 (__m256i a, __m256i b, const int imm8)
__m256i _mm256_blend_epi16 (__m256i a, __m256i b, const int imm8)
__m128i _mm_blend_epi32 (__m128i a, __m128i b, const int imm8)
__m256i _mm256_blend_epi32 (__m256i a, __m256i b, const int imm8)
__m256i _mm256_blendv_epi8 (__m256i a, __m256i b, __m256i mask)
__m128i _mm_broadcastb_epi8 (__m128i a)
__m256i _mm256_broadcastb_epi8 (__m128i a)
__m128i _mm_broadcastd_epi32 (__m128i a)
__m256i _mm256_broadcastd_epi32 (__m128i a)
__m128i _mm_broadcastq_epi64 (__m128i a)
__m256i _mm256_broadcastq_epi64 (__m128i a)
__m128d _mm_broadcastsd_pd (__m128d a)
__m256d _mm256_broadcastsd_pd (__m128d a)
__m256i _mm_broadcastsi128_si256 (__m128i a)
__m256i _mm256_broadcastsi128_si256 (__m128i a)
__m128 _mm_broadcastss_ps (__m128 a)
__m256 _mm256_broadcastss_ps (__m128 a)
__m128i _mm_broadcastw_epi16 (__m128i a)
__m256i _mm256_broadcastw_epi16 (__m128i a)

对两个 256 位整数寄存器中的对应元素执行按位与操作

__m256i _mm256_and_si256 (__m256i a, __m256i b)

两个 256 位整数寄存器中的对应元素执行按位非与操作

__m256i _mm256_andnot_si256 (__m256i a, __m256i b)

对两个 256 位整数寄存器中的对应元素执行无符号16位/8位整数平均值计算

__m256i _mm256_avg_epu16 (__m256i a, __m256i b)
__m256i _mm256_avg_epu8 (__m256i a, __m256i b)

将 256 位整数寄存器中的数据向左/向右移动指定数量的字节

__m256i _mm256_bslli_epi128 (__m256i a, const int imm8)
__m256i _mm256_bsrli_epi128 (__m256i a, const int imm8)

两个 256 位整数寄存器中的对应元素执行相等性比较。

__m256i _mm256_cmpeq_epi16 (__m256i a, __m256i b)
__m256i _mm256_cmpeq_epi32 (__m256i a, __m256i b)
__m256i _mm256_cmpeq_epi64 (__m256i a, __m256i b)
__m256i _mm256_cmpeq_epi8 (__m256i a, __m256i b)

如果相等则相应位置的结果为全1(0xFFFF/0xFFFFFFFF/0xFFFFFFFFFFFFFFFF/0xFF),否则为全0

两个 256 位整数寄存器中的对应元素执行大于的比较

__m256i _mm256_cmpgt_epi16 (__m256i a, __m256i b)
__m256i _mm256_cmpgt_epi32 (__m256i a, __m256i b)
__m256i _mm256_cmpgt_epi64 (__m256i a, __m256i b)
__m256i _mm256_cmpgt_epi8 (__m256i a, __m256i b)

如果大于则相应位置的结果为全1(0xFFFF/0xFFFFFFFF/0xFFFFFFFFFFFFFFFF/0xFF),否则为全0

将 128 位整数寄存器中的 m 位有符号整数扩展为 n 位整数

__m256i _mm256_cvtepi16_epi32 (__m128i a)
__m256i _mm256_cvtepi16_epi64 (__m128i a)
__m256i _mm256_cvtepi32_epi64 (__m128i a)
__m256i _mm256_cvtepi8_epi16 (__m128i a)
__m256i _mm256_cvtepi8_epi32 (__m128i a)
__m256i _mm256_cvtepi8_epi64 (__m128i a)
__m256i _mm256_cvtepu16_epi32 (__m128i a)
__m256i _mm256_cvtepu16_epi64 (__m128i a)
__m256i _mm256_cvtepu32_epi64 (__m128i a)
__m256i _mm256_cvtepu8_epi16 (__m128i a)
__m256i _mm256_cvtepu8_epi32 (__m128i a)
__m256i _mm256_cvtepu8_epi64 (__m128i a)

以上的mn分别为16/16/32/8/8/8/16/16/32/8/8/8和32/64/64/16/32/64/32/64/64/16/32/64

从 256 位整数寄存器中按照索引index提取一个m位整数。

int _mm256_extract_epi16 (__m256i a, const int index)
int _mm256_extract_epi8 (__m256i a, const int index)

m分别为16和8

从 256 位整数寄存器中提取一个 128 位整数寄存器

__m128i _mm256_extracti128_si256 (__m256i a, const int imm8)

imm8为0取低128位,1取高128位

posted @ 2024-03-02 21:54  CallMeRoot  阅读(422)  评论(0)    收藏  举报