1;------------------------------------------------------------------------------ 2;* 3;* Copyright (c) 2009, 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 .686 17 .model flat,C 18 .const 19; 20; Float control word initial value: 21; all exceptions masked, double-precision, round-to-nearest 22; 23mFpuControlWord DW 027Fh 24; 25; Multimedia-extensions control word: 26; all exceptions masked, round-to-nearest, flush to zero for masked underflow 27; 28mMmxControlWord DD 01F80h 29 30 .xmm 31 .code 32 33; 34; Initializes floating point units for requirement of UEFI specification. 35; 36; This function initializes floating-point control word to 0x027F (all exceptions 37; masked,double-precision, round-to-nearest) and multimedia-extensions control word 38; (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero 39; for masked underflow). 40; 41InitializeFloatingPointUnits PROC PUBLIC 42 43 push ebx 44 45 ; 46 ; Initialize floating point units 47 ; 48 finit 49 fldcw mFpuControlWord 50 51 ; 52 ; Use CpuId instructuion (CPUID.01H:EDX.SSE[bit 25] = 1) to test 53 ; whether the processor supports SSE instruction. 54 ; 55 mov eax, 1 56 cpuid 57 bt edx, 25 58 jnc Done 59 60 ; 61 ; Set OSFXSR bit 9 in CR4 62 ; 63 mov eax, cr4 64 or eax, BIT9 65 mov cr4, eax 66 67 ; 68 ; The processor should support SSE instruction and we can use 69 ; ldmxcsr instruction 70 ; 71 ldmxcsr mMmxControlWord 72Done: 73 pop ebx 74 75 ret 76 77InitializeFloatingPointUnits ENDP 78 79END 80