1#!/usr/bin/python
2# print out all registers from LLVM GenRegisterInfo.inc for Capstone disassembler.
3# NOTE: the list then must be filtered, manually.
4# by Nguyen Anh Quynh, 2019
5
6import sys
7
8if len(sys.argv) == 1:
9    print("Syntax: %s <GenRegisterInfo.inc> <architecture>" %sys.argv[0])
10    sys.exit(1)
11
12f = open(sys.argv[1])
13lines = f.readlines()
14f.close()
15
16arch = sys.argv[2].upper()
17
18enum_count = 0
19
20# 1st enum is register enum
21for line in lines:
22    line = line.rstrip()
23
24    if len(line.strip()) == 0:
25        continue
26
27    if line.strip() == 'enum {':
28        enum_count += 1
29        continue
30
31    if enum_count == 1:
32        if line == '};':
33            # done with first enum
34            break
35        else:
36            # enum items
37            if 'NoRegister' in line or 'TARGET_REGS' in line:
38                continue
39            reg = line.strip().split('=')[0].strip()
40            if reg.startswith('H') or reg.endswith('PH') or or reg.endswith('IH') or or reg.endswith('WH'):
41                print("  %s_REG_%s = REMOVE," %(arch, reg))
42            elif 'K' in reg or 'BND' in reg:
43                print("  %s_REG_%s = REMOVE," %(arch, reg))
44            elif reg in ('DF', 'SSP', 'R8BH', 'R9BH', 'R10BH', 'R11BH', 'R12BH', 'R13BH', 'R14BH', 'R15BH'):
45                print("  %s_REG_%s = REMOVE," %(arch, reg))
46            else:
47                print("  %s_REG_%s," %(arch, reg))
48
49