qemu-devel
[Top][All Lists]
Advanced

[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>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]