aboutsummaryrefslogtreecommitdiff
path: root/sim/arm/maverick.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/arm/maverick.c')
-rw-r--r--sim/arm/maverick.c184
1 files changed, 92 insertions, 92 deletions
diff --git a/sim/arm/maverick.c b/sim/arm/maverick.c
index 1b0dca9..9c3ea08 100644
--- a/sim/arm/maverick.c
+++ b/sim/arm/maverick.c
@@ -1,7 +1,7 @@
/* maverick.c -- Cirrus/DSP co-processor interface.
Copyright (C) 2003-2015 Free Software Foundation, Inc.
Contributed by Aldy Hernandez (aldyh@redhat.com).
-
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
@@ -47,7 +47,7 @@ struct maverick_regs
int i;
float f;
} upper;
-
+
union
{
int i;
@@ -93,7 +93,7 @@ cirrus_not_implemented (char * insn)
{
fprintf (stderr, "Cirrus instruction '%s' not implemented.\n", insn);
fprintf (stderr, "aborting!\n");
-
+
exit (1);
}
@@ -110,19 +110,19 @@ DSPMRC4 (ARMul_State * state ATTRIBUTE_UNUSED,
printfdbg ("cfmvrdl\n");
printfdbg ("\tlower half=0x%x\n", DSPregs[SRC1_REG].lower.i);
printfdbg ("\tentire thing=%g\n", mv_getRegDouble (SRC1_REG));
-
+
*value = (ARMword) DSPregs[SRC1_REG].lower.i;
break;
-
+
case 1: /* cfmvrdh */
/* Move upper half of a DF stored in a DSP reg into an Arm reg. */
printfdbg ("cfmvrdh\n");
printfdbg ("\tupper half=0x%x\n", DSPregs[SRC1_REG].upper.i);
printfdbg ("\tentire thing=%g\n", mv_getRegDouble (SRC1_REG));
-
+
*value = (ARMword) DSPregs[SRC1_REG].upper.i;
break;
-
+
case 2: /* cfmvrs */
/* Move SF from upper half of a DSP register to an Arm register. */
*value = (ARMword) DSPregs[SRC1_REG].upper.i;
@@ -130,7 +130,7 @@ DSPMRC4 (ARMul_State * state ATTRIBUTE_UNUSED,
SRC1_REG,
DSPregs[SRC1_REG].upper.f);
break;
-
+
#ifdef doesnt_work
case 4: /* cfcmps */
{
@@ -150,7 +150,7 @@ DSPMRC4 (ARMul_State * state ATTRIBUTE_UNUSED,
*value = (n << 31) | (z << 30) | (c << 29) | (v << 28);
break;
}
-
+
case 5: /* cfcmpd */
{
double a, b;
@@ -177,7 +177,7 @@ DSPMRC4 (ARMul_State * state ATTRIBUTE_UNUSED,
a = DSPregs[SRC1_REG].upper.f;
b = DSPregs[SRC2_REG].upper.f;
-
+
printfdbg ("cfcmps\n");
printfdbg ("\tcomparing %f and %f\n", a, b);
@@ -197,10 +197,10 @@ DSPMRC4 (ARMul_State * state ATTRIBUTE_UNUSED,
a = mv_getRegDouble (SRC1_REG);
b = mv_getRegDouble (SRC2_REG);
-
+
printfdbg ("cfcmpd\n");
printfdbg ("\tcomparing %g and %g\n", a, b);
-
+
z = a == b; /* zero */
n = a < b; /* negative */
c = a > b; /* carry */
@@ -233,13 +233,13 @@ DSPMRC5 (ARMul_State * state ATTRIBUTE_UNUSED,
DEST_REG,
(int) *value);
break;
-
+
case 1: /* cfmvr64h */
/* Move upper half of 64bit int from Cirrus to Arm. */
*value = (ARMword) DSPregs[SRC1_REG].upper.i;
printfdbg ("cfmvr64h <-- %d\n", (int) *value);
break;
-
+
case 4: /* cfcmp32 */
{
int res;
@@ -270,7 +270,7 @@ DSPMRC5 (ARMul_State * state ATTRIBUTE_UNUSED,
*value = (n << 31) | (z << 30) | (c << 29) | (v << 28);
break;
}
-
+
case 5: /* cfcmp64 */
{
long long res;
@@ -302,7 +302,7 @@ DSPMRC5 (ARMul_State * state ATTRIBUTE_UNUSED,
*value = (n << 31) | (z << 30) | (c << 29) | (v << 28);
break;
}
-
+
default:
fprintf (stderr, "unknown opcode in DSPMRC5 0x%x\n", instr);
cirrus_not_implemented ("unknown");
@@ -323,27 +323,27 @@ DSPMRC6 (ARMul_State * state ATTRIBUTE_UNUSED,
case 0: /* cfmval32 */
cirrus_not_implemented ("cfmval32");
break;
-
+
case 1: /* cfmvam32 */
cirrus_not_implemented ("cfmvam32");
break;
-
+
case 2: /* cfmvah32 */
cirrus_not_implemented ("cfmvah32");
break;
-
+
case 3: /* cfmva32 */
cirrus_not_implemented ("cfmva32");
break;
-
+
case 4: /* cfmva64 */
cirrus_not_implemented ("cfmva64");
break;
-
+
case 5: /* cfmvsc32 */
cirrus_not_implemented ("cfmvsc32");
break;
-
+
default:
fprintf (stderr, "unknown opcode in DSPMRC6 0x%x\n", instr);
cirrus_not_implemented ("unknown");
@@ -367,20 +367,20 @@ DSPMCR4 (ARMul_State * state,
printfdbg ("cfmvdlr <-- 0x%x\n", (int) value);
DSPregs[SRC1_REG].lower.i = (int) value;
break;
-
+
case 1: /* cfmvdhr */
/* Move the upper half of a DF value from an Arm register into
the upper half of a Cirrus register. */
printfdbg ("cfmvdhr <-- 0x%x\n", (int) value);
DSPregs[SRC1_REG].upper.i = (int) value;
break;
-
+
case 2: /* cfmvsr */
/* Move SF from Arm register into upper half of Cirrus register. */
printfdbg ("cfmvsr <-- 0x%x\n", (int) value);
DSPregs[SRC1_REG].upper.i = (int) value;
break;
-
+
default:
fprintf (stderr, "unknown opcode in DSPMCR4 0x%x\n", instr);
cirrus_not_implemented ("unknown");
@@ -410,7 +410,7 @@ DSPMCR5 (ARMul_State * state,
printfdbg ("cfmv64lr mvdx%d <-- 0x%x\n", SRC1_REG, (int) value);
DSPregs[SRC1_REG].lower.i = (int) value;
break;
-
+
case 1: /* cfmv64hr */
/* Move upper half of a 64bit int from an ARM register into the
upper half of a DSP register. */
@@ -419,7 +419,7 @@ DSPMCR5 (ARMul_State * state,
(int) value);
DSPregs[SRC1_REG].upper.i = (int) value;
break;
-
+
case 2: /* cfrshl32 */
printfdbg ("cfrshl32\n");
val.us = value;
@@ -428,7 +428,7 @@ DSPMCR5 (ARMul_State * state,
else
DSPregs[SRC2_REG].lower.i = DSPregs[SRC1_REG].lower.i >> -value;
break;
-
+
case 3: /* cfrshl64 */
printfdbg ("cfrshl64\n");
val.us = value;
@@ -437,7 +437,7 @@ DSPMCR5 (ARMul_State * state,
else
mv_setReg64int (SRC2_REG, mv_getReg64int (SRC1_REG) >> -value);
break;
-
+
default:
fprintf (stderr, "unknown opcode in DSPMCR5 0x%x\n", instr);
cirrus_not_implemented ("unknown");
@@ -458,27 +458,27 @@ DSPMCR6 (ARMul_State * state,
case 0: /* cfmv32al */
cirrus_not_implemented ("cfmv32al");
break;
-
+
case 1: /* cfmv32am */
cirrus_not_implemented ("cfmv32am");
break;
-
+
case 2: /* cfmv32ah */
cirrus_not_implemented ("cfmv32ah");
break;
-
+
case 3: /* cfmv32a */
cirrus_not_implemented ("cfmv32a");
break;
-
+
case 4: /* cfmv64a */
cirrus_not_implemented ("cfmv64a");
break;
-
+
case 5: /* cfmv32sc */
cirrus_not_implemented ("cfmv32sc");
break;
-
+
default:
fprintf (stderr, "unknown opcode in DSPMCR6 0x%x\n", instr);
cirrus_not_implemented ("unknown");
@@ -501,14 +501,14 @@ DSPLDC4 (ARMul_State * state ATTRIBUTE_UNUSED,
words = 0;
return ARMul_DONE;
}
-
+
if (BIT (22))
{ /* it's a long access, get two words */
/* cfldrd */
printfdbg ("cfldrd: %x (words = %d) (bigend = %d) DESTREG = %d\n",
data, words, state->bigendSig, DEST_REG);
-
+
if (words == 0)
{
if (state->bigendSig)
@@ -523,14 +523,14 @@ DSPLDC4 (ARMul_State * state ATTRIBUTE_UNUSED,
else
DSPregs[DEST_REG].upper.i = (int) data;
}
-
+
++ words;
-
+
if (words == 2)
{
printfdbg ("\tmvd%d <-- mem = %g\n", DEST_REG,
mv_getRegDouble (DEST_REG));
-
+
return ARMul_DONE;
}
else
@@ -539,7 +539,7 @@ DSPLDC4 (ARMul_State * state ATTRIBUTE_UNUSED,
else
{
/* Get just one word. */
-
+
/* cfldrs */
printfdbg ("cfldrs\n");
@@ -565,11 +565,11 @@ DSPLDC5 (ARMul_State * state ATTRIBUTE_UNUSED,
words = 0;
return ARMul_DONE;
}
-
+
if (BIT (22))
{
/* It's a long access, get two words. */
-
+
/* cfldr64 */
printfdbg ("cfldr64: %d\n", data);
@@ -587,14 +587,14 @@ DSPLDC5 (ARMul_State * state ATTRIBUTE_UNUSED,
else
DSPregs[DEST_REG].upper.i = (int) data;
}
-
+
++ words;
-
+
if (words == 2)
{
printfdbg ("\tmvdx%d <-- mem = %lld\n", DEST_REG,
mv_getReg64int (DEST_REG));
-
+
return ARMul_DONE;
}
else
@@ -603,10 +603,10 @@ DSPLDC5 (ARMul_State * state ATTRIBUTE_UNUSED,
else
{
/* Get just one word. */
-
+
/* cfldr32 */
printfdbg ("cfldr32 mvfx%d <-- %d\n", DEST_REG, (int) data);
-
+
/* 32bit ints should be sign extended to 64bits when loaded. */
mv_setReg64int (DEST_REG, (long long) data);
@@ -627,7 +627,7 @@ DSPSTC4 (ARMul_State * state ATTRIBUTE_UNUSED,
words = 0;
return ARMul_DONE;
}
-
+
if (BIT (22))
{
/* It's a long access, get two words. */
@@ -648,14 +648,14 @@ DSPSTC4 (ARMul_State * state ATTRIBUTE_UNUSED,
else
*data = (ARMword) DSPregs[DEST_REG].upper.i;
}
-
+
++ words;
-
+
if (words == 2)
{
printfdbg ("\tmem = mvd%d = %g\n", DEST_REG,
mv_getRegDouble (DEST_REG));
-
+
return ARMul_DONE;
}
else
@@ -687,7 +687,7 @@ DSPSTC5 (ARMul_State * state ATTRIBUTE_UNUSED,
words = 0;
return ARMul_DONE;
}
-
+
if (BIT (22))
{
/* It's a long access, store two words. */
@@ -708,14 +708,14 @@ DSPSTC5 (ARMul_State * state ATTRIBUTE_UNUSED,
else
*data = (ARMword) DSPregs[DEST_REG].upper.i;
}
-
+
++ words;
-
+
if (words == 2)
{
printfdbg ("\tmem = mvd%d = %lld\n", DEST_REG,
mv_getReg64int (DEST_REG));
-
+
return ARMul_DONE;
}
else
@@ -726,7 +726,7 @@ DSPSTC5 (ARMul_State * state ATTRIBUTE_UNUSED,
/* Store just one word. */
/* cfstr32 */
*data = (ARMword) DSPregs[DEST_REG].lower.i;
-
+
printfdbg ("cfstr32 MEM = %d\n", (int) *data);
return ARMul_DONE;
@@ -754,7 +754,7 @@ DSPCDP4 (ARMul_State * state,
DSPregs[SRC1_REG].upper.f);
DSPregs[DEST_REG].upper.f = DSPregs[SRC1_REG].upper.f;
break;
-
+
case 1: /* cfcpyd */
printfdbg ("cfcpyd mvd%d = mvd%d = %g\n",
DEST_REG,
@@ -762,7 +762,7 @@ DSPCDP4 (ARMul_State * state,
mv_getRegDouble (SRC1_REG));
mv_setRegDouble (DEST_REG, mv_getRegDouble (SRC1_REG));
break;
-
+
case 2: /* cfcvtds */
printfdbg ("cfcvtds mvf%d = (float) mvd%d = %f\n",
DEST_REG,
@@ -770,7 +770,7 @@ DSPCDP4 (ARMul_State * state,
(float) mv_getRegDouble (SRC1_REG));
DSPregs[DEST_REG].upper.f = (float) mv_getRegDouble (SRC1_REG);
break;
-
+
case 3: /* cfcvtsd */
printfdbg ("cfcvtsd mvd%d = mvf%d = %g\n",
DEST_REG,
@@ -778,7 +778,7 @@ DSPCDP4 (ARMul_State * state,
(double) DSPregs[SRC1_REG].upper.f);
mv_setRegDouble (DEST_REG, (double) DSPregs[SRC1_REG].upper.f);
break;
-
+
case 4: /* cfcvt32s */
printfdbg ("cfcvt32s mvf%d = mvfx%d = %f\n",
DEST_REG,
@@ -786,7 +786,7 @@ DSPCDP4 (ARMul_State * state,
(float) DSPregs[SRC1_REG].lower.i);
DSPregs[DEST_REG].upper.f = (float) DSPregs[SRC1_REG].lower.i;
break;
-
+
case 5: /* cfcvt32d */
printfdbg ("cfcvt32d mvd%d = mvfx%d = %g\n",
DEST_REG,
@@ -794,7 +794,7 @@ DSPCDP4 (ARMul_State * state,
(double) DSPregs[SRC1_REG].lower.i);
mv_setRegDouble (DEST_REG, (double) DSPregs[SRC1_REG].lower.i);
break;
-
+
case 6: /* cfcvt64s */
printfdbg ("cfcvt64s mvf%d = mvdx%d = %f\n",
DEST_REG,
@@ -802,7 +802,7 @@ DSPCDP4 (ARMul_State * state,
(float) mv_getReg64int (SRC1_REG));
DSPregs[DEST_REG].upper.f = (float) mv_getReg64int (SRC1_REG);
break;
-
+
case 7: /* cfcvt64d */
printfdbg ("cfcvt64d mvd%d = mvdx%d = %g\n",
DEST_REG,
@@ -821,11 +821,11 @@ DSPCDP4 (ARMul_State * state,
DEST_REG,
SRC1_REG,
DSPregs[SRC1_REG].upper.f * DSPregs[SRC2_REG].upper.f);
-
+
DSPregs[DEST_REG].upper.f = DSPregs[SRC1_REG].upper.f
* DSPregs[SRC2_REG].upper.f;
break;
-
+
case 1: /* cfmuld */
printfdbg ("cfmuld mvd%d = mvd%d = %g\n",
DEST_REG,
@@ -836,7 +836,7 @@ DSPCDP4 (ARMul_State * state,
mv_getRegDouble (SRC1_REG)
* mv_getRegDouble (SRC2_REG));
break;
-
+
default:
fprintf (stderr, "unknown opcode in DSPCDP4 0x%x\n", instr);
cirrus_not_implemented ("unknown");
@@ -856,7 +856,7 @@ DSPCDP4 (ARMul_State * state,
SRC1_REG,
DSPregs[DEST_REG].upper.f);
break;
-
+
case 1: /* cfabsd */
mv_setRegDouble (DEST_REG,
(mv_getRegDouble (SRC1_REG) < 0.0 ?
@@ -867,7 +867,7 @@ DSPCDP4 (ARMul_State * state,
SRC1_REG,
mv_getRegDouble (DEST_REG));
break;
-
+
case 2: /* cfnegs */
DSPregs[DEST_REG].upper.f = -DSPregs[SRC1_REG].upper.f;
printfdbg ("cfnegs mvf%d = -mvf%d = %f\n",
@@ -875,7 +875,7 @@ DSPCDP4 (ARMul_State * state,
SRC1_REG,
DSPregs[DEST_REG].upper.f);
break;
-
+
case 3: /* cfnegd */
mv_setRegDouble (DEST_REG,
-mv_getRegDouble (SRC1_REG));
@@ -883,7 +883,7 @@ DSPCDP4 (ARMul_State * state,
DEST_REG,
mv_getRegDouble (DEST_REG));
break;
-
+
case 4: /* cfadds */
DSPregs[DEST_REG].upper.f = DSPregs[SRC1_REG].upper.f
+ DSPregs[SRC2_REG].upper.f;
@@ -893,7 +893,7 @@ DSPCDP4 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].upper.f);
break;
-
+
case 5: /* cfaddd */
mv_setRegDouble (DEST_REG,
mv_getRegDouble (SRC1_REG)
@@ -904,7 +904,7 @@ DSPCDP4 (ARMul_State * state,
SRC2_REG,
mv_getRegDouble (DEST_REG));
break;
-
+
case 6: /* cfsubs */
DSPregs[DEST_REG].upper.f = DSPregs[SRC1_REG].upper.f
- DSPregs[SRC2_REG].upper.f;
@@ -914,7 +914,7 @@ DSPCDP4 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].upper.f);
break;
-
+
case 7: /* cfsubd */
mv_setRegDouble (DEST_REG,
mv_getRegDouble (SRC1_REG)
@@ -978,7 +978,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 1: /* cfmul64 */
mv_setReg64int (DEST_REG,
mv_getReg64int (SRC1_REG)
@@ -989,7 +989,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
mv_getReg64int (DEST_REG));
break;
-
+
case 2: /* cfmac32 */
DSPregs[DEST_REG].lower.i
+= DSPregs[SRC1_REG].lower.i * DSPregs[SRC2_REG].lower.i;
@@ -999,7 +999,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 3: /* cfmsc32 */
DSPregs[DEST_REG].lower.i
-= DSPregs[SRC1_REG].lower.i * DSPregs[SRC2_REG].lower.i;
@@ -1009,7 +1009,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 4: /* cfcvts32 */
/* fixme: this should round */
DSPregs[DEST_REG].lower.i = (int) DSPregs[SRC1_REG].upper.f;
@@ -1018,7 +1018,7 @@ DSPCDP5 (ARMul_State * state,
SRC1_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 5: /* cfcvtd32 */
/* fixme: this should round */
DSPregs[DEST_REG].lower.i = (int) mv_getRegDouble (SRC1_REG);
@@ -1027,7 +1027,7 @@ DSPCDP5 (ARMul_State * state,
SRC1_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 6: /* cftruncs32 */
DSPregs[DEST_REG].lower.i = (int) DSPregs[SRC1_REG].upper.f;
printfdbg ("cftruncs32 mvfx%d = mvf%d = %d\n",
@@ -1035,7 +1035,7 @@ DSPCDP5 (ARMul_State * state,
SRC1_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 7: /* cftruncd32 */
DSPregs[DEST_REG].lower.i = (int) mv_getRegDouble (SRC1_REG);
printfdbg ("cftruncd32 mvfx%d = mvd%d = %d\n",
@@ -1049,7 +1049,7 @@ DSPCDP5 (ARMul_State * state,
case 2:
/* cfsh64 */
printfdbg ("cfsh64\n");
-
+
if (shift < 0)
/* Negative shift is a right shift. */
mv_setReg64int (DEST_REG,
@@ -1073,7 +1073,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 1: /* cfabs64 */
mv_setReg64int (DEST_REG,
(mv_getReg64int (SRC1_REG) < 0
@@ -1085,7 +1085,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
mv_getReg64int (DEST_REG));
break;
-
+
case 2: /* cfneg32 */
DSPregs[DEST_REG].lower.i = -DSPregs[SRC1_REG].lower.i;
printfdbg ("cfneg32 mvfx%d = -mvfx%d = %d\n",
@@ -1094,7 +1094,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 3: /* cfneg64 */
mv_setReg64int (DEST_REG, -mv_getReg64int (SRC1_REG));
printfdbg ("cfneg64 mvdx%d = -mvdx%d = %lld\n",
@@ -1103,7 +1103,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
mv_getReg64int (DEST_REG));
break;
-
+
case 4: /* cfadd32 */
DSPregs[DEST_REG].lower.i = DSPregs[SRC1_REG].lower.i
+ DSPregs[SRC2_REG].lower.i;
@@ -1113,7 +1113,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 5: /* cfadd64 */
mv_setReg64int (DEST_REG,
mv_getReg64int (SRC1_REG)
@@ -1124,7 +1124,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
mv_getReg64int (DEST_REG));
break;
-
+
case 6: /* cfsub32 */
DSPregs[DEST_REG].lower.i = DSPregs[SRC1_REG].lower.i
- DSPregs[SRC2_REG].lower.i;
@@ -1134,7 +1134,7 @@ DSPCDP5 (ARMul_State * state,
SRC2_REG,
DSPregs[DEST_REG].lower.i);
break;
-
+
case 7: /* cfsub64 */
mv_setReg64int (DEST_REG,
mv_getReg64int (SRC1_REG)
@@ -1168,17 +1168,17 @@ DSPCDP6 (ARMul_State * state,
/* cfmadd32 */
cirrus_not_implemented ("cfmadd32");
break;
-
+
case 1:
/* cfmsub32 */
cirrus_not_implemented ("cfmsub32");
break;
-
+
case 2:
/* cfmadda32 */
cirrus_not_implemented ("cfmadda32");
break;
-
+
case 3:
/* cfmsuba32 */
cirrus_not_implemented ("cfmsuba32");