diff src/share/vm/adlc/adlparse.cpp @ 14909:4ca6dc0799b6

Backout jdk9 merge
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 01 Apr 2014 13:57:07 +0200
parents abec000618bf
children 89152779163c
line wrap: on
line diff
--- a/src/share/vm/adlc/adlparse.cpp	Tue Apr 01 14:09:03 2014 +0200
+++ b/src/share/vm/adlc/adlparse.cpp	Tue Apr 01 13:57:07 2014 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -219,21 +219,19 @@
     else if (!strcmp(ident, "encode"))  {
       parse_err(SYNERR, "Instructions specify ins_encode, not encode\n");
     }
-    else if (!strcmp(ident, "ins_encode"))       ins_encode_parse(*instr);
-    // Parse late expand keyword.
-    else if (!strcmp(ident, "postalloc_expand")) postalloc_expand_parse(*instr);
-    else if (!strcmp(ident, "opcode"))           instr->_opcode    = opcode_parse(instr);
-    else if (!strcmp(ident, "size"))             instr->_size      = size_parse(instr);
-    else if (!strcmp(ident, "effect"))           effect_parse(instr);
-    else if (!strcmp(ident, "expand"))           instr->_exprule   = expand_parse(instr);
-    else if (!strcmp(ident, "rewrite"))          instr->_rewrule   = rewrite_parse();
+    else if (!strcmp(ident, "ins_encode"))     ins_encode_parse(*instr);
+    else if (!strcmp(ident, "opcode"))         instr->_opcode    = opcode_parse(instr);
+    else if (!strcmp(ident, "size"))           instr->_size      = size_parse(instr);
+    else if (!strcmp(ident, "effect"))         effect_parse(instr);
+    else if (!strcmp(ident, "expand"))         instr->_exprule   = expand_parse(instr);
+    else if (!strcmp(ident, "rewrite"))        instr->_rewrule   = rewrite_parse();
     else if (!strcmp(ident, "constraint")) {
       parse_err(SYNERR, "Instructions do not specify a constraint\n");
     }
     else if (!strcmp(ident, "construct")) {
       parse_err(SYNERR, "Instructions do not specify a construct\n");
     }
-    else if (!strcmp(ident, "format"))           instr->_format    = format_parse();
+    else if (!strcmp(ident, "format"))         instr->_format    = format_parse();
     else if (!strcmp(ident, "interface")) {
       parse_err(SYNERR, "Instructions do not specify an interface\n");
     }
@@ -242,14 +240,13 @@
       // Check identifier to see if it is the name of an attribute
       const Form    *form = _globalNames[ident];
       AttributeForm *attr = form ? form->is_attribute() : NULL;
-      if (attr && (attr->_atype == INS_ATTR)) {
+      if( attr && (attr->_atype == INS_ATTR) ) {
         // Insert the new attribute into the linked list.
         Attribute *temp = attr_parse(ident);
         temp->_next = instr->_attribs;
         instr->_attribs = temp;
       } else {
-        parse_err(SYNERR, "expected one of:\n predicate, match, encode, or the name of"
-                  " an instruction attribute at %s\n", ident);
+        parse_err(SYNERR, "expected one of:\n predicate, match, encode, or the name of an instruction attribute at %s\n", ident);
       }
     }
     skipws();
@@ -261,17 +258,13 @@
   }
   // Check for "Set" form of chain rule
   adjust_set_rule(instr);
