src/share/vm/adlc/Doc/Syntax.doc

Fri, 27 Feb 2009 13:27:09 -0800

author
twisti
date
Fri, 27 Feb 2009 13:27:09 -0800
changeset 1040
98cb887364d3
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6810672: Comment typos
Summary: I have collected some typos I have found while looking at the code.
Reviewed-by: kvn, never

     1 #
     2 # Copyright 1997-1998 Sun Microsystems, Inc.  All Rights Reserved.
     3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4 #
     5 # This code is free software; you can redistribute it and/or modify it
     6 # under the terms of the GNU General Public License version 2 only, as
     7 # published by the Free Software Foundation.
     8 #
     9 # This code is distributed in the hope that it will be useful, but WITHOUT
    10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12 # version 2 for more details (a copy is included in the LICENSE file that
    13 # accompanied this code).
    14 #
    15 # You should have received a copy of the GNU General Public License version
    16 # 2 along with this work; if not, write to the Free Software Foundation,
    17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18 #
    19 # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20 # CA 95054 USA or visit www.sun.com if you need additional information or
    21 # have any questions.
    22 #  
    23 #
    25 JavaSoft HotSpot Architecture Description Language Syntax Specification
    27 Version 0.4 - September 19, 1997
    29 A. Introduction
    31 This document specifies the syntax and associated semantics for the JavaSoft
    32 HotSpot Architecture Description Language.  This language is used to describe
    33 the architecture of a processor, and is the input to the ADL Compiler.  The
    34 ADL Compiler compiles an ADL file into code which is incorporated into the
    35 Optimizing Just In Time Compiler (OJIT) to generate efficient and correct code
    36 for the target architecture.  The ADL describes three bassic different types
    37 of architectural features.  It describes the instruction set (and associated
    38 operands) of the target architecture.  It describes the register set of the
    39 target architecture along with relevant information for the register allocator.
    40 Finally, it describes the architecture's pipeline for scheduling purposes.
    41 The ADL is used to create an architecture description file for a target
    42 architecture.  The architecture description file along with some additional
    43 target specific oracles, written in C++, represent the principal effort in
    44 porting the OJIT to a new target architecture.
    47 B. Example Syntax
    49 	1. Instruction/Operand Syntax for Matching and Encoding
    51 // Create a cost attribute for all operands, and specify the default value
    52 op_attrib  op_cost(10);	
    54 // Create a cost attribute for all instruction, and specify a default value
    55 ins_attrib ins_cost(100);
    57 // example operand form
    58 operand x_reg(REG_NUM rnum)
    59 %{
    60 	constraint(IS_RCLASS(rnum, RC_X_REG));
    62 	match(VREG) %{ rnum = new_VR(); %} // block after rule is constructor
    64 	encode %{ return rnum; %}          // encode rules are required
    66 	// this operand has no op_cost entry because it uses the default value
    67 %}
    69 // example instruction form
    70 instruct add_accum_reg(x_reg dst, reg src)
    71 %{
    72 	match(SET dst (PLUS dst src)); // no block = use default constructor
    74 	encode			       // rule is body of a C++ function
    75 	%{
    76 	    return pentium_encode_add_accum_reg(rnum);
    77 	%}
    79 	ins_cost(200);	// this instruction is more costly than the default
    80 %}
    82 	2. Register Set Description Syntax for Allocation
    84 reg_def AX(SOE, 1); // declare register AX, mark it save on entry with index 0
    85 reg_def BX(SOC);    // declare register BX, and mark it save on call
    87 reg_class X_REG(AX, BX); // form a matcher register class of X_REG
    88                          // these are used for constraints, etc.
    90 alloc_class class1(AX, BX); // form an allocation class of registers
    91                             // used by the register allocator for separate
    92                             // allocation of target register classes
    94 	3. Pipeline Syntax for Scheduling
    97 C. Keywords
    99 1. Matching/Encoding 
   100 	a. instruct    - indicates a machine instruction entry
   101 	b. operand     - indicates a machine operand entry
   102 	c. opclass     - indicates a class of machine operands
   103 	d. source      - indicates a block of C++ source code
   104 	e. op_attrib   - indicates an optional attribute for all operands
   105 	f. ins_attrib  - indicates an optional attribute for all instructions
   106 	g. match       - indicates a matching rule for an operand/instruction
   107 	h. encode      - indicates an encoding rule for an operand/instruction
   108 	i. predicate   - indicates a predicate for matching operand/instruction
   109        *j. constraint  - indicates a constraint on the value of an operand
   110        *k. effect      - describes the dataflow effect of an operand which 
   111 			 is not part of a match rule
   112        *l. expand      - indicates a single instruction for matching which
   113 			 expands to multiple instructions for output
   114        *m. rewrite     - indicates a single instruction for matching which
   115 			 gets rewritten to one or more instructions after
   116 			 allocation depending upon the registers allocated
   117        *n. format      - indicates a format rule for an operand/instruction
   118 	o. construct   - indicates a default constructor for an operand
   120 	[NOTE: * indicates a feature which will not be in first release ]
   122 2. Register
   123        *a. register    - indicates an architecture register definition section
   124        *b. reg_def     - indicates a register declaration
   125        *b. reg_class   - indicates a class (list) of registers for matching
   126        *c. alloc_class - indicates a class (list) of registers for allocation
   128 3. Pipeline
   129        *a. pipeline    - indicates an architecture pipeline definition section
   130        *b. resource    - indicates a pipeline resource used by instructions
   131        *c. pipe_desc   - indicates the relevant stages of the pipeline
   132        *d. pipe_class  - indicates a description of the pipeline behavior
   133 	   		 for a group of instructions
   134        *e. ins_pipe    - indicates what pipeline class an instruction is in
   137 D. Delimiters
   139 	1. Comments
   140 		a. /* ... */  (like C code)
   141 		b. // ... EOL (like C++ code)
   142 		c. Comments must be preceeded by whitespace
   144 	2. Blocks
   145 		a. %{ ... %} (% just distinguishes from C++ syntax)
   146 		b. Must be whitespace before and after block delimiters
   148 	3. Terminators
   149 		a. ;   (standard statement terminator)
   150 		b. %}  (block terminator)
   151 		c. EOF (file terminator)
   153 	4. Each statement must start on a separate line
   155 	5. Identifiers cannot contain: (){}%;,"/\
   157 E. Instruction Form: instruct instr1(oper1 dst, oper2 src) %{ ... %}
   159 	1.  Identifier (scope of all instruction names is global in ADL file)
   160 	2.  Operands
   161 		a. Specified in argument style: (<type> <name>, ...)
   162 		b. Type must be the name of an Operand Form
   163 		c. Name is a locally scoped name, used for substitution, etc.
   164 	3.  Match Rule: match(SET dst (PLUS dst src));
   165 		a. Parenthesized Inorder Binary Tree: [lft = left; rgh = right]
   166 		   (root root->lft (root->rgh (root->rgh->lft root->rgh->rgh)))
   167 		b. Interior nodes in tree are operators (nodes) in abstract IR
   168 		c. Leaves are operands from instruction operand list
   169 		d. Assignment operation and destination, which are implicit
   170 		   in the abstract IR, must be specified in the match rule.
   171 	4.  Encode Rule: encode %{ return CONST; %}
   172 		a. Block form must contain C++ code which constitutes the
   173 		   body of a C++ function which takes no arguments, and
   174 		   returns an integer.
   175 		b. Local names (operand names) are can be used as substitution
   176 		   symbols in the code.
   177 	5.  Attribute (ins_attrib): ins_cost(37);
   178 		a. Identifier (must be name defined as instruction attribute)
   179 		b. Argument must be a constant value or a C++ expression which
   180 		   evaluates to a constant at compile time.
   181        *6.  Effect: effect(src, OP_KILL);
   182 		a. Arguments must be the name of an operand and one of the
   183 		   pre-defined effect type symbols:
   184 		   OP_DEF, OP_USE, OP_KILL, OP_USE_DEF, OP_DEF_USE, OP_USE_KILL
   185        *7.  Expand: 
   186 		a. Parameters for the new instructions must be the name of 
   187 		   an expand rule temporary operand or must match the local
   188 		   operand name in both the instruction being expanded and 
   189 		   the new instruction being generated.
   191 		instruct convI2B( xRegI dst, eRegI src ) %{
   192   		   match(Set dst (Conv2B src));
   194 		   expand %{
   195 	 	     eFlagsReg cr;
   196 			 loadZero(dst);
   197 			 testI_zero(cr,src);
   198 			 set_nz(dst,cr);
   199 		   %}
   200 		%}
   201 		// Move zero into a register without setting flags
   202 		instruct loadZero(eRegI dst) %{
   203 		  effect( DEF dst );
   204 		  format %{ "MOV    $dst,0" %}
   205 		  opcode(0xB8); // +rd
   206 		  ins_encode( LdI0(dst) );
   207 		%}
   209        *8.  Rewrite
   210 	9.  Format: format(add_X $src, $dst); | format %{ ... %}
   211 		a. Argument form takes a text string, possibly containing
   212 		   some substitution symbols, which will be printed out
   213 		   to the assembly language file.
   214 		b. The block form takes valid C++ code which forms the body
   215 		   of a function which takes no arguments, and returns a
   216 		   pointer to a string to print out to the assembly file.
   218 		Mentions of a literal register r in a or b must be of
   219 		the form r_enc or r_num. The form r_enc refers to the
   220 		encoding of the register in an instruction. The form
   221 		r_num refers to the number of the register. While
   222 		r_num is unique, two different registers may have the
   223 		same r_enc, as, for example, an integer and a floating
   224 		point register.
   227 F. Operand Form: operand x_reg(REG_T rall) %{ ... %}
   228 	1.  Identifier (scope of all operand names is global in ADL file)
   229 	2.  Components
   230 		a. Specified in argument style: (<type> <name>, ...)
   231 		b. Type must be a predefined Component Type
   232 		c. Name is a locally scoped name, used for substitution, etc.
   233 	3.  Match: (VREG)
   234 		a. Parenthesized Inorder Binary Tree: [lft = left; rgh = right]
   235 		   (root root->lft (root->rgh (root->rgh->lft root->rgh->rgh)))
   236 		b. Interior nodes in tree are operators (nodes) in abstract IR
   237 		c. Leaves are components from operand component list
   238 		d. Block following tree is the body of a C++ function taking
   239 		   no arguments and returning no value, which assigns values
   240 		   to the components of the operand at match time.
   241 	4.  Encode: encode %{ return CONST; %}
   242 		a. Block form must contain C++ code which constitutes the
   243 		   body of a C++ function which takes no arguments, and
   244 		   returns an integer.
   245 		b. Local names (operand names) are can be used as substitution
   246 		   symbols in the code.
   247 	5.  Attribute (op_attrib): op_cost(5);
   248 		a. Identifier (must be name defined as operand attribute)
   249 		b. Argument must be a constant value or a C++ expression which
   250 		   evaluates to a constant at compile time.
   251 	6.  Predicate: predicate(0 <= src < 256);
   252 		a. Argument must be a valid C++ expression which evaluates
   253 		   to either TRUE of FALSE at run time.
   254        *7.  Constraint: constraint(IS_RCLASS(dst, RC_X_CLASS));
   255                 a. Arguments must contain only predefined constraint
   256                    functions on values defined in the AD file.
   257                 b. Multiple arguments can be chained together logically
   258                    with "&&".
   259  	8.  Construct: construct %{ ... %}
   260 		a. Block must be a valid C++ function body which takes no
   261 		   arguments, and returns no values.
   262 		b. Purpose of block is to assign values to the elements
   263 		   of an operand which is constructed outside the matching
   264 		   process.
   265 		c. This block is logically identical to the constructor
   266 		   block in a match rule.
   267 	9.  Format: format(add_X $src, $dst); | format %{ ... %}
   268 		a. Argument form takes a text string, possibly containing
   269 		   some substitution symbols, which will be printed out
   270 		   to the assembly language file.
   271 		b. The block form takes valid C++ code which forms the body
   272 		   of a function which takes no arguments, and returns a
   273 		   pointer to a string to print out to the assembly file.
   275 		Mentions of a literal register r in a or b must be of
   276 		the form r_enc or r_num. The form r_enc refers to the
   277 		encoding of the register in an instruction. The form
   278 		r_num refers to the number of the register. While
   279 		r_num is unique, two different registers may have the
   280 		same r_enc, as, for example, an integer and a floating
   281 		point register.
   283 G. Operand Class Form: opclass memory( direct, indirect, ind_offset);
   285 H. Attribute Form (keywords ins_atrib & op_attrib): ins_attrib ins_cost(10);
   286 	1. Identifier (scope of all attribute names is global in ADL file)
   287 	2. Argument must be a valid C++ expression which evaluates to a
   288 	   constant at compile time, and specifies the default value of
   289 	   this attribute if attribute definition is not included in an
   290 	   operand/instruction.
   292 I. Source Form: source %{ ... %}
   293 	1. Source Block
   294 		a. All source blocks are delimited by "%{" and "%}".
   295 		b. All source blocks are copied verbatim into the
   296 		   C++ output file, and must be valid C++ code.
   298 		   Mentions of a literal register r in this code must
   299 		   be of the form r_enc or r_num. The form r_enc
   300 		   refers to the encoding of the register in an
   301 		   instruction. The form r_num refers to the number of
   302 		   the register. While r_num is unique, two different
   303 		   registers may have the same r_enc, as, for example,
   304 		   an integer and a floating point register.
   307 J. *Register Form: register %{ ... %}
   308 	1. Block contains architecture specific information for allocation
   309 	2. Reg_def: reg_def reg_AX(1);
   310 		a. Identifier is name by which register will be referenced
   311 		   throughout the rest of the AD, and the allocator and
   312 		   back-end.
   313 		b. Argument is the Save on Entry index (where 0 means that
   314 		   the register is Save on Call).  This is used by the
   315 		   frame management routines for generating register saves
   316 		   and restores.
   317 	3. Reg_class: reg_class x_regs(reg_AX, reg_BX, reg_CX, reg_DX);
   318 		a. Identifier is the name of the class used throughout the
   319 		   instruction selector.
   320 		b. Arguments are a list of register names in the class.
   321 	4. Alloc_class: alloc_class x_alloc(reg_AX, reg_BX, reg_CX, reg_DX);
   322 		a. Identifier is the name of the class used throughout the
   323 		   register allocator.
   324 		b. Arguments are a list of register names in the class.
   327 K. *Pipeline Form: pipeline %{ ... %}
   328 	1. Block contains architecture specific information for scheduling
   329 	2. Resource: resource(ialu1);
   330 		a. Argument is the name of the resource.
   331 	3. Pipe_desc: pipe_desc(Address, Access, Read, Execute);
   332 		a. Arguments are names of relevant phases of the pipeline.
   333 		b. If ALL instructions behave identically in a pipeline
   334 		   phase, it does not need to be specified. (This is typically
   335 		   true for pre-fetch, fetch, and decode pipeline stages.)
   336 		c. There must be one name per cycle consumed in the
   337 		   pipeline, even if there is no instruction which has
   338 		   significant behavior in that stage (for instance, extra
   339 		   stages inserted for load and store instructions which
   340 		   are just cycles which pass waiting for the completion
   341 		   of the memory operation).
   342 	4. Pipe_class: pipe_class pipe_normal(dagen; ; membus; ialu1, ialu2);
   343 		a. Identifier names the class for use in ins_pipe statements
   344 		b. Arguments are a list of stages, separated by ;'s which
   345 		   contain comma separated lists of resource names.
   346 		c. There must be an entry for each stage defined in the
   347 		   pipe_desc statement, (even if it is empty as in the example)
   348 		   and entries are associated with stages by the order of
   349 		   stage declarations in the pipe_desc statement.

mercurial