| Index: sim/v850/simops.c
|
| diff --git a/sim/v850/simops.c b/sim/v850/simops.c
|
| index a14b0b2df656f672885bf029eeb330c90f97d77f..f7fc67d8daecafa09bb4e3b869e532fc7ba09161 100644
|
| --- a/sim/v850/simops.c
|
| +++ b/sim/v850/simops.c
|
| @@ -320,7 +320,7 @@ condition_met (unsigned code)
|
| return 1;
|
| }
|
|
|
| -static unsigned long
|
| +unsigned long
|
| Add32 (unsigned long a1, unsigned long a2, int * carry)
|
| {
|
| unsigned long result = (a1 + a2);
|
| @@ -2839,3 +2839,717 @@ OP_307E0 (void)
|
| return 4;
|
| }
|
|
|
| +/* V850E2R FPU functions */
|
| +/*
|
| + sim_fpu_status_invalid_snan = 1, -V--- (sim spec.)
|
| + sim_fpu_status_invalid_qnan = 2, ----- (sim spec.)
|
| + sim_fpu_status_invalid_isi = 4, (inf - inf) -V---
|
| + sim_fpu_status_invalid_idi = 8, (inf / inf) -V---
|
| + sim_fpu_status_invalid_zdz = 16, (0 / 0) -V---
|
| + sim_fpu_status_invalid_imz = 32, (inf * 0) -V---
|
| + sim_fpu_status_invalid_cvi = 64, convert to integer -V---
|
| + sim_fpu_status_invalid_div0 = 128, (X / 0) --Z--
|
| + sim_fpu_status_invalid_cmp = 256, compare ----- (sim spec.)
|
| + sim_fpu_status_invalid_sqrt = 512, -V---
|
| + sim_fpu_status_rounded = 1024, I----
|
| + sim_fpu_status_inexact = 2048, I---- (sim spec.)
|
| + sim_fpu_status_overflow = 4096, I--O-
|
| + sim_fpu_status_underflow = 8192, I---U
|
| + sim_fpu_status_denorm = 16384, ----U (sim spec.)
|
| +*/
|
| +
|
| +void update_fpsr (SIM_DESC sd, sim_fpu_status status, unsigned int mask, unsigned int double_op_p)
|
| +{
|
| + unsigned int fpsr = FPSR & mask;
|
| +
|
| + unsigned int flags = 0;
|
| +
|
| + if (fpsr & FPSR_XEI
|
| + && ((status & (sim_fpu_status_rounded
|
| + | sim_fpu_status_overflow
|
| + | sim_fpu_status_inexact))
|
| + || (status & sim_fpu_status_underflow
|
| + && (fpsr & (FPSR_XEU | FPSR_XEI)) == 0
|
| + && fpsr & FPSR_FS)))
|
| + {
|
| + flags |= FPSR_XCI | FPSR_XPI;
|
| + }
|
| +
|
| + if (fpsr & FPSR_XEV
|
| + && (status & (sim_fpu_status_invalid_isi
|
| + | sim_fpu_status_invalid_imz
|
| + | sim_fpu_status_invalid_zdz
|
| + | sim_fpu_status_invalid_idi
|
| + | sim_fpu_status_invalid_cvi
|
| + | sim_fpu_status_invalid_sqrt
|
| + | sim_fpu_status_invalid_snan)))
|
| + {
|
| + flags |= FPSR_XCV | FPSR_XPV;
|
| + }
|
| +
|
| + if (fpsr & FPSR_XEZ
|
| + && (status & sim_fpu_status_invalid_div0))
|
| + {
|
| + flags |= FPSR_XCV | FPSR_XPV;
|
| + }
|
| +
|
| + if (fpsr & FPSR_XEO
|
| + && (status & sim_fpu_status_overflow))
|
| + {
|
| + flags |= FPSR_XCO | FPSR_XPO;
|
| + }
|
| +
|
| + if (((fpsr & FPSR_XEU) || (fpsr & FPSR_FS) == 0)
|
| + && (status & (sim_fpu_status_underflow
|
| + | sim_fpu_status_denorm)))
|
| + {
|
| + flags |= FPSR_XCU | FPSR_XPU;
|
| + }
|
| +
|
| + if (flags)
|
| + {
|
| + FPSR &= ~FPSR_XC;
|
| + FPSR |= flags;
|
| +
|
| + SignalExceptionFPE(sd, double_op_p);
|
| + }
|
| +}
|
| +
|
| +/*
|
| + exception
|
| +*/
|
| +
|
| +void SignalException(SIM_DESC sd)
|
| +{
|
| + if (MPM & MPM_AUE)
|
| + {
|
| + PSW = PSW & ~(PSW_NPV | PSW_DMP | PSW_IMP);
|
| + }
|
| +}
|
| +
|
| +void SignalExceptionFPE(SIM_DESC sd, unsigned int double_op_p)
|
| +{
|
| + if (((PSW & (PSW_NP|PSW_ID)) == 0)
|
| + || !(FPSR & (double_op_p ? FPSR_DEM : FPSR_SEM)))
|
| + {
|
| + EIPC = PC;
|
| + EIPSW = PSW;
|
| + EIIC = (FPSR & (double_op_p ? FPSR_DEM : FPSR_SEM))
|
| + ? 0x71 : 0x72;
|
| + PSW |= (PSW_EP | PSW_ID);
|
| + PC = 0x70;
|
| +
|
| + SignalException(sd);
|
| + }
|
| +}
|
| +
|
| +
|
| +void check_invalid_snan(SIM_DESC sd, sim_fpu_status status, unsigned int double_op_p)
|
| +{
|
| + if ((FPSR & FPSR_XEI)
|
| + && (status & sim_fpu_status_invalid_snan))
|
| + {
|
| + FPSR &= ~FPSR_XC;
|
| + FPSR |= FPSR_XCV;
|
| + FPSR |= FPSR_XPV;
|
| + SignalExceptionFPE(sd, double_op_p);
|
| + }
|
| +}
|
| +
|
| +int v850_float_compare(SIM_DESC sd, int cmp, sim_fpu wop1, sim_fpu wop2, int double_op_p)
|
| +{
|
| + int result = -1;
|
| +
|
| + if (sim_fpu_is_nan(&wop1) || sim_fpu_is_nan(&wop2))
|
| + {
|
| + if (cmp & 0x8)
|
| + {
|
| + if (FPSR & FPSR_XEV)
|
| + {
|
| + FPSR |= FPSR_XCV | FPSR_XPV;
|
| + SignalExceptionFPE(sd, double_op_p);
|
| + }
|
| + }
|
| +
|
| + switch (cmp)
|
| + {
|
| + case FPU_CMP_F:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_UN:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_EQ:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_UEQ:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_OLT:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_ULT:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_OLE:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_ULE:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_SF:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGLE:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_SEQ:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGL:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_LT:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGE:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_LE:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGT:
|
| + result = 1;
|
| + break;
|
| + default:
|
| + abort();
|
| + }
|
| + }
|
| + else if (sim_fpu_is_infinity(&wop1) && sim_fpu_is_infinity(&wop2)
|
| + && sim_fpu_sign(&wop1) == sim_fpu_sign(&wop2))
|
| + {
|
| + switch (cmp)
|
| + {
|
| + case FPU_CMP_F:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_UN:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_EQ:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_UEQ:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_OLT:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_ULT:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_OLE:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_ULE:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_SF:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGLE:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_SEQ:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_NGL:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_LT:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGE:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_LE:
|
| + result = 1;
|
| + break;
|
| + case FPU_CMP_NGT:
|
| + result = 1;
|
| + break;
|
| + default:
|
| + abort();
|
| + }
|
| + }
|
| + else
|
| + {
|
| + int gt = 0,lt = 0,eq = 0, status;
|
| +
|
| + status = sim_fpu_cmp( &wop1, &wop2 );
|
| +
|
| + switch (status) {
|
| + case SIM_FPU_IS_SNAN:
|
| + case SIM_FPU_IS_QNAN:
|
| + abort();
|
| + break;
|
| +
|
| + case SIM_FPU_IS_NINF:
|
| + lt = 1;
|
| + break;
|
| + case SIM_FPU_IS_PINF:
|
| + gt = 1;
|
| + break;
|
| + case SIM_FPU_IS_NNUMBER:
|
| + lt = 1;
|
| + break;
|
| + case SIM_FPU_IS_PNUMBER:
|
| + gt = 1;
|
| + break;
|
| + case SIM_FPU_IS_NDENORM:
|
| + lt = 1;
|
| + break;
|
| + case SIM_FPU_IS_PDENORM:
|
| + gt = 1;
|
| + break;
|
| + case SIM_FPU_IS_NZERO:
|
| + case SIM_FPU_IS_PZERO:
|
| + eq = 1;
|
| + break;
|
| + }
|
| +
|
| + switch (cmp)
|
| + {
|
| + case FPU_CMP_F:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_UN:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_EQ:
|
| + result = eq;
|
| + break;
|
| + case FPU_CMP_UEQ:
|
| + result = eq;
|
| + break;
|
| + case FPU_CMP_OLT:
|
| + result = lt;
|
| + break;
|
| + case FPU_CMP_ULT:
|
| + result = lt;
|
| + break;
|
| + case FPU_CMP_OLE:
|
| + result = lt || eq;
|
| + break;
|
| + case FPU_CMP_ULE:
|
| + result = lt || eq;
|
| + break;
|
| + case FPU_CMP_SF:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_NGLE:
|
| + result = 0;
|
| + break;
|
| + case FPU_CMP_SEQ:
|
| + result = eq;
|
| + break;
|
| + case FPU_CMP_NGL:
|
| + result = eq;
|
| + break;
|
| + case FPU_CMP_LT:
|
| + result = lt;
|
| + break;
|
| + case FPU_CMP_NGE:
|
| + result = lt;
|
| + break;
|
| + case FPU_CMP_LE:
|
| + result = lt || eq;
|
| + break;
|
| + case FPU_CMP_NGT:
|
| + result = lt || eq;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + ASSERT(result != -1);
|
| + return result;
|
| +}
|
| +
|
| +void v850_div(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p, unsigned int *op3p)
|
| +{
|
| + signed long int quotient;
|
| + signed long int remainder;
|
| + signed long int divide_by;
|
| + signed long int divide_this;
|
| + bfd_boolean overflow = FALSE;
|
| +
|
| + /* Compute the result. */
|
| + divide_by = op0;
|
| + divide_this = op1;
|
| +
|
| + if (divide_by == 0 || (divide_by == -1 && divide_this == (1 << 31)))
|
| + {
|
| + overflow = TRUE;
|
| + divide_by = 1;
|
| + }
|
| +
|
| + quotient = divide_this / divide_by;
|
| + remainder = divide_this % divide_by;
|
| +
|
| + /* Set condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_OV);
|
| +
|
| + if (overflow) PSW |= PSW_OV;
|
| + if (quotient == 0) PSW |= PSW_Z;
|
| + if (quotient < 0) PSW |= PSW_S;
|
| +
|
| + *op2p = quotient;
|
| + *op3p = remainder;
|
| +}
|
| +
|
| +void v850_divu(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p, unsigned int *op3p)
|
| +{
|
| + unsigned long int quotient;
|
| + unsigned long int remainder;
|
| + unsigned long int divide_by;
|
| + unsigned long int divide_this;
|
| + bfd_boolean overflow = FALSE;
|
| +
|
| + /* Compute the result. */
|
| +
|
| + divide_by = op0;
|
| + divide_this = op1;
|
| +
|
| + if (divide_by == 0)
|
| + {
|
| + overflow = TRUE;
|
| + divide_by = 1;
|
| + }
|
| +
|
| + quotient = divide_this / divide_by;
|
| + remainder = divide_this % divide_by;
|
| +
|
| + /* Set condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_OV);
|
| +
|
| + if (overflow) PSW |= PSW_OV;
|
| + if (quotient == 0) PSW |= PSW_Z;
|
| + if (quotient & 0x80000000) PSW |= PSW_S;
|
| +
|
| + *op2p = quotient;
|
| + *op3p = remainder;
|
| +}
|
| +
|
| +
|
| +void v850_sar(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
|
| +{
|
| + unsigned int result, z, s, cy;
|
| +
|
| + op0 &= 0x1f;
|
| + result = (signed)op1 >> op0;
|
| +
|
| + /* Compute the condition codes. */
|
| + z = (result == 0);
|
| + s = (result & 0x80000000);
|
| + cy = (op1 & (1 << (op0 - 1)));
|
| +
|
| + /* Store the result and condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
|
| + PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
|
| + | (cy ? PSW_CY : 0));
|
| +
|
| + *op2p = result;
|
| +}
|
| +
|
| +void v850_shl(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
|
| +{
|
| + unsigned int result, z, s, cy;
|
| +
|
| + op0 &= 0x1f;
|
| + result = op1 << op0;
|
| +
|
| + /* Compute the condition codes. */
|
| + z = (result == 0);
|
| + s = (result & 0x80000000);
|
| + cy = (op1 & (1 << (32 - op0)));
|
| +
|
| + /* Store the result and condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
|
| + PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
|
| + | (cy ? PSW_CY : 0));
|
| +
|
| + *op2p = result;
|
| +}
|
| +
|
| +void v850_shr(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
|
| +{
|
| + unsigned int result, z, s, cy;
|
| +
|
| + op0 &= 0x1f;
|
| + result = op1 >> op0;
|
| +
|
| + /* Compute the condition codes. */
|
| + z = (result == 0);
|
| + s = (result & 0x80000000);
|
| + cy = (op1 & (1 << (op0 - 1)));
|
| +
|
| + /* Store the result and condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
|
| + PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
|
| + | (cy ? PSW_CY : 0));
|
| +
|
| + *op2p = result;
|
| +}
|
| +
|
| +void v850_satadd(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
|
| +{
|
| + unsigned int result, z, s, cy, ov, sat;
|
| +
|
| + result = op0 + op1;
|
| +
|
| + /* Compute the condition codes. */
|
| + z = (result == 0);
|
| + s = (result & 0x80000000);
|
| + cy = (result < op0 || result < op1);
|
| + ov = ((op0 & 0x80000000) == (op1 & 0x80000000)
|
| + && (op0 & 0x80000000) != (result & 0x80000000));
|
| + sat = ov;
|
| +
|
| + /* Store the result and condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
|
| + PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
|
| + | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
|
| + | (sat ? PSW_SAT : 0));
|
| +
|
| + /* Handle saturated results. */
|
| + if (sat && s)
|
| + {
|
| + result = 0x7fffffff;
|
| + PSW &= ~PSW_S;
|
| + }
|
| + else if (sat)
|
| + {
|
| + result = 0x80000000;
|
| + PSW |= PSW_S;
|
| + }
|
| +
|
| + *op2p = result;
|
| +}
|
| +
|
| +void v850_satsub(SIM_DESC sd, unsigned int op0, unsigned int op1, unsigned int *op2p)
|
| +{
|
| + unsigned int result, z, s, cy, ov, sat;
|
| +
|
| + /* Compute the result. */
|
| + result = op1 - op0;
|
| +
|
| + /* Compute the condition codes. */
|
| + z = (result == 0);
|
| + s = (result & 0x80000000);
|
| + cy = (op1 < op0);
|
| + ov = ((op1 & 0x80000000) != (op0 & 0x80000000)
|
| + && (op1 & 0x80000000) != (result & 0x80000000));
|
| + sat = ov;
|
| +
|
| + /* Store the result and condition codes. */
|
| + PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
|
| + PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
|
| + | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
|
| + | (sat ? PSW_SAT : 0));
|
| +
|
| + /* Handle saturated results. */
|
| + if (sat && s)
|
| + {
|
| + result = 0x7fffffff;
|
| + PSW &= ~PSW_S;
|
| + }
|
| + else if (sat)
|
| + {
|
| + result = 0x80000000;
|
| + PSW |= PSW_S;
|
| + }
|
| +
|
| + *op2p = result;
|
| +}
|
| +
|
| +unsigned32
|
| +load_data_mem(sd, addr, len)
|
| + SIM_DESC sd;
|
| + SIM_ADDR addr;
|
| + int len;
|
| +{
|
| + uint32 data;
|
| +
|
| + switch (len)
|
| + {
|
| + case 1:
|
| + data = sim_core_read_unaligned_1 (STATE_CPU (sd, 0),
|
| + PC, read_map, addr);
|
| + break;
|
| + case 2:
|
| + data = sim_core_read_unaligned_2 (STATE_CPU (sd, 0),
|
| + PC, read_map, addr);
|
| + break;
|
| + case 4:
|
| + data = sim_core_read_unaligned_4 (STATE_CPU (sd, 0),
|
| + PC, read_map, addr);
|
| + break;
|
| + default:
|
| + abort ();
|
| + }
|
| + return data;
|
| +}
|
| +
|
| +void
|
| +store_data_mem(sd, addr, len, data)
|
| + SIM_DESC sd;
|
| + SIM_ADDR addr;
|
| + int len;
|
| + unsigned32 data;
|
| +{
|
| + switch (len)
|
| + {
|
| + case 1:
|
| + store_mem(addr, 1, data);
|
| + break;
|
| + case 2:
|
| + store_mem(addr, 2, data);
|
| + break;
|
| + case 4:
|
| + store_mem(addr, 4, data);
|
| + break;
|
| + default:
|
| + abort ();
|
| + }
|
| +}
|
| +
|
| +int mpu_load_mem_test(SIM_DESC sd, unsigned int addr, int size, int base_reg)
|
| +{
|
| + int result = 1;
|
| +
|
| + if (PSW & PSW_DMP)
|
| + {
|
| + if (IPE0 && addr >= IPA2ADDR(IPA0L) && addr <= IPA2ADDR(IPA0L) && IPR0)
|
| + {
|
| + /* text area */
|
| + }
|
| + else if (IPE1 && addr >= IPA2ADDR(IPA1L) && addr <= IPA2ADDR(IPA1L) && IPR1)
|
| + {
|
| + /* text area */
|
| + }
|
| + else if (IPE2 && addr >= IPA2ADDR(IPA2L) && addr <= IPA2ADDR(IPA2L) && IPR2)
|
| + {
|
| + /* text area */
|
| + }
|
| + else if (IPE3 && addr >= IPA2ADDR(IPA3L) && addr <= IPA2ADDR(IPA3L) && IPR3)
|
| + {
|
| + /* text area */
|
| + }
|
| + else if (addr >= PPA2ADDR(PPA & ~PPM) && addr <= DPA2ADDR(PPA | PPM))
|
| + {
|
| + /* preifarallel area */
|
| + }
|
| + else if (addr >= PPA2ADDR(SPAL) && addr <= DPA2ADDR(SPAU))
|
| + {
|
| + /* stack area */
|
| + }
|
| + else if (DPE0 && addr >= DPA2ADDR(DPA0L) && addr <= DPA2ADDR(DPA0L) && DPR0
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else if (DPE1 && addr >= DPA2ADDR(DPA1L) && addr <= DPA2ADDR(DPA1L) && DPR1
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else if (DPE2 && addr >= DPA2ADDR(DPA2L) && addr <= DPA2ADDR(DPA2L) && DPR2
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else if (DPE3 && addr >= DPA2ADDR(DPA3L) && addr <= DPA2ADDR(DPA3L) && DPR3
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else
|
| + {
|
| + VMECR &= ~(VMECR_VMW | VMECR_VMX);
|
| + VMECR |= VMECR_VMR;
|
| + VMADR = addr;
|
| + VMTID = TID;
|
| + FEIC = 0x431;
|
| +
|
| + PC = 0x30;
|
| +
|
| + SignalException(sd);
|
| + result = 0;
|
| + }
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +int mpu_store_mem_test(SIM_DESC sd, unsigned int addr, int size, int base_reg)
|
| +{
|
| + int result = 1;
|
| +
|
| + if (PSW & PSW_DMP)
|
| + {
|
| + if (addr >= PPA2ADDR(PPA & ~PPM) && addr <= DPA2ADDR(PPA | PPM))
|
| + {
|
| + /* preifarallel area */
|
| + }
|
| + else if (addr >= PPA2ADDR(SPAL) && addr <= DPA2ADDR(SPAU))
|
| + {
|
| + /* stack area */
|
| + }
|
| + else if (DPE0 && addr >= DPA2ADDR(DPA0L) && addr <= DPA2ADDR(DPA0L) && DPW0
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else if (DPE1 && addr >= DPA2ADDR(DPA1L) && addr <= DPA2ADDR(DPA1L) && DPW1
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else if (DPE2 && addr >= DPA2ADDR(DPA2L) && addr <= DPA2ADDR(DPA2L) && DPW2
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else if (DPE3 && addr >= DPA2ADDR(DPA3L) && addr <= DPA2ADDR(DPA3L) && DPW3
|
| + && ((SPAL & SPAL_SPS) ? base_reg == SP_REGNO : 1))
|
| + {
|
| + /* data area */
|
| + }
|
| + else
|
| + {
|
| + if (addr >= PPA2ADDR(PPA & ~PPM) && addr <= DPA2ADDR(PPA | PPM))
|
| + {
|
| + FEIC = 0x432;
|
| + VPTID = TID;
|
| + VPADR = PC;
|
| +#ifdef NOT_YET
|
| + VIP_PP;
|
| + VPECR;
|
| +#endif
|
| + }
|
| + else
|
| + {
|
| + FEIC = 0x431;
|
| + VMTID = TID;
|
| + VMADR = VMECR;
|
| + VMECR &= ~(VMECR_VMW | VMECR_VMX);
|
| + VMECR |= VMECR_VMR;
|
| + PC = 0x30;
|
| + }
|
| + result = 0;
|
| + }
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
|
|