CodeGenerator

来源:互联网 发布:android 网络配置文件 编辑:程序博客网 时间:2024/06/05 14:43

类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   }

待续

原创粉丝点击