-  if (_AD._pipeline) {
-    // No pipe required for late expand.
-    if (instr->expands() || instr->postalloc_expands()) {
-      if (instr->_ins_pipe) {
-        parse_err(WARN, "ins_pipe and expand rule both specified for instruction \"%s\";"
-                  " ins_pipe will be unused\n", instr->_ident);
-      }
+  if (_AD._pipeline ) {
+    if( instr->expands() ) {
+      if( instr->_ins_pipe )
+        parse_err(WARN, "ins_pipe and expand rule both specified for instruction \"%s\"; ins_pipe will be unused\n", instr->_ident);
     } else {
-      if (!instr->_ins_pipe) {
+      if( !instr->_ins_pipe )
         parse_err(WARN, "No ins_pipe specified for instruction \"%s\"\n", instr->_ident);
-      }
     }
   }
   // Add instruction to tail of instruction list
@@ -2786,13 +2779,11 @@
     encoding->add_parameter(opForm->_ident, param);
   }
 
-  if (!inst._is_postalloc_expand) {
-    // Define a MacroAssembler instance for use by the encoding.  The
-    // name is chosen to match the __ idiom used for assembly in other
-    // parts of hotspot and assumes the existence of the standard
-    // #define __ _masm.
-    encoding->add_code("    MacroAssembler _masm(&cbuf);\n");
-  }
+  // Define a MacroAssembler instance for use by the encoding.  The
+  // name is chosen to match the __ idiom used for assembly in other
+  // parts of hotspot and assumes the existence of the standard
+  // #define __ _masm.
+  encoding->add_code("    MacroAssembler _masm(&cbuf);\n");
 
   // Parse the following %{ }% block
   ins_encode_parse_block_impl(inst, encoding, ec_name);
@@ -2863,14 +2854,10 @@
       // Check if this instruct is a MachConstantNode.
       if (strcmp(rep_var, "constanttablebase") == 0) {
         // This instruct is a MachConstantNode.
-        inst.set_needs_constant_base(true);
-        if (strncmp("MachCall", inst.mach_base_class(_globalNames), strlen("MachCall")) != 0 ) {
-          inst.set_is_mach_constant(true);
-        }
+        inst.set_is_mach_constant(true);
 
         if (_curchar == '(')  {
-          parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument "
-                            "(only constantaddress and constantoffset)", ec_name);
+          parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument (only constantaddress and constantoffset)", ec_name);
           return;
         }
       }
