summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
diff options
context:
space:
mode:
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.cc16
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) {