Ксения (24.07.2016 19:39 - 20:12, просмотров: 181) ответил AU08 на Нет, короче не будет. Будет менее понятным.
А вы напишите свою функцию прямо на ассемблере! Предположу, что у вас задача цифровой фильтрации, когда значение в точке находится в виде взвешенной суммы соседних точек, включая ее саму.
В этом случае частенько бывает достаточно весового множителя размером в байт.
Тем не менее, на чистом C умножение работает неэффективно, поскольку множит в лонгах. Т.е. никакого выигрыша не дает, если множитель короткий (байт или слово).
Именно для таких целей в хидере intrinsics.h определена функция
__intrinsic unsigned int __multiply_unsigned(unsigned char, unsigned char);
и ей подобные. Для лонга там готовых функций нет, но можно сделать самим по аналогии с этой. Причем ?L_MUL_L03 вызывать не придется.
Функция, конечно, получится большой, но зато быстрой.
Т.е. предлагаю сделать по аналогии с умножением столбиком:
unsigned long mul16x8( unsigned int BA, unsigned char C)
// HGFE = BA * C
{
R20 = A; R21 = B; R22 = C; // сохраняем аргументы
R16 = R17 = R18 = R19 = 0; // обнуляем результат (в последствии код можно модернизировать с заменой сложения на запись, чтобы R17-R18 не занулять)
R1:R0 = R20 * R22 // A * C;
R17 += R1; R16 += R0; // FE += A * C
R1:R0 = R21 * R22 // B * C;
R18 += R1; R17 += R0; // GF += B * C
}
Аналогично пишем функцию
unsigned long mul16x16( unsigned int BA, unsigned int DC),
которая получится лишь вдвое длиннее:
unsigned long mul16x16( unsigned int BA, unsigned int DC)
// HGFE = BA * DC
{
R20 = A; R21 = B; R22 = C; R23 = D; // сохраняем аргументы
R16 = R17 = R18 = R19 = 0; // обнуляем результат (в последствии код можно модернизировать с заменой сложения на запись, чтобы R17-R18 не занулять)
R1:R0 = R20 * R22 // A * C;
R17 += R1; R16 += R0; // FE += A * C
R1:R0 = R21 * R22 // B * C;
R18 += R1; R17 += R0; // GF += B * C
R1:R0 = R20 * R23 // A * D;
R18 += R1; R17 += R0; // GF += A * D
R1:R0 = R22 * R23 // B * D;
R19 += R1; R18 += R0; // HG += B * D
}
Вообще-то мне такая функция тоже нужна. Может быть, напишем на пару? :)