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

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

?? loop.c

?? 這是完整的gcc源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
	{	  scan_start = loop_top;	  loop_top = 0;	}      else	/* We really do enter with a jump;	   scan the loop from the place where the jump jumps to.  */	scan_start = p;    }  /* Count number of times each reg is set during this loop.     Set may_not_optimize[I] if it is not safe to move out     the setting of register I.  */  bzero (n_times_set, nregs * sizeof (short));  bzero (may_not_optimize, nregs);  count_loop_regs_set (loop_top ? loop_top : loop_start, end,		       may_not_optimize, &insn_count, nregs);  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)    may_not_optimize[i] = 1, n_times_set[i] = 1;  bcopy (n_times_set, n_times_used, nregs * sizeof (short));  if (loop_dump_stream)    {      fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",	       INSN_UID (loop_start), INSN_UID (end), insn_count);      if (loop_continue)	fprintf (loop_dump_stream, "Continue at insn %d.\n",		 INSN_UID (loop_continue));    }  /* Scan through the loop finding insns that are safe to move.     In each such insn, store QImode as the mode, to mark it.     Then set n_times_set to -1 for the reg being set, so that     this reg will be considered invariant for subsequent insns.     We consider whether subsequent insns use the reg     in deciding whether it is worth actually moving.     MAYBE_NEVER is nonzero if we have passed a conditional jump insn     and therefore it is possible that the insns we are scanning     would never be executed.  At such times, we must make sure     that it is safe to execute the insn once instead of zero times.     When MAYBE_NEVER is 0, all insns will be executed at least once     so that is not a problem.  */  p = scan_start;  while (1)    {      p = NEXT_INSN (p);      /* At end of a straight-in loop, we are done.	 At end of a loop entered at the bottom, scan the top.  */      if (p == scan_start)	break;      if (p == end)	{	  if (loop_top != 0)	    p = NEXT_INSN (loop_top);	  else	    break;	  if (p == scan_start)	    break;	}      if (GET_CODE (p) == INSN	  && GET_CODE (PATTERN (p)) == SET	  && GET_CODE (SET_DEST (PATTERN (p))) == REG	  && ! may_not_optimize[REGNO (SET_DEST (PATTERN (p)))])	{	  int tem1 = 0;	  /* Don't try to optimize a register that was made	     by loop-optimization for an inner loop.	     We don't know its life-span, so we can't compute the benefit.  */	  if (REGNO (SET_DEST (PATTERN (p))) >= old_max_reg)	    ;	  /* IN order to move a register, we need to have one of three cases:	     (1) it is used only in the same basic block as the set	     (2) it is not a user variable.	     (3) the set is guaranteed to be executed once the loop starts,	         and the reg is not used until after that.  */	  else if (! ((! maybe_never		       && ! loop_reg_used_before_p (p, loop_start, scan_start, end))		      || ! REG_USERVAR_P (SET_DEST (PATTERN (p)))		      || reg_in_basic_block_p (p, SET_DEST (PATTERN (p)))))	    ;	  else if (((tem = invariant_p (SET_SRC (PATTERN (p))))		    || ((temp = loop_find_reg_equal (p)) 			&& (tem = invariant_p (XEXP (temp, 0)))))		   && (n_times_set[REGNO (SET_DEST (PATTERN (p)))] == 1		       || (tem1			   = consec_sets_invariant_p (SET_DEST (PATTERN (p)),						      n_times_set[REGNO (SET_DEST (PATTERN (p)))],						      p)))		   /* If the insn can cause a trap (such as divide by zero),		      can't move it unless it's guaranteed to be executed		      once loop is entered.  Even a function call might		      prevent the trap insn from being reached		      (since it might exit!)  */		   && ! ((maybe_never || call_passed)			 && (may_trap_p (SET_SRC (PATTERN (p)))			     || ((temp = loop_find_reg_equal (p))				 && may_trap_p (XEXP (temp, 0))))))	    {	      register struct movable *m;	      register int regno = REGNO (SET_DEST (PATTERN (p)));	      int count;	      m = (struct movable *) alloca (sizeof (struct movable));	      m->next = 0;	      m->insn = p;	      temp = loop_find_reg_equal (p);	      if (temp)		m->set_src = XEXP (temp, 0);	      else		m->set_src = SET_SRC (PATTERN (p));	      m->force = 0;	      m->consec = n_times_set[REGNO (SET_DEST (PATTERN (p)))] - 1;	      m->done = 0;	      m->forces = 0;	      m->partial = 0;	      m->savemode = VOIDmode;	      m->regno = regno;	      /* Set M->cond if either invariant_p or consec_sets_invariant_p		 returned 2 (only conditionally invariant).  */	      m->cond = ((tem | tem1) > 1);	      m->global = (uid_luid[regno_last_uid[regno]] > INSN_LUID (end)			   || uid_luid[regno_first_uid[regno]] < INSN_LUID (loop_start));	      m->match = 0;	      m->lifetime = (uid_luid[regno_last_uid[regno]]			     - uid_luid[regno_first_uid[regno]]);	      m->savings = n_times_used[regno];	      n_times_set[regno] = -1;	      /* Add M to the end of the chain MOVABLES.  */	      if (movables == 0)		movables = m;	      else		last_movable->next = m;	      last_movable = m;	      if (m->consec > 0)		{		  /* Skip this insn, not checking REG_LIBCALL notes.  */		  p = NEXT_INSN (p);		  /* Skip the consecutive insns, if there are any.  */		  p = skip_consec_insns (p, m->consec);		  /* Back up, so the main loop will advance to the right place.  */		  p = PREV_INSN (p);		}	    }	  /* If this register is always set within a STRICT_LOW_PART	     or set to zero, then its high bytes are constant.	     So clear them outside the loop and within the loop	     just load the low bytes.	     We must check that the machine has an instruction to do so.	     Also, if the value loaded into the register	     depends on the same register, this cannot be done.  */	  else if (SET_SRC (PATTERN (p)) == const0_rtx		   && GET_CODE (NEXT_INSN (p)) == INSN		   && GET_CODE (PATTERN (NEXT_INSN (p))) == SET		   && (GET_CODE (SET_DEST (PATTERN (NEXT_INSN (p))))		       == STRICT_LOW_PART)		   && (GET_CODE (XEXP (SET_DEST (PATTERN (NEXT_INSN (p))), 0))		       == SUBREG)		   && (SUBREG_REG (XEXP (SET_DEST (PATTERN (NEXT_INSN (p))), 0))		       == SET_DEST (PATTERN (p)))		   && !reg_mentioned_p (SET_DEST (PATTERN (p)),					SET_SRC (PATTERN (NEXT_INSN (p)))))	    {	      register int regno = REGNO (SET_DEST (PATTERN (p)));	      if (n_times_set[regno] == 2)		{		  register struct movable *m;		  int count;		  m = (struct movable *) alloca (sizeof (struct movable));		  m->next = 0;		  m->insn = p;		  m->force = 0;		  m->consec = 0;		  m->done = 0;		  m->forces = 0;		  m->partial = 1;		  /* If the insn may not be executed on some cycles,		     we can't clear the whole reg; clear just high part.		     Not even if the reg is used only within this loop.		     Consider this:		     while (1)		       while (s != t) {		         if (foo ()) x = *s;			 use (x);		       }		     Clearing x before the inner loop could clobber a value		     being saved from the last time around the outer loop.		     However, if the reg is not used outside this loop		     and all uses of the register are in the same		     basic block as the store, there is no problem.  */		  m->global = (uid_luid[regno_last_uid[regno]] > INSN_LUID (end)			       || uid_luid[regno_first_uid[regno]] < INSN_LUID (p)			       || (labels_in_range_p				   (p, uid_luid[regno_first_uid[regno]])));		  if (maybe_never && m->global)		    m->savemode = GET_MODE (SET_SRC (PATTERN (NEXT_INSN (p))));		  else		    m->savemode = VOIDmode;		  m->regno = regno;		  m->cond = 0;		  m->match = 0;		  m->lifetime = (uid_luid[regno_last_uid[regno]]				 - uid_luid[regno_first_uid[regno]]);		  m->savings = 1;		  n_times_set[regno] = -1;		  /* Add M to the end of the chain MOVABLES.  */		  if (movables == 0)		    movables = m;		  else		    last_movable->next = m;		  last_movable = m;		}	    }	}      /* Past a call insn, we get to insns which might not be executed	 because the call might exit.  This matters for insns that trap.  */      else if (GET_CODE (p) == CALL_INSN)	call_passed = 1;      /* Past a label or a jump, we get to insns for which we	 can't count on whether or how many times they will be	 executed during each iteration.  Therefore, we can	 only move out sets of trivial variables	 (those not used after the loop).  */      else if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)	       /* If we enter the loop in the middle, and scan around		  to the beginning, don't set maybe_never for that.  */               && ! (NEXT_INSN (p) == end && GET_CODE (p) == JUMP_INSN                     && simplejump_p (p)))	maybe_never = 1;    }  /* If one movable subsumes another, ignore that other.  */  ignore_some_movables (movables);  /* For each movable insn, see if the reg that it loads     leads when it dies right into another conditionally movable insn.     If so, record that the second insn "forces" the first one,     since the second can be moved only if the first is.  */  force_movables (movables);  /* See if there are multiple movable insns that load the same value.     If there are, make all but the first point at the first one     through the `match' field, and add the priorities of them     all together as the priority of the first.  */  combine_movables (movables, nregs);	  /* Now consider each movable insn to decide whether it is worth moving.     Store 0 in n_times_set for each reg that is moved.  */  move_movables (movables, threshold,		 insn_count, loop_start, end, nregs);  /* Now candidates that still have -1 are those not moved.     Change n_times_set to indicate that those are not actually invariant.  */  for (i = 0; i < nregs; i++)    if (n_times_set[i] < 0)      n_times_set[i] = n_times_used[i];  if (flag_strength_reduce)    strength_reduce (scan_start, end, loop_top,		     insn_count, loop_start, end, nregs);}/* Return 1 if all uses of REG   are between INSN and the end of the basic block.  */static int reg_in_basic_block_p (insn, reg)     rtx insn, reg;{  int regno = REGNO (reg);  rtx p;  if (regno_first_uid[regno] != INSN_UID (insn))    return 0;  /* Search this basic block for the already recorded last use of the reg.  */  for (p = insn; p; p = NEXT_INSN (p))    {      switch (GET_CODE (p))	{	case NOTE:	  break;	case INSN:	case CALL_INSN:	  /* Ordinary insn: if this is the last use, we win.  */	  if (regno_last_uid[regno] == INSN_UID (p))	    return 1;	  break;	case JUMP_INSN:	  /* Jump insn: if this is the last use, we win.  */	  if (regno_last_uid[regno] == INSN_UID (p))	    return 1;	  /* Otherwise, it's the end of the basic block, so we lose.  */	  return 0;	case CODE_LABEL:	case BARRIER:	  /* It's the end of the basic block, so we lose.  */	  return 0;	}    }  /* The "last use" doesn't follow the "first use"??  */  abort ();}/* Skip COUNT insns from INSN, counting library calls as 1 insn.  */static rtxskip_consec_insns (insn, count)     rtx insn;     int count;{  for (; count > 0; count--)    {      if (GET_CODE (insn) == NOTE)	insn = NEXT_INSN (insn);      else if (GET_CODE (insn) == BARRIER || GET_CODE (insn) == CODE_LABEL)	abort ();      else	{	  rtx i1, temp;	  /* If first insn of gnulib call sequence, skip to end.  */	  /* Do this at start of loop, since INSN is guaranteed to 	     be an insn here.  */	  if (temp = find_reg_note (insn, REG_LIBCALL, 0))	    insn = XEXP (temp, 0);	  do insn = NEXT_INSN (insn);	  while (GET_CODE (insn) == NOTE);	}    }  return insn;}/* Find a REG_EQUAL note in INSN but only if it is safe to use for our   purposes.  Those put in by CSE are not safe since they may fail to   use the registers that appear in the actual insn source.  */static rtxloop_find_reg_equal (insn)     rtx insn;{  return (find_reg_note (insn, REG_RETVAL, 0)	  ? find_reg_note (insn, REG_EQUAL, 0)	  : 0);}/* Ignore any movable whose insn falls within a libcall   which is part of another movable.   We make use of the fact that the movable for the libcall value   was made later and so appears later on the chain.  */static voidignore_some_movables (movables)     struct movable *movables;{  register struct movable *m, *m1;  for (m = movables; m; m = m->next)    {      /* Is this a movable for the value of a libcall?  */      rtx note = find_reg_note (m->insn, REG_RETVAL, 0);      if (note)	{	  /* Find the beginning of that libcall.  */	  rtx first_insn = XEXP (note, 0);	  /* Check for earlier movables inside that range,	     and mark them invalid.  */	  for (m1 = movables; m1 != m; m1 = m1->next)	    if (INSN_LUID (m1->insn) >= INSN_LUID (first_insn)		&& INSN_LUID (m1->insn) < INSN_LUID (m->insn))	      m1->done = 1;	}    }}	  /* For each movable insn, see if the reg that it loads   leads when it dies right into another conditionally movable insn.   If so, record that the second insn "forces" the first one,   since the second can be moved only if the first is.  */static voidforce_movables (movables)     struct movable *movables;{  register struct movable *m, *m1;  for (m1 = movables; m1; m1 = m1->next)    /* Omit this if moving just the (SET (REG) 0) of a zero-extend.  */    if (!m1->partial && !m1->done)      {	int regno = m1->regno;	for (m = m1->next; m; m = m->next)	  /* ??? Could this be a bug?  What if CSE caused the	     register of M1 to be used after this insn?	     Since CSE does not update regno_last_uid,	     this insn M->insn might not be where it dies.	     But very likely this doesn't matter; what matters is	     that M's reg is computed from M1's reg.  */	  if (INSN_UID (m->insn) == regno_last_uid[regno]	      && !m->done)	    break;	if (m != 0 && m->set_src == SET_DEST (PATTERN (m1->insn)))	  m = 0;	/* Increase the priority of the moving the first insn	   since it permits the second to be moved as well.  */	if (m != 0)	  {	    m->forces = m1;	    m1->lifetime += m->lifetime;	    m1->savings += m1->savings;	  }      }}/* Find invariant expressions that are equal and can be combined into   one register.  */static voidcombine_movables (movables, nregs)     struct movable *movables;     int nregs;{  register struct movable *m;  char *matched_regs = (char *) alloca (nregs);  enum machine_mode mode;  /* Regs that are set more than once are not allowed to match     or be matched.  I'm no longer sure why not.  */  /* Perhaps testing m->consec_sets would be more appropriate here?  */  for (m = movables; m; m = m->next)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜嗨av一区二区三区四季av| 不卡在线视频中文字幕| 久久69国产一区二区蜜臀 | 久久综合色鬼综合色| 中文字幕国产一区| 日本aⅴ免费视频一区二区三区| 福利一区二区在线| 国产精品456露脸| 一区二区三区四区亚洲| 一本大道综合伊人精品热热 | 蜜臀av性久久久久蜜臀av麻豆| 欧美自拍偷拍一区| 国产精品国产馆在线真实露脸| 国产自产v一区二区三区c| 337p粉嫩大胆噜噜噜噜噜91av| 91社区在线播放| 亚洲成a天堂v人片| 欧美三级乱人伦电影| www.视频一区| 久久成人av少妇免费| 蜜桃av噜噜一区| 麻豆91精品视频| 亚洲成av人影院| 日本一区二区高清| 日韩欧美色综合| 99视频精品全部免费在线| 性久久久久久久久| 亚洲欧洲日韩在线| 欧美一级黄色大片| 日韩你懂的电影在线观看| 欧美在线免费观看视频| 99re免费视频精品全部| 洋洋成人永久网站入口| 久久综合久久综合九色| 91精品国产综合久久久蜜臀粉嫩 | 美女一区二区久久| 色94色欧美sute亚洲13| 国产欧美日韩麻豆91| 精品无码三级在线观看视频 | 丁香婷婷综合网| 久久久久久综合| 捆绑调教美女网站视频一区| 91精品麻豆日日躁夜夜躁| 亚洲高清免费在线| 欧美高清一级片在线| 五月综合激情日本mⅴ| 欧美男人的天堂一二区| 天天综合天天做天天综合| 欧美日韩成人激情| 午夜精品久久久久久久99水蜜桃| 欧洲视频一区二区| 性久久久久久久久久久久| 在线综合+亚洲+欧美中文字幕| 日本不卡一区二区| 精品国产污污免费网站入口 | 亚洲成人激情av| 欧美在线视频全部完| 日韩黄色免费电影| 欧美精品一区二区三区视频| 国产sm精品调教视频网站| 亚洲人成7777| 日韩一区二区免费视频| 国产成人免费9x9x人网站视频| 最新欧美精品一区二区三区| 欧美日韩日日骚| 黄色资源网久久资源365| 国产精品福利一区二区三区| 欧美三级日韩在线| 国产呦萝稀缺另类资源| 亚洲美女免费视频| 欧美va亚洲va在线观看蝴蝶网| 成人免费va视频| 日韩av高清在线观看| 中文字幕免费在线观看视频一区| 欧美又粗又大又爽| 国产精品亚洲一区二区三区妖精 | 色www精品视频在线观看| 偷拍日韩校园综合在线| 久久嫩草精品久久久精品一| 91首页免费视频| 九九视频精品免费| 亚洲一区二区av在线| 国产日韩欧美a| 欧美高清视频一二三区| 国产成人综合在线观看| 亚洲成人av一区二区| 中文字幕不卡在线观看| 91精品国产欧美日韩| 91老师国产黑色丝袜在线| 精品中文字幕一区二区| 亚洲电影一级片| 国产精品久久久久久久蜜臀| 91精品国模一区二区三区| 色综合久久综合| 国产精品一区二区黑丝| 日欧美一区二区| 亚洲嫩草精品久久| 欧美国产精品专区| 在线电影一区二区三区| 91精品国产综合久久蜜臀 | 91精品午夜视频| 高清不卡一区二区在线| 久久精品久久综合| 五月天激情综合| 亚洲综合成人网| 亚洲人xxxx| 亚洲欧美经典视频| 亚洲色图20p| 国产精品福利一区| 久久免费电影网| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲精品综合在线| 日韩激情在线观看| 精品一区二区综合| 亚洲不卡一区二区三区| 2021中文字幕一区亚洲| 在线免费一区三区| 亚洲综合自拍偷拍| 亚洲同性同志一二三专区| 欧美偷拍一区二区| 国产一区二区电影| 欧美一区二区三区四区久久| 国产一二精品视频| 国产一区二区福利| 国产a精品视频| 丁香婷婷综合五月| 99久久婷婷国产综合精品电影| 岛国av在线一区| aa级大片欧美| 在线观看一区不卡| 91精品国产综合久久福利软件 | 一区二区三区日韩欧美| 1024国产精品| 亚洲综合色噜噜狠狠| 2020国产成人综合网| 中文字幕一区二区三区精华液| 亚洲人成影院在线观看| 日韩欧美电影一区| 欧美mv日韩mv亚洲| 在线综合亚洲欧美在线视频| 色八戒一区二区三区| 欧美日韩一区三区四区| 精品久久久网站| 国产欧美一区二区精品久导航 | 国产乱妇无码大片在线观看| 久久精品99国产国产精| 激情综合五月天| 成人夜色视频网站在线观看| 色综合久久久网| 51精品视频一区二区三区| 久久午夜电影网| 亚洲精品伦理在线| 免费日本视频一区| 成人激情综合网站| 欧美精品日日鲁夜夜添| 国产午夜一区二区三区| 亚洲综合视频在线观看| 久久99精品久久久久婷婷| 99久久精品国产一区| 欧美一区二区三区四区在线观看 | 日韩三区在线观看| 中文字幕在线不卡国产视频| 三级欧美韩日大片在线看| 国产凹凸在线观看一区二区| 欧美片网站yy| 中文字幕日韩精品一区| 久久99久久久欧美国产| 色综合天天狠狠| 久久综合九色综合欧美就去吻| 亚洲五码中文字幕| 成人禁用看黄a在线| 欧美刺激午夜性久久久久久久| 亚洲精品国产无套在线观| 国产精品18久久久久久久久久久久| 欧美性一二三区| 1024成人网| 成人av电影在线观看| 欧美精品一区二区三区很污很色的 | 久久精品一区二区三区不卡牛牛| 香蕉久久夜色精品国产使用方法| 成人高清免费观看| 2021中文字幕一区亚洲| 免费在线视频一区| 欧美日韩国产区一| 一区二区三区精密机械公司| 成人免费观看视频| 中文字幕二三区不卡| 国产在线精品一区二区夜色| 在线播放中文一区| 亚洲国产视频一区二区| 91一区二区三区在线播放| 国产日本欧美一区二区| 国产一区二区三区在线看麻豆| 日韩三级电影网址| 日本欧美加勒比视频| 欧美美女一区二区在线观看| 亚洲国产精品视频| 欧美日韩成人综合天天影院| 亚洲二区在线观看| 欧美裸体一区二区三区|