From 4434eb3881edeb388f1d1b132d0c21e1789e1c37 Mon Sep 17 00:00:00 2001 From: "Alexander.Boyko" Date: Tue, 28 Aug 2012 11:38:31 +0400 Subject: [PATCH] LU-1786 build: Fix build for crc32 pclmulqdq Old versions of gcc don`t know pextrd instruction. User mode libcfs build had wrong dependency with ARCH variable defined. PEXTRD marco was added for old gcc, wrong dependency was fixed. Signed-off-by: Alexander Boyko Change-Id: I8821a1c25367f0f284a80192ed65d89808d1b2da Reviewed-on: http://review.whamcloud.com/3801 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Minh Diep Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- libcfs/libcfs/Makefile.in | 4 ++-- libcfs/libcfs/crc32-pclmul_asm.S | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/libcfs/libcfs/Makefile.in b/libcfs/libcfs/Makefile.in index bf08868..c9cff92 100644 --- a/libcfs/libcfs/Makefile.in +++ b/libcfs/libcfs/Makefile.in @@ -42,9 +42,9 @@ endif libcfs-all-objs := debug.o fail.o nidstrings.o lwt.o module.o tracefile.o \ watchdog.o libcfs_string.o hash.o kernel_user_comm.o \ prng.o workitem.o upcall_cache.o libcfs_cpu.o \ - libcfs_mem.o libcfs_lock.o $(libcfs-pclmul-obj) + libcfs_mem.o libcfs_lock.o -libcfs-objs := $(libcfs-linux-objs) $(libcfs-all-objs) +libcfs-objs := $(libcfs-linux-objs) $(libcfs-all-objs) $(libcfs-pclmul-obj) EXTRA_PRE_CFLAGS := -I@LUSTRE@/../libcfs/libcfs diff --git a/libcfs/libcfs/crc32-pclmul_asm.S b/libcfs/libcfs/crc32-pclmul_asm.S index 04a724e..f4d315b 100644 --- a/libcfs/libcfs/crc32-pclmul_asm.S +++ b/libcfs/libcfs/crc32-pclmul_asm.S @@ -41,6 +41,34 @@ * Use macro defenition from linux kernel 2.6.38 */ #define REG_NUM_INVALID 100 + .macro R32_NUM opd r32 + \opd = REG_NUM_INVALID + .ifc \r32,%eax + \opd = 0 + .endif + .ifc \r32,%ecx + \opd = 1 + .endif + .ifc \r32,%edx + \opd = 2 + .endif + .ifc \r32,%ebx + \opd = 3 + .endif + .ifc \r32,%esp + \opd = 4 + .endif + .ifc \r32,%ebp + \opd = 5 + .endif + .ifc \r32,%esi + \opd = 6 + .endif + .ifc \r32,%edi + \opd = 7 + .endif + .endm + .macro XMM_NUM opd xmm \opd = REG_NUM_INVALID .ifc \xmm,%xmm0 @@ -117,6 +145,15 @@ .byte \imm8 .endm + .macro PEXTRD imm8 xmm1 reg1 + XMM_NUM extrd_opd2 \xmm1 + R32_NUM extrd_opd1 \reg1 + PFX_OPD_SIZE + PFX_REX extrd_opd1 extrd_opd2 + .byte 0x0f, 0x3a, 0x16 + MODRM 0xc0 extrd_opd1 extrd_opd2 + .byte \imm8 + .endm .align 16 /* @@ -318,6 +355,6 @@ fold_64: pand %xmm3, %xmm1 PCLMULQDQ 0x00, CONSTANT, %xmm1 pxor %xmm2, %xmm1 - pextrd $0x01, %xmm1, %eax + PEXTRD 0x01, %xmm1, %eax ret -- 1.8.3.1