OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // The intrinsic code below is executed before a method has built its frame. | 5 // The intrinsic code below is executed before a method has built its frame. |
6 // The return address is on the stack and the arguments below it. | 6 // The return address is on the stack and the arguments below it. |
7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. | 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. |
8 // Each intrinsification method returns true if the corresponding | 8 // Each intrinsification method returns true if the corresponding |
9 // Dart method was intrinsified. | 9 // Dart method was intrinsified. |
10 | 10 |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
557 TIMES_1, | 557 TIMES_1, |
558 Uint16Array::data_offset())); | 558 Uint16Array::data_offset())); |
559 __ SmiTag(EAX); | 559 __ SmiTag(EAX); |
560 __ ret(); | 560 __ ret(); |
561 __ Bind(&fall_through); | 561 __ Bind(&fall_through); |
562 return false; | 562 return false; |
563 } | 563 } |
564 | 564 |
565 | 565 |
566 bool Intrinsifier::Int32Array_getIndexed(Assembler* assembler) { | 566 bool Intrinsifier::Int32Array_getIndexed(Assembler* assembler) { |
567 Label fall_through; | |
568 TestByteArrayIndex(assembler, &fall_through); | |
569 __ movl(EAX, FieldAddress(EAX, | |
570 EBX, | |
571 TIMES_2, | |
572 Int32Array::data_offset())); | |
573 // Copy EBX into EAX. | |
574 // We destroy EBX while testing if EAX can fit inside a Smi. | |
575 __ movl(EBX, EAX); | |
576 // Verify that the signed value in EBX can be stored in a Smi. | |
srdjan
2012/10/12 22:52:48
Quicker way is to test with:
__ testl(EAX
Florian Schneider
2012/10/15 14:29:17
For signed ints it should be
__ cmpl(EAX, Immedi
| |
577 __ shll(EBX, Immediate(0x1)); | |
578 __ j(OVERFLOW, &fall_through, Assembler::kNearJump); // Won't fit Smi. | |
579 __ SmiTag(EAX); | |
580 __ ret(); | |
581 __ Bind(&fall_through); | |
567 return false; | 582 return false; |
568 } | 583 } |
569 | 584 |
570 | 585 |
571 bool Intrinsifier::Uint32Array_getIndexed(Assembler* assembler) { | 586 bool Intrinsifier::Uint32Array_getIndexed(Assembler* assembler) { |
587 Label fall_through; | |
588 TestByteArrayIndex(assembler, &fall_through); | |
589 __ movl(EAX, FieldAddress(EAX, | |
590 EBX, | |
591 TIMES_2, | |
592 Uint32Array::data_offset())); | |
593 // Copy EBX into EAX. | |
594 // We destroy EBX while testing if EAX can fit inside a Smi. | |
595 __ movl(EBX, EAX); | |
596 // Verify that the unsigned value in EAX can be stored in a Smi. | |
cshapiro
2012/10/12 22:33:52
Indentation...
| |
597 __ shrl(EBX, Immediate(30)); | |
cshapiro
2012/10/12 22:33:52
Please use the named constant kSmiBits instead of
| |
598 __ j(NOT_ZERO, &fall_through, Assembler::kNearJump); // Won't fit Smi. | |
srdjan
2012/10/12 22:52:48
I believe quicker test for unsigned is:
__ testl(
| |
599 __ SmiTag(EAX); | |
600 __ ret(); | |
601 __ Bind(&fall_through); | |
572 return false; | 602 return false; |
573 } | 603 } |
574 | 604 |
605 | |
606 bool Intrinsifier::Int64Array_getIndexed(Assembler* assembler) { | |
srdjan
2012/10/12 22:52:48
You could add here code that checks if the result
| |
607 return false; | |
608 } | |
609 | |
610 | |
611 bool Intrinsifier::Uint64Array_getIndexed(Assembler* assembler) { | |
612 return false; | |
613 } | |
614 | |
575 | 615 |
576 bool Intrinsifier::Float32Array_getIndexed(Assembler* assembler) { | 616 bool Intrinsifier::Float32Array_getIndexed(Assembler* assembler) { |
577 Label fall_through; | 617 Label fall_through; |
578 TestByteArrayIndex(assembler, &fall_through); | 618 TestByteArrayIndex(assembler, &fall_through); |
579 // After TestByteArrayIndex: | 619 // After TestByteArrayIndex: |
580 // * EAX has the base address of the byte array. | 620 // * EAX has the base address of the byte array. |
581 // * EBX has the index into the array. | 621 // * EBX has the index into the array. |
582 // EBX contains the SMI index which is shifted left by 1. | 622 // EBX contains the SMI index which is shifted left by 1. |
583 // This shift means we only multiply the index by 2 not 4 (sizeof float). | 623 // This shift means we only multiply the index by 2 not 4 (sizeof float). |
584 // Load single precision float into XMM7. | 624 // Load single precision float into XMM7. |
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1546 __ Bind(&is_true); | 1586 __ Bind(&is_true); |
1547 __ LoadObject(EAX, bool_true); | 1587 __ LoadObject(EAX, bool_true); |
1548 __ ret(); | 1588 __ ret(); |
1549 return true; | 1589 return true; |
1550 } | 1590 } |
1551 | 1591 |
1552 #undef __ | 1592 #undef __ |
1553 } // namespace dart | 1593 } // namespace dart |
1554 | 1594 |
1555 #endif // defined TARGET_ARCH_IA32 | 1595 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |