Merge pull request #3565 from ivica00/feat/libc-powisf2

feat(libc): implement __powisf2
This commit is contained in:
Adrià 2026-10-11 23:34:08 +02:00 committed by GitHub
commit 4085df4667
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 0 deletions

View File

@ -121,6 +121,18 @@ float APS5_VABI atanf_nid_postfix(float x) { return std::atan(x); }
double APS5_VABI atan2_nid_postfix(double y, double x) { return std::atan2(y, x); }
float APS5_VABI powf_nid_postfix(float base, float exp) { return std::pow(base, exp); }
double APS5_VABI pow_nid_postfix(double base, double exp) { return std::pow(base, exp); }
float APS5_VABI __powisf2_nid_postfix(float base, int exponent) {
const bool reciprocal = exponent < 0;
float result = 1.0f;
unsigned int magnitude = reciprocal ? 0u - static_cast<unsigned int>(exponent) : static_cast<unsigned int>(exponent);
while (magnitude != 0u) {
if ((magnitude & 1u) != 0u) result *= base;
magnitude >>= 1u;
if (magnitude == 0u) break;
base *= base;
}
return reciprocal ? 1.0f / result : result;
}
float APS5_VABI expf_nid_postfix(float x) { return std::exp(x); }
float APS5_VABI exp2f_nid_postfix(float x) { return std::exp2(x); }
float APS5_VABI logf_nid_postfix(float x) { return std::log(x); }

View File

@ -53,6 +53,7 @@ float APS5_VABI log1pf_nid_postfix(float);
double APS5_VABI expm1_nid_postfix(double);
float APS5_VABI logbf_nid_postfix(float);
double APS5_VABI exp2_nid_postfix(double);
float APS5_VABI __powisf2_nid_postfix(float, int);
double APS5_VABI ldexp_nid_postfix(double, int);
double APS5_VABI scalbn_nid_postfix(double, int);
float APS5_VABI scalbnf_nid_postfix(float, int);
@ -491,6 +492,21 @@ int main() {
Require(abs_nid_postfix(-42) == 42);
Require(abs_nid_postfix(std::numeric_limits<int>::max()) == std::numeric_limits<int>::max());
Require(abs_nid_postfix(std::numeric_limits<int>::min()) == std::numeric_limits<int>::min());
Require(__powisf2_nid_postfix(2.0f, 10) == 1024.0f);
Require(__powisf2_nid_postfix(2.0f, -10) == 0.0009765625f);
Require(__powisf2_nid_postfix(-2.0f, 3) == -8.0f);
Require(__powisf2_nid_postfix(-2.0f, -3) == -0.125f);
Require(__powisf2_nid_postfix(-2.0f, 4) == 16.0f);
Require(__powisf2_nid_postfix(0.0f, 0) == 1.0f);
Require(__powisf2_nid_postfix(std::numeric_limits<float>::quiet_NaN(), 0) == 1.0f);
Require(std::isnan(__powisf2_nid_postfix(std::numeric_limits<float>::quiet_NaN(), 1)));
Require(__powisf2_nid_postfix(-1.0f, std::numeric_limits<int>::min()) == 1.0f);
Require(__powisf2_nid_postfix(-1.0f, std::numeric_limits<int>::max()) == -1.0f);
Require(__powisf2_nid_postfix(2.0f, std::numeric_limits<int>::min()) == 0.0f);
Require(std::isinf(__powisf2_nid_postfix(0.0f, -1)));
Require(std::signbit(__powisf2_nid_postfix(-0.0f, 3)));
Require(std::isinf(__powisf2_nid_postfix(-0.0f, -3)) && std::signbit(__powisf2_nid_postfix(-0.0f, -3)));
Require(__powisf2_nid_postfix(2.0f, -127) == 0x1p-127f);
CheckHyperbolic();
CheckHypotSpecialValue();
}