Я хочу умножить данные, хранящиеся в одном регистре 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.