Пример #1
0
 def add_pattern_for_rule(self, pattern: AstNode,
                          rule: InstructionOptimizationRule):
     layer_signature = self.layer_signature_to_key(
         pattern.get_depth_signature(self.depth))
     if len(layer_signature.replace(",",
                                    "")) == (layer_signature.count("N")):
         self.rule_resolved.append(RulePatternInfo(rule, pattern))
     else:
         if layer_signature not in self.next_layer_patterns.keys():
             self.next_layer_patterns[layer_signature] = PatternStorage(
                 self.depth + 1)
         self.next_layer_patterns[layer_signature].add_pattern_for_rule(
             pattern, rule)
Пример #2
0
 def explore_one_level(self, searched_pattern: AstNode, cur_level: int):
     # We need to check if searched_pattern is in self.next_layer_patterns
     # Easy solution: try/except self.next_layer_patterns[searched_pattern]
     # Problem is that known patterns may not exactly match the microcode instruction, e.g.
     #   -> Pattern layer 3 signature is ["L", "N", "15", "L"]
     #   -> Multiple instruction can match that: ["L", "N", "15", "L"], ["C", "N", "15", "L"], ["C", "N", "15", "13"]
     # This piece of code tries to handles that in a (semi) efficient way
     if len(self.next_layer_patterns) == 0:
         return []
     searched_layer_signature = searched_pattern.get_depth_signature(
         cur_level)
     nb_possible_signature = 2 ** (len(searched_layer_signature) - searched_layer_signature.count("N") - \
                             searched_layer_signature.count("L"))
     pattern_search_logger.debug(
         "  Layer {0}: {1} -> {2} variations (storage has {3} signature)".
         format(cur_level, searched_layer_signature, nb_possible_signature,
                len(self.next_layer_patterns)))
     matched_rule_pattern_info = []
     if nb_possible_signature < len(self.next_layer_patterns):
         pattern_search_logger.debug("  => Using method 1")
         for possible_sig in signature_generator(searched_layer_signature):
             try:
                 test_sig = self.layer_signature_to_key(possible_sig)
                 pattern_storage = self.next_layer_patterns[test_sig]
                 pattern_search_logger.info(
                     "    Compatible signature: {0} -> resolved: {1}".
                     format(test_sig, pattern_storage.rule_resolved))
                 matched_rule_pattern_info += pattern_storage.rule_resolved
                 matched_rule_pattern_info += pattern_storage.explore_one_level(
                     searched_pattern, cur_level + 1)
             except KeyError:
                 pass
     else:
         pattern_search_logger.debug("  => Using method 2")
         searched_layer_signature_key = self.layer_signature_to_key(
             searched_layer_signature)
         for test_sig, pattern_storage in self.next_layer_patterns.items():
             if self.is_layer_signature_compatible(
                     searched_layer_signature_key, test_sig):
                 pattern_search_logger.info(
                     "    Compatible signature: {0} -> resolved: {1}".
                     format(test_sig, pattern_storage.rule_resolved))
                 matched_rule_pattern_info += pattern_storage.rule_resolved
                 matched_rule_pattern_info += pattern_storage.explore_one_level(
                     searched_pattern, cur_level + 1)
     return matched_rule_pattern_info