All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Airlie <airlied-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: [PATCH 04/10] amdgpu/dc: allow inlining constant int to fixed a lot better.
Date: Fri, 29 Sep 2017 17:13:25 +1000	[thread overview]
Message-ID: <20170929071331.18132-4-airlied@gmail.com> (raw)
In-Reply-To: <20170929071331.18132-1-airlied-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

From: Dave Airlie <airlied@redhat.com>

This uses two things that might be Linux specific,
__builtin_constant_p (might be gcc)
and
BUILD_BUG_ON. (maybe other dm's can have something similiar).

This saves 4k in the bw calcs code.

Signed-off-by: Dave Airlie <airlied@redhat.com>
---
 drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c | 37 ++++++++-----------------
 drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h   | 26 +++++++++++++++--
 2 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c b/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c
index 0de6fa1..6ca288f 100644
--- a/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c
+++ b/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c
@@ -25,13 +25,6 @@
 #include "dm_services.h"
 #include "bw_fixed.h"
 
-#define BITS_PER_FRACTIONAL_PART 24
-
-#define MIN_I32 \
-	(int64_t)(-(1LL << (63 - BITS_PER_FRACTIONAL_PART)))
-
-#define MAX_I32 \
-	(int64_t)((1ULL << (63 - BITS_PER_FRACTIONAL_PART)) - 1)
 
 #define MIN_I64 \
 	(int64_t)(-(1LL << 63))
@@ -40,10 +33,7 @@
 	(int64_t)((1ULL << 63) - 1)
 
 #define FRACTIONAL_PART_MASK \
-	((1ULL << BITS_PER_FRACTIONAL_PART) - 1)
-
-#define GET_INTEGER_PART(x) \
-	((x) >> BITS_PER_FRACTIONAL_PART)
+	((1ULL << BW_FIXED_BITS_PER_FRACTIONAL_PART) - 1)
 
 #define GET_FRACTIONAL_PART(x) \
 	(FRACTIONAL_PART_MASK & (x))
@@ -56,19 +46,14 @@ static uint64_t abs_i64(int64_t arg)
 		return (uint64_t)(-arg);
 }
 
-struct bw_fixed bw_int_to_fixed(int64_t value)
+struct bw_fixed bw_int_to_fixed_nonconst(int64_t value)
 {
 	struct bw_fixed res;
-	ASSERT(value < MAX_I32 && value > MIN_I32);
-	res.value = value << BITS_PER_FRACTIONAL_PART;
+	ASSERT(value < BW_FIXED_MAX_I32 && value > BW_FIXED_MIN_I32);
+	res.value = value << BW_FIXED_BITS_PER_FRACTIONAL_PART;
 	return res;
 }
 
