This commit is contained in:
lizzie 2026-04-03 05:49:48 +00:00
parent 69ac655a62
commit 3abfd2f2d7

View file

@ -2113,26 +2113,83 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
ctx.reg_alloc.DefineValue(code, inst, src); ctx.reg_alloc.DefineValue(code, inst, src);
return; return;
} }
auto const fpt_fn = [fbits, rounding]{ auto const fpt_fn = [fbits, rounding]() -> void (*)(VectorArray<mcl::unsigned_integer_of_size<fsize>>& output, const VectorArray<mcl::unsigned_integer_of_size<fsize>>& input, FP::FPCR fpcr, FP::FPSR& fpsr) {
#define ROUNDING_MODE(CASE) \ #define ROUNDING_MODE_CASE(CASE, N) \
else if (rounding == FP::RoundingMode::CASE && fsize == 8 && fbits == 8) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 8>; \ else if (rounding == FP::RoundingMode::CASE && fsize >= (N) && fbits == (N)) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, N>;
else if (rounding == FP::RoundingMode::CASE && fsize == 16 && fbits == 8) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 8>; \ #define ROUNDING_MODE_SWITCH(CASE) \
else if (rounding == FP::RoundingMode::CASE && fsize == 16 && fbits == 16) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 16>; \ ROUNDING_MODE_CASE(CASE, 0x00) \
else if (rounding == FP::RoundingMode::CASE && fsize == 32 && fbits == 8) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 8>; \ ROUNDING_MODE_CASE(CASE, 0x01) \
else if (rounding == FP::RoundingMode::CASE && fsize == 32 && fbits == 16) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 16>; \ ROUNDING_MODE_CASE(CASE, 0x02) \
else if (rounding == FP::RoundingMode::CASE && fsize == 32 && fbits == 32) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 32>; \ ROUNDING_MODE_CASE(CASE, 0x03) \
else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 8) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 8>; \ ROUNDING_MODE_CASE(CASE, 0x04) \
else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 16) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 16>; \ ROUNDING_MODE_CASE(CASE, 0x05) \
else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 32) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 32>; \ ROUNDING_MODE_CASE(CASE, 0x06) \
else if (rounding == FP::RoundingMode::CASE && fsize == 64 && fbits == 64) return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::CASE, 64>; 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) { /* ... */ } if (false) { /* ... */ }
ROUNDING_MODE(ToNearest_TieEven) ROUNDING_MODE_SWITCH(ToNearest_TieEven)
ROUNDING_MODE(TowardsPlusInfinity) ROUNDING_MODE_SWITCH(TowardsPlusInfinity)
ROUNDING_MODE(TowardsMinusInfinity) ROUNDING_MODE_SWITCH(TowardsMinusInfinity)
ROUNDING_MODE(TowardsZero) ROUNDING_MODE_SWITCH(TowardsZero)
ROUNDING_MODE(ToNearest_TieAwayFromZero) ROUNDING_MODE_SWITCH(ToNearest_TieAwayFromZero)
else return &EmitFPVectorToFixedThunk<fsize, unsigned_, FP::RoundingMode::TowardsZero, 64>; #undef ROUNDING_MODE_SWITCH
#undef ROUNDING_MODE_CASE
else return nullptr;
}(); }();
EmitTwoOpFallback<3>(code, ctx, inst, fpt_fn); EmitTwoOpFallback<3>(code, ctx, inst, fpt_fn);