[sheepdog] [PATCH] check ssse3 instructions before using isa-l library

Robin Dong robin.k.dong at gmail.com
Fri Sep 26 05:51:23 CEST 2014


From: Robin Dong <sanbai at taobao.com>

Add new macro 'HAVE_SSSE3', so we could choose zfec or isa-l
by checking it.

Signed-off-by: Robin Dong <sanbai at taobao.com>
---
 configure.ac    | 10 ++++++++++
 include/fec.h   | 18 ++++++++++--------
 lib/Makefile.am | 10 +++++++---
 lib/fec.c       |  8 +++++---
 4 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/configure.ac b/configure.ac
index f78aa3b..81cdf24 100644
--- a/configure.ac
+++ b/configure.ac
@@ -198,6 +198,16 @@ LINT_FLAGS="-weak -unrecog +posixlib +ignoresigns -fcnuse \
 
 AM_CONDITIONAL(BUILD_SHA1_HW, [[[[ $host = *x86_64* ]]]])
 
+AC_TRY_COMPILE([],
+	       [ __asm__ __volatile__ ("addsubpd" " %" "xmm0" ", %" "xmm1");],
+	       CPU_SSSE3=true)
+
+if test $CPU_SSSE3 = true; then
+	AC_DEFINE_UNQUOTED([HAVE_SSSE3], [1], [have ssse3])
+fi
+
+AM_CONDITIONAL(BUILD_ISAL_HW, test $CPU_SSSE3 = true)
+
 AC_ARG_ENABLE([fatal-warnings],
 	[  --enable-fatal-warnings : enable fatal warnings. ],
 	[ default="no" ])
diff --git a/include/fec.h b/include/fec.h
index 1ae32e4..b339c8d 100644
--- a/include/fec.h
+++ b/include/fec.h
@@ -172,17 +172,18 @@ static inline void ec_encode(struct fec *ctx, const uint8_t *ds[],
 			     uint8_t *ps[])
 {
 	int p = ctx->dp - ctx->d;
-	int pidx[p];
 
-	for (int i = 0; i < p; i++)
-		pidx[i] = ctx->d + i;
-
-	if (cpu_has_ssse3)
+	for (int i = 0; i < p; i++) {
+	#ifdef HAVE_SSSE3
 		ec_encode_data_sse(SD_EC_DATA_STRIPE_SIZE / ctx->d, ctx->d, p,
 				   ctx->ec_tbl, (unsigned char **)ds, ps);
-	else
+	#else
+		int pidx[p];
+		pidx[i] = ctx->d + i;
 		fec_encode(ctx, ds, ps, pidx, p, SD_EC_DATA_STRIPE_SIZE /
 			   ctx->d);
+	#endif
+	}
 }
 
 /*
@@ -207,9 +208,10 @@ static inline void ec_destroy(struct fec *ctx)
 static inline void ec_decode_buffer(struct fec *ctx, uint8_t *input[],
 				    const int in_idx[], char *buf, int idx)
 {
-	if (cpu_has_ssse3)
+	#ifdef HAVE_SSSE3
 		isa_decode_buffer(ctx, input, in_idx, buf, idx);
-	else
+	#else
 		fec_decode_buffer(ctx, input, in_idx, buf, idx);
+	#endif
 }
 #endif
diff --git a/lib/Makefile.am b/lib/Makefile.am
index a43076e..56ba504 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -4,6 +4,10 @@ AM_CPPFLAGS                = -I$(top_builddir)/include -I$(top_srcdir)/include
 
 libsheepdog_a_DEPENDENCIES =
 
+libsheepdog_a_SOURCES	= event.c logger.c net.c util.c rbtree.c strbuf.c \
+			  sha1.c option.c work.c sockfd_cache.c fec.c sd_inode.c
+
+if BUILD_ISAL_HW
 noinst_LIBRARIES	= libisa.a libsheepdog.a
 
 libisa_a_SOURCES	= $(shell find isa-l/ -type f -regex ".*\.\(c\|h\|asm\)") \
@@ -12,9 +16,6 @@ libisa_a_SOURCES	= $(shell find isa-l/ -type f -regex ".*\.\(c\|h\|asm\)") \
 			  isa-l/Makefile.nmake \
 			  isa-l/make.inc
 
-libsheepdog_a_SOURCES	= event.c logger.c net.c util.c rbtree.c strbuf.c \
-			  sha1.c option.c work.c sockfd_cache.c fec.c sd_inode.c
-
 libsheepdog_a_LIBADD	= isa-l/bin/ec_base.o \
 			  isa-l/bin/ec_highlevel_func.o \
 			  isa-l/bin/ec_multibinary.o \
@@ -26,6 +27,9 @@ libsheepdog_a_LIBADD	= isa-l/bin/ec_base.o \
 			  isa-l/bin/gf_vect_dot_prod_sse.o \
 			  isa-l/bin/gf_vect_mul_avx.o \
 			  isa-l/bin/gf_vect_mul_sse.o
+else
+noinst_LIBRARIES	= libsheepdog.a
+endif
 
 if BUILD_SHA1_HW
 libsheepdog_a_SOURCES	+= sha1_ssse3.S
diff --git a/lib/fec.c b/lib/fec.c
index c4e7a6f..6de716a 100644
--- a/lib/fec.c
+++ b/lib/fec.c
@@ -454,8 +454,9 @@ void fec_free(struct fec *p)
 	assert(p != NULL && p->magic == (((FEC_MAGIC ^ p->d) ^ p->dp) ^
 					 (unsigned long) (p->enc_matrix)));
 	free(p->enc_matrix);
-	if (cpu_has_ssse3)
+	#ifdef HAVE_SSSE3
 		free(p->ec_tbl);
+	#endif
 	free(p);
 }
 
@@ -496,12 +497,13 @@ struct fec *fec_new(unsigned short d, unsigned short dp)
 		*p = 1;
 	free(tmp_m);
 
-	if (cpu_has_ssse3) {
+	#ifdef HAVE_SSSE3
 		retval->ec_tbl = xmalloc(dp * d * 32);
 		ec_init_tables(d, dp - d, retval->enc_matrix + (d * d),
 			       retval->ec_tbl);
-	} else
+	#else
 		retval->ec_tbl = NULL;
+	#endif
 	return retval;
 }
 
-- 
1.9.1




More information about the sheepdog mailing list