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; }
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