Technical discussions about Freescale (Motorola) DSPs (including the DSP56000, DSP56300, DSP56600, 56800 DSPs).
Hi to all, I was looking at a piece of code available on the net to compute log2(x) for any number x between 2^-23 and 1. This code is a macro included in the file called LOG2NRM.ASM: log2nrm macro ; ; This program calculates the base 2 logarithm of an unnormalized ; 24 bit fraction "x" in register A and returns a scaled fraction ; "y" in register A. ; ; y = log2(x)/32.0 where 2**(-23) =< x < 1.0 ; -23/32 =< y < 0.0 ; ; Note - "x" must be a non-zero, positive fraction. ; ; Three steps are required. ; ; 1. Normalize "x" so that 0.5 =< A < 1.0. ; 2. Calculate the log2(A). ; 3. Divide the result by 32.0 ; ; ; Step 1 - Normalize A to get value between .5 and 1.0 ; clb a,b normf b1,a move #pcoef,r1 ;point to polynomial coefficients for log2 move a,x0 ;put normalized number in x0 ; ; Step 2 - Calculate LOG2 by polynomial approximation. 8 Bit accuracy. ; ; LOG2(x) = 4.0* (-.3372223 x*x + .9981958 x - .6626105) ; a2 a1 a0 ; where 0.5 <= x < 1.0 ; ; r1 initially points to the coefficients in y memory in the ; order: a1,a2,a0 ; nop nop mpyr x0,x0,a y:(r1)+,y0 ;x**2, get a1 nop mpy x0,y0,a a,x1 y:(r1)+,y0 ;a1*x, mv x**2, get a2 mac x1,y0,a y:(r1)+,y0 ;a2* x**2, get a0 add y0,a ;add in a0 ; ; Step 3 - Divide result by 32. ; asl #3,a,a move b1,b0 dec b nop move b0,a2 ;new sign = characteristic asr #6,a,a rnd a ;round result endm I don't understand precisely what's happening in Step 3. Especially this part commented as 'new sign = characteristic'... Would someone be so kind to explain me? Thanks - Ralph