1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env python 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdef analyze_match_table(path): 4*9880d681SAndroid Build Coastguard Worker # Extract the instruction table. 5*9880d681SAndroid Build Coastguard Worker data = open(path).read() 6*9880d681SAndroid Build Coastguard Worker start = data.index("static const MatchEntry MatchTable") 7*9880d681SAndroid Build Coastguard Worker end = data.index("\n};\n", start) 8*9880d681SAndroid Build Coastguard Worker lines = data[start:end].split("\n")[1:] 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker # Parse the instructions. 11*9880d681SAndroid Build Coastguard Worker insns = [] 12*9880d681SAndroid Build Coastguard Worker for ln in lines: 13*9880d681SAndroid Build Coastguard Worker ln = ln.split("{", 1)[1] 14*9880d681SAndroid Build Coastguard Worker ln = ln.rsplit("}", 1)[0] 15*9880d681SAndroid Build Coastguard Worker a,bc = ln.split("{", 1) 16*9880d681SAndroid Build Coastguard Worker b,c = bc.split("}", 1) 17*9880d681SAndroid Build Coastguard Worker code, string, converter, _ = [s.strip() 18*9880d681SAndroid Build Coastguard Worker for s in a.split(",")] 19*9880d681SAndroid Build Coastguard Worker items = [s.strip() for s in b.split(",")] 20*9880d681SAndroid Build Coastguard Worker _,features = [s.strip() for s in c.split(",")] 21*9880d681SAndroid Build Coastguard Worker assert string[0] == string[-1] == '"' 22*9880d681SAndroid Build Coastguard Worker string = string[1:-1] 23*9880d681SAndroid Build Coastguard Worker insns.append((code,string,converter,items,features)) 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker # For every mnemonic, compute whether or not it can have a carry setting 26*9880d681SAndroid Build Coastguard Worker # operand and whether or not it can have a predication code. 27*9880d681SAndroid Build Coastguard Worker mnemonic_flags = {} 28*9880d681SAndroid Build Coastguard Worker for insn in insns: 29*9880d681SAndroid Build Coastguard Worker mnemonic = insn[1] 30*9880d681SAndroid Build Coastguard Worker items = insn[3] 31*9880d681SAndroid Build Coastguard Worker flags = mnemonic_flags[mnemonic] = mnemonic_flags.get(mnemonic, set()) 32*9880d681SAndroid Build Coastguard Worker flags.update(items) 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker mnemonics = set(mnemonic_flags) 35*9880d681SAndroid Build Coastguard Worker ccout_mnemonics = set(m for m in mnemonics 36*9880d681SAndroid Build Coastguard Worker if 'MCK_CCOut' in mnemonic_flags[m]) 37*9880d681SAndroid Build Coastguard Worker condcode_mnemonics = set(m for m in mnemonics 38*9880d681SAndroid Build Coastguard Worker if 'MCK_CondCode' in mnemonic_flags[m]) 39*9880d681SAndroid Build Coastguard Worker noncondcode_mnemonics = mnemonics - condcode_mnemonics 40*9880d681SAndroid Build Coastguard Worker print ' || '.join('Mnemonic == "%s"' % m 41*9880d681SAndroid Build Coastguard Worker for m in ccout_mnemonics) 42*9880d681SAndroid Build Coastguard Worker print ' || '.join('Mnemonic == "%s"' % m 43*9880d681SAndroid Build Coastguard Worker for m in noncondcode_mnemonics) 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdef main(): 46*9880d681SAndroid Build Coastguard Worker import sys 47*9880d681SAndroid Build Coastguard Worker if len(sys.argv) == 1: 48*9880d681SAndroid Build Coastguard Worker import os 49*9880d681SAndroid Build Coastguard Worker from lit.Util import capture 50*9880d681SAndroid Build Coastguard Worker llvm_obj_root = capture(["llvm-config", "--obj-root"]) 51*9880d681SAndroid Build Coastguard Worker file = os.path.join(llvm_obj_root, 52*9880d681SAndroid Build Coastguard Worker "lib/Target/ARM/ARMGenAsmMatcher.inc") 53*9880d681SAndroid Build Coastguard Worker elif len(sys.argv) == 2: 54*9880d681SAndroid Build Coastguard Worker file = sys.argv[1] 55*9880d681SAndroid Build Coastguard Worker else: 56*9880d681SAndroid Build Coastguard Worker raise NotImplementedError 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker analyze_match_table(file) 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerif __name__ == '__main__': 61*9880d681SAndroid Build Coastguard Worker main() 62