diff options
author | Tom Musta <tommusta@gmail.com> | 2014-01-07 10:05:52 -0600 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2014-03-05 03:06:39 +0100 |
commit | e44259b6d4f4de69a868510a198b2696f24118a1 (patch) | |
tree | 08d61c8be5c091ca24b46a85ce20023fc4b442bc /include/qemu | |
parent | 98d1eb2748e84f9e3118d1bd2495f0cc917ac18d (diff) | |
download | hqemu-e44259b6d4f4de69a868510a198b2696f24118a1.zip hqemu-e44259b6d4f4de69a868510a198b2696f24118a1.tar.gz |
target-ppc: Add ISA2.06 divde[o] Instructions
This patch adds the Divide Doubleword Extended instructions.
The implementation builds on the unsigned helper provided in
the previous patch.
Signed-off-by: Tom Musta <tommusta@gmail.com>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'include/qemu')
-rw-r--r-- | include/qemu/host-utils.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h index 402b53f..d4f21c9 100644 --- a/include/qemu/host-utils.h +++ b/include/qemu/host-utils.h @@ -57,10 +57,24 @@ static inline int divu128(uint64_t *plow, uint64_t *phigh, uint64_t divisor) return result > UINT64_MAX; } } + +static inline int divs128(int64_t *plow, int64_t *phigh, int64_t divisor) +{ + if (divisor == 0) { + return 1; + } else { + __int128_t dividend = ((__int128_t)*phigh << 64) | *plow; + __int128_t result = dividend / divisor; + *plow = result; + *phigh = dividend % divisor; + return result != *plow; + } +} #else void muls64(uint64_t *phigh, uint64_t *plow, int64_t a, int64_t b); void mulu64(uint64_t *phigh, uint64_t *plow, uint64_t a, uint64_t b); int divu128(uint64_t *plow, uint64_t *phigh, uint64_t divisor); +int divs128(int64_t *plow, int64_t *phigh, int64_t divisor); #endif /** |