通过16位移位进行32位乘法

Jon*_*n J 5 c assembly bit-manipulation bit-shift multiplication

我正在使用移位和加法编写软乘法函数调用。现有的函数调用如下:

unsigned long __mulsi3 (unsigned long a, unsigned long b) {

    unsigned long answer = 0;

    while(b)
    {
        if(b & 1) {
            answer += a;
        };

        a <<= 1;
        b >>= 1;
    }
    return answer;
}
Run Code Online (Sandbox Code Playgroud)

尽管我的硬件没有乘法器,但我有一个硬移位器。该移位器一次最多可以移位16位。

如果我想充分利用我的16位移位器。关于如何修改上面的代码以反映我的硬件功能的任何建议?给定的代码每次迭代仅移位1位。

16位移位器一次最多可以将32位无符号长值移位16位。sizeof(unsigned long)== 32位

Kei*_*las 0

基本方法是(假设移位 1):-

  • 移动高 16 位
  • 将高 16 位的低位设置为低 16 位的高位
  • 移动低 16 位

有点取决于你的硬件...

但你可以尝试:-

  • 假设 unsigned long 是 32 位
  • 假设大端

然后 :-

 union Data32
        {
           unsigned long l;
           unsigned short s[2];
        }; 

unsigned long shiftleft32(unsigned long valueToShift, unsigned short bitsToShift)
{
    union Data32 u;
    u.l  = valueToShift
    u.s[0] <<= bitsToShift;
    u.s[0] |= (u.s[1] >> (16 - bitsToShift);
    u.s[1] <<= bitsToShift

    return u.l;
}
Run Code Online (Sandbox Code Playgroud)

然后以相反的方式向右移动