summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHuang Ying <ying.huang@intel.com>2009-11-23 14:55:22 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2009-11-23 14:55:22 +0300
commit564ec0ec05ac6ee409bde81f7ef27a3dadbf3a6a (patch)
treeb4bb4e29cdfc2ceb90ac10ed4da139546375faa7
parentb369e521237d6ef21c453f3ac4f4b8577ec14f87 (diff)
downloadlinux-564ec0ec05ac6ee409bde81f7ef27a3dadbf3a6a.tar.xz
crypto: ghash-clmulni-intel - Use gas macro for PCLMULQDQ-NI and PSHUFB
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>
-rw-r--r--arch/x86/crypto/ghash-clmulni-intel_asm.S29
1 files changed, 10 insertions, 19 deletions
diff --git a/arch/x86/crypto/ghash-clmulni-intel_asm.S b/arch/x86/crypto/ghash-clmulni-intel_asm.S
index 59584982fb75..1528dc4886cf 100644
--- a/arch/x86/crypto/ghash-clmulni-intel_asm.S
+++ b/arch/x86/crypto/ghash-clmulni-intel_asm.S
@@ -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