Ok, thanks.
i fixed it.
actually, the fp code has to be rewritten in pure assembly.
~d

On Friday 01 August 2003 21:47, Takahashi, Chris wrote:
> I noticed that the multiply function in libfp had a bug where you could not
> get negative numbers as results (e.g. 46.0 * -21.0 = 966).  Upon examining
> mulsf.c it was discovered that the inline asm was not generating the
> expected asm (or at least the intended asm).  The erroneous asm is below.
> As you can see at lines 117-119 r12 is erroneously being used as both %0
> and %B3.  I'm not too good with inline assembly so I don't know if this is
> incorrect code or a compiler mistake.  I also noticed lines 83-87 are
> inefficient and can be redone with a mov, xor, then and.  This change alone
> didn't change fact that code was being generated contrary to intent.
>
> I found that changing a1 and a2 from type "r" to type "m" fixed this
> problem.  I noticed that in the assembly code generated a1 and a2 ended up
> on the stack and needed to be moved to registers when inline was done so
> changing a1 and a2 to type "m" made since.
>
> Attached is the diff file (old - new +) with my fixes.  Also attached is a
> .c file that illustrates this problem.  Below I've pasted the diff.
>
> -Chris Takahashi
>
> ASM LIST:
> 81:mulsf.old.c   ****     /* sign = SIGN (fl1.l) ^ SIGN (fl2.l); */
>   82:mulsf.old.c   ****     __asm__ __volatile__ (
>  111                .LM9:
>  112 005a 2D41              mov @r1, r13
>  113 005c 1E41 0200         mov 2(r1), r14
>  114 0060 1B41 0400         mov 4(r1), r11
>  115 0064 1C41 0600         mov 4+2(r1), r12
>  116                /* #APP */
>  117 0068 0C4E              mov r14, r12
>  118 006a 3CF0 0080         and #0x8000, r12
>  119 006e 0F4C              mov r12, r15
>  120 0070 3FF0 0080         and #0x8000, r15
>  121 0074 0CEF              xor r15, r12
>  122                /* #NOAPP */
>  123 0076 814C 0800         mov r12, 8(r1)
>   83:mulsf.old.c   ****     "mov    %B2, %0         \n\t"
>   84:mulsf.old.c   ****     "and    #0x8000, %0     \n\t"
>   85:mulsf.old.c   ****     "mov    %B3, %1         \n\t"
>   86:mulsf.old.c   ****     "and    #0x8000, %1     \n\t"
>   87:mulsf.old.c   ****     "xor    %1, %0"
>   88:mulsf.old.c   ****         : "=r" (sign)
>   89:mulsf.old.c   ****         : "r" (tmp),
>   90:mulsf.old.c   ****         "r" (a1),
>   91:mulsf.old.c   ****         "r" (a2)
>   92:mulsf.old.c   ****     );
>
>
> FIX: (diff -u old new)
> --- msp430-libc/src/libm/mulsf.old.c    2003-08-01 08:55:47.000000000 -0700
> +++ msp430-libc/src/libm/mulsf.c        2003-08-01 10:18:02.000000000 -0700
> @@ -80,15 +80,12 @@
>
>         /* sign = SIGN (fl1.l) ^ SIGN (fl2.l); */
>         __asm__ __volatile__ (
> -       "mov    %B2, %0         \n\t"
> +       "mov    %B1, %0         \n\t"
> +       "xor    %B2, %0         \n\t"
>         "and    #0x8000, %0     \n\t"
> -       "mov    %B3, %1         \n\t"
> -       "and    #0x8000, %1     \n\t"
> -       "xor    %1, %0"
>
>                 : "=r" (sign)
>
> -               : "r" (tmp),
> -               "r" (a1),
> -               "r" (a2)
> +               : "m" (a1),
> +               "m" (a2)
>         );
>
>         a1 = MANT (a1);

-- 
/*****************************************************************
     ("`-''-/").___..--''"`-._     (\   Dimmy the Wild     UA1ACZ
      `6_ 6  )   `-.  (     ).`-.__.`)  State Polytechnical Univ.
      (_Y_.)'  ._   )  `._ `. ``-..-'   Radio-Physics Departament
    _..`--'_..-_/  /--'_.' ,'           Saint Petersburg,  Russia
   (il),-''  (li),'  ((!.-'             +7 (812) 5403923, 5585314
 *****************************************************************/


Reply via email to