| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #ifndef VM_FLOW_GRAPH_COMPILER_IA32_H_ | 5 #ifndef VM_FLOW_GRAPH_COMPILER_IA32_H_ |
| 6 #define VM_FLOW_GRAPH_COMPILER_IA32_H_ | 6 #define VM_FLOW_GRAPH_COMPILER_IA32_H_ |
| 7 | 7 |
| 8 #ifndef VM_FLOW_GRAPH_COMPILER_H_ | 8 #ifndef VM_FLOW_GRAPH_COMPILER_H_ |
| 9 #error Include flow_graph_compiler.h instead of flow_graph_compiler_ia32.h. | 9 #error Include flow_graph_compiler.h instead of flow_graph_compiler_ia32.h. |
| 10 #endif | 10 #endif |
| 11 | 11 |
| 12 #include "vm/assembler.h" | |
| 13 #include "vm/assembler_macros.h" | |
| 14 #include "vm/code_descriptors.h" | |
| 15 #include "vm/code_generator.h" | |
| 16 #include "vm/intermediate_language.h" | |
| 17 | |
| 18 namespace dart { | 12 namespace dart { |
| 19 | 13 |
| 20 class AbstractType; | 14 class AbstractType; |
| 21 class Assembler; | 15 class Assembler; |
| 22 class Code; | 16 class Code; |
| 23 class DeoptimizationStub; | 17 class DeoptimizationStub; |
| 18 class FlowGraphCompiler; |
| 24 template <typename T> class GrowableArray; | 19 template <typename T> class GrowableArray; |
| 25 class ParsedFunction; | 20 class ParsedFunction; |
| 26 class StackMapBuilder; | 21 class StackMapBuilder; |
| 27 | 22 |
| 23 |
| 28 // Stubbed out implementation of graph compiler, bails out immediately if | 24 // Stubbed out implementation of graph compiler, bails out immediately if |
| 29 // CompileGraph is called. The rest of the public API is UNIMPLEMENTED. | 25 // CompileGraph is called. The rest of the public API is UNIMPLEMENTED. |
| 30 class FlowGraphCompiler : public ValueObject { | 26 class FlowGraphCompiler : public ValueObject { |
| 31 private: | 27 private: |
| 32 struct BlockInfo : public ZoneAllocated { | 28 struct BlockInfo : public ZoneAllocated { |
| 33 public: | 29 public: |
| 34 BlockInfo() : label() { } | 30 BlockInfo() : label() { } |
| 35 Label label; | 31 Label label; |
| 36 }; | 32 }; |
| 37 | 33 |
| 38 public: | 34 public: |
| 39 FlowGraphCompiler(Assembler* assembler, | 35 FlowGraphCompiler(Assembler* assembler, |
| 40 const ParsedFunction& parsed_function, | 36 const ParsedFunction& parsed_function, |
| 41 const GrowableArray<BlockEntryInstr*>& block_order, | 37 const GrowableArray<BlockEntryInstr*>& block_order, |
| 42 bool is_optimizing); | 38 bool is_optimizing); |
| 43 | 39 |
| 44 virtual ~FlowGraphCompiler(); | 40 ~FlowGraphCompiler(); |
| 45 | 41 |
| 46 // Accessors. | 42 // Accessors. |
| 47 Assembler* assembler() const { return assembler_; } | 43 Assembler* assembler() const { return assembler_; } |
| 48 const ParsedFunction& parsed_function() const { return parsed_function_; } | 44 const ParsedFunction& parsed_function() const { return parsed_function_; } |
| 49 const GrowableArray<BlockEntryInstr*>& block_order() const { | 45 const GrowableArray<BlockEntryInstr*>& block_order() const { |
| 50 return block_order_; | 46 return block_order_; |
| 51 } | 47 } |
| 52 DescriptorList* pc_descriptors_list() const { | 48 DescriptorList* pc_descriptors_list() const { |
| 53 return pc_descriptors_list_; | 49 return pc_descriptors_list_; |
| 54 } | 50 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 72 | 68 |
| 73 void LoadDoubleOrSmiToXmm(XmmRegister result, | 69 void LoadDoubleOrSmiToXmm(XmmRegister result, |
| 74 Register reg, | 70 Register reg, |
| 75 Register temp, | 71 Register temp, |
| 76 Label* not_double_or_smi); | 72 Label* not_double_or_smi); |
| 77 | 73 |
| 78 // Returns 'true' if code generation for this function is complete, i.e., | 74 // Returns 'true' if code generation for this function is complete, i.e., |
| 79 // no fall-through to regular code is needed. | 75 // no fall-through to regular code is needed. |
| 80 bool TryIntrinsify(); | 76 bool TryIntrinsify(); |
| 81 | 77 |
| 82 virtual void GenerateCallRuntime(intptr_t cid, | 78 void GenerateCallRuntime(intptr_t cid, |
| 83 intptr_t token_index, | 79 intptr_t token_index, |
| 84 intptr_t try_index, | 80 intptr_t try_index, |
| 85 const RuntimeEntry& entry); | 81 const RuntimeEntry& entry); |
| 86 | 82 |
| 87 // Returns pc-offset (in bytes) of the pc after the call, can be used to emit | 83 // Returns pc-offset (in bytes) of the pc after the call, can be used to emit |
| 88 // pc-descriptor information. | 84 // pc-descriptor information. |
| 89 virtual intptr_t EmitStaticCall(const Function& function, | 85 intptr_t EmitStaticCall(const Function& function, |
| 90 const Array& arguments_descriptor, | 86 const Array& arguments_descriptor, |
| 91 intptr_t argument_count); | 87 intptr_t argument_count); |
| 92 | 88 |
| 93 virtual void GenerateCall(intptr_t token_index, | 89 void GenerateCall(intptr_t token_index, |
| 94 intptr_t try_index, | 90 intptr_t try_index, |
| 95 const ExternalLabel* label, | 91 const ExternalLabel* label, |
| 96 PcDescriptors::Kind kind); | 92 PcDescriptors::Kind kind); |
| 97 virtual void GenerateInstanceOf(intptr_t cid, | 93 void GenerateInstanceOf(intptr_t cid, |
| 98 intptr_t token_index, | 94 intptr_t token_index, |
| 99 intptr_t try_index, | 95 intptr_t try_index, |
| 100 const AbstractType& type, | 96 const AbstractType& type, |
| 101 bool negate_result); | 97 bool negate_result); |
| 102 virtual void GenerateAssertAssignable(intptr_t cid, | 98 void GenerateAssertAssignable(intptr_t cid, |
| 103 intptr_t token_index, | 99 intptr_t token_index, |
| 104 intptr_t try_index, | 100 intptr_t try_index, |
| 105 const AbstractType& dst_type, | 101 const AbstractType& dst_type, |
| 106 const String& dst_name); | 102 const String& dst_name); |
| 107 | 103 |
| 108 void GenerateInstanceCall(intptr_t cid, | 104 void GenerateInstanceCall(intptr_t cid, |
| 109 intptr_t token_index, | 105 intptr_t token_index, |
| 110 intptr_t try_index, | 106 intptr_t try_index, |
| 111 const String& function_name, | 107 const String& function_name, |
| 112 intptr_t argument_count, | 108 intptr_t argument_count, |
| 113 const Array& argument_names, | 109 const Array& argument_names, |
| 114 intptr_t checked_argument_count); | 110 intptr_t checked_argument_count); |
| 115 | 111 |
| 116 void GenerateStaticCall(intptr_t cid, | 112 void GenerateStaticCall(intptr_t cid, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 Register reg1 = kNoRegister, | 165 Register reg1 = kNoRegister, |
| 170 Register reg2 = kNoRegister, | 166 Register reg2 = kNoRegister, |
| 171 Register reg3 = kNoRegister); | 167 Register reg3 = kNoRegister); |
| 172 | 168 |
| 173 void FinalizeExceptionHandlers(const Code& code); | 169 void FinalizeExceptionHandlers(const Code& code); |
| 174 void FinalizePcDescriptors(const Code& code); | 170 void FinalizePcDescriptors(const Code& code); |
| 175 void FinalizeStackmaps(const Code& code); | 171 void FinalizeStackmaps(const Code& code); |
| 176 void FinalizeVarDescriptors(const Code& code); | 172 void FinalizeVarDescriptors(const Code& code); |
| 177 void FinalizeComments(const Code& code); | 173 void FinalizeComments(const Code& code); |
| 178 | 174 |
| 175 FrameRegisterAllocator* frame_register_allocator() { |
| 176 return &frame_register_allocator_; |
| 177 } |
| 178 |
| 179 static const int kLocalsOffsetFromFP = (-1 * kWordSize); | 179 static const int kLocalsOffsetFromFP = (-1 * kWordSize); |
| 180 | 180 |
| 181 const Bool& bool_true() const { return bool_true_; } | 181 const Bool& bool_true() const { return bool_true_; } |
| 182 const Bool& bool_false() const { return bool_false_; } | 182 const Bool& bool_false() const { return bool_false_; } |
| 183 const Class& double_class() const { return double_class_; } | 183 const Class& double_class() const { return double_class_; } |
| 184 | 184 |
| 185 private: | 185 private: |
| 186 friend class DeoptimizationStub; | 186 friend class DeoptimizationStub; |
| 187 | 187 |
| 188 void GenerateDeferredCode(); | 188 void GenerateDeferredCode(); |
| 189 | 189 |
| 190 void CopyParameters(); | 190 void CopyParameters(); |
| 191 virtual void EmitInstructionPrologue(Instruction* instr); | 191 void EmitInstructionPrologue(Instruction* instr); |
| 192 | 192 |
| 193 virtual void GenerateInlinedGetter(intptr_t offset); | 193 void GenerateInlinedGetter(intptr_t offset); |
| 194 virtual void GenerateInlinedSetter(intptr_t offset); | 194 void GenerateInlinedSetter(intptr_t offset); |
| 195 | 195 |
| 196 RawSubtypeTestCache* GenerateInlineInstanceof(intptr_t cid, | 196 RawSubtypeTestCache* GenerateInlineInstanceof(intptr_t cid, |
| 197 intptr_t token_index, | 197 intptr_t token_index, |
| 198 const AbstractType& type, | 198 const AbstractType& type, |
| 199 Label* is_instance_lbl, | 199 Label* is_instance_lbl, |
| 200 Label* is_not_instance_lbl); | 200 Label* is_not_instance_lbl); |
| 201 | 201 |
| 202 RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest( | 202 RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest( |
| 203 intptr_t cid, | 203 intptr_t cid, |
| 204 intptr_t token_index, | 204 intptr_t token_index, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 234 | 234 |
| 235 RawSubtypeTestCache* GenerateCallSubtypeTestStub(TypeTestStubKind test_kind, | 235 RawSubtypeTestCache* GenerateCallSubtypeTestStub(TypeTestStubKind test_kind, |
| 236 Register instance_reg, | 236 Register instance_reg, |
| 237 Register type_arguments_reg, | 237 Register type_arguments_reg, |
| 238 Register temp_reg, | 238 Register temp_reg, |
| 239 Label* is_instance_lbl, | 239 Label* is_instance_lbl, |
| 240 Label* is_not_instance_lbl); | 240 Label* is_not_instance_lbl); |
| 241 | 241 |
| 242 void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false); | 242 void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false); |
| 243 | 243 |
| 244 virtual void CheckClassIds(Register class_id_reg, | 244 void CheckClassIds(Register class_id_reg, |
| 245 const GrowableArray<intptr_t>& class_ids, | 245 const GrowableArray<intptr_t>& class_ids, |
| 246 Label* is_equal_lbl, | 246 Label* is_equal_lbl, |
| 247 Label* is_not_equal_lbl); | 247 Label* is_not_equal_lbl); |
| 248 | 248 |
| 249 | 249 |
| 250 // Map a block number in a forward iteration into the block number in the | 250 // Map a block number in a forward iteration into the block number in the |
| 251 // corresponding reverse iteration. Used to obtain an index into | 251 // corresponding reverse iteration. Used to obtain an index into |
| 252 // block_order for reverse iterations. | 252 // block_order for reverse iterations. |
| 253 intptr_t reverse_index(intptr_t index) const { | 253 intptr_t reverse_index(intptr_t index) const { |
| 254 return block_order_.length() - index - 1; | 254 return block_order_.length() - index - 1; |
| 255 } | 255 } |
| 256 | 256 |
| 257 class Assembler* assembler_; | 257 class Assembler* assembler_; |
| 258 const ParsedFunction& parsed_function_; | 258 const ParsedFunction& parsed_function_; |
| 259 const GrowableArray<BlockEntryInstr*>& block_order_; | 259 const GrowableArray<BlockEntryInstr*>& block_order_; |
| 260 | 260 |
| 261 // Compiler specific per-block state. Indexed by postorder block number | 261 // Compiler specific per-block state. Indexed by postorder block number |
| 262 // for convenience. This is not the block's index in the block order, | 262 // for convenience. This is not the block's index in the block order, |
| 263 // which is reverse postorder. | 263 // which is reverse postorder. |
| 264 BlockEntryInstr* current_block_; | 264 BlockEntryInstr* current_block_; |
| 265 ExceptionHandlerList* exception_handlers_list_; | 265 ExceptionHandlerList* exception_handlers_list_; |
| 266 DescriptorList* pc_descriptors_list_; | 266 DescriptorList* pc_descriptors_list_; |
| 267 StackmapBuilder* stackmap_builder_; | 267 StackmapBuilder* stackmap_builder_; |
| 268 GrowableArray<BlockInfo*> block_info_; | 268 GrowableArray<BlockInfo*> block_info_; |
| 269 GrowableArray<DeoptimizationStub*> deopt_stubs_; | 269 GrowableArray<DeoptimizationStub*> deopt_stubs_; |
| 270 const bool is_optimizing_; | 270 const bool is_optimizing_; |
| 271 | 271 |
| 272 const Bool& bool_true_; | 272 const Bool& bool_true_; |
| 273 const Bool& bool_false_; | 273 const Bool& bool_false_; |
| 274 const Class& double_class_; | 274 const Class& double_class_; |
| 275 | 275 |
| 276 FrameRegisterAllocator frame_register_allocator_; |
| 277 |
| 276 DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler); | 278 DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler); |
| 277 }; | 279 }; |
| 278 | 280 |
| 279 | 281 |
| 280 class DeoptimizationStub : public ZoneAllocated { | 282 class DeoptimizationStub : public ZoneAllocated { |
| 281 public: | 283 public: |
| 282 DeoptimizationStub(intptr_t deopt_id, | 284 DeoptimizationStub(intptr_t deopt_id, |
| 283 intptr_t deopt_token_index, | 285 intptr_t deopt_token_index, |
| 284 intptr_t try_index, | 286 intptr_t try_index, |
| 285 DeoptReasonId reason) | 287 DeoptReasonId reason) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 304 GrowableArray<Register> registers_; | 306 GrowableArray<Register> registers_; |
| 305 Label entry_label_; | 307 Label entry_label_; |
| 306 | 308 |
| 307 DISALLOW_COPY_AND_ASSIGN(DeoptimizationStub); | 309 DISALLOW_COPY_AND_ASSIGN(DeoptimizationStub); |
| 308 }; | 310 }; |
| 309 | 311 |
| 310 | 312 |
| 311 } // namespace dart | 313 } // namespace dart |
| 312 | 314 |
| 313 #endif // VM_FLOW_GRAPH_COMPILER_IA32_H_ | 315 #endif // VM_FLOW_GRAPH_COMPILER_IA32_H_ |
| OLD | NEW |