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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? combine.c

?? 這是完整的gcc源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* Optimize by combining instructions for GNU compiler.   Copyright (C) 1987, 1988 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 1, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  *//* This module is essentially the "combiner" phase of the U. of Arizona   Portable Optimizer, but redone to work on our list-structured   representation for RTL instead of their string representation.   The LOG_LINKS of each insn identify the most recent assignment   to each REG used in the insn.  It is a list of previous insns,   each of which contains a SET for a REG that is used in this insn   and not used or set in between.  LOG_LINKs never cross basic blocks.   They were set up by the preceding pass (lifetime analysis).   We try to combine each pair of insns joined by a logical link.   We also try to combine triples of insns A, B and C when   C has a link back to B and B has a link back to A.   LOG_LINKS does not have links for use of the CC0.  They don't   need to, because the insn that sets the CC0 is always immediately   before the insn that tests it.  So we always regard a branch   insn as having a logical link to the preceding insn.   We check (with use_crosses_set_p) to avoid combining in such a way   as to move a computation to a place where its value would be different.   Combination is done by mathematically substituting the previous   insn(s) values for the regs they set into the expressions in   the later insns that refer to these regs.  If the result is a valid insn   for our target machine, according to the machine description,   we install it, delete the earlier insns, and update the data flow   information (LOG_LINKS and REG_NOTES) for what we did.   To simplify substitution, we combine only when the earlier insn(s)   consist of only a single assignment.  To simplify updating afterward,   we never combine when a subroutine call appears in the middle.   Since we do not represent assignments to CC0 explicitly except when that   is all an insn does, there is no LOG_LINKS entry in an insn that uses   the condition code for the insn that set the condition code.   Fortunately, these two insns must be consecutive.   Therefore, every JUMP_INSN is taken to have an implicit logical link   to the preceding insn.  This is not quite right, since non-jumps can   also use the condition code; but in practice such insns would not   combine anyway.  */#include <stdio.h>#include "config.h"#include "rtl.h"#include "flags.h"#include "regs.h"#include "basic-block.h"#include "insn-config.h"#include "recog.h"#define max(A,B) ((A) > (B) ? (A) : (B))#define min(A,B) ((A) < (B) ? (A) : (B))/* It is not safe to use ordinary gen_lowpart in combine.   Use gen_lowpart_for_combine instead.  See comments there.  */#define gen_lowpart dont_use_gen_lowpart_you_dummy/* Number of attempts to combine instructions in this function.  */static int combine_attempts;static int distrib_attempts;/* Number of attempts that got as far as substitution in this function.  */static int combine_merges;static int distrib_merges_1, distrib_merges_2;/* Number of instructions combined with added SETs in this function.  */static int combine_extras;/* Number of instructions combined in this function.  */static int combine_successes;static int distrib_successes;/* Totals over entire compilation.  */static int total_attempts, total_merges, total_extras, total_successes;static int total_distrib_attempts, total_distrib_merges_1, total_distrib_merges_2, total_distrib_successes;/* Vector mapping INSN_UIDs to cuids.   The cuids are like uids but increase monononically always.   Combine always uses cuids so that it can compare them.   But actually renumbering the uids, which we used to do,   proves to be a bad idea because it makes it hard to compare   the dumps produced by earlier passes with those from later passes.  */static int *uid_cuid;/* Get the cuid of an insn.  */#define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])/* Record last point of death of (hard or pseudo) register n.  */static rtx *reg_last_death;/* Record last point of modification of (hard or pseudo) register n.  */static rtx *reg_last_set;/* Record the cuid of the last insn that invalidated memory   (anything that writes memory, and subroutine calls).  */static int mem_last_set;/* Record the cuid of the last CALL_INSN   so we can tell whether a potential combination crosses any calls.  */static int last_call_cuid;/* When `subst' is called, this is the insn that is being modified   (by combining in a previous insn).  The PATTERN of this insn   is still the old pattern partially modified and it should not be   looked at, but this may be used to examine the successors of the insn   to judge whether a simplification is valid.  */static rtx subst_insn;/* Record one modification to rtl structure   to be undone by storing old_contents into *where.   is_int is 1 if the contents are an int.  */struct undo{  rtx *where;  rtx old_contents;  int is_int;};struct undo_int{  int *where;  int old_contents;  int is_int;};/* Record a bunch of changes to be undone, up to MAX_UNDO of them.   num_undo says how many are currently recorded.   storage is nonzero if we must undo the allocation of new storage.   The value of storage is what to pass to obfree.  */#define MAX_UNDO 10struct undobuf{  int num_undo;  char *storage;  struct undo undo[MAX_UNDO];};static struct undobuf undobuf;/* Number of times the pseudo being substituted for   was found and replaced.  */static int n_occurrences;static void move_deaths ();static void move_deaths_2 ();void remove_death ();static void record_dead_and_set_regs ();int regno_dead_p ();static int use_crosses_set_p ();static int try_combine ();static rtx try_distrib ();static rtx subst ();static void undo_all ();static void copy_substitutions ();static void add_links ();static void remove_links ();static void add_incs ();static int adjacent_insns_p ();static int check_asm_operands ();static rtx simplify_and_const_int ();static rtx gen_lowpart_for_combine ();static void simplify_set_cc0_and ();/* Main entry point for combiner.  F is the first insn of the function.   NREGS is the first unused pseudo-reg number.  */voidcombine_instructions (f, nregs)     rtx f;     int nregs;{  register rtx insn;  register int i;  register rtx links, nextlinks;  rtx prev;  combine_attempts = 0;  combine_merges = 0;  combine_extras = 0;  combine_successes = 0;  distrib_attempts = 0;  distrib_merges_1 = 0;  distrib_merges_2 = 0;  distrib_successes = 0;  reg_last_death = (rtx *) alloca (nregs * sizeof (rtx));  reg_last_set = (rtx *) alloca (nregs * sizeof (rtx));  bzero (reg_last_death, nregs * sizeof (rtx));  bzero (reg_last_set, nregs * sizeof (rtx));  init_recog ();  /* Compute maximum uid value so uid_cuid can be allocated.  */  for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))    if (INSN_UID (insn) > i)      i = INSN_UID (insn);  uid_cuid = (int *) alloca ((i + 1) * sizeof (int));  /* Compute the mapping from uids to cuids.     Cuids are numbers assigned to insns, like uids,     except that cuids increase monotonically through the code.  */  for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))    INSN_CUID (insn) = ++i;  /* Now scan all the insns in forward order.  */  last_call_cuid = 0;  mem_last_set = 0;  prev = 0;  for (insn = f; insn; insn = NEXT_INSN (insn))    {      if (GET_CODE (insn) == INSN	  || GET_CODE (insn) == CALL_INSN	  || GET_CODE (insn) == JUMP_INSN)	{	retry:	  /* Try this insn with each insn it links back to.  */	  for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))	    if (try_combine (insn, XEXP (links, 0), 0))	      goto retry;	  /* Try each sequence of three linked insns ending with this one.  */	  for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))	    if (GET_CODE (XEXP (links, 0)) != NOTE)	      for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks;		   nextlinks = XEXP (nextlinks, 1))		if (try_combine (insn, XEXP (links, 0), XEXP (nextlinks, 0)))		  goto retry;	  /* Try to combine a jump insn that uses CC0	     with a preceding insn that sets CC0, and maybe with its	     logical predecessor as well.	     This is how we make decrement-and-branch insns.	     We need this special code because data flow connections	     via CC0 do not get entered in LOG_LINKS.  */	  if (GET_CODE (insn) == JUMP_INSN	      && prev != 0	      && GET_CODE (prev) == INSN	      && GET_CODE (PATTERN (prev)) == SET	      && GET_CODE (SET_DEST (PATTERN (prev))) == CC0)	    {	      if (try_combine (insn, prev, 0))		goto retry;	      if (GET_CODE (prev) != NOTE)		for (nextlinks = LOG_LINKS (prev); nextlinks;		     nextlinks = XEXP (nextlinks, 1))		  if (try_combine (insn, prev, XEXP (nextlinks, 0)))		    goto retry;	    }	  /* Try to apply the distributive law to this insn	     and two insns that compute the operands of this one.  */	  for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))	    if (GET_CODE (XEXP (links, 0)) != NOTE)	      for (nextlinks = XEXP (links, 1); nextlinks; nextlinks = XEXP (nextlinks, 1))		if (GET_CODE (XEXP (nextlinks, 0)) != NOTE)		  {		    rtx try_from = 0;		    if (GET_CODE (PATTERN (XEXP (links, 0))) == SET			&& find_reg_note (insn, REG_DEAD, SET_DEST (PATTERN (XEXP (links, 0))))			&& GET_CODE (PATTERN (XEXP (nextlinks, 0))) == SET			&& find_reg_note (insn, REG_DEAD, SET_DEST (PATTERN (XEXP (nextlinks, 0)))))		      try_from = try_distrib (insn, XEXP (links, 0), XEXP (nextlinks, 0));		    if (try_from != 0)		      {			insn = try_from;			goto retry;		      }		  }#if 0/* Turned off because on 68020 it takes four insns to make   something like (a[b / 32] & (1 << (31 - (b % 32)))) != 0   that could actually be optimized, and that's an unlikely piece of code.  */	  /* If an insn gets or sets a bit field, try combining it	     with two different insns whose results it uses.  */	  if (GET_CODE (insn) == INSN	      && GET_CODE (PATTERN (insn)) == SET	      && (GET_CODE (SET_DEST (PATTERN (insn))) == ZERO_EXTRACT		  || GET_CODE (SET_DEST (PATTERN (insn))) == SIGN_EXTRACT		  || GET_CODE (SET_SRC (PATTERN (insn))) == ZERO_EXTRACT		  || GET_CODE (SET_SRC (PATTERN (insn))) == SIGN_EXTRACT))	    {	      for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))		if (GET_CODE (XEXP (links, 0)) != NOTE)		  for (nextlinks = XEXP (links, 1); nextlinks;		       nextlinks = XEXP (nextlinks, 1))		    if (try_combine (insn, XEXP (links, 0), XEXP (nextlinks, 0)))		      goto retry;	    }#endif	  if (GET_CODE (insn) != NOTE)	    record_dead_and_set_regs (insn);	  prev = insn;	}      else if (GET_CODE (insn) != NOTE)	prev = 0;    }  total_attempts += combine_attempts;  total_merges += combine_merges;  total_extras += combine_extras;  total_successes += combine_successes;}/* Try to combine the insns I1 and I2 into I3.   Here I1 appears earlier than I2, which is earlier than I3.   I1 can be zero; then we combine just I2 into I3.    Return 1 if successful; if that happens, I1 and I2 are pseudo-deleted   by turning them into NOTEs, and I3 is modified.   Return 0 if the combination does not work.  Then nothing is changed.  */static inttry_combine (i3, i2, i1)     register rtx i3, i2, i1;{  register rtx newpat;  int added_sets_1 = 0;  int added_sets_2 = 0;  int total_sets;  int i2_is_used;  register rtx link;  int insn_code_number;  rtx i2dest, i2src;  rtx i1dest, i1src;  int maxreg;  rtx temp;  int i;  combine_attempts++;  /* Don't combine with something already used up by combination.  */  if (GET_CODE (i2) == NOTE

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级欧美一级| 欧美日高清视频| 美女网站在线免费欧美精品| 亚洲一区二区三区在线看| 亚洲欧洲制服丝袜| 亚洲欧美国产毛片在线| 国产精品美女久久久久aⅴ | 国产精品原创巨作av| 美日韩一区二区| 国产一区在线精品| 成人丝袜高跟foot| 色噜噜狠狠色综合中国| 欧美视频第二页| 日韩三级精品电影久久久| 日韩美女主播在线视频一区二区三区| 91精品国产入口在线| 日韩午夜在线影院| 中文字幕久久午夜不卡| 亚洲啪啪综合av一区二区三区| 亚洲综合色丁香婷婷六月图片| 亚洲高清视频在线| 久久99久久久久| 国产老肥熟一区二区三区| 成人午夜免费av| 欧美午夜视频网站| 久久婷婷色综合| 一区二区三区波多野结衣在线观看 | 精品久久五月天| 国产欧美视频一区二区三区| 亚洲黄色免费网站| 美女脱光内衣内裤视频久久影院| 国产成人综合亚洲网站| 91国偷自产一区二区开放时间 | 亚洲视频在线一区| 日韩精品电影一区亚洲| 国产69精品久久99不卡| 欧美亚洲动漫另类| 久久精品亚洲国产奇米99| 一区二区三区不卡在线观看| 久色婷婷小香蕉久久| 99精品视频中文字幕| 欧美一三区三区四区免费在线看 | 一级女性全黄久久生活片免费| 青青草伊人久久| 97精品久久久午夜一区二区三区| 欧美一区二区三区四区高清| 中文字幕综合网| 黑人巨大精品欧美一区| 欧美三片在线视频观看| 国产清纯美女被跳蛋高潮一区二区久久w | 国产精品亚洲综合一区在线观看| 91美女视频网站| 久久久久久久久久久99999| 亚洲成人中文在线| 99久久婷婷国产| 国产婷婷色一区二区三区在线| 日韩av网站免费在线| 91极品美女在线| 亚洲免费高清视频在线| 福利一区福利二区| 久久这里都是精品| 免费在线成人网| 欧美伊人久久大香线蕉综合69| 亚洲欧美一区二区视频| 国产精品99久久久久久久女警| 777午夜精品免费视频| 亚洲精品欧美激情| 色综合一区二区三区| 欧美激情综合五月色丁香| 国产一二精品视频| 久久婷婷一区二区三区| 韩国女主播一区| 国产日韩精品一区二区三区| 国产综合成人久久大片91| 欧美xxxx老人做受| 国产精品一级在线| 国产精品每日更新| 91在线你懂得| 亚洲自拍偷拍av| 欧美视频中文字幕| 五月婷婷激情综合网| 欧美伦理电影网| 亚洲午夜久久久久久久久电影网 | 国产喂奶挤奶一区二区三区| 国产中文字幕精品| 久久精品一区二区三区四区 | 最好看的中文字幕久久| 91伊人久久大香线蕉| 亚洲精品免费电影| 欧美日韩国产在线观看| 日本欧美一区二区三区乱码| 欧美肥妇bbw| 国产一区二区调教| 国产精品久久网站| 欧美性猛交xxxxxxxx| 免费成人你懂的| 国产亚洲欧美在线| 日本精品视频一区二区三区| 午夜精品久久久久久久蜜桃app| 欧美日韩一区二区三区不卡| 日韩av电影免费观看高清完整版在线观看 | 欧美一级夜夜爽| 国产精品1区2区| 亚洲黄色小视频| 欧美tickle裸体挠脚心vk| 国产成人99久久亚洲综合精品| 一区二区三区国产豹纹内裤在线| 日韩一区二区不卡| 91浏览器入口在线观看| 九色综合狠狠综合久久| 欧美国产欧美综合| 51精品国自产在线| 不卡的电影网站| 天堂午夜影视日韩欧美一区二区| 久久久精品一品道一区| 欧洲一区二区三区在线| 国产成人综合在线| 美女视频黄频大全不卡视频在线播放 | 日本特黄久久久高潮| 国产女人水真多18毛片18精品视频| 一本一本久久a久久精品综合麻豆| 午夜国产精品一区| 最新久久zyz资源站| 日韩你懂的在线观看| 在线日韩一区二区| 成人妖精视频yjsp地址| 美女mm1313爽爽久久久蜜臀| 国产精品久久久久久久浪潮网站 | 337p日本欧洲亚洲大胆精品 | 日韩成人免费看| 亚洲私人黄色宅男| 欧美经典三级视频一区二区三区| 日韩欧美在线不卡| 欧美亚洲国产一区二区三区| jvid福利写真一区二区三区| 久久精品久久综合| 日韩电影免费在线观看网站| 一区二区三区欧美亚洲| 国产精品国产三级国产| 国产情人综合久久777777| 久久亚洲一区二区三区明星换脸 | 5858s免费视频成人| 99久久精品国产一区二区三区 | 日本一区二区三区视频视频| 日韩欧美精品三级| 日韩欧美亚洲国产精品字幕久久久 | 一本久道久久综合中文字幕| 国产一区不卡在线| 精品午夜久久福利影院| 美女在线一区二区| 久久国产乱子精品免费女| 日韩国产欧美在线视频| 天天操天天干天天综合网| 天天综合网 天天综合色| 亚洲国产美国国产综合一区二区| 一区二区三区四区乱视频| 综合激情成人伊人| 亚洲激情网站免费观看| 亚洲激情中文1区| 午夜日韩在线观看| 蜜臀av性久久久久av蜜臀妖精 | 国产精品免费看片| 欧美激情综合五月色丁香小说| 国产精品色哟哟网站| 国产精品乱人伦| 亚洲精品国久久99热| 亚洲一区在线观看免费| 日韩和欧美一区二区三区| 精品一区二区日韩| 成人av资源网站| 欧美中文字幕亚洲一区二区va在线| 欧美午夜一区二区三区| 精品日韩一区二区| 中文字幕亚洲在| 亚洲第一福利视频在线| 奇米影视一区二区三区小说| 国产乱码精品1区2区3区| 99久久精品国产一区二区三区| 欧美在线免费视屏| 精品99一区二区三区| 国产精品短视频| 奇米亚洲午夜久久精品| 国产成人av一区二区| 欧美伊人久久久久久久久影院| 精品乱人伦小说| 最新久久zyz资源站| 人人精品人人爱| 成人高清在线视频| 日韩午夜三级在线| 国产精品视频免费| 午夜在线成人av| 国产v日产∨综合v精品视频| 欧美亚洲一区二区在线观看| 精品国产制服丝袜高跟| 亚洲激情第一区| 国产一区二区三区免费在线观看| 色欧美片视频在线观看在线视频| 欧美一级片免费看| 国产精品高清亚洲| 国产综合色视频|