OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/crankshaft/arm/lithium-codegen-arm.h" | 5 #include "src/crankshaft/arm/lithium-codegen-arm.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/crankshaft/arm/lithium-gap-resolver-arm.h" | 10 #include "src/crankshaft/arm/lithium-gap-resolver-arm.h" |
(...skipping 1914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1925 // Left equals right => check for -0. | 1925 // Left equals right => check for -0. |
1926 __ VFPCompareAndSetFlags(left_reg, 0.0); | 1926 __ VFPCompareAndSetFlags(left_reg, 0.0); |
1927 if (left_reg.is(result_reg) || right_reg.is(result_reg)) { | 1927 if (left_reg.is(result_reg) || right_reg.is(result_reg)) { |
1928 __ b(ne, &done); // left == right != 0. | 1928 __ b(ne, &done); // left == right != 0. |
1929 } else { | 1929 } else { |
1930 __ b(ne, &return_left); // left == right != 0. | 1930 __ b(ne, &return_left); // left == right != 0. |
1931 } | 1931 } |
1932 // At this point, both left and right are either 0 or -0. | 1932 // At this point, both left and right are either 0 or -0. |
1933 if (operation == HMathMinMax::kMathMin) { | 1933 if (operation == HMathMinMax::kMathMin) { |
1934 // We could use a single 'vorr' instruction here if we had NEON support. | 1934 // We could use a single 'vorr' instruction here if we had NEON support. |
| 1935 // The algorithm is: -((-L) + (-R)), which in case of L and R being |
| 1936 // different registers is most efficiently expressed as -((-L) - R). |
1935 __ vneg(left_reg, left_reg); | 1937 __ vneg(left_reg, left_reg); |
1936 __ vsub(result_reg, left_reg, right_reg); | 1938 if (left_reg.is(right_reg)) { |
| 1939 __ vadd(result_reg, left_reg, right_reg); |
| 1940 } else { |
| 1941 __ vsub(result_reg, left_reg, right_reg); |
| 1942 } |
1937 __ vneg(result_reg, result_reg); | 1943 __ vneg(result_reg, result_reg); |
1938 } else { | 1944 } else { |
1939 // Since we operate on +0 and/or -0, vadd and vand have the same effect; | 1945 // Since we operate on +0 and/or -0, vadd and vand have the same effect; |
1940 // the decision for vadd is easy because vand is a NEON instruction. | 1946 // the decision for vadd is easy because vand is a NEON instruction. |
1941 __ vadd(result_reg, left_reg, right_reg); | 1947 __ vadd(result_reg, left_reg, right_reg); |
1942 } | 1948 } |
1943 __ b(&done); | 1949 __ b(&done); |
1944 | 1950 |
1945 __ bind(&result_is_nan); | 1951 __ bind(&result_is_nan); |
1946 __ vadd(result_reg, left_reg, right_reg); | 1952 __ vadd(result_reg, left_reg, right_reg); |
(...skipping 3604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5551 __ push(ToRegister(instr->function())); | 5557 __ push(ToRegister(instr->function())); |
5552 CallRuntime(Runtime::kPushBlockContext, instr); | 5558 CallRuntime(Runtime::kPushBlockContext, instr); |
5553 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5559 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5554 } | 5560 } |
5555 | 5561 |
5556 | 5562 |
5557 #undef __ | 5563 #undef __ |
5558 | 5564 |
5559 } // namespace internal | 5565 } // namespace internal |
5560 } // namespace v8 | 5566 } // namespace v8 |
OLD | NEW |