1 ;------------------------------------------------------------------------------
2 ; Return the current FPU rounding mode.
4 ; MASM implementation of the flt_rounds function from NetBSD.
6 ; Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
7 ; This program and the accompanying materials
8 ; are licensed and made available under the terms and conditions of the BSD License
9 ; which accompanies this distribution. The full text of the license may be found at
10 ; http://opensource.org/licenses/bsd-license.php.
12 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 ;------------------------------------------------------------------------------
19 ;_map BYTE 1 ; round to nearest
20 ; BYTE 3 ; round to negative infinity
21 ; BYTE 2 ; round to positive infinity
22 ; BYTE 0 ; round to zero
24 ;------------------------------------------------------------------------------
29 ; VC++ always creates space for 4 parameters on the stack, whether they are
30 ; used or not. We use one for temporary storage since the only variant of
31 ; fnstcw saves to memory, NOT a register.
32 ;------------------------------------------------------------------------------
33 internal_FPU_rmode PROC
34 fnstcw [rsp + 8] ; save 16-bit FPU Control Word
35 mov eax, [rsp + 8] ; get the saved FPU Control Word
37 and rax, 3 ; index is only the LSB two bits in RAX
38 ret ; Return rounding mode in RAX
39 internal_FPU_rmode ENDP