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

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

?? genrecog.c

?? 這是完整的gcc源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Generate code from machine description to emit insns as rtl.   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 program is used to produce insn-recog.c, which contains   a function called `recog' plus its subroutines.   These functions contain a decision tree   that recognizes whether an rtx, the argument given to recog,   is a valid instruction.   recog returns -1 if the rtx is not valid.   If the rtx is valid, recog returns a nonnegative number   which is the insn code number for the pattern that matched.   This is the same as the order in the machine description of the   entry that matched.  This number can be used as an index into   insn_templates and insn_n_operands (found in insn-output.c)   or as an argument to output_insn_hairy (also in insn-output.c).  */#include <stdio.h>#include "config.h"#include "rtl.h"#include "obstack.h"struct obstack obstack;struct obstack *rtl_obstack = &obstack;#define obstack_chunk_alloc xmalloc#define obstack_chunk_free freeextern int xmalloc ();extern void free ();/* Data structure for decision tree for recognizing   legitimate instructions.  */struct decision{  int number;  char *position;  RTX_CODE code;  char *exact;  enum machine_mode mode;  char *tests;  int insn_code_number;  struct decision *next;  struct decision *success;  int opno;  int dupno;  int dupcount;  int test_elt_zero_int;  int elt_zero_int;  int test_elt_one_int;  int elt_one_int;  int ignmode;  struct decision *afterward;  int label_needed;  char *c_test;  char *reg_class;  char enforce_mode;  int veclen;  int subroutine_number;};#define SUBROUTINE_THRESHOLD 50int next_subroutine_number;/*recognize (top){ staten:  x = XVECEXP (top, 0, 3);  if (test_code (GET_CODE (x))      && test_mode (MODE (x))      && whatever_else)    goto statep;  else if (next one...)    goto statem:  goto stater; statep:  actions...;  return 1; statem:  x = stack[depth--];  more tests...; stateq:  stack[++depth] = x;  x = XEXP (stack[depth], 0);  more tests...; stater:  x = XEXP (stack[depth], 1);}*/int next_number;int next_insn_code;/* Number of MATCH_DUP's seen so far in this instruction.  */int dupcount;struct decision *add_to_sequence ();struct decision *try_merge_2 ();void write_subroutine ();void print_code ();void clear_codes ();void clear_modes ();void change_state ();void write_tree ();char *copystr ();char *concat ();void fatal ();void fancy_abort ();void mybzero ();struct decision *first;/* Construct and return a sequence of decisions   that will recognize INSN.  */struct decision *make_insn_sequence (insn)     rtx insn;{  rtx x;  char *c_test = XSTR (insn, 2);  struct decision *last;  dupcount = 0;  if (XVECLEN (insn, 1) == 1)    x = XVECEXP (insn, 1, 0);  else    {      x = rtx_alloc (PARALLEL);      XVEC (x, 0) = XVEC (insn, 1);      PUT_MODE (x, VOIDmode);    }  last = add_to_sequence (x, 0, "");  if (c_test[0])    last->c_test = c_test;  last->insn_code_number = next_insn_code++;  return first;}struct decision *add_to_sequence (pattern, last, position)     rtx pattern;     struct decision *last;     char *position;{  register RTX_CODE code;  register struct decision *new    = (struct decision *) xmalloc (sizeof (struct decision));  struct decision *this;  char *newpos;  register char *fmt;  register int i;  int depth;  int len;  new->number = next_number++;  new->position = copystr (position);  new->exact = 0;  new->next = 0;  new->success = 0;  new->insn_code_number = -1;  new->tests = 0;  new->opno = -1;  new->dupno = -1;  new->dupcount = -1;  new->test_elt_zero_int = 0;  new->test_elt_one_int = 0;  new->elt_zero_int = 0;  new->elt_one_int = 0;  new->enforce_mode = 0;  new->ignmode = 0;  new->afterward = 0;  new->label_needed = 0;  new->c_test = 0;  new->reg_class = 0;  new->veclen = 0;  new->subroutine_number = 0;  this = new;  if (last == 0)    first = new;  else    last->success = new;  depth = strlen (position);  newpos = (char *) alloca (depth + 2);  strcpy (newpos, position);  newpos[depth + 1] = 0; restart:  if (pattern == 0)    {      new->exact = "0";      new->code = UNKNOWN;      new->mode = VOIDmode;      return new;    }  switch (GET_MODE (pattern))    {    case 0:      new->mode = VOIDmode;      break;    default:      new->mode = GET_MODE (pattern);      break;    }  new->code = code = GET_CODE (pattern);  switch (code)    {    case MATCH_OPERAND:      new->opno = XINT (pattern, 0);      new->code = UNKNOWN;      new->tests = XSTR (pattern, 1);      if (*new->tests == 0)	new->tests = 0;      new->reg_class = XSTR (pattern, 2);      if (*new->reg_class == 0)	new->reg_class = 0;      return new;    case MATCH_OPERATOR:      new->opno = XINT (pattern, 0);      new->code = UNKNOWN;      new->tests = XSTR (pattern, 1);      if (*new->tests == 0)	new->tests = 0;      for (i = 0; i < XVECLEN (pattern, 2); i++)	{	  newpos[depth] = i + '0';	  new = add_to_sequence (XVECEXP (pattern, 2, i), new, newpos);	}      this->success->enforce_mode = 0;      return new;    case MATCH_DUP:      new->dupno = XINT (pattern, 0);      new->dupcount = dupcount++;      new->code = UNKNOWN;      return new;    case ADDRESS:      pattern = XEXP (pattern, 0);      goto restart;    case PC:      new->exact = "pc_rtx";      return new;    case CC0:      new->exact = "cc0_rtx";      return new;    case CONST_INT:      if (INTVAL (pattern) == 0)	{	  new->exact = "const0_rtx";	  return new;	}      if (INTVAL (pattern) == 1)	{	  new->exact = "const1_rtx";	  return new;	}      break;    case SET:      newpos[depth] = '0';      new = add_to_sequence (SET_DEST (pattern), new, newpos);      this->success->enforce_mode = 1;      newpos[depth] = '1';      new = add_to_sequence (SET_SRC (pattern), new, newpos);      return new;    case STRICT_LOW_PART:      newpos[depth] = '0';      new = add_to_sequence (XEXP (pattern, 0), new, newpos);      this->success->enforce_mode = 1;      return new;    case SUBREG:      this->test_elt_one_int = 1;      this->elt_one_int = XINT (pattern, 1);      newpos[depth] = '0';      new = add_to_sequence (XEXP (pattern, 0), new, newpos);      this->success->enforce_mode = 1;      return new;    case ZERO_EXTRACT:    case SIGN_EXTRACT:      newpos[depth] = '0';      new = add_to_sequence (XEXP (pattern, 0), new, newpos);      this->success->enforce_mode = 1;      newpos[depth] = '1';      new = add_to_sequence (XEXP (pattern, 1), new, newpos);      newpos[depth] = '2';      new = add_to_sequence (XEXP (pattern, 2), new, newpos);      return new;    }  fmt = GET_RTX_FORMAT (code);  len = GET_RTX_LENGTH (code);  for (i = 0; i < len; i++)    {      newpos[depth] = '0' + i;      if (fmt[i] == 'e' || fmt[i] == 'u')	new = add_to_sequence (XEXP (pattern, i), new, newpos);      else if (fmt[i] == 'i' && i == 0)	{	  this->test_elt_zero_int = 1;	  this->elt_zero_int = XINT (pattern, i);	}      else if (fmt[i] == 'i' && i == 1)	{	  this->test_elt_one_int = 1;	  this->elt_one_int = XINT (pattern, i);	}      else if (fmt[i] == 'E')	{	  register int j;	  /* We do not handle a vector appearing as other than	     the first item, just because nothing uses them	     and by handling only the special case	     we can use one element in newpos for either	     the item number of a subexpression	     or the element number in a vector.  */	  if (i != 0)	    abort ();	  this->veclen = XVECLEN (pattern, i);	  for (j = 0; j < XVECLEN (pattern, i); j++)	    {	      newpos[depth] = 'a' + j;	      new = add_to_sequence (XVECEXP (pattern, i, j),				     new, newpos);	    }	}      else if (fmt[i] != '0')	abort ();    }  return new;}/* Merge two decision trees OLD and ADD,   modifying OLD destructively,   and return the merged tree.  */struct decision *merge_trees (old, add)     register struct decision *old, *add;{  while (add)    {      register struct decision *next = add->next;      add->next = 0;      if (!try_merge_1 (old, add))	old = try_merge_2 (old, add);      add = next;    }  return old;}/* Merge ADD into the next-chain starting with OLD   only if it overlaps a condition already tested in OLD.   Returns 1 if successful (OLD is modified),   0 if nothing has been done.  */inttry_merge_1 (old, add)     register struct decision *old, *add;{  while (old)    {      if ((old->position == add->position	   || (old->position && add->position	       && !strcmp (old->position, add->position)))	  && (old->tests == add->tests	      || (old->tests && add->tests && !strcmp (old->tests, add->tests)))	  && (old->c_test == add->c_test	      || (old->c_test && add->c_test && !strcmp (old->c_test, add->c_test)))	  && old->test_elt_zero_int == add->test_elt_zero_int	  && old->elt_zero_int == add->elt_zero_int	  && old->test_elt_one_int == add->test_elt_one_int	  && old->elt_one_int == add->elt_one_int	  && old->veclen == add->veclen	  && old->dupno == add->dupno	  && old->opno == add->opno	  && (old->tests == 0	      || (add->enforce_mode ? no_same_mode (old) : old->next == 0))	  && old->code == add->code	  && old->mode == add->mode)	{	  old->success = merge_trees (old->success, add->success);	  if (old->insn_code_number >= 0 && add->insn_code_number >= 0)	    fatal ("Two actions at one point in tree.");	  if (old->insn_code_number == -1)	    old->insn_code_number = add->insn_code_number;	  return 1;	}      old = old->next;    }  return 0;}/* Merge ADD into the next-chain that starts with OLD,   preferably after something that tests the same place   that ADD does.   The next-chain of ADD itself is ignored, and it is set   up for entering ADD into the new chain.   Returns the new chain.  */struct decision *try_merge_2 (old, add)     struct decision *old, *add;{  register struct decision *p;  struct decision *last = 0;  struct decision *last_same_place = 0;  /* Put this in after the others that test the same place,     if there are any.  If not, find the last chain element     and insert there.     One modification: if this one is NOT a MATCH_OPERAND,     put it before any MATCH_OPERANDS that test the same place.     Another: if enforce_mode (i.e. this is first operand of a SET),     put this after the last thing that tests the same place for     the same mode.  */  int operand = 0 != add->tests;  for (p = old; p; p = p->next)    {      if (p->position == add->position	  || (p->position && add->position	      && !strcmp (p->position, add->position)))	{	  last_same_place = p;	  /* If enforce_mode, segregate the modes in numerical order.  */	  if (p->enforce_mode && (int) add->mode < (int) p->mode)	    break;#if 0	  /* Keep explicit decompositions before those that test predicates.	     If enforce_mode, do this separately within each mode.  */	  if (! p->enforce_mode || p->mode == add->mode)	    if (!operand && p->tests)	      break;#endif	}      /* If this is past the end of the decisions at the same place as ADD,	 stop looking now; add ADD before here.  */      else if (last_same_place)	break;      last = p;    }  /* Insert before P, which means after LAST.  */  if (last)    {      add->next = last->next;      last->next = add;      return old;    }  add->next = old;  return add;}intno_same_mode (node)     struct decision *node;{  register struct decision *p;  register enum machine_mode mode = node->mode;  for (p = node->next; p; p = p->next)    if (p->mode == mode)      return 0;  return 1;}/* Count the number of subnodes of node NODE, assumed to be the start   of a next-chain.  If the number is high enough, make NODE start   a separate subroutine in the C code that is generated.  */intbreak_out_subroutines (node)     struct decision *node;{  int size = 0;  struct decision *sub;  for (sub = node; sub; sub = sub->next)    size += 1 + break_out_subroutines (sub->success);  if (size > SUBROUTINE_THRESHOLD)    {      node->subroutine_number = ++next_subroutine_number;      write_subroutine (node);      size = 1;    }  return size;}voidwrite_subroutine (tree)     struct decision *tree;{  printf ("int\nrecog_%d (x0, insn)\n     register rtx x0;\n     rtx insn;\n{\n",	  tree->subroutine_number);  printf ("  register rtx x1, x2, x3, x4, x5;\n  rtx x6, x7, x8, x9, x10, x11;\n");  printf ("  int tem;\n");  write_tree (tree, "", 0, "", 1);  printf (" ret0: return -1;\n}\n\n");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美卡1卡2卡| 成人精品国产一区二区4080| 在线视频你懂得一区二区三区| 亚洲国产精品成人久久综合一区| 成人18视频在线播放| 亚洲国产精品成人久久综合一区| 97精品久久久久中文字幕| 亚洲人成7777| 欧美日韩亚洲综合一区| 蜜桃精品在线观看| 国产午夜精品久久久久久免费视 | 精品久久国产97色综合| 精品亚洲国产成人av制服丝袜| 精品国产青草久久久久福利| 国产91色综合久久免费分享| 国产精品国产精品国产专区不片| 色综合天天综合网天天看片 | 婷婷成人激情在线网| 日韩一区二区在线看| 国产一区在线不卡| 亚洲欧美日韩一区二区三区在线观看| 色噜噜夜夜夜综合网| 午夜精品久久久| 26uuu色噜噜精品一区二区| 99国产麻豆精品| 偷偷要91色婷婷| 国产亚洲成年网址在线观看| 在线精品国精品国产尤物884a| 日韩精品五月天| 国产精品美女久久久久久久久久久| 欧美最猛性xxxxx直播| 蜜乳av一区二区| 亚洲免费av高清| 欧美精品一区二区高清在线观看| 99麻豆久久久国产精品免费优播| 亚洲电影第三页| 久久久久久久综合日本| 91久久香蕉国产日韩欧美9色| 久热成人在线视频| 中文字幕一区免费在线观看| 日韩一区二区三区电影| 91视频.com| 国产在线视频一区二区三区| 亚洲综合色在线| 国产精品视频你懂的| 日韩一级片在线观看| 91蝌蚪国产九色| 国产精品亚洲第一| 午夜日韩在线观看| 亚洲欧美日韩国产手机在线| 久久免费的精品国产v∧| 欧美亚洲一区二区在线观看| 不卡av在线免费观看| 美女视频一区在线观看| 色综合久久中文综合久久牛| 精品一区二区三区不卡| 亚洲一区二区三区四区五区黄| 国产精品欧美精品| 久久午夜色播影院免费高清| 欧美日韩日日摸| 色婷婷狠狠综合| 成人午夜视频在线| 精品一区二区三区久久| 日韩av一区二区在线影视| 一区二区三区四区国产精品| 亚洲国产精品99久久久久久久久| 欧美成人高清电影在线| 91精品国产乱| 91精品国产一区二区| 欧美日韩五月天| 在线观看亚洲a| 91亚洲精品久久久蜜桃网站 | 91在线云播放| 成人av综合在线| 国产99久久久国产精品潘金| 国产精品99精品久久免费| 麻豆91免费观看| 麻豆免费看一区二区三区| 日本 国产 欧美色综合| 免费观看日韩av| 日本不卡视频在线| 青青草原综合久久大伊人精品| 石原莉奈在线亚洲三区| 日韩av网站在线观看| 美女任你摸久久 | 国产精品一区二区视频| 韩国视频一区二区| 国产精品一区免费在线观看| 国产99久久久国产精品潘金| 丰满亚洲少妇av| 99精品桃花视频在线观看| 色偷偷久久一区二区三区| 在线国产亚洲欧美| 8x8x8国产精品| 欧美电视剧免费观看| www一区二区| 国产精品久久久一区麻豆最新章节| 中文字幕在线不卡一区二区三区| 亚洲女与黑人做爰| 亚洲观看高清完整版在线观看| 午夜精品一区二区三区三上悠亚 | 另类中文字幕网| 国产精品亚洲第一区在线暖暖韩国 | 在线亚洲精品福利网址导航| 91国内精品野花午夜精品| 欧美日韩久久久一区| 欧美一区二区三区四区五区| 精品国产免费人成电影在线观看四季| 久久婷婷一区二区三区| 国产精品免费丝袜| 亚洲大片精品永久免费| 精品一区二区三区在线播放| jizzjizzjizz欧美| 亚洲乱码国产乱码精品精可以看| 亚洲男同性视频| 日韩国产成人精品| 国产 欧美在线| 欧美系列在线观看| 久久久国产精华| 亚洲人精品一区| 狠狠v欧美v日韩v亚洲ⅴ| www.欧美色图| 日韩一区二区麻豆国产| 国产精品国产三级国产有无不卡 | 日韩三级av在线播放| 欧美经典一区二区| 亚洲成人tv网| 粉嫩高潮美女一区二区三区| 欧美日韩欧美一区二区| 国产欧美精品区一区二区三区| 亚洲成人www| 欧美极品美女视频| 欧美亚洲自拍偷拍| 激情国产一区二区| 亚洲福利一二三区| 欧美亚洲国产一区二区三区va | av电影在线不卡| 午夜精品久久久久影视| 日韩av电影一区| 69堂精品视频| 日韩1区2区日韩1区2区| 欧美日韩免费一区二区三区视频| 一区二区三区在线看| 色综合天天综合网国产成人综合天 | 中文字幕乱码久久午夜不卡| 国产成人av电影在线播放| 国产精品美女久久久久高潮 | 7777精品伊人久久久大香线蕉的| 亚洲成va人在线观看| 欧美久久久久久久久| 日韩一区精品字幕| 欧美成人猛片aaaaaaa| 狠狠色狠狠色综合系列| 精品国产一二三| 丁香婷婷深情五月亚洲| 国产精品传媒入口麻豆| 在线日韩国产精品| 亚洲成人黄色小说| 日韩精品一区二区三区视频 | 欧美日韩情趣电影| 免费成人av在线播放| 精品粉嫩超白一线天av| 成人听书哪个软件好| 亚洲精品视频在线看| 欧洲精品一区二区| 美女脱光内衣内裤视频久久网站 | 欧美成人精品3d动漫h| 国产老女人精品毛片久久| 国产精品美女久久久久av爽李琼| 91亚洲精品久久久蜜桃| 日韩精品久久理论片| 久久精子c满五个校花| 99精品欧美一区| 丝袜诱惑亚洲看片| 精品剧情在线观看| 不卡电影一区二区三区| 五月天欧美精品| 国产日韩欧美在线一区| 在线视频欧美精品| 国产一区二区三区视频在线播放| 中文字幕一区日韩精品欧美| 欧美日韩黄色影视| 高清不卡一二三区| 日韩精彩视频在线观看| 久久女同互慰一区二区三区| 色域天天综合网| 精品一二三四区| 一区二区在线观看视频| 欧美大片在线观看一区二区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日韩女优电影在线观看| 成人免费毛片片v| 婷婷成人综合网| 国产精品国产自产拍在线| 日韩欧美一区在线观看| 色激情天天射综合网| 国产乱码精品一区二区三区忘忧草 | 亚洲国产成人一区二区三区| 欧美日韩国产a| www.av亚洲|