Shifting r1 by 9 has the right effect.  Do you think there is a way to
incorporate HZ into this udelay routine? I got the impression that you
don't want to add any more instructions to this routine due to timing
constraints.

-Jaspreet

Russell King - ARM Linux wrote:
> 
> On Tue, Apr 24, 2001 at 02:01:59PM -0400, Jaspreet Singh wrote:
> > There is a comment in that file which states:
> >
> >   loops = (r0 * 0x10c6 * 100 * loops_per_jiffie) / 2^32.
> >
> > Now I couldn't dissemble the above expression from the code.
> 
> Unfortunately, its overly complicated to keep the arithmetic within
> acceptable precision.  The code is:
> 
>                 mov     r2,     #0x6800
>                 orr     r2, r2, #0x00db
>                 mul     r1, r0, r2              r1 = r0 * 0x68db
>                 ldr     r2, LC0
>                 ldr     r2, [r2]
>                 mov     r1, r1, lsr #11         r1 = r1 >> 11
>                 mov     r2, r2, lsr #11         r2 = loops_per_jiffy >> 11
>                 mul     r0, r1, r2              r0 = r1 * r2
>                 movs    r0, r0, lsr #6          r0 = r0 >> 6
> 
> Plugging those all into each other:
> 
>         r0 = (((r0 * 0x68db) >> 11) * (loops_per_jiffy >> 11)) >> 6
> 
> Now, simplify:
> 
>         r0 = ((r0 * 0x68db * loops_per_jiffy) >> 11) >> 6
> 
>         r0 = (r0 * 0x68db * loops_per_jiffy) >> 28
> 
>         r0 = (r0 * loops_per_jiffy) * (26843 / (2 ^ 28))
> 
>         r0 = (r0 * loops_per_jiffy) * (26843 / 268435456)
> 
>         r0 = (r0 * loops_per_jiffy) / 10000.2
> 
> Now, taking the original expression:
> 
>      loops = (r0 * 0x10c6 * 100 * loops_per_jiffy) / 2^32.
> 
>      loops = r0 * 429400 * loops_per_jiffy / 2^32
> 
>      loops = r0 * loops_per_jiffy / 10002.3
> 
> The code we now have is more accurate than the comment (which actually
> reflects the old code).
> 
> The constant you will need to adjust is the 0x6800 and 0x00db to
> something around 0x1a36c.  Unfortunately you need an extra instruction
> to load it, you might as well just shift right the r1 value by two.
> 
>                 mov     r2,     #0x6800
>                 orr     r2, r2, #0x00db
>                 mul     r1, r0, r2
>                 ldr     r2, LC0
>                 ldr     r2, [r2]
>                 mov     r1, r1, lsr #13         11 for 100Hz, 13 for 400Hz
>                 mov     r2, r2, lsr #11
>                 mul     r0, r1, r2
>                 movs    r0, r0, lsr #6
>    _____
>   |_____| ------------------------------------------------- ---+---+-
>   |   |        Russell King       [EMAIL PROTECTED]      --- ---
>   | | | |            http://www.arm.linux.org.uk/            /  /  |
>   | +-+-+                                                     --- -+-
>   /   |               THE developer of ARM Linux              |+| /|\
>  /  | | |                                                     ---  |
>     +-+-+ -------------------------------------------------  /\\\  |

_______________________________________________
http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm
Please visit the above address for information on this list.

Reply via email to