162306a36Sopenharmony_ci#!/bin/awk -f
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci# Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test
462306a36Sopenharmony_ci# Reformats the disassembly as follows:
562306a36Sopenharmony_ci# - Removes all lines except the disassembled instructions.
662306a36Sopenharmony_ci# - For instructions that exceed 1 line (7 bytes), crams all the hex bytes
762306a36Sopenharmony_ci# into a single line.
862306a36Sopenharmony_ci# - Remove bad(or prefix only) instructions
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciBEGIN {
1162306a36Sopenharmony_ci	prev_addr = ""
1262306a36Sopenharmony_ci	prev_hex = ""
1362306a36Sopenharmony_ci	prev_mnemonic = ""
1462306a36Sopenharmony_ci	bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))"
1562306a36Sopenharmony_ci	fwait_expr = "^9b "
1662306a36Sopenharmony_ci	fwait_str="9b\tfwait"
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/^ *[0-9a-f]+ <[^>]*>:/ {
2062306a36Sopenharmony_ci	# Symbol entry
2162306a36Sopenharmony_ci	printf("%s%s\n", $2, $1)
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/^ *[0-9a-f]+:/ {
2562306a36Sopenharmony_ci	if (split($0, field, "\t") < 3) {
2662306a36Sopenharmony_ci		# This is a continuation of the same insn.
2762306a36Sopenharmony_ci		prev_hex = prev_hex field[2]
2862306a36Sopenharmony_ci	} else {
2962306a36Sopenharmony_ci		# Skip bad instructions
3062306a36Sopenharmony_ci		if (match(prev_mnemonic, bad_expr))
3162306a36Sopenharmony_ci			prev_addr = ""
3262306a36Sopenharmony_ci		# Split fwait from other f* instructions
3362306a36Sopenharmony_ci		if (match(prev_hex, fwait_expr) && prev_mnemonic != "fwait") {
3462306a36Sopenharmony_ci			printf "%s\t%s\n", prev_addr, fwait_str
3562306a36Sopenharmony_ci			sub(fwait_expr, "", prev_hex)
3662306a36Sopenharmony_ci		}
3762306a36Sopenharmony_ci		if (prev_addr != "")
3862306a36Sopenharmony_ci			printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic
3962306a36Sopenharmony_ci		prev_addr = field[1]
4062306a36Sopenharmony_ci		prev_hex = field[2]
4162306a36Sopenharmony_ci		prev_mnemonic = field[3]
4262306a36Sopenharmony_ci	}
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciEND {
4662306a36Sopenharmony_ci	if (prev_addr != "")
4762306a36Sopenharmony_ci		printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic
4862306a36Sopenharmony_ci}
49