Эквивалент mm_storel_epi64 в AltiVec?

Я работаю над проектом с использованием интерфейса программирования AltiVec.

В одном месте я хочу хранить 8 байтов из векторного регистра в буфер.

В SSE у нас есть свойственный _mm_storel_epi64 хранить младшие 8 байтов регистра SIMD в буфере.

Есть идеи по реализации 8-байтового хранилища в AltiVec?

2 ответа

Я думаю, что единственный способ сделать это с AltiVec:

- load 16 bytes containing 8 byte destination buffer (`vec_ld`)
- mask in the 8 bytes you want to write (`vec_sel`)
- store the modified 16 byte vector (`vec_st`)

Это предполагает, что требуемый 8-байтовый адресат, конечно, попадает в 16-байтовый выровненный вектор. Например, предположим, что адрес назначения равен 0x1004, затем вы загрузите адрес 0x1000, измените байты 4..11, а затем запишите вектор обратно в 0x1000.

Я нашел один способ сохранить 8 байтов для хранения по невыровненному адресу.

Ниже приводится программа.

Следующая программа сохраняет первые 8 байтов вектора в буфере. k - я использовал в качестве переменной, чтобы изменить местоположение в буфере для хранения данных

int main(int argc, char *argv[])
{
    unsigned char buf[40];
    vector unsigned char res;
    vector unsigned char on = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

    memset(buf, 0, 40);

    int k = atoi(argv[1]);

    unsigned char *outp = &(buf[k]);

    res =  vec_perm( on, on, vec_lvsr(0, (unsigned char *)outp);

    vec_ste( (vector unsigned char)res, 0, (unsigned char *)outp);

    vec_ste( (vector unsigned short)res, 1, (unsigned short *)outp);

    vec_ste( (vector unsigned short)res, 2, (unsigned short *)outp);

    vec_ste( (vector unsigned short)res, 4,  (unsigned short *)outp);

    vec_ste( (vector unsigned short)res, 6, (unsigned short *)outp);

    vec_ste( (vector unsigned char)res, 7, (unsigned char *)outp);

    print(buf);

}
Другие вопросы по тегам