сравнение с поплавками в неоновых - PullRequest
1 голос
/ 25 июля 2011

Я думаю, что это глупая проблема, но я целый день пытался решить ее, не удача, так что вот.

У меня есть регистр из четырех векторов (float32x4), и я хочу сделать некоторый процесс для некоторых из них, а для другого я хочу установить его на 0.

Например, эта проблема в c:

for (int i=1; i<=4; i++)
{
    float b = 4/i;
    if(b<=3)
        result += process(b);
}

так что первый не будет обрабатываться, а другой будет, поэтому мне нужен регистр, где на первой полосе у меня 0, а у другого результат.

Но я не знаю, как это сделать на неоновых внутренностях.

я знаю, что есть vcltq_f32, но я пробовал с этим, но безрезультатно.

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Как это:

const float32x4_t vector_3 = vdupq_n_f32(3.0f);
uint32x4_t mask = vcleq_f32(vector_b, vector_3);
vector_b = (float32x4_t)vandq_u32((uint32x4_t)vector_b, mask);
0 голосов
/ 25 июля 2011

Я не знаю много о Neon, но в большинстве SIMD-архитектур вы бы сделали это путем сравнения и маскирования (побитовое И). Вы используете инструкцию сравнения, которая затем генерирует маску, которую вы обычно можете использовать для этого.

...