From 62bd03a0e76fec3e09c611a12edd4de1b1e65a31 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:12:02 -0600 Subject: [PATCH] nouveau/mme: Add a mul64 helper Part-of: --- src/nouveau/mme/mme_builder.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/nouveau/mme/mme_builder.h b/src/nouveau/mme/mme_builder.h index 7150595e4a5..4ec456b4550 100644 --- a/src/nouveau/mme/mme_builder.h +++ b/src/nouveau/mme/mme_builder.h @@ -158,6 +158,17 @@ mme_imm(uint32_t imm) return val; } +static inline bool +mme_is_zero(struct mme_value x) +{ + switch (x.type) { + case MME_VALUE_TYPE_ZERO: return true; + case MME_VALUE_TYPE_IMM: return x.imm == 0; + case MME_VALUE_TYPE_REG: return false; + default: unreachable("Invalid MME value type"); + } +} + static inline struct mme_value64 mme_value64(struct mme_value lo, struct mme_value hi) { @@ -381,6 +392,27 @@ mme_umul_32x32_64(struct mme_builder *b, mme_value64(y, mme_zero())); } +static inline struct mme_value64 +mme_mul64(struct mme_builder *b, + struct mme_value64 x, struct mme_value64 y) +{ + if (mme_is_zero(x.hi) && mme_is_zero(y.hi)) + return mme_umul_32x32_64(b, x.lo, y.lo); + + struct mme_value64 dst = mme_umul_32x32_64(b, x.lo, y.lo); + struct mme_value tmp = mme_alloc_reg(b); + + mme_mul_to(b, tmp, x.lo, y.hi); + mme_add64_to(b, dst, dst, mme_value64(mme_zero(), tmp)); + + mme_mul_to(b, tmp, x.hi, y.lo); + mme_add64_to(b, dst, dst, mme_value64(mme_zero(), tmp)); + + mme_free_reg(b, tmp); + + return dst; +} + static inline void mme_merge_to(struct mme_builder *b, struct mme_value dst, struct mme_value x, struct mme_value y,