Я пытаюсь выяснить, как создать условный магазин в 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);
Вам нужно сделать три шага: загрузите вектор первый, используйте маску, чтобы изменить только необходимые элементы, а затем сохранить измененный вектор обратно его первоначальное местоположение. –
Извините, но мне все еще не ясно. Я хотел бы сделать так: используйте такой вектор: 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
ОК - по мере усложнения я привел более подробное объяснение в форме ответа ниже. –