1#------------------------------------------------------------------------------
2#*
3#*   Copyright (c) 2009 - 2012, 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# Initializes floating point units for requirement of UEFI specification.
17#
18# This function initializes floating-point control word to 0x037F (all exceptions
19# masked,double-extended-precision, round-to-nearest) and multimedia-extensions control word
20# (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero
21# for masked underflow).
22#
23ASM_GLOBAL ASM_PFX(InitializeFloatingPointUnits)
24ASM_PFX(InitializeFloatingPointUnits):
25
26    #
27    # Initialize floating point units
28    #
29    finit
30
31    #
32    # Float control word initial value:
33    # all exceptions masked, double-precision, round-to-nearest
34    #
35    pushq   $0x037F
36    lea     (%rsp), %rax
37    fldcw   (%rax)
38    popq    %rax
39
40    #
41    # Set OSFXSR bit 9 in CR4
42    #
43    movq    %cr4, %rax
44    or      $0x200, %rax
45    movq    %rax, %cr4
46
47    #
48    # Multimedia-extensions control word:
49    # all exceptions masked, round-to-nearest, flush to zero for masked underflow
50    #
51    pushq   $0x01F80
52    lea     (%rsp), %rax
53    ldmxcsr (%rax)
54    popq    %rax
55
56    ret
57
58