emit_x64_vector_floating_point: Implement workaround for issue 678
This commit is contained in:
parent
b1dc11a32d
commit
b224fad171
1 changed files with 3 additions and 4 deletions
|
@ -1421,8 +1421,6 @@ void EmitX64::EmitFPVectorRecipStepFused64(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
|
||||||
template<size_t fsize>
|
template<size_t fsize>
|
||||||
void EmitFPVectorRoundInt(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
void EmitFPVectorRoundInt(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
using FPT = mcl::unsigned_integer_of_size<fsize>;
|
|
||||||
|
|
||||||
const auto rounding = static_cast<FP::RoundingMode>(inst->GetArg(1).GetU8());
|
const auto rounding = static_cast<FP::RoundingMode>(inst->GetArg(1).GetU8());
|
||||||
const bool exact = inst->GetArg(2).GetU1();
|
const bool exact = inst->GetArg(2).GetU1();
|
||||||
|
|
||||||
|
@ -1461,6 +1459,7 @@ void EmitFPVectorRoundInt(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
|
||||||
static const auto lut = Common::GenerateLookupTableFromList(
|
static const auto lut = Common::GenerateLookupTableFromList(
|
||||||
[]<typename I>(I) {
|
[]<typename I>(I) {
|
||||||
|
using FPT = mcl::unsigned_integer_of_size<fsize>; // WORKAROUND: For issue 678 on MSVC
|
||||||
return std::pair{
|
return std::pair{
|
||||||
mp::lower_to_tuple_v<I>,
|
mp::lower_to_tuple_v<I>,
|
||||||
Common::FptrCast(
|
Common::FptrCast(
|
||||||
|
@ -1708,8 +1707,6 @@ void EmitX64::EmitFPVectorToHalf32(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
|
||||||
template<size_t fsize, bool unsigned_>
|
template<size_t fsize, bool unsigned_>
|
||||||
void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
using FPT = mcl::unsigned_integer_of_size<fsize>;
|
|
||||||
|
|
||||||
const size_t fbits = inst->GetArg(1).GetU8();
|
const size_t fbits = inst->GetArg(1).GetU8();
|
||||||
const auto rounding = static_cast<FP::RoundingMode>(inst->GetArg(2).GetU8());
|
const auto rounding = static_cast<FP::RoundingMode>(inst->GetArg(2).GetU8());
|
||||||
[[maybe_unused]] const bool fpcr_controlled = inst->GetArg(3).GetU1();
|
[[maybe_unused]] const bool fpcr_controlled = inst->GetArg(3).GetU1();
|
||||||
|
@ -1812,6 +1809,7 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
FCODE(orp)(src, exceed_unsigned);
|
FCODE(orp)(src, exceed_unsigned);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
using FPT = mcl::unsigned_integer_of_size<fsize>; // WORKAROUND: For issue 678 on MSVC
|
||||||
constexpr u64 integer_max = static_cast<FPT>(std::numeric_limits<std::conditional_t<unsigned_, FPT, std::make_signed_t<FPT>>>::max());
|
constexpr u64 integer_max = static_cast<FPT>(std::numeric_limits<std::conditional_t<unsigned_, FPT, std::make_signed_t<FPT>>>::max());
|
||||||
|
|
||||||
code.movaps(xmm0, GetVectorOf<fsize, float_upper_limit_signed>(code));
|
code.movaps(xmm0, GetVectorOf<fsize, float_upper_limit_signed>(code));
|
||||||
|
@ -1836,6 +1834,7 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
|
||||||
static const auto lut = Common::GenerateLookupTableFromList(
|
static const auto lut = Common::GenerateLookupTableFromList(
|
||||||
[]<typename I>(I) {
|
[]<typename I>(I) {
|
||||||
|
using FPT = mcl::unsigned_integer_of_size<fsize>; // WORKAROUND: For issue 678 on MSVC
|
||||||
return std::pair{
|
return std::pair{
|
||||||
mp::lower_to_tuple_v<I>,
|
mp::lower_to_tuple_v<I>,
|
||||||
Common::FptrCast(
|
Common::FptrCast(
|
||||||
|
|
Loading…
Reference in a new issue