#
# Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#  
#

JavaSoft HotSpot Architecture Description Language Syntax Specification

Version 0.4 - September 19, 1997

A. Introduction

This document specifies the syntax and associated semantics for the JavaSoft
HotSpot Architecture Description Language.  This language is used to describe
the architecture of a processor, and is the input to the ADL Compiler.  The
ADL Compiler compiles an ADL file into code which is incorporated into the
Optimizing Just In Time Compiler (OJIT) to generate efficient and correct code
for the target architecture.  The ADL describes three bassic different types
of architectural features.  It describes the instruction set (and associated
operands) of the target architecture.  It describes the register set of the
target architecture along with relevant information for the register allocator.
Finally, it describes the architecture's pipeline for scheduling purposes.
The ADL is used to create an architecture description file for a target
architecture.  The architecture description file along with some additional
target specific oracles, written in C++, represent the principal effort in
porting the OJIT to a new target architecture.


B. Example Syntax

	1. Instruction/Operand Syntax for Matching and Encoding

// Create a cost attribute for all operands, and specify the default value
op_attrib  op_cost(10);	

// Create a cost attribute for all instruction, and specify a default value
ins_attrib ins_cost(100);

// example operand form
operand x_reg(REG_NUM rnum)
%{
	constraint(IS_RCLASS(rnum, RC_X_REG));

	match(VREG) %{ rnum = new_VR(); %} // block after rule is constructor

	encode %{ return rnum; %}          // encode rules are required

	// this operand has no op_cost entry because it uses the default value
%}

// example instruction form
instruct add_accum_reg(x_reg dst, reg src)
%{
	match(SET dst (PLUS dst src)); // no block = use default constructor

	encode			       // rule is body of a C++ function
	%{
	    return pentium_encode_add_accum_reg(rnum);
	%}

	ins_cost(200);	// this instruction is more costly than the default
%}

	2. Register Set Description Syntax for Allocation

reg_def AX(SOE, 1); // declare register AX, mark it save on entry with index 0
reg_def BX(SOC);    // declare register BX, and mark it save on call

reg_class X_REG(AX, BX); // form a matcher register class of X_REG
                         // these are used for constraints, etc.

alloc_class class1(AX, BX); // form an allocation class of registers
                            // used by the register allocator for separate
                            // allocation of target register classes

	3. Pipeline Syntax for Scheduling


C. Keywords

1. Matching/Encoding 
	a. instruct    - indicates a machine instruction entry
	b. operand     - indicates a machine operand entry
	c. opclass     - indicates a class of machine operands
	d. source      - indicates a block of C++ source code
	e. op_attrib   - indicates an optional attribute for all operands
	f. ins_attrib  - indicates an optional attribute for all instructions
	g. match       - indicates a matching rule for an operand/instruction
	h. encode      - indicates an encoding rule for an operand/instruction
	i. predicate   - indicates a predicate for matching operand/instruction
       *j. constraint  - indicates a constraint on the value of an operand
       *k. effect      - describes the dataflow effect of an operand which 
			 is not part of a match rule
       *l. expand      - indicates a single instruction for matching which
			 expands to multiple instructions for output
       *m. rewrite     - indicates a single instruction for matching which
			 gets rewritten to one or more instructions after
			 allocation depending upon the registers allocated
       *n. format      - indicates a format rule for an operand/instruction
	o. construct   - indicates a default constructor for an operand

	[NOTE: * indicates a feature which will not be in first release ]

2. Register
       *a. register    - indicates an architecture register definition section
       *b. reg_def     - indicates a register declaration
       *b. reg_class   - indicates a class (list) of registers for matching
       *c. alloc_class - indicates a class (list) of registers for allocation

3. Pipeline
       *a. pipeline    - indicates an architecture pipeline definition section
       *b. resource    - indicates a pipeline resource used by instructions
       *c. pipe_desc   - indicates the relevant stages of the pipeline
       *d. pipe_class  - indicates a description of the pipeline behavior
	   		 for a group of instructions
       *e. ins_pipe    - indicates what pipeline class an instruction is in


D. Delimiters

	1. Comments
		a. /* ... */  (like C code)
		b. // ... EOL (like C++ code)
		c. Comments must be preceeded by whitespace

	2. Blocks
		a. %{ ... %} (% just distinguishes from C++ syntax)
		b. Must be whitespace before and after block delimiters

	3. Terminators
		a. ;   (standard statement terminator)
		b. %}  (block terminator)
		c. EOF (file terminator)

	4. Each statement must start on a separate line

	5. Identifiers cannot contain: (){}%;,"/\

