Hi all,

This patch is in fact not exactly an OPTIM's kind but did not find any
better ...
After a discussion with Willy about the need to increase the number of
arguments list for sample fetch / convertors hence the patch which is up to
12. The change applied in the sample part will follow.

About backporting to 1.6 or not ... Well there is some pros and cons, I
leave the decision to the commiters :-) If the patches are merged, I will
apply changes to DeviceAtlas module as well in the near future.
Thanks in advance.
From 4d0c98d87fab61238deb715457bd78f4c7b6b421 Mon Sep 17 00:00:00 2001
From: David Carlier <[email protected]>
Date: Mon, 14 Mar 2016 08:39:28 +0000
Subject: [PATCH 1/2] OPTIM: arg: Moves arg underlying type from 32 to 64 bits.

ARG# macros allow to create a list up to 7 in theory but 5 in
practice. The change to a guaranteed 64 bits type increase to
up to 12. The change to sample fetch / convertor mask will be
for a separated patch.
---
 include/proto/arg.h | 35 ++++++++++++++++++++++++++++-------
 include/types/arg.h |  6 +++---
 src/arg.c           |  4 ++--
 3 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/include/proto/arg.h b/include/proto/arg.h
index 91c1acd..0fe5472 100644
--- a/include/proto/arg.h
+++ b/include/proto/arg.h
@@ -31,22 +31,43 @@
  * the number of mandatory arguments in a mask.
  */
 #define ARGM(m) \
-	(m & ARGM_MASK)
+	(int64_t)(m & ARGM_MASK)
 
 #define ARG1(m, t1) \
-	(ARGM(m) + (ARGT_##t1 << (ARGM_BITS)))
+	(ARGM(m) + ((int64_t)ARGT_##t1 << (ARGM_BITS)))
 
 #define ARG2(m, t1, t2) \
-	(ARG1(m, t1) + (ARGT_##t2 << (ARGM_BITS + ARGT_BITS)))
+	(ARG1(m, t1) + ((int64_t)ARGT_##t2 << (ARGM_BITS + ARGT_BITS)))
 
 #define ARG3(m, t1, t2, t3) \
-	(ARG2(m, t1, t2) + (ARGT_##t3 << (ARGM_BITS + ARGT_BITS * 2)))
+	(ARG2(m, t1, t2) + ((int64_t)ARGT_##t3 << (ARGM_BITS + ARGT_BITS * 2)))
 
 #define ARG4(m, t1, t2, t3, t4) \
-	(ARG3(m, t1, t2, t3) + (ARGT_##t4 << (ARGM_BITS + ARGT_BITS * 3)))
+	(ARG3(m, t1, t2, t3) + ((int64_t)ARGT_##t4 << (ARGM_BITS + ARGT_BITS * 3)))
 
 #define ARG5(m, t1, t2, t3, t4, t5) \
-	(ARG4(m, t1, t2, t3, t4) + (ARGT_##t5 << (ARGM_BITS + ARGT_BITS * 4)))
+	(ARG4(m, t1, t2, t3, t4) + ((int64_t)ARGT_##t5 << (ARGM_BITS + ARGT_BITS * 4)))
+
+#define ARG6(m, t1, t2, t3, t4, t5, t6) \
+	(ARG5(m, t1, t2, t3, t4, t5) + ((int64_t)ARGT_##t6 << (ARGM_BITS + ARGT_BITS * 5)))
+
+#define ARG7(m, t1, t2, t3, t4, t5, t6, t7) \
+	(ARG6(m, t1, t2, t3, t4, t5, t6) + ((int64_t)ARGT_##t7 << (ARGM_BITS + ARGT_BITS * 6)))
+
+#define ARG8(m, t1, t2, t3, t4, t5, t6, t7, t8) \
+	(ARG7(m, t1, t2, t3, t4, t5, t6, t7) + ((int64_t)ARGT_##t8 << (ARGM_BITS + ARGT_BITS * 7)))
+
+#define ARG9(m, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
+	(ARG8(m, t1, t2, t3, t4, t5, t6, t7, t8) + ((int64_t)ARGT_##t9 << (ARGM_BITS + ARGT_BITS * 8)))
+
+#define ARG10(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) \
+	(ARG9(m, t1, t2, t3, t4, t5, t6, t7, t8, t9) + ((int64_t)ARGT_##t10 << (ARGM_BITS + ARGT_BITS * 9)))
+
+#define ARG11(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \
+	(ARG10(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) + ((int64_t)ARGT_##t11 << (ARGM_BITS + ARGT_BITS * 10)))
+
+#define ARG12(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) \
+	(ARG11(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) + ((int64_t)ARGT_##t12 << (ARGM_BITS + ARGT_BITS * 11)))
 
 /* Mapping between argument number and literal description. */
 extern const char *arg_type_names[];
@@ -58,7 +79,7 @@ extern struct arg empty_arg_list[ARGM_NBARGS];
 
 struct arg_list *arg_list_clone(const struct arg_list *orig);
 struct arg_list *arg_list_add(struct arg_list *orig, struct arg *arg, int pos);
-int make_arg_list(const char *in, int len, unsigned int mask, struct arg **argp,
+int make_arg_list(const char *in, int len, int64_t mask, struct arg **argp,
                   char **err_msg, const char **err_ptr, int *err_arg,
                   struct arg_list *al);
 
diff --git a/include/types/arg.h b/include/types/arg.h
index 5430de7..b3b308c 100644
--- a/include/types/arg.h
+++ b/include/types/arg.h
@@ -35,12 +35,12 @@
 #define ARGT_NBTYPES   (1 << ARGT_BITS)
 #define ARGT_MASK      (ARGT_NBTYPES - 1)
 
-/* encoding of the arg count : up to 5 args are possible. 4 bits are left
+/* encoding of the arg count : up to 12 args are possible. 4 bits are left
  * unused at the top.
  */
 #define ARGM_MASK      ((1 << ARGM_BITS) - 1)
-#define ARGM_BITS      3
-#define ARGM_NBARGS    (32 - ARGM_BITS) / sizeof(int)
+#define ARGM_BITS      4
+#define ARGM_NBARGS    (128- ARGM_BITS) / sizeof(int64_t)
 
 enum {
 	ARGT_STOP = 0, /* end of the arg list */
diff --git a/src/arg.c b/src/arg.c
index 7248c54..acd706c 100644
--- a/src/arg.c
+++ b/src/arg.c
@@ -91,7 +91,7 @@ struct arg_list *arg_list_add(struct arg_list *orig, struct arg *arg, int pos)
  * argument type in each subsequent ARGT_BITS-bit sblock. If <err_msg> is not
  * NULL, it must point to a freeable or NULL pointer.
  */
-int make_arg_list(const char *in, int len, unsigned int mask, struct arg **argp,
+int make_arg_list(const char *in, int len, int64_t mask, struct arg **argp,
                   char **err_msg, const char **err_ptr, int *err_arg,
                   struct arg_list *al)
 {
@@ -101,7 +101,7 @@ int make_arg_list(const char *in, int len, unsigned int mask, struct arg **argp,
 	const char *beg;
 	char *word = NULL;
 	const char *ptr_err = NULL;
-	int min_arg;
+	int64_t min_arg;
 
 	*argp = NULL;
 
-- 
2.7.2

Reply via email to