@@ -2968,34 +2955,18 @@
       while (_curchar != ')') {
         char *param = get_ident_or_literal_constant("encoding operand");
         if ( param != NULL ) {
-
-          // Check if this instruct is a MachConstantNode.
-          if (strcmp(param, "constanttablebase") == 0) {
-            // This instruct is a MachConstantNode.
-            inst.set_needs_constant_base(true);
-            if (strncmp("MachCall", inst.mach_base_class(_globalNames), strlen("MachCall")) != 0 ) {
-              inst.set_is_mach_constant(true);
-            }
-
-            if (_curchar == '(')  {
-              parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument "
-                        "(only constantaddress and constantoffset)", ec_name);
-              return;
-            }
-          } else {
-            // Found a parameter:
-            // Check it is a local name, add it to the list, then check for more
-            // New: allow hex constants as parameters to an encode method.
-            // New: allow parenthesized expressions as parameters.
-            // New: allow "primary", "secondary", "tertiary" as parameters.
-            // New: allow user-defined register name as parameter
-            if ( (inst._localNames[param] == NULL) &&
-                 !ADLParser::is_literal_constant(param) &&
-                 (Opcode::as_opcode_type(param) == Opcode::NOT_AN_OPCODE) &&
-                 ((_AD._register == NULL ) || (_AD._register->getRegDef(param) == NULL)) ) {
-              parse_err(SYNERR, "Using non-locally defined parameter %s for encoding %s.\n", param, ec_name);
-              return;
-            }
+          // Found a parameter:
+          // Check it is a local name, add it to the list, then check for more
+          // New: allow hex constants as parameters to an encode method.
+          // New: allow parenthesized expressions as parameters.
+          // New: allow "primary", "secondary", "tertiary" as parameters.
+          // New: allow user-defined register name as parameter
+          if ( (inst._localNames[param] == NULL) &&
+               !ADLParser::is_literal_constant(param) &&
+               (Opcode::as_opcode_type(param) == Opcode::NOT_AN_OPCODE) &&
+               ((_AD._register == NULL ) || (_AD._register->getRegDef(param) == NULL)) ) {
+            parse_err(SYNERR, "Using non-locally defined parameter %s for encoding %s.\n", param, ec_name);
+            return;
           }
           params->add_entry(param);
 
@@ -3079,160 +3050,6 @@
   inst._insencode = encrule;
 }
 
-//------------------------------postalloc_expand_parse---------------------------
-// Encode rules have the form
-//   postalloc_expand( encode_class_name(parameter_list) );
-//
-// The "encode_class_name" must be defined in the encode section.
-// The parameter list contains $names that are locals.
-//
-// This is just a copy of ins_encode_parse without the loop.
-void ADLParser::postalloc_expand_parse(InstructForm& inst) {
-  inst._is_postalloc_expand = true;
-
-  // Parse encode class name.
-  skipws();                        // Skip whitespace.
-  if (_curchar != '(') {
-    // Check for postalloc_expand %{ form
-    if ((_curchar == '%') && (*(_ptr+1) == '{')) {
-      next_char();                      // Skip '%'
-      next_char();                      // Skip '{'
-
-      // Parse the block form of postalloc_expand
-      ins_encode_parse_block(inst);
-      return;
-    }
-
-    parse_err(SYNERR, "missing '(' in postalloc_expand definition\n");
-    return;
-  }
-  next_char();                     // Move past '('.
-  skipws();
-
-  InsEncode *encrule = new InsEncode(); // Encode class for instruction.
-  encrule->_linenum = linenum();
-  char      *ec_name = NULL;       // String representation of encode rule.
-  // identifier is optional.
-  if (_curchar != ')') {
-    ec_name = get_ident();
-    if (ec_name == NULL) {
-      parse_err(SYNERR, "Invalid postalloc_expand class name after 'postalloc_expand('.\n");
-      return;
-    }
-    // Check that encoding is defined in the encode section.
-    EncClass *encode_class = _AD._encode->encClass(ec_name);
-
-    // Get list for encode method's parameters
-    NameAndList *params = encrule->add_encode(ec_name);
-
-    // Parse the parameters to this encode method.
-    skipws();
-    if (_curchar == '(') {
-      next_char();                 // Move past '(' for parameters.
-
-      // Parse the encode method's parameters.
-      while (_curchar != ')') {
-        char *param = get_ident_or_literal_constant("encoding operand");
-        if (param != NULL) {
-          // Found a parameter:
-
-          // First check for constant table support.
-
-          // Check if this instruct is a MachConstantNode.
-          if (strcmp(param, "constanttablebase") == 0) {
-            // This instruct is a MachConstantNode.
-            inst.set_needs_constant_base(true);
-            if (strncmp("MachCall", inst.mach_base_class(_globalNames), strlen("MachCall")) != 0 ) {
-              inst.set_is_mach_constant(true);
-            }
-
-            if (_curchar == '(') {
-              parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument "
-                        "(only constantaddress and constantoffset)", ec_name);
-              return;
-            }
-          }
-          else if ((strcmp(param, "constantaddress") == 0) ||
-                   (strcmp(param, "constantoffset")  == 0))  {
-            // This instruct is a MachConstantNode.
-            inst.set_is_mach_constant(true);
-
-            // If the constant keyword has an argument, parse it.
-            if (_curchar == '(') constant_parse(inst);
-          }
-
-          // Else check it is a local name, add it to the list, then check for more.
-          // New: allow hex constants as parameters to an encode method.
-          // New: allow parenthesized expressions as parameters.
-          // New: allow "primary", "secondary", "tertiary" as parameters.
-          // New: allow user-defined register name as parameter.
-          else if ((inst._localNames[param] == NULL) &&
-                   !ADLParser::is_literal_constant(param) &&
-                   (Opcode::as_opcode_type(param) == Opcode::NOT_AN_OPCODE) &&
-                   ((_AD._register == NULL) || (_AD._register->getRegDef(param) == NULL))) {
-            parse_err(SYNERR, "Using non-locally defined parameter %s for encoding %s.\n", param, ec_name);
-            return;
-          }
-          params->add_entry(param);
-
-          skipws();
-          if (_curchar == ',') {
-            // More parameters to come.
-            next_char();           // Move past ',' between parameters.
-            skipws();              // Skip to next parameter.
-          } else if (_curchar == ')') {
-            // Done with parameter list
-          } else {
-            // Only ',' or ')' are valid after a parameter name.
-            parse_err(SYNERR, "expected ',' or ')' after parameter %s.\n", ec_name);
-            return;
-          }
-
-        } else {
-          skipws();
-          // Did not find a parameter.
-          if (_curchar == ',') {
-            parse_err(SYNERR, "Expected encode parameter before ',' in postalloc_expand %s.\n", ec_name);
-            return;
-          }
-          if (_curchar != ')') {
-            parse_err(SYNERR, "Expected ')' after postalloc_expand parameters.\n");
-            return;
-          }
-        }
-      } // WHILE loop collecting parameters.
-      next_char();                 // Move past ')' at end of parameters.
-    } // Done with parameter list for encoding.
-
-    // Check for ',' or ')' after encoding.
-    skipws();                      // Move to character after parameters.
-    if (_curchar != ')') {
-      // Only a ')' is allowed.
-      parse_err(SYNERR, "Expected ')' after postalloc_expand %s.\n", ec_name);
-      return;
-    }
-  } // Done parsing postalloc_expand method and their parameters.
-  if (_curchar != ')') {
-    parse_err(SYNERR, "Missing ')' at end of postalloc_expand description.\n");
-    return;
-  }
-  next_char();                     // Move past ')'.
-  skipws();                        // Skip leading whitespace.
-
-  if (_curchar != ';') {
-    parse_err(SYNERR, "Missing ';' at end of postalloc_expand.\n");
-    return;
-  }
-  next_char();                     // Move past ';'.
-  skipws();                        // Be friendly to oper_parse().
-
-  // Debug Stuff.
-  if (_AD._adl_debug > 1) fprintf(stderr, "Instruction postalloc_expand: %s\n", ec_name);
-
-  // Set encode class of this instruction.
-  inst._insencode = encrule;
-}
-
 
 //------------------------------constant_parse---------------------------------
 // Parse a constant expression.
