From d65b056ebae67ba16bebadb8830e31b09e21d45c Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 22 Jul 2018 17:20:11 -0400 Subject: [PATCH] Simplify fallback case for EmitVectorSetElement64() --- src/backend_x64/emit_x64_vector.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/backend_x64/emit_x64_vector.cpp b/src/backend_x64/emit_x64_vector.cpp index 26cc28d4..5e879b0b 100644 --- a/src/backend_x64/emit_x64_vector.cpp +++ b/src/backend_x64/emit_x64_vector.cpp @@ -250,15 +250,16 @@ void EmitX64::EmitVectorSetElement64(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(inst, source_vector); } else { - const Xbyak::Reg64 source_elem = ctx.reg_alloc.UseScratchGpr(args[2]); + const Xbyak::Reg64 source_elem = ctx.reg_alloc.UseGpr(args[2]); + const Xbyak::Xmm tmp = ctx.reg_alloc.ScratchXmm(); - code.pinsrw(source_vector, source_elem.cvt32(), index * 4); - code.shr(source_elem, 16); - code.pinsrw(source_vector, source_elem.cvt32(), index * 4 + 1); - code.shr(source_elem, 16); - code.pinsrw(source_vector, source_elem.cvt32(), index * 4 + 2); - code.shr(source_elem, 16); - code.pinsrw(source_vector, source_elem.cvt32(), index * 4 + 3); + code.movq(tmp, source_elem); + + if (index == 0) { + code.movsd(source_vector, tmp); + } else { + code.punpcklqdq(source_vector, tmp); + } ctx.reg_alloc.DefineValue(inst, source_vector); }