From 3abfd2f2d7e3b6aa00e437c1df9929308bf3be4f Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 3 Apr 2026 05:49:48 +0000 Subject: [PATCH] fsck --- .../x64/emit_x64_vector_floating_point.cpp | 95 +++++++++++++++---- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index 225742e8a6..c588d43a3f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -2113,26 +2113,83 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(code, inst, src); return; } - auto const fpt_fn = [fbits, rounding]{ -#define ROUNDING_MODE(CASE) \ - else if (rounding == FP::RoundingMode::CASE && fsize == 8 && fbits == 8) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 16 && fbits == 8) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 16 && fbits == 16) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 32 && fbits == 8) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 32 && fbits == 16) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 32 && fbits == 32) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 8) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 16) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 32) return &EmitFPVectorToFixedThunk; \ - else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 64) return &EmitFPVectorToFixedThunk; - + auto const fpt_fn = [fbits, rounding]() -> void (*)(VectorArray>& output, const VectorArray>& input, FP::FPCR fpcr, FP::FPSR& fpsr) { +#define ROUNDING_MODE_CASE(CASE, N) \ + else if (rounding == FP::RoundingMode::CASE && fsize >= (N) && fbits == (N)) return &EmitFPVectorToFixedThunk; +#define ROUNDING_MODE_SWITCH(CASE) \ + ROUNDING_MODE_CASE(CASE, 0x00) \ + ROUNDING_MODE_CASE(CASE, 0x01) \ + ROUNDING_MODE_CASE(CASE, 0x02) \ + ROUNDING_MODE_CASE(CASE, 0x03) \ + ROUNDING_MODE_CASE(CASE, 0x04) \ + ROUNDING_MODE_CASE(CASE, 0x05) \ + ROUNDING_MODE_CASE(CASE, 0x06) \ + ROUNDING_MODE_CASE(CASE, 0x07) \ + ROUNDING_MODE_CASE(CASE, 0x08) \ + ROUNDING_MODE_CASE(CASE, 0x09) \ + ROUNDING_MODE_CASE(CASE, 0x0a) \ + ROUNDING_MODE_CASE(CASE, 0x0b) \ + ROUNDING_MODE_CASE(CASE, 0x0c) \ + ROUNDING_MODE_CASE(CASE, 0x0d) \ + ROUNDING_MODE_CASE(CASE, 0x0e) \ + ROUNDING_MODE_CASE(CASE, 0x0f) \ + ROUNDING_MODE_CASE(CASE, 0x10) \ + ROUNDING_MODE_CASE(CASE, 0x11) \ + ROUNDING_MODE_CASE(CASE, 0x12) \ + ROUNDING_MODE_CASE(CASE, 0x13) \ + ROUNDING_MODE_CASE(CASE, 0x14) \ + ROUNDING_MODE_CASE(CASE, 0x15) \ + ROUNDING_MODE_CASE(CASE, 0x16) \ + ROUNDING_MODE_CASE(CASE, 0x17) \ + ROUNDING_MODE_CASE(CASE, 0x18) \ + ROUNDING_MODE_CASE(CASE, 0x19) \ + ROUNDING_MODE_CASE(CASE, 0x1a) \ + ROUNDING_MODE_CASE(CASE, 0x1b) \ + ROUNDING_MODE_CASE(CASE, 0x1c) \ + ROUNDING_MODE_CASE(CASE, 0x1d) \ + ROUNDING_MODE_CASE(CASE, 0x1e) \ + ROUNDING_MODE_CASE(CASE, 0x1f) \ + ROUNDING_MODE_CASE(CASE, 0x20) \ + ROUNDING_MODE_CASE(CASE, 0x21) \ + ROUNDING_MODE_CASE(CASE, 0x22) \ + ROUNDING_MODE_CASE(CASE, 0x23) \ + ROUNDING_MODE_CASE(CASE, 0x24) \ + ROUNDING_MODE_CASE(CASE, 0x25) \ + ROUNDING_MODE_CASE(CASE, 0x26) \ + ROUNDING_MODE_CASE(CASE, 0x27) \ + ROUNDING_MODE_CASE(CASE, 0x28) \ + ROUNDING_MODE_CASE(CASE, 0x29) \ + ROUNDING_MODE_CASE(CASE, 0x2a) \ + ROUNDING_MODE_CASE(CASE, 0x2b) \ + ROUNDING_MODE_CASE(CASE, 0x2c) \ + ROUNDING_MODE_CASE(CASE, 0x2d) \ + ROUNDING_MODE_CASE(CASE, 0x2e) \ + ROUNDING_MODE_CASE(CASE, 0x2f) \ + ROUNDING_MODE_CASE(CASE, 0x30) \ + ROUNDING_MODE_CASE(CASE, 0x31) \ + ROUNDING_MODE_CASE(CASE, 0x32) \ + ROUNDING_MODE_CASE(CASE, 0x33) \ + ROUNDING_MODE_CASE(CASE, 0x34) \ + ROUNDING_MODE_CASE(CASE, 0x35) \ + ROUNDING_MODE_CASE(CASE, 0x36) \ + ROUNDING_MODE_CASE(CASE, 0x37) \ + ROUNDING_MODE_CASE(CASE, 0x38) \ + ROUNDING_MODE_CASE(CASE, 0x39) \ + ROUNDING_MODE_CASE(CASE, 0x3a) \ + ROUNDING_MODE_CASE(CASE, 0x3b) \ + ROUNDING_MODE_CASE(CASE, 0x3c) \ + ROUNDING_MODE_CASE(CASE, 0x3d) \ + ROUNDING_MODE_CASE(CASE, 0x3e) \ + ROUNDING_MODE_CASE(CASE, 0x3f) if (false) { /* ... */ } - ROUNDING_MODE(ToNearest_TieEven) - ROUNDING_MODE(TowardsPlusInfinity) - ROUNDING_MODE(TowardsMinusInfinity) - ROUNDING_MODE(TowardsZero) - ROUNDING_MODE(ToNearest_TieAwayFromZero) - else return &EmitFPVectorToFixedThunk; + ROUNDING_MODE_SWITCH(ToNearest_TieEven) + ROUNDING_MODE_SWITCH(TowardsPlusInfinity) + ROUNDING_MODE_SWITCH(TowardsMinusInfinity) + ROUNDING_MODE_SWITCH(TowardsZero) + ROUNDING_MODE_SWITCH(ToNearest_TieAwayFromZero) +#undef ROUNDING_MODE_SWITCH +#undef ROUNDING_MODE_CASE + else return nullptr; }(); EmitTwoOpFallback<3>(code, ctx, inst, fpt_fn);