aboutsummaryrefslogtreecommitdiff
path: root/target-ppc/op_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'target-ppc/op_helper.c')
-rw-r--r--target-ppc/op_helper.c66
1 files changed, 34 insertions, 32 deletions
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index e0b6f4efdb..32b347100d 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -368,96 +368,98 @@ void do_subfzeo_64 (void)
}
#endif
-void do_cntlzw (void)
+target_ulong helper_cntlzw (target_ulong t)
{
- T0 = clz32(T0);
+ return clz32(t);
}
#if defined(TARGET_PPC64)
-void do_cntlzd (void)
+target_ulong helper_cntlzd (target_ulong t)
{
- T0 = clz64(T0);
+ return clz64(t);
}
#endif
/* shift right arithmetic helper */
-void do_sraw (void)
+target_ulong helper_sraw (target_ulong value, target_ulong shift)
{
int32_t ret;
- if (likely(!(T1 & 0x20UL))) {
- if (likely((uint32_t)T1 != 0)) {
- ret = (int32_t)T0 >> (T1 & 0x1fUL);
- if (likely(ret >= 0 || ((int32_t)T0 & ((1 << T1) - 1)) == 0)) {
+ if (likely(!(shift & 0x20))) {
+ if (likely((uint32_t)shift != 0)) {
+ shift &= 0x1f;
+ ret = (int32_t)value >> shift;
+ if (likely(ret >= 0 || (value & ((1 << shift) - 1)) == 0)) {
env->xer &= ~(1 << XER_CA);
} else {
env->xer |= (1 << XER_CA);
}
} else {
- ret = T0;
+ ret = (int32_t)value;
env->xer &= ~(1 << XER_CA);
}
} else {
- ret = UINT32_MAX * ((uint32_t)T0 >> 31);
- if (likely(ret >= 0 || ((uint32_t)T0 & ~0x80000000UL) == 0)) {
- env->xer &= ~(1 << XER_CA);
- } else {
+ ret = (int32_t)value >> 31;
+ if (ret) {
env->xer |= (1 << XER_CA);
+ } else {
+ env->xer &= ~(1 << XER_CA);
}
}
- T0 = ret;
+ return (target_long)ret;
}
#if defined(TARGET_PPC64)
-void do_srad (void)
+target_ulong helper_srad (target_ulong value, target_ulong shift)
{
int64_t ret;
- if (likely(!(T1 & 0x40UL))) {
- if (likely((uint64_t)T1 != 0)) {
- ret = (int64_t)T0 >> (T1 & 0x3FUL);
- if (likely(ret >= 0 || ((int64_t)T0 & ((1 << T1) - 1)) == 0)) {
+ if (likely(!(shift & 0x40))) {
+ if (likely((uint64_t)shift != 0)) {
+ shift &= 0x3f;
+ ret = (int64_t)value >> shift;
+ if (likely(ret >= 0 || (value & ((1 << shift) - 1)) == 0)) {
env->xer &= ~(1 << XER_CA);
} else {
env->xer |= (1 << XER_CA);
}
} else {
- ret = T0;
+ ret = (int64_t)value;
env->xer &= ~(1 << XER_CA);
}
} else {
- ret = UINT64_MAX * ((uint64_t)T0 >> 63);
- if (likely(ret >= 0 || ((uint64_t)T0 & ~0x8000000000000000ULL) == 0)) {
- env->xer &= ~(1 << XER_CA);
- } else {
+ ret = (int64_t)value >> 63;
+ if (ret) {
env->xer |= (1 << XER_CA);
+ } else {
+ env->xer &= ~(1 << XER_CA);
}
}
- T0 = ret;
+ return ret;
}
#endif
-void do_popcntb (void)
+target_ulong helper_popcntb (target_ulong val)
{
uint32_t ret;
int i;
ret = 0;
for (i = 0; i < 32; i += 8)
- ret |= ctpop8((T0 >> i) & 0xFF) << i;
- T0 = ret;
+ ret |= ctpop8((val >> i) & 0xFF) << i;
+ return ret;
}
#if defined(TARGET_PPC64)
-void do_popcntb_64 (void)
+target_ulong helper_popcntb_64 (target_ulong val)
{
uint64_t ret;
int i;
ret = 0;
for (i = 0; i < 64; i += 8)
- ret |= ctpop8((T0 >> i) & 0xFF) << i;
- T0 = ret;
+ ret |= ctpop8((val >> i) & 0xFF) << i;
+ return ret;
}
#endif