From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11384 invoked by alias); 30 Mar 2011 18:09:32 -0000 Received: (qmail 11375 invoked by uid 22791); 30 Mar 2011 18:09:31 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,NO_DNS_FOR_FROM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 30 Mar 2011 18:09:26 +0000 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 30 Mar 2011 11:09:26 -0700 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([10.3.194.135]) by azsmga001.ch.intel.com with ESMTP; 30 Mar 2011 11:09:25 -0700 Received: by gnu-6.sc.intel.com (Postfix, from userid 500) id 6F54818099A; Wed, 30 Mar 2011 11:09:25 -0700 (PDT) Date: Wed, 30 Mar 2011 18:55:00 -0000 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: RFC: PATCH: Remove 26 element limit in vector Message-ID: <20110330180925.GA1243@intel.com> Reply-To: "H.J. Lu" References: <20110330150238.GA18279@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110330150238.GA18279@intel.com> User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-03/txt/msg02107.txt.bz2 On Wed, Mar 30, 2011 at 08:02:38AM -0700, H.J. Lu wrote: > Hi, > > Currently, we limit XVECEXP to 26 elements in machine description > since we use letters 'a' to 'z' to encode them. I don't see any > reason why we can't go beyond 'z'. This patch removes this restriction. > Any comments? > That was wrong. The problem is in vector elements. This patch passes bootstrap. Any comments? Thanks. H.J. --- 2011-03-30 H.J. Lu * genrecog.c (VECTOR_ELEMENT_BASE): New. (add_to_sequence): Add assert. Use VECTOR_ELEMENT_BASE to encode vector elements. (change_state): Check and support VECTOR_ELEMENT_BASE. (make_insn_sequence): Add assert. diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 74dd0a7..40e9c4d 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -465,6 +465,9 @@ extern void debug_decision (struct decision *); extern void debug_decision_list (struct decision *); + +/* The base of vector element. */ +#define VECTOR_ELEMENT_BASE 0x80 /* Create a new node in sequence after LAST. */ @@ -912,6 +915,7 @@ add_to_sequence (rtx pattern, struct decision_head *last, const char *position, /* Which insn we're looking at is represented by A-Z. We don't ever use 'A', however; it is always implied. */ + gcc_assert (i < 26); subpos[depth] = (i > 0 ? 'A' + i : 0); sub = add_to_sequence (XVECEXP (pattern, 0, i), last, subpos, insn_type, 0); @@ -1002,6 +1006,9 @@ add_to_sequence (rtx pattern, struct decision_head *last, const char *position, char base = (was_code == MATCH_OPERATOR ? '0' : 'a'); for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++) { + gcc_assert (was_code == MATCH_OPERATOR + ? ISDIGIT (i + base) + : ISLOWER (i + base)); subpos[depth] = i + base; sub = add_to_sequence (XVECEXP (pattern, 2, i), &sub->success, subpos, insn_type, 0); @@ -1102,7 +1109,9 @@ add_to_sequence (rtx pattern, struct decision_head *last, const char *position, int j; for (j = 0; j < XVECLEN (pattern, i); j++) { - subpos[depth] = 'a' + j; + int val = j + VECTOR_ELEMENT_BASE; + gcc_assert (val <= UCHAR_MAX); + subpos[depth] = val; sub = add_to_sequence (XVECEXP (pattern, i, j), &sub->success, subpos, insn_type, 0); } @@ -1779,6 +1788,10 @@ change_state (const char *oldpos, const char *newpos, const char *indent) else if (ISLOWER (newpos[depth])) printf ("%sx%d = XVECEXP (x%d, 0, %d);\n", indent, depth + 1, depth, newpos[depth] - 'a'); + else if (((unsigned char) newpos[depth]) >= VECTOR_ELEMENT_BASE) + printf ("%sx%d = XVECEXP (x%d, 0, %d);\n", + indent, depth + 1, depth, + ((unsigned char) newpos[depth]) - VECTOR_ELEMENT_BASE); else printf ("%sx%d = XEXP (x%d, %c);\n", indent, depth + 1, depth, newpos[depth]); @@ -2528,6 +2541,7 @@ make_insn_sequence (rtx insn, enum routine_type type) } XVECLEN (x, 0) = j; + gcc_assert ((j - 1) < 26); c_test_pos[0] = 'A' + j - 1; c_test_pos[1] = '\0'; }