From: Jacob Lifshay Date: Wed, 10 May 2023 01:54:26 +0000 (-0700) Subject: support FPSCR[RN] syntax that translates to FPSCR.RN X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5178364866f48cc6ddd8c18c1801a508a2d65636;p=openpower-isa.git support FPSCR[RN] syntax that translates to FPSCR.RN --- diff --git a/src/openpower/decoder/pseudo/parser.py b/src/openpower/decoder/pseudo/parser.py index a88f9934..32908b74 100644 --- a/src/openpower/decoder/pseudo/parser.py +++ b/src/openpower/decoder/pseudo/parser.py @@ -915,6 +915,37 @@ class PowerParser: raise_syntax_error("Can't do that yet", self.filename, eq_tok.lineno, eq_tok.lexpos, self.input_text) + def try_extract_name(self, atom): + if isinstance(atom, ast.Attribute): + if isinstance(atom.value, ast.Name) and atom.value.id == "self": + return atom.attr + return None + if isinstance(atom, ast.Name): + return atom.id + return None + + def try_extract_uppercase_name(self, atom): + name = self.try_extract_name(atom) + if name is None: + return None + # we want to filter out names like _123 that have no letters with + # casing at all, hence the lower() check + if name.upper() != name or name.lower() == name: + return None + return name + + def try_get_attr(self, atom, trailer): + if trailer[0] == "ATTR": + return trailer[1] + if trailer[0] != "SUBS": + return None + base_name = self.try_extract_uppercase_name(atom) + if base_name is None or base_name in SPECIAL_HELPERS: + return None + if len(trailer[1]) != 1: + return None + return self.try_extract_uppercase_name(trailer[1][0]) + def apply_trailer(self, atom, trailer, read_regs): if trailer[0] == "TLIST": # assume depth of one @@ -949,15 +980,11 @@ class PowerParser: # p[0] = ast.Printnl(ast.Tuple(p[2][1]), None, None) # else: # p[0] = ast.CallFunc(p[1], p[2][1], None, None) - elif trailer[0] == "ATTR": - #p[0] = ast.Expr(ast.Call(p[1], p[2][1], [])) - for arg in trailer[1]: - if isinstance(arg, ast.Name): - name = arg.id - if name in regs + fregs: - read_regs.add(name) - return ast.Attribute(atom, trailer[1], ast.Load()) else: + attr = self.try_get_attr(atom, trailer) + if attr is not None: + return ast.Attribute(atom, attr, ast.Load()) + assert trailer[0] == "SUBS" print("subscript atom", trailer[1]) #raise AssertionError("not implemented %s" % p[2][0]) subs = trailer[1]