Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Side by Side Diff: runtime/vm/intermediate_language_x64.cc

Issue 2112043002: Land Ivan's change of 'Remove support for verified memory handling' (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address code review comments. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/intermediate_language_mips.cc ('k') | runtime/vm/intrinsifier_arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 1735 matching lines...) Expand 10 before | Expand all | Expand 10 after
1746 1746
1747 1747
1748 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone, 1748 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
1749 bool opt) const { 1749 bool opt) const {
1750 const intptr_t kNumInputs = 2; 1750 const intptr_t kNumInputs = 2;
1751 const intptr_t kNumTemps = 1751 const intptr_t kNumTemps =
1752 (IsUnboxedStore() && opt) ? 2 : 1752 (IsUnboxedStore() && opt) ? 2 :
1753 ((IsPotentialUnboxedStore()) ? 3 : 0); 1753 ((IsPotentialUnboxedStore()) ? 3 : 0);
1754 LocationSummary* summary = new(zone) LocationSummary( 1754 LocationSummary* summary = new(zone) LocationSummary(
1755 zone, kNumInputs, kNumTemps, 1755 zone, kNumInputs, kNumTemps,
1756 ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) || 1756 ((IsUnboxedStore() && opt && is_initialization()) ||
1757 IsPotentialUnboxedStore()) 1757 IsPotentialUnboxedStore())
1758 ? LocationSummary::kCallOnSlowPath 1758 ? LocationSummary::kCallOnSlowPath
1759 : LocationSummary::kNoCall); 1759 : LocationSummary::kNoCall);
1760 1760
1761 summary->set_in(0, Location::RequiresRegister()); 1761 summary->set_in(0, Location::RequiresRegister());
1762 if (IsUnboxedStore() && opt) { 1762 if (IsUnboxedStore() && opt) {
1763 summary->set_in(1, Location::RequiresFpuRegister()); 1763 summary->set_in(1, Location::RequiresFpuRegister());
1764 summary->set_temp(0, Location::RequiresRegister()); 1764 summary->set_temp(0, Location::RequiresRegister());
1765 summary->set_temp(1, Location::RequiresRegister()); 1765 summary->set_temp(1, Location::RequiresRegister());
1766 } else if (IsPotentialUnboxedStore()) { 1766 } else if (IsPotentialUnboxedStore()) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 Label skip_store; 1806 Label skip_store;
1807 1807
1808 Register instance_reg = locs()->in(0).reg(); 1808 Register instance_reg = locs()->in(0).reg();
1809 1809
1810 if (IsUnboxedStore() && compiler->is_optimizing()) { 1810 if (IsUnboxedStore() && compiler->is_optimizing()) {
1811 XmmRegister value = locs()->in(1).fpu_reg(); 1811 XmmRegister value = locs()->in(1).fpu_reg();
1812 Register temp = locs()->temp(0).reg(); 1812 Register temp = locs()->temp(0).reg();
1813 Register temp2 = locs()->temp(1).reg(); 1813 Register temp2 = locs()->temp(1).reg();
1814 const intptr_t cid = field().UnboxedFieldCid(); 1814 const intptr_t cid = field().UnboxedFieldCid();
1815 1815
1816 if (is_potential_unboxed_initialization_) { 1816 if (is_initialization()) {
1817 const Class* cls = NULL; 1817 const Class* cls = NULL;
1818 switch (cid) { 1818 switch (cid) {
1819 case kDoubleCid: 1819 case kDoubleCid:
1820 cls = &compiler->double_class(); 1820 cls = &compiler->double_class();
1821 break; 1821 break;
1822 case kFloat32x4Cid: 1822 case kFloat32x4Cid:
1823 cls = &compiler->float32x4_class(); 1823 cls = &compiler->float32x4_class();
1824 break; 1824 break;
1825 case kFloat64x2Cid: 1825 case kFloat64x2Cid:
1826 cls = &compiler->float64x2_class(); 1826 cls = &compiler->float64x2_class();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1951 if (ShouldEmitStoreBarrier()) { 1951 if (ShouldEmitStoreBarrier()) {
1952 Register value_reg = locs()->in(1).reg(); 1952 Register value_reg = locs()->in(1).reg();
1953 __ StoreIntoObject(instance_reg, 1953 __ StoreIntoObject(instance_reg,
1954 FieldAddress(instance_reg, offset_in_bytes_), 1954 FieldAddress(instance_reg, offset_in_bytes_),
1955 value_reg, 1955 value_reg,
1956 CanValueBeSmi()); 1956 CanValueBeSmi());
1957 } else { 1957 } else {
1958 if (locs()->in(1).IsConstant()) { 1958 if (locs()->in(1).IsConstant()) {
1959 __ StoreIntoObjectNoBarrier(instance_reg, 1959 __ StoreIntoObjectNoBarrier(instance_reg,
1960 FieldAddress(instance_reg, offset_in_bytes_), 1960 FieldAddress(instance_reg, offset_in_bytes_),
1961 locs()->in(1).constant(), 1961 locs()->in(1).constant());
1962 is_object_reference_initialization_ ?
1963 Assembler::kEmptyOrSmiOrNull :
1964 Assembler::kHeapObjectOrSmi);
1965 } else { 1962 } else {
1966 Register value_reg = locs()->in(1).reg(); 1963 Register value_reg = locs()->in(1).reg();
1967 __ StoreIntoObjectNoBarrier(instance_reg, 1964 __ StoreIntoObjectNoBarrier(instance_reg,
1968 FieldAddress(instance_reg, offset_in_bytes_), 1965 FieldAddress(instance_reg, offset_in_bytes_),
1969 value_reg, 1966 value_reg);
1970 is_object_reference_initialization_ ?
1971 Assembler::kEmptyOrSmiOrNull :
1972 Assembler::kHeapObjectOrSmi);
1973 } 1967 }
1974 } 1968 }
1975 __ Bind(&skip_store); 1969 __ Bind(&skip_store);
1976 } 1970 }
1977 1971
1978 1972
1979 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone, 1973 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
1980 bool opt) const { 1974 bool opt) const {
1981 const intptr_t kNumInputs = 1; 1975 const intptr_t kNumInputs = 1;
1982 const intptr_t kNumTemps = 0; 1976 const intptr_t kNumTemps = 0;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2079 const Register kElemTypeReg = RBX; 2073 const Register kElemTypeReg = RBX;
2080 const intptr_t instance_size = Array::InstanceSize(num_elements); 2074 const intptr_t instance_size = Array::InstanceSize(num_elements);
2081 2075
2082 __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump, 2076 __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
2083 RAX, // instance 2077 RAX, // instance
2084 RCX, // end address 2078 RCX, // end address
2085 R13); // temp 2079 R13); // temp
2086 2080
2087 // RAX: new object start as a tagged pointer. 2081 // RAX: new object start as a tagged pointer.
2088 // Store the type argument field. 2082 // Store the type argument field.
2089 __ InitializeFieldNoBarrier(RAX, 2083 __ StoreIntoObjectNoBarrier(RAX,
2090 FieldAddress(RAX, Array::type_arguments_offset()), 2084 FieldAddress(RAX, Array::type_arguments_offset()),
2091 kElemTypeReg); 2085 kElemTypeReg);
2092 2086
2093 // Set the length field. 2087 // Set the length field.
2094 __ InitializeFieldNoBarrier(RAX, 2088 __ StoreIntoObjectNoBarrier(RAX,
2095 FieldAddress(RAX, Array::length_offset()), 2089 FieldAddress(RAX, Array::length_offset()),
2096 kLengthReg); 2090 kLengthReg);
2097 2091
2098 // Initialize all array elements to raw_null. 2092 // Initialize all array elements to raw_null.
2099 // RAX: new object start as a tagged pointer. 2093 // RAX: new object start as a tagged pointer.
2100 // RCX: new object end address. 2094 // RCX: new object end address.
2101 // RDI: iterator which initially points to the start of the variable 2095 // RDI: iterator which initially points to the start of the variable
2102 // data area to be initialized. 2096 // data area to be initialized.
2103 if (num_elements > 0) { 2097 if (num_elements > 0) {
2104 const intptr_t array_size = instance_size - sizeof(RawArray); 2098 const intptr_t array_size = instance_size - sizeof(RawArray);
2105 __ LoadObject(R12, Object::null_object()); 2099 __ LoadObject(R12, Object::null_object());
2106 __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray))); 2100 __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
2107 if (array_size < (kInlineArraySize * kWordSize)) { 2101 if (array_size < (kInlineArraySize * kWordSize)) {
2108 intptr_t current_offset = 0; 2102 intptr_t current_offset = 0;
2109 while (current_offset < array_size) { 2103 while (current_offset < array_size) {
2110 __ InitializeFieldNoBarrier(RAX, Address(RDI, current_offset), R12); 2104 __ StoreIntoObjectNoBarrier(RAX, Address(RDI, current_offset), R12);
2111 current_offset += kWordSize; 2105 current_offset += kWordSize;
2112 } 2106 }
2113 } else { 2107 } else {
2114 Label init_loop; 2108 Label init_loop;
2115 __ Bind(&init_loop); 2109 __ Bind(&init_loop);
2116 __ InitializeFieldNoBarrier(RAX, Address(RDI, 0), R12); 2110 __ StoreIntoObjectNoBarrier(RAX, Address(RDI, 0), R12);
2117 __ addq(RDI, Immediate(kWordSize)); 2111 __ addq(RDI, Immediate(kWordSize));
2118 __ cmpq(RDI, RCX); 2112 __ cmpq(RDI, RCX);
2119 __ j(BELOW, &init_loop, Assembler::kNearJump); 2113 __ j(BELOW, &init_loop, Assembler::kNearJump);
2120 } 2114 }
2121 } 2115 }
2122 __ jmp(done, Assembler::kNearJump); 2116 __ jmp(done, Assembler::kNearJump);
2123 } 2117 }
2124 2118
2125 2119
2126 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2120 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 4431 matching lines...) Expand 10 before | Expand all | Expand 10 after
6558 __ Drop(1); 6552 __ Drop(1);
6559 __ popq(result); 6553 __ popq(result);
6560 } 6554 }
6561 6555
6562 6556
6563 } // namespace dart 6557 } // namespace dart
6564 6558
6565 #undef __ 6559 #undef __
6566 6560
6567 #endif // defined TARGET_ARCH_X64 6561 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language_mips.cc ('k') | runtime/vm/intrinsifier_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698