mirror of https://github.com/xemu-project/xemu.git
Hexagon (target/hexagon) Remove uses of op_regs_generated.h.inc
Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com> Reviewed-by: Brian Cain <bcain@quicinc.com> Message-Id: <20240307032327.4799-7-ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <bcain@quicinc.com>
This commit is contained in:
parent
b887b6b71c
commit
09a7e7db0f
target/hexagon
|
@ -115,24 +115,13 @@ static void
|
||||||
decode_fill_newvalue_regno(Packet *packet)
|
decode_fill_newvalue_regno(Packet *packet)
|
||||||
{
|
{
|
||||||
int i, use_regidx, offset, def_idx, dst_idx;
|
int i, use_regidx, offset, def_idx, dst_idx;
|
||||||
uint16_t def_opcode, use_opcode;
|
|
||||||
char *dststr;
|
|
||||||
|
|
||||||
for (i = 1; i < packet->num_insns; i++) {
|
for (i = 1; i < packet->num_insns; i++) {
|
||||||
if (GET_ATTRIB(packet->insn[i].opcode, A_DOTNEWVALUE) &&
|
if (GET_ATTRIB(packet->insn[i].opcode, A_DOTNEWVALUE) &&
|
||||||
!GET_ATTRIB(packet->insn[i].opcode, A_EXTENSION)) {
|
!GET_ATTRIB(packet->insn[i].opcode, A_EXTENSION)) {
|
||||||
use_opcode = packet->insn[i].opcode;
|
|
||||||
|
|
||||||
/* It's a store, so we're adjusting the Nt field */
|
g_assert(packet->insn[i].new_read_idx != -1);
|
||||||
if (GET_ATTRIB(use_opcode, A_STORE)) {
|
use_regidx = packet->insn[i].new_read_idx;
|
||||||
use_regidx = strchr(opcode_reginfo[use_opcode], 't') -
|
|
||||||
opcode_reginfo[use_opcode];
|
|
||||||
} else { /* It's a Jump, so we're adjusting the Ns field */
|
|
||||||
use_regidx = strchr(opcode_reginfo[use_opcode], 's') -
|
|
||||||
opcode_reginfo[use_opcode];
|
|
||||||
}
|
|
||||||
g_assert(packet->insn[i].new_read_idx != -1 &&
|
|
||||||
packet->insn[i].new_read_idx == use_regidx);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* What's encoded at the N-field is the offset to who's producing
|
* What's encoded at the N-field is the offset to who's producing
|
||||||
|
@ -153,39 +142,9 @@ decode_fill_newvalue_regno(Packet *packet)
|
||||||
*/
|
*/
|
||||||
g_assert(!((def_idx < 0) || (def_idx > (packet->num_insns - 1))));
|
g_assert(!((def_idx < 0) || (def_idx > (packet->num_insns - 1))));
|
||||||
|
|
||||||
/*
|
|
||||||
* packet->insn[def_idx] is the producer
|
|
||||||
* Figure out which type of destination it produces
|
|
||||||
* and the corresponding index in the reginfo
|
|
||||||
*/
|
|
||||||
def_opcode = packet->insn[def_idx].opcode;
|
|
||||||
dststr = strstr(opcode_wregs[def_opcode], "Rd");
|
|
||||||
if (dststr) {
|
|
||||||
dststr = strchr(opcode_reginfo[def_opcode], 'd');
|
|
||||||
} else {
|
|
||||||
dststr = strstr(opcode_wregs[def_opcode], "Rx");
|
|
||||||
if (dststr) {
|
|
||||||
dststr = strchr(opcode_reginfo[def_opcode], 'x');
|
|
||||||
} else {
|
|
||||||
dststr = strstr(opcode_wregs[def_opcode], "Re");
|
|
||||||
if (dststr) {
|
|
||||||
dststr = strchr(opcode_reginfo[def_opcode], 'e');
|
|
||||||
} else {
|
|
||||||
dststr = strstr(opcode_wregs[def_opcode], "Ry");
|
|
||||||
if (dststr) {
|
|
||||||
dststr = strchr(opcode_reginfo[def_opcode], 'y');
|
|
||||||
} else {
|
|
||||||
g_assert_not_reached();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_assert(dststr != NULL);
|
|
||||||
|
|
||||||
/* Now patch up the consumer with the register number */
|
/* Now patch up the consumer with the register number */
|
||||||
dst_idx = dststr - opcode_reginfo[def_opcode];
|
g_assert(packet->insn[def_idx].dest_idx != -1);
|
||||||
g_assert(packet->insn[def_idx].dest_idx != -1 &&
|
dst_idx = packet->insn[def_idx].dest_idx;
|
||||||
packet->insn[def_idx].dest_idx == dst_idx);
|
|
||||||
packet->insn[i].regno[use_regidx] =
|
packet->insn[i].regno[use_regidx] =
|
||||||
packet->insn[def_idx].regno[dst_idx];
|
packet->insn[def_idx].regno[dst_idx];
|
||||||
/*
|
/*
|
||||||
|
@ -366,11 +325,7 @@ static void decode_shuffle_for_execution(Packet *packet)
|
||||||
for (flag = false, i = 0; i < last_insn + 1; i++) {
|
for (flag = false, i = 0; i < last_insn + 1; i++) {
|
||||||
int opcode = packet->insn[i].opcode;
|
int opcode = packet->insn[i].opcode;
|
||||||
|
|
||||||
g_assert(packet->insn[i].has_pred_dest ==
|
if (packet->insn[i].has_pred_dest &&
|
||||||
(strstr(opcode_wregs[opcode], "Pd4") ||
|
|
||||||
strstr(opcode_wregs[opcode], "Pe4")));
|
|
||||||
if ((strstr(opcode_wregs[opcode], "Pd4") ||
|
|
||||||
strstr(opcode_wregs[opcode], "Pe4")) &&
|
|
||||||
GET_ATTRIB(opcode, A_STORE) == 0) {
|
GET_ATTRIB(opcode, A_STORE) == 0) {
|
||||||
/* This should be a compare (not a store conditional) */
|
/* This should be a compare (not a store conditional) */
|
||||||
if (flag) {
|
if (flag) {
|
||||||
|
|
|
@ -28,21 +28,15 @@ check_new_value(Packet *pkt)
|
||||||
{
|
{
|
||||||
/* .new value for a MMVector store */
|
/* .new value for a MMVector store */
|
||||||
int i, j;
|
int i, j;
|
||||||
const char *reginfo;
|
|
||||||
const char *destletters;
|
|
||||||
const char *dststr = NULL;
|
|
||||||
uint16_t def_opcode;
|
uint16_t def_opcode;
|
||||||
char letter;
|
|
||||||
|
|
||||||
for (i = 1; i < pkt->num_insns; i++) {
|
for (i = 1; i < pkt->num_insns; i++) {
|
||||||
uint16_t use_opcode = pkt->insn[i].opcode;
|
uint16_t use_opcode = pkt->insn[i].opcode;
|
||||||
if (GET_ATTRIB(use_opcode, A_DOTNEWVALUE) &&
|
if (GET_ATTRIB(use_opcode, A_DOTNEWVALUE) &&
|
||||||
GET_ATTRIB(use_opcode, A_CVI) &&
|
GET_ATTRIB(use_opcode, A_CVI) &&
|
||||||
GET_ATTRIB(use_opcode, A_STORE)) {
|
GET_ATTRIB(use_opcode, A_STORE)) {
|
||||||
int use_regidx = strchr(opcode_reginfo[use_opcode], 's') -
|
int use_regidx = pkt->insn[i].new_read_idx;
|
||||||
opcode_reginfo[use_opcode];
|
g_assert(pkt->insn[i].new_read_idx != -1);
|
||||||
g_assert(pkt->insn[i].new_read_idx != -1 &&
|
|
||||||
pkt->insn[i].new_read_idx == use_regidx);
|
|
||||||
/*
|
/*
|
||||||
* What's encoded at the N-field is the offset to who's producing
|
* What's encoded at the N-field is the offset to who's producing
|
||||||
* the value.
|
* the value.
|
||||||
|
@ -70,33 +64,19 @@ check_new_value(Packet *pkt)
|
||||||
|
|
||||||
/* def_idx is the index of the producer */
|
/* def_idx is the index of the producer */
|
||||||
def_opcode = pkt->insn[def_idx].opcode;
|
def_opcode = pkt->insn[def_idx].opcode;
|
||||||
reginfo = opcode_reginfo[def_opcode];
|
if ((pkt->insn[def_idx].dest_idx == -1) &&
|
||||||
destletters = "dexy";
|
GET_ATTRIB(def_opcode, A_CVI_GATHER)) {
|
||||||
for (j = 0; (letter = destletters[j]) != 0; j++) {
|
|
||||||
dststr = strchr(reginfo, letter);
|
|
||||||
if (dststr != NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((dststr == NULL) && GET_ATTRIB(def_opcode, A_CVI_GATHER)) {
|
|
||||||
pkt->insn[i].regno[use_regidx] = def_oreg;
|
pkt->insn[i].regno[use_regidx] = def_oreg;
|
||||||
pkt->insn[i].new_value_producer_slot = pkt->insn[def_idx].slot;
|
pkt->insn[i].new_value_producer_slot = pkt->insn[def_idx].slot;
|
||||||
} else {
|
} else {
|
||||||
if (dststr == NULL) {
|
if (pkt->insn[def_idx].dest_idx == -1) {
|
||||||
/* still not there, we have a bad packet */
|
/* still not there, we have a bad packet */
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
g_assert(pkt->insn[def_idx].dest_idx != -1 &&
|
int def_regnum =
|
||||||
pkt->insn[def_idx].dest_idx == dststr - reginfo);
|
pkt->insn[def_idx].regno[pkt->insn[def_idx].dest_idx];
|
||||||
int def_regnum = pkt->insn[def_idx].regno[dststr - reginfo];
|
|
||||||
/* Now patch up the consumer with the register number */
|
/* Now patch up the consumer with the register number */
|
||||||
pkt->insn[i].regno[use_regidx] = def_regnum ^ def_oreg;
|
pkt->insn[i].regno[use_regidx] = def_regnum ^ def_oreg;
|
||||||
/* special case for (Vx,Vy) */
|
|
||||||
dststr = strchr(reginfo, 'y');
|
|
||||||
if (def_oreg && strchr(reginfo, 'x') && dststr) {
|
|
||||||
def_regnum = pkt->insn[def_idx].regno[dststr - reginfo];
|
|
||||||
pkt->insn[i].regno[use_regidx] = def_regnum;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* We need to remember who produces this value to later
|
* We need to remember who produces this value to later
|
||||||
* check if it was dynamically cancelled
|
* check if it was dynamically cancelled
|
||||||
|
|
|
@ -36,34 +36,6 @@ const char * const opcode_names[] = {
|
||||||
#undef OPCODE
|
#undef OPCODE
|
||||||
};
|
};
|
||||||
|
|
||||||
const char * const opcode_reginfo[] = {
|
|
||||||
#define IMMINFO(TAG, SIGN, SIZE, SHAMT, SIGN2, SIZE2, SHAMT2) /* nothing */
|
|
||||||
#define REGINFO(TAG, REGINFO, RREGS, WREGS) REGINFO,
|
|
||||||
#include "op_regs_generated.h.inc"
|
|
||||||
NULL
|
|
||||||
#undef REGINFO
|
|
||||||
#undef IMMINFO
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const char * const opcode_rregs[] = {
|
|
||||||
#define IMMINFO(TAG, SIGN, SIZE, SHAMT, SIGN2, SIZE2, SHAMT2) /* nothing */
|
|
||||||
#define REGINFO(TAG, REGINFO, RREGS, WREGS) RREGS,
|
|
||||||
#include "op_regs_generated.h.inc"
|
|
||||||
NULL
|
|
||||||
#undef REGINFO
|
|
||||||
#undef IMMINFO
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const char * const opcode_wregs[] = {
|
|
||||||
#define IMMINFO(TAG, SIGN, SIZE, SHAMT, SIGN2, SIZE2, SHAMT2) /* nothing */
|
|
||||||
#define REGINFO(TAG, REGINFO, RREGS, WREGS) WREGS,
|
|
||||||
#include "op_regs_generated.h.inc"
|
|
||||||
NULL
|
|
||||||
#undef REGINFO
|
|
||||||
#undef IMMINFO
|
|
||||||
};
|
|
||||||
|
|
||||||
const char * const opcode_short_semantics[] = {
|
const char * const opcode_short_semantics[] = {
|
||||||
#define DEF_SHORTCODE(TAG, SHORTCODE) [TAG] = #SHORTCODE,
|
#define DEF_SHORTCODE(TAG, SHORTCODE) [TAG] = #SHORTCODE,
|
||||||
|
|
|
@ -40,10 +40,6 @@ typedef enum {
|
||||||
|
|
||||||
extern const char * const opcode_names[];
|
extern const char * const opcode_names[];
|
||||||
|
|
||||||
extern const char * const opcode_reginfo[];
|
|
||||||
extern const char * const opcode_rregs[];
|
|
||||||
extern const char * const opcode_wregs[];
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char * const encoding;
|
const char * const encoding;
|
||||||
const EncClass enc_class;
|
const EncClass enc_class;
|
||||||
|
|
Loading…
Reference in New Issue