E. Instruction Form: instruct instr1(oper1 dst, oper2 src) %{ ... %}

	1.  Identifier (scope of all instruction names is global in ADL file)
	2.  Operands
		a. Specified in argument style: (<type> <name>, ...)
		b. Type must be the name of an Operand Form
		c. Name is a locally scoped name, used for substitution, etc.
	3.  Match Rule: match(SET dst (PLUS dst src));
		a. Parenthesized Inorder Binary Tree: [lft = left; rgh = right]
		   (root root->lft (root->rgh (root->rgh->lft root->rgh->rgh)))
		b. Interior nodes in tree are operators (nodes) in abstract IR
		c. Leaves are operands from instruction operand list
		d. Assignment operation and destination, which are implicit
		   in the abstract IR, must be specified in the match rule.
	4.  Encode Rule: encode %{ return CONST; %}
		a. Block form must contain C++ code which constitutes the
		   body of a C++ function which takes no arguments, and
		   returns an integer.
		b. Local names (operand names) are can be used as substitution
		   symbols in the code.
	5.  Attribute (ins_attrib): ins_cost(37);
		a. Identifier (must be name defined as instruction attribute)
		b. Argument must be a constant value or a C++ expression which
		   evaluates to a constant at compile time.
       *6.  Effect: effect(src, OP_KILL);
		a. Arguments must be the name of an operand and one of the
		   pre-defined effect type symbols:
		   OP_DEF, OP_USE, OP_KILL, OP_USE_DEF, OP_DEF_USE, OP_USE_KILL
       *7.  Expand: 
		a. Parameters for the new instructions must be the name of 
		   an expand rule temporary operand or must match the local
		   operand name in both the instruction being expanded and 
		   the new instruction being generated.

		instruct convI2B( xRegI dst, eRegI src ) %{
  		   match(Set dst (Conv2B src));

		   expand %{
	 	     eFlagsReg cr;
			 loadZero(dst);
			 testI_zero(cr,src);
			 set_nz(dst,cr);
		   %}
		%}
		// Move zero into a register without setting flags
		instruct loadZero(eRegI dst) %{
		  effect( DEF dst );
		  format %{ "MOV    $dst,0" %}
		  opcode(0xB8); // +rd
		  ins_encode( LdI0(dst) );
		%}

       *8.  Rewrite
	9.  Format: format(add_X $src, $dst); | format %{ ... %}
		a. Argument form takes a text string, possibly containing
		   some substitution symbols, which will be printed out
		   to the assembly language file.
		b. The block form takes valid C++ code which forms the body
		   of a function which takes no arguments, and returns a
		   pointer to a string to print out to the assembly file.

		Mentions of a literal register r in a or b must be of
		the form r_enc or r_num. The form r_enc refers to the
		encoding of the register in an instruction. The form
		r_num refers to the number of the register. While
		r_num is unique, two different registers may have the
		same r_enc, as, for example, an integer and a floating
		point register.


F. Operand Form: operand x_reg(REG_T rall) %{ ... %}
	1.  Identifier (scope of all operand names is global in ADL file)
	2.  Components
		a. Specified in argument style: (<type> <name>, ...)
		b. Type must be a predefined Component Type
		c. Name is a locally scoped name, used for substitution, etc.
	3.  Match: (VREG)
		a. Parenthesized Inorder Binary Tree: [lft = left; rgh = right]
		   (root root->lft (root->rgh (root->rgh->lft root->rgh->rgh)))
		b. Interior nodes in tree are operators (nodes) in abstract IR
		c. Leaves are components from operand component list
		d. Block following tree is the body of a C++ function taking
		   no arguments and returning no value, which assigns values
		   to the components of the operand at match time.
	4.  Encode: encode %{ return CONST; %}
		a. Block form must contain C++ code which constitutes the
		   body of a C++ function which takes no arguments, and
		   returns an integer.
		b. Local names (operand names) are can be used as substitution
		   symbols in the code.
	5.  Attribute (op_attrib): op_cost(5);
		a. Identifier (must be name defined as operand attribute)
		b. Argument must be a constant value or a C++ expression which
		   evaluates to a constant at compile time.
	6.  Predicate: predicate(0 <= src < 256);
		a. Argument must be a valid C++ expression which evaluates
		   to either TRUE of FALSE at run time.
       *7.  Constraint: constraint(IS_RCLASS(dst, RC_X_CLASS));
                a. Arguments must contain only predefined constraint
                   functions on values defined in the AD file.
                b. Multiple arguments can be chained together logically
                   with "&&".
 	8.  Construct: construct %{ ... %}
		a. Block must be a valid C++ function body which takes no
		   arguments, and returns no values.
		b. Purpose of block is to assign values to the elements
		   of an operand which is constructed outside the matching
		   process.
		c. This block is logically identical to the constructor
		   block in a match rule.
	9.  Format: format(add_X $src, $dst); | format %{ ... %}
		a. Argument form takes a text string, possibly containing
		   some substitution symbols, which will be printed out
		   to the assembly language file.
		b. The block form takes valid C++ code which forms the body
		   of a function which takes no arguments, and returns a
		   pointer to a string to print out to the assembly file.

		Mentions of a literal register r in a or b must be of
		the form r_enc or r_num. The form r_enc refers to the
		encoding of the register in an instruction. The form
		r_num refers to the number of the register. While
		r_num is unique, two different registers may have the
		same r_enc, as, for example, an integer and a floating
		point register.

G. Operand Class Form: opclass memory( direct, indirect, ind_offset);

H. Attribute Form (keywords ins_atrib & op_attrib): ins_attrib ins_cost(10);
	1. Identifier (scope of all attribute names is global in ADL file)
	2. Argument must be a valid C++ expression which evaluates to a
	   constant at compile time, and specifies the default value of
	   this attribute if attribute definition is not included in an
	   operand/instruction.

I. Source Form: source %{ ... %}
	1. Source Block
		a. All source blocks are delimited by "%{" and "%}".
		b. All source blocks are copied verbatim into the
		   C++ output file, and must be valid C++ code.

		   Mentions of a literal register r in this code must
		   be of the form r_enc or r_num. The form r_enc
		   refers to the encoding of the register in an
		   instruction. The form r_num refers to the number of
		   the register. While r_num is unique, two different
		   registers may have the same r_enc, as, for example,
		   an integer and a floating point register.


J. *Register Form: register %{ ... %}
	1. Block contains architecture specific information for allocation
	2. Reg_def: reg_def reg_AX(1);
		a. Identifier is name by which register will be referenced
		   throughout the rest of the AD, and the allocator and
		   back-end.
		b. Argument is the Save on Entry index (where 0 means that
		   the register is Save on Call).  This is used by the
		   frame management routines for generating register saves
		   and restores.
	3. Reg_class: reg_class x_regs(reg_AX, reg_BX, reg_CX, reg_DX);
		a. Identifier is the name of the class used throughout the
		   instruction selector.
		b. Arguments are a list of register names in the class.
	4. Alloc_class: alloc_class x_alloc(reg_AX, reg_BX, reg_CX, reg_DX);
		a. Identifier is the name of the class used throughout the
		   register allocator.
		b. Arguments are a list of register names in the class.


K. *Pipeline Form: pipeline %{ ... %}
	1. Block contains architecture specific information for scheduling
	2. Resource: resource(ialu1);
		a. Argument is the name of the resource.
	3. Pipe_desc: pipe_desc(Address, Access, Read, Execute);
		a. Arguments are names of relevant phases of the pipeline.
		b. If ALL instructions behave identically in a pipeline
		   phase, it does not need to be specified. (This is typically
		   true for pre-fetch, fetch, and decode pipeline stages.)
		c. There must be one name per cycle consumed in the
		   pipeline, even if there is no instruction which has
		   significant behavior in that stage (for instance, extra
		   stages inserted for load and store instructions which
		   are just cycles which pass waiting for the completion
		   of the memory operation).
	4. Pipe_class: pipe_class pipe_normal(dagen; ; membus; ialu1, ialu2);
		a. Identifier names the class for use in ins_pipe statements
		b. Arguments are a list of stages, separated by ;'s which
		   contain comma separated lists of resource names.
		c. There must be an entry for each stage defined in the
		   pipe_desc statement, (even if it is empty as in the example)
		   and entries are associated with stages by the order of
		   stage declarations in the pipe_desc statement.

