Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 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 1506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1517 __ cmpq(RAX, Address(RSP, + kReceiverOffset * kWordSize)); | 1517 __ cmpq(RAX, Address(RSP, + kReceiverOffset * kWordSize)); |
| 1518 __ j(EQUAL, &is_true, Assembler::kNearJump); | 1518 __ j(EQUAL, &is_true, Assembler::kNearJump); |
| 1519 __ LoadObject(RAX, Bool::False(), PP); | 1519 __ LoadObject(RAX, Bool::False(), PP); |
| 1520 __ ret(); | 1520 __ ret(); |
| 1521 __ Bind(&is_true); | 1521 __ Bind(&is_true); |
| 1522 __ LoadObject(RAX, Bool::True(), PP); | 1522 __ LoadObject(RAX, Bool::True(), PP); |
| 1523 __ ret(); | 1523 __ ret(); |
| 1524 } | 1524 } |
| 1525 | 1525 |
| 1526 | 1526 |
| 1527 // Return type quickly for simple types (not parametrized and not signature) | |
|
regis
2015/06/30 23:28:32
ditto
srdjan
2015/07/01 00:35:41
ditto
| |
| 1528 void Intrinsifier::ObjectRuntimeType(Assembler* assembler) { | |
| 1529 Label fall_through, not_smi, cid_loaded; | |
| 1530 __ movq(RAX, Address(RSP, + 1 * kWordSize)); | |
| 1531 // Note: we cannot refer to IntType inside intrinsic code. | |
| 1532 __ testq(RAX, Immediate(kSmiTagMask)); | |
| 1533 __ j(NOT_ZERO, ¬_smi, Assembler::kNearJump); | |
| 1534 __ LoadImmediate(RCX, Immediate(kSmiCid), PP); | |
| 1535 __ jmp(&cid_loaded); | |
| 1536 __ Bind(¬_smi); | |
| 1537 __ LoadClassId(RCX, RAX); | |
| 1538 __ Bind(&cid_loaded); | |
| 1539 | |
| 1540 // RCX: untagged cid of instance (RAX). | |
| 1541 __ LoadClassById(RDI, RCX, PP); | |
| 1542 // RDI: class of instance (RAX). | |
| 1543 // if ((NumTypeArguments() == 0) && !IsSignatureClass()) { | |
| 1544 // return reinterpret_cast<RawType*>(raw_ptr()->canonical_types_); | |
| 1545 // } | |
| 1546 __ movq(RCX, FieldAddress(RDI, Class::signature_function_offset())); | |
| 1547 __ CompareObject(RCX, Object::null_object(), PP); | |
| 1548 __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump); | |
| 1549 | |
| 1550 __ movzxw(RCX, FieldAddress(RDI, Class::num_type_arguments_offset())); | |
| 1551 __ cmpq(RCX, Immediate(0)); | |
| 1552 __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump); | |
| 1553 __ movq(RAX, FieldAddress(RDI, Class::canonical_types_offset())); | |
| 1554 __ CompareObject(RAX, Object::null_object(), PP); | |
| 1555 __ j(EQUAL, &fall_through, Assembler::kNearJump); // Not yet set. | |
| 1556 __ ret(); | |
| 1557 | |
| 1558 __ Bind(&fall_through); | |
| 1559 } | |
| 1560 | |
| 1561 | |
| 1527 void Intrinsifier::String_getHashCode(Assembler* assembler) { | 1562 void Intrinsifier::String_getHashCode(Assembler* assembler) { |
| 1528 Label fall_through; | 1563 Label fall_through; |
| 1529 __ movq(RAX, Address(RSP, + 1 * kWordSize)); // String object. | 1564 __ movq(RAX, Address(RSP, + 1 * kWordSize)); // String object. |
| 1530 __ movq(RAX, FieldAddress(RAX, String::hash_offset())); | 1565 __ movq(RAX, FieldAddress(RAX, String::hash_offset())); |
| 1531 __ cmpq(RAX, Immediate(0)); | 1566 __ cmpq(RAX, Immediate(0)); |
| 1532 __ j(EQUAL, &fall_through, Assembler::kNearJump); | 1567 __ j(EQUAL, &fall_through, Assembler::kNearJump); |
| 1533 __ ret(); | 1568 __ ret(); |
| 1534 __ Bind(&fall_through); | 1569 __ Bind(&fall_through); |
| 1535 // Hash not yet computed. | 1570 // Hash not yet computed. |
| 1536 } | 1571 } |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1925 __ movq(RBX, Address(RSP, kRegExpParamOffset)); | 1960 __ movq(RBX, Address(RSP, kRegExpParamOffset)); |
| 1926 __ movq(RDI, Address(RSP, kStringParamOffset)); | 1961 __ movq(RDI, Address(RSP, kStringParamOffset)); |
| 1927 __ LoadClassId(RDI, RDI); | 1962 __ LoadClassId(RDI, RDI); |
| 1928 __ SubImmediate(RDI, Immediate(kOneByteStringCid), PP); | 1963 __ SubImmediate(RDI, Immediate(kOneByteStringCid), PP); |
| 1929 __ movq(RAX, FieldAddress(RBX, RDI, TIMES_8, | 1964 __ movq(RAX, FieldAddress(RBX, RDI, TIMES_8, |
| 1930 JSRegExp::function_offset(kOneByteStringCid))); | 1965 JSRegExp::function_offset(kOneByteStringCid))); |
| 1931 | 1966 |
| 1932 // Registers are now set up for the lazy compile stub. It expects the function | 1967 // Registers are now set up for the lazy compile stub. It expects the function |
| 1933 // in RAX, the argument descriptor in R10, and IC-Data in RCX. | 1968 // in RAX, the argument descriptor in R10, and IC-Data in RCX. |
| 1934 static const intptr_t arg_count = RegExpMacroAssembler::kParamCount; | 1969 static const intptr_t arg_count = RegExpMacroAssembler::kParamCount; |
| 1935 __ LoadObject(R10, Array::Handle(ArgumentsDescriptor::New(arg_count)), PP); | 1970 __ LoadObject(R10, |
| 1971 Array::ZoneHandle(ArgumentsDescriptor::New(arg_count)), PP); | |
| 1936 __ xorq(RCX, RCX); | 1972 __ xorq(RCX, RCX); |
| 1937 | 1973 |
| 1938 // Tail-call the function. | 1974 // Tail-call the function. |
| 1939 __ movq(RDI, FieldAddress(RAX, Function::instructions_offset())); | 1975 __ movq(RDI, FieldAddress(RAX, Function::instructions_offset())); |
| 1940 __ addq(RDI, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); | 1976 __ addq(RDI, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); |
| 1941 __ jmp(RDI); | 1977 __ jmp(RDI); |
| 1942 } | 1978 } |
| 1943 | 1979 |
| 1944 | 1980 |
| 1945 // On stack: user tag (+1), return-address (+0). | 1981 // On stack: user tag (+1), return-address (+0). |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1985 // Set return value to Isolate::current_tag_. | 2021 // Set return value to Isolate::current_tag_. |
| 1986 __ movq(RAX, Address(RBX, Isolate::current_tag_offset())); | 2022 __ movq(RAX, Address(RBX, Isolate::current_tag_offset())); |
| 1987 __ ret(); | 2023 __ ret(); |
| 1988 } | 2024 } |
| 1989 | 2025 |
| 1990 #undef __ | 2026 #undef __ |
| 1991 | 2027 |
| 1992 } // namespace dart | 2028 } // namespace dart |
| 1993 | 2029 |
| 1994 #endif // defined TARGET_ARCH_X64 | 2030 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |