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

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

?? 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");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩13p一区二区三区| 亚洲图片自拍偷拍| 国产精品白丝jk白祙喷水网站| 精品国产网站在线观看| 激情综合亚洲精品| 国产三级久久久| 不卡大黄网站免费看| 一区二区三区四区视频精品免费| 欧美特级限制片免费在线观看| 亚洲成人动漫精品| 欧美videossexotv100| 国产一区二区三区观看| 亚洲视频一区在线观看| 在线观看不卡一区| 久久国产精品一区二区| 国产精品久久三| 7777精品伊人久久久大香线蕉完整版 | 国产精品久线观看视频| 99久久久久久| 欧美aaaaaa午夜精品| 欧美国产激情二区三区 | 亚洲国产精品久久人人爱蜜臀| 91精品久久久久久久99蜜桃| 国产精品一区2区| 亚洲乱码日产精品bd| 欧美一级夜夜爽| 成人精品gif动图一区| 天堂一区二区在线免费观看| 久久久久久久精| 欧美在线一区二区| 国产成人亚洲综合a∨猫咪| 亚洲乱码中文字幕综合| 精品国产一区二区三区不卡| 色94色欧美sute亚洲线路二| 国产精品中文字幕一区二区三区| 亚洲国产欧美另类丝袜| 欧美极品美女视频| 欧美高清你懂得| 成人av第一页| 精品无码三级在线观看视频| 亚洲精品乱码久久久久久| 久久色在线视频| 欧美精品少妇一区二区三区| 成人精品视频.| 久久99久久久久久久久久久| 亚洲精品精品亚洲| 中文字幕乱码久久午夜不卡 | 欧美国产乱子伦| 日韩三级精品电影久久久| 色综合亚洲欧洲| 成人黄色在线网站| 极品少妇xxxx精品少妇| 日韩国产欧美在线视频| 亚洲一区欧美一区| 日韩一区在线免费观看| 欧美v国产在线一区二区三区| 欧美老女人在线| 欧美午夜视频网站| 91丨九色丨蝌蚪丨老版| 丁香六月综合激情| 国产一区二三区| 另类小说色综合网站| 爽好久久久欧美精品| 夜夜爽夜夜爽精品视频| 亚洲精品免费视频| 亚洲欧美日韩成人高清在线一区| 国产欧美日本一区视频| 亚洲精品一区二区三区在线观看| 日韩女优电影在线观看| 欧美一级精品在线| 欧美一卡二卡三卡四卡| 91精品国产综合久久福利软件| 欧美三级中文字| 欧美日韩一区三区四区| 欧美视频第二页| 欧美久久婷婷综合色| 欧美色图天堂网| 宅男噜噜噜66一区二区66| 欧美一区二区三区在线| 日韩欧美美女一区二区三区| 91精品国产91久久久久久最新毛片 | 欧美日本一区二区在线观看| 欧美久久一二区| 欧美成va人片在线观看| 欧美精品一区二区三区蜜臀| 久久五月婷婷丁香社区| 国产欧美综合在线观看第十页| 国产片一区二区| 亚洲同性gay激情无套| 亚洲综合激情网| 丝袜亚洲另类欧美| 麻豆免费看一区二区三区| 久久er精品视频| 成人黄色国产精品网站大全在线免费观看 | 久久精品国产一区二区三区免费看| 日本成人在线看| 国产麻豆91精品| 99精品视频一区| 欧美顶级少妇做爰| 久久色在线视频| 亚洲精品一二三| 日韩综合一区二区| 国产一区二区在线视频| 91丨porny丨国产| 7777精品伊人久久久大香线蕉完整版 | 日韩精品中文字幕一区二区三区| 精品成人私密视频| 日韩一区在线免费观看| 日韩制服丝袜先锋影音| 国产一区二区三区在线观看免费视频| 国产精品1区二区.| 91国偷自产一区二区三区成为亚洲经典 | 久久成人av少妇免费| 成人激情视频网站| 3d动漫精品啪啪1区2区免费| 国产亚洲精品aa午夜观看| 一区二区三区在线免费观看| 久久精品噜噜噜成人av农村| 99久久婷婷国产| 91精品国产综合久久国产大片| 中文字幕第一区综合| 日本午夜精品一区二区三区电影| 国产91在线|亚洲| 欧美日韩国产免费一区二区| 国产亚洲综合在线| 婷婷亚洲久悠悠色悠在线播放| 国产不卡高清在线观看视频| 欧美人与禽zozo性伦| 国产精品国产自产拍在线| 日日夜夜精品视频免费| 99精品国产一区二区三区不卡| 日韩视频一区二区三区在线播放 | 丰满白嫩尤物一区二区| 欧美日韩1234| 亚洲日本va在线观看| 国产老妇另类xxxxx| 6080国产精品一区二区| 中文一区一区三区高中清不卡| 免费高清成人在线| 欧美日本一道本| 亚洲精品久久嫩草网站秘色| 国产成人午夜精品5599| 欧美一区二区三区系列电影| 亚洲国产日韩在线一区模特| 成人性生交大片免费看在线播放| 日韩欧美中文字幕精品| 亚州成人在线电影| 欧洲亚洲国产日韩| 亚洲日本韩国一区| 91亚洲大成网污www| 国产精品久线在线观看| 国产成人综合在线观看| 26uuu精品一区二区| 久久超碰97人人做人人爱| 欧美老人xxxx18| 五月婷婷久久综合| 欧美日韩在线免费视频| 亚洲一区二区av在线| 一本高清dvd不卡在线观看| 国产精品久久毛片a| 成人国产精品免费| 国产精品视频九色porn| 国产寡妇亲子伦一区二区| 精品国产在天天线2019| 激情综合五月天| 久久久精品国产免费观看同学| 国产主播一区二区| 精品成人一区二区| 韩国av一区二区三区四区| 欧美电视剧在线看免费| 蜜臀精品一区二区三区在线观看| 日韩一区二区精品在线观看| 蜜桃一区二区三区在线观看| 日韩一区二区三区在线视频| 久久狠狠亚洲综合| 久久美女艺术照精彩视频福利播放| 激情久久五月天| 亚洲国产精品av| 99久久婷婷国产综合精品电影 | 久久综合五月天婷婷伊人| 精品亚洲国产成人av制服丝袜| 久久综合国产精品| 国产成人8x视频一区二区 | 久久一区二区三区国产精品| 岛国av在线一区| 亚洲人成精品久久久久| 欧美视频一区二区在线观看| 奇米在线7777在线精品| 久久久久久久久伊人| 91精品国产乱码久久蜜臀| 国产一区二区三区在线观看免费视频 | 欧美久久高跟鞋激| 精品系列免费在线观看| 国产精品乱码妇女bbbb| 欧美最猛性xxxxx直播| 欧美aa在线视频| 国产精品福利一区二区三区| 欧美三级日韩三级| 国产一区二三区| 亚洲精品乱码久久久久久|