-int32_t bw_fixed_to_int(struct bw_fixed value)
-{
-	return GET_INTEGER_PART(value.value);
-}
-
 struct bw_fixed bw_frc_to_fixed(int64_t numerator, int64_t denominator)
 {
 	struct bw_fixed res;
@@ -87,11 +72,11 @@ struct bw_fixed bw_frc_to_fixed(int64_t numerator, int64_t denominator)
 	arg2_value = abs_i64(denominator);
 	res_value = div64_u64_rem(arg1_value, arg2_value, &remainder);
 
-	ASSERT(res_value <= MAX_I32);
+	ASSERT(res_value <= BW_FIXED_MAX_I32);
 
 	/* determine fractional part */
 	{
-		uint32_t i = BITS_PER_FRACTIONAL_PART;
+		uint32_t i = BW_FIXED_BITS_PER_FRACTIONAL_PART;
 
 		do
 		{
@@ -164,8 +149,8 @@ struct bw_fixed bw_mul(const struct bw_fixed arg1, const struct bw_fixed arg2)
 	uint64_t arg1_value = abs_i64(arg1.value);
 	uint64_t arg2_value = abs_i64(arg2.value);
 
-	uint64_t arg1_int = GET_INTEGER_PART(arg1_value);
-	uint64_t arg2_int = GET_INTEGER_PART(arg2_value);
+	uint64_t arg1_int = BW_FIXED_GET_INTEGER_PART(arg1_value);
+	uint64_t arg2_int = BW_FIXED_GET_INTEGER_PART(arg2_value);
 
 	uint64_t arg1_fra = GET_FRACTIONAL_PART(arg1_value);
 	uint64_t arg2_fra = GET_FRACTIONAL_PART(arg2_value);
@@ -174,9 +159,9 @@ struct bw_fixed bw_mul(const struct bw_fixed arg1, const struct bw_fixed arg2)
 
 	res.value = arg1_int * arg2_int;
 
-	ASSERT(res.value <= MAX_I32);
+	ASSERT(res.value <= BW_FIXED_MAX_I32);
 
-	res.value <<= BITS_PER_FRACTIONAL_PART;
+	res.value <<= BW_FIXED_BITS_PER_FRACTIONAL_PART;
 
 	tmp = arg1_int * arg2_fra;
 
@@ -192,7 +177,7 @@ struct bw_fixed bw_mul(const struct bw_fixed arg1, const struct bw_fixed arg2)
 
 	tmp = arg1_fra * arg2_fra;
 
-	tmp = (tmp >> BITS_PER_FRACTIONAL_PART) +
+	tmp = (tmp >> BW_FIXED_BITS_PER_FRACTIONAL_PART) +
 		(tmp >= (uint64_t)(bw_frc_to_fixed(1, 2).value));
 
 	ASSERT(tmp <= (uint64_t)(MAX_I64 - res.value));
diff --git a/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h b/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h
index 4477e62..39ee8eba3 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h
@@ -26,10 +26,19 @@
 #ifndef BW_FIXED_H_
 #define BW_FIXED_H_
 
+#define BW_FIXED_BITS_PER_FRACTIONAL_PART 24
+
+#define BW_FIXED_GET_INTEGER_PART(x) ((x) >> BW_FIXED_BITS_PER_FRACTIONAL_PART)
 struct bw_fixed {
 	int64_t value;
 };
 
+#define BW_FIXED_MIN_I32 \
+	(int64_t)(-(1LL << (63 - BW_FIXED_BITS_PER_FRACTIONAL_PART)))
+
+#define BW_FIXED_MAX_I32 \
+	(int64_t)((1ULL << (63 - BW_FIXED_BITS_PER_FRACTIONAL_PART)) - 1)
+
 static inline struct bw_fixed bw_min2(const struct bw_fixed arg1,
 				      const struct bw_fixed arg2)
 {
@@ -56,9 +65,22 @@ static inline struct bw_fixed bw_max3(struct bw_fixed v1,
 	return bw_max2(bw_max2(v1, v2), v3);
 }
 
-struct bw_fixed bw_int_to_fixed(int64_t value);
+struct bw_fixed bw_int_to_fixed_nonconst(int64_t value);
+static inline struct bw_fixed bw_int_to_fixed(int64_t value)
+{
+	if (__builtin_constant_p(value)) {
+		struct bw_fixed res;
+		BUILD_BUG_ON(value > BW_FIXED_MAX_I32 || value < BW_FIXED_MIN_I32);
+		res.value = value << BW_FIXED_BITS_PER_FRACTIONAL_PART;
+		return res;
+	} else
+		return bw_int_to_fixed_nonconst(value);
+}
 
-int32_t bw_fixed_to_int(struct bw_fixed value);
+static inline int32_t bw_fixed_to_int(struct bw_fixed value)
+{
+	return BW_FIXED_GET_INTEGER_PART(value.value);
+}
 
 struct bw_fixed bw_frc_to_fixed(int64_t num, int64_t denum);
 
-- 
2.9.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2017-09-29  7:13 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-29  7:13 [PATCH 01/10] amdgpu/dc: hide some unused aux/i2c payload apis Dave Airlie
     [not found] ` <20170929071331.18132-1-airlied-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-09-29  7:13   ` [PATCH 02/10] amdgpu/dc: move some one line dp functions to inlines Dave Airlie
2017-09-29  7:13   ` [PATCH 03/10] amdgpu/dc: inline some of the bw_fixed code Dave Airlie
2017-09-29  7:13   ` Dave Airlie [this message]
     [not found]     ` <20170929071331.18132-4-airlied-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-09-29 15:13       ` [PATCH 04/10] amdgpu/dc: allow inlining constant int to fixed a lot better Harry Wentland
2017-09-29  7:13   ` [PATCH 05/10] amdgpu/dc: use the builtin constant p trick on the 31/32 fixed point Dave Airlie
2017-09-29  7:13   ` [PATCH 06/10] amdgpu/dc: inline fixed31_32 div_int Dave Airlie
2017-09-29  7:13   ` [PATCH 07/10] amdgpu/dc: inline all the signal_types code Dave Airlie
2017-09-29  7:13   ` [PATCH 08/10] amdgpu/dc: set some of the link dp code to static Dave Airlie
2017-09-29  7:13   ` [PATCH 09/10] amdgpu/dc: rename bios get_image symbol to something more searchable Dave Airlie
2017-09-29  7:13   ` [PATCH 10/10] amdgpu/dc: inline dml_round_to_multiple Dave Airlie
     [not found]     ` <20170929071331.18132-10-airlied-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-09-29 15:13       ` Harry Wentland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170929071331.18132-4-airlied@gmail.com \
    --to=airlied-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.