blob: 1e6fb67803c36b287cc0d53dd0289adbac893d04 [file] [log] [blame]
Nguyen Anh Quynhde8dd262015-06-28 12:18:13 +08001#!/usr/bin/python
2# By Nguyen Anh Quynh, 2015
3# This tool extract sizes of immediadte operands from X86 instruction names.
4# Syntax: ./autogen_x86imm.py
5
6# Gather immediate sizes to put into X86ImmSize.inc
7OUTPUT = "../arch/X86/X86ImmSize.inc"
8
9f = open("../arch/X86/X86GenInstrInfo.inc")
10f2 = open(OUTPUT, "w")
11for line in f.readlines():
12 tmp = line.strip().split("=")
13 if len(tmp) == 2: # X86_xxx = nnn,
14 name = tmp[0].strip()
15 if name == "X86_INSTRUCTION_LIST_END": # no more instructions
16 break
17 if name.endswith("_DB"): # pseudo instruction
18 continue
Nguyen Anh Quynhde6fa912015-06-28 13:14:36 +080019 if "_LOCK_" in name or "BEXTR" in name: # exception
Nguyen Anh Quynhde8dd262015-06-28 12:18:13 +080020 continue
21 if name.startswith("X86_"): # instruction
Nguyen Anh Quynhfec23ae2015-06-30 20:49:55 +080022 if name.endswith("16mi8"):
23 f2.write("{2, %s},\n" %name)
24 elif name.endswith("16ri8"):
25 f2.write("{2, %s},\n" %name)
26 elif name.endswith("32ri8"):
27 f2.write("{4, %s},\n" %name)
28 elif name.endswith("32mi8"):
29 f2.write("{4, %s},\n" %name)
30 elif name.endswith("64i32"):
31 f2.write("{8, %s},\n" %name)
32 elif name.endswith("64mi32"):
33 f2.write("{8, %s},\n" %name)
34 elif name.endswith("64ri32"):
35 f2.write("{8, %s},\n" %name)
36 elif name.endswith("64ri8"):
37 f2.write("{8, %s},\n" %name)
38 elif name.endswith("64mi8"):
39 f2.write("{8, %s},\n" %name)
40 elif name.endswith("16rmi8"):
41 f2.write("{2, %s},\n" %name)
42 elif name.endswith("32rmi8"):
43 f2.write("{4, %s},\n" %name)
44 elif name.endswith("16rri8"):
45 f2.write("{2, %s},\n" %name)
46 elif name.endswith("32rri8"):
47 f2.write("{4, %s},\n" %name)
48 elif name.endswith("64rmi8"):
49 f2.write("{8, %s},\n" %name)
50 elif name.endswith("64rmi32"):
51 f2.write("{8, %s},\n" %name)
52 elif name.endswith("64rri32"):
53 f2.write("{8, %s},\n" %name)
54 elif name.endswith("64rri8"):
55 f2.write("{8, %s},\n" %name)
56 elif name.endswith("32ri64"): # special case
57 f2.write("{8, %s},\n" %name)
58 elif name.endswith("16i8"): # special case
59 f2.write("{2, %s},\n" %name)
60 elif name.endswith("32i8"): # special case
61 f2.write("{4, %s},\n" %name)
62 elif name.endswith("64i16"): # special case
63 f2.write("{8, %s},\n" %name)
64 elif name.endswith("64i8"): # special case
65 f2.write("{8, %s},\n" %name)
66
67 elif name.endswith("i8") or "i8_" in name:
Nguyen Anh Quynhde8dd262015-06-28 12:18:13 +080068 f2.write("{1, %s},\n" %name)
69 elif "8ri" in name or "8mi" in name:
70 f2.write("{1, %s},\n" %name)
71
72 elif name.endswith("i16") or "i16_" in name:
73 f2.write("{2, %s},\n" %name)
74 elif "16ri" in name or "16mi" in name:
75 f2.write("{2, %s},\n" %name)
76
77 elif name.endswith("i32") or "i32_" in name:
78 f2.write("{4, %s},\n" %name)
79 elif "32ri" in name or "32mi" in name:
80 f2.write("{4, %s},\n" %name)
81
82 elif name.endswith("i64") or "i64_" in name:
83 f2.write("{8, %s},\n" %name)
84 elif "64ri" in name or "64mi" in name:
85 f2.write("{8, %s},\n" %name)
86
87f.close()
88f2.close()
89
90print("Generated %s" %OUTPUT)