Как передать указатели на векторные расширения в C - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь использовать векторные расширения GCC, точный код, который я пробовал: :

typedef float Vector4 __attribute__ ((vector_size (16)));

void defVector(Vector4* v, float x,float y,float z,float w){
    v[0] = x;
    v[1] = y;
    v[2] = z;
    v[3] = w;
}
int main(int argc, char* argv){
    Vector4 a;
    defVector(&a, 1, 2, 3, 4); 
}

и продолжаю получать ошибки:

incompatible types when assigning to type ‘Vector4 {aka __vector(4) float}’ from type ‘float’
v[0] = x;

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

int someFunc(Vector4 v, Vector4* r){
    ...
    r[0] = return_value;
    return 0;
}

Я перепробовал все, что знаю, чтобы получить доступ к значениям внутри функции. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 12 марта 2019

На основе примера OP, в котором локальная функция получает указатель " vector-extension ":

#include <stdio.h>
#include <stdint.h>

typedef float Vector4 __attribute__ ((vector_size (16)));

void defVector(Vector4 *v,float a, float b);

void defVector(Vector4 *v,float a, float b){
    v[0] = *(Vector4*)&a;
    v[1] = *(Vector4*)&b;

    a = *(float*)&v[0] + 1.2;
    b = *(float*)&v[1] + 2.1; 

    printf("%f,%f,%u",a,b,\
           (uint32_t)sizeof(Vector4)/(uint32_t)sizeof(float));
}

int main(void) {
    static Vector4 vectorA;
    static float x1 = 3.4;
    static float x2 = 4.3;

    defVector(&vectorA,x1,x2);
}

Этот код напечатает ( demo ): 4.6,6.4,4, поэтому значение два float было присвоено двум единицам (являющимся числом единиц sizeof(Vector4)/sizeof(float)) типа Vector4 переменная.

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