Я хочу умножить данные, хранящиеся в одном регистре xmm, на одно значение с плавающей запятой и сохранить результат в регистре xmm. Я сделал небольшой рисунок, чтобы лучше это объяснить.
Как видите, у меня есть регистр xmm0 с моими данными. Например, он содержит:
xmm0 = | 4.0 | 2.5 | 3.5 | 2.0 |
Каждая плавающая точка хранится в 4 байтах. У меня регистр xmm0 128 бит, длина 16 байт.
Это неплохо работает. Теперь я хочу сохранить 0,5 в другом регистре xmm, например. xmm1, и умножьте этот регистр на регистр xmm0, чтобы каждое значение, хранящееся в xmm0, умножалось на 0,5.
Я совершенно не знаю, как хранить 0,5 в регистре XMM. Какие-либо предложения?
Кстати: это встроенный ассемблер на C ++.
void filter(image* src_image, image* dst_image)
{
float* src = src_image->data;
float* dst = dst_image->data;
__asm__ __volatile__ (
"movaps (%%esi), %%xmm0\n"
// Multiply %xmm0 with a float, e.g. 0.5
"movaps %%xmm0, (%%edi)\n"
:
: "S"(src), "D"(dst) :
);
}
Это тихая простая версия того, чем я хочу заниматься. У меня есть данные изображения, хранящиеся в массиве с плавающей запятой. Указатель на эти массивы передается в сборку. movaps принимает первые 4 значения массива с плавающей запятой, сохраняет эти 16 байтов в регистре xmm0. После этого xmm0 следует умножить на, например, 0,5. Затем "новые" значения должны быть сохранены в массиве из edi.