[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v6 14/35] Hexagon (target/hexagon) instruction printing
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [PATCH v6 14/35] Hexagon (target/hexagon) instruction printing |
Date: |
Sat, 9 Jan 2021 23:41:45 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 |
Hi Taylor,
On 1/8/21 5:28 AM, Taylor Simpson wrote:
> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
> target/hexagon/printinsn.h | 28 ++++++++
> target/hexagon/printinsn.c | 158
> +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 186 insertions(+)
> create mode 100644 target/hexagon/printinsn.h
> create mode 100644 target/hexagon/printinsn.c
>
> diff --git a/target/hexagon/printinsn.h b/target/hexagon/printinsn.h
> new file mode 100644
> index 0000000..0e629b2
> --- /dev/null
> +++ b/target/hexagon/printinsn.h
> @@ -0,0 +1,28 @@
> +/*
> + * Copyright(c) 2019-2020 Qualcomm Innovation Center, Inc. All Rights
> Reserved.
(Again, 2019-2021, SPDX).
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef HEXAGON_PRINTINSN_H
> +#define HEXAGON_PRINTINSN_H
> +
> +#include "qemu/osdep.h"
> +#include "insn.h"
> +
> +extern void snprint_a_pkt_disas(char *buf, int n, Packet *pkt, uint32_t
> *words,
> + target_ulong pc);
> +extern void snprint_a_pkt_debug(char *buf, int n, Packet *pkt);
> +
> +#endif
> diff --git a/target/hexagon/printinsn.c b/target/hexagon/printinsn.c
> new file mode 100644
> index 0000000..8315d56
> --- /dev/null
> +++ b/target/hexagon/printinsn.c
...
> +void snprint_a_pkt_disas(char *buf, int n, Packet *pkt, uint32_t *words,
> + target_ulong pc)
> +{
> + char tmpbuf[128];
> + buf[0] = '\0';
> + bool has_endloop0 = false;
> + bool has_endloop1 = false;
> + bool has_endloop01 = false;
> +
> + for (int i = 0; i < pkt->num_insns; i++) {
> + if (pkt->insn[i].part1) {
> + continue;
> + }
> +
> + /* We'll print the endloop's at the end of the packet */
> + if (pkt->insn[i].opcode == J2_endloop0) {
> + has_endloop0 = true;
> + continue;
> + }
> + if (pkt->insn[i].opcode == J2_endloop1) {
> + has_endloop1 = true;
> + continue;
> + }
> + if (pkt->insn[i].opcode == J2_endloop01) {
> + has_endloop01 = true;
> + continue;
> + }
> +
> + snprintf(tmpbuf, 127, "0x" TARGET_FMT_lx "\t", words[i]);
> + strncat(buf, tmpbuf, n);
> +
> + if (i == 0) {
> + strncat(buf, "{", n);
> + }
> +
> + snprintinsn(tmpbuf, 127, &(pkt->insn[i]));
> + strncat(buf, "\t", n);
> + strncat(buf, tmpbuf, n);
> +
> + if (i < pkt->num_insns - 1) {
> + /*
> + * Subinstructions are two instructions encoded
> + * in the same word. Print them on the same line.
> + */
> + if (GET_ATTRIB(pkt->insn[i].opcode, A_SUBINSN)) {
> + strncat(buf, "; ", n);
> + snprintinsn(tmpbuf, 127, &(pkt->insn[i + 1]));
> + strncat(buf, tmpbuf, n);
> + i++;
> + } else if (pkt->insn[i + 1].opcode != J2_endloop0 &&
> + pkt->insn[i + 1].opcode != J2_endloop1 &&
> + pkt->insn[i + 1].opcode != J2_endloop01) {
> + pc += 4;
> + snprintf(tmpbuf, 127, "\n0x" TARGET_FMT_lx ": ", pc);
> + strncat(buf, tmpbuf, n);
> + }
> + }
> + }
> + strncat(buf, " }", n);
> + if (has_endloop0) {
> + strncat(buf, " :endloop0", n);
> + }
> + if (has_endloop1) {
> + strncat(buf, " :endloop1", n);
> + }
> + if (has_endloop01) {
> + strncat(buf, " :endloop01", n);
> + }
> + strncat(buf, "\n", n);
> +}
> +
> +void snprint_a_pkt_debug(char *buf, int n, Packet *pkt)
> +{
> + char tmpbuf[128];
> + buf[0] = '\0';
> + int slot, opcode;
> +
> + if (pkt->num_insns > 1) {
> + strncat(buf, "\n{\n", n);
> + }
> +
> + for (int i = 0; i < pkt->num_insns; i++) {
> + if (pkt->insn[i].part1) {
> + continue;
> + }
> + snprintinsn(tmpbuf, 127, &(pkt->insn[i]));
> + strncat(buf, "\t", n);
> + strncat(buf, tmpbuf, n);
> +
> + if (GET_ATTRIB(pkt->insn[i].opcode, A_SUBINSN)) {
> + strncat(buf, " //subinsn", n);
> + }
> + if (pkt->insn[i].extension_valid) {
> + strncat(buf, " //constant extended", n);
> + }
> + slot = pkt->insn[i].slot;
> + opcode = pkt->insn[i].opcode;
> + snprintf(tmpbuf, 127, " //slot=%d:tag=%s", slot,
> opcode_names[opcode]);
> + strncat(buf, tmpbuf, n);
> +
> + strncat(buf, "\n", n);
> + }
> + if (pkt->num_insns > 1) {
> + strncat(buf, "}\n", n);
> + }
> +}
Nowadays we prefer to use the GString rather than <string.h>.
Patch looks good, so:
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
- RE: [PATCH v6 05/35] Hexagon (disas) disassembler, (continued)
[PATCH v6 26/35] Hexagon (target/hexagon) TCG generation, Taylor Simpson, 2021/01/07
[PATCH v6 10/35] Hexagon (target/hexagon) instruction and packet types, Taylor Simpson, 2021/01/07
[PATCH v6 30/35] Hexagon (linux-user/hexagon) Linux user emulation, Taylor Simpson, 2021/01/07
[PATCH v6 11/35] Hexagon (target/hexagon) register fields, Taylor Simpson, 2021/01/07
[PATCH v6 08/35] Hexagon (target/hexagon) GDB Stub, Taylor Simpson, 2021/01/07
[PATCH v6 14/35] Hexagon (target/hexagon) instruction printing, Taylor Simpson, 2021/01/07
- Re: [PATCH v6 14/35] Hexagon (target/hexagon) instruction printing,
Philippe Mathieu-Daudé <=
[PATCH v6 13/35] Hexagon (target/hexagon) instruction/packet decode, Taylor Simpson, 2021/01/07
[PATCH v6 16/35] Hexagon (target/hexagon/conv_emu.[ch]) utility functions, Taylor Simpson, 2021/01/07
[PATCH v6 19/35] Hexagon (target/hexagon) generator phase 1 - C preprocessor for semantics, Taylor Simpson, 2021/01/07
[PATCH v6 15/35] Hexagon (target/hexagon/arch.[ch]) utility functions, Taylor Simpson, 2021/01/07
[PATCH v6 18/35] Hexagon (target/hexagon/imported) arch import, Taylor Simpson, 2021/01/07
[PATCH v6 20/35] Hexagon (target/hexagon) generator phase 2 - generate header files, Taylor Simpson, 2021/01/07
[PATCH v6 22/35] Hexagon (target/hexagon) generater phase 4 - decode tree, Taylor Simpson, 2021/01/07
[PATCH v6 23/35] Hexagon (target/hexagon) opcode data structures, Taylor Simpson, 2021/01/07
[PATCH v6 24/35] Hexagon (target/hexagon) macros, Taylor Simpson, 2021/01/07
[PATCH v6 27/35] Hexagon (target/hexagon) TCG for instructions with multiple definitions, Taylor Simpson, 2021/01/07