VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/math/pow.asm

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1; $Id: pow.asm 98103 2023-01-17 14:15:46Z vboxsync $
2;; @file
3; IPRT - No-CRT pow - AMD64 & X86.
4;
5
6;
7; Copyright (C) 2006-2023 Oracle and/or its affiliates.
8;
9; This file is part of VirtualBox base platform packages, as
10; available from https://www.virtualbox.org.
11;
12; This program is free software; you can redistribute it and/or
13; modify it under the terms of the GNU General Public License
14; as published by the Free Software Foundation, in version 3 of the
15; License.
16;
17; This program is distributed in the hope that it will be useful, but
18; WITHOUT ANY WARRANTY; without even the implied warranty of
19; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20; General Public License for more details.
21;
22; You should have received a copy of the GNU General Public License
23; along with this program; if not, see <https://www.gnu.org/licenses>.
24;
25; The contents of this file may alternatively be used under the terms
26; of the Common Development and Distribution License Version 1.0
27; (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28; in the VirtualBox distribution, in which case the provisions of the
29; CDDL are applicable instead of those of the GPL.
30;
31; You may elect to license modified versions of this file under the
32; terms and conditions of either the GPL or the CDDL or both.
33;
34; SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35;
36
37
38%define RT_ASM_WITH_SEH64
39%include "iprt/asmdefs.mac"
40%include "iprt/x86.mac"
41
42
43BEGINCODE
44
45extern NAME(rtNoCrtMathPowCore)
46
47;;
48; Compute the rdBase to the power of rdExp.
49; @returns st(0) / xmm0
50; @param rdBase [xSP + xCB*2] / xmm0
51; @param rdExp [xSP + xCB*2 + 8] / xmm1
52;
53RT_NOCRT_BEGINPROC pow
54 push xBP
55 SEH64_PUSH_xBP
56 mov xBP, xSP
57 SEH64_SET_FRAME_xBP 0
58 push xBX
59 SEH64_PUSH_GREG rbx
60 sub xSP, 30h - xCB
61 SEH64_ALLOCATE_STACK 30h - xCB
62 SEH64_END_PROLOGUE
63
64 ;
65 ; Load rdBase into st1 and rdExp into st0.
66 ;
67%ifdef RT_ARCH_AMD64
68 movsd [xBP - 20h], xmm0
69 fld qword [xBP - 20h]
70 fxam
71 fnstsw ax
72 mov dx, ax ; dx=fxam(base)
73
74 movsd [xBP - 30h], xmm1
75 fld qword [xBP - 30h]
76%else
77 fld qword [xBP + xCB*2]
78 fxam
79 fnstsw ax
80 mov dx, ax ; dx=fxam(base)
81
82 fld qword [xBP + xCB*2 + RTLRD_CB]
83%endif
84
85 ;
86 ; Call common worker for the calculation.
87 ;
88 mov ebx, 1 ; float
89 call NAME(rtNoCrtMathPowCore)
90
91 ;
92 ; Normally, we return with eax==0 and we have to load the result
93 ; from st0 and into xmm0.
94 ;
95 cmp eax, 0
96 jne .return_input_reg
97
98 fstp qword [xSP - 30h]
99 movsd xmm0, [xSP - 30h]
100
101.return:
102 lea xSP, [xBP - xCB]
103 pop xBX
104 leave
105 ret
106
107 ;
108 ; But sometimes, like if we have NaN or other special inputs, we should
109 ; return the input as-is and ditch the st0 value.
110 ;
111.return_input_reg:
112 ffreep st0
113 cmp eax, 2
114 je .return_exp
115%ifdef RT_STRICT
116 cmp eax, 1
117 je .return_base
118 int3
119%endif
120.return_base:
121 jmp .return
122
123.return_exp:
124 movsd xmm0, xmm1
125 jmp .return
126ENDPROC RT_NOCRT(pow)
127
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use