CodeGenerator

xiaoxiao2021-02-28  112

类CodeGenerator:

334 protected: 335 CodeGenerator(HGraph* graph, 336 size_t number_of_core_registers, 337 size_t number_of_fpu_registers, 338 size_t number_of_register_pairs, 339 uint32_t core_callee_save_mask, 340 uint32_t fpu_callee_save_mask, 341 const CompilerOptions& compiler_options) 342 : frame_size_(0), 343 core_spill_mask_(0), 344 fpu_spill_mask_(0), 345 first_register_slot_in_slow_path_(0), 346 blocked_core_registers_(graph->GetArena()->AllocArray<bool>(number_of_core_registers)), 347 blocked_fpu_registers_(graph->GetArena()->AllocArray<bool>(number_of_fpu_registers)), 348 blocked_register_pairs_(graph->GetArena()->AllocArray<bool>(number_of_register_pairs)), 349 number_of_core_registers_(number_of_core_registers), 350 number_of_fpu_registers_(number_of_fpu_registers), 351 number_of_register_pairs_(number_of_register_pairs), 352 core_callee_save_mask_(core_callee_save_mask), 353 fpu_callee_save_mask_(fpu_callee_save_mask), 354 is_baseline_(false), 355 graph_(graph), 356 compiler_options_(compiler_options), 357 pc_infos_(graph->GetArena(), 32), 358 slow_paths_(graph->GetArena(), 8), 359 block_order_(nullptr), 360 current_block_index_(0), 361 is_leaf_(true), 362 requires_current_method_(false), 363 stack_map_stream_(graph->GetArena()) {} 365 // 为baseline编译准备的寄存器分配逻辑,1,将所有的blocked的core register/fpu register/register pair全部设为false; //2.将所有的fixed input,temp和output registers设为used,然后针对不同架构,将特殊寄存器设为blocked; //3.分配所有unallocated的input locations(依据不同的policy,分为kRequiresRegister||kRequiresFpuRegister以及kAny); //4.分配所有unallocated的temp locations(同样依据不同的policy,kRequiresRegister与kRequireFpuRegister, //一个分配kPrimInt类型的寄存器,一个分配kPrimDouble类型的寄存器); //5.分配所有unallocated的out locations,也是分policy,对于kAny/kRequiresRegister/kRequiresFpuRegister而言是依据类型不同分配寄存器, //而对kSameAsFirstInput而言,则是另result_location = locations->InAt(0),然后UpdateOut(result_location), //该函数只有两个可能:一个是parameters,在进行寄存器分配后我们只知道确切的stack slot,另一个是unallocated location。 366 void AllocateRegistersLocally(HInstruction* instruction) const; 367 368 // 分配一个寄存器的特定架构的实现。选择arm64.同样是为baseline准备的 369 virtual Location AllocateFreeRegister(Primitive::Type type) const = 0; 370 371 static size_t FindFreeEntry(bool* array, size_t length); 372 static size_t FindTwoFreeConsecutiveAlignedEntries(bool* array, size_t length); 373 374 virtual Location GetStackLocation(HLoadLocal* load) const = 0; 375 376 virtual HGraphVisitor* GetLocationBuilder() = 0; 377 virtual HGraphVisitor* GetInstructionVisitor() = 0; 378 379 // Returns the location of the first spilled entry for floating point registers, 380 // relative to the stack pointer. 381 uint32_t GetFpuSpillStart() const { 382 return GetFrameSize() - FrameEntrySpillSize(); 383 }

待续

转载请注明原文地址: https://www.6miu.com/read-32833.html

最新回复(0)