VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/math/fetestexcept.asm@ 96240

Last change on this file since 96240 was 96213, checked in by vboxsync, 2 years ago

IPRT/nocrt: Implemented feraiseexcept and adjusted relevan code for X86_FSW_XCPT_MASK containg a bit more than X86_MXCSR_XCPT_FLAGS. bugref:10261

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.7 KB
Line 
1; $Id: fetestexcept.asm 96213 2022-08-15 09:36:00Z vboxsync $
2;; @file
3; IPRT - No-CRT fetestexcept - AMD64 & X86.
4;
5
6;
7; Copyright (C) 2022 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27
28%define RT_ASM_WITH_SEH64
29%include "iprt/asmdefs.mac"
30%include "iprt/x86.mac"
31
32
33BEGINCODE
34
35;;
36; Return the pending exceptions in the given mask.
37;
38; Basically a simpler fegetexceptflags function.
39;
40; @returns eax = pending exceptions (X86_FSW_XCPT_MASK) & fXcptMask.
41; @param fXcptMask 32-bit: [xBP+8]; msc64: ecx; gcc64: edi; -- Exceptions to test for (X86_FSW_XCPT_MASK).
42; Accepts X86_FSW_SF and will return it if given as input.
43;
44RT_NOCRT_BEGINPROC fetestexcept
45 push xBP
46 SEH64_PUSH_xBP
47 mov xBP, xSP
48 SEH64_SET_FRAME_xBP 0
49 sub xSP, 10h
50 SEH64_ALLOCATE_STACK 10h
51 SEH64_END_PROLOGUE
52
53 ;
54 ; Load the parameter into ecx (fXcptMask).
55 ;
56%ifdef ASM_CALL64_GCC
57 mov ecx, edi
58%elifdef RT_ARCH_X86
59 mov ecx, [xBP + xCB*2]
60%endif
61%if 0
62 and ecx, X86_FSW_XCPT_MASK
63%else
64 or eax, -1
65 test ecx, ~X86_FSW_XCPT_MASK
66 jnz .return
67%endif
68
69 ;
70 ; Get the pending exceptions.
71 ;
72
73 ; Get x87 exceptions first.
74 fnstsw ax
75 and eax, ecx
76
77%ifdef RT_ARCH_X86
78 ; SSE supported (ecx preserved)?
79 mov ch, al ; Save the return value - it's only the lower 6 bits.
80 extern NAME(rtNoCrtHasSse)
81 call NAME(rtNoCrtHasSse)
82 test al, al
83 mov al, ch ; Restore the return value - no need for movzx here.
84 jz .return
85%endif
86
87 ; OR in the SSE exceptions (modifies ecx).
88 stmxcsr [xBP - 10h]
89 and ecx, [xBP - 10h]
90 and ecx, X86_MXCSR_XCPT_FLAGS
91 or eax, ecx
92
93.return:
94 leave
95 ret
96ENDPROC RT_NOCRT(fetestexcept)
97
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette