Home | History | Annotate | Download | only in X64
      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 #
     23 ASM_GLOBAL ASM_PFX(InitializeFloatingPointUnits)
     24 ASM_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