From nobody Mon May 6 11:30:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1548969029017415.49316224395795; Thu, 31 Jan 2019 13:10:29 -0800 (PST) Received: from localhost ([127.0.0.1]:60865 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpJbK-0001Uw-Dc for importer@patchew.org; Thu, 31 Jan 2019 16:10:22 -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) 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) 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-Google-Smtp-Source: ALg8bN6a/uRCFgXdKgoR8A7uOYA8lw/IfMYVMEsCC7AJhd2IeCb/id/H5op3B+vkuZytV09pOlPo0w== X-Received: by 2002:aa7:8758:: with SMTP id g24mr35653343pfo.250.1548968934896; 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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(-) 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 =20 insnwidth =3D 32 insnmask =3D 0xffffffff +variablewidth =3D False fields =3D {} arguments =3D {} formats =3D {} @@ -420,7 +421,7 @@ class Arguments: =20 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 =3D name self.file =3D input_file self.lineno =3D lineno @@ -430,6 +431,7 @@ class General: self.undefmask =3D udfm self.fieldmask =3D fldm self.fields =3D flds + self.width =3D w =20 def __str__(self): r =3D self.name @@ -597,7 +599,7 @@ def infer_argument_set(flds): return arg =20 =20 -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 !=3D fmt.fieldmask: continue + if width !=3D 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 =3D infer_argument_set(flds) =20 - fmt =3D Format(name, 0, arg, 0, 0, 0, fieldmask, var_flds) + fmt =3D Format(name, 0, arg, 0, 0, 0, fieldmask, var_flds, width) formats[name] =3D fmt =20 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 =20 fixedmask =3D 0 fixedbits =3D 0 @@ -725,8 +730,15 @@ def parse_generic(lineno, is_format, name, toks): error(lineno, 'invalid token "{0}"'.format(t)) width +=3D shift =20 + if variablewidth and width < insnwidth and width % 8 =3D=3D 0: + shift =3D insnwidth - width + fixedbits <<=3D shift + fixedmask <<=3D shift + undefmask <<=3D shift + undefmask |=3D (1 << shift) - 1 + # We should have filled in all of the bits of the instruction. - if not (is_format and width =3D=3D 0) and width !=3D insnwidth: + elif not (is_format and width =3D=3D 0) and width !=3D insnwidth: error(lineno, 'definition has {0} bits'.format(width)) =20 # 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 =3D Format(name, lineno, arg, fixedbits, fixedmask, - undefmask, fieldmask, flds) + undefmask, fieldmask, flds, width) formats[name] =3D 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 bit= s') + if width !=3D fmt.width: + error(lineno, 'pattern uses format of different width') fieldmask |=3D fmt.fieldmask fixedbits |=3D fmt.fixedbits fixedmask |=3D fmt.fixedmask undefmask |=3D fmt.undefmask else: - (fmt, flds) =3D infer_format(arg, fieldmask, flds) + (fmt, flds) =3D infer_format(arg, fieldmask, flds, width) arg =3D 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 =3D Pattern(name, lineno, fmt, fixedbits, fixedmask, - undefmask, fieldmask, flds) + undefmask, fieldmask, flds, width) patterns.append(pat) =20 # Validate the masks that we have assembled. @@ -987,12 +1001,14 @@ def main(): global insntype global insnmask global decode_function + global variablewidth =20 decode_scope =3D 'static ' =20 - long_opts =3D ['decode=3D', 'translate=3D', 'output=3D', 'insnwidth=3D= '] + long_opts =3D ['decode=3D', 'translate=3D', + 'output=3D', 'insnwidth=3D', 'varinsnwidth=3D'] try: - (opts, args) =3D getopt.getopt(sys.argv[1:], 'o:w:', long_opts) + (opts, args) =3D 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 =3D=3D '--translate': translate_prefix =3D a translate_scope =3D '' - elif o in ('-w', '--insnwidth'): + elif o in ('-w', '--insnwidth', '--varinsnwidth'): + if o =3D=3D '--varinsnwidth': + variablewidth =3D True insnwidth =3D int(a) if insnwidth =3D=3D 16: insntype =3D 'uint16_t' --=20 2.17.2 From nobody Mon May 6 11:30:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1548969032205479.08066266295646; Thu, 31 Jan 2019 13:10:32 -0800 (PST) Received: from localhost ([127.0.0.1]:60867 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpJbL-0001VX-Ve for importer@patchew.org; Thu, 31 Jan 2019 16:10:24 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39231) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gpJZz-0000j8-0l for qemu-devel@nongnu.org; Thu, 31 Jan 2019 16:09:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gpJZx-0008CE-RY for qemu-devel@nongnu.org; Thu, 31 Jan 2019 16:08:59 -0500 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:46599) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gpJZx-0008BI-Jp for qemu-devel@nongnu.org; Thu, 31 Jan 2019 16:08:57 -0500 Received: by mail-pg1-x541.google.com with SMTP id w7so1870018pgp.13 for ; Thu, 31 Jan 2019 13:08:57 -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.55 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 31 Jan 2019 13:08:55 -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=HrvOtBgvHPXvbREalrTaMMnuhyKoR1EFaApo8LZ33YI=; b=UrpyCW0QsuxTZPPLBKC7O6LdMnTXlt3kW3Gnx3YGdzhvDCRtFTfuTosSgeBYAV1UWb 7O3TY9/V/HR119kkOO0NYQGyc2YeiBZsVXGyPukX1pWWc9G4WCaI7ThH1xNwz/jOQWaf XLJgGseaRCbR9uEovkznZ+LzUkySYroFiQYgc= 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=HrvOtBgvHPXvbREalrTaMMnuhyKoR1EFaApo8LZ33YI=; b=tlFJKxYpR1rTosS8SQ0cl3sQw8lqXuo1s+oqV5MumCxJnWeNMqkSqU4yJMbS9sUGDa XRVd1QxVEkOBDUWu7zdlBAvdL+IKU6azPg/NcqzHc+ubKIv7ezrJUtkxraK31PuoxQO5 ziJQ01vw2vgR+ariLfPNrMwM78ioHJ0JgA5vdBxpvXWkCthh/RFcfjE089DxQe3v1qU0 02UfaK/i6wn4uv691CsY5EPETAgRkS6sLwPxnzbOftkI/EKR3tLk618beqIwvCcU9v0x lhm9Ax9m5VpaiB6Hn8D1erRIHOsQQkDZpJlbbQE7zVX+//yeCZZ7rLZYZ46pPRKPpl3e ZxsA== X-Gm-Message-State: AJcUukdr8gQnrBrW4/LDr+0gkocaifh9Yhd2pphu8lTFm4c5itJWkEhI ojHMKh5Zur4qMpXc9ztUWO8kv1+BOrg= X-Google-Smtp-Source: ALg8bN6+zlVzPuPUzN/7ahcfLjbTwg0S0CYWybeL4L6YERII98ZcS6jVy74H4+xx3JGmdM78ot5lHw== X-Received: by 2002:a63:c10f:: with SMTP id w15mr32687729pgf.199.1548968936107; Thu, 31 Jan 2019 13:08:56 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 31 Jan 2019 13:08:51 -0800 Message-Id: <20190131210851.9842-3-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::541 Subject: [Qemu-devel] [PATCH 2/2] decodetree: Expand a decode_load function 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Read the instruction, loading no more bytes than necessary. Signed-off-by: Richard Henderson --- scripts/decodetree.py | 175 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 3 deletions(-) diff --git a/scripts/decodetree.py b/scripts/decodetree.py index 5fb0acaa15..05b6b3d18b 100755 --- a/scripts/decodetree.py +++ b/scripts/decodetree.py @@ -966,6 +966,147 @@ def build_tree(pats, outerbits, outermask): # end build_tree =20 =20 +class SizeTree: + """Class representing a node in a size decode tree""" + + def __init__(self, m, w): + self.mask =3D m + self.subs =3D [] + self.base =3D None + self.width =3D w + + def str1(self, i): + ind =3D str_indent(i) + r =3D '{0}{1:08x}'.format(ind, self.mask) + r +=3D ' [\n' + for (b, s) in self.subs: + r +=3D '{0} {1:08x}:\n'.format(ind, b) + r +=3D s.str1(i + 4) + '\n' + r +=3D ind + ']' + return r + + def __str__(self): + return self.str1(0) + + def output_code(self, i, extracted, outerbits, outermask): + ind =3D str_indent(i) + + # If we need to load more bytes to test, do so now. + if extracted < self.width: + output(ind, 'insn =3D ', decode_function, + '_load_bytes(s, insn, {0}, {1});\n' + .format(extracted / 8, self.width / 8)); + extracted =3D self.width + + # Attempt to aid the compiler in producing compact switch statemen= ts. + # If the bits in the mask are contiguous, extract them. + sh =3D is_contiguous(self.mask) + if sh > 0: + # Propagate SH down into the local functions. + def str_switch(b, sh=3Dsh): + return '(insn >> {0}) & 0x{1:x}'.format(sh, b >> sh) + + def str_case(b, sh=3Dsh): + return '0x{0:x}'.format(b >> sh) + else: + def str_switch(b): + return 'insn & 0x{0:08x}'.format(b) + + def str_case(b): + return '0x{0:08x}'.format(b) + + output(ind, 'switch (', str_switch(self.mask), ') {\n') + for b, s in sorted(self.subs): + innermask =3D outermask | self.mask + innerbits =3D outerbits | b + output(ind, 'case ', str_case(b), ':\n') + output(ind, ' /* ', + str_match_bits(innerbits, innermask), ' */\n') + s.output_code(i + 4, extracted, innerbits, innermask) + output(ind, '}\n') + output(ind, 'return insn;\n') +# end SizeTree + +class SizeLeaf: + """Class representing a leaf node in a size decode tree""" + + def __init__(self, m, w): + self.mask =3D m + self.width =3D w + + def str1(self, i): + ind =3D str_indent(i) + return '{0}{1:08x}'.format(ind, self.mask) + + def __str__(self): + return self.str1(0) + + def output_code(self, i, extracted, outerbits, outermask): + global decode_function + ind =3D str_indent(i) + + # If we need to load more bytes, do so now. + if extracted < self.width: + output(ind, 'insn =3D ', decode_function, + '_load_bytes(s, insn, {0}, {1});\n' + .format(extracted / 8, self.width / 8)); + extracted =3D self.width + output(ind, 'return insn;\n') +# end SizeLeaf + + +def build_size_tree(pats, width, outerbits, outermask): + global insnwidth + + # Collect the mask of bits that are fixed in this width + innermask =3D 0xff << (insnwidth - width) + innermask &=3D ~outermask + minwidth =3D None + onewidth =3D True + for i in pats: + innermask &=3D i.fixedmask + if minwidth is None: + minwidth =3D i.width + elif minwidth !=3D i.width: + onewidth =3D False; + if minwidth < i.width: + minwidth =3D i.width + + if onewidth: + return SizeLeaf(innermask, minwidth) + + if innermask =3D=3D 0: + if width < minwidth: + return build_size_tree(pats, width + 8, outerbits, outermask) + + pnames =3D [] + for p in pats: + pnames.append(p.name + ':' + p.file + ':' + str(p.lineno)) + error_with_file(pats[0].file, pats[0].lineno, + 'overlapping patterns size {0}:'.format(width), pn= ames) + + bins =3D {} + for i in pats: + fb =3D i.fixedbits & innermask + if fb in bins: + bins[fb].append(i) + else: + bins[fb] =3D [i] + + fullmask =3D outermask | innermask + lens =3D sorted(bins.keys()) + if len(lens) =3D=3D 1: + b =3D lens[0] + return build_size_tree(bins[b], width + 8, b | outerbits, fullmask) + + r =3D SizeTree(innermask, width) + for b, l in bins.items(): + s =3D build_size_tree(l, width, b | outerbits, fullmask) + r.subs.append((b, s)) + return r +# end build_size_tree + + def prop_format(tree): """Propagate Format objects into the decode tree""" =20 @@ -988,6 +1129,23 @@ def prop_format(tree): # end prop_format =20 =20 +def prop_size(tree): + """Propagate minimum widths up the decode size tree""" + + if isinstance(tree, SizeTree): + min =3D None + for (b, s) in tree.subs: + width =3D prop_size(s) + if min is None or min > width: + min =3D width + assert min >=3D tree.width + tree.width =3D min + else: + min =3D tree.width + return min +# end prop_size + + def main(): global arguments global formats @@ -1040,8 +1198,12 @@ def main(): parse_file(f) f.close() =20 - t =3D build_tree(patterns, 0, 0) - prop_format(t) + if variablewidth: + stree =3D build_size_tree(patterns, 8, 0, 0) + prop_size(stree) + + dtree =3D build_tree(patterns, 0, 0) + prop_format(dtree) =20 if output_file: output_fd =3D open(output_file, 'w') @@ -1081,10 +1243,17 @@ def main(): output(i4, i4, f.struct_name(), ' f_', f.name, ';\n') output(i4, '} u;\n\n') =20 - t.output_code(4, False, 0, 0) + dtree.output_code(4, False, 0, 0) =20 output('}\n') =20 + if variablewidth: + output('\n', decode_scope, insntype, ' ', decode_function, + '_load(DisasContext *ctx)\n{\n', + ' ', insntype, ' insn =3D 0;\n\n') + stree.output_code(4, 0, 0, 0) + output('}\n') + if output_file: output_fd.close() # end main --=20 2.17.2 From nobody Mon May 6 11:30:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1551508876995389.68467389151124; Fri, 1 Mar 2019 22:41:16 -0800 (PST) Received: from localhost ([127.0.0.1]:49320 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gzyKc-0004Yg-NK for importer@patchew.org; Sat, 02 Mar 2019 01:41:10 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58057) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gzyJa-00042S-Dc for qemu-devel@nongnu.org; Sat, 02 Mar 2019 01:40:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gzyJS-0004Yc-LZ for qemu-devel@nongnu.org; Sat, 02 Mar 2019 01:40:02 -0500 Received: from mail03.asahi-net.or.jp ([202.224.55.15]:38393) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gzyJI-0004LH-2x for qemu-devel@nongnu.org; Sat, 02 Mar 2019 01:39:49 -0500 Received: from h61-195-96-97.vps.ablenet.jp (h61-195-96-97.vps.ablenet.jp [61.195.96.97]) (Authenticated sender: PQ4Y-STU) by mail03.asahi-net.or.jp (Postfix) with ESMTPA id 559A12F95E; Sat, 2 Mar 2019 15:39:40 +0900 (JST) Received: from ysato.dip.jp (ZM005235.ppp.dion.ne.jp [222.8.5.235]) by h61-195-96-97.vps.ablenet.jp (Postfix) with ESMTPSA id 66706240089; Sat, 2 Mar 2019 15:39:39 +0900 (JST) From: Yoshinori Sato To: qemu-devel@nongnu.org, Richard Henderson Date: Sat, 2 Mar 2019 15:39:26 +0900 Message-Id: <20190302063926.11488-1-ysato@users.sourceforge.jp> X-Mailer: git-send-email 2.11.0 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: 202.224.55.15 Subject: [Qemu-devel] [PATCH] decodetree: Add DisasContext to function part 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: Yoshinori Sato Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" OK. RX decoder works fine. Since it is necessary to read additional bytes in the function of the operand, we need to have DisasContext passed as an argument. > %b2_li_2 18:2 !function=3Dli "li" read more extra byte. It use cpu_env in DisasContext. Signed-off-by: Yoshinori Sato --- scripts/decodetree.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/scripts/decodetree.py b/scripts/decodetree.py index e23d43e354..fa9a75ccad 100755 --- a/scripts/decodetree.py +++ b/scripts/decodetree.py @@ -387,7 +387,11 @@ class FunctionField: return self.func + '(' + str(self.base) + ')' =20 def str_extract(self): - return self.func + '(' + self.base.str_extract() + ')' + if variablewidth: + ctx =3D 'ctx, ' + else: + ctx =3D '' + return self.func + '(' + ctx + self.base.str_extract() + ')' =20 def __eq__(self, other): return self.func =3D=3D other.func and self.base =3D=3D other.base @@ -454,7 +458,11 @@ class Format(General): return 'extract_' + self.name =20 def output_extract(self): - output('static void ', self.extract_name(), '(', + if variablewidth: + ctx_p =3D 'DisasContext *ctx, ' + else: + ctx_p =3D '' + output('static void ', self.extract_name(), '(' + ctx_p, self.base.struct_name(), ' *a, ', insntype, ' insn)\n{\n') for n, f in self.fields.items(): output(' a->', n, ' =3D ', f.str_extract(), ';\n') @@ -468,10 +476,14 @@ class Pattern(General): def output_decl(self): global translate_scope global translate_prefix + if variablewidth: + ctx_p =3D 'DisasContext *ctx, ' + else: + ctx_p =3D '' output('typedef ', self.base.base.struct_name(), ' arg_', self.name, ';\n') output(translate_scope, 'bool ', translate_prefix, '_', self.name, - '(DisasContext *ctx, arg_', self.name, ' *a);\n') + '(', ctx_p, 'arg_', self.name, ' *a);\n') =20 def output_code(self, i, extracted, outerbits, outermask): global translate_prefix @@ -479,7 +491,8 @@ class Pattern(General): arg =3D self.base.base.name output(ind, '/* ', self.file, ':', str(self.lineno), ' */\n') if not extracted: - output(ind, self.base.extract_name(), '(&u.f_', arg, ', insn);= \n') + output(ind, self.base.extract_name(), + '(ctx, &u.f_', arg, ', insn);\n') for n, f in self.fields.items(): output(ind, 'u.f_', arg, '.', n, ' =3D ', f.str_extract(), ';\= n') output(ind, 'return ', translate_prefix, '_', self.name, @@ -890,11 +903,16 @@ class Tree: def output_code(self, i, extracted, outerbits, outermask): ind =3D str_indent(i) =20 + if variablewidth: + ctx =3D 'ctx, ' + else: + ctx =3D '' # If we identified all nodes below have the same format, # extract the fields now. if not extracted and self.base: output(ind, self.base.extract_name(), - '(&u.f_', self.base.base.name, ', insn);\n') + '(', ctx, '&u.f_', self.base.base.name, + ', insn);\n') extracted =3D True =20 # Attempt to aid the compiler in producing compact switch statemen= ts. @@ -994,7 +1012,7 @@ class SizeTree: # If we need to load more bytes to test, do so now. if extracted < self.width: output(ind, 'insn =3D ', decode_function, - '_load_bytes(s, insn, {0}, {1});\n' + '_load_bytes(ctx, insn, {0}, {1});\n' .format(extracted / 8, self.width / 8)); extracted =3D self.width =20 @@ -1048,7 +1066,7 @@ class SizeLeaf: # If we need to load more bytes, do so now. if extracted < self.width: output(ind, 'insn =3D ', decode_function, - '_load_bytes(s, insn, {0}, {1});\n' + '_load_bytes(ctx, insn, {0}, {1});\n' .format(extracted / 8, self.width / 8)); extracted =3D self.width output(ind, 'return insn;\n') --=20 2.11.0