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

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

Issue 1722733002: In background compilation make a copy of Field in order to freeze its state (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: e Created 4 years, 10 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
OLDNEW
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/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 1449 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister; 1460 locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
1461 1461
1462 Label ok, fail_label; 1462 Label ok, fail_label;
1463 1463
1464 Label* deopt = compiler->is_optimizing() ? 1464 Label* deopt = compiler->is_optimizing() ?
1465 compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL; 1465 compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
1466 1466
1467 Label* fail = (deopt != NULL) ? deopt : &fail_label; 1467 Label* fail = (deopt != NULL) ? deopt : &fail_label;
1468 1468
1469 if (emit_full_guard) { 1469 if (emit_full_guard) {
1470 __ LoadObject(field_reg, Field::ZoneHandle(field().raw())); 1470 __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
1471 1471
1472 FieldAddress field_cid_operand( 1472 FieldAddress field_cid_operand(
1473 field_reg, Field::guarded_cid_offset(), kUnsignedWord); 1473 field_reg, Field::guarded_cid_offset(), kUnsignedWord);
1474 FieldAddress field_nullability_operand( 1474 FieldAddress field_nullability_operand(
1475 field_reg, Field::is_nullable_offset(), kUnsignedWord); 1475 field_reg, Field::is_nullable_offset(), kUnsignedWord);
1476 1476
1477 if (value_cid == kDynamicCid) { 1477 if (value_cid == kDynamicCid) {
1478 LoadValueCid(compiler, value_cid_reg, value_reg); 1478 LoadValueCid(compiler, value_cid_reg, value_reg);
1479 Label skip_length_check; 1479 Label skip_length_check;
1480 __ ldr(TMP, field_cid_operand, kUnsignedWord); 1480 __ ldr(TMP, field_cid_operand, kUnsignedWord);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 const Register value_reg = locs()->in(0).reg(); 1604 const Register value_reg = locs()->in(0).reg();
1605 1605
1606 if (!compiler->is_optimizing() || 1606 if (!compiler->is_optimizing() ||
1607 (field().guarded_list_length() == Field::kUnknownFixedLength)) { 1607 (field().guarded_list_length() == Field::kUnknownFixedLength)) {
1608 const Register field_reg = locs()->temp(0).reg(); 1608 const Register field_reg = locs()->temp(0).reg();
1609 const Register offset_reg = locs()->temp(1).reg(); 1609 const Register offset_reg = locs()->temp(1).reg();
1610 const Register length_reg = locs()->temp(2).reg(); 1610 const Register length_reg = locs()->temp(2).reg();
1611 1611
1612 Label ok; 1612 Label ok;
1613 1613
1614 __ LoadObject(field_reg, Field::ZoneHandle(field().raw())); 1614 __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
1615 1615
1616 __ ldr(offset_reg, 1616 __ ldr(offset_reg,
1617 FieldAddress(field_reg, 1617 FieldAddress(field_reg,
1618 Field::guarded_list_length_in_object_offset_offset()), 1618 Field::guarded_list_length_in_object_offset_offset()),
1619 kByte); 1619 kByte);
1620 __ ldr(length_reg, FieldAddress(field_reg, 1620 __ ldr(length_reg, FieldAddress(field_reg,
1621 Field::guarded_list_length_offset())); 1621 Field::guarded_list_length_offset()));
1622 1622
1623 __ tst(offset_reg, Operand(offset_reg)); 1623 __ tst(offset_reg, Operand(offset_reg));
1624 __ b(&ok, MI); 1624 __ b(&ok, MI);
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1830 // Value input is a writable register and should be manually preserved 1830 // Value input is a writable register and should be manually preserved
1831 // across allocation slow-path. 1831 // across allocation slow-path.
1832 locs()->live_registers()->Add(locs()->in(1), kTagged); 1832 locs()->live_registers()->Add(locs()->in(1), kTagged);
1833 } 1833 }
1834 1834
1835 Label store_pointer; 1835 Label store_pointer;
1836 Label store_double; 1836 Label store_double;
1837 Label store_float32x4; 1837 Label store_float32x4;
1838 Label store_float64x2; 1838 Label store_float64x2;
1839 1839
1840 __ LoadObject(temp, Field::ZoneHandle(field().raw())); 1840 __ LoadObject(temp, *field().OriginalAsHandle(compiler->zone()));
siva 2016/02/25 23:38:32 Ditto.
1841 1841
1842 __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), 1842 __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(),
1843 kUnsignedWord); 1843 kUnsignedWord);
1844 __ CompareImmediate(temp2, kNullCid); 1844 __ CompareImmediate(temp2, kNullCid);
1845 __ b(&store_pointer, EQ); 1845 __ b(&store_pointer, EQ);
1846 1846
1847 __ LoadFromOffset( 1847 __ LoadFromOffset(
1848 temp2, temp, Field::kind_bits_offset() - kHeapObjectTag, 1848 temp2, temp, Field::kind_bits_offset() - kHeapObjectTag,
1849 kUnsignedByte); 1849 kUnsignedByte);
1850 __ tsti(temp2, Immediate(1 << Field::kUnboxingCandidateBit)); 1850 __ tsti(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 : Location::RequiresRegister()); 1968 : Location::RequiresRegister());
1969 locs->set_temp(0, Location::RequiresRegister()); 1969 locs->set_temp(0, Location::RequiresRegister());
1970 return locs; 1970 return locs;
1971 } 1971 }
1972 1972
1973 1973
1974 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1974 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1975 const Register value = locs()->in(0).reg(); 1975 const Register value = locs()->in(0).reg();
1976 const Register temp = locs()->temp(0).reg(); 1976 const Register temp = locs()->temp(0).reg();
1977 1977
1978 __ LoadObject(temp, field()); 1978 __ LoadObject(temp, *field().OriginalAsHandle(compiler->zone()));
siva 2016/02/25 23:38:32 Ditto.
srdjan 2016/02/26 00:40:42 Done.
1979 if (this->value()->NeedsStoreBuffer()) { 1979 if (this->value()->NeedsStoreBuffer()) {
1980 __ StoreIntoObjectOffset( 1980 __ StoreIntoObjectOffset(
1981 temp, Field::static_value_offset(), value, CanValueBeSmi()); 1981 temp, Field::static_value_offset(), value, CanValueBeSmi());
1982 } else { 1982 } else {
1983 __ StoreIntoObjectOffsetNoBarrier(temp, 1983 __ StoreIntoObjectOffsetNoBarrier(temp,
1984 Field::static_value_offset(), 1984 Field::static_value_offset(),
1985 value); 1985 value);
1986 } 1986 }
1987 } 1987 }
1988 1988
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
2180 Label done; 2180 Label done;
2181 const Register result_reg = locs()->out(0).reg(); 2181 const Register result_reg = locs()->out(0).reg();
2182 if (IsPotentialUnboxedLoad()) { 2182 if (IsPotentialUnboxedLoad()) {
2183 const Register temp = locs()->temp(0).reg(); 2183 const Register temp = locs()->temp(0).reg();
2184 2184
2185 Label load_pointer; 2185 Label load_pointer;
2186 Label load_double; 2186 Label load_double;
2187 Label load_float32x4; 2187 Label load_float32x4;
2188 Label load_float64x2; 2188 Label load_float64x2;
2189 2189
2190 __ LoadObject(result_reg, Field::ZoneHandle(field()->raw())); 2190 __ LoadObject(result_reg, Field::ZoneHandle(field()->Original()));
2191 2191
2192 FieldAddress field_cid_operand( 2192 FieldAddress field_cid_operand(
2193 result_reg, Field::guarded_cid_offset(), kUnsignedWord); 2193 result_reg, Field::guarded_cid_offset(), kUnsignedWord);
2194 FieldAddress field_nullability_operand( 2194 FieldAddress field_nullability_operand(
2195 result_reg, Field::is_nullable_offset(), kUnsignedWord); 2195 result_reg, Field::is_nullable_offset(), kUnsignedWord);
2196 2196
2197 __ ldr(temp, field_nullability_operand, kUnsignedWord); 2197 __ ldr(temp, field_nullability_operand, kUnsignedWord);
2198 __ CompareImmediate(temp, kNullCid); 2198 __ CompareImmediate(temp, kNullCid);
2199 __ b(&load_pointer, EQ); 2199 __ b(&load_pointer, EQ);
2200 2200
(...skipping 3380 matching lines...) Expand 10 before | Expand all | Expand 10 after
5581 1, 5581 1,
5582 locs()); 5582 locs());
5583 __ Drop(1); 5583 __ Drop(1);
5584 __ Pop(result); 5584 __ Pop(result);
5585 } 5585 }
5586 5586
5587 5587
5588 } // namespace dart 5588 } // namespace dart
5589 5589
5590 #endif // defined TARGET_ARCH_ARM64 5590 #endif // defined TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698