From 8ef114d48f296018f3d2ab024cf32e395c50e16b Mon Sep 17 00:00:00 2001 From: MerryMage Date: Tue, 24 Jul 2018 17:32:00 +0100 Subject: [PATCH] emit_x64_vector: packusdw reqiures SSE4.1 In EmitVectorSignedSaturatedNarrowToUnsigned32. --- src/backend_x64/emit_x64_vector.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend_x64/emit_x64_vector.cpp b/src/backend_x64/emit_x64_vector.cpp index 65f5d5cd..a9d58c99 100644 --- a/src/backend_x64/emit_x64_vector.cpp +++ b/src/backend_x64/emit_x64_vector.cpp @@ -2241,13 +2241,25 @@ void EmitX64::EmitVectorSignedSaturatedNarrowToUnsigned16(EmitContext& ctx, IR:: } void EmitX64::EmitVectorSignedSaturatedNarrowToUnsigned32(EmitContext& ctx, IR::Inst* inst) { - EmitVectorSignedSaturatedNarrowToUnsigned(32, code, ctx, inst); + if (code.DoesCpuSupport(Xbyak::util::Cpu::tSSE41)) { + EmitVectorSignedSaturatedNarrowToUnsigned(32, code, ctx, inst); + return; + } + + EmitOneArgumentFallbackWithSaturation(code, ctx, inst, [](VectorArray& result, const VectorArray& a) { + bool qc_flag = false; + for (size_t i = 0; i < a.size(); ++i) { + const s32 saturated = std::clamp(a[i], 0, 0xFFFF); + result[i] = static_cast(saturated); + qc_flag |= saturated != a[i]; + } + return qc_flag; + }); } void EmitX64::EmitVectorSignedSaturatedNarrowToUnsigned64(EmitContext& ctx, IR::Inst* inst) { EmitOneArgumentFallbackWithSaturation(code, ctx, inst, [](VectorArray& result, const VectorArray& a) { bool qc_flag = false; - result.fill(0); for (size_t i = 0; i < a.size(); ++i) { const s64 saturated = std::clamp(a[i], 0, 0xFFFFFFFF); result[i] = static_cast(saturated);