mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
This series adds support for the Hexagon Vector eXtensions (HVX)
These instructions are documented here https://developer.qualcomm.com/downloads/qualcomm-hexagon-v66-hvx-programmer-s-reference-manual Hexagon HVX is a wide vector engine with 128 byte vectors. See patch 01 Hexagon HVX README for more information. *** Changes in v2 *** Remove HVX tests from makefile to avoid need for toolchain upgrade -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJhgvvEAAoJEHsCRPsS3kQiMrQH/2ZGLfiWts1Vyi+phoXz24bC x/kAarlkCPP9YjiKa1HFCoX8L58O/r0ES6gwe2amXWDQoC+kQYoAJawOtgasGvuj ePctEkNLTJ2l5kkh83ITREVDpVXzoiAYSQ5hicJtKyAyfjFrdqC9mhHhRbShGG3+ KA5JnyczrnuoIzaJxEbDPVaL/3hHThvpxV1bi9CWrEvjqa64Flot1szKAJlCeaTM GgersSCodtMyZHtU36ngzPDVrYNtTYZ5OiYkNpdEzHtzpuItq0xVMP0dGn2WGO+1 0CTnuDmzJXMo+RDTo8pniz5pESgBbD9WMbgFEG3I0xUQIj0MdMkZa+h8lUvhmb4= =TK+z -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/quic/tags/pull-hex-20211103' into staging This series adds support for the Hexagon Vector eXtensions (HVX) These instructions are documented here https://developer.qualcomm.com/downloads/qualcomm-hexagon-v66-hvx-programmer-s-reference-manual Hexagon HVX is a wide vector engine with 128 byte vectors. See patch 01 Hexagon HVX README for more information. *** Changes in v2 *** Remove HVX tests from makefile to avoid need for toolchain upgrade # gpg: Signature made Wed 03 Nov 2021 05:14:44 PM EDT # gpg: using RSA key 7B0244FB12DE4422 # gpg: Good signature from "Taylor Simpson (Rock on) <tsimpson@quicinc.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 3635 C788 CE62 B91F D4C5 9AB4 7B02 44FB 12DE 4422 * remotes/quic/tags/pull-hex-20211103: (30 commits) Hexagon HVX (tests/tcg/hexagon) histogram test Hexagon HVX (tests/tcg/hexagon) scatter_gather test Hexagon HVX (tests/tcg/hexagon) hvx_misc test Hexagon HVX (tests/tcg/hexagon) vector_add_int test Hexagon HVX (target/hexagon) import instruction encodings Hexagon HVX (target/hexagon) instruction decoding Hexagon HVX (target/hexagon) import semantics Hexagon HVX (target/hexagon) helper overrides - vector stores Hexagon HVX (target/hexagon) helper overrides - vector loads Hexagon HVX (target/hexagon) helper overrides - vector splat and abs Hexagon HVX (target/hexagon) helper overrides - vector compares Hexagon HVX (target/hexagon) helper overrides - vector logical ops Hexagon HVX (target/hexagon) helper overrides - vector max/min Hexagon HVX (target/hexagon) helper overrides - vector shifts Hexagon HVX (target/hexagon) helper overrides - vector add & sub Hexagon HVX (target/hexagon) helper overrides - vector assign & cmov Hexagon HVX (target/hexagon) helper overrides for histogram instructions Hexagon HVX (target/hexagon) helper overrides infrastructure Hexagon HVX (target/hexagon) TCG generation Hexagon HVX (target/hexagon) helper functions ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
c88da1f3da
45 changed files with 10221 additions and 47 deletions
|
@ -59,7 +59,7 @@ const char * const hexagon_regnames[TOTAL_PER_THREAD_REGS] = {
|
|||
"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
|
||||
"sa0", "lc0", "sa1", "lc1", "p3_0", "c5", "m0", "m1",
|
||||
"usr", "pc", "ugp", "gp", "cs0", "cs1", "c14", "c15",
|
||||
"c16", "c17", "c18", "c19", "pkt_cnt", "insn_cnt", "c22", "c23",
|
||||
"c16", "c17", "c18", "c19", "pkt_cnt", "insn_cnt", "hvx_cnt", "c23",
|
||||
"c24", "c25", "c26", "c27", "c28", "c29", "c30", "c31",
|
||||
};
|
||||
|
||||
|
@ -113,7 +113,66 @@ static void print_reg(FILE *f, CPUHexagonState *env, int regnum)
|
|||
hexagon_regnames[regnum], value);
|
||||
}
|
||||
|
||||
static void hexagon_dump(CPUHexagonState *env, FILE *f)
|
||||
static void print_vreg(FILE *f, CPUHexagonState *env, int regnum,
|
||||
bool skip_if_zero)
|
||||
{
|
||||
if (skip_if_zero) {
|
||||
bool nonzero_found = false;
|
||||
for (int i = 0; i < MAX_VEC_SIZE_BYTES; i++) {
|
||||
if (env->VRegs[regnum].ub[i] != 0) {
|
||||
nonzero_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!nonzero_found) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
qemu_fprintf(f, " v%d = ( ", regnum);
|
||||
qemu_fprintf(f, "0x%02x", env->VRegs[regnum].ub[MAX_VEC_SIZE_BYTES - 1]);
|
||||
for (int i = MAX_VEC_SIZE_BYTES - 2; i >= 0; i--) {
|
||||
qemu_fprintf(f, ", 0x%02x", env->VRegs[regnum].ub[i]);
|
||||
}
|
||||
qemu_fprintf(f, " )\n");
|
||||
}
|
||||
|
||||
void hexagon_debug_vreg(CPUHexagonState *env, int regnum)
|
||||
{
|
||||
print_vreg(stdout, env, regnum, false);
|
||||
}
|
||||
|
||||
static void print_qreg(FILE *f, CPUHexagonState *env, int regnum,
|
||||
bool skip_if_zero)
|
||||
{
|
||||
if (skip_if_zero) {
|
||||
bool nonzero_found = false;
|
||||
for (int i = 0; i < MAX_VEC_SIZE_BYTES / 8; i++) {
|
||||
if (env->QRegs[regnum].ub[i] != 0) {
|
||||
nonzero_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!nonzero_found) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
qemu_fprintf(f, " q%d = ( ", regnum);
|
||||
qemu_fprintf(f, "0x%02x",
|
||||
env->QRegs[regnum].ub[MAX_VEC_SIZE_BYTES / 8 - 1]);
|
||||
for (int i = MAX_VEC_SIZE_BYTES / 8 - 2; i >= 0; i--) {
|
||||
qemu_fprintf(f, ", 0x%02x", env->QRegs[regnum].ub[i]);
|
||||
}
|
||||
qemu_fprintf(f, " )\n");
|
||||
}
|
||||
|
||||
void hexagon_debug_qreg(CPUHexagonState *env, int regnum)
|
||||
{
|
||||
print_qreg(stdout, env, regnum, false);
|
||||
}
|
||||
|
||||
static void hexagon_dump(CPUHexagonState *env, FILE *f, int flags)
|
||||
{
|
||||
HexagonCPU *cpu = env_archcpu(env);
|
||||
|
||||
|
@ -159,6 +218,17 @@ static void hexagon_dump(CPUHexagonState *env, FILE *f)
|
|||
print_reg(f, env, HEX_REG_CS1);
|
||||
#endif
|
||||
qemu_fprintf(f, "}\n");
|
||||
|
||||
if (flags & CPU_DUMP_FPU) {
|
||||
qemu_fprintf(f, "Vector Registers = {\n");
|
||||
for (int i = 0; i < NUM_VREGS; i++) {
|
||||
print_vreg(f, env, i, true);
|
||||
}
|
||||
for (int i = 0; i < NUM_QREGS; i++) {
|
||||
print_qreg(f, env, i, true);
|
||||
}
|
||||
qemu_fprintf(f, "}\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void hexagon_dump_state(CPUState *cs, FILE *f, int flags)
|
||||
|
@ -166,12 +236,12 @@ static void hexagon_dump_state(CPUState *cs, FILE *f, int flags)
|
|||
HexagonCPU *cpu = HEXAGON_CPU(cs);
|
||||
CPUHexagonState *env = &cpu->env;
|
||||
|
||||
hexagon_dump(env, f);
|
||||
hexagon_dump(env, f, flags);
|
||||
}
|
||||
|
||||
void hexagon_debug(CPUHexagonState *env)
|
||||
{
|
||||
hexagon_dump(env, stdout);
|
||||
hexagon_dump(env, stdout, CPU_DUMP_FPU);
|
||||
}
|
||||
|
||||
static void hexagon_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
|
@ -269,7 +339,7 @@ static void hexagon_cpu_class_init(ObjectClass *c, void *data)
|
|||
cc->set_pc = hexagon_cpu_set_pc;
|
||||
cc->gdb_read_register = hexagon_gdb_read_register;
|
||||
cc->gdb_write_register = hexagon_gdb_write_register;
|
||||
cc->gdb_num_core_regs = TOTAL_PER_THREAD_REGS;
|
||||
cc->gdb_num_core_regs = TOTAL_PER_THREAD_REGS + NUM_VREGS + NUM_QREGS;
|
||||
cc->gdb_stop_before_watchpoint = true;
|
||||
cc->disas_set_info = hexagon_cpu_disas_set_info;
|
||||
cc->tcg_ops = &hexagon_tcg_ops;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue