power_insn: fix opcode-based lookups
authorDmitry Selyutin <ghostmansd@gmail.com>
Wed, 17 Aug 2022 11:48:50 +0000 (14:48 +0300)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 29 Aug 2022 19:38:10 +0000 (20:38 +0100)
src/openpower/decoder/power_insn.py

index 824aff147a05cb06859914bda01f73f7a93891cc..bc2cecc0e58a20614bcd2233653caf28c3f6f868 100644 (file)
@@ -618,17 +618,31 @@ class Database:
     def __iter__(self):
         yield from self.__items
 
+    @_functools.lru_cache(maxsize=None)
     def __contains__(self, key):
         if isinstance(key, int):
             return self.__opcodes.__contains__(key)
+        elif isinstance(key, int):
+            for (opcode, insn) in self.__opcodes.items():
+                if ((opcode.value & opcode.mask) ==
+                        (key & opcode.mask)):
+                    return True
+            return False
         elif isinstance(key, str):
             return self.__names.__contains__(key)
         else:
             raise KeyError(key)
 
+    @_functools.lru_cache(maxsize=None)
     def __getitem__(self, key):
-        if isinstance(key, int):
+        if isinstance(key, Opcode):
             return self.__opcodes.__getitem__(key)
+        elif isinstance(key, int):
+            for (opcode, insn) in self.__opcodes.items():
+                if ((opcode.value & opcode.mask) ==
+                        (key & opcode.mask)):
+                    return insn
+            raise KeyError(key)
         elif isinstance(key, str):
             return self.__names.__getitem__(key)
         else: