Эквивалент 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);
}