+static inline target_ulong
+carry_add_flag(target_ulong dest, target_ulong b, target_ulong c, uint8_t size)
+{
+ target_ulong t1, t2, t3;
+
+ t1 = b & c;
+ t2 = b & (~dest);
+ t3 = c & (~dest);
+ t1 = t1 | t2 | t3;
+ return (t1 >> (size - 1)) & 1;
+}
+
+target_ulong helper_carry_add_flag(target_ulong dest, target_ulong b,
+ target_ulong c) {
+ return carry_add_flag(dest, b, c, TARGET_LONG_BITS);
+}
+
+static inline target_ulong
+overflow_add_flag(target_ulong dest, target_ulong b, target_ulong c,
+ uint8_t size)
+{
+ dest >>= (size - 1);
+ b >>= (size - 1);
+ c >>= (size - 1);
+ if ((dest == 0 && b == 1 && c == 1)
+ || (dest == 1 && b == 0 && c == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+target_ulong helper_overflow_add_flag(target_ulong dest, target_ulong b,
+ target_ulong c) {
+ return overflow_add_flag(dest, b, c, TARGET_LONG_BITS);
+}
+
+static inline target_ulong
+overflow_sub_flag(target_ulong dest, target_ulong b, target_ulong c,
+ uint8_t size)
+{
+ dest >>= (size - 1);
+ b >>= (size - 1);
+ c >>= (size - 1);
+ if ((dest == 1 && b == 0 && c == 1)
+ || (dest == 0 && b == 1 && c == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+target_ulong helper_overflow_sub_flag(target_ulong dest, target_ulong b,
+ target_ulong c) {
+ return overflow_sub_flag(dest, b, c, TARGET_LONG_BITS);
+}
+
+target_ulong helper_repl_mask(target_ulong dest, target_ulong src,
+ target_ulong mask)
+{
+ target_ulong ret = dest & (~mask);
+ ret |= (src & mask);
+
+ return ret;
+}
+
+target_ulong helper_mpymu(CPUARCState *env, target_ulong b, target_ulong c)
+{
+ uint64_t _b = (uint64_t) b;
+ uint64_t _c = (uint64_t) c;
+
+ return (uint32_t) ((_b * _c) >> 32);
+}
+
+target_ulong helper_mpym(CPUARCState *env, target_ulong b, target_ulong c)
+{
+ int64_t _b = (int64_t) ((int32_t) b);
+ int64_t _c = (int64_t) ((int32_t) c);
+
+ /*
+ * fprintf(stderr, "B = 0x%llx, C = 0x%llx, result = 0x%llx\n",
+ * _b, _c, _b * _c);
+ */
+ return (_b * _c) >> 32;
+}