打印一个 __m128i 变量 [英] print a __m128i variable
问题描述
我正在尝试使用内在函数学习编码,下面是一个可以添加的代码
I'm trying to learn to code using intrinsics and below is a code which does addition
使用的编译器:icc
#include<stdio.h>
#include<emmintrin.h>
int main()
{
__m128i a = _mm_set_epi32(1,2,3,4);
__m128i b = _mm_set_epi32(1,2,3,4);
__m128i c;
c = _mm_add_epi32(a,b);
printf("%d
",c[2]);
return 0;
}
我收到以下错误:
test.c(9): error: expression must have pointer-to-object type
printf("%d
",c[2]);
如何打印类型为 __m128i
推荐答案
使用这个函数来打印它们:
Use this function to print them:
#include <stdint.h>
#include <string.h>
void print128_num(__m128i var)
{
uint16_t val[8];
memcpy(val, &var, sizeof(val));
printf("Numerical: %i %i %i %i %i %i %i %i
",
val[0], val[1], val[2], val[3], val[4], val[5],
val[6], val[7]);
}
在打印之前将 128 位拆分为 16 位(或 32 位).
You split 128bits into 16-bits(or 32-bits) before printing them.
如果您有 64 位支持,这是 64 位拆分和打印的一种方式:
This is a way of 64-bit splitting and printing if you have 64-bit support available:
#include <inttypes.h>
void print128_num(__m128i var)
{
int64_t v64val[2];
memcpy(v64val, &var, sizeof(v64val));
printf("%.16llx %.16llx
", v64val[1], v64val[0]);
}
注意: 将 &var
直接转换为 int*
或 uint16_t*
也适用于 MSVC,但这违反了严格的别名并且是未定义的行为.使用 memcpy
是执行相同操作的标准兼容方式,并且只需最少的优化,编译器将生成完全相同的二进制代码.
Note: casting the &var
directly to an int*
or uint16_t*
would also work MSVC, but this violates strict aliasing and is undefined behaviour. Using memcpy
is the standard compliant way to do the same and with minimal optimization the compiler will generate the exact same binary code.
这篇关于打印一个 __m128i 变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!