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