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 |