198fe07fcSMasami Hiramatsu#!/bin/awk -f
298fe07fcSMasami Hiramatsu# SPDX-License-Identifier: GPL-2.0
398fe07fcSMasami Hiramatsu# Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test
498fe07fcSMasami Hiramatsu# Reformats the disassembly as follows:
598fe07fcSMasami Hiramatsu# - Removes all lines except the disassembled instructions.
698fe07fcSMasami Hiramatsu# - For instructions that exceed 1 line (7 bytes), crams all the hex bytes
798fe07fcSMasami Hiramatsu# into a single line.
898fe07fcSMasami Hiramatsu# - Remove bad(or prefix only) instructions
998fe07fcSMasami Hiramatsu
1098fe07fcSMasami HiramatsuBEGIN {
1198fe07fcSMasami Hiramatsu	prev_addr = ""
1298fe07fcSMasami Hiramatsu	prev_hex = ""
1398fe07fcSMasami Hiramatsu	prev_mnemonic = ""
1498fe07fcSMasami Hiramatsu	bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))"
1598fe07fcSMasami Hiramatsu	fwait_expr = "^9b "
1698fe07fcSMasami Hiramatsu	fwait_str="9b\tfwait"
1798fe07fcSMasami Hiramatsu}
1898fe07fcSMasami Hiramatsu
1998fe07fcSMasami Hiramatsu/^ *[0-9a-f]+ <[^>]*>:/ {
2098fe07fcSMasami Hiramatsu	# Symbol entry
2198fe07fcSMasami Hiramatsu	printf("%s%s\n", $2, $1)
2298fe07fcSMasami Hiramatsu}
2398fe07fcSMasami Hiramatsu
2498fe07fcSMasami Hiramatsu/^ *[0-9a-f]+:/ {
2598fe07fcSMasami Hiramatsu	if (split($0, field, "\t") < 3) {
2698fe07fcSMasami Hiramatsu		# This is a continuation of the same insn.
2798fe07fcSMasami Hiramatsu		prev_hex = prev_hex field[2]
2898fe07fcSMasami Hiramatsu	} else {
2998fe07fcSMasami Hiramatsu		# Skip bad instructions
3098fe07fcSMasami Hiramatsu		if (match(prev_mnemonic, bad_expr))
3198fe07fcSMasami Hiramatsu			prev_addr = ""
3298fe07fcSMasami Hiramatsu		# Split fwait from other f* instructions
3398fe07fcSMasami Hiramatsu		if (match(prev_hex, fwait_expr) && prev_mnemonic != "fwait") {
3498fe07fcSMasami Hiramatsu			printf "%s\t%s\n", prev_addr, fwait_str
3598fe07fcSMasami Hiramatsu			sub(fwait_expr, "", prev_hex)
3698fe07fcSMasami Hiramatsu		}
3798fe07fcSMasami Hiramatsu		if (prev_addr != "")
3898fe07fcSMasami Hiramatsu			printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic
3998fe07fcSMasami Hiramatsu		prev_addr = field[1]
4098fe07fcSMasami Hiramatsu		prev_hex = field[2]
4198fe07fcSMasami Hiramatsu		prev_mnemonic = field[3]
4298fe07fcSMasami Hiramatsu	}
4398fe07fcSMasami Hiramatsu}
4498fe07fcSMasami Hiramatsu
4598fe07fcSMasami HiramatsuEND {
4698fe07fcSMasami Hiramatsu	if (prev_addr != "")
4798fe07fcSMasami Hiramatsu		printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic
4898fe07fcSMasami Hiramatsu}
49