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 Reply Children
  • 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.

  • You could also make your own routine by creating an assembly file called lol.a66 with something like...

    $SEGMENTED CASE MODV2
      NAME LROR
      NCODE   CGROUP  ?PR?LROR
      ASSUME  DPP3 : SYSTEM
      REGDEF  R0 - R15
    
      ?PR?LROR  SECTION  CODE WORD 'NCODE'
    
      LROR  PROC  NEAR
      GLOBAL  LROR
    
    LROR_loop:
      ROR   R8,#1
      ROR   R9,#1
      BMOV  R4.15,R9.15
      BMOV  R9.15,R8.15
      BMOV  R8.15,R4.15
      ADD   R10,#-1
      JMP   cc_NZ,LROR_loop
    
      MOV   R4,R8   ; return LSB
      MOV   R5,R9   ; return MSB
      RET
    
      LROR  ENDP
      ?PR?LROR  ENDS
    
      END
    

    In your C file call it (but make sure you don't have zero for the count).

    extern long LROR(long value, int count);
    
    void main(void) {
    
      volatile unsigned long test = 0x80000000ul;
    
      while(1) {
         test = LROR(test,1);
      };
    }
    

  • can anyone confirm my problem with the intrinsic _lror_

    unsigned long test = 0x80000000;

    while(1)
    { test = _lror_(test,1);
    }

  • I can confirm that this is a compiler problem. It will be solved in the next upcoming revision.

    If you need a fix, send email to support.intl@keil.com

    *** NOTE ***
    This forum is not a tools support forum. You MUST use the official support channels to report tool problems.
    See: http://www.keil.com/support/contact.asp