[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RESEND v3 5/8] host-utils: Implemented signed 256-by-128 division
From: |
Lucas Mateus Castro(alqotel) |
Subject: |
[PATCH RESEND v3 5/8] host-utils: Implemented signed 256-by-128 division |
Date: |
Wed, 25 May 2022 10:49:51 -0300 |
From: "Lucas Mateus Castro (alqotel)" <lucas.araujo@eldorado.org.br>
Based on already existing QEMU implementation created a signed
256 bit by 128 bit division needed to implement the vector divide
extended signed quadword instruction from PowerISA 3.1
Signed-off-by: Lucas Mateus Castro (alqotel) <lucas.araujo@eldorado.org.br>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
include/qemu/host-utils.h | 1 +
util/host-utils.c | 51 +++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h
index 9767af7573..bc743f5e32 100644
--- a/include/qemu/host-utils.h
+++ b/include/qemu/host-utils.h
@@ -851,4 +851,5 @@ static inline uint64_t udiv_qrnnd(uint64_t *r, uint64_t n1,
}
Int128 divu256(Int128 *plow, Int128 *phigh, Int128 divisor);
+Int128 divs256(Int128 *plow, Int128 *phigh, Int128 divisor);
#endif
diff --git a/util/host-utils.c b/util/host-utils.c
index 93dfb1b6ab..fb91bcba82 100644
--- a/util/host-utils.c
+++ b/util/host-utils.c
@@ -395,3 +395,54 @@ Int128 divu256(Int128 *plow, Int128 *phigh, Int128 divisor)
return rem;
}
}
+
+/*
+ * Signed 256-by-128 division.
+ * Returns quotient via plow and phigh.
+ * Also returns the remainder via the function return value.
+ */
+Int128 divs256(Int128 *plow, Int128 *phigh, Int128 divisor)
+{
+ bool neg_quotient = false, neg_remainder = false;
+ Int128 unsig_hi = *phigh, unsig_lo = *plow;
+ Int128 rem;
+
+ if (!int128_nonneg(*phigh)) {
+ neg_quotient = !neg_quotient;
+ neg_remainder = !neg_remainder;
+
+ if (!int128_nz(unsig_lo)) {
+ unsig_hi = int128_neg(unsig_hi);
+ } else {
+ unsig_hi = int128_not(unsig_hi);
+ unsig_lo = int128_neg(unsig_lo);
+ }
+ }
+
+ if (!int128_nonneg(divisor)) {
+ neg_quotient = !neg_quotient;
+
+ divisor = int128_neg(divisor);
+ }
+
+ rem = divu256(&unsig_lo, &unsig_hi, divisor);
+
+ if (neg_quotient) {
+ if (!int128_nz(unsig_lo)) {
+ *phigh = int128_neg(unsig_hi);
+ *plow = int128_zero();
+ } else {
+ *phigh = int128_not(unsig_hi);
+ *plow = int128_neg(unsig_lo);
+ }
+ } else {
+ *phigh = unsig_hi;
+ *plow = unsig_lo;
+ }
+
+ if (neg_remainder) {
+ return int128_neg(rem);
+ } else {
+ return rem;
+ }
+}
--
2.31.1
- [PATCH RESEND v3 0/8] VDIV/VMOD Implementation, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 1/8] target/ppc: Implemented vector divide instructions, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 2/8] target/ppc: Implemented vector divide quadword, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 3/8] target/ppc: Implemented vector divide extended word, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 4/8] host-utils: Implemented unsigned 256-by-128 division, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 5/8] host-utils: Implemented signed 256-by-128 division,
Lucas Mateus Castro(alqotel) <=
- [PATCH RESEND v3 6/8] target/ppc: Implemented remaining vector divide extended, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 7/8] target/ppc: Implemented vector module word/doubleword, Lucas Mateus Castro(alqotel), 2022/05/25
- [PATCH RESEND v3 8/8] target/ppc: Implemented vector module quadword, Lucas Mateus Castro(alqotel), 2022/05/25