Skip to content
Snippets Groups Projects
Commit 832eebcc authored by Niels Möller's avatar Niels Möller
Browse files

Further micro optimizations.

Rev: nettle/x86/aes.m4:1.4
parent d7b85b91
No related branches found
No related tags found
No related merge requests found
dnl BYTEREG(reg) gives the 8-bit register corresponding to the given 32-bit register. dnl LREG(reg) gives the 8-bit register corresponding to the given 32-bit register.
dnl Use in AES_SUBST_BYTE below, and is used by both the x86 and the x86_64 assembler. dnl Use in AES_SUBST_BYTE below, and is used by both the x86 and the x86_64 assembler.
define(<BYTEREG>,<ifelse( define(<LREG>,<ifelse(
$1, %eax, %al, $1, %eax, %al,
$1, %ebx, %bl, $1, %ebx, %bl,
$1, %ecx, %cl, $1, %ecx, %cl,
$1, %edx, %dl, $1, %edx, %dl)>)dnl
dnl The rest are x86_64 only
$1, %esi, %sil, define(<HREG>,<ifelse(
$1, %edi, %dil, $1, %eax, %ah,
$1, %ebp, %bpl, $1, %ebx, %bh,
$1, %esp, %spl, $1, %ecx, %ch,
$1, %r8d, %r8b, $1, %edx, %dh)>)dnl
$1, %r9d, %r9b,
$1, %r10d, %r10b,
$1, %r11d, %r11b,
$1, %r12d, %r12b,
$1, %r13d, %r13b,
$1, %r14d, %r14b,
$1, %r15d, %r15b)>)dnl
dnl AES_LOAD(a, b, c, d, src, key) dnl AES_LOAD(a, b, c, d, src, key)
dnl Loads the next block of data from src, and add the subkey pointed dnl Loads the next block of data from src, and add the subkey pointed
...@@ -51,20 +44,18 @@ define(<AES_STORE>, < ...@@ -51,20 +44,18 @@ define(<AES_STORE>, <
movl $3,8($6) movl $3,8($6)
movl $4,12($6)>)dnl movl $4,12($6)>)dnl
dnl AES_ROUND(table,a,b,c,d,out,tmp) dnl AES_ROUND(table,a,b,c,d,out,ptr)
dnl Computes one word of the AES round. Leaves result in $6. dnl Computes one word of the AES round. Leaves result in $6.
define(<AES_ROUND>, < define(<AES_ROUND>, <
movzbl BYTEREG($2), $7 movzbl LREG($2), $7
movl AES_TABLE0 ($1, $7,4),$6 movl AES_TABLE0 ($1, $7, 4),$6
movl $3, $7 movzbl HREG($3), $7
shrl <$>8,$7
andl <$>0xff,$7
xorl AES_TABLE1 ($1, $7, 4),$6 xorl AES_TABLE1 ($1, $7, 4),$6
movl $4,$7 C third one movl $4,$7
shrl <$>16,$7 shrl <$>16,$7
andl <$>0xff,$7 andl <$>0xff,$7
xorl AES_TABLE2 ($1, $7, 4),$6 xorl AES_TABLE2 ($1, $7, 4),$6
movl $5,$7 C fourth one movl $5,$7
shrl <$>24,$7 shrl <$>24,$7
xorl AES_TABLE3 ($1, $7, 4),$6>)dnl xorl AES_TABLE3 ($1, $7, 4),$6>)dnl
...@@ -74,8 +65,7 @@ dnl Note that we have to quote $ in constants. ...@@ -74,8 +65,7 @@ dnl Note that we have to quote $ in constants.
define(<AES_FINAL_ROUND>, < define(<AES_FINAL_ROUND>, <
C FIXME: Perform substitution on least significant byte here, C FIXME: Perform substitution on least significant byte here,
C to save work later. C to save work later.
movl $1,$5 movzbl LREG($1),$5
andl <$>0x000000ff,$5
movl $2,$6 movl $2,$6
andl <$>0x0000ff00,$6 andl <$>0x0000ff00,$6
orl $6, $5 orl $6, $5
...@@ -86,24 +76,24 @@ define(<AES_FINAL_ROUND>, < ...@@ -86,24 +76,24 @@ define(<AES_FINAL_ROUND>, <
andl <$>0xff000000,$6 andl <$>0xff000000,$6
orl $6, $5>)dnl orl $6, $5>)dnl
dnl AES_SUBST_BYTE(A, B, C, D, table, tmp) dnl AES_SUBST_BYTE(A, B, C, D, table, ptr)
dnl Substitutes the least significant byte of dnl Substitutes the least significant byte of
dnl each of eax, ebx, ecx and edx, and also rotates dnl each of eax, ebx, ecx and edx, and also rotates
dnl the words one byte to the left. dnl the words one byte to the left.
dnl Uses that AES_SBOX == 0 dnl Uses that AES_SBOX == 0
define(<AES_SUBST_BYTE>, < define(<AES_SUBST_BYTE>, <
movzbl BYTEREG($1),$6 movzbl LREG($1),$6
movb ($5, $6),BYTEREG($1) movb ($5, $6),LREG($1)
roll <$>8,$1 roll <$>8,$1
movzbl BYTEREG($2),$6 movzbl LREG($2),$6
movb ($5, $6),BYTEREG($2) movb ($5, $6),LREG($2)
roll <$>8,$2 roll <$>8,$2
movzbl BYTEREG($3),$6 movzbl LREG($3),$6
movb ($5, $6),BYTEREG($3) movb ($5, $6),LREG($3)
roll <$>8,$3 roll <$>8,$3
movzbl BYTEREG($4),$6 movzbl LREG($4),$6
movb ($5, $6),BYTEREG($4) movb ($5, $6),LREG($4)
roll <$>8,$4>)dnl roll <$>8,$4>)dnl
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment