From f5b41aabc60309352435d301c825f83fd17fe763 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Thu, 18 Jun 2020 18:04:23 +0100 Subject: [PATCH] emit_x64_vector: Implement EmitVectorPolynomialMultiplyLong64 in terms of pclmulqdq --- src/backend/x64/emit_x64_vector.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/backend/x64/emit_x64_vector.cpp b/src/backend/x64/emit_x64_vector.cpp index 258a4410..97597b06 100644 --- a/src/backend/x64/emit_x64_vector.cpp +++ b/src/backend/x64/emit_x64_vector.cpp @@ -2509,6 +2509,17 @@ void EmitX64::EmitVectorPolynomialMultiplyLong8(EmitContext& ctx, IR::Inst* inst } void EmitX64::EmitVectorPolynomialMultiplyLong64(EmitContext& ctx, IR::Inst* inst) { + if (code.HasPCLMULQDQ()) { + auto args = ctx.reg_alloc.GetArgumentInfo(inst); + const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(args[0]); + const Xbyak::Xmm xmm_b = ctx.reg_alloc.UseXmm(args[1]); + + code.pclmulqdq(xmm_a, xmm_b, 0x00); + + ctx.reg_alloc.DefineValue(inst, xmm_a); + return; + } + EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { const auto handle_high_bits = [](u64 lhs, u64 rhs) { constexpr size_t bit_size = Common::BitSize();