2015-02-10 1 views
0

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

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

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

Любые идеи по реализации 8-байтового магазина в AltiVec?

+0

Мой выходной указатель не выровненные. – sunmoon

ответ

1

Я думаю, что единственный способ сделать это с 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.

+0

Я хотел сделать unaligned магазин. – sunmoon

+0

На самом деле вы не упомянули об этом в вопросе, но до тех пор, пока 8 байтов назначения находятся в выровненном 16-байтовом диапазоне, вышеуказанный подход все еще работает. Если 8-байтовый пункт назначения находится через границу по 16 байт, вам придется немного поработать. –

+0

vec_st выравнивает переданный указатель и сохраняет векторный регистр. Я мог бы пережить данные, которые я не собираюсь делать. с vec_st. – sunmoon

0

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

Ниже приведена программа.

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

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

} 
+1

Спасибо, Пол за форматирование. – sunmoon

Смежные вопросы