1*4882a593Smuzhiyun#!/bin/awk -f 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# gen-insn-attr-x86.awk: Instruction attribute table generator 4*4882a593Smuzhiyun# Written by Masami Hiramatsu <mhiramat@redhat.com> 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun# Usage: awk -f gen-insn-attr-x86.awk x86-opcode-map.txt > inat-tables.c 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun# Awk implementation sanity check 9*4882a593Smuzhiyunfunction check_awk_implement() { 10*4882a593Smuzhiyun if (sprintf("%x", 0) != "0") 11*4882a593Smuzhiyun return "Your awk has a printf-format problem." 12*4882a593Smuzhiyun return "" 13*4882a593Smuzhiyun} 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun# Clear working vars 16*4882a593Smuzhiyunfunction clear_vars() { 17*4882a593Smuzhiyun delete table 18*4882a593Smuzhiyun delete lptable2 19*4882a593Smuzhiyun delete lptable1 20*4882a593Smuzhiyun delete lptable3 21*4882a593Smuzhiyun eid = -1 # escape id 22*4882a593Smuzhiyun gid = -1 # group id 23*4882a593Smuzhiyun aid = -1 # AVX id 24*4882a593Smuzhiyun tname = "" 25*4882a593Smuzhiyun} 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunBEGIN { 28*4882a593Smuzhiyun # Implementation error checking 29*4882a593Smuzhiyun awkchecked = check_awk_implement() 30*4882a593Smuzhiyun if (awkchecked != "") { 31*4882a593Smuzhiyun print "Error: " awkchecked > "/dev/stderr" 32*4882a593Smuzhiyun print "Please try to use gawk." > "/dev/stderr" 33*4882a593Smuzhiyun exit 1 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun # Setup generating tables 37*4882a593Smuzhiyun print "/* x86 opcode map generated from x86-opcode-map.txt */" 38*4882a593Smuzhiyun print "/* Do not change this code. */\n" 39*4882a593Smuzhiyun ggid = 1 40*4882a593Smuzhiyun geid = 1 41*4882a593Smuzhiyun gaid = 0 42*4882a593Smuzhiyun delete etable 43*4882a593Smuzhiyun delete gtable 44*4882a593Smuzhiyun delete atable 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun opnd_expr = "^[A-Za-z/]" 47*4882a593Smuzhiyun ext_expr = "^\\(" 48*4882a593Smuzhiyun sep_expr = "^\\|$" 49*4882a593Smuzhiyun group_expr = "^Grp[0-9A-Za-z]+" 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun imm_expr = "^[IJAOL][a-z]" 52*4882a593Smuzhiyun imm_flag["Ib"] = "INAT_MAKE_IMM(INAT_IMM_BYTE)" 53*4882a593Smuzhiyun imm_flag["Jb"] = "INAT_MAKE_IMM(INAT_IMM_BYTE)" 54*4882a593Smuzhiyun imm_flag["Iw"] = "INAT_MAKE_IMM(INAT_IMM_WORD)" 55*4882a593Smuzhiyun imm_flag["Id"] = "INAT_MAKE_IMM(INAT_IMM_DWORD)" 56*4882a593Smuzhiyun imm_flag["Iq"] = "INAT_MAKE_IMM(INAT_IMM_QWORD)" 57*4882a593Smuzhiyun imm_flag["Ap"] = "INAT_MAKE_IMM(INAT_IMM_PTR)" 58*4882a593Smuzhiyun imm_flag["Iz"] = "INAT_MAKE_IMM(INAT_IMM_VWORD32)" 59*4882a593Smuzhiyun imm_flag["Jz"] = "INAT_MAKE_IMM(INAT_IMM_VWORD32)" 60*4882a593Smuzhiyun imm_flag["Iv"] = "INAT_MAKE_IMM(INAT_IMM_VWORD)" 61*4882a593Smuzhiyun imm_flag["Ob"] = "INAT_MOFFSET" 62*4882a593Smuzhiyun imm_flag["Ov"] = "INAT_MOFFSET" 63*4882a593Smuzhiyun imm_flag["Lx"] = "INAT_MAKE_IMM(INAT_IMM_BYTE)" 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun modrm_expr = "^([CDEGMNPQRSUVW/][a-z]+|NTA|T[012])" 66*4882a593Smuzhiyun force64_expr = "\\([df]64\\)" 67*4882a593Smuzhiyun rex_expr = "^REX(\\.[XRWB]+)*" 68*4882a593Smuzhiyun fpu_expr = "^ESC" # TODO 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun lprefix1_expr = "\\((66|!F3)\\)" 71*4882a593Smuzhiyun lprefix2_expr = "\\(F3\\)" 72*4882a593Smuzhiyun lprefix3_expr = "\\((F2|!F3|66&F2)\\)" 73*4882a593Smuzhiyun lprefix_expr = "\\((66|F2|F3)\\)" 74*4882a593Smuzhiyun max_lprefix = 4 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun # All opcodes starting with lower-case 'v', 'k' or with (v1) superscript 77*4882a593Smuzhiyun # accepts VEX prefix 78*4882a593Smuzhiyun vexok_opcode_expr = "^[vk].*" 79*4882a593Smuzhiyun vexok_expr = "\\(v1\\)" 80*4882a593Smuzhiyun # All opcodes with (v) superscript supports *only* VEX prefix 81*4882a593Smuzhiyun vexonly_expr = "\\(v\\)" 82*4882a593Smuzhiyun # All opcodes with (ev) superscript supports *only* EVEX prefix 83*4882a593Smuzhiyun evexonly_expr = "\\(ev\\)" 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun prefix_expr = "\\(Prefix\\)" 86*4882a593Smuzhiyun prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ" 87*4882a593Smuzhiyun prefix_num["REPNE"] = "INAT_PFX_REPNE" 88*4882a593Smuzhiyun prefix_num["REP/REPE"] = "INAT_PFX_REPE" 89*4882a593Smuzhiyun prefix_num["XACQUIRE"] = "INAT_PFX_REPNE" 90*4882a593Smuzhiyun prefix_num["XRELEASE"] = "INAT_PFX_REPE" 91*4882a593Smuzhiyun prefix_num["LOCK"] = "INAT_PFX_LOCK" 92*4882a593Smuzhiyun prefix_num["SEG=CS"] = "INAT_PFX_CS" 93*4882a593Smuzhiyun prefix_num["SEG=DS"] = "INAT_PFX_DS" 94*4882a593Smuzhiyun prefix_num["SEG=ES"] = "INAT_PFX_ES" 95*4882a593Smuzhiyun prefix_num["SEG=FS"] = "INAT_PFX_FS" 96*4882a593Smuzhiyun prefix_num["SEG=GS"] = "INAT_PFX_GS" 97*4882a593Smuzhiyun prefix_num["SEG=SS"] = "INAT_PFX_SS" 98*4882a593Smuzhiyun prefix_num["Address-Size"] = "INAT_PFX_ADDRSZ" 99*4882a593Smuzhiyun prefix_num["VEX+1byte"] = "INAT_PFX_VEX2" 100*4882a593Smuzhiyun prefix_num["VEX+2byte"] = "INAT_PFX_VEX3" 101*4882a593Smuzhiyun prefix_num["EVEX"] = "INAT_PFX_EVEX" 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun clear_vars() 104*4882a593Smuzhiyun} 105*4882a593Smuzhiyun 106*4882a593Smuzhiyunfunction semantic_error(msg) { 107*4882a593Smuzhiyun print "Semantic error at " NR ": " msg > "/dev/stderr" 108*4882a593Smuzhiyun exit 1 109*4882a593Smuzhiyun} 110*4882a593Smuzhiyun 111*4882a593Smuzhiyunfunction debug(msg) { 112*4882a593Smuzhiyun print "DEBUG: " msg 113*4882a593Smuzhiyun} 114*4882a593Smuzhiyun 115*4882a593Smuzhiyunfunction array_size(arr, i,c) { 116*4882a593Smuzhiyun c = 0 117*4882a593Smuzhiyun for (i in arr) 118*4882a593Smuzhiyun c++ 119*4882a593Smuzhiyun return c 120*4882a593Smuzhiyun} 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun/^Table:/ { 123*4882a593Smuzhiyun print "/* " $0 " */" 124*4882a593Smuzhiyun if (tname != "") 125*4882a593Smuzhiyun semantic_error("Hit Table: before EndTable:."); 126*4882a593Smuzhiyun} 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun/^Referrer:/ { 129*4882a593Smuzhiyun if (NF != 1) { 130*4882a593Smuzhiyun # escape opcode table 131*4882a593Smuzhiyun ref = "" 132*4882a593Smuzhiyun for (i = 2; i <= NF; i++) 133*4882a593Smuzhiyun ref = ref $i 134*4882a593Smuzhiyun eid = escape[ref] 135*4882a593Smuzhiyun tname = sprintf("inat_escape_table_%d", eid) 136*4882a593Smuzhiyun } 137*4882a593Smuzhiyun} 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun/^AVXcode:/ { 140*4882a593Smuzhiyun if (NF != 1) { 141*4882a593Smuzhiyun # AVX/escape opcode table 142*4882a593Smuzhiyun aid = $2 143*4882a593Smuzhiyun if (gaid <= aid) 144*4882a593Smuzhiyun gaid = aid + 1 145*4882a593Smuzhiyun if (tname == "") # AVX only opcode table 146*4882a593Smuzhiyun tname = sprintf("inat_avx_table_%d", $2) 147*4882a593Smuzhiyun } 148*4882a593Smuzhiyun if (aid == -1 && eid == -1) # primary opcode table 149*4882a593Smuzhiyun tname = "inat_primary_table" 150*4882a593Smuzhiyun} 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun/^GrpTable:/ { 153*4882a593Smuzhiyun print "/* " $0 " */" 154*4882a593Smuzhiyun if (!($2 in group)) 155*4882a593Smuzhiyun semantic_error("No group: " $2 ) 156*4882a593Smuzhiyun gid = group[$2] 157*4882a593Smuzhiyun tname = "inat_group_table_" gid 158*4882a593Smuzhiyun} 159*4882a593Smuzhiyun 160*4882a593Smuzhiyunfunction print_table(tbl,name,fmt,n) 161*4882a593Smuzhiyun{ 162*4882a593Smuzhiyun print "const insn_attr_t " name " = {" 163*4882a593Smuzhiyun for (i = 0; i < n; i++) { 164*4882a593Smuzhiyun id = sprintf(fmt, i) 165*4882a593Smuzhiyun if (tbl[id]) 166*4882a593Smuzhiyun print " [" id "] = " tbl[id] "," 167*4882a593Smuzhiyun } 168*4882a593Smuzhiyun print "};" 169*4882a593Smuzhiyun} 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun/^EndTable/ { 172*4882a593Smuzhiyun if (gid != -1) { 173*4882a593Smuzhiyun # print group tables 174*4882a593Smuzhiyun if (array_size(table) != 0) { 175*4882a593Smuzhiyun print_table(table, tname "[INAT_GROUP_TABLE_SIZE]", 176*4882a593Smuzhiyun "0x%x", 8) 177*4882a593Smuzhiyun gtable[gid,0] = tname 178*4882a593Smuzhiyun } 179*4882a593Smuzhiyun if (array_size(lptable1) != 0) { 180*4882a593Smuzhiyun print_table(lptable1, tname "_1[INAT_GROUP_TABLE_SIZE]", 181*4882a593Smuzhiyun "0x%x", 8) 182*4882a593Smuzhiyun gtable[gid,1] = tname "_1" 183*4882a593Smuzhiyun } 184*4882a593Smuzhiyun if (array_size(lptable2) != 0) { 185*4882a593Smuzhiyun print_table(lptable2, tname "_2[INAT_GROUP_TABLE_SIZE]", 186*4882a593Smuzhiyun "0x%x", 8) 187*4882a593Smuzhiyun gtable[gid,2] = tname "_2" 188*4882a593Smuzhiyun } 189*4882a593Smuzhiyun if (array_size(lptable3) != 0) { 190*4882a593Smuzhiyun print_table(lptable3, tname "_3[INAT_GROUP_TABLE_SIZE]", 191*4882a593Smuzhiyun "0x%x", 8) 192*4882a593Smuzhiyun gtable[gid,3] = tname "_3" 193*4882a593Smuzhiyun } 194*4882a593Smuzhiyun } else { 195*4882a593Smuzhiyun # print primary/escaped tables 196*4882a593Smuzhiyun if (array_size(table) != 0) { 197*4882a593Smuzhiyun print_table(table, tname "[INAT_OPCODE_TABLE_SIZE]", 198*4882a593Smuzhiyun "0x%02x", 256) 199*4882a593Smuzhiyun etable[eid,0] = tname 200*4882a593Smuzhiyun if (aid >= 0) 201*4882a593Smuzhiyun atable[aid,0] = tname 202*4882a593Smuzhiyun } 203*4882a593Smuzhiyun if (array_size(lptable1) != 0) { 204*4882a593Smuzhiyun print_table(lptable1,tname "_1[INAT_OPCODE_TABLE_SIZE]", 205*4882a593Smuzhiyun "0x%02x", 256) 206*4882a593Smuzhiyun etable[eid,1] = tname "_1" 207*4882a593Smuzhiyun if (aid >= 0) 208*4882a593Smuzhiyun atable[aid,1] = tname "_1" 209*4882a593Smuzhiyun } 210*4882a593Smuzhiyun if (array_size(lptable2) != 0) { 211*4882a593Smuzhiyun print_table(lptable2,tname "_2[INAT_OPCODE_TABLE_SIZE]", 212*4882a593Smuzhiyun "0x%02x", 256) 213*4882a593Smuzhiyun etable[eid,2] = tname "_2" 214*4882a593Smuzhiyun if (aid >= 0) 215*4882a593Smuzhiyun atable[aid,2] = tname "_2" 216*4882a593Smuzhiyun } 217*4882a593Smuzhiyun if (array_size(lptable3) != 0) { 218*4882a593Smuzhiyun print_table(lptable3,tname "_3[INAT_OPCODE_TABLE_SIZE]", 219*4882a593Smuzhiyun "0x%02x", 256) 220*4882a593Smuzhiyun etable[eid,3] = tname "_3" 221*4882a593Smuzhiyun if (aid >= 0) 222*4882a593Smuzhiyun atable[aid,3] = tname "_3" 223*4882a593Smuzhiyun } 224*4882a593Smuzhiyun } 225*4882a593Smuzhiyun print "" 226*4882a593Smuzhiyun clear_vars() 227*4882a593Smuzhiyun} 228*4882a593Smuzhiyun 229*4882a593Smuzhiyunfunction add_flags(old,new) { 230*4882a593Smuzhiyun if (old && new) 231*4882a593Smuzhiyun return old " | " new 232*4882a593Smuzhiyun else if (old) 233*4882a593Smuzhiyun return old 234*4882a593Smuzhiyun else 235*4882a593Smuzhiyun return new 236*4882a593Smuzhiyun} 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun# convert operands to flags. 239*4882a593Smuzhiyunfunction convert_operands(count,opnd, i,j,imm,mod) 240*4882a593Smuzhiyun{ 241*4882a593Smuzhiyun imm = null 242*4882a593Smuzhiyun mod = null 243*4882a593Smuzhiyun for (j = 1; j <= count; j++) { 244*4882a593Smuzhiyun i = opnd[j] 245*4882a593Smuzhiyun if (match(i, imm_expr) == 1) { 246*4882a593Smuzhiyun if (!imm_flag[i]) 247*4882a593Smuzhiyun semantic_error("Unknown imm opnd: " i) 248*4882a593Smuzhiyun if (imm) { 249*4882a593Smuzhiyun if (i != "Ib") 250*4882a593Smuzhiyun semantic_error("Second IMM error") 251*4882a593Smuzhiyun imm = add_flags(imm, "INAT_SCNDIMM") 252*4882a593Smuzhiyun } else 253*4882a593Smuzhiyun imm = imm_flag[i] 254*4882a593Smuzhiyun } else if (match(i, modrm_expr)) 255*4882a593Smuzhiyun mod = "INAT_MODRM" 256*4882a593Smuzhiyun } 257*4882a593Smuzhiyun return add_flags(imm, mod) 258*4882a593Smuzhiyun} 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun/^[0-9a-f]+:/ { 261*4882a593Smuzhiyun if (NR == 1) 262*4882a593Smuzhiyun next 263*4882a593Smuzhiyun # get index 264*4882a593Smuzhiyun idx = "0x" substr($1, 1, index($1,":") - 1) 265*4882a593Smuzhiyun if (idx in table) 266*4882a593Smuzhiyun semantic_error("Redefine " idx " in " tname) 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun # check if escaped opcode 269*4882a593Smuzhiyun if ("escape" == $2) { 270*4882a593Smuzhiyun if ($3 != "#") 271*4882a593Smuzhiyun semantic_error("No escaped name") 272*4882a593Smuzhiyun ref = "" 273*4882a593Smuzhiyun for (i = 4; i <= NF; i++) 274*4882a593Smuzhiyun ref = ref $i 275*4882a593Smuzhiyun if (ref in escape) 276*4882a593Smuzhiyun semantic_error("Redefine escape (" ref ")") 277*4882a593Smuzhiyun escape[ref] = geid 278*4882a593Smuzhiyun geid++ 279*4882a593Smuzhiyun table[idx] = "INAT_MAKE_ESCAPE(" escape[ref] ")" 280*4882a593Smuzhiyun next 281*4882a593Smuzhiyun } 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun variant = null 284*4882a593Smuzhiyun # converts 285*4882a593Smuzhiyun i = 2 286*4882a593Smuzhiyun while (i <= NF) { 287*4882a593Smuzhiyun opcode = $(i++) 288*4882a593Smuzhiyun delete opnds 289*4882a593Smuzhiyun ext = null 290*4882a593Smuzhiyun flags = null 291*4882a593Smuzhiyun opnd = null 292*4882a593Smuzhiyun # parse one opcode 293*4882a593Smuzhiyun if (match($i, opnd_expr)) { 294*4882a593Smuzhiyun opnd = $i 295*4882a593Smuzhiyun count = split($(i++), opnds, ",") 296*4882a593Smuzhiyun flags = convert_operands(count, opnds) 297*4882a593Smuzhiyun } 298*4882a593Smuzhiyun if (match($i, ext_expr)) 299*4882a593Smuzhiyun ext = $(i++) 300*4882a593Smuzhiyun if (match($i, sep_expr)) 301*4882a593Smuzhiyun i++ 302*4882a593Smuzhiyun else if (i < NF) 303*4882a593Smuzhiyun semantic_error($i " is not a separator") 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun # check if group opcode 306*4882a593Smuzhiyun if (match(opcode, group_expr)) { 307*4882a593Smuzhiyun if (!(opcode in group)) { 308*4882a593Smuzhiyun group[opcode] = ggid 309*4882a593Smuzhiyun ggid++ 310*4882a593Smuzhiyun } 311*4882a593Smuzhiyun flags = add_flags(flags, "INAT_MAKE_GROUP(" group[opcode] ")") 312*4882a593Smuzhiyun } 313*4882a593Smuzhiyun # check force(or default) 64bit 314*4882a593Smuzhiyun if (match(ext, force64_expr)) 315*4882a593Smuzhiyun flags = add_flags(flags, "INAT_FORCE64") 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun # check REX prefix 318*4882a593Smuzhiyun if (match(opcode, rex_expr)) 319*4882a593Smuzhiyun flags = add_flags(flags, "INAT_MAKE_PREFIX(INAT_PFX_REX)") 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun # check coprocessor escape : TODO 322*4882a593Smuzhiyun if (match(opcode, fpu_expr)) 323*4882a593Smuzhiyun flags = add_flags(flags, "INAT_MODRM") 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun # check VEX codes 326*4882a593Smuzhiyun if (match(ext, evexonly_expr)) 327*4882a593Smuzhiyun flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY") 328*4882a593Smuzhiyun else if (match(ext, vexonly_expr)) 329*4882a593Smuzhiyun flags = add_flags(flags, "INAT_VEXOK | INAT_VEXONLY") 330*4882a593Smuzhiyun else if (match(ext, vexok_expr) || match(opcode, vexok_opcode_expr)) 331*4882a593Smuzhiyun flags = add_flags(flags, "INAT_VEXOK") 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun # check prefixes 334*4882a593Smuzhiyun if (match(ext, prefix_expr)) { 335*4882a593Smuzhiyun if (!prefix_num[opcode]) 336*4882a593Smuzhiyun semantic_error("Unknown prefix: " opcode) 337*4882a593Smuzhiyun flags = add_flags(flags, "INAT_MAKE_PREFIX(" prefix_num[opcode] ")") 338*4882a593Smuzhiyun } 339*4882a593Smuzhiyun if (length(flags) == 0) 340*4882a593Smuzhiyun continue 341*4882a593Smuzhiyun # check if last prefix 342*4882a593Smuzhiyun if (match(ext, lprefix1_expr)) { 343*4882a593Smuzhiyun lptable1[idx] = add_flags(lptable1[idx],flags) 344*4882a593Smuzhiyun variant = "INAT_VARIANT" 345*4882a593Smuzhiyun } 346*4882a593Smuzhiyun if (match(ext, lprefix2_expr)) { 347*4882a593Smuzhiyun lptable2[idx] = add_flags(lptable2[idx],flags) 348*4882a593Smuzhiyun variant = "INAT_VARIANT" 349*4882a593Smuzhiyun } 350*4882a593Smuzhiyun if (match(ext, lprefix3_expr)) { 351*4882a593Smuzhiyun lptable3[idx] = add_flags(lptable3[idx],flags) 352*4882a593Smuzhiyun variant = "INAT_VARIANT" 353*4882a593Smuzhiyun } 354*4882a593Smuzhiyun if (!match(ext, lprefix_expr)){ 355*4882a593Smuzhiyun table[idx] = add_flags(table[idx],flags) 356*4882a593Smuzhiyun } 357*4882a593Smuzhiyun } 358*4882a593Smuzhiyun if (variant) 359*4882a593Smuzhiyun table[idx] = add_flags(table[idx],variant) 360*4882a593Smuzhiyun} 361*4882a593Smuzhiyun 362*4882a593SmuzhiyunEND { 363*4882a593Smuzhiyun if (awkchecked != "") 364*4882a593Smuzhiyun exit 1 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun print "#ifndef __BOOT_COMPRESSED\n" 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun # print escape opcode map's array 369*4882a593Smuzhiyun print "/* Escape opcode map array */" 370*4882a593Smuzhiyun print "const insn_attr_t * const inat_escape_tables[INAT_ESC_MAX + 1]" \ 371*4882a593Smuzhiyun "[INAT_LSTPFX_MAX + 1] = {" 372*4882a593Smuzhiyun for (i = 0; i < geid; i++) 373*4882a593Smuzhiyun for (j = 0; j < max_lprefix; j++) 374*4882a593Smuzhiyun if (etable[i,j]) 375*4882a593Smuzhiyun print " ["i"]["j"] = "etable[i,j]"," 376*4882a593Smuzhiyun print "};\n" 377*4882a593Smuzhiyun # print group opcode map's array 378*4882a593Smuzhiyun print "/* Group opcode map array */" 379*4882a593Smuzhiyun print "const insn_attr_t * const inat_group_tables[INAT_GRP_MAX + 1]"\ 380*4882a593Smuzhiyun "[INAT_LSTPFX_MAX + 1] = {" 381*4882a593Smuzhiyun for (i = 0; i < ggid; i++) 382*4882a593Smuzhiyun for (j = 0; j < max_lprefix; j++) 383*4882a593Smuzhiyun if (gtable[i,j]) 384*4882a593Smuzhiyun print " ["i"]["j"] = "gtable[i,j]"," 385*4882a593Smuzhiyun print "};\n" 386*4882a593Smuzhiyun # print AVX opcode map's array 387*4882a593Smuzhiyun print "/* AVX opcode map array */" 388*4882a593Smuzhiyun print "const insn_attr_t * const inat_avx_tables[X86_VEX_M_MAX + 1]"\ 389*4882a593Smuzhiyun "[INAT_LSTPFX_MAX + 1] = {" 390*4882a593Smuzhiyun for (i = 0; i < gaid; i++) 391*4882a593Smuzhiyun for (j = 0; j < max_lprefix; j++) 392*4882a593Smuzhiyun if (atable[i,j]) 393*4882a593Smuzhiyun print " ["i"]["j"] = "atable[i,j]"," 394*4882a593Smuzhiyun print "};\n" 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun print "#else /* !__BOOT_COMPRESSED */\n" 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun print "/* Escape opcode map array */" 399*4882a593Smuzhiyun print "static const insn_attr_t *inat_escape_tables[INAT_ESC_MAX + 1]" \ 400*4882a593Smuzhiyun "[INAT_LSTPFX_MAX + 1];" 401*4882a593Smuzhiyun print "" 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun print "/* Group opcode map array */" 404*4882a593Smuzhiyun print "static const insn_attr_t *inat_group_tables[INAT_GRP_MAX + 1]"\ 405*4882a593Smuzhiyun "[INAT_LSTPFX_MAX + 1];" 406*4882a593Smuzhiyun print "" 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun print "/* AVX opcode map array */" 409*4882a593Smuzhiyun print "static const insn_attr_t *inat_avx_tables[X86_VEX_M_MAX + 1]"\ 410*4882a593Smuzhiyun "[INAT_LSTPFX_MAX + 1];" 411*4882a593Smuzhiyun print "" 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun print "static void inat_init_tables(void)" 414*4882a593Smuzhiyun print "{" 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun # print escape opcode map's array 417*4882a593Smuzhiyun print "\t/* Print Escape opcode map array */" 418*4882a593Smuzhiyun for (i = 0; i < geid; i++) 419*4882a593Smuzhiyun for (j = 0; j < max_lprefix; j++) 420*4882a593Smuzhiyun if (etable[i,j]) 421*4882a593Smuzhiyun print "\tinat_escape_tables["i"]["j"] = "etable[i,j]";" 422*4882a593Smuzhiyun print "" 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun # print group opcode map's array 425*4882a593Smuzhiyun print "\t/* Print Group opcode map array */" 426*4882a593Smuzhiyun for (i = 0; i < ggid; i++) 427*4882a593Smuzhiyun for (j = 0; j < max_lprefix; j++) 428*4882a593Smuzhiyun if (gtable[i,j]) 429*4882a593Smuzhiyun print "\tinat_group_tables["i"]["j"] = "gtable[i,j]";" 430*4882a593Smuzhiyun print "" 431*4882a593Smuzhiyun # print AVX opcode map's array 432*4882a593Smuzhiyun print "\t/* Print AVX opcode map array */" 433*4882a593Smuzhiyun for (i = 0; i < gaid; i++) 434*4882a593Smuzhiyun for (j = 0; j < max_lprefix; j++) 435*4882a593Smuzhiyun if (atable[i,j]) 436*4882a593Smuzhiyun print "\tinat_avx_tables["i"]["j"] = "atable[i,j]";" 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun print "}" 439*4882a593Smuzhiyun print "#endif" 440*4882a593Smuzhiyun} 441*4882a593Smuzhiyun 442