CodeGenerator

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

待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值