打印一个 __m128i 变量 [英] print a __m128i variable

查看:31
本文介绍了打印一个 __m128i 变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用内在函数学习编码,下面是一个可以添加的代码

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