Module: wine Branch: master Commit: 68f538faaa7b276e2e0a6f285cbfad561bd4c13e URL: http://source.winehq.org/git/wine.git/?a=commit;h=68f538faaa7b276e2e0a6f285c...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Jan 25 10:37:39 2013 +0100
msvcp90: Added std::pow(complex) and std::sqrt(complex) implementation.
---
dlls/msvcp90/math.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ dlls/msvcp90/msvcp90.spec | 48 ++++++++++++------------ 2 files changed, 114 insertions(+), 24 deletions(-)
diff --git a/dlls/msvcp90/math.c b/dlls/msvcp90/math.c index 7cd605a..e049d69 100644 --- a/dlls/msvcp90/math.c +++ b/dlls/msvcp90/math.c @@ -1427,6 +1427,47 @@ complex_float* __cdecl complex_float_polar(complex_float *ret, const float *mod) return ret; }
+/* ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@0@Z */ +/* ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@0@Z */ +complex_float* __cdecl complex_float_pow(complex_float *ret, const complex_float *l, const complex_float *r) +{ + float abs = complex_float_abs(l), arg = complex_float_arg(l); + float rad = pow(abs, r->real), theta = r->real*arg; + + if(r->imag) { + rad *= exp(-r->imag * arg); + theta += r->imag * log(abs); + } + + ret->real = rad * cos(theta); + ret->imag = rad * sin(theta); + return ret; +} + +/* ??$pow@M@std@@YA?AV?$complex@M@0@ABMABV10@@Z */ +/* ??$pow@M@std@@YA?AV?$complex@M@0@AEBMAEBV10@@Z */ +complex_float* __cdecl complex_float_pow_fc(complex_float *ret, const float *l, const complex_float *r) +{ + complex_float c = { *l, 0 }; + return complex_float_pow(ret, &c, r); +} + +/* ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@ABM@Z */ +/* ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@AEBM@Z */ +complex_float* __cdecl complex_float_pow_cf(complex_float *ret, const complex_float *l, const float *r) +{ + complex_float c = { *r, 0 }; + return complex_float_pow(ret, l, &c); +} + +/* ??$sqrt@M@std@@YA?AV?$complex@M@0@ABV10@@Z */ +/* ??$sqrt@M@std@@YA?AV?$complex@M@0@AEBV10@@Z */ +complex_float* __cdecl complex_float_sqrt(complex_float *ret, const complex_float *l) +{ + complex_float c = { 0.5, 0 }; + return complex_float_pow(ret, l, &c); +} + /* ??0?$_Complex_base@NU_C_double_complex@@@std@@QAE@ABN0@Z */ /* ??0?$_Complex_base@NU_C_double_complex@@@std@@QEAA@AEBN0@Z */ /* ??0?$_Complex_base@OU_C_ldouble_complex@@@std@@QAE@ABO0@Z */ @@ -2073,3 +2114,52 @@ complex_double* __cdecl complex_double_polar(complex_double *ret, const double * ret->imag = 0; return ret; } + +/* ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@0@Z */ +/* ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@0@Z */ +/* ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@0@Z */ +/* ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@0@Z */ +complex_double* __cdecl complex_double_pow(complex_double *ret, const complex_double *l, const complex_double *r) +{ + double abs = complex_double_abs(l), arg = complex_double_arg(l); + double rad = pow(abs, r->real), theta = r->real*arg; + + if(r->imag) { + rad *= exp(-r->imag * arg); + theta += r->imag * log(abs); + } + + ret->real = rad * cos(theta); + ret->imag = rad * sin(theta); + return ret; +} + +/* ??$pow@N@std@@YA?AV?$complex@N@0@ABNABV10@@Z */ +/* ??$pow@N@std@@YA?AV?$complex@N@0@AEBNAEBV10@@Z */ +/* ??$pow@O@std@@YA?AV?$complex@O@0@ABOABV10@@Z */ +/* ??$pow@O@std@@YA?AV?$complex@O@0@AEBOAEBV10@@Z */ +complex_double* __cdecl complex_double_pow_dc(complex_double *ret, const double *l, const complex_double *r) +{ + complex_double c = { *l, 0 }; + return complex_double_pow(ret, &c, r); +} + +/* ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@ABN@Z */ +/* ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@AEBN@Z */ +/* ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@ABO@Z */ +/* ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@AEBO@Z */ +complex_double* __cdecl complex_double_pow_cd(complex_double *ret, const complex_double *l, const double *r) +{ + complex_double c = { *r, 0 }; + return complex_double_pow(ret, l, &c); +} + +/* ??$sqrt@N@std@@YA?AV?$complex@N@0@ABV10@@Z */ +/* ??$sqrt@N@std@@YA?AV?$complex@N@0@AEBV10@@Z */ +/* ??$sqrt@O@std@@YA?AV?$complex@O@0@ABV10@@Z */ +/* ??$sqrt@O@std@@YA?AV?$complex@O@0@AEBV10@@Z */ +complex_double* __cdecl complex_double_sqrt(complex_double *ret, const complex_double *l) +{ + complex_double c = { 0.5, 0 }; + return complex_double_pow(ret, l, &c); +} diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index c1351d5..e73f51a 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -434,28 +434,28 @@ @ cdecl -arch=win64 ??$polar@O@std@@YA?AV?$complex@O@0@AEBO0@Z(ptr ptr ptr) complex_double_polar_theta @ cdecl -arch=win32 ??$polar@O@std@@YA?AV?$complex@O@0@ABO@Z(ptr ptr) complex_double_polar @ cdecl -arch=win64 ??$polar@O@std@@YA?AV?$complex@O@0@AEBO@Z(ptr ptr) complex_double_polar -@ stub -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABMABV10@@Z -@ stub -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBMAEBV10@@Z -@ stub -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@0@Z -@ stub -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@0@Z -@ stub -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@ABM@Z -@ stub -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@AEBM@Z +@ cdecl -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABMABV10@@Z(ptr ptr ptr) complex_float_pow_fc +@ cdecl -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBMAEBV10@@Z(ptr ptr ptr) complex_float_pow_fc +@ cdecl -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@0@Z(ptr ptr ptr) complex_float_pow +@ cdecl -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@0@Z(ptr ptr ptr) complex_float_pow +@ cdecl -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@ABM@Z(ptr ptr ptr) complex_float_pow_cf +@ cdecl -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@AEBM@Z(ptr ptr ptr) complex_float_pow_cf @ stub -arch=win32 ??$pow@M@std@@YA?AV?$complex@M@0@ABV10@H@Z @ stub -arch=win64 ??$pow@M@std@@YA?AV?$complex@M@0@AEBV10@H@Z -@ stub -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABNABV10@@Z -@ stub -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBNAEBV10@@Z -@ stub -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@0@Z -@ stub -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@0@Z -@ stub -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@ABN@Z -@ stub -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@AEBN@Z +@ cdecl -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABNABV10@@Z(ptr ptr ptr) complex_double_pow_dc +@ cdecl -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBNAEBV10@@Z(ptr ptr ptr) complex_double_pow_dc +@ cdecl -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@0@Z(ptr ptr ptr) complex_double_pow +@ cdecl -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@0@Z(ptr ptr ptr) complex_double_pow +@ cdecl -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@ABN@Z(ptr ptr ptr) complex_double_pow_cd +@ cdecl -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@AEBN@Z(ptr ptr ptr) complex_double_pow_cd @ stub -arch=win32 ??$pow@N@std@@YA?AV?$complex@N@0@ABV10@H@Z @ stub -arch=win64 ??$pow@N@std@@YA?AV?$complex@N@0@AEBV10@H@Z -@ stub -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABOABV10@@Z -@ stub -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBOAEBV10@@Z -@ stub -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@0@Z -@ stub -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@0@Z -@ stub -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@ABO@Z -@ stub -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@AEBO@Z +@ cdecl -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABOABV10@@Z(ptr ptr ptr) complex_double_pow_dc +@ cdecl -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBOAEBV10@@Z(ptr ptr ptr) complex_double_pow_dc +@ cdecl -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@0@Z(ptr ptr ptr) complex_double_pow +@ cdecl -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@0@Z(ptr ptr ptr) complex_double_pow +@ cdecl -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@ABO@Z(ptr ptr ptr) complex_double_pow_cd +@ cdecl -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@AEBO@Z(ptr ptr ptr) complex_double_pow_cd @ stub -arch=win32 ??$pow@O@std@@YA?AV?$complex@O@0@ABV10@H@Z @ stub -arch=win64 ??$pow@O@std@@YA?AV?$complex@O@0@AEBV10@H@Z @ cdecl -arch=win32 ??$real@M@std@@YAMABV?$complex@M@0@@Z(ptr) complex_float_real @@ -476,12 +476,12 @@ @ cdecl -arch=win64 ??$sinh@N@std@@YA?AV?$complex@N@0@AEBV10@@Z(ptr ptr) complex_double_sinh @ cdecl -arch=win32 ??$sinh@O@std@@YA?AV?$complex@O@0@ABV10@@Z(ptr ptr) complex_double_sinh @ cdecl -arch=win64 ??$sinh@O@std@@YA?AV?$complex@O@0@AEBV10@@Z(ptr ptr) complex_double_sinh -@ stub -arch=win32 ??$sqrt@M@std@@YA?AV?$complex@M@0@ABV10@@Z -@ stub -arch=win64 ??$sqrt@M@std@@YA?AV?$complex@M@0@AEBV10@@Z -@ stub -arch=win32 ??$sqrt@N@std@@YA?AV?$complex@N@0@ABV10@@Z -@ stub -arch=win64 ??$sqrt@N@std@@YA?AV?$complex@N@0@AEBV10@@Z -@ stub -arch=win32 ??$sqrt@O@std@@YA?AV?$complex@O@0@ABV10@@Z -@ stub -arch=win64 ??$sqrt@O@std@@YA?AV?$complex@O@0@AEBV10@@Z +@ cdecl -arch=win32 ??$sqrt@M@std@@YA?AV?$complex@M@0@ABV10@@Z(ptr ptr) complex_float_sqrt +@ cdecl -arch=win64 ??$sqrt@M@std@@YA?AV?$complex@M@0@AEBV10@@Z(ptr ptr) complex_float_sqrt +@ cdecl -arch=win32 ??$sqrt@N@std@@YA?AV?$complex@N@0@ABV10@@Z(ptr ptr) complex_double_sqrt +@ cdecl -arch=win64 ??$sqrt@N@std@@YA?AV?$complex@N@0@AEBV10@@Z(ptr ptr) complex_double_sqrt +@ cdecl -arch=win32 ??$sqrt@O@std@@YA?AV?$complex@O@0@ABV10@@Z(ptr ptr) complex_double_sqrt +@ cdecl -arch=win64 ??$sqrt@O@std@@YA?AV?$complex@O@0@AEBV10@@Z(ptr ptr) complex_double_sqrt @ cdecl -arch=win32 ??$tan@M@std@@YA?AV?$complex@M@0@ABV10@@Z(ptr ptr) complex_float_tan @ cdecl -arch=win64 ??$tan@M@std@@YA?AV?$complex@M@0@AEBV10@@Z(ptr ptr) complex_float_tan @ cdecl -arch=win32 ??$tan@N@std@@YA?AV?$complex@N@0@ABV10@@Z(ptr ptr) complex_double_tan