[ros-dev] [ros-diffs] [dgorbachev] 53907: [NTOSKRNL] Use inline asm in KiIsNpxErrataPresent(). C code can be optimized in a wrong way.
Alex Ionescu
ionucu at videotron.ca
Fri Sep 30 22:51:14 UTC 2011
Care to explain?
If it can be optimized the wrong way -- use a pragma or fix the compiler.
I hate these kinds of patches. I think Timo would agree.
Best regards,
Alex Ionescu
On Fri, Sep 30, 2011 at 5:03 PM, <dgorbachev at svn.reactos.org> wrote:
> Author: dgorbachev
> Date: Fri Sep 30 21:03:29 2011
> New Revision: 53907
>
> URL: http://svn.reactos.org/svn/reactos?rev=53907&view=rev
> Log:
> [NTOSKRNL]
> Use inline asm in KiIsNpxErrataPresent(). C code can be optimized in a
> wrong way.
>
> Modified:
> trunk/reactos/ntoskrnl/ke/i386/cpu.c
>
> Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/cpu.c?rev=53907&r1=53906&r2=53907&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] Fri Sep 30 21:03:29
> 2011
> @@ -1254,9 +1254,9 @@
> INIT_FUNCTION
> KiIsNpxErrataPresent(VOID)
> {
> - BOOLEAN ErrataPresent;
> + static double Value1 = 4195835.0, Value2 = 3145727.0;
> + INT ErrataPresent;
> ULONG Cr0;
> - volatile double Value1, Value2;
>
> /* Disable interrupts */
> _disable();
> @@ -1269,9 +1269,30 @@
> Ke386FnInit();
>
> /* Multiply the magic values and divide, we should get the result back
> */
> - Value1 = 4195835.0;
> - Value2 = 3145727.0;
> - ErrataPresent = (Value1 * Value2 / 3145727.0) != 4195835.0;
> +#ifdef __GNUC__
> + __asm__ __volatile__
> + (
> + "fldl %1\n\t"
> + "fdivl %2\n\t"
> + "fmull %2\n\t"
> + "fldl %1\n\t"
> + "fsubp\n\t"
> + "fistpl %0\n\t"
> + : "=m" (ErrataPresent)
> + : "m" (Value1),
> + "m" (Value2)
> + );
> +#else
> + __asm
> + {
> + fld Value1
> + fdiv Value2
> + fmul Value2
> + fld Value1
> + fsubp
> + fistp ErrataPresent
> + };
> +#endif
>
> /* Restore CR0 */
> __writecr0(Cr0);
> @@ -1280,7 +1301,7 @@
> _enable();
>
> /* Return if there's an errata */
> - return ErrataPresent;
> + return ErrataPresent != 0;
> }
>
> VOID
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20110930/3b9b855c/attachment.htm>
More information about the Ros-dev
mailing list