hipe_sparc_ra_post_ls_fp.erl

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

ERL
87
字号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Copyright (c) 2001 by Erik Johansson.  All Rights Reserved %% -*- erlang-indent-level: 2 -*-%% ====================================================================%%  Filename : 	hipe_sparc_ra_post_ls_fp.erl%%  Module   :	hipe_sparc_ra_post_ls_fp%%  Purpose  :  %%  Notes    : %%  CVS      :%%              $Author: kostis $%%              $Date: 2004/02/04 00:57:35 $%%              $Revision: 1.4 $%% ====================================================================%%  Exports  :%%hipe:c({test13,test,0},[late_frames,{regalloc,lfls},pp_sparc]).%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-module(hipe_sparc_ra_post_ls_fp).-export([rewrite/3]).-include("../main/hipe.hrl").rewrite(Cfg, FpMap, _Options) ->  Sparc = hipe_sparc_cfg:linearize(Cfg),   NewCode = rewrite_instrs(hipe_sparc:sparc_code(Sparc), FpMap, []),    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], FpMap, AccIs) ->  NewIs = rewrite_instrs(Is, FpMap, AccIs),  NewI =rewrite_instr(I, FpMap),  NewI ++ NewIs;rewrite_instrs([],_, Is) ->  Is.  rewrite_instr(I, FpMap) ->  case hipe_sparc:is_fmove(I) of    true -> [I];    false ->      Defs = hipe_sparc:fp_reg_defines(I),      case all_spills(Defs, FpMap) of	[] ->	  rewrite_uses(I, FpMap);	[Spill] ->	  NewTemps = [{Spill,hipe_sparc:mk_fpreg(0)}],	  NewI = 	    rewrite_uses(hipe_sparc:subst_defines(I, NewTemps),			 FpMap),	  	  NewIs = NewI ++ [hipe_sparc:fmove_create(SpillR,NewTemp) ||		    {SpillR,NewTemp} <- NewTemps],	  NewIs      end  end.rewrite_uses(I, FpMap) ->  Uses = hipe_sparc:fp_reg_uses(I),  case all_spills(Uses, FpMap) of    [] -> [I];    [Spill1,Spill2] ->            NewTemps  = [{Spill1,hipe_sparc:mk_fpreg(0)},		   {Spill2,hipe_sparc:mk_fpreg(2)}],      [hipe_sparc:fmove_create(NewTemp, Spill) ||	{Spill,NewTemp} <- NewTemps] ++ 	[remap(I, NewTemps)];    [Spill1] ->      NewTemps  = [{Spill1,hipe_sparc:mk_fpreg(0)}],      [hipe_sparc:fmove_create(NewTemp, Spill) ||	{Spill,NewTemp} <- NewTemps] ++ 	[remap(I, NewTemps)];    _ -> %% This must be a pseudocall... not a problem?      [I]  end.	   all_spills(Temps, FpMap) ->  [T || T <- Temps,	hipe_temp_map:is_spilled(hipe_sparc:fpreg_nr(T), FpMap)].remap(I, Substs) ->  hipe_sparc:subst(I, Substs).

⌨️ 快捷键说明

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