qemu-e2k/target/e2k/helper.c

66 lines
1.2 KiB
C
Raw Normal View History

#include "qemu/osdep.h"
2020-11-13 15:49:28 +01:00
#include "qemu/log.h"
#include "cpu.h"
#include "exec/exec-all.h"
#include "qemu/host-utils.h"
#include "exec/helper-proto.h"
2020-11-12 14:52:51 +01:00
#include "translate.h"
void helper_raise_exception(CPUE2KState *env, int tt)
{
CPUState *cs = env_cpu(env);
cs->exception_index = tt;
cpu_loop_exit(cs);
}
2020-11-12 14:52:51 +01:00
2020-11-14 10:20:18 +01:00
void helper_call(CPUE2KState *env, target_ulong ctpr, target_ulong cond)
2020-11-12 14:52:51 +01:00
{
int tag = GET_FIELD(ctpr, CTPR_TAG_OFF, CTPR_TAG_END);
if (!cond) {
return;
}
if (tag == CTPR_TAG_SDISP) {
2020-11-12 14:52:51 +01:00
CPUState *cs = env_cpu(env);
cs->exception_index = E2K_EXCP_SYSCALL;
cpu_loop_exit(cs);
} else {
/* TODO: call */
abort();
2020-11-12 14:52:51 +01:00
}
}
2020-11-12 22:46:57 +01:00
uint64_t helper_sxt(uint64_t x, uint64_t y)
{
int size;
switch (x & 3) {
case 0:
size = 8;
break;
case 1:
size = 16;
break;
default:
size = 32;
break;
}
if (x & 4) {
return y & GEN_MASK(0, size);
2020-11-12 22:46:57 +01:00
} else {
return (((int64_t) y) << (64 - size) >> (64 - size));
}
}
2020-11-13 15:49:28 +01:00
void helper_debug_i32(uint32_t x)
{
qemu_log_mask(LOG_UNIMP, "log %#x\n", x);
}
void helper_debug_i64(uint64_t x)
{
qemu_log_mask(LOG_UNIMP, "log %#lx\n", x);
}