This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

_lror_ doesn't work properly

Everytime I try to use the _lror_ it works fine several times... but if there's an overflow the variable is set to 0x00000000

//here's the test programm

void main(void)
{ unsigned long test = 0x80000000; test = _lror_(test,1);
}

//to get it working I created my own lror but it's a lot more bigger than the intrinsic _lror_

unsigned long lror(unsigned long input, unsigned int count)
{

unsigned int itmp1,itmp2; bit bit1,bit2;

while(count-->0) { itmp1 = input; input = input>>16; itmp2 = input; bit1 = itmp1 & 0x1; bit2 = itmp2 & 0x1; itmp1 &= 0xfffe; itmp2 &= 0xfffe; itmp1 |= bit2; itmp2 |= bit1; itmp1 = _iror_(itmp1,1); itmp2 = _iror_(itmp2,1); input = itmp2; input = input<<16; input |= itmp1; } return input;
}

Parents
  • This is a shorter implementation of a do-it-yourself lror() function:

    unsigned long lror(unsigned long n,unsigned steps) {
        unsigned long t1,t2;
        steps &= 0x1f;
        t1 = n << steps;
        t2 = n >> (32-steps);
        return t1 | t2;
    }
    


    It is still making use of two 32-bit shift operations, and a 32-bit or but it removes the requirement of the while loop.

    It is possible to rewrite it to use two 16-bit intermediates for high and low part, if the code is splitted into two alternatives depending on if the rotation count is below 16 or not, but the number of code lines quickly increases then.

Reply
  • This is a shorter implementation of a do-it-yourself lror() function:

    unsigned long lror(unsigned long n,unsigned steps) {
        unsigned long t1,t2;
        steps &= 0x1f;
        t1 = n << steps;
        t2 = n >> (32-steps);
        return t1 | t2;
    }
    


    It is still making use of two 32-bit shift operations, and a 32-bit or but it removes the requirement of the while loop.

    It is possible to rewrite it to use two 16-bit intermediates for high and low part, if the code is splitted into two alternatives depending on if the rotation count is below 16 or not, but the number of code lines quickly increases then.

Children