7fc8f72c25
This CL provides inline IL code for the getters _getInt8, _getInt16, etc. to speed up [] and byte array views. The code uses the existing LoadIndexed instructions by passing a index scale factor explicitly: For normal arrays loads, the scale factor is equal to the element size. For byte array access, the scale factor is always 1. I'm adding inlined setters in a separate CL. Review URL: https://codereview.chromium.org//12218008 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@18173 260f80e4-7a28-3924-810f-c04153c831b5
378 lines
10 KiB
C++
378 lines
10 KiB
C++
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM.
|
|
#if defined(TARGET_ARCH_ARM)
|
|
|
|
#include "vm/flow_graph_compiler.h"
|
|
|
|
#include "vm/longjump.h"
|
|
|
|
namespace dart {
|
|
|
|
FlowGraphCompiler::~FlowGraphCompiler() {
|
|
// BlockInfos are zone-allocated, so their destructors are not called.
|
|
// Verify the labels explicitly here.
|
|
for (int i = 0; i < block_info_.length(); ++i) {
|
|
ASSERT(!block_info_[i]->label.IsLinked());
|
|
}
|
|
}
|
|
|
|
|
|
bool FlowGraphCompiler::SupportsUnboxedMints() {
|
|
return false;
|
|
}
|
|
|
|
|
|
void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
|
|
intptr_t stub_ix) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
|
|
Label* is_true,
|
|
Label* is_false) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
|
|
TypeTestStubKind test_kind,
|
|
Register instance_reg,
|
|
Register type_arguments_reg,
|
|
Register temp_reg,
|
|
Label* is_instance_lbl,
|
|
Label* is_not_instance_lbl) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
RawSubtypeTestCache*
|
|
FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
|
|
intptr_t token_pos,
|
|
const AbstractType& type,
|
|
Label* is_instance_lbl,
|
|
Label* is_not_instance_lbl) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
|
|
const GrowableArray<intptr_t>& class_ids,
|
|
Label* is_equal_lbl,
|
|
Label* is_not_equal_lbl) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
|
|
intptr_t token_pos,
|
|
const AbstractType& type,
|
|
Label* is_instance_lbl,
|
|
Label* is_not_instance_lbl) {
|
|
UNIMPLEMENTED();
|
|
return false;
|
|
}
|
|
|
|
|
|
RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
|
|
intptr_t token_pos,
|
|
const Class& type_class,
|
|
Label* is_instance_lbl,
|
|
Label* is_not_instance_lbl) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
|
|
intptr_t token_pos,
|
|
const AbstractType& type,
|
|
Label* is_instance_lbl,
|
|
Label* is_not_instance_lbl) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
|
|
intptr_t token_pos,
|
|
const AbstractType& type,
|
|
Label* is_instance_lbl,
|
|
Label* is_not_instance_lbl) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
|
|
intptr_t deopt_id,
|
|
const AbstractType& type,
|
|
bool negate_result,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateAssertAssignable(intptr_t token_pos,
|
|
intptr_t deopt_id,
|
|
const AbstractType& dst_type,
|
|
const String& dst_name,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitInstructionPrologue(Instruction* instr) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::CopyParameters() {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitFrameEntry() {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::CompileGraph() {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
|
|
const ExternalLabel* label,
|
|
PcDescriptors::Kind kind,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
|
|
intptr_t token_pos,
|
|
const ExternalLabel* label,
|
|
PcDescriptors::Kind kind,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
|
|
intptr_t deopt_id,
|
|
const RuntimeEntry& entry,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitOptimizedInstanceCall(
|
|
ExternalLabel* target_label,
|
|
const ICData& ic_data,
|
|
const Array& arguments_descriptor,
|
|
intptr_t argument_count,
|
|
intptr_t deopt_id,
|
|
intptr_t token_pos,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitInstanceCall(ExternalLabel* target_label,
|
|
const ICData& ic_data,
|
|
const Array& arguments_descriptor,
|
|
intptr_t argument_count,
|
|
intptr_t deopt_id,
|
|
intptr_t token_pos,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitMegamorphicInstanceCall(
|
|
const ICData& ic_data,
|
|
const Array& arguments_descriptor,
|
|
intptr_t argument_count,
|
|
intptr_t deopt_id,
|
|
intptr_t token_pos,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitStaticCall(const Function& function,
|
|
const Array& arguments_descriptor,
|
|
intptr_t argument_count,
|
|
intptr_t deopt_id,
|
|
intptr_t token_pos,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
|
|
const Object& obj,
|
|
bool needs_number_check) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
|
|
Register right,
|
|
bool needs_number_check) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
|
|
Label* skip_call) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
|
|
Register class_id_reg,
|
|
intptr_t arg_count,
|
|
const Array& arg_names,
|
|
Label* deopt,
|
|
intptr_t deopt_id,
|
|
intptr_t token_index,
|
|
LocationSummary* locs) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
|
|
FpuRegister left,
|
|
FpuRegister right,
|
|
BranchInstr* branch) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
|
|
FpuRegister left,
|
|
FpuRegister right,
|
|
Register result) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
Condition FlowGraphCompiler::FlipCondition(Condition condition) {
|
|
UNIMPLEMENTED();
|
|
return condition;
|
|
}
|
|
|
|
|
|
bool FlowGraphCompiler::EvaluateCondition(Condition condition,
|
|
intptr_t left,
|
|
intptr_t right) {
|
|
UNIMPLEMENTED();
|
|
return false;
|
|
}
|
|
|
|
|
|
FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
|
|
intptr_t index_scale,
|
|
Register array,
|
|
intptr_t index) {
|
|
UNIMPLEMENTED();
|
|
return FieldAddress(array, index);
|
|
}
|
|
|
|
|
|
FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
|
|
intptr_t index_scale,
|
|
Register array,
|
|
Register index) {
|
|
UNIMPLEMENTED();
|
|
return FieldAddress(array, index);
|
|
}
|
|
|
|
|
|
Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
|
|
intptr_t cid,
|
|
intptr_t index_scale,
|
|
Register array,
|
|
intptr_t index) {
|
|
UNIMPLEMENTED();
|
|
return FieldAddress(array, index);
|
|
}
|
|
|
|
|
|
Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
|
|
intptr_t cid,
|
|
intptr_t index_scale,
|
|
Register array,
|
|
Register index) {
|
|
UNIMPLEMENTED();
|
|
return FieldAddress(array, index);
|
|
}
|
|
|
|
|
|
void ParallelMoveResolver::EmitMove(int index) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void ParallelMoveResolver::EmitSwap(int index) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
|
|
const Address& src) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
|
|
UNIMPLEMENTED();
|
|
}
|
|
|
|
|
|
} // namespace dart
|
|
|
|
#endif // defined TARGET_ARCH_ARM
|