diff options
author | ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-12-25 20:46:56 +0000 |
---|---|---|
committer | ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-12-25 20:46:56 +0000 |
commit | e9c71dd1c1f5aeb3732261a02dcfae031973f053 (patch) | |
tree | de9b88fe2a6e0ffbb6b2f1fa63f401e14aa66e6a /target-mips/op_helper.c | |
parent | 29fe0e3490ef63f564f426fc526d4415f44e7052 (diff) |
Support for VR5432, and some of its special instructions. Original patch
by Dirk Behme.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3859 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-mips/op_helper.c')
-rw-r--r-- | target-mips/op_helper.c | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c index 36c4b73f93..93ba79c7e4 100644 --- a/target-mips/op_helper.c +++ b/target-mips/op_helper.c @@ -172,6 +172,18 @@ static always_inline void set_HILO (uint64_t HILO) env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); } +static always_inline void set_HIT0_LO (uint64_t HILO) +{ + env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF); + T0 = env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); +} + +static always_inline void set_HI_LOT0 (uint64_t HILO) +{ + T0 = env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF); + env->HI[0][env->current_tc] = (int32_t)(HILO >> 32); +} + void do_mult (void) { set_HILO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); @@ -213,7 +225,78 @@ void do_msubu (void) tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); set_HILO(get_HILO() - tmp); } -#endif + +/* Multiplication variants of the vr54xx. */ +void do_muls (void) +{ + set_HI_LOT0(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); +} + +void do_mulsu (void) +{ + set_HI_LOT0(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); +} + +void do_macc (void) +{ + set_HI_LOT0(((int64_t)get_HILO()) + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); +} + +void do_macchi (void) +{ + set_HIT0_LO(((int64_t)get_HILO()) + ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); +} + +void do_maccu (void) +{ + set_HI_LOT0(((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); +} + +void do_macchiu (void) +{ + set_HIT0_LO(((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); +} + +void do_msac (void) +{ + set_HI_LOT0(((int64_t)get_HILO()) - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); +} + +void do_msachi (void) +{ + set_HIT0_LO(((int64_t)get_HILO()) - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); +} + +void do_msacu (void) +{ + set_HI_LOT0(((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); +} + +void do_msachiu (void) +{ + set_HIT0_LO(((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); +} + +void do_mulhi (void) +{ + set_HIT0_LO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1); +} + +void do_mulhiu (void) +{ + set_HIT0_LO((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1); +} + +void do_mulshi (void) +{ + set_HIT0_LO(0 - ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1)); +} + +void do_mulshiu (void) +{ + set_HIT0_LO(0 - ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1)); +} +#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ #if HOST_LONG_BITS < 64 void do_div (void) |