We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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; }
What do you mean by overflow?
unsigned long test = 0x80000000ul; test = _lror_(test,17);
Works without issue.
it's working if you rotate by a number greater than 1 but, try the following:
unsigned long test = 0x80000000;
while(1) { test = _lror_(test,1); }
and after 32 loops the variable test will be set to 0!!!
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_
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