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:
Taylor Simpson 2024-03-06 20:23:24 -07:00 committed by Brian Cain
parent b887b6b71c
commit 09a7e7db0f
4 changed files with 12 additions and 109 deletions

View File

@ -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) {

View File

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

View File

@ -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,

View File

@ -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;