@@ -4018,11 +3835,13 @@
 //------------------------------expand_parse-----------------------------------
 ExpandRule* ADLParser::expand_parse(InstructForm *instr) {
   char         *ident, *ident2;
+  OperandForm  *oper;
+  InstructForm *ins;
   NameAndList  *instr_and_operands = NULL;
   ExpandRule   *exp = new ExpandRule();
 
-  // Expand is a block containing an ordered list of operands with initializers,
-  // or instructions, each of which has an ordered list of operands.
+  // Expand is a block containing an ordered list of instructions, each of
+  // which has an ordered list of operands.
   // Check for block delimiter
   skipws();                        // Skip leading whitespace
   if ((_curchar != '%')
@@ -4036,30 +3855,12 @@
     if (ident == NULL) {
       parse_err(SYNERR, "identifier expected at %c\n", _curchar);
       continue;
-    }
-
-    // Check whether we should parse an instruction or operand.
+    }                              // Check that you have a valid instruction
     const Form *form = _globalNames[ident];
-    bool parse_oper = false;
-    bool parse_ins  = false;
-    if (form == NULL) {
-      skipws();
-      // Check whether this looks like an instruction specification.  If so,
-      // just parse the instruction.  The declaration of the instruction is
-      // not needed here.
-      if (_curchar == '(') parse_ins = true;
-    } else if (form->is_instruction()) {
-      parse_ins = true;
-    } else if (form->is_operand()) {
-      parse_oper = true;
-    } else {
-      parse_err(SYNERR, "instruction/operand name expected at %s\n", ident);
-      continue;
-    }
-
-    if (parse_oper) {
+    ins = form ? form->is_instruction() : NULL;
+    if (ins == NULL) {
       // This is a new operand
-      OperandForm *oper = form->is_operand();
+      oper = form ? form->is_operand() : NULL;
       if (oper == NULL) {
         parse_err(SYNERR, "instruction/operand name expected at %s\n", ident);
         continue;
@@ -4094,7 +3895,6 @@
       skipws();
     }
     else {
-      assert(parse_ins, "sanity");
       // Add instruction to list
       instr_and_operands = new NameAndList(ident);
       // Grab operands, build nameList of them, and then put into dictionary
@@ -4118,7 +3918,7 @@
           parse_err(SYNERR, "operand name expected at %s\n", ident2);
           continue;
         }
-        OperandForm *oper = form2->is_operand();
+        oper = form2->is_operand();
         if (oper == NULL && !form2->is_opclass()) {
           parse_err(SYNERR, "operand name expected at %s\n", ident2);
           continue;