crypto: ghash-clmulni-intel - Use gas macro for PCLMULQDQ-NI and PSHUFB
authorHuang Ying <ying.huang@intel.com>
Mon, 23 Nov 2009 11:55:22 +0000 (19:55 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 23 Nov 2009 11:55:22 +0000 (19:55 +0800)
Old binutils do not support PCLMULQDQ-NI and PSHUFB, to make kernel
can be compiled by them, .byte code is used instead of assembly
instructions. But the readability and flexibility of raw .byte code is
not good.

So corresponding assembly instruction like gas macro is used instead.

Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/x86/crypto/ghash-clmulni-intel_asm.S

index 5958498..1528dc4 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 #include <linux/linkage.h>
-#include <asm/i387.h>
+#include <asm/inst.h>
 
 .align 16
 .Lbswap_mask:
@@ -56,12 +56,9 @@ __clmul_gf128mul_ble:
        pxor DATA, T2
        pxor SHASH, T3
 
-       # pclmulqdq $0x00, SHASH, DATA  # DATA = a0 * b0
-       .byte 0x66, 0x0f, 0x3a, 0x44, 0xc1, 0x00
-       # pclmulqdq $0x11, SHASH, T1    # T1 = a1 * b1
-       .byte 0x66, 0x0f, 0x3a, 0x44, 0xd1, 0x11
-       # pclmulqdq $0x00, T3, T2       # T2 = (a1 + a0) * (b1 + b0)
-       .byte 0x66, 0x0f, 0x3a, 0x44, 0xdc, 0x00
+       PCLMULQDQ 0x00 SHASH DATA       # DATA = a0 * b0
+       PCLMULQDQ 0x11 SHASH T1         # T1 = a1 * b1
+       PCLMULQDQ 0x00 T3 T2            # T2 = (a1 + a0) * (b1 + b0)
        pxor DATA, T2
        pxor T1, T2                     # T2 = a0 * b1 + a1 * b0
 
@@ -101,11 +98,9 @@ ENTRY(clmul_ghash_mul)
        movups (%rdi), DATA
        movups (%rsi), SHASH
        movaps .Lbswap_mask, BSWAP
-       # pshufb BSWAP, DATA
-       PSHUFB_XMM5_XMM0
+       PSHUFB_XMM BSWAP DATA
        call __clmul_gf128mul_ble
-       # pshufb BSWAP, DATA
-       .byte 0x66, 0x0f, 0x38, 0x00, 0xc5
+       PSHUFB_XMM BSWAP DATA
        movups DATA, (%rdi)
        ret
 
@@ -119,21 +114,18 @@ ENTRY(clmul_ghash_update)
        movaps .Lbswap_mask, BSWAP
        movups (%rdi), DATA
        movups (%rcx), SHASH
-       # pshufb BSWAP, DATA
-       PSHUFB_XMM5_XMM0
+       PSHUFB_XMM BSWAP DATA
 .align 4
 .Lupdate_loop:
        movups (%rsi), IN1
-       # pshufb BSWAP, IN1
-       PSHUFB_XMM5_XMM6
+       PSHUFB_XMM BSWAP IN1
        pxor IN1, DATA
        call __clmul_gf128mul_ble
        sub $16, %rdx
        add $16, %rsi
        cmp $16, %rdx
        jge .Lupdate_loop
-       # pshufb BSWAP, DATA
-       PSHUFB_XMM5_XMM0
+       PSHUFB_XMM BSWAP DATA
        movups DATA, (%rdi)
 .Lupdate_just_ret:
        ret
@@ -146,8 +138,7 @@ ENTRY(clmul_ghash_update)
 ENTRY(clmul_ghash_setkey)
        movaps .Lbswap_mask, BSWAP
        movups (%rsi), %xmm0
-       # pshufb BSWAP, %xmm0
-       PSHUFB_XMM5_XMM0
+       PSHUFB_XMM BSWAP %xmm0
        movaps %xmm0, %xmm1
        psllq $1, %xmm0
        psrlq $63, %xmm1