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

Reply via email to