亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hipe_x86_ra_naive.erl

?? OTP是開放電信平臺的簡稱
?? ERL
字號:
%%% -*- erlang-indent-level: 4 -*-%%% $Id$%%% simple local x86 regalloc-ifdef(HIPE_AMD64).-define(HIPE_X86_RA_NAIVE, hipe_amd64_ra_naive).-define(HIPE_X86_REGISTERS, hipe_amd64_registers).-define(HIPE_X86_SPECIFIC_FP, hipe_amd64_specific_sse2).-define(ECX, rcx).-else.-define(HIPE_X86_RA_NAIVE, hipe_x86_ra_naive).-define(HIPE_X86_REGISTERS, hipe_x86_registers).-define(HIPE_X86_SPECIFIC_FP, hipe_x86_specific_x87).-define(ECX, ecx).-endif.-module(?HIPE_X86_RA_NAIVE).-export([ra/3]).-include("../x86/hipe_x86.hrl").-define(HIPE_INSTRUMENT_COMPILER, true). % enable instrumentation-include("../main/hipe.hrl").ra(X86Defun, Coloring_fp, Options) ->    #defun{code=Code0} = X86Defun,    Code1 = do_insns(Code0),    NofSpilledFloats = count_non_float_spills(Coloring_fp),    NofFloats = length(Coloring_fp),    ?add_spills(Options, hipe_gensym:get_var(x86) -		?HIPE_X86_REGISTERS:first_virtual()-		NofSpilledFloats -		NofFloats),    TempMap = [],    {X86Defun#defun{code=Code1,		    var_range={0, hipe_gensym:get_var(x86)}},     TempMap}.count_non_float_spills(Coloring_fp) ->    count_non_float_spills(Coloring_fp, 0).count_non_float_spills([{_,To}|Tail], Num) ->    case ?HIPE_X86_SPECIFIC_FP:is_precoloured(To) of	true ->	    count_non_float_spills(Tail, Num);	false ->	    count_non_float_spills(Tail, Num+1)    end;count_non_float_spills([], Num) ->    Num.do_insns([I|Insns]) ->    do_insn(I) ++ do_insns(Insns);do_insns([]) ->    [].do_insn(I) ->	% Insn -> Insn list    case I of	#alu{} ->	    do_alu(I);	#cmp{} ->	    do_cmp(I);	#imul{} ->	    do_imul(I);	#jmp_switch{} ->	    do_jmp_switch(I);	#lea{} ->	    do_lea(I);	#move{} ->	    do_move(I);	#move64{} ->	    do_move64(I); 	#movzx{} ->	    do_movx(I);	#movsx{} ->	    do_movx(I);	#fmove{} -> 	    do_fmove(I); 	#fp_unop{} -> 	    do_fp_unop(I); 	#fp_binop{} -> 	    do_fp_binop(I);	#shift{} ->	    do_shift(I);	#label{} ->	    [I];	#pseudo_jcc{} ->	    [I]; 	#pseudo_call{} ->	    [I];	#ret{} ->	    [I];	#pseudo_tailcall_prepare{} ->	    [I];	#pseudo_tailcall{} ->	    [I];	#push{} ->	    [I];	#jmp_label{} ->	    [I];	#comment{} ->	    [I];	_ ->	    io:format("Unknown Instruction = ~w\n", [I]),	    exit({?MODULE, unknown_instruction, I})    end.%%% Fix an alu op.do_alu(I) ->    #alu{src=Src0,dst=Dst0} = I,    {FixSrc,Src,FixDst,Dst} = do_binary(Src0, Dst0),    FixSrc ++ FixDst ++ [I#alu{src=Src,dst=Dst}].%%% Fix a cmp op.do_cmp(I) ->    #cmp{src=Src0,dst=Dst0} = I,    {FixSrc, Src, FixDst, Dst} = do_binary(Src0, Dst0),    FixSrc ++ FixDst ++ [I#cmp{src=Src,dst=Dst}].%%% Fix an imul op.do_imul(I) ->    #imul{imm_opt=ImmOpt,src=Src0,temp=Temp0} = I,    {FixSrc,Src} = fix_src_operand(Src0),	% may use temp0    {FixTempSrc,Temp,FixTempDst} =	case temp_is_pseudo(Temp0) of	    false ->		{[], Temp0, []};	    true ->		Reg = hipe_x86:mk_temp(?HIPE_X86_REGISTERS:temp1(), 'untagged'),		{case ImmOpt of		     [] -> [hipe_x86:mk_move(Temp0, Reg)];	% temp *= src		     _ -> []					% temp = src * imm		 end,		 Reg,		 [hipe_x86:mk_move(Reg, Temp0)]}	end,    FixSrc ++ FixTempSrc ++ [I#imul{src=Src,temp=Temp}] ++ FixTempDst.%%% Fix a jmp_switch op.-ifdef(HIPE_AMD64).do_jmp_switch(I) ->    #jmp_switch{temp=Temp, jtab=Tab} = I,    case temp_is_pseudo(Temp) of	false ->	    case temp_is_pseudo(Tab) of		false ->		    [I];		true ->		    Reg = hipe_x86:mk_temp(hipe_amd64_registers:temp0(),					   'untagged'),		    [hipe_x86:mk_move(Temp, Reg), I#jmp_switch{jtab=Reg}]	    end;	true ->	    Reg = hipe_x86:mk_temp(hipe_amd64_registers:temp1(),				   'untagged'),	    case temp_is_pseudo(Tab) of		false ->		    [hipe_x86:mk_move(Temp, Reg), I#jmp_switch{temp=Reg}];		true ->		    Reg2 = hipe_x86:mk_temp(hipe_amd64_registers:temp0(),					    'untagged'),		    [hipe_x86:mk_move(Temp, Reg),		     hipe_x86:mk_move(Tab, Reg2),		     I#jmp_switch{temp=Reg, jtab=Reg2}]	    end    end.-else.do_jmp_switch(I) ->    #jmp_switch{temp=Temp} = I,    case temp_is_pseudo(Temp) of	false ->	    [I];	true ->	    Reg = hipe_x86:mk_temp(?HIPE_X86_REGISTERS:temp0(), 'untagged'),	    [hipe_x86:mk_move(Temp, Reg), I#jmp_switch{temp=Reg}]    end.-endif.%%% Fix a lea op.do_lea(I) ->    #lea{temp=Temp} = I,    case temp_is_pseudo(Temp) of	false ->	    [I];	true ->	    Reg = hipe_x86:mk_temp(?HIPE_X86_REGISTERS:temp0(), 'untagged'),	    [I#lea{temp=Reg}, hipe_x86:mk_move(Reg, Temp)]    end.%%% Fix a move op.do_move(I) ->    #move{src=Src0,dst=Dst0} = I,    {FixSrc, Src, FixDst, Dst} = do_binary(Src0, Dst0),    FixSrc ++ FixDst ++ [I#move{src=Src,dst=Dst}].-ifdef(HIPE_AMD64).do_move64(I) ->    #move64{dst=Dst} = I,    case is_mem_opnd(Dst) of	false ->	    [I];	true ->     	    Reg = hipe_amd64_registers:temp1(),	    NewDst = clone(Dst, Reg),	    [I#move64{dst=NewDst}, hipe_x86:mk_move(NewDst, Dst)]    end.-else.do_move64(I) -> exit({?MODULE, I}).-endif.do_movx(I) ->    {FixSrc, Src} =	case I of	    #movsx{src=Src0,dst=Dst0} ->		fix_src_operand(Src0);	    #movzx{src=Src0,dst=Dst0} ->		fix_src_operand(Src0)	end,    {FixDst, Dst} = fix_dst_operand(Dst0),    Reg = ?HIPE_X86_REGISTERS:temp0(),    Dst2 = clone(Dst, Reg),    I2 =	case is_mem_opnd(Dst) of	    true ->		Reg = ?HIPE_X86_REGISTERS:temp0(),		Dst2 = clone(Dst, Reg),		case I of		    #movsx{} ->			[hipe_x86:mk_movsx(Src, Dst2), hipe_x86:mk_move(Dst2, Dst)];		    #movzx{} ->			[hipe_x86:mk_movzx(Src, Dst2), hipe_x86:mk_move(Dst2, Dst)]		end;	    false ->		case I of		    #movsx{} ->			[hipe_x86:mk_movsx(Src, Dst)];		    #movzx{} ->			[hipe_x86:mk_movzx(Src, Dst)]		end	end,    FixSrc ++ FixDst ++ I2.%%% Fix a fmove op.%% conv_to_floatdo_fmove(I=#fmove{src=#x86_temp{type=untagged},		  dst=#x86_temp{type=double}}) ->  #fmove{src=Src0,dst=Dst0} = I,  Src = clone(Src0, ?HIPE_X86_REGISTERS:temp0()),  Dst = clone(Dst0, ?HIPE_X86_REGISTERS:temp1()),  [hipe_x86:mk_move(Src0, Src),   I#fmove{src=Src, dst=Dst},   hipe_x86:mk_fmove(Dst, Dst0)];%% fmovedo_fmove(I) ->    #fmove{src=Src0,dst=Dst0} = I,    {FixSrc, Src, FixDst, Dst} = do_binary(Src0, Dst0),    FixSrc ++ FixDst ++ [I#fmove{src=Src,dst=Dst}].do_fp_unop(I) ->    #fp_unop{arg=Arg} = I,    case is_mem_opnd(Arg) of	false ->	    [I];	true ->	    Reg = ?HIPE_X86_REGISTERS:temp1(),	    NewArg = clone(Arg, Reg),	    [hipe_x86:mk_fmove(Arg, NewArg),	     I#fp_unop{arg=NewArg},	     hipe_x86:mk_fmove(NewArg, Arg)]    end.do_fp_binop(I) ->    #fp_binop{src=Src0, dst=Dst0} = I,    {FixSrc, Src} = fix_src_operand(Src0),    {FixDst, Dst} = fix_dst_operand(Dst0),    Reg = ?HIPE_X86_REGISTERS:temp1(),    Dst2 = clone(Dst, Reg),    FixSrc ++ FixDst ++ [hipe_x86:mk_fmove(Dst, Dst2),			 I#fp_binop{src=Src, dst=Dst2},			 hipe_x86:mk_fmove(Dst2, Dst)].do_shift(I) ->    #shift{src=Src0,dst=Dst0} = I,    {FixDst, Dst} = fix_dst_operand(Dst0),    Reg = ?HIPE_X86_REGISTERS:?ECX(),    case Src0 of	#x86_imm{} ->	    FixDst ++ [I#shift{dst=Dst}];	#x86_temp{reg=Reg}  ->	    FixDst ++ [I#shift{dst=Dst}]    end.%%% Fix the operands of a binary op.%%% 1. remove pseudos from any explicit memory operands%%% 2. if both operands are (implicit or explicit) memory operands,%%%    move src to a reg and use reg as src in the original insndo_binary(Src0, Dst0) ->    {FixSrc, Src} = fix_src_operand(Src0),    {FixDst, Dst} = fix_dst_operand(Dst0),    {FixSrc3, Src3} =	case is_mem_opnd(Src) of	    false ->		{FixSrc, Src};	    true ->		case is_mem_opnd(Dst) of		    false ->			{FixSrc, Src};		    true ->			Reg = ?HIPE_X86_REGISTERS:temp0(),			Src2 = clone(Src, Reg),			FixSrc2 = FixSrc ++ [mk_move(Src, Src2)],			{FixSrc2, Src2}		end	end,    {FixSrc3, Src3, FixDst, Dst}.%%% Fix any x86_mem operand to not refer to any pseudos.%%% The fixup may use additional instructions and registers.%%% 'src' operands may clobber '%temp0'.%%% 'dst' operands may clobber '%temp1'.fix_src_operand(Opnd) ->    fix_mem_operand(Opnd, ?HIPE_X86_REGISTERS:temp0()).fix_dst_operand(Opnd) ->    fix_mem_operand(Opnd, ?HIPE_X86_REGISTERS:temp1()).fix_mem_operand(Opnd, Reg) ->	% -> {[fixupcode], newop}    case Opnd of	#x86_mem{base=Base,off=Off} ->	    case is_mem_opnd(Base) of		false ->		    case src_is_pseudo(Off) of			false ->			    {[], Opnd};			true ->		% pseudo(reg)			    Temp = clone(Off, Reg),			    {[hipe_x86:mk_move(Off, Temp)],			     Opnd#x86_mem{off=Temp}}		    end;		true ->		    Temp = clone(Base, Reg),		    case src_is_pseudo(Off) of			false ->	% imm/reg(pseudo)			    {[hipe_x86:mk_move(Base, Temp)],			     Opnd#x86_mem{base=Temp}};			true ->		% pseudo1(pseudo0)			    {[hipe_x86:mk_move(Base, Temp),			      hipe_x86:mk_alu('add', Off, Temp)],			     Opnd#x86_mem{base=Temp, off=hipe_x86:mk_imm(0)}}		    end	    end;	_ ->	    {[], Opnd}    end.%%% Check if an operand denotes a memory cell (mem or pseudo).is_mem_opnd(Opnd) ->    case Opnd of	#x86_mem{} -> true;	#x86_temp{} -> temp_is_pseudo(Opnd);	_ -> false    end.%%% Check if an operand is a pseudo-Temp.src_is_pseudo(Src) ->    case hipe_x86:is_temp(Src) of	true -> temp_is_pseudo(Src);	false -> false    end.temp_is_pseudo(Temp) ->    not(?HIPE_X86_REGISTERS:is_precoloured(hipe_x86:temp_reg(Temp))).%%% Make Reg a clone of Dst (attach Dst's type to Reg).clone(Dst, Reg) ->    Type =	case Dst of	    #x86_mem{} -> hipe_x86:mem_type(Dst);	    #x86_temp{} -> hipe_x86:temp_type(Dst)	end,    hipe_x86:mk_temp(Reg, Type).mk_move(Src, Dst=#x86_temp{type=double}) ->    hipe_x86:mk_fmove(Src, Dst);mk_move(Src, Dst) ->    hipe_x86:mk_move(Src, Dst).  

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一级在线播放| 成人av网站免费观看| 欧美日韩国产经典色站一区二区三区| 亚洲国产精品av| 成人av电影免费在线播放| 国产精品福利一区| 日本福利一区二区| 亚洲国产日韩一区二区| 欧美肥妇毛茸茸| 久久99精品网久久| 国产日韩精品久久久| 99国产精品久| 亚洲午夜精品在线| 日韩欧美国产综合| 成人涩涩免费视频| 亚洲人快播电影网| 日韩一区二区免费在线电影| 国产在线视视频有精品| 国产精品卡一卡二| 欧美探花视频资源| 国产一区二区三区美女| 中文字幕一区二区三区四区| 欧美日韩国产高清一区二区| 国内精品免费在线观看| 亚洲三级理论片| 91精品久久久久久久91蜜桃| 国产suv一区二区三区88区| 亚洲免费看黄网站| 欧美成人艳星乳罩| av在线不卡网| 极品瑜伽女神91| 亚洲免费在线观看视频| 欧美大片国产精品| 99精品欧美一区二区三区小说| 亚洲成av人片一区二区| 国产欧美精品一区二区色综合| 在线看一区二区| 国产成人精品三级麻豆| 五月天婷婷综合| 国产精品福利一区二区三区| 日韩免费一区二区三区在线播放| 97se亚洲国产综合自在线| 毛片av中文字幕一区二区| 1024精品合集| 久久久久久日产精品| 欧美日韩日本视频| 91蝌蚪porny成人天涯| 九九九精品视频| 天使萌一区二区三区免费观看| 国产精品久久久久国产精品日日| 欧美一区二区三区白人| 91久久精品日日躁夜夜躁欧美| 国产精品18久久久久| 日本成人在线视频网站| 亚洲综合成人在线视频| 中文字幕一区二区视频| 国产日韩精品一区二区三区在线| 日韩欧美中文字幕一区| 欧美高清性hdvideosex| 91福利国产精品| 99久久免费视频.com| 国产69精品久久久久毛片| 精品一区二区三区免费视频| 日韩在线观看一区二区| 亚洲图片欧美一区| 亚洲一区二区成人在线观看| 亚洲四区在线观看| 国产精品短视频| 国产精品午夜久久| 国产欧美一二三区| 国产欧美日韩久久| 欧美经典三级视频一区二区三区| 久久青草欧美一区二区三区| 日韩写真欧美这视频| 日韩一区二区在线看片| 欧美日韩中文字幕一区二区| 欧美在线视频日韩| 欧美午夜寂寞影院| 欧美色网站导航| 欧美日韩国产综合久久| 欧美男同性恋视频网站| 91精品在线观看入口| 8v天堂国产在线一区二区| 欧美另类久久久品| 日韩一区二区免费视频| 欧美成人精品1314www| 日韩精品一区国产麻豆| 精品久久久网站| 久久久九九九九| 国产精品欧美久久久久一区二区| 国产精品乱人伦| 亚洲乱码精品一二三四区日韩在线| 亚洲欧美日韩在线不卡| 亚洲国产精品天堂| 免费成人在线影院| 国产麻豆精品在线| 99久久99久久久精品齐齐| 色偷偷一区二区三区| 欧美日韩在线三区| 日韩欧美国产一二三区| 国产日韩三级在线| 亚洲精品美腿丝袜| 日韩av一区二区三区四区| 韩国女主播成人在线观看| 成人一级黄色片| 精品视频在线视频| 欧美精品一区二区三区在线播放| 国产日韩欧美精品一区| 亚洲尤物视频在线| 精品一区二区三区视频在线观看| 成人综合激情网| 欧美精品乱码久久久久久按摩| 日韩免费观看高清完整版| 国产精品久久久久久妇女6080| 亚洲国产aⅴ天堂久久| 国产一区视频导航| 日本久久一区二区| 欧美va亚洲va| 亚洲美女偷拍久久| 另类人妖一区二区av| av色综合久久天堂av综合| 51精品国自产在线| 国产精品欧美综合在线| 日韩vs国产vs欧美| 99re亚洲国产精品| 欧美成人一区二区三区片免费 | 韩国成人福利片在线播放| 成人动漫视频在线| 欧美一级二级三级乱码| 中文字幕一区二区三区在线不卡 | av男人天堂一区| 日韩西西人体444www| 亚洲乱码国产乱码精品精98午夜| 蜜臀av在线播放一区二区三区| 99精品欧美一区二区三区小说| 日韩精品一区二区三区老鸭窝| 亚洲女厕所小便bbb| 国产呦萝稀缺另类资源| 欧美精品在线观看播放| 亚洲色图一区二区| 国产精品一区二区在线播放| 4438x亚洲最大成人网| 亚洲三级电影网站| 懂色中文一区二区在线播放| 日韩久久免费av| 午夜免费久久看| 在线看国产一区| 亚洲欧洲日韩av| 国产成人日日夜夜| 日韩免费高清视频| 蜜臀99久久精品久久久久久软件| 欧美亚洲动漫精品| 亚洲精品视频在线观看免费 | 不卡视频在线观看| 久久网站热最新地址| 蜜桃在线一区二区三区| 欧美精品aⅴ在线视频| 亚洲国产毛片aaaaa无费看| 91亚洲永久精品| 中文字幕字幕中文在线中不卡视频| 国产精品自拍在线| 久久久久久久网| 国产在线精品一区二区夜色| 精品三级av在线| 精品午夜久久福利影院| 欧美tickling网站挠脚心| 蜜桃视频在线观看一区二区| 91精品国产综合久久精品麻豆| 午夜精品影院在线观看| 欧美精品v国产精品v日韩精品| 一区二区三区四区高清精品免费观看| 成人免费视频免费观看| 国产精品午夜在线| 91麻豆免费看片| 亚洲精品菠萝久久久久久久| 色综合色综合色综合色综合色综合 | 欧美日韩激情在线| 日韩精品电影在线| 欧美一卡二卡在线观看| 久久99精品久久久久久| 欧美精品一区二区在线观看| 国产精品一区二区三区网站| 国产精品每日更新| 色先锋资源久久综合| 亚洲高清视频中文字幕| 日韩视频一区二区| 国产乱码精品一区二区三区av | 欧美一区二区三区在线看| 免费高清在线一区| 久久久综合精品| 9色porny自拍视频一区二区| 亚洲乱码国产乱码精品精小说| 欧美日韩高清一区二区| 蜜臀av国产精品久久久久| 久久久久国色av免费看影院| 99在线精品免费| 日日摸夜夜添夜夜添国产精品| 精品欧美一区二区在线观看| 成人高清视频免费观看| 亚洲国产精品久久人人爱|