Index: src/compiler/int64-lowering.cc |
diff --git a/src/compiler/int64-lowering.cc b/src/compiler/int64-lowering.cc |
index 23774a670bafd8d77215cd800c5e7858d6169c66..7b0fa9e27fdf5cfdbe885454ddaee7c6bde54a5a 100644 |
--- a/src/compiler/int64-lowering.cc |
+++ b/src/compiler/int64-lowering.cc |
@@ -356,8 +356,31 @@ void Int64Lowering::LowerNode(Node* node) { |
} |
// kExprI64SConvertI32: |
- // kExprI64UConvertI32: |
- |
+ case IrOpcode::kChangeInt32ToInt64: { |
+ DCHECK(node->InputCount() == 1); |
+ Node* input = node->InputAt(0); |
+ if (HasReplacementLow(input)) { |
+ input = GetReplacementLow(input); |
+ } |
+ // We use SAR to preserve the sign in the high word. |
+ ReplaceNode( |
+ node, input, |
+ graph()->NewNode(machine()->Word32Sar(), input, |
+ graph()->NewNode(common()->Int32Constant(31)))); |
+ node->NullAllInputs(); |
+ break; |
+ } |
+ // kExprI64UConvertI32: { |
+ case IrOpcode::kChangeUint32ToUint64: { |
+ DCHECK(node->InputCount() == 1); |
+ Node* input = node->InputAt(0); |
+ if (HasReplacementLow(input)) { |
+ input = GetReplacementLow(input); |
+ } |
+ ReplaceNode(node, input, graph()->NewNode(common()->Int32Constant(0))); |
+ node->NullAllInputs(); |
+ break; |
+ } |
// kExprF64ReinterpretI64: |
// kExprI64ReinterpretF64: |