target-alpha: Use extract to get insn fields
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
0e154fe92c
commit
a9e05a1ceb
|
@ -1387,11 +1387,7 @@ static ExitStatus gen_mtpr(DisasContext *ctx, TCGv vb, int regno)
|
||||||
|
|
||||||
static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||||
{
|
{
|
||||||
uint32_t palcode;
|
int32_t disp21, disp16, disp12 __attribute__((unused));
|
||||||
int32_t disp21, disp16;
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
int32_t disp12;
|
|
||||||
#endif
|
|
||||||
uint16_t fn11;
|
uint16_t fn11;
|
||||||
uint8_t opc, ra, rb, rc, fpfn, fn7, lit;
|
uint8_t opc, ra, rb, rc, fpfn, fn7, lit;
|
||||||
bool islit;
|
bool islit;
|
||||||
|
@ -1400,34 +1396,31 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||||
ExitStatus ret;
|
ExitStatus ret;
|
||||||
|
|
||||||
/* Decode all instruction fields */
|
/* Decode all instruction fields */
|
||||||
opc = insn >> 26;
|
opc = extract32(insn, 26, 6);
|
||||||
ra = (insn >> 21) & 0x1F;
|
ra = extract32(insn, 21, 5);
|
||||||
rb = (insn >> 16) & 0x1F;
|
rb = extract32(insn, 16, 5);
|
||||||
rc = insn & 0x1F;
|
rc = extract32(insn, 0, 5);
|
||||||
islit = (insn >> 12) & 1;
|
islit = extract32(insn, 12, 1);
|
||||||
|
lit = extract32(insn, 13, 8);
|
||||||
|
|
||||||
|
disp21 = sextract32(insn, 0, 21);
|
||||||
|
disp16 = sextract32(insn, 0, 16);
|
||||||
|
disp12 = sextract32(insn, 0, 12);
|
||||||
|
|
||||||
|
fn11 = extract32(insn, 5, 11);
|
||||||
|
fpfn = extract32(insn, 5, 6);
|
||||||
|
fn7 = extract32(insn, 5, 7);
|
||||||
|
|
||||||
if (rb == 31 && !islit) {
|
if (rb == 31 && !islit) {
|
||||||
islit = 1;
|
islit = true;
|
||||||
lit = 0;
|
lit = 0;
|
||||||
} else {
|
|
||||||
lit = (insn >> 13) & 0xFF;
|
|
||||||
}
|
}
|
||||||
palcode = insn & 0x03FFFFFF;
|
|
||||||
disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
|
|
||||||
disp16 = (int16_t)(insn & 0x0000FFFF);
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
|
|
||||||
#endif
|
|
||||||
fn11 = (insn >> 5) & 0x000007FF;
|
|
||||||
fpfn = fn11 & 0x3F;
|
|
||||||
fn7 = (insn >> 5) & 0x0000007F;
|
|
||||||
LOG_DISAS("opc %02x ra %2d rb %2d rc %2d disp16 %6d\n",
|
|
||||||
opc, ra, rb, rc, disp16);
|
|
||||||
|
|
||||||
ret = NO_EXIT;
|
ret = NO_EXIT;
|
||||||
switch (opc) {
|
switch (opc) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
/* CALL_PAL */
|
/* CALL_PAL */
|
||||||
ret = gen_call_pal(ctx, palcode);
|
ret = gen_call_pal(ctx, insn & 0x03ffffff);
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
/* OPC01 */
|
/* OPC01 */
|
||||||
|
@ -2313,7 +2306,8 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_PAL_MODE);
|
REQUIRE_TB_FLAG(TB_FLAGS_PAL_MODE);
|
||||||
va = dest_gpr(ctx, ra);
|
va = dest_gpr(ctx, ra);
|
||||||
return gen_mfpr(va, insn & 0xffff);
|
ret = gen_mfpr(va, insn & 0xffff);
|
||||||
|
break;
|
||||||
#else
|
#else
|
||||||
goto invalid_opc;
|
goto invalid_opc;
|
||||||
#endif
|
#endif
|
||||||
|
@ -2548,7 +2542,8 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
REQUIRE_TB_FLAG(TB_FLAGS_PAL_MODE);
|
REQUIRE_TB_FLAG(TB_FLAGS_PAL_MODE);
|
||||||
vb = load_gpr(ctx, rb);
|
vb = load_gpr(ctx, rb);
|
||||||
return gen_mtpr(ctx, vb, insn & 0xffff);
|
ret = gen_mtpr(ctx, vb, insn & 0xffff);
|
||||||
|
break;
|
||||||
#else
|
#else
|
||||||
goto invalid_opc;
|
goto invalid_opc;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue