diff options
Diffstat (limited to 'deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc')
-rw-r--r-- | deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc index f54b3d5792..53ee75064b 100644 --- a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc +++ b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc @@ -3298,11 +3298,17 @@ void InstructionSelector::VisitI64x2Neg(Node* node) { void InstructionSelector::VisitI64x2ShrS(Node* node) { X64OperandGenerator g(this); - InstructionOperand temps[] = {g.TempRegister()}; - // Use fixed to rcx, to use sarq_cl in codegen. - Emit(kX64I64x2ShrS, g.DefineSameAsFirst(node), - g.UseUniqueRegister(node->InputAt(0)), g.UseFixed(node->InputAt(1), rcx), - arraysize(temps), temps); + InstructionOperand dst = + IsSupported(AVX) ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node); + + if (g.CanBeImmediate(node->InputAt(1))) { + Emit(kX64I64x2ShrS, dst, g.UseRegister(node->InputAt(0)), + g.UseImmediate(node->InputAt(1))); + } else { + InstructionOperand temps[] = {g.TempSimd128Register()}; + Emit(kX64I64x2ShrS, dst, g.UseUniqueRegister(node->InputAt(0)), + g.UseRegister(node->InputAt(1)), arraysize(temps), temps); + } } void InstructionSelector::VisitI64x2Mul(Node* node) { |