Nguyen Anh Quynh | de8dd26 | 2015-06-28 12:18:13 +0800 | [diff] [blame] | 1 | #!/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 |
| 7 | OUTPUT = "../arch/X86/X86ImmSize.inc" |
| 8 | |
| 9 | f = open("../arch/X86/X86GenInstrInfo.inc") |
| 10 | f2 = open(OUTPUT, "w") |
| 11 | for 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 Quynh | de6fa91 | 2015-06-28 13:14:36 +0800 | [diff] [blame] | 19 | if "_LOCK_" in name or "BEXTR" in name: # exception |
Nguyen Anh Quynh | de8dd26 | 2015-06-28 12:18:13 +0800 | [diff] [blame] | 20 | continue |
| 21 | if name.startswith("X86_"): # instruction |
Nguyen Anh Quynh | fec23ae | 2015-06-30 20:49:55 +0800 | [diff] [blame] | 22 | 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 Quynh | de8dd26 | 2015-06-28 12:18:13 +0800 | [diff] [blame] | 68 | 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 | |
| 87 | f.close() |
| 88 | f2.close() |
| 89 | |
| 90 | print("Generated %s" %OUTPUT) |