github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/cmd/5g/opt.h (about)

     1  // Inferno utils/5c/gc.h
     2  // http://code.google.com/p/inferno-os/source/browse/utils/5c/gc.h
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  #include	"../gc/popt.h"
    32  
    33  #define	Z	N
    34  #define	Adr	Addr
    35  
    36  #define	D_HI	D_NONE
    37  #define	D_LO	D_NONE
    38  
    39  #define	BLOAD(r)	band(bnot(r->refbehind), r->refahead)
    40  #define	BSTORE(r)	band(bnot(r->calbehind), r->calahead)
    41  #define	LOAD(r)		(~r->refbehind.b[z] & r->refahead.b[z])
    42  #define	STORE(r)	(~r->calbehind.b[z] & r->calahead.b[z])
    43  
    44  #define	CLOAD	5
    45  #define	CREF	5
    46  #define	CINF	1000
    47  #define	LOOP	3
    48  
    49  typedef	struct	Reg	Reg;
    50  typedef	struct	Rgn	Rgn;
    51  
    52  // A Reg is a wrapper around a single Prog (one instruction) that holds
    53  // register optimization information while the optimizer runs.
    54  // r->prog is the instruction.
    55  // r->prog->opt points back to r.
    56  struct	Reg
    57  {
    58  	Flow	f;
    59  
    60  	Bits	set;  		// variables written by this instruction.
    61  	Bits	use1; 		// variables read by prog->from.
    62  	Bits	use2; 		// variables read by prog->to.
    63  
    64  	Bits	refbehind;
    65  	Bits	refahead;
    66  	Bits	calbehind;
    67  	Bits	calahead;
    68  	Bits	regdiff;
    69  	Bits	act;
    70  
    71  	int32	regu;		// register used bitmap
    72  };
    73  #define	R	((Reg*)0)
    74  
    75  #define	NRGN	600
    76  struct	Rgn
    77  {
    78  	Reg*	enter;
    79  	short	cost;
    80  	short	varno;
    81  	short	regno;
    82  };
    83  
    84  EXTERN	int32	exregoffset;		// not set
    85  EXTERN	int32	exfregoffset;		// not set
    86  EXTERN	Reg	zreg;
    87  EXTERN	Reg*	freer;
    88  EXTERN	Reg**	rpo2r;
    89  EXTERN	Rgn	region[NRGN];
    90  EXTERN	Rgn*	rgp;
    91  EXTERN	int	nregion;
    92  EXTERN	int	nvar;
    93  EXTERN	int32	regbits;
    94  EXTERN	int32	exregbits;
    95  EXTERN	Bits	externs;
    96  EXTERN	Bits	params;
    97  EXTERN	Bits	consts;
    98  EXTERN	Bits	addrs;
    99  EXTERN	Bits	ivar;
   100  EXTERN	Bits	ovar;
   101  EXTERN	int	change;
   102  EXTERN	int32	maxnr;
   103  EXTERN	int32*	idom;
   104  
   105  EXTERN	struct
   106  {
   107  	int32	ncvtreg;
   108  	int32	nspill;
   109  	int32	nreload;
   110  	int32	ndelmov;
   111  	int32	nvar;
   112  	int32	naddr;
   113  } ostats;
   114  
   115  /*
   116   * reg.c
   117   */
   118  Reg*	rega(void);
   119  int	rcmp(const void*, const void*);
   120  void	regopt(Prog*);
   121  void	addmove(Reg*, int, int, int);
   122  Bits	mkvar(Reg *r, Adr *a);
   123  void	prop(Reg*, Bits, Bits);
   124  void	synch(Reg*, Bits);
   125  uint32	allreg(uint32, Rgn*);
   126  void	paint1(Reg*, int);
   127  uint32	paint2(Reg*, int);
   128  void	paint3(Reg*, int, int32, int);
   129  void	addreg(Adr*, int);
   130  void	dumpit(char *str, Flow *r0, int);
   131  
   132  /*
   133   * peep.c
   134   */
   135  void	peep(Prog*);
   136  void	excise(Flow*);
   137  int	copyu(Prog*, Adr*, Adr*);
   138  
   139  int32	RtoB(int);
   140  int32	FtoB(int);
   141  int	BtoR(int32);
   142  int	BtoF(int32);
   143  
   144  /*
   145   * prog.c
   146   */
   147  typedef struct ProgInfo ProgInfo;
   148  struct ProgInfo
   149  {
   150  	uint32 flags; // the bits below
   151  };
   152  
   153  enum
   154  {
   155  	// Pseudo-op, like TEXT, GLOBL, TYPE, PCDATA, FUNCDATA.
   156  	Pseudo = 1<<1,
   157  	
   158  	// There's nothing to say about the instruction,
   159  	// but it's still okay to see.
   160  	OK = 1<<2,
   161  
   162  	// Size of right-side write, or right-side read if no write.
   163  	SizeB = 1<<3,
   164  	SizeW = 1<<4,
   165  	SizeL = 1<<5,
   166  	SizeQ = 1<<6,
   167  	SizeF = 1<<7, // float aka float32
   168  	SizeD = 1<<8, // double aka float64
   169  
   170  	// Left side: address taken, read, write.
   171  	LeftAddr = 1<<9,
   172  	LeftRead = 1<<10,
   173  	LeftWrite = 1<<11,
   174  	
   175  	// Register in middle; never written.
   176  	RegRead = 1<<12,
   177  	CanRegRead = 1<<13,
   178  	
   179  	// Right side: address taken, read, write.
   180  	RightAddr = 1<<14,
   181  	RightRead = 1<<15,
   182  	RightWrite = 1<<16,
   183  
   184  	// Instruction kinds
   185  	Move = 1<<17, // straight move
   186  	Conv = 1<<18, // size conversion
   187  	Cjmp = 1<<19, // conditional jump
   188  	Break = 1<<20, // breaks control flow (no fallthrough)
   189  	Call = 1<<21, // function call
   190  	Jump = 1<<22, // jump
   191  	Skip = 1<<23, // data instruction
   192  };
   193  
   194  void proginfo(ProgInfo*, Prog*);
   195  
   196  // To allow use of AJMP and ACALL in ../gc/popt.c.
   197  enum
   198  {
   199  	AJMP = AB,
   200  	ACALL = ABL,
   201  };