代码之家  ›  专栏  ›  技术社区  ›  yonutix

GCC上的向量位与常数

  •  0
  • yonutix  · 技术社区  · 6 年前

    下面的测试用例对gcc有效吗?

    typedef signed char v16signed_char __attribute__ ((__vector_size__ (sizeof(signed char) * 16)));
    v16signed_char and_imm(v16signed_char a)
    {
        v16signed_char s = a & 0xFF;
        return s;
    }
    

    它在gcc上失败,显然是因为0xFF太大。它会失败吗?我所说的失败是指编译器错误:

    error: conversion of scalar ‘int’ to vector ‘v4unsigned_int {aka __vector(4) signed char}’ involves truncation
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Lightness Races in Orbit    6 年前

    手术 & 幸运的是,它本身是有效的: [ ref

    以这种方式定义的类型可以与普通C操作的子集一起使用。目前,GCC允许在这些类型上使用以下运算符: + , - , * / , unary minus , ^ , | & , ~ , %

    但是,似乎需要提供基类型的操作数。

    0xFF int signed char

    v16signed_char s = a & (signed char)0xFF;
    

    文件上说:

    为了方便起见,允许使用一个操作数是标量的二进制向量运算。在这种情况下,编译器将标量操作数转换为向量,其中每个元素都是操作的标量。只有当标量可以安全地转换为向量元素类型时,才会发生转换。

    想象上的 根据这些规则进行编译。但是,我怀疑他们在这里采取了严格的措施 有符号字符 转换会丢失数据。

    可以 是(或与之有关) bug 53784 . 或者可以预料到。