162306a36Sopenharmony_ci#!/bin/awk -f 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci# gen-insn-attr-x86.awk: Instruction attribute table generator 462306a36Sopenharmony_ci# Written by Masami Hiramatsu <mhiramat@redhat.com> 562306a36Sopenharmony_ci# 662306a36Sopenharmony_ci# Usage: awk -f gen-insn-attr-x86.awk x86-opcode-map.txt > inat-tables.c 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci# Awk implementation sanity check 962306a36Sopenharmony_cifunction check_awk_implement() { 1062306a36Sopenharmony_ci if (sprintf("%x", 0) != "0") 1162306a36Sopenharmony_ci return "Your awk has a printf-format problem." 1262306a36Sopenharmony_ci return "" 1362306a36Sopenharmony_ci} 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci# Clear working vars 1662306a36Sopenharmony_cifunction clear_vars() { 1762306a36Sopenharmony_ci delete table 1862306a36Sopenharmony_ci delete lptable2 1962306a36Sopenharmony_ci delete lptable1 2062306a36Sopenharmony_ci delete lptable3 2162306a36Sopenharmony_ci eid = -1 # escape id 2262306a36Sopenharmony_ci gid = -1 # group id 2362306a36Sopenharmony_ci aid = -1 # AVX id 2462306a36Sopenharmony_ci tname = "" 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciBEGIN { 2862306a36Sopenharmony_ci # Implementation error checking 2962306a36Sopenharmony_ci awkchecked = check_awk_implement() 3062306a36Sopenharmony_ci if (awkchecked != "") { 3162306a36Sopenharmony_ci print "Error: " awkchecked > "/dev/stderr" 3262306a36Sopenharmony_ci print "Please try to use gawk." > "/dev/stderr" 3362306a36Sopenharmony_ci exit 1 3462306a36Sopenharmony_ci } 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci # Setup generating tables 3762306a36Sopenharmony_ci print "/* x86 opcode map generated from x86-opcode-map.txt */" 3862306a36Sopenharmony_ci print "/* Do not change this code. */\n" 3962306a36Sopenharmony_ci ggid = 1 4062306a36Sopenharmony_ci geid = 1 4162306a36Sopenharmony_ci gaid = 0 4262306a36Sopenharmony_ci delete etable 4362306a36Sopenharmony_ci delete gtable 4462306a36Sopenharmony_ci delete atable 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci opnd_expr = "^[A-Za-z/]" 4762306a36Sopenharmony_ci ext_expr = "^\\(" 4862306a36Sopenharmony_ci sep_expr = "^\\|$" 4962306a36Sopenharmony_ci group_expr = "^Grp[0-9A-Za-z]+" 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci imm_expr = "^[IJAOL][a-z]" 5262306a36Sopenharmony_ci imm_flag["Ib"] = "INAT_MAKE_IMM(INAT_IMM_BYTE)" 5362306a36Sopenharmony_ci imm_flag["Jb"] = "INAT_MAKE_IMM(INAT_IMM_BYTE)" 5462306a36Sopenharmony_ci imm_flag["Iw"] = "INAT_MAKE_IMM(INAT_IMM_WORD)" 5562306a36Sopenharmony_ci imm_flag["Id"] = "INAT_MAKE_IMM(INAT_IMM_DWORD)" 5662306a36Sopenharmony_ci imm_flag["Iq"] = "INAT_MAKE_IMM(INAT_IMM_QWORD)" 5762306a36Sopenharmony_ci imm_flag["Ap"] = "INAT_MAKE_IMM(INAT_IMM_PTR)" 5862306a36Sopenharmony_ci imm_flag["Iz"] = "INAT_MAKE_IMM(INAT_IMM_VWORD32)" 5962306a36Sopenharmony_ci imm_flag["Jz"] = "INAT_MAKE_IMM(INAT_IMM_VWORD32)" 6062306a36Sopenharmony_ci imm_flag["Iv"] = "INAT_MAKE_IMM(INAT_IMM_VWORD)" 6162306a36Sopenharmony_ci imm_flag["Ob"] = "INAT_MOFFSET" 6262306a36Sopenharmony_ci imm_flag["Ov"] = "INAT_MOFFSET" 6362306a36Sopenharmony_ci imm_flag["Lx"] = "INAT_MAKE_IMM(INAT_IMM_BYTE)" 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci modrm_expr = "^([CDEGMNPQRSUVW/][a-z]+|NTA|T[012])" 6662306a36Sopenharmony_ci force64_expr = "\\([df]64\\)" 6762306a36Sopenharmony_ci rex_expr = "^REX(\\.[XRWB]+)*" 6862306a36Sopenharmony_ci fpu_expr = "^ESC" # TODO 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci lprefix1_expr = "\\((66|!F3)\\)" 7162306a36Sopenharmony_ci lprefix2_expr = "\\(F3\\)" 7262306a36Sopenharmony_ci lprefix3_expr = "\\((F2|!F3|66&F2)\\)" 7362306a36Sopenharmony_ci lprefix_expr = "\\((66|F2|F3)\\)" 7462306a36Sopenharmony_ci max_lprefix = 4 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci # All opcodes starting with lower-case 'v', 'k' or with (v1) superscript 7762306a36Sopenharmony_ci # accepts VEX prefix 7862306a36Sopenharmony_ci vexok_opcode_expr = "^[vk].*" 7962306a36Sopenharmony_ci vexok_expr = "\\(v1\\)" 8062306a36Sopenharmony_ci # All opcodes with (v) superscript supports *only* VEX prefix 8162306a36Sopenharmony_ci vexonly_expr = "\\(v\\)" 8262306a36Sopenharmony_ci # All opcodes with (ev) superscript supports *only* EVEX prefix 8362306a36Sopenharmony_ci evexonly_expr = "\\(ev\\)" 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci prefix_expr = "\\(Prefix\\)" 8662306a36Sopenharmony_ci prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ" 8762306a36Sopenharmony_ci prefix_num["REPNE"] = "INAT_PFX_REPNE" 8862306a36Sopenharmony_ci prefix_num["REP/REPE"] = "INAT_PFX_REPE" 8962306a36Sopenharmony_ci prefix_num["XACQUIRE"] = "INAT_PFX_REPNE" 9062306a36Sopenharmony_ci prefix_num["XRELEASE"] = "INAT_PFX_REPE" 9162306a36Sopenharmony_ci prefix_num["LOCK"] = "INAT_PFX_LOCK" 9262306a36Sopenharmony_ci prefix_num["SEG=CS"] = "INAT_PFX_CS" 9362306a36Sopenharmony_ci prefix_num["SEG=DS"] = "INAT_PFX_DS" 9462306a36Sopenharmony_ci prefix_num["SEG=ES"] = "INAT_PFX_ES" 9562306a36Sopenharmony_ci prefix_num["SEG=FS"] = "INAT_PFX_FS" 9662306a36Sopenharmony_ci prefix_num["SEG=GS"] = "INAT_PFX_GS" 9762306a36Sopenharmony_ci prefix_num["SEG=SS"] = "INAT_PFX_SS" 9862306a36Sopenharmony_ci prefix_num["Address-Size"] = "INAT_PFX_ADDRSZ" 9962306a36Sopenharmony_ci prefix_num["VEX+1byte"] = "INAT_PFX_VEX2" 10062306a36Sopenharmony_ci prefix_num["VEX+2byte"] = "INAT_PFX_VEX3" 10162306a36Sopenharmony_ci prefix_num["EVEX"] = "INAT_PFX_EVEX" 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci clear_vars() 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cifunction semantic_error(msg) { 10762306a36Sopenharmony_ci print "Semantic error at " NR ": " msg > "/dev/stderr" 10862306a36Sopenharmony_ci exit 1 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cifunction debug(msg) { 11262306a36Sopenharmony_ci print "DEBUG: " msg 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cifunction array_size(arr, i,c) { 11662306a36Sopenharmony_ci c = 0 11762306a36Sopenharmony_ci for (i in arr) 11862306a36Sopenharmony_ci c++ 11962306a36Sopenharmony_ci return c 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci/^Table:/ { 12362306a36Sopenharmony_ci print "/* " $0 " */" 12462306a36Sopenharmony_ci if (tname != "") 12562306a36Sopenharmony_ci semantic_error("Hit Table: before EndTable:."); 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/^Referrer:/ { 12962306a36Sopenharmony_ci if (NF != 1) { 13062306a36Sopenharmony_ci # escape opcode table 13162306a36Sopenharmony_ci ref = "" 13262306a36Sopenharmony_ci for (i = 2; i <= NF; i++) 13362306a36Sopenharmony_ci ref = ref $i 13462306a36Sopenharmony_ci eid = escape[ref] 13562306a36Sopenharmony_ci tname = sprintf("inat_escape_table_%d", eid) 13662306a36Sopenharmony_ci } 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/^AVXcode:/ { 14062306a36Sopenharmony_ci if (NF != 1) { 14162306a36Sopenharmony_ci # AVX/escape opcode table 14262306a36Sopenharmony_ci aid = $2 14362306a36Sopenharmony_ci if (gaid <= aid) 14462306a36Sopenharmony_ci gaid = aid + 1 14562306a36Sopenharmony_ci if (tname == "") # AVX only opcode table 14662306a36Sopenharmony_ci tname = sprintf("inat_avx_table_%d", $2) 14762306a36Sopenharmony_ci } 14862306a36Sopenharmony_ci if (aid == -1 && eid == -1) # primary opcode table 14962306a36Sopenharmony_ci tname = "inat_primary_table" 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/^GrpTable:/ { 15362306a36Sopenharmony_ci print "/* " $0 " */" 15462306a36Sopenharmony_ci if (!($2 in group)) 15562306a36Sopenharmony_ci semantic_error("No group: " $2 ) 15662306a36Sopenharmony_ci gid = group[$2] 15762306a36Sopenharmony_ci tname = "inat_group_table_" gid 15862306a36Sopenharmony_ci} 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cifunction print_table(tbl,name,fmt,n) 16162306a36Sopenharmony_ci{ 16262306a36Sopenharmony_ci print "const insn_attr_t " name " = {" 16362306a36Sopenharmony_ci for (i = 0; i < n; i++) { 16462306a36Sopenharmony_ci id = sprintf(fmt, i) 16562306a36Sopenharmony_ci if (tbl[id]) 16662306a36Sopenharmony_ci print " [" id "] = " tbl[id] "," 16762306a36Sopenharmony_ci } 16862306a36Sopenharmony_ci print "};" 16962306a36Sopenharmony_ci} 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci/^EndTable/ { 17262306a36Sopenharmony_ci if (gid != -1) { 17362306a36Sopenharmony_ci # print group tables 17462306a36Sopenharmony_ci if (array_size(table) != 0) { 17562306a36Sopenharmony_ci print_table(table, tname "[INAT_GROUP_TABLE_SIZE]", 17662306a36Sopenharmony_ci "0x%x", 8) 17762306a36Sopenharmony_ci gtable[gid,0] = tname 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci if (array_size(lptable1) != 0) { 18062306a36Sopenharmony_ci print_table(lptable1, tname "_1[INAT_GROUP_TABLE_SIZE]", 18162306a36Sopenharmony_ci "0x%x", 8) 18262306a36Sopenharmony_ci gtable[gid,1] = tname "_1" 18362306a36Sopenharmony_ci } 18462306a36Sopenharmony_ci if (array_size(lptable2) != 0) { 18562306a36Sopenharmony_ci print_table(lptable2, tname "_2[INAT_GROUP_TABLE_SIZE]", 18662306a36Sopenharmony_ci "0x%x", 8) 18762306a36Sopenharmony_ci gtable[gid,2] = tname "_2" 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci if (array_size(lptable3) != 0) { 19062306a36Sopenharmony_ci print_table(lptable3, tname "_3[INAT_GROUP_TABLE_SIZE]", 19162306a36Sopenharmony_ci "0x%x", 8) 19262306a36Sopenharmony_ci gtable[gid,3] = tname "_3" 19362306a36Sopenharmony_ci } 19462306a36Sopenharmony_ci } else { 19562306a36Sopenharmony_ci # print primary/escaped tables 19662306a36Sopenharmony_ci if (array_size(table) != 0) { 19762306a36Sopenharmony_ci print_table(table, tname "[INAT_OPCODE_TABLE_SIZE]", 19862306a36Sopenharmony_ci "0x%02x", 256) 19962306a36Sopenharmony_ci etable[eid,0] = tname 20062306a36Sopenharmony_ci if (aid >= 0) 20162306a36Sopenharmony_ci atable[aid,0] = tname 20262306a36Sopenharmony_ci } 20362306a36Sopenharmony_ci if (array_size(lptable1) != 0) { 20462306a36Sopenharmony_ci print_table(lptable1,tname "_1[INAT_OPCODE_TABLE_SIZE]", 20562306a36Sopenharmony_ci "0x%02x", 256) 20662306a36Sopenharmony_ci etable[eid,1] = tname "_1" 20762306a36Sopenharmony_ci if (aid >= 0) 20862306a36Sopenharmony_ci atable[aid,1] = tname "_1" 20962306a36Sopenharmony_ci } 21062306a36Sopenharmony_ci if (array_size(lptable2) != 0) { 21162306a36Sopenharmony_ci print_table(lptable2,tname "_2[INAT_OPCODE_TABLE_SIZE]", 21262306a36Sopenharmony_ci "0x%02x", 256) 21362306a36Sopenharmony_ci etable[eid,2] = tname "_2" 21462306a36Sopenharmony_ci if (aid >= 0) 21562306a36Sopenharmony_ci atable[aid,2] = tname "_2" 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci if (array_size(lptable3) != 0) { 21862306a36Sopenharmony_ci print_table(lptable3,tname "_3[INAT_OPCODE_TABLE_SIZE]", 21962306a36Sopenharmony_ci "0x%02x", 256) 22062306a36Sopenharmony_ci etable[eid,3] = tname "_3" 22162306a36Sopenharmony_ci if (aid >= 0) 22262306a36Sopenharmony_ci atable[aid,3] = tname "_3" 22362306a36Sopenharmony_ci } 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci print "" 22662306a36Sopenharmony_ci clear_vars() 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cifunction add_flags(old,new) { 23062306a36Sopenharmony_ci if (old && new) 23162306a36Sopenharmony_ci return old " | " new 23262306a36Sopenharmony_ci else if (old) 23362306a36Sopenharmony_ci return old 23462306a36Sopenharmony_ci else 23562306a36Sopenharmony_ci return new 23662306a36Sopenharmony_ci} 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci# convert operands to flags. 23962306a36Sopenharmony_cifunction convert_operands(count,opnd, i,j,imm,mod) 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci imm = null 24262306a36Sopenharmony_ci mod = null 24362306a36Sopenharmony_ci for (j = 1; j <= count; j++) { 24462306a36Sopenharmony_ci i = opnd[j] 24562306a36Sopenharmony_ci if (match(i, imm_expr) == 1) { 24662306a36Sopenharmony_ci if (!imm_flag[i]) 24762306a36Sopenharmony_ci semantic_error("Unknown imm opnd: " i) 24862306a36Sopenharmony_ci if (imm) { 24962306a36Sopenharmony_ci if (i != "Ib") 25062306a36Sopenharmony_ci semantic_error("Second IMM error") 25162306a36Sopenharmony_ci imm = add_flags(imm, "INAT_SCNDIMM") 25262306a36Sopenharmony_ci } else 25362306a36Sopenharmony_ci imm = imm_flag[i] 25462306a36Sopenharmony_ci } else if (match(i, modrm_expr)) 25562306a36Sopenharmony_ci mod = "INAT_MODRM" 25662306a36Sopenharmony_ci } 25762306a36Sopenharmony_ci return add_flags(imm, mod) 25862306a36Sopenharmony_ci} 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci/^[0-9a-f]+:/ { 26162306a36Sopenharmony_ci if (NR == 1) 26262306a36Sopenharmony_ci next 26362306a36Sopenharmony_ci # get index 26462306a36Sopenharmony_ci idx = "0x" substr($1, 1, index($1,":") - 1) 26562306a36Sopenharmony_ci if (idx in table) 26662306a36Sopenharmony_ci semantic_error("Redefine " idx " in " tname) 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci # check if escaped opcode 26962306a36Sopenharmony_ci if ("escape" == $2) { 27062306a36Sopenharmony_ci if ($3 != "#") 27162306a36Sopenharmony_ci semantic_error("No escaped name") 27262306a36Sopenharmony_ci ref = "" 27362306a36Sopenharmony_ci for (i = 4; i <= NF; i++) 27462306a36Sopenharmony_ci ref = ref $i 27562306a36Sopenharmony_ci if (ref in escape) 27662306a36Sopenharmony_ci semantic_error("Redefine escape (" ref ")") 27762306a36Sopenharmony_ci escape[ref] = geid 27862306a36Sopenharmony_ci geid++ 27962306a36Sopenharmony_ci table[idx] = "INAT_MAKE_ESCAPE(" escape[ref] ")" 28062306a36Sopenharmony_ci next 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci variant = null 28462306a36Sopenharmony_ci # converts 28562306a36Sopenharmony_ci i = 2 28662306a36Sopenharmony_ci while (i <= NF) { 28762306a36Sopenharmony_ci opcode = $(i++) 28862306a36Sopenharmony_ci delete opnds 28962306a36Sopenharmony_ci ext = null 29062306a36Sopenharmony_ci flags = null 29162306a36Sopenharmony_ci opnd = null 29262306a36Sopenharmony_ci # parse one opcode 29362306a36Sopenharmony_ci if (match($i, opnd_expr)) { 29462306a36Sopenharmony_ci opnd = $i 29562306a36Sopenharmony_ci count = split($(i++), opnds, ",") 29662306a36Sopenharmony_ci flags = convert_operands(count, opnds) 29762306a36Sopenharmony_ci } 29862306a36Sopenharmony_ci if (match($i, ext_expr)) 29962306a36Sopenharmony_ci ext = $(i++) 30062306a36Sopenharmony_ci if (match($i, sep_expr)) 30162306a36Sopenharmony_ci i++ 30262306a36Sopenharmony_ci else if (i < NF) 30362306a36Sopenharmony_ci semantic_error($i " is not a separator") 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci # check if group opcode 30662306a36Sopenharmony_ci if (match(opcode, group_expr)) { 30762306a36Sopenharmony_ci if (!(opcode in group)) { 30862306a36Sopenharmony_ci group[opcode] = ggid 30962306a36Sopenharmony_ci ggid++ 31062306a36Sopenharmony_ci } 31162306a36Sopenharmony_ci flags = add_flags(flags, "INAT_MAKE_GROUP(" group[opcode] ")") 31262306a36Sopenharmony_ci } 31362306a36Sopenharmony_ci # check force(or default) 64bit 31462306a36Sopenharmony_ci if (match(ext, force64_expr)) 31562306a36Sopenharmony_ci flags = add_flags(flags, "INAT_FORCE64") 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci # check REX prefix 31862306a36Sopenharmony_ci if (match(opcode, rex_expr)) 31962306a36Sopenharmony_ci flags = add_flags(flags, "INAT_MAKE_PREFIX(INAT_PFX_REX)") 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci # check coprocessor escape : TODO 32262306a36Sopenharmony_ci if (match(opcode, fpu_expr)) 32362306a36Sopenharmony_ci flags = add_flags(flags, "INAT_MODRM") 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci # check VEX codes 32662306a36Sopenharmony_ci if (match(ext, evexonly_expr)) 32762306a36Sopenharmony_ci flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY") 32862306a36Sopenharmony_ci else if (match(ext, vexonly_expr)) 32962306a36Sopenharmony_ci flags = add_flags(flags, "INAT_VEXOK | INAT_VEXONLY") 33062306a36Sopenharmony_ci else if (match(ext, vexok_expr) || match(opcode, vexok_opcode_expr)) 33162306a36Sopenharmony_ci flags = add_flags(flags, "INAT_VEXOK") 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci # check prefixes 33462306a36Sopenharmony_ci if (match(ext, prefix_expr)) { 33562306a36Sopenharmony_ci if (!prefix_num[opcode]) 33662306a36Sopenharmony_ci semantic_error("Unknown prefix: " opcode) 33762306a36Sopenharmony_ci flags = add_flags(flags, "INAT_MAKE_PREFIX(" prefix_num[opcode] ")") 33862306a36Sopenharmony_ci } 33962306a36Sopenharmony_ci if (length(flags) == 0) 34062306a36Sopenharmony_ci continue 34162306a36Sopenharmony_ci # check if last prefix 34262306a36Sopenharmony_ci if (match(ext, lprefix1_expr)) { 34362306a36Sopenharmony_ci lptable1[idx] = add_flags(lptable1[idx],flags) 34462306a36Sopenharmony_ci variant = "INAT_VARIANT" 34562306a36Sopenharmony_ci } 34662306a36Sopenharmony_ci if (match(ext, lprefix2_expr)) { 34762306a36Sopenharmony_ci lptable2[idx] = add_flags(lptable2[idx],flags) 34862306a36Sopenharmony_ci variant = "INAT_VARIANT" 34962306a36Sopenharmony_ci } 35062306a36Sopenharmony_ci if (match(ext, lprefix3_expr)) { 35162306a36Sopenharmony_ci lptable3[idx] = add_flags(lptable3[idx],flags) 35262306a36Sopenharmony_ci variant = "INAT_VARIANT" 35362306a36Sopenharmony_ci } 35462306a36Sopenharmony_ci if (!match(ext, lprefix_expr)){ 35562306a36Sopenharmony_ci table[idx] = add_flags(table[idx],flags) 35662306a36Sopenharmony_ci } 35762306a36Sopenharmony_ci } 35862306a36Sopenharmony_ci if (variant) 35962306a36Sopenharmony_ci table[idx] = add_flags(table[idx],variant) 36062306a36Sopenharmony_ci} 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ciEND { 36362306a36Sopenharmony_ci if (awkchecked != "") 36462306a36Sopenharmony_ci exit 1 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci print "#ifndef __BOOT_COMPRESSED\n" 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci # print escape opcode map's array 36962306a36Sopenharmony_ci print "/* Escape opcode map array */" 37062306a36Sopenharmony_ci print "const insn_attr_t * const inat_escape_tables[INAT_ESC_MAX + 1]" \ 37162306a36Sopenharmony_ci "[INAT_LSTPFX_MAX + 1] = {" 37262306a36Sopenharmony_ci for (i = 0; i < geid; i++) 37362306a36Sopenharmony_ci for (j = 0; j < max_lprefix; j++) 37462306a36Sopenharmony_ci if (etable[i,j]) 37562306a36Sopenharmony_ci print " ["i"]["j"] = "etable[i,j]"," 37662306a36Sopenharmony_ci print "};\n" 37762306a36Sopenharmony_ci # print group opcode map's array 37862306a36Sopenharmony_ci print "/* Group opcode map array */" 37962306a36Sopenharmony_ci print "const insn_attr_t * const inat_group_tables[INAT_GRP_MAX + 1]"\ 38062306a36Sopenharmony_ci "[INAT_LSTPFX_MAX + 1] = {" 38162306a36Sopenharmony_ci for (i = 0; i < ggid; i++) 38262306a36Sopenharmony_ci for (j = 0; j < max_lprefix; j++) 38362306a36Sopenharmony_ci if (gtable[i,j]) 38462306a36Sopenharmony_ci print " ["i"]["j"] = "gtable[i,j]"," 38562306a36Sopenharmony_ci print "};\n" 38662306a36Sopenharmony_ci # print AVX opcode map's array 38762306a36Sopenharmony_ci print "/* AVX opcode map array */" 38862306a36Sopenharmony_ci print "const insn_attr_t * const inat_avx_tables[X86_VEX_M_MAX + 1]"\ 38962306a36Sopenharmony_ci "[INAT_LSTPFX_MAX + 1] = {" 39062306a36Sopenharmony_ci for (i = 0; i < gaid; i++) 39162306a36Sopenharmony_ci for (j = 0; j < max_lprefix; j++) 39262306a36Sopenharmony_ci if (atable[i,j]) 39362306a36Sopenharmony_ci print " ["i"]["j"] = "atable[i,j]"," 39462306a36Sopenharmony_ci print "};\n" 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci print "#else /* !__BOOT_COMPRESSED */\n" 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci print "/* Escape opcode map array */" 39962306a36Sopenharmony_ci print "static const insn_attr_t *inat_escape_tables[INAT_ESC_MAX + 1]" \ 40062306a36Sopenharmony_ci "[INAT_LSTPFX_MAX + 1];" 40162306a36Sopenharmony_ci print "" 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci print "/* Group opcode map array */" 40462306a36Sopenharmony_ci print "static const insn_attr_t *inat_group_tables[INAT_GRP_MAX + 1]"\ 40562306a36Sopenharmony_ci "[INAT_LSTPFX_MAX + 1];" 40662306a36Sopenharmony_ci print "" 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci print "/* AVX opcode map array */" 40962306a36Sopenharmony_ci print "static const insn_attr_t *inat_avx_tables[X86_VEX_M_MAX + 1]"\ 41062306a36Sopenharmony_ci "[INAT_LSTPFX_MAX + 1];" 41162306a36Sopenharmony_ci print "" 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci print "static void inat_init_tables(void)" 41462306a36Sopenharmony_ci print "{" 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci # print escape opcode map's array 41762306a36Sopenharmony_ci print "\t/* Print Escape opcode map array */" 41862306a36Sopenharmony_ci for (i = 0; i < geid; i++) 41962306a36Sopenharmony_ci for (j = 0; j < max_lprefix; j++) 42062306a36Sopenharmony_ci if (etable[i,j]) 42162306a36Sopenharmony_ci print "\tinat_escape_tables["i"]["j"] = "etable[i,j]";" 42262306a36Sopenharmony_ci print "" 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci # print group opcode map's array 42562306a36Sopenharmony_ci print "\t/* Print Group opcode map array */" 42662306a36Sopenharmony_ci for (i = 0; i < ggid; i++) 42762306a36Sopenharmony_ci for (j = 0; j < max_lprefix; j++) 42862306a36Sopenharmony_ci if (gtable[i,j]) 42962306a36Sopenharmony_ci print "\tinat_group_tables["i"]["j"] = "gtable[i,j]";" 43062306a36Sopenharmony_ci print "" 43162306a36Sopenharmony_ci # print AVX opcode map's array 43262306a36Sopenharmony_ci print "\t/* Print AVX opcode map array */" 43362306a36Sopenharmony_ci for (i = 0; i < gaid; i++) 43462306a36Sopenharmony_ci for (j = 0; j < max_lprefix; j++) 43562306a36Sopenharmony_ci if (atable[i,j]) 43662306a36Sopenharmony_ci print "\tinat_avx_tables["i"]["j"] = "atable[i,j]";" 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci print "}" 43962306a36Sopenharmony_ci print "#endif" 44062306a36Sopenharmony_ci} 44162306a36Sopenharmony_ci 442