OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/intrinsifier.h" | 8 #include "vm/intrinsifier.h" |
9 | 9 |
10 #include "vm/assembler.h" | 10 #include "vm/assembler.h" |
(...skipping 1489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 const Class& double_class = Class::Handle( | 1500 const Class& double_class = Class::Handle( |
1501 Isolate::Current()->object_store()->double_class()); | 1501 Isolate::Current()->object_store()->double_class()); |
1502 __ TryAllocate(double_class, &fall_through, R0, R1); | 1502 __ TryAllocate(double_class, &fall_through, R0, R1); |
1503 __ StoreDFieldToOffset(V0, R0, Double::value_offset()); | 1503 __ StoreDFieldToOffset(V0, R0, Double::value_offset()); |
1504 __ ret(); | 1504 __ ret(); |
1505 __ Bind(&fall_through); | 1505 __ Bind(&fall_through); |
1506 } | 1506 } |
1507 | 1507 |
1508 | 1508 |
1509 void Intrinsifier::Double_getIsNaN(Assembler* assembler) { | 1509 void Intrinsifier::Double_getIsNaN(Assembler* assembler) { |
1510 Label is_true; | |
1511 __ ldr(R0, Address(SP, 0 * kWordSize)); | 1510 __ ldr(R0, Address(SP, 0 * kWordSize)); |
1512 __ LoadDFieldFromOffset(V0, R0, Double::value_offset()); | 1511 __ LoadDFieldFromOffset(V0, R0, Double::value_offset()); |
1513 __ fcmpd(V0, V0); | 1512 __ fcmpd(V0, V0); |
1514 __ LoadObject(TMP, Bool::False()); | 1513 __ LoadObject(TMP, Bool::False()); |
1515 __ LoadObject(R0, Bool::True()); | 1514 __ LoadObject(R0, Bool::True()); |
1516 __ csel(R0, TMP, R0, VC); | 1515 __ csel(R0, TMP, R0, VC); |
1517 __ ret(); | 1516 __ ret(); |
1518 } | 1517 } |
1519 | 1518 |
1520 | 1519 |
| 1520 void Intrinsifier::Double_getIsInfinite(Assembler* assembler) { |
| 1521 __ ldr(R0, Address(SP, 0 * kWordSize)); |
| 1522 __ LoadFieldFromOffset(R0, R0, Double::value_offset()); |
| 1523 // Mask off the sign. |
| 1524 __ AndImmediate(R0, R0, 0x7FFFFFFFFFFFFFFFLL); |
| 1525 // Compare with +infinity. |
| 1526 __ CompareImmediate(R0, 0x7FF0000000000000LL); |
| 1527 __ LoadObject(R0, Bool::False()); |
| 1528 __ LoadObject(TMP, Bool::True()); |
| 1529 __ csel(R0, TMP, R0, EQ); |
| 1530 __ ret(); |
| 1531 } |
| 1532 |
| 1533 |
1521 void Intrinsifier::Double_getIsNegative(Assembler* assembler) { | 1534 void Intrinsifier::Double_getIsNegative(Assembler* assembler) { |
1522 const Register false_reg = R0; | 1535 const Register false_reg = R0; |
1523 const Register true_reg = R2; | 1536 const Register true_reg = R2; |
1524 Label is_false, is_true, is_zero; | 1537 Label is_false, is_true, is_zero; |
1525 | 1538 |
1526 __ ldr(R0, Address(SP, 0 * kWordSize)); | 1539 __ ldr(R0, Address(SP, 0 * kWordSize)); |
1527 __ LoadDFieldFromOffset(V0, R0, Double::value_offset()); | 1540 __ LoadDFieldFromOffset(V0, R0, Double::value_offset()); |
1528 __ fcmpdz(V0); | 1541 __ fcmpdz(V0); |
1529 __ LoadObject(true_reg, Bool::True()); | 1542 __ LoadObject(true_reg, Bool::True()); |
1530 __ LoadObject(false_reg, Bool::False()); | 1543 __ LoadObject(false_reg, Bool::False()); |
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 __ cmp(R0, Operand(0)); | 2225 __ cmp(R0, Operand(0)); |
2213 __ LoadObject(R0, Bool::False()); | 2226 __ LoadObject(R0, Bool::False()); |
2214 __ LoadObject(TMP, Bool::True()); | 2227 __ LoadObject(TMP, Bool::True()); |
2215 __ csel(R0, TMP, R0, NE); | 2228 __ csel(R0, TMP, R0, NE); |
2216 __ ret(); | 2229 __ ret(); |
2217 } | 2230 } |
2218 | 2231 |
2219 } // namespace dart | 2232 } // namespace dart |
2220 | 2233 |
2221 #endif // defined TARGET_ARCH_ARM64 | 2234 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |