Skip to contentSkip to conversation

crypto/x86: Use XORL r32,32 in poly1305-x86_64-cryptogams.pl

PATCH In review Uros Bizjak 3 participants 5 messages Aug 27, 2020 – Sep 11, 2020

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 crypto/x86: Use XORL r32,32 in poly1305-x86_64-cryptogams.pl

x86_64 zero extends 32bit operations, so for 64bit operands, XORL r32,r32 is functionally equal to XORQ r64,r64, but avoids a REX prefix byte when legacy registers are used.

Cc Herbert Xu <[email protected]>
Cc "David S. Miller" <[email protected]>
---
 arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
arch/x86/crypto/poly1305-x86_64-cryptogams.pl +4 -4
index 137edcf038cb..7d568012cc15 100644
@@ -246,7 +246,7 @@ $code.=<<___ if (!$kernel);
 ___
 &declare_function("poly1305_init_x86_64", 32, 3);
 $code.=<<___;
-	xor	%rax,%rax
+	xor	%eax,%eax
 	mov	%rax,0($ctx)		# initialize hash value
 	mov	%rax,8($ctx)
 	mov	%rax,16($ctx)
@@ -2853,7 +2853,7 @@ $code.=<<___;
 .type	poly1305_init_base2_44,\@function,3
 .align	32
 poly1305_init_base2_44:
-	xor	%rax,%rax
+	xor	%eax,%eax
 	mov	%rax,0($ctx)		# initialize hash value
 	mov	%rax,8($ctx)
 	mov	%rax,16($ctx)
@@ -3947,7 +3947,7 @@ xor128_decrypt_n_pad:
 	mov	\$16,$len
 	sub	%r10,$len
 	xor	%eax,%eax
-	xor	%r11,%r11
+	xor	%r11d,%r11d
 .Loop_dec_byte:
 	mov	($inp,$otp),%r11b
 	mov	($otp),%al
@@ -4085,7 +4085,7 @@ avx_handler:
 	.long	0xa548f3fc		# cld; rep movsq
 
 	mov	$disp,%rsi
-	xor	%rcx,%rcx		# arg1, UNW_FLAG_NHANDLER
+	xor	%ecx,%ecx		# arg1, UNW_FLAG_NHANDLER
 	mov	8(%rsi),%rdx		# arg2, disp->ImageBase
 	mov	0(%rsi),%r8		# arg3, disp->ControlPc
 	mov	16(%rsi),%r9		# arg4, disp->FunctionEntry
Signature · 1 line
2.26.2
#1 lore raw

Hi Uros,

Any benchmarks for this? Seems like it's all in initialization code, right? I'm CC'ing Andy into this.

Jason

Quoted 54 lines · Uros Bizjak

x86_64 zero extends 32bit operations, so for 64bit operands, XORL r32,r32 is functionally equal to XORQ r64,r64, but avoids a REX prefix byte when legacy registers are used.

Cc Herbert Xu <[email protected]>
Cc "David S. Miller" <[email protected]>
---
 arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
arch/x86/crypto/poly1305-x86_64-cryptogams.pl +4 -4
index 137edcf038cb..7d568012cc15 100644
@@ -246,7 +246,7 @@ $code.=<<___ if (!$kernel);
 ___
 &declare_function("poly1305_init_x86_64", 32, 3);
 $code.=<<___;
-	xor	%rax,%rax
+	xor	%eax,%eax
 	mov	%rax,0($ctx)		# initialize hash value
 	mov	%rax,8($ctx)
 	mov	%rax,16($ctx)
@@ -2853,7 +2853,7 @@ $code.=<<___;
 .type	poly1305_init_base2_44,\@function,3
 .align	32
 poly1305_init_base2_44:
-	xor	%rax,%rax
+	xor	%eax,%eax
 	mov	%rax,0($ctx)		# initialize hash value
 	mov	%rax,8($ctx)
 	mov	%rax,16($ctx)
@@ -3947,7 +3947,7 @@ xor128_decrypt_n_pad:
 	mov	\$16,$len
 	sub	%r10,$len
 	xor	%eax,%eax
-	xor	%r11,%r11
+	xor	%r11d,%r11d
 .Loop_dec_byte:
 	mov	($inp,$otp),%r11b
 	mov	($otp),%al
@@ -4085,7 +4085,7 @@ avx_handler:
 	.long	0xa548f3fc		# cld; rep movsq
 
 	mov	$disp,%rsi
-	xor	%rcx,%rcx		# arg1, UNW_FLAG_NHANDLER
+	xor	%ecx,%ecx		# arg1, UNW_FLAG_NHANDLER
 	mov	8(%rsi),%rdx		# arg2, disp->ImageBase
 	mov	0(%rsi),%r8		# arg3, disp->ControlPc
 	mov	16(%rsi),%r9		# arg4, disp->FunctionEntry
Signature · 1 line
2.26.2
Signature · 7 lines
Jason A. Donenfeld
Deep Space Explorer
fr: +33 6 51 90 82 66
us: +1 513 476 1200
www.jasondonenfeld.com
www.zx2c4.com
zx2c4.com/keys/AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc
#2 lore raw
Quoted 5 lines · Jason A. Donenfeld

Hi Uros,

Any benchmarks for this? Seems like it's all in initialization code, right? I'm CC'ing Andy into this.

This patch should have no performance effect, it saves REX prefix byte when the optimization is applied to legacy registers.

Uros.

Quoted 66 lines

Jason

Quoted 52 lines · Uros Bizjak

x86_64 zero extends 32bit operations, so for 64bit operands, XORL r32,r32 is functionally equal to XORQ r64,r64, but avoids a REX prefix byte when legacy registers are used.

Cc Herbert Xu <[email protected]>
Cc "David S. Miller" <[email protected]>
---
 arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
arch/x86/crypto/poly1305-x86_64-cryptogams.pl +4 -5
index 137edcf038cb..7d568012cc15 100644
@@ -246,7 +246,7 @@ $code.=<<___ if (!$kernel);
 ___
 &declare_function("poly1305_init_x86_64", 32, 3);
 $code.=<<___;
-     xor     %rax,%rax
+     xor     %eax,%eax
      mov     %rax,0($ctx)            # initialize hash value
      mov     %rax,8($ctx)
      mov     %rax,16($ctx)
@@ -2853,7 +2853,7 @@ $code.=<<___;
 .type        poly1305_init_base2_44,\@function,3
 .align       32
 poly1305_init_base2_44:
-     xor     %rax,%rax
+     xor     %eax,%eax
      mov     %rax,0($ctx)            # initialize hash value
      mov     %rax,8($ctx)
      mov     %rax,16($ctx)
@@ -3947,7 +3947,7 @@ xor128_decrypt_n_pad:
      mov     \$16,$len
      sub     %r10,$len
      xor     %eax,%eax
-     xor     %r11,%r11
+     xor     %r11d,%r11d
 .Loop_dec_byte:
      mov     ($inp,$otp),%r11b
      mov     ($otp),%al
@@ -4085,7 +4085,7 @@ avx_handler:
      .long   0xa548f3fc              # cld; rep movsq
 
      mov     $disp,%rsi
-     xor     %rcx,%rcx               # arg1, UNW_FLAG_NHANDLER
+     xor     %ecx,%ecx               # arg1, UNW_FLAG_NHANDLER
      mov     8(%rsi),%rdx            # arg2, disp->ImageBase
      mov     0(%rsi),%r8             # arg3, disp->ControlPc
      mov     16(%rsi),%r9            # arg4, disp->FunctionEntry
--
Quoted 2 lines

2.26.2

--
Jason A. Donenfeld
Deep Space Explorer
fr: +33 6 51 90 82 66
us: +1 513 476 1200
www.jasondonenfeld.com
www.zx2c4.com zx2c4.com/keys/AB9942E6D4A4CFC3412620A749FC7012A5DE03AE.asc

Acked-by on v1 1/1
#3 lore raw
In reply to Uros Bizjak

Hi Uros, Herbert,

Quoted 54 lines · Uros Bizjak

x86_64 zero extends 32bit operations, so for 64bit operands, XORL r32,r32 is functionally equal to XORQ r64,r64, but avoids a REX prefix byte when legacy registers are used.

Cc Herbert Xu <[email protected]>
Cc "David S. Miller" <[email protected]>
---
 arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
arch/x86/crypto/poly1305-x86_64-cryptogams.pl +4 -4
index 137edcf038cb..7d568012cc15 100644
@@ -246,7 +246,7 @@ $code.=<<___ if (!$kernel);
 ___
 &declare_function("poly1305_init_x86_64", 32, 3);
 $code.=<<___;
-	xor	%rax,%rax
+	xor	%eax,%eax
 	mov	%rax,0($ctx)		# initialize hash value
 	mov	%rax,8($ctx)
 	mov	%rax,16($ctx)
@@ -2853,7 +2853,7 @@ $code.=<<___;
 .type	poly1305_init_base2_44,\@function,3
 .align	32
 poly1305_init_base2_44:
-	xor	%rax,%rax
+	xor	%eax,%eax
 	mov	%rax,0($ctx)		# initialize hash value
 	mov	%rax,8($ctx)
 	mov	%rax,16($ctx)
@@ -3947,7 +3947,7 @@ xor128_decrypt_n_pad:
 	mov	\$16,$len
 	sub	%r10,$len
 	xor	%eax,%eax
-	xor	%r11,%r11
+	xor	%r11d,%r11d
 .Loop_dec_byte:
 	mov	($inp,$otp),%r11b
 	mov	($otp),%al
@@ -4085,7 +4085,7 @@ avx_handler:
 	.long	0xa548f3fc		# cld; rep movsq
 
 	mov	$disp,%rsi
-	xor	%rcx,%rcx		# arg1, UNW_FLAG_NHANDLER
+	xor	%ecx,%ecx		# arg1, UNW_FLAG_NHANDLER
 	mov	8(%rsi),%rdx		# arg2, disp->ImageBase
 	mov	0(%rsi),%r8		# arg3, disp->ControlPc
 	mov	16(%rsi),%r9		# arg4, disp->FunctionEntry
Signature · 1 line
2.26.2

Per the discussion elsewhere,

for cryptodev-2.6.git, rather than crypto-2.6.git

Thanks,
Jason

maintainer
#4 lore raw
In reply to Uros Bizjak
Quoted 10 lines · Uros Bizjak

x86_64 zero extends 32bit operations, so for 64bit operands, XORL r32,r32 is functionally equal to XORQ r64,r64, but avoids a REX prefix byte when legacy registers are used.

Cc Herbert Xu <[email protected]>
Cc "David S. Miller" <[email protected]>
---
 arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Patch applied. Thanks.

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt