[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH] scripts/decodetree.py: Fix variable-length ISA
From: |
Yoshinori Sato |
Subject: |
[Qemu-devel] [RFC PATCH] scripts/decodetree.py: Fix variable-length ISA |
Date: |
Wed, 20 Mar 2019 23:27:56 +0900 |
User-agent: |
Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (Gojō) APEL/10.8 EasyPG/1.0.0 Emacs/25.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) |
Hi.
I found some problem in tested RX instructions.
It is usable in RX instructions, but I think that there
is a better fix because I am not familiar with Python.
I fixed three point.
- Added ctx to !function args.
- Fixed group operaiton. varinsns required width field.
- Fixed symbol in decode_load_bytes args.
Thanks.
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index 150af32d65..4537fbe948 100755
--- a/scripts/decodetree.py
+++ b/scripts/decodetree.py
@@ -256,7 +256,7 @@ class FunctionField:
return self.func + '(' + str(self.base) + ')'
def str_extract(self):
- return self.func + '(' + self.base.str_extract() + ')'
+ return self.func + '(ctx, ' + self.base.str_extract() + ')'
def __eq__(self, other):
return self.func == other.func and self.base == other.base
@@ -318,7 +318,7 @@ class Format(General):
return decode_function + '_extract_' + self.name
def output_extract(self):
- output('static void ', self.extract_name(), '(',
+ output('static void ', self.extract_name(), '(DisasContext *ctx, ',
self.base.struct_name(), ' *a, ', insntype, ' insn)\n{\n')
for n, f in self.fields.items():
output(' a->', n, ' = ', f.str_extract(), ';\n')
@@ -343,7 +343,8 @@ class Pattern(General):
arg = 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, ' = ', f.str_extract(), ';\n')
output(ind, 'if (', translate_prefix, '_', self.name,
@@ -354,14 +355,16 @@ class Pattern(General):
class MultiPattern(General):
"""Class representing an overlapping set of instruction patterns"""
- def __init__(self, lineno, pats, fixb, fixm, udfm):
+ def __init__(self, name, lineno, pats, fixb, fixm, udfm, w):
self.file = input_file
+ self.name = name
self.lineno = lineno
self.pats = pats
self.base = None
self.fixedbits = fixb
self.fixedmask = fixm
self.undefmask = udfm
+ self.width = w
def __str__(self):
r = "{"
@@ -732,6 +735,7 @@ def build_multi_pattern(lineno, pats):
fixedmask = insnmask
undefmask = insnmask
+ width = 0
# Collect fixed/undefmask for all of the children.
# Move the defining lineno back to that of the first child.
@@ -740,6 +744,7 @@ def build_multi_pattern(lineno, pats):
undefmask &= p.undefmask
if p.lineno < lineno:
lineno = p.lineno
+ name = p.name
repeat = True
while repeat:
@@ -753,10 +758,14 @@ def build_multi_pattern(lineno, pats):
elif fixedbits != thisbits:
fixedmask &= ~(fixedbits ^ thisbits)
break
+ if width == 0:
+ width = p.width
+ if width != p.width:
+ error(lineno, 'width mismatch in pattern within braces')
else:
repeat = False
- mp = MultiPattern(lineno, pats, fixedbits, fixedmask, undefmask)
+ mp = MultiPattern(name, lineno, pats, fixedbits, fixedmask, undefmask,
width)
patterns.append(mp)
# end build_multi_pattern
@@ -886,7 +895,7 @@ class Tree:
# 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 = True
# Attempt to aid the compiler in producing compact switch statements.
@@ -985,7 +994,7 @@ class SizeTree:
# If we need to load more bytes to test, do so now.
if extracted < self.width:
output(ind, 'insn = ', decode_function,
- '_load_bytes(s, insn, {0}, {1});\n'
+ '_load_bytes(ctx, insn, {0}, {1});\n'
.format(extracted / 8, self.width / 8));
extracted = self.width
@@ -1039,7 +1048,7 @@ class SizeLeaf:
# If we need to load more bytes, do so now.
if extracted < self.width:
output(ind, 'insn = ', decode_function,
- '_load_bytes(s, insn, {0}, {1});\n'
+ '_load_bytes(ctx, insn, {0}, {1});\n'
.format(extracted / 8, self.width / 8));
extracted = self.width
output(ind, 'return insn;\n')
--
Yosinori Sato
- [Qemu-devel] [RFC PATCH] scripts/decodetree.py: Fix variable-length ISA,
Yoshinori Sato <=