e2k: Fix decoding of ALES2/5.
This commit is contained in:
parent
562df00e27
commit
5aa3d47668
@ -47,12 +47,12 @@ static size_t unpack_bundle(CPUE2KState *env, DisasContext *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (GET_BIT(hs, 25)) {
|
if (GET_BIT(hs, 25)) {
|
||||||
bundle->ales_present[5] = ALES_ALLOCATED;
|
bundle->ales_present[5] = ALES_PRESENT;
|
||||||
bundle->ales[5] = 0x01c0;
|
bundle->ales[5] = 0x01c0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GET_BIT(hs, 22)) {
|
if (GET_BIT(hs, 22)) {
|
||||||
bundle->ales_present[2] = ALES_ALLOCATED;
|
bundle->ales_present[2] = ALES_PRESENT;
|
||||||
bundle->ales[2] = 0x01c0;
|
bundle->ales[2] = 0x01c0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,8 +76,8 @@ static size_t unpack_bundle(CPUE2KState *env, DisasContext *ctx)
|
|||||||
|
|
||||||
/* Adjust `ALES_PRESENT[{5,2}]' as proposed above now that we know that
|
/* Adjust `ALES_PRESENT[{5,2}]' as proposed above now that we know that
|
||||||
they are allocated. */
|
they are allocated. */
|
||||||
bundle->ales_present[5] |= ALES_PRESENT;
|
bundle->ales_present[5] |= ALES_ALLOCATED;
|
||||||
bundle->ales_present[2] |= ALES_PRESENT;
|
bundle->ales_present[2] |= ALES_ALLOCATED;
|
||||||
|
|
||||||
pos += 4;
|
pos += 4;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "alops.inc"
|
#include "alops.inc"
|
||||||
|
|
||||||
static int16_t alops_map[4][128][6] = { { { -1 } } };
|
static int16_t alops_map[4][128][6];
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
TCGv_i32 tag;
|
TCGv_i32 tag;
|
||||||
@ -27,6 +27,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
DisasContext *ctx;
|
DisasContext *ctx;
|
||||||
int chan;
|
int chan;
|
||||||
|
AlesFlag ales_present;
|
||||||
int aaincr_len;
|
int aaincr_len;
|
||||||
union {
|
union {
|
||||||
uint32_t als;
|
uint32_t als;
|
||||||
@ -2937,7 +2938,9 @@ static inline void gen_alopf2_dx(Instr *instr,
|
|||||||
|
|
||||||
static Alop find_op(Instr *instr)
|
static Alop find_op(Instr *instr)
|
||||||
{
|
{
|
||||||
int16_t index = alops_map[instr->opc2][instr->opc1][instr->chan];
|
/* ALES2/5 may be allocated but must not be used */
|
||||||
|
int opc2 = instr->ales_present & ALES_PRESENT ? instr->opc2 : 0;
|
||||||
|
int16_t index = alops_map[opc2][instr->opc1][instr->chan];
|
||||||
while (index != -1) {
|
while (index != -1) {
|
||||||
bool is_match = false;
|
bool is_match = false;
|
||||||
AlopDesc *desc = &alops[index];
|
AlopDesc *desc = &alops[index];
|
||||||
@ -4546,6 +4549,7 @@ static void chan_execute(DisasContext *ctx, int chan)
|
|||||||
instr.chan = chan;
|
instr.chan = chan;
|
||||||
instr.als = ctx->bundle.als[chan];
|
instr.als = ctx->bundle.als[chan];
|
||||||
instr.ales = ctx->bundle.ales[chan];
|
instr.ales = ctx->bundle.ales[chan];
|
||||||
|
instr.ales_present = ctx->bundle.ales_present[chan];
|
||||||
|
|
||||||
chan_check_preds(ctx, chan, l0);
|
chan_check_preds(ctx, chan, l0);
|
||||||
|
|
||||||
@ -4757,6 +4761,7 @@ void e2k_alc_init(DisasContext *ctx)
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
memset(alops_map, -1, sizeof(alops_map));
|
||||||
// TODO: symmetric alops table
|
// TODO: symmetric alops table
|
||||||
/* Most alops are symmetric and can be stored in a half table. */
|
/* Most alops are symmetric and can be stored in a half table. */
|
||||||
for (i = 0; i < ARRAY_SIZE(alops); i++) {
|
for (i = 0; i < ARRAY_SIZE(alops); i++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user