hipe_sparc_ra_post_ls.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 105 行

ERL
105
字号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Copyright (c) 2001 by Erik Johansson.  All Rights Reserved %% -*- erlang-indent-level: 2 -*-%% ====================================================================%%  Filename : 	hipe_sparc_ra_postconditions.erl%%  Module   :	hipe_sparc_ra_postconditions%%  Purpose  :  %%  Notes    : %%  History  :	* 2001-11-01 Erik Johansson (happi@csd.uu.se): %%               Created.%%  CVS      :%%              $Author: kostis $%%              $Date: 2005/11/06 13:10:52 $%%              $Revision: 1.9 $%% ====================================================================%%  Exports  :%%hipe:c({test13,test,0},[late_frames,{regalloc,lfls},pp_sparc]).%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-module(hipe_sparc_ra_post_ls).-export([rewrite/3]).-include("../main/hipe.hrl").-include("hipe_sparc.hrl").rewrite(Cfg, TempMap, _Options) ->  Sparc = hipe_sparc_cfg:linearize(Cfg),   NewCode = rewrite_instrs(hipe_sparc:sparc_code(Sparc), TempMap, []),  NewSparc = hipe_sparc:sparc_code_update(Sparc, NewCode),  NewSparc2 = hipe_sparc:sparc_var_range_update(NewSparc, {0,hipe_gensym:get_var(sparc)}),  NewCfg = hipe_sparc_cfg:init(NewSparc2),  NewCfg.rewrite_instrs([I|Is], TempMap, AccIs) ->  NewIs = rewrite_instrs(Is, TempMap, AccIs),  NewI = rewrite_instr(I, TempMap),  NewI ++ NewIs;rewrite_instrs([],_, Is) ->  Is.  rewrite_instr(I, TempMap) ->  case hipe_sparc:is_move(I) of    true -> [I];    false ->      Defs = hipe_sparc:keep_registers(hipe_sparc:defines(I)),      case all_spills(Defs, TempMap) of	[] ->	  rewrite_uses(I, TempMap);	[Spill] ->		  NewTemps = [{Spill,		       hipe_sparc:mk_reg(hipe_sparc_registers:temp1())}],	  NewI = 	    rewrite_uses(hipe_sparc:subst_defines(I, NewTemps),			 TempMap),	  NewI ++ [hipe_sparc:move_create(SpillR,NewTemp) ||		     {SpillR,NewTemp} <- NewTemps]      end  end.rewrite_uses(I, TempMap) ->  Uses = hipe_sparc:keep_registers(hipe_sparc:uses(I)),  case all_spills(Uses, TempMap) of    [] -> [I];    [Spill1,Spill2] ->            NewTemps  = [{Spill1,hipe_sparc:mk_reg(hipe_sparc_registers:temp1())},		   {Spill2,hipe_sparc:mk_reg(hipe_sparc_registers:temp2())}],      [hipe_sparc:move_create(NewTemp, Spill) ||	{Spill,NewTemp} <- NewTemps] ++ 	[remap(I, NewTemps)];    [Spill1] ->      NewTemps  = [{Spill1,hipe_sparc:mk_reg(hipe_sparc_registers:temp1())}],      [hipe_sparc:move_create(NewTemp, Spill) ||	{Spill,NewTemp} <- NewTemps] ++ 	[remap(I, NewTemps)];    _ ->      case I of	#store{} ->	  %% Store can have three spilled temporaries.	  Src = hipe_sparc:store_src(I),	  Dst = hipe_sparc:store_dest(I),	  Offs = hipe_sparc:store_off(I),	  Tmp1 = hipe_sparc:mk_reg(hipe_sparc_registers:temp1()),	  Tmp2 = hipe_sparc:mk_reg(hipe_sparc_registers:temp2()),	  [hipe_sparc:move_create(Tmp1, Dst),	   hipe_sparc:move_create(Tmp2, Offs),	   hipe_sparc:alu_create(Tmp1, Tmp1, '+', Tmp2),	   hipe_sparc:move_create(Tmp2, Src),	   remap(I, [{Dst, Tmp1}, {Offs, hipe_sparc:mk_imm(0)}, {Src, Tmp2}])];	_ -> 	  %% This must be a psudocall... not a problem?	  [I]      end  end.	   all_spills(Temps, TempMap) ->  [T || T <- Temps,	hipe_temp_map:is_spilled(hipe_sparc:reg_nr(T), TempMap)].remap(I, Substs) ->  hipe_sparc:subst(I, Substs).

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?