Hi,
I've attached an implementation of AES optimized for 64-bit Pentium 4E.
The round function achieves 3 µops per cycle, so even with function
call overhead its performance is quite good, with best average time for
10000 consecutive encryptions at <233 cycles per block. I'll make it
ready for inclusion in the Linux kernel later. In the meantime,
comments are welcome.
I'm still working on a version optimized for AMD - will get back to that
later, as well as some 32-bit versions I'll soon provide.
Regards,
Dag Arne Osvik
/*
* AES optimized for Intel Pentium 4E with EM64T (Nocona)
*
* Copyright (C) 2006 Dag Arne Osvik <[EMAIL PROTECTED]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
// Uniform naming for AMD64 integer registers
// 64-bit
#define r0 rax
#define r1 rdx
#define r2 rcx
#define r3 rbx
#define r4 rsi
#define r5 rdi
#define r6 rbp
// 32-bit
#define r0d eax
#define r1d edx
#define r2d ecx
#define r3d ebx
#define r4d esi
#define r5d edi
#define r6d ebp
// 16-bit
#define r0w ax
#define r1w dx
#define r2w cx
#define r3w bx
#define r4w si
#define r5w di
#define r6w bp
// 8-bit
#define r0b al
#define r1b dl
#define r2b cl
#define r3b bl
#define r4b sil
#define r5b dil
#define r6b bpl
// High bytes
#define r0h ah
#define r1h dh
#define r2h ch
#define r3h bh
//-------------------
// Lookup tables
.data
.align 64
aes_ftab:
.quad 0xa56363c6a56363c6
.quad 0x847c7cf8847c7cf8
.quad 0x997777ee997777ee
.quad 0x8d7b7bf68d7b7bf6
.quad 0x0df2f2ff0df2f2ff
.quad 0xbd6b6bd6bd6b6bd6
.quad 0xb16f6fdeb16f6fde
.quad 0x54c5c59154c5c591
.quad 0x5030306050303060
.quad 0x0301010203010102
.quad 0xa96767cea96767ce
.quad 0x7d2b2b567d2b2b56
.quad 0x19fefee719fefee7
.quad 0x62d7d7b562d7d7b5
.quad 0xe6abab4de6abab4d
.quad 0x9a7676ec9a7676ec
.quad 0x45caca8f45caca8f
.quad 0x9d82821f9d82821f
.quad 0x40c9c98940c9c989
.quad 0x877d7dfa877d7dfa
.quad 0x15fafaef15fafaef
.quad 0xeb5959b2eb5959b2
.quad 0xc947478ec947478e
.quad 0x0bf0f0fb0bf0f0fb
.quad 0xecadad41ecadad41
.quad 0x67d4d4b367d4d4b3
.quad 0xfda2a25ffda2a25f
.quad 0xeaafaf45eaafaf45
.quad 0xbf9c9c23bf9c9c23
.quad 0xf7a4a453f7a4a453
.quad 0x967272e4967272e4
.quad 0x5bc0c09b5bc0c09b
.quad 0xc2b7b775c2b7b775
.quad 0x1cfdfde11cfdfde1
.quad 0xae93933dae93933d
.quad 0x6a26264c6a26264c
.quad 0x5a36366c5a36366c
.quad 0x413f3f7e413f3f7e
.quad 0x02f7f7f502f7f7f5
.quad 0x4fcccc834fcccc83
.quad 0x5c3434685c343468
.quad 0xf4a5a551f4a5a551
.quad 0x34e5e5d134e5e5d1
.quad 0x08f1f1f908f1f1f9
.quad 0x937171e2937171e2
.quad 0x73d8d8ab73d8d8ab
.quad 0x5331316253313162
.quad 0x3f15152a3f15152a
.quad 0x0c0404080c040408
.quad 0x52c7c79552c7c795
.quad 0x6523234665232346
.quad 0x5ec3c39d5ec3c39d
.quad 0x2818183028181830
.quad 0xa1969637a1969637
.quad 0x0f05050a0f05050a
.quad 0xb59a9a2fb59a9a2f
.quad 0x0907070e0907070e
.quad 0x3612122436121224
.quad 0x9b80801b9b80801b
.quad 0x3de2e2df3de2e2df
.quad 0x26ebebcd26ebebcd
.quad 0x6927274e6927274e
.quad 0xcdb2b27fcdb2b27f
.quad 0x9f7575ea9f7575ea
.quad 0x1b0909121b090912
.quad 0x9e83831d9e83831d
.quad 0x742c2c58742c2c58
.quad 0x2e1a1a342e1a1a34
.quad 0x2d1b1b362d1b1b36
.quad 0xb26e6edcb26e6edc
.quad 0xee5a5ab4ee5a5ab4
.quad 0xfba0a05bfba0a05b
.quad 0xf65252a4f65252a4
.quad 0x4d3b3b764d3b3b76
.quad 0x61d6d6b761d6d6b7
.quad 0xceb3b37dceb3b37d
.quad 0x7b2929527b292952
.quad 0x3ee3e3dd3ee3e3dd
.quad 0x712f2f5e712f2f5e
.quad 0x9784841397848413
.quad 0xf55353a6f55353a6
.quad 0x68d1d1b968d1d1b9
.quad 0x0000000000000000
.quad 0x2cededc12cededc1
.quad 0x6020204060202040
.quad 0x1ffcfce31ffcfce3
.quad 0xc8b1b179c8b1b179
.quad 0xed5b5bb6ed5b5bb6
.quad 0xbe6a6ad4be6a6ad4
.quad 0x46cbcb8d46cbcb8d
.quad 0xd9bebe67d9bebe67
.quad 0x4b3939724b393972
.quad 0xde4a4a94de4a4a94
.quad 0xd44c4c98d44c4c98
.quad 0xe85858b0e85858b0
.quad 0x4acfcf854acfcf85
.quad 0x6bd0d0bb6bd0d0bb
.quad 0x2aefefc52aefefc5
.quad 0xe5aaaa4fe5aaaa4f
.quad 0x16fbfbed16fbfbed
.quad 0xc5434386c5434386
.quad 0xd74d4d9ad74d4d9a
.quad 0x5533336655333366
.quad 0x9485851194858511
.quad 0xcf45458acf45458a
.quad 0x10f9f9e910f9f9e9
.quad 0x0602020406020204
.quad 0x817f7ffe817f7ffe
.quad 0xf05050a0f05050a0
.quad 0x443c3c78443c3c78
.quad 0xba9f9f25ba9f9f25
.quad 0xe3a8a84be3a8a84b
.quad 0xf35151a2f35151a2
.quad 0xfea3a35dfea3a35d
.quad 0xc0404080c0404080
.quad 0x8a8f8f058a8f8f05
.quad 0xad92923fad92923f
.quad 0xbc9d9d21bc9d9d21
.quad 0x4838387048383870
.quad 0x04f5f5f104f5f5f1
.quad 0xdfbcbc63dfbcbc63
.quad 0xc1b6b677c1b6b677
.quad 0x75dadaaf75dadaaf
.quad 0x6321214263212142
.quad 0x3010102030101020
.quad 0x1affffe51affffe5
.quad 0x0ef3f3fd0ef3f3fd
.quad 0x6dd2d2bf6dd2d2bf
.quad 0x4ccdcd814ccdcd81
.quad 0x140c0c18140c0c18
.quad 0x3513132635131326
.quad 0x2fececc32fececc3
.quad 0xe15f5fbee15f5fbe
.quad 0xa2979735a2979735
.quad 0xcc444488cc444488
.quad 0x3917172e3917172e
.quad 0x57c4c49357c4c493
.quad 0xf2a7a755f2a7a755
.quad 0x827e7efc827e7efc
.quad 0x473d3d7a473d3d7a
.quad 0xac6464c8ac6464c8
.quad 0xe75d5dbae75d5dba
.quad 0x2b1919322b191932
.quad 0x957373e6957373e6
.quad 0xa06060c0a06060c0
.quad 0x9881811998818119
.quad 0xd14f4f9ed14f4f9e
.quad 0x7fdcdca37fdcdca3
.quad 0x6622224466222244
.quad 0x7e2a2a547e2a2a54
.quad 0xab90903bab90903b
.quad 0x8388880b8388880b
.quad 0xca46468cca46468c
.quad 0x29eeeec729eeeec7
.quad 0xd3b8b86bd3b8b86b
.quad 0x3c1414283c141428
.quad 0x79dedea779dedea7
.quad 0xe25e5ebce25e5ebc
.quad 0x1d0b0b161d0b0b16
.quad 0x76dbdbad76dbdbad
.quad 0x3be0e0db3be0e0db
.quad 0x5632326456323264
.quad 0x4e3a3a744e3a3a74
.quad 0x1e0a0a141e0a0a14
.quad 0xdb494992db494992
.quad 0x0a06060c0a06060c
.quad 0x6c2424486c242448
.quad 0xe45c5cb8e45c5cb8
.quad 0x5dc2c29f5dc2c29f
.quad 0x6ed3d3bd6ed3d3bd
.quad 0xefacac43efacac43
.quad 0xa66262c4a66262c4
.quad 0xa8919139a8919139
.quad 0xa4959531a4959531
.quad 0x37e4e4d337e4e4d3
.quad 0x8b7979f28b7979f2
.quad 0x32e7e7d532e7e7d5
.quad 0x43c8c88b43c8c88b
.quad 0x5937376e5937376e
.quad 0xb76d6ddab76d6dda
.quad 0x8c8d8d018c8d8d01
.quad 0x64d5d5b164d5d5b1
.quad 0xd24e4e9cd24e4e9c
.quad 0xe0a9a949e0a9a949
.quad 0xb46c6cd8b46c6cd8
.quad 0xfa5656acfa5656ac
.quad 0x07f4f4f307f4f4f3
.quad 0x25eaeacf25eaeacf
.quad 0xaf6565caaf6565ca
.quad 0x8e7a7af48e7a7af4
.quad 0xe9aeae47e9aeae47
.quad 0x1808081018080810
.quad 0xd5baba6fd5baba6f
.quad 0x887878f0887878f0
.quad 0x6f25254a6f25254a
.quad 0x722e2e5c722e2e5c
.quad 0x241c1c38241c1c38
.quad 0xf1a6a657f1a6a657
.quad 0xc7b4b473c7b4b473
.quad 0x51c6c69751c6c697
.quad 0x23e8e8cb23e8e8cb
.quad 0x7cdddda17cdddda1
.quad 0x9c7474e89c7474e8
.quad 0x211f1f3e211f1f3e
.quad 0xdd4b4b96dd4b4b96
.quad 0xdcbdbd61dcbdbd61
.quad 0x868b8b0d868b8b0d
.quad 0x858a8a0f858a8a0f
.quad 0x907070e0907070e0
.quad 0x423e3e7c423e3e7c
.quad 0xc4b5b571c4b5b571
.quad 0xaa6666ccaa6666cc
.quad 0xd8484890d8484890
.quad 0x0503030605030306
.quad 0x01f6f6f701f6f6f7
.quad 0x120e0e1c120e0e1c
.quad 0xa36161c2a36161c2
.quad 0x5f35356a5f35356a
.quad 0xf95757aef95757ae
.quad 0xd0b9b969d0b9b969
.quad 0x9186861791868617
.quad 0x58c1c19958c1c199
.quad 0x271d1d3a271d1d3a
.quad 0xb99e9e27b99e9e27
.quad 0x38e1e1d938e1e1d9
.quad 0x13f8f8eb13f8f8eb
.quad 0xb398982bb398982b
.quad 0x3311112233111122
.quad 0xbb6969d2bb6969d2
.quad 0x70d9d9a970d9d9a9
.quad 0x898e8e07898e8e07
.quad 0xa7949433a7949433
.quad 0xb69b9b2db69b9b2d
.quad 0x221e1e3c221e1e3c
.quad 0x9287871592878715
.quad 0x20e9e9c920e9e9c9
.quad 0x49cece8749cece87
.quad 0xff5555aaff5555aa
.quad 0x7828285078282850
.quad 0x7adfdfa57adfdfa5
.quad 0x8f8c8c038f8c8c03
.quad 0xf8a1a159f8a1a159
.quad 0x8089890980898909
.quad 0x170d0d1a170d0d1a
.quad 0xdabfbf65dabfbf65
.quad 0x31e6e6d731e6e6d7
.quad 0xc6424284c6424284
.quad 0xb86868d0b86868d0
.quad 0xc3414182c3414182
.quad 0xb0999929b0999929
.quad 0x772d2d5a772d2d5a
.quad 0x110f0f1e110f0f1e
.quad 0xcbb0b07bcbb0b07b
.quad 0xfc5454a8fc5454a8
.quad 0xd6bbbb6dd6bbbb6d
.quad 0x3a16162c3a16162c
.quad 0x0000006300000063
.quad 0x0000007c0000007c
.quad 0x0000007700000077
.quad 0x0000007b0000007b
.quad 0x000000f2000000f2
.quad 0x0000006b0000006b
.quad 0x0000006f0000006f
.quad 0x000000c5000000c5
.quad 0x0000003000000030
.quad 0x0000000100000001
.quad 0x0000006700000067
.quad 0x0000002b0000002b
.quad 0x000000fe000000fe
.quad 0x000000d7000000d7
.quad 0x000000ab000000ab
.quad 0x0000007600000076
.quad 0x000000ca000000ca
.quad 0x0000008200000082
.quad 0x000000c9000000c9
.quad 0x0000007d0000007d
.quad 0x000000fa000000fa
.quad 0x0000005900000059
.quad 0x0000004700000047
.quad 0x000000f0000000f0
.quad 0x000000ad000000ad
.quad 0x000000d4000000d4
.quad 0x000000a2000000a2
.quad 0x000000af000000af
.quad 0x0000009c0000009c
.quad 0x000000a4000000a4
.quad 0x0000007200000072
.quad 0x000000c0000000c0
.quad 0x000000b7000000b7
.quad 0x000000fd000000fd
.quad 0x0000009300000093
.quad 0x0000002600000026
.quad 0x0000003600000036
.quad 0x0000003f0000003f
.quad 0x000000f7000000f7
.quad 0x000000cc000000cc
.quad 0x0000003400000034
.quad 0x000000a5000000a5
.quad 0x000000e5000000e5
.quad 0x000000f1000000f1
.quad 0x0000007100000071
.quad 0x000000d8000000d8
.quad 0x0000003100000031
.quad 0x0000001500000015
.quad 0x0000000400000004
.quad 0x000000c7000000c7
.quad 0x0000002300000023
.quad 0x000000c3000000c3
.quad 0x0000001800000018
.quad 0x0000009600000096
.quad 0x0000000500000005
.quad 0x0000009a0000009a
.quad 0x0000000700000007
.quad 0x0000001200000012
.quad 0x0000008000000080
.quad 0x000000e2000000e2
.quad 0x000000eb000000eb
.quad 0x0000002700000027
.quad 0x000000b2000000b2
.quad 0x0000007500000075
.quad 0x0000000900000009
.quad 0x0000008300000083
.quad 0x0000002c0000002c
.quad 0x0000001a0000001a
.quad 0x0000001b0000001b
.quad 0x0000006e0000006e
.quad 0x0000005a0000005a
.quad 0x000000a0000000a0
.quad 0x0000005200000052
.quad 0x0000003b0000003b
.quad 0x000000d6000000d6
.quad 0x000000b3000000b3
.quad 0x0000002900000029
.quad 0x000000e3000000e3
.quad 0x0000002f0000002f
.quad 0x0000008400000084
.quad 0x0000005300000053
.quad 0x000000d1000000d1
.quad 0x0000000000000000
.quad 0x000000ed000000ed
.quad 0x0000002000000020
.quad 0x000000fc000000fc
.quad 0x000000b1000000b1
.quad 0x0000005b0000005b
.quad 0x0000006a0000006a
.quad 0x000000cb000000cb
.quad 0x000000be000000be
.quad 0x0000003900000039
.quad 0x0000004a0000004a
.quad 0x0000004c0000004c
.quad 0x0000005800000058
.quad 0x000000cf000000cf
.quad 0x000000d0000000d0
.quad 0x000000ef000000ef
.quad 0x000000aa000000aa
.quad 0x000000fb000000fb
.quad 0x0000004300000043
.quad 0x0000004d0000004d
.quad 0x0000003300000033
.quad 0x0000008500000085
.quad 0x0000004500000045
.quad 0x000000f9000000f9
.quad 0x0000000200000002
.quad 0x0000007f0000007f
.quad 0x0000005000000050
.quad 0x0000003c0000003c
.quad 0x0000009f0000009f
.quad 0x000000a8000000a8
.quad 0x0000005100000051
.quad 0x000000a3000000a3
.quad 0x0000004000000040
.quad 0x0000008f0000008f
.quad 0x0000009200000092
.quad 0x0000009d0000009d
.quad 0x0000003800000038
.quad 0x000000f5000000f5
.quad 0x000000bc000000bc
.quad 0x000000b6000000b6
.quad 0x000000da000000da
.quad 0x0000002100000021
.quad 0x0000001000000010
.quad 0x000000ff000000ff
.quad 0x000000f3000000f3
.quad 0x000000d2000000d2
.quad 0x000000cd000000cd
.quad 0x0000000c0000000c
.quad 0x0000001300000013
.quad 0x000000ec000000ec
.quad 0x0000005f0000005f
.quad 0x0000009700000097
.quad 0x0000004400000044
.quad 0x0000001700000017
.quad 0x000000c4000000c4
.quad 0x000000a7000000a7
.quad 0x0000007e0000007e
.quad 0x0000003d0000003d
.quad 0x0000006400000064
.quad 0x0000005d0000005d
.quad 0x0000001900000019
.quad 0x0000007300000073
.quad 0x0000006000000060
.quad 0x0000008100000081
.quad 0x0000004f0000004f
.quad 0x000000dc000000dc
.quad 0x0000002200000022
.quad 0x0000002a0000002a
.quad 0x0000009000000090
.quad 0x0000008800000088
.quad 0x0000004600000046
.quad 0x000000ee000000ee
.quad 0x000000b8000000b8
.quad 0x0000001400000014
.quad 0x000000de000000de
.quad 0x0000005e0000005e
.quad 0x0000000b0000000b
.quad 0x000000db000000db
.quad 0x000000e0000000e0
.quad 0x0000003200000032
.quad 0x0000003a0000003a
.quad 0x0000000a0000000a
.quad 0x0000004900000049
.quad 0x0000000600000006
.quad 0x0000002400000024
.quad 0x0000005c0000005c
.quad 0x000000c2000000c2
.quad 0x000000d3000000d3
.quad 0x000000ac000000ac
.quad 0x0000006200000062
.quad 0x0000009100000091
.quad 0x0000009500000095
.quad 0x000000e4000000e4
.quad 0x0000007900000079
.quad 0x000000e7000000e7
.quad 0x000000c8000000c8
.quad 0x0000003700000037
.quad 0x0000006d0000006d
.quad 0x0000008d0000008d
.quad 0x000000d5000000d5
.quad 0x0000004e0000004e
.quad 0x000000a9000000a9
.quad 0x0000006c0000006c
.quad 0x0000005600000056
.quad 0x000000f4000000f4
.quad 0x000000ea000000ea
.quad 0x0000006500000065
.quad 0x0000007a0000007a
.quad 0x000000ae000000ae
.quad 0x0000000800000008
.quad 0x000000ba000000ba
.quad 0x0000007800000078
.quad 0x0000002500000025
.quad 0x0000002e0000002e
.quad 0x0000001c0000001c
.quad 0x000000a6000000a6
.quad 0x000000b4000000b4
.quad 0x000000c6000000c6
.quad 0x000000e8000000e8
.quad 0x000000dd000000dd
.quad 0x0000007400000074
.quad 0x0000001f0000001f
.quad 0x0000004b0000004b
.quad 0x000000bd000000bd
.quad 0x0000008b0000008b
.quad 0x0000008a0000008a
.quad 0x0000007000000070
.quad 0x0000003e0000003e
.quad 0x000000b5000000b5
.quad 0x0000006600000066
.quad 0x0000004800000048
.quad 0x0000000300000003
.quad 0x000000f6000000f6
.quad 0x0000000e0000000e
.quad 0x0000006100000061
.quad 0x0000003500000035
.quad 0x0000005700000057
.quad 0x000000b9000000b9
.quad 0x0000008600000086
.quad 0x000000c1000000c1
.quad 0x0000001d0000001d
.quad 0x0000009e0000009e
.quad 0x000000e1000000e1
.quad 0x000000f8000000f8
.quad 0x0000009800000098
.quad 0x0000001100000011
.quad 0x0000006900000069
.quad 0x000000d9000000d9
.quad 0x0000008e0000008e
.quad 0x0000009400000094
.quad 0x0000009b0000009b
.quad 0x0000001e0000001e
.quad 0x0000008700000087
.quad 0x000000e9000000e9
.quad 0x000000ce000000ce
.quad 0x0000005500000055
.quad 0x0000002800000028
.quad 0x000000df000000df
.quad 0x0000008c0000008c
.quad 0x000000a1000000a1
.quad 0x0000008900000089
.quad 0x0000000d0000000d
.quad 0x000000bf000000bf
.quad 0x000000e6000000e6
.quad 0x0000004200000042
.quad 0x0000006800000068
.quad 0x0000004100000041
.quad 0x0000009900000099
.quad 0x0000002d0000002d
.quad 0x0000000f0000000f
.quad 0x000000b0000000b0
.quad 0x0000005400000054
.quad 0x000000bb000000bb
.quad 0x0000001600000016
aes_itab:
.quad 0x50a7f45150a7f451
.quad 0x5365417e5365417e
.quad 0xc3a4171ac3a4171a
.quad 0x965e273a965e273a
.quad 0xcb6bab3bcb6bab3b
.quad 0xf1459d1ff1459d1f
.quad 0xab58faacab58faac
.quad 0x9303e34b9303e34b
.quad 0x55fa302055fa3020
.quad 0xf66d76adf66d76ad
.quad 0x9176cc889176cc88
.quad 0x254c02f5254c02f5
.quad 0xfcd7e54ffcd7e54f
.quad 0xd7cb2ac5d7cb2ac5
.quad 0x8044352680443526
.quad 0x8fa362b58fa362b5
.quad 0x495ab1de495ab1de
.quad 0x671bba25671bba25
.quad 0x980eea45980eea45
.quad 0xe1c0fe5de1c0fe5d
.quad 0x02752fc302752fc3
.quad 0x12f04c8112f04c81
.quad 0xa397468da397468d
.quad 0xc6f9d36bc6f9d36b
.quad 0xe75f8f03e75f8f03
.quad 0x959c9215959c9215
.quad 0xeb7a6dbfeb7a6dbf
.quad 0xda595295da595295
.quad 0x2d83bed42d83bed4
.quad 0xd3217458d3217458
.quad 0x2969e0492969e049
.quad 0x44c8c98e44c8c98e
.quad 0x6a89c2756a89c275
.quad 0x78798ef478798ef4
.quad 0x6b3e58996b3e5899
.quad 0xdd71b927dd71b927
.quad 0xb64fe1beb64fe1be
.quad 0x17ad88f017ad88f0
.quad 0x66ac20c966ac20c9
.quad 0xb43ace7db43ace7d
.quad 0x184adf63184adf63
.quad 0x82311ae582311ae5
.quad 0x6033519760335197
.quad 0x457f5362457f5362
.quad 0xe07764b1e07764b1
.quad 0x84ae6bbb84ae6bbb
.quad 0x1ca081fe1ca081fe
.quad 0x942b08f9942b08f9
.quad 0x5868487058684870
.quad 0x19fd458f19fd458f
.quad 0x876cde94876cde94
.quad 0xb7f87b52b7f87b52
.quad 0x23d373ab23d373ab
.quad 0xe2024b72e2024b72
.quad 0x578f1fe3578f1fe3
.quad 0x2aab55662aab5566
.quad 0x0728ebb20728ebb2
.quad 0x03c2b52f03c2b52f
.quad 0x9a7bc5869a7bc586
.quad 0xa50837d3a50837d3
.quad 0xf2872830f2872830
.quad 0xb2a5bf23b2a5bf23
.quad 0xba6a0302ba6a0302
.quad 0x5c8216ed5c8216ed
.quad 0x2b1ccf8a2b1ccf8a
.quad 0x92b479a792b479a7
.quad 0xf0f207f3f0f207f3
.quad 0xa1e2694ea1e2694e
.quad 0xcdf4da65cdf4da65
.quad 0xd5be0506d5be0506
.quad 0x1f6234d11f6234d1
.quad 0x8afea6c48afea6c4
.quad 0x9d532e349d532e34
.quad 0xa055f3a2a055f3a2
.quad 0x32e18a0532e18a05
.quad 0x75ebf6a475ebf6a4
.quad 0x39ec830b39ec830b
.quad 0xaaef6040aaef6040
.quad 0x069f715e069f715e
.quad 0x51106ebd51106ebd
.quad 0xf98a213ef98a213e
.quad 0x3d06dd963d06dd96
.quad 0xae053eddae053edd
.quad 0x46bde64d46bde64d
.quad 0xb58d5491b58d5491
.quad 0x055dc471055dc471
.quad 0x6fd406046fd40604
.quad 0xff155060ff155060
.quad 0x24fb981924fb9819
.quad 0x97e9bdd697e9bdd6
.quad 0xcc434089cc434089
.quad 0x779ed967779ed967
.quad 0xbd42e8b0bd42e8b0
.quad 0x888b8907888b8907
.quad 0x385b19e7385b19e7
.quad 0xdbeec879dbeec879
.quad 0x470a7ca1470a7ca1
.quad 0xe90f427ce90f427c
.quad 0xc91e84f8c91e84f8
.quad 0x0000000000000000
.quad 0x8386800983868009
.quad 0x48ed2b3248ed2b32
.quad 0xac70111eac70111e
.quad 0x4e725a6c4e725a6c
.quad 0xfbff0efdfbff0efd
.quad 0x5638850f5638850f
.quad 0x1ed5ae3d1ed5ae3d
.quad 0x27392d3627392d36
.quad 0x64d90f0a64d90f0a
.quad 0x21a65c6821a65c68
.quad 0xd1545b9bd1545b9b
.quad 0x3a2e36243a2e3624
.quad 0xb1670a0cb1670a0c
.quad 0x0fe757930fe75793
.quad 0xd296eeb4d296eeb4
.quad 0x9e919b1b9e919b1b
.quad 0x4fc5c0804fc5c080
.quad 0xa220dc61a220dc61
.quad 0x694b775a694b775a
.quad 0x161a121c161a121c
.quad 0x0aba93e20aba93e2
.quad 0xe52aa0c0e52aa0c0
.quad 0x43e0223c43e0223c
.quad 0x1d171b121d171b12
.quad 0x0b0d090e0b0d090e
.quad 0xadc78bf2adc78bf2
.quad 0xb9a8b62db9a8b62d
.quad 0xc8a91e14c8a91e14
.quad 0x8519f1578519f157
.quad 0x4c0775af4c0775af
.quad 0xbbdd99eebbdd99ee
.quad 0xfd607fa3fd607fa3
.quad 0x9f2601f79f2601f7
.quad 0xbcf5725cbcf5725c
.quad 0xc53b6644c53b6644
.quad 0x347efb5b347efb5b
.quad 0x7629438b7629438b
.quad 0xdcc623cbdcc623cb
.quad 0x68fcedb668fcedb6
.quad 0x63f1e4b863f1e4b8
.quad 0xcadc31d7cadc31d7
.quad 0x1085634210856342
.quad 0x4022971340229713
.quad 0x2011c6842011c684
.quad 0x7d244a857d244a85
.quad 0xf83dbbd2f83dbbd2
.quad 0x1132f9ae1132f9ae
.quad 0x6da129c76da129c7
.quad 0x4b2f9e1d4b2f9e1d
.quad 0xf330b2dcf330b2dc
.quad 0xec52860dec52860d
.quad 0xd0e3c177d0e3c177
.quad 0x6c16b32b6c16b32b
.quad 0x99b970a999b970a9
.quad 0xfa489411fa489411
.quad 0x2264e9472264e947
.quad 0xc48cfca8c48cfca8
.quad 0x1a3ff0a01a3ff0a0
.quad 0xd82c7d56d82c7d56
.quad 0xef903322ef903322
.quad 0xc74e4987c74e4987
.quad 0xc1d138d9c1d138d9
.quad 0xfea2ca8cfea2ca8c
.quad 0x360bd498360bd498
.quad 0xcf81f5a6cf81f5a6
.quad 0x28de7aa528de7aa5
.quad 0x268eb7da268eb7da
.quad 0xa4bfad3fa4bfad3f
.quad 0xe49d3a2ce49d3a2c
.quad 0x0d9278500d927850
.quad 0x9bcc5f6a9bcc5f6a
.quad 0x62467e5462467e54
.quad 0xc2138df6c2138df6
.quad 0xe8b8d890e8b8d890
.quad 0x5ef7392e5ef7392e
.quad 0xf5afc382f5afc382
.quad 0xbe805d9fbe805d9f
.quad 0x7c93d0697c93d069
.quad 0xa92dd56fa92dd56f
.quad 0xb31225cfb31225cf
.quad 0x3b99acc83b99acc8
.quad 0xa77d1810a77d1810
.quad 0x6e639ce86e639ce8
.quad 0x7bbb3bdb7bbb3bdb
.quad 0x097826cd097826cd
.quad 0xf418596ef418596e
.quad 0x01b79aec01b79aec
.quad 0xa89a4f83a89a4f83
.quad 0x656e95e6656e95e6
.quad 0x7ee6ffaa7ee6ffaa
.quad 0x08cfbc2108cfbc21
.quad 0xe6e815efe6e815ef
.quad 0xd99be7bad99be7ba
.quad 0xce366f4ace366f4a
.quad 0xd4099fead4099fea
.quad 0xd67cb029d67cb029
.quad 0xafb2a431afb2a431
.quad 0x31233f2a31233f2a
.quad 0x3094a5c63094a5c6
.quad 0xc066a235c066a235
.quad 0x37bc4e7437bc4e74
.quad 0xa6ca82fca6ca82fc
.quad 0xb0d090e0b0d090e0
.quad 0x15d8a73315d8a733
.quad 0x4a9804f14a9804f1
.quad 0xf7daec41f7daec41
.quad 0x0e50cd7f0e50cd7f
.quad 0x2ff691172ff69117
.quad 0x8dd64d768dd64d76
.quad 0x4db0ef434db0ef43
.quad 0x544daacc544daacc
.quad 0xdf0496e4df0496e4
.quad 0xe3b5d19ee3b5d19e
.quad 0x1b886a4c1b886a4c
.quad 0xb81f2cc1b81f2cc1
.quad 0x7f5165467f516546
.quad 0x04ea5e9d04ea5e9d
.quad 0x5d358c015d358c01
.quad 0x737487fa737487fa
.quad 0x2e410bfb2e410bfb
.quad 0x5a1d67b35a1d67b3
.quad 0x52d2db9252d2db92
.quad 0x335610e9335610e9
.quad 0x1347d66d1347d66d
.quad 0x8c61d79a8c61d79a
.quad 0x7a0ca1377a0ca137
.quad 0x8e14f8598e14f859
.quad 0x893c13eb893c13eb
.quad 0xee27a9ceee27a9ce
.quad 0x35c961b735c961b7
.quad 0xede51ce1ede51ce1
.quad 0x3cb1477a3cb1477a
.quad 0x59dfd29c59dfd29c
.quad 0x3f73f2553f73f255
.quad 0x79ce141879ce1418
.quad 0xbf37c773bf37c773
.quad 0xeacdf753eacdf753
.quad 0x5baafd5f5baafd5f
.quad 0x146f3ddf146f3ddf
.quad 0x86db447886db4478
.quad 0x81f3afca81f3afca
.quad 0x3ec468b93ec468b9
.quad 0x2c3424382c342438
.quad 0x5f40a3c25f40a3c2
.quad 0x72c31d1672c31d16
.quad 0x0c25e2bc0c25e2bc
.quad 0x8b493c288b493c28
.quad 0x41950dff41950dff
.quad 0x7101a8397101a839
.quad 0xdeb30c08deb30c08
.quad 0x9ce4b4d89ce4b4d8
.quad 0x90c1566490c15664
.quad 0x6184cb7b6184cb7b
.quad 0x70b632d570b632d5
.quad 0x745c6c48745c6c48
.quad 0x4257b8d04257b8d0
.quad 0x0000005200000052
.quad 0x0000000900000009
.quad 0x0000006a0000006a
.quad 0x000000d5000000d5
.quad 0x0000003000000030
.quad 0x0000003600000036
.quad 0x000000a5000000a5
.quad 0x0000003800000038
.quad 0x000000bf000000bf
.quad 0x0000004000000040
.quad 0x000000a3000000a3
.quad 0x0000009e0000009e
.quad 0x0000008100000081
.quad 0x000000f3000000f3
.quad 0x000000d7000000d7
.quad 0x000000fb000000fb
.quad 0x0000007c0000007c
.quad 0x000000e3000000e3
.quad 0x0000003900000039
.quad 0x0000008200000082
.quad 0x0000009b0000009b
.quad 0x0000002f0000002f
.quad 0x000000ff000000ff
.quad 0x0000008700000087
.quad 0x0000003400000034
.quad 0x0000008e0000008e
.quad 0x0000004300000043
.quad 0x0000004400000044
.quad 0x000000c4000000c4
.quad 0x000000de000000de
.quad 0x000000e9000000e9
.quad 0x000000cb000000cb
.quad 0x0000005400000054
.quad 0x0000007b0000007b
.quad 0x0000009400000094
.quad 0x0000003200000032
.quad 0x000000a6000000a6
.quad 0x000000c2000000c2
.quad 0x0000002300000023
.quad 0x0000003d0000003d
.quad 0x000000ee000000ee
.quad 0x0000004c0000004c
.quad 0x0000009500000095
.quad 0x0000000b0000000b
.quad 0x0000004200000042
.quad 0x000000fa000000fa
.quad 0x000000c3000000c3
.quad 0x0000004e0000004e
.quad 0x0000000800000008
.quad 0x0000002e0000002e
.quad 0x000000a1000000a1
.quad 0x0000006600000066
.quad 0x0000002800000028
.quad 0x000000d9000000d9
.quad 0x0000002400000024
.quad 0x000000b2000000b2
.quad 0x0000007600000076
.quad 0x0000005b0000005b
.quad 0x000000a2000000a2
.quad 0x0000004900000049
.quad 0x0000006d0000006d
.quad 0x0000008b0000008b
.quad 0x000000d1000000d1
.quad 0x0000002500000025
.quad 0x0000007200000072
.quad 0x000000f8000000f8
.quad 0x000000f6000000f6
.quad 0x0000006400000064
.quad 0x0000008600000086
.quad 0x0000006800000068
.quad 0x0000009800000098
.quad 0x0000001600000016
.quad 0x000000d4000000d4
.quad 0x000000a4000000a4
.quad 0x0000005c0000005c
.quad 0x000000cc000000cc
.quad 0x0000005d0000005d
.quad 0x0000006500000065
.quad 0x000000b6000000b6
.quad 0x0000009200000092
.quad 0x0000006c0000006c
.quad 0x0000007000000070
.quad 0x0000004800000048
.quad 0x0000005000000050
.quad 0x000000fd000000fd
.quad 0x000000ed000000ed
.quad 0x000000b9000000b9
.quad 0x000000da000000da
.quad 0x0000005e0000005e
.quad 0x0000001500000015
.quad 0x0000004600000046
.quad 0x0000005700000057
.quad 0x000000a7000000a7
.quad 0x0000008d0000008d
.quad 0x0000009d0000009d
.quad 0x0000008400000084
.quad 0x0000009000000090
.quad 0x000000d8000000d8
.quad 0x000000ab000000ab
.quad 0x0000000000000000
.quad 0x0000008c0000008c
.quad 0x000000bc000000bc
.quad 0x000000d3000000d3
.quad 0x0000000a0000000a
.quad 0x000000f7000000f7
.quad 0x000000e4000000e4
.quad 0x0000005800000058
.quad 0x0000000500000005
.quad 0x000000b8000000b8
.quad 0x000000b3000000b3
.quad 0x0000004500000045
.quad 0x0000000600000006
.quad 0x000000d0000000d0
.quad 0x0000002c0000002c
.quad 0x0000001e0000001e
.quad 0x0000008f0000008f
.quad 0x000000ca000000ca
.quad 0x0000003f0000003f
.quad 0x0000000f0000000f
.quad 0x0000000200000002
.quad 0x000000c1000000c1
.quad 0x000000af000000af
.quad 0x000000bd000000bd
.quad 0x0000000300000003
.quad 0x0000000100000001
.quad 0x0000001300000013
.quad 0x0000008a0000008a
.quad 0x0000006b0000006b
.quad 0x0000003a0000003a
.quad 0x0000009100000091
.quad 0x0000001100000011
.quad 0x0000004100000041
.quad 0x0000004f0000004f
.quad 0x0000006700000067
.quad 0x000000dc000000dc
.quad 0x000000ea000000ea
.quad 0x0000009700000097
.quad 0x000000f2000000f2
.quad 0x000000cf000000cf
.quad 0x000000ce000000ce
.quad 0x000000f0000000f0
.quad 0x000000b4000000b4
.quad 0x000000e6000000e6
.quad 0x0000007300000073
.quad 0x0000009600000096
.quad 0x000000ac000000ac
.quad 0x0000007400000074
.quad 0x0000002200000022
.quad 0x000000e7000000e7
.quad 0x000000ad000000ad
.quad 0x0000003500000035
.quad 0x0000008500000085
.quad 0x000000e2000000e2
.quad 0x000000f9000000f9
.quad 0x0000003700000037
.quad 0x000000e8000000e8
.quad 0x0000001c0000001c
.quad 0x0000007500000075
.quad 0x000000df000000df
.quad 0x0000006e0000006e
.quad 0x0000004700000047
.quad 0x000000f1000000f1
.quad 0x0000001a0000001a
.quad 0x0000007100000071
.quad 0x0000001d0000001d
.quad 0x0000002900000029
.quad 0x000000c5000000c5
.quad 0x0000008900000089
.quad 0x0000006f0000006f
.quad 0x000000b7000000b7
.quad 0x0000006200000062
.quad 0x0000000e0000000e
.quad 0x000000aa000000aa
.quad 0x0000001800000018
.quad 0x000000be000000be
.quad 0x0000001b0000001b
.quad 0x000000fc000000fc
.quad 0x0000005600000056
.quad 0x0000003e0000003e
.quad 0x0000004b0000004b
.quad 0x000000c6000000c6
.quad 0x000000d2000000d2
.quad 0x0000007900000079
.quad 0x0000002000000020
.quad 0x0000009a0000009a
.quad 0x000000db000000db
.quad 0x000000c0000000c0
.quad 0x000000fe000000fe
.quad 0x0000007800000078
.quad 0x000000cd000000cd
.quad 0x0000005a0000005a
.quad 0x000000f4000000f4
.quad 0x0000001f0000001f
.quad 0x000000dd000000dd
.quad 0x000000a8000000a8
.quad 0x0000003300000033
.quad 0x0000008800000088
.quad 0x0000000700000007
.quad 0x000000c7000000c7
.quad 0x0000003100000031
.quad 0x000000b1000000b1
.quad 0x0000001200000012
.quad 0x0000001000000010
.quad 0x0000005900000059
.quad 0x0000002700000027
.quad 0x0000008000000080
.quad 0x000000ec000000ec
.quad 0x0000005f0000005f
.quad 0x0000006000000060
.quad 0x0000005100000051
.quad 0x0000007f0000007f
.quad 0x000000a9000000a9
.quad 0x0000001900000019
.quad 0x000000b5000000b5
.quad 0x0000004a0000004a
.quad 0x0000000d0000000d
.quad 0x0000002d0000002d
.quad 0x000000e5000000e5
.quad 0x0000007a0000007a
.quad 0x0000009f0000009f
.quad 0x0000009300000093
.quad 0x000000c9000000c9
.quad 0x0000009c0000009c
.quad 0x000000ef000000ef
.quad 0x000000a0000000a0
.quad 0x000000e0000000e0
.quad 0x0000003b0000003b
.quad 0x0000004d0000004d
.quad 0x000000ae000000ae
.quad 0x0000002a0000002a
.quad 0x000000f5000000f5
.quad 0x000000b0000000b0
.quad 0x000000c8000000c8
.quad 0x000000eb000000eb
.quad 0x000000bb000000bb
.quad 0x0000003c0000003c
.quad 0x0000008300000083
.quad 0x0000005300000053
.quad 0x0000009900000099
.quad 0x0000006100000061
.quad 0x0000001700000017
.quad 0x0000002b0000002b
.quad 0x0000000400000004
.quad 0x0000007e0000007e
.quad 0x000000ba000000ba
.quad 0x0000007700000077
.quad 0x000000d6000000d6
.quad 0x0000002600000026
.quad 0x000000e1000000e1
.quad 0x0000006900000069
.quad 0x0000001400000014
.quad 0x0000006300000063
.quad 0x0000005500000055
.quad 0x0000002100000021
.quad 0x0000000c0000000c
.quad 0x0000007d0000007d
.size aes_tables, .-aes_tables
//-------------------
#define T %r15
#define TR(x,y) x(T, y, 8)
#define TL(x,y) x+2048(T, y, 8)
#define KP %r5
#define t0 %r10
#define t1 %r11
#define t2 %r12
#define t3 %r13
#define t4 %r14
#define t0d %r10d
#define t1d %r11d
#define t2d %r12d
#define t3d %r13d
#define t4d %r14d
#define K(round, key) -128+16*(round)+4*(key)(KP)
#define FROUND(in0, in1, in2, in3, out0, out1, out2, out3, R, X, Y) \
mov K(R,0), t0##d; \
mov K(R,Y), t1##d; \
mov K(R,2), t4##d; \
mov K(R,X), t3##d; \
xor t0##d, in0##d; xor t1##d, in3##d; \
\
mov K(R+1,0), out0##d; movzx in0##b, t0##d; \
mov K(R+1,Y), out3##d; shr
$8, in0##d; \
//mov 0(T, t0, 8), t0##d; movzx in0##b, t1##d; shr
$8, in0##d; \
#define RROUND(in0, in1, in2, in3, out0, out1, out2, out3, R, X, Y) \
mov TR(0, t0), t0##d; movzx in0##b, t1##d; shr
$8, in0##d; \
mov TR(3, t1), t1##d; movzx in0##b, t2##d; shr
$8, in0##d; \
mov TR(2, t2), out2##d; xor t4##d, in2##d; xor
t3##d, in1##d; \
mov TR(1,in0), out1##d; movzx in3##b, in0##d; rol
$8, in3##d; \
mov TR(0,in0), in0##d; movzx in3##b, t2##d; rol
$8, in3##d; \
mov TR(1, t2), t2##d; movzx in3##b, t3##d; shr
$24, in3##d; \
mov TR(2, t3), t3##d; xor t0##d, out0##d; xor
t1##d, out3##d; \
mov TR(3,in3), in3##d; movzx in2##b, t0##d; rol
$8, in2##d; \
mov TR(0, t0), t0##d; movzx in2##b, t1##d; rol
$8, in2##d; \
mov TR(1, t1), t1##d; movzx in2##b, t4##d; shr
$24, in2##d; \
mov TR(2, t4), t4##d; xor t2##d, out0##d; xor
in0##d, out3##d; \
mov TR(3,in2), in2##d; movzx in1##b, in0##d; shr
$8, in1##d; \
mov TR(0,in0), in0##d; movzx in1##b, t2##d; shr
$8, in1##d; \
mov TR(3, t2), t2##d; xor t1##d, out3##d; movzx
in1##b, t1##d; \
mov TR(2, t1), t1##d; xor t4##d, out0##d; shr
$8, in1##d; \
mov TR(1,in1), in1##d; xor in3##d, out2##d; xor
t3##d, out1##d; \
mov K(R,2), t4##d; xor t0##d, out2##d; xor
in2##d, out1##d; \
mov K(R,X), t3##d; xor t2##d, out0##d; xor
in0##d, out1##d; \
mov K(R+1,0), in0##d; movzx out0##b, t0##d; xor
t1##d, out3##d; \
mov K(R+1,Y), in3##d; xor in1##d, out2##d; shr
$8, out0##d; \
#define LROUND(in0, in1, in2, in3, out0, out1, out2, out3, R, X, Y) \
mov TL(0, t0), t0##d; movzx in0##b, t1##d; shr
$8, in0##d; \
mov TL(3, t1), t1##d; movzx in0##b, t2##d; shr
$8, in0##d; \
mov TL(2, t2), out2##d; xor t4##d, in2##d; xor
t3##d, in1##d; \
mov TL(1,in0), out1##d; movzx in3##b, in0##d; rol
$8, in3##d; \
mov TL(0,in0), in0##d; movzx in3##b, t2##d; rol
$8, in3##d; \
mov TL(1, t2), t2##d; movzx in3##b, t3##d; shr
$24, in3##d; \
mov TL(2, t3), t3##d; xor t0##d, out0##d; xor
t1##d, out3##d; \
mov TL(3,in3), in3##d; movzx in2##b, t0##d; rol
$8, in2##d; \
mov TL(0, t0), t0##d; movzx in2##b, t1##d; rol
$8, in2##d; \
mov TL(1, t1), t1##d; movzx in2##b, t4##d; shr
$24, in2##d; \
mov TL(2, t4), t4##d; xor t2##d, out0##d; xor
in0##d, out3##d; \
mov TL(3,in2), in2##d; movzx in1##b, in0##d; shr
$8, in1##d; \
mov TL(0,in0), in0##d; movzx in1##b, t2##d; shr
$8, in1##d; \
mov TL(3, t2), t2##d; xor t1##d, out3##d; movzx
in1##b, t1##d; \
mov TL(2, t1), t1##d; xor t4##d, out0##d; shr
$8, in1##d; \
mov TL(1,in1), in1##d; xor in3##d, out2##d; xor
t3##d, out1##d; \
mov K(R,2), t4##d; xor t0##d, out2##d; xor
in2##d, out1##d; \
mov K(R,X), t3##d; xor t2##d, out0##d; xor
in0##d, out1##d; \
mov (%rsp), KP; xor
t1##d, out3##d; \
xor in1##d, out2##d;
\
xor t4##d, out2##d; xor
t3##d, out1##d;
.text
.global aes_encrypt
.type aes_encrypt, @function
.align 64
// function parameters:
// r5 key pointer
// r4 output pointer
// r1 input pointer
aes_encrypt:
sub $7*8, %rsp
sub $-128, KP
mov $aes_ftab, T
mov %r4, 0*8(%rsp) // output pointer
mov %r3, 1*8(%rsp)
mov %r6, 2*8(%rsp)
mov %r12, 3*8(%rsp)
mov %r13, 4*8(%rsp)
mov %r14, 5*8(%rsp)
mov %r15, 6*8(%rsp)
mov 0*4(%r1), %r0d
mov 1*4(%r1), %r3d
mov 2*4(%r1), %r2d
mov 3*4(%r1), %r1d
FROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 0, 1, 3)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 1, 1, 3)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 2, 1, 3)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 3, 1, 3)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 4, 1, 3)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 5, 1, 3)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 6, 1, 3)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 7, 1, 3)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 8, 1, 3)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 9, 1, 3)
LROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 10, 1, 3)
// Store output, wipe and restore registers
mov %r0d, 0*4(KP); xor %r0, %r0
mov %r3d, 1*4(KP); xor %r4, %r4
mov %r2d, 2*4(KP); xor %r2, %r2
mov %r1d, 3*4(KP); xor %r1, %r1
mov 1*8(%rsp), %r3; xor %r8, %r8
mov 2*8(%rsp), %r6; xor %r9, %r9
mov 3*8(%rsp), %r12; xor %r10, %r10
mov 4*8(%rsp), %r13; xor %r11, %r11
mov 5*8(%rsp), %r14;
mov 6*8(%rsp), %r15;
addq $7*8, %rsp
ret
.size aes_encrypt, .-aes_encrypt
.global aes_decrypt
.type aes_decrypt, @function
.align 64
// function parameters:
// r5 key pointer
// r4 output pointer
// r1 input pointer
aes_decrypt:
sub $7*8, %rsp
sub $-128-240, KP // decryption key expansion is offset by 240 bytes
mov $aes_itab, T
mov %r4, 0*8(%rsp) // output pointer
mov %r3, 1*8(%rsp)
mov %r6, 2*8(%rsp)
mov %r12, 3*8(%rsp)
mov %r13, 4*8(%rsp)
mov %r14, 5*8(%rsp)
mov %r15, 6*8(%rsp)
mov 0*4(%r1), %r0d
mov 3*4(%r1), %r3d
mov 2*4(%r1), %r2d
mov 1*4(%r1), %r1d
FROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 0, 3, 1)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 1, 3, 1)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 2, 3, 1)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 3, 3, 1)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 4, 3, 1)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 5, 3, 1)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 6, 3, 1)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 7, 3, 1)
RROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 8, 3, 1)
RROUND(%r0, %r3, %r2, %r1, %r4, %r6, %r8, %r9, 9, 3, 1)
LROUND(%r4, %r6, %r8, %r9, %r0, %r3, %r2, %r1, 10, 3, 1)
// Store output, wipe and restore registers
mov %r0d, 0*4(KP); xor %r0, %r0
mov %r3d, 3*4(KP); xor %r4, %r4
mov %r2d, 2*4(KP); xor %r2, %r2
mov %r1d, 1*4(KP); xor %r1, %r1
mov 1*8(%rsp), %r3; xor %r8, %r8
mov 2*8(%rsp), %r6; xor %r9, %r9
mov 3*8(%rsp), %r12; xor %r10, %r10
mov 4*8(%rsp), %r13; xor %r11, %r11
mov 5*8(%rsp), %r14;
mov 6*8(%rsp), %r15;
addq $7*8, %rsp
ret
.size aes_decrypt, .-aes_decrypt