Como você carrega / armazena de / para uma matriz de duplas com as Extensões de Vetor GNU

Estou a usarGNU C extensões de vetor, não da Intel_mm_* intrínseca.

Quero fazer a mesma coisa que a Intel_m256_loadu_pd intrínseco. Atribuir os valores um a um é lento: o gcc produz código com 4 instruções de carregamento, em vez de um únicovmovupd (qual_m256_loadu_pd gera).

typedef double vector __attribute__((vector_size(4 * sizeof(double))));

int main(int argc, char **argv) {
    double a[4] = {1.0, 2.0, 3.0, 4.0};
    vector v;

    /* I currently do this */
    v[0] = a[0];
    v[1] = a[1];
    v[2] = a[2];
    v[3] = a[3];
}

Eu quero algo assim:

v = (vector)(a);

o

v = *((vector*)(a));

mas nem trabalho. O primeiro falha com "não é possível converter valor em um vetor", enquanto o segundo resulta em segfaults.

questionAnswers(3)

yourAnswerToTheQuestion