From patchwork Thu Jan 31 21:08:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 157159 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp7689361jaa; Thu, 31 Jan 2019 13:09:15 -0800 (PST) X-Google-Smtp-Source: ALg8bN6jk29XlkJGOuXIOeL6xhy6jivrfQP+T8zBaqY39n/JRketXh8jPnRvEAUmvumAtfCVG+wp X-Received: by 2002:a81:6e43:: with SMTP id j64mr35394539ywc.171.1548968955114; Thu, 31 Jan 2019 13:09:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548968955; cv=none; d=google.com; s=arc-20160816; b=vIR40ZmFOVQeD0lY4nOzRG+kW2eLGVeQBY31zIc0uuWV3Tl22kp4jkWB9xQ0mR414A +8YPwvjtPWdsCMA26bMGUq2falpef7tN96R31ubbwNNdgIhynW6jiWncnQDWcvRh0PU4 F1BWRNHuf3aVAO6a7CgsFPuWgcE2YQWAsdNXJCt4+02BsD1yLUhziSyB0M4t9EA/TQR7 x6d0BVjO+lWvRzpntD9+olYz0QmuOMpyGmkZWbf7Vc4qxFx2Hwb+WLLmv5DB+sLwpG32 tEVFuo8L3TGEZJXj9ASSlqmlro2ZQD9VORqpLWnM3N5VOhPgqQoGZgKL3HotUBjdO09/ sUZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:dkim-signature; bh=S31DKu0mZOkrs3M7J/A2evOJI3LY5m9uL/909EEUJnk=; b=WW7uFBcCZbL/HRAgn2o6IXc6eODYDB9h0gkpSHM1jZiOyHSRKF2KKgNLWL+cL4jjUO lCcO9KZhYIG0KjoxP9Vfzmnp6qyA18tJN/T4ncBxXrN/KN6R3R7cus+4ewVrxT7rO0+m +RWXb+xyhFnSszbgN/isNgwkByQ3FeCWPFP47F6A7GLhZHeSZML0axCuhu5qg5qmvRJe 5qrwTmIitRBLpSu9P/Axa9KBAxOdBEutqn7tVbdMZkWw1D4DY6fjVqAKauIqh/Ua4cd0 GOEYJoKEHLrdOoN4llWZNllb6JLIoYc5zhzX4lDCzaOQoyT1IZGx6mdsbKMe/bMKqvyp 07Hg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=PT8Y2a19; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id o8si3401294ywb.348.2019.01.31.13.09.14 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 31 Jan 2019 13:09:15 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=PT8Y2a19; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1]:60858 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpJaE-0000ka-KH for patch@linaro.org; Thu, 31 Jan 2019 16:09:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39225) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpJZy-0000j3-NQ for qemu-devel@nongnu.org; Thu, 31 Jan 2019 16:08:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gpJZx-0008C1-Mj for qemu-devel@nongnu.org; Thu, 31 Jan 2019 16:08:58 -0500 Received: from mail-pg1-x531.google.com ([2607:f8b0:4864:20::531]:47002) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gpJZx-00088K-6m for qemu-devel@nongnu.org; Thu, 31 Jan 2019 16:08:57 -0500 Received: by mail-pg1-x531.google.com with SMTP id w7so1869994pgp.13 for ; Thu, 31 Jan 2019 13:08:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=S31DKu0mZOkrs3M7J/A2evOJI3LY5m9uL/909EEUJnk=; b=PT8Y2a19lT5AK0P11rkVrHIFFBrWOw96FAjGPhD5yBhHG9SHX0DvKXXgYnzsXzW45x VaMqthq9wRoAY0JQsxUTA4hHkl/fDeimDz+ez1PYjEWfLlxEncLgzqwP2kjFtht64tzj o0x5DSYE/wB+IJ4hM2h+/OjmDtzFHYVfMihR8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=S31DKu0mZOkrs3M7J/A2evOJI3LY5m9uL/909EEUJnk=; b=XP9pP6Dcxx4J6IDITNWeY13KlLVWCkggFfbtw7Oz8B56zgUDDJ8h/VlUuAfdifCVZL c6NfRT4Q/XG8sOkDheMwDtJz4vBxf5b0v24mieA/it4GKTS62VDwz1/igyWRe/PwjFZc CgB/zCk0Fc4Ed06df4V++dGLcX/wG8oTT78yInIls42qod8HIEcCXRHxPv5IBOPhI724 RJ+M3CNaESP0yIDXHprwlyXibaqiNKxeTUXAc/jogr9Q6MIV5apX9xp3XdCE3op0JYcL PpYbLr5Kj3AB270e17MkHJx/H06/WsSAIX7FNqM1BIUMdBjn3JOCpA60t4jaGUGxDSG+ ICDg== X-Gm-Message-State: AJcUukc9EcJqvaxiX8iZR6NcPi40nhAxmSj7bs792C5YA0Wlw3oi2zNK gxWDbrc1DQ3wiFa1wyH5DYhbZPgWe8U= X-Received: by 2002:aa7:8758:: with SMTP id g24mr35653343pfo.250.1548968934896; Thu, 31 Jan 2019 13:08:54 -0800 (PST) Received: from cloudburst.twiddle.net (97-126-115-157.tukw.qwest.net. [97.126.115.157]) by smtp.gmail.com with ESMTPSA id z62sm11924391pfl.33.2019.01.31.13.08.53 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 31 Jan 2019 13:08:54 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 31 Jan 2019 13:08:50 -0800 Message-Id: <20190131210851.9842-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190131210851.9842-1-richard.henderson@linaro.org> References: <20190131210851.9842-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::531 Subject: [Qemu-devel] [PATCH 1/2] decodetree: Initial support for variable-length ISAs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ysato@users.sourceforge.jp Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Assuming that the ISA clearly describes how to determine the length of the instruction, and the ISA has a reasonable maximum instruction length, the input to the decoder can be right-justified in an appropriate insn word. This is not 100% convenient, as out-of-line %fields are numbered relative to the maximum instruction length, but this appears to still be usable. Signed-off-by: Richard Henderson --- scripts/decodetree.py | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) -- 2.17.2 diff --git a/scripts/decodetree.py b/scripts/decodetree.py index 2f8b5a1c92..5fb0acaa15 100755 --- a/scripts/decodetree.py +++ b/scripts/decodetree.py @@ -159,6 +159,7 @@ import getopt insnwidth = 32 insnmask = 0xffffffff +variablewidth = False fields = {} arguments = {} formats = {} @@ -420,7 +421,7 @@ class Arguments: class General: """Common code between instruction formats and instruction patterns""" - def __init__(self, name, lineno, base, fixb, fixm, udfm, fldm, flds): + def __init__(self, name, lineno, base, fixb, fixm, udfm, fldm, flds, w): self.name = name self.file = input_file self.lineno = lineno @@ -430,6 +431,7 @@ class General: self.undefmask = udfm self.fieldmask = fldm self.fields = flds + self.width = w def __str__(self): r = self.name @@ -597,7 +599,7 @@ def infer_argument_set(flds): return arg -def infer_format(arg, fieldmask, flds): +def infer_format(arg, fieldmask, flds, width): global arguments global formats global decode_function @@ -616,6 +618,8 @@ def infer_format(arg, fieldmask, flds): continue if fieldmask != fmt.fieldmask: continue + if width != fmt.width: + continue if not eq_fields_for_fmts(flds, fmt.fields): continue return (fmt, const_flds) @@ -624,7 +628,7 @@ def infer_format(arg, fieldmask, flds): if not arg: arg = infer_argument_set(flds) - fmt = Format(name, 0, arg, 0, 0, 0, fieldmask, var_flds) + fmt = Format(name, 0, arg, 0, 0, 0, fieldmask, var_flds, width) formats[name] = fmt return (fmt, const_flds) @@ -640,6 +644,7 @@ def parse_generic(lineno, is_format, name, toks): global re_ident global insnwidth global insnmask + global variablewidth fixedmask = 0 fixedbits = 0 @@ -725,8 +730,15 @@ def parse_generic(lineno, is_format, name, toks): error(lineno, 'invalid token "{0}"'.format(t)) width += shift + if variablewidth and width < insnwidth and width % 8 == 0: + shift = insnwidth - width + fixedbits <<= shift + fixedmask <<= shift + undefmask <<= shift + undefmask |= (1 << shift) - 1 + # We should have filled in all of the bits of the instruction. - if not (is_format and width == 0) and width != insnwidth: + elif not (is_format and width == 0) and width != insnwidth: error(lineno, 'definition has {0} bits'.format(width)) # Do not check for fields overlaping fields; one valid usage @@ -752,7 +764,7 @@ def parse_generic(lineno, is_format, name, toks): if name in formats: error(lineno, 'duplicate format name', name) fmt = Format(name, lineno, arg, fixedbits, fixedmask, - undefmask, fieldmask, flds) + undefmask, fieldmask, flds, width) formats[name] = fmt else: # Patterns can reference a format ... @@ -762,12 +774,14 @@ def parse_generic(lineno, is_format, name, toks): error(lineno, 'pattern specifies both format and argument set') if fixedmask & fmt.fixedmask: error(lineno, 'pattern fixed bits overlap format fixed bits') + if width != fmt.width: + error(lineno, 'pattern uses format of different width') fieldmask |= fmt.fieldmask fixedbits |= fmt.fixedbits fixedmask |= fmt.fixedmask undefmask |= fmt.undefmask else: - (fmt, flds) = infer_format(arg, fieldmask, flds) + (fmt, flds) = infer_format(arg, fieldmask, flds, width) arg = fmt.base for f in flds.keys(): if f not in arg.fields: @@ -779,7 +793,7 @@ def parse_generic(lineno, is_format, name, toks): if f not in flds.keys() and f not in fmt.fields.keys(): error(lineno, 'field {0} not initialized'.format(f)) pat = Pattern(name, lineno, fmt, fixedbits, fixedmask, - undefmask, fieldmask, flds) + undefmask, fieldmask, flds, width) patterns.append(pat) # Validate the masks that we have assembled. @@ -987,12 +1001,14 @@ def main(): global insntype global insnmask global decode_function + global variablewidth decode_scope = 'static ' - long_opts = ['decode=', 'translate=', 'output=', 'insnwidth='] + long_opts = ['decode=', 'translate=', + 'output=', 'insnwidth=', 'varinsnwidth='] try: - (opts, args) = getopt.getopt(sys.argv[1:], 'o:w:', long_opts) + (opts, args) = getopt.getopt(sys.argv[1:], 'o:vw:', long_opts) except getopt.GetoptError as err: error(0, err) for o, a in opts: @@ -1004,7 +1020,9 @@ def main(): elif o == '--translate': translate_prefix = a translate_scope = '' - elif o in ('-w', '--insnwidth'): + elif o in ('-w', '--insnwidth', '--varinsnwidth'): + if o == '--varinsnwidth': + variablewidth = True insnwidth = int(a) if insnwidth == 16: insntype = 'uint16_t'