ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 июля
688881 Топик полностью
Ксения (24.07.2016 19:39 - 20:12, просмотров: 148) ответил 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 } Вообще-то мне такая функция тоже нужна. Может быть, напишем на пару? :)