Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index ad55f1db910e9095f4bc1c08f762fd64b7f26e3c..0e0e22e311e01e8a6539acbe84cfd8f151fc757c 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -3117,14 +3117,18 @@ Node* SimplifiedLowering::Float64Trunc(Node* const node) { |
} |
Node* SimplifiedLowering::Int32Abs(Node* const node) { |
- Node* const zero = jsgraph()->Int32Constant(0); |
Node* const input = node->InputAt(0); |
- // if 0 < input then input else 0 - input |
- return graph()->NewNode( |
- common()->Select(MachineRepresentation::kWord32, BranchHint::kTrue), |
- graph()->NewNode(machine()->Int32LessThan(), zero, input), input, |
- graph()->NewNode(machine()->Int32Sub(), zero, input)); |
+ // Generate case for absolute integer value. |
+ // |
+ // let sign = input >> 31 in |
+ // (input ^ sign) - sign |
+ |
+ Node* sign = graph()->NewNode(machine()->Word32Sar(), input, |
+ jsgraph()->Int32Constant(31)); |
+ return graph()->NewNode(machine()->Int32Sub(), |
+ graph()->NewNode(machine()->Word32Xor(), input, sign), |
+ sign); |
} |
Node* SimplifiedLowering::Int32Div(Node* const node) { |