Вектор побитовый и с постоянным значением на GCC - PullRequest
0 голосов
/ 15 января 2020

Допустим ли следующий тестовый пример для g cc?

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;
}

Сбой на g cc, очевидно, потому что 0xFF слишком велик. Должно ли это потерпеть неудачу? Под ошибкой я подразумеваю ошибку компилятора:

error: conversion of scalar ‘int’ to vector ‘v4unsigned_int {aka __vector(4) signed char}’ involves truncation

1 Ответ

0 голосов
/ 15 января 2020

Операция & сама по себе действительна, к счастью: [ ref ]

Типы, определенные таким образом, могут использоваться с подмножеством нормальных C операций. В настоящее время G CC позволяет использовать следующие операторы для этих типов: +, -, *, /, unary minus, ^, |, &, ~ , %.

Однако, похоже, вам необходимо предоставить операнд базового типа.

0xFF - это int, но ваш базовый тип - signed char.

Итак:

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

Документация гласит:

Для удобства разрешено использовать двоичную векторную операцию, где один операнд равен скаляр В этом случае компилятор преобразует скалярный операнд в вектор, где каждый элемент является скаляром операции. Преобразование происходит только в том случае, если скаляр можно безопасно преобразовать в тип векторного элемента.

Без определения «можно безопасно преобразовать», я не уверен, что могу с уверенностью сказать, является ли ваш оригинальный код предполагается для компиляции в соответствии с этими правилами. Тем не менее, я подозреваю, что они применили строгий подход, поскольку произвольное преобразование intsigned char может привести к потере данных.

Это может быть (или иметь отношение к) ошибка 53784 . Или это можно ожидать.

Хотя это интересно, потому что в случае этого литерала это явно не так, и в не векторизованном коде вы ожидаете, что обычное предупреждение будет исключено в подобных ситуациях для этого причина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...