2013-08-19 3 views
1

Я пытаюсь выяснить, как создать условный магазин в ARM neon. То, что я хотел бы сделать, это эквивалент этой инструкции SSE:ARM Neon: предложение условного магазина

void _mm_maskmoveu_si128 (__ m128i d, __m128i n, char * p);

, который условно хранит элементы байта от d до адреса p. Высокий бит каждого байта в селекторе n определяет, будет ли сохранен соответствующий байт в d.

Любое предложение о том, как это сделать с NEON-характеристиками? Спасибо

Это то, что я сделал:

int8x16_t store_mask = {0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 

int8x16_t tmp_dest = vld1q_u8((int8_t*)p_dest); 
vbslq_u8(source,tmp_dest,store_mask); 
vst1q_u8((int8_t*)p_dest,tmp_dest); 
+0

Вам нужно сделать три шага: загрузите вектор первый, используйте маску, чтобы изменить только необходимые элементы, а затем сохранить измененный вектор обратно его первоначальное местоположение. –

+0

Извините, но мне все еще не ясно. Я хотел бы сделать так: используйте такой вектор: mask = {0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80} ; который является моим «n» параметром в _mm_maskmoveu_si128 (__ m128i d, __m128i n, char * p); дело. Как должна выглядеть ваша маска? Какие операции следует делать? Спасибо (я никогда не использовал Неона, так что я немного смущен). – user2696208

+0

ОК - по мере усложнения я привел более подробное объяснение в форме ответа ниже. –

ответ

0

Предполагая, что векторы 16 х 1 байт элементов, вы бы создать векторную маску, где каждый элемент является либо все 0s (0x00) или все 1s (0xff), чтобы определить, должен ли элемент храниться на нет. Тогда вам нужно сделать следующее (псевдокод):

init mask vector = 0x00/0xff in each element 
init source vector = data to be selectively stored 
load dest vector from dest location 
apply `vbslq_u8` (`vbit` instruction) with dest vector, source vector and mask vector 
store dest vector back to dest location 
+0

Спасибо! Я попытаюсь реализовать его после вашего объяснения. – user2696208

+0

Я реализовал его после вашего псевдокода (см. Отредактированный вопрос). Это верно? У меня есть еще одно сомнение. Маска в исходном коде (с некоторыми инструкциями SSE, которые я пытаюсь преобразовать в ARM Neon): {0,0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80} ;. Есть ли причина, по которой 0x80 можно использовать вместо 0xff? Спасибо – user2696208

+0

Это просто другой набор инструкций, поэтому вам нужно работать с тем, что доступно. Достаточно легко преобразовать маску между 0x80 и 0xff, если вам нужно (одна инструкция), - или вы можете изменить код, генерирующий маску, чтобы это не было необходимо. –