[dpdk-dev,v6,2/7] hash: add assembly implementation of CRC32 intrinsics

Message ID 3fdc339aa3f0206ae2200937b9791af69e83409e.1417092208.git.e_zhumabekov@sts.kz (mailing list archive)
State Accepted, archived
Headers

Commit Message

Yerden Zhumabekov Jan. 29, 2015, 8:48 a.m. UTC
  Added:
- crc32c_sse42_u32() emits 'crc32l' asm instruction;
- crc32c_sse42_u64() emits 'crc32q' asm instruction;
- crc32c_sse42_u64_mimic(), wrapper in case of run on 32-bit platform.

Signed-off-by: Yerden Zhumabekov <e_zhumabekov@sts.kz>
---
 lib/librte_hash/rte_hash_crc.h |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)
  

Comments

Cunming Liang Feb. 2, 2015, 5:15 a.m. UTC | #1
On 1/29/2015 4:48 PM, Yerden Zhumabekov wrote:
> Added:
> - crc32c_sse42_u32() emits 'crc32l' asm instruction;
> - crc32c_sse42_u64() emits 'crc32q' asm instruction;
> - crc32c_sse42_u64_mimic(), wrapper in case of run on 32-bit platform.
>
> Signed-off-by: Yerden Zhumabekov <e_zhumabekov@sts.kz>
> ---
>   lib/librte_hash/rte_hash_crc.h |   34 ++++++++++++++++++++++++++++++++++
>   1 file changed, 34 insertions(+)
>
> diff --git a/lib/librte_hash/rte_hash_crc.h b/lib/librte_hash/rte_hash_crc.h
> index 4da7ca4..fe35996 100644
> --- a/lib/librte_hash/rte_hash_crc.h
> +++ b/lib/librte_hash/rte_hash_crc.h
> @@ -363,6 +363,40 @@ crc32c_2words(uint64_t data, uint32_t init_val)
>   	return crc;
>   }
>   
> +static inline uint32_t
> +crc32c_sse42_u32(uint32_t data, uint32_t init_val)
> +{
> +	__asm__ volatile(
> +			"crc32l %[data], %[init_val];"
> +			: [init_val] "+r" (init_val)
> +			: [data] "rm" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_sse42_u64(uint64_t data, uint64_t init_val)
> +{
> +	__asm__ volatile(
> +			"crc32q %[data], %[init_val];"
> +			: [init_val] "+r" (init_val)
> +			: [data] "rm" (data));
> +	return init_val;
> +}
[LCM] I'm curious about the benefit of replacing CRC32 intrinsic 
"_mm_crc32_u32/64".
> +
> +static inline uint32_t
> +crc32c_sse42_u64_mimic(uint64_t data, uint64_t init_val)
> +{
> +	union {
> +		uint32_t u32[2];
> +		uint64_t u64;
> +	} d;
> +
> +	d.u64 = data;
> +	init_val = crc32c_sse42_u32(d.u32[0], init_val);
> +	init_val = crc32c_sse42_u32(d.u32[1], init_val);
> +	return init_val;
> +}
> +
>   /**
>    * Use single crc32 instruction to perform a hash on a 4 byte value.
>    *
  
Yerden Zhumabekov Feb. 2, 2015, 5:34 a.m. UTC | #2
02.02.2015 11:15, Liang, Cunming пишет:
>
>> +static inline uint32_t
>> +crc32c_sse42_u64(uint64_t data, uint64_t init_val)
>> +{
>> +    __asm__ volatile(
>> +            "crc32q %[data], %[init_val];"
>> +            : [init_val] "+r" (init_val)
>> +            : [data] "rm" (data));
>> +    return init_val;
>> +}
> [LCM] I'm curious about the benefit of replacing CRC32 intrinsic
> "_mm_crc32_u32/64".

These intrinsics are not available on a platform which has no SSE4.2
support so the build would fail.

See previous suggestion from Neil: 
http://dpdk.org/ml/archives/dev/2014-November/008353.html
  
Cunming Liang Feb. 2, 2015, 5:59 a.m. UTC | #3
Got it, thanks.

> -----Original Message-----

> From: Yerden Zhumabekov [mailto:e_zhumabekov@sts.kz]

> Sent: Monday, February 02, 2015 1:34 PM

> To: Liang, Cunming; dev@dpdk.org

> Subject: Re: [dpdk-dev] [PATCH v6 2/7] hash: add assembly implementation of

> CRC32 intrinsics

> 

> 

> 02.02.2015 11:15, Liang, Cunming пишет:

> >

> >> +static inline uint32_t

> >> +crc32c_sse42_u64(uint64_t data, uint64_t init_val)

> >> +{

> >> +    __asm__ volatile(

> >> +            "crc32q %[data], %[init_val];"

> >> +            : [init_val] "+r" (init_val)

> >> +            : [data] "rm" (data));

> >> +    return init_val;

> >> +}

> > [LCM] I'm curious about the benefit of replacing CRC32 intrinsic

> > "_mm_crc32_u32/64".

> 

> These intrinsics are not available on a platform which has no SSE4.2

> support so the build would fail.

> 

> See previous suggestion from Neil:

> http://dpdk.org/ml/archives/dev/2014-November/008353.html

> 

> --

> Sincerely,

> 

> Yerden Zhumabekov

> State Technical Service

> Astana, KZ
  

Patch

diff --git a/lib/librte_hash/rte_hash_crc.h b/lib/librte_hash/rte_hash_crc.h
index 4da7ca4..fe35996 100644
--- a/lib/librte_hash/rte_hash_crc.h
+++ b/lib/librte_hash/rte_hash_crc.h
@@ -363,6 +363,40 @@  crc32c_2words(uint64_t data, uint32_t init_val)
 	return crc;
 }
 
+static inline uint32_t
+crc32c_sse42_u32(uint32_t data, uint32_t init_val)
+{
+	__asm__ volatile(
+			"crc32l %[data], %[init_val];"
+			: [init_val] "+r" (init_val)
+			: [data] "rm" (data));
+	return init_val;
+}
+
+static inline uint32_t
+crc32c_sse42_u64(uint64_t data, uint64_t init_val)
+{
+	__asm__ volatile(
+			"crc32q %[data], %[init_val];"
+			: [init_val] "+r" (init_val)
+			: [data] "rm" (data));
+	return init_val;
+}
+
+static inline uint32_t
+crc32c_sse42_u64_mimic(uint64_t data, uint64_t init_val)
+{
+	union {
+		uint32_t u32[2];
+		uint64_t u64;
+	} d;
+
+	d.u64 = data;
+	init_val = crc32c_sse42_u32(d.u32[0], init_val);
+	init_val = crc32c_sse42_u32(d.u32[1], init_val);
+	return init_val;
+}
+
 /**
  * Use single crc32 instruction to perform a hash on a 4 byte value.
  *