Cómo carga / almacena desde / a una matriz de dobles con GNU C Vector Extensions?

Estoy usandoGNU C Extensiones de vectores, no Intel's_mm_* intrínsecos.

Quiero hacer lo mismo que Intel's_m256_loadu_pd intrínseco. Asignar los valores uno por uno es lento: gcc produce código que tiene 4 instrucciones de carga, en lugar de una solavmovupd (cual_m256_loadu_pd genera).

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

Quiero algo como esto

v = (vector)(a);

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

pero tampoco funciona. El primero falla con "no se puede convertir el valor en un vector", mientras que el segundo produce segfaults.

Respuestas a la pregunta(3)

Su respuesta a la pregunta