svint64_t iExponent;
iExponent = svand_s64_x(pg, svreinterpret_s64_f64(value.simdInternal_), exponentMask);
- // iExponent = svsub_s64_x(pg, svlsr_n_s64_x(pg, iExponent, 52), exponentBias);
iExponent = svsub_s64_x(
pg, svreinterpret_s64_u64(svlsr_n_u64_x(pg, svreinterpret_u64_s64(iExponent), 52)), exponentBias);
- exponent->simdInternal_ = iExponent;
- return { svreinterpret_f64_s64(svorr_s64_x(
+ svfloat64_t result = svreinterpret_f64_s64(svorr_s64_x(
pg, svand_s64_x(pg, svreinterpret_s64_f64(value.simdInternal_), mantissaMask),
- svreinterpret_s64_f64(half))) };
+ svreinterpret_s64_f64(half)));
+
+ if (opt == MathOptimization::Safe)
+ {
+ svbool_t valueIsZero = svcmpeq_n_f64(pg, value.simdInternal_, 0.0);
+ iExponent = svsel_s64(valueIsZero, svdup_s64(0), iExponent);
+ result = svsel_f64(valueIsZero, value.simdInternal_, result);
+ }
+
+ exponent->simdInternal_ = iExponent;
+ return { result };
}
template<MathOptimization opt = MathOptimization::Safe>
iExponent = svand_s32_x(pg, svreinterpret_s32_f32(value.simdInternal_), exponentMask);
iExponent = svsub_s32_x(
pg, svreinterpret_s32_u32(svlsr_n_u32_x(pg, svreinterpret_u32_s32(iExponent), 23)), exponentBias);
- exponent->simdInternal_ = iExponent;
- return { svreinterpret_f32_s32(svorr_s32_x(
+
+ svfloat32_t result = svreinterpret_f32_s32(svorr_s32_x(
pg, svand_s32_x(pg, svreinterpret_s32_f32(value.simdInternal_), mantissaMask),
- svreinterpret_s32_f32(half))) };
+ svreinterpret_s32_f32(half)));
+
+ if (opt == MathOptimization::Safe)
+ {
+ svbool_t valueIsZero = svcmpeq_n_f32(pg, value.simdInternal_, 0.0F);
+ iExponent = svsel_s32(valueIsZero, svdup_s32(0), iExponent);
+ result = svsel_f32(valueIsZero, value.simdInternal_, result);
+ }
+
+ exponent->simdInternal_ = iExponent;
+ return { result };
}
template<MathOptimization opt = MathOptimization::Safe>