On 4/5/21 7:31 AM, cupertinomira...@gmail.com wrote:
+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; +}
All completely trivial in tcg: tcg_gen_add2_tl, tcg_gen_mulu2_tl, tcg_gen_muls2_tl. and simple arithmetic for overflow -- see gen_add_CC in arm/translate.c. r~