1#------------------------------------------------------------------------------
2#*
3#*   Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
4#*   This program and the accompanying materials
5#*   are licensed and made available under the terms and conditions of the BSD License
6#*   which accompanies this distribution.  The full text of the license may be found at
7#*   http://opensource.org/licenses/bsd-license.php
8#*
9#*   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10#*   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11#*
12#*
13#------------------------------------------------------------------------------
14
15#
16# Float control word initial value:
17# all exceptions masked, double-precision, round-to-nearest
18#
19ASM_PFX(mFpuControlWord): .word     0x027F
20#
21# Multimedia-extensions control word:
22# all exceptions masked, round-to-nearest, flush to zero for masked underflow
23#
24ASM_PFX(mMmxControlWord): .long     0x01F80
25
26#
27# Initializes floating point units for requirement of UEFI specification.
28#
29# This function initializes floating-point control word to 0x027F (all exceptions
30# masked,double-precision, round-to-nearest) and multimedia-extensions control word
31# (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero
32# for masked underflow).
33#
34ASM_GLOBAL ASM_PFX(InitializeFloatingPointUnits)
35ASM_PFX(InitializeFloatingPointUnits):
36
37    pushl   %ebx
38
39    #
40    # Initialize floating point units
41    #
42    finit
43    fldcw   ASM_PFX(mFpuControlWord)
44
45    #
46    # Use CpuId instructuion (CPUID.01H:EDX.SSE[bit 25] = 1) to test
47    # whether the processor supports SSE instruction.
48    #
49    movl    $1,  %eax
50    cpuid
51    btl     $25, %edx
52    jnc     Done
53
54    #
55    # Set OSFXSR bit 9 in CR4
56    #
57    movl    %cr4, %eax
58    or      $0x200, %eax
59    movl    %eax, %cr4
60
61    #
62    # The processor should support SSE instruction and we can use
63    # ldmxcsr instruction
64    #
65    ldmxcsr ASM_PFX(mMmxControlWord)
66
67Done:
68    popl    %ebx
69
70    ret
71
72#END
73
74