hipe_sparc_specific.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 172 行
ERL
172 行
%% -*- erlang-indent-level: 2 -*-%%======================================================================%% File : hipe_sparc_specific.erl%% Author : Ingemar 舃erg <d95ina@it.uu.se>%% Purpose : Provide target specific functions to the register allocator%% Created : 2 April 2000 by Ingemar 舃erg <d95ina@it.uu.se>%%======================================================================-module(hipe_sparc_specific).-export([number_of_temporaries/1]).%% The following exports are (also) used as M:F(...) calls from other%% modules; e.g. hipe_x86_ra_ls.-export([analyze/1, bb/2, args/1, labels/1, livein/2, liveout/2, succ_map/1, uses/1, defines/1, def_use/1, is_arg/1, %% used by hipe_ls_regalloc is_move/1, is_fixed/1, %% used by hipe_graph_coloring_regalloc is_global/1, is_precoloured/1, reg_nr/1, non_alloc/1, allocatable/0, physical_name/1, all_precoloured/0, new_spill_index/1, %% used by hipe_ls_regalloc var_range/1, breadthorder/1, preorder/1, postorder/1, inorder/1, reverse_inorder/1, predictionorder/1, reverse_postorder/1]).%% ---------------- Liveness stuff -------------------------------------analyze(CFG) -> hipe_sparc_liveness:analyze(CFG).liveout(BB_in_out_liveness,Label) -> hipe_sparc_liveness:liveout(BB_in_out_liveness,Label).livein(Liveness,L) -> hipe_sparc_liveness:livein(Liveness,L).%% ---------------- Registers stuff ------------------------------------allocatable() -> hipe_sparc_registers:allocatable().all_precoloured() -> hipe_sparc_registers:all_precoloured().is_precoloured(Reg) -> hipe_sparc_registers:is_precoloured(Reg).physical_name(Reg) -> hipe_sparc_registers:physical_name(Reg).is_global(R) -> not lists:member(R, hipe_sparc_registers:allocatable()).is_fixed(R) -> hipe_sparc_registers:is_fixed(R).all_args() -> [hipe_sparc_registers:arg(0), hipe_sparc_registers:arg(1), hipe_sparc_registers:arg(2), hipe_sparc_registers:arg(3), hipe_sparc_registers:arg(4), hipe_sparc_registers:arg(5)].is_arg(R) -> lists:member(R, all_args()).%% -------------- CFG stuff --------------------------------------------%% Return registers that are used to pass arguments to the CFG.args(CFG) -> Arity = arity(CFG), arg_vars(Arity).non_alloc(_CFG) -> [].arg_vars(N, Acc) when is_integer(N), N >= 0 -> arg_vars(N-1, [arg_var(N)|Acc]);arg_vars(-1, Acc) -> Acc.arg_vars(N) -> case N >= hipe_sparc_registers:register_args() of false -> arg_vars(N-1, []); true -> arg_vars(hipe_sparc_registers:register_args()-1, []) end.arg_var(X) -> hipe_sparc_registers:arg(X).arity(CFG) -> hipe_sparc_cfg:extra(CFG). labels(CFG) -> hipe_sparc_cfg:labels(CFG).reverse_postorder(CFG) -> hipe_sparc_cfg:reverse_postorder(CFG).breadthorder(CFG) -> hipe_sparc_cfg:breadthorder(CFG).postorder(CFG) -> hipe_sparc_cfg:postorder(CFG).predictionorder(CFG) -> hipe_sparc_cfg:predictionorder(CFG).inorder(CFG) -> hipe_sparc_cfg:inorder(CFG).reverse_inorder(CFG) -> hipe_sparc_cfg:reverse_inorder(CFG).preorder(CFG) -> hipe_sparc_cfg:preorder(CFG).var_range(_CFG) -> hipe_gensym:var_range(sparc).number_of_temporaries(_CFG) -> Highest_temporary = hipe_gensym:get_var(sparc), %% Since we can have temps from 0 to Max adjust by +1. %% (Well, on sparc this is not entirely true, but lets pretend...) Highest_temporary + 1.bb(CFG, L) -> hipe_sparc_cfg:bb(CFG, L).succ_map(CFG) -> hipe_sparc_cfg:succ_map(CFG).uses(I) -> hipe_sparc:keep_registers(hipe_sparc:uses(I)).defines(I) -> hipe_sparc:keep_registers(hipe_sparc:defines(I)).def_use(Instruction) -> {D, U} = hipe_sparc:def_use(Instruction), {hipe_sparc:keep_registers(D), hipe_sparc:keep_registers(U)}.is_move(Instruction) -> hipe_sparc:is_move(Instruction).reg_nr(Reg) -> hipe_sparc:reg_nr(Reg).new_spill_index(SpillIndex) when is_integer(SpillIndex) -> SpillIndex + 1.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?