target: e2k: Move fpcr/fpsr to state reg helpers.

This commit is contained in:
Denis Drakhnia 2020-12-16 15:02:00 +02:00 committed by Denis Drakhnia
parent d5737b0927
commit 5883b53088
1 changed files with 34 additions and 18 deletions

View File

@ -35,8 +35,6 @@ static uint64_t* state_reg_ptr(CPUE2KState *env, int idx)
switch (idx) {
case 0x80: return &env->upsr; /* %upsr */
case 0x83: return &env->lsr; /* %lsr */
case 0x85: return &env->fpcr.raw; /* %fpcr */ /* TODO: fix invalid conversion! */
case 0x86: return &env->fpsr.raw; /* %fpsr */
default: return NULL;
}
}
@ -55,6 +53,8 @@ uint64_t helper_state_reg_read_i64(CPUE2KState *env, int idx)
case 0x55: return env->cr1.hi; /* %cr1.hi */
case 0x57: return env->cr1.lo; /* %cr1.lo */
case 0x81: return env->ip; /* %ip */
case 0x85: return env->fpcr.raw; /* %fpcr */
case 0x86: return env->fpsr.raw; /* %fpsr */
case 0x8a: return env->idr; /* %idr */
case 0x90: return cpu_get_host_ticks(); /* %clkr */
default: {
@ -77,29 +77,45 @@ uint32_t helper_state_reg_read_i32(CPUE2KState *env, int idx)
void helper_state_reg_write_i64(CPUE2KState *env, int idx, uint64_t val)
{
uint64_t *p = state_reg_ptr(env, idx);
if (p != NULL) {
*p = val;
} else {
qemu_log_mask(LOG_UNIMP, "unknown state register 0x%x\n", idx);
abort();
switch(idx) {
case 0x85: /* %fpcr */
env->fpcr.raw = val;
e2k_update_fp_status(env);
break;
case 0x86: env->fpsr.raw = val; break; /* %fpsr */
default: {
uint64_t *p = state_reg_ptr(env, idx);
if (p != NULL) {
*p = val;
} else {
qemu_log_mask(LOG_UNIMP, "unknown state register 0x%x\n", idx);
abort();
}
break;
}
}
}
void helper_state_reg_write_i32(CPUE2KState *env, int idx, uint32_t val)
{
uint32_t *p = (uint32_t*) state_reg_ptr(env, idx);
if (p != NULL) {
*p = val;
switch (idx) {
case 0x85: /* %fpcr */
env->fpcr.raw = val;
e2k_update_fp_status(env);
break;
case 0x86: env->fpsr.raw = val; break; /* %fpsr */
default: {
uint32_t *p = (uint32_t*) state_reg_ptr(env, idx);
if (idx == 0x85) { /* %fpcr */
e2k_update_fp_status(env);
if (p != NULL) {
*p = val;
} else {
qemu_log_mask(LOG_UNIMP, "unknown state register 0x%x\n", idx);
abort();
}
} else {
qemu_log_mask(LOG_UNIMP, "unknown state register 0x%x\n", idx);
abort();
break;
}
}
}