c - 如何将一个 8 字节长整数的每个字节相加?

标签 c assembly sse mmx

我正在学习如何在视频应用程序中使用英特尔 MMX 和 SSE 指令。我有一个 8 字节的字,我想将所有 8 个字节相加并生成一个整数作为结果。直接的方法是一系列 7 次移位和加法,但速度很慢。最快的方法是什么?是否有针对此的 MMX 或 SSE 指令?

这种方式比较慢

unsigned long PackedWord = whatever....
int byte1 = 0xff & (PackedWord);
int byte2 = 0xff & (PackedWord >> 8);
int byte3 = 0xff & (PackedWord >> 16);
int byte4 = 0xff & (PackedWord >> 24);
int byte5 = 0xff & (PackedWord >> 32);
int byte6 = 0xff & (PackedWord >> 40);
int byte7 = 0xff & (PackedWord >> 48);
int byte8 = 0xff & (PackedWord >> 56);
int sum = byte1 + byte2 + byte3 + byte4 + byte5 + byte6 + byte7 + byte8;

最佳答案

根据@harold 的建议,您需要这样的东西:

#include <emmintrin.h>

inline int bytesum(uint64_t pw)
{
  __m64 result = _mm_sad_pu8(*((__m64*) &pw), (__m64) 0LLU); // aka psadbw
  return _mm_cvtsi64_si32(result);
}

关于c - 如何将一个 8 字节长整数的每个字节相加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473134/

相关文章:

C套接字编程中写入/读取整数的正确方法

assembly - 如何使用 AT&T 汇编语法在前面添加 `SS:` 或 `ES:`

c - 如何将字符缓冲区中的十六进制地址转换为写入内存

if 检查与 sse 操作的成本?

c - 用 C 语言编写 8 位校验和

c - FFTW 结果为零

c - 进程中的特定线程是否可以创建多个作业?

linux - 生成文件 NASM 错误 : more than one input file specified

C++ SSE 和对齐的整数数组和整数 vector

c - 编写一段 C 代码,使编译器使用 SSE4.1 指令生成汇编代码