Skip to content

Optimize AesEngine_X86 - #414

Open
benaadams wants to merge 1 commit into
bcgit:masterfrom
benaadams:AesEngine_X86
Open

Optimize AesEngine_X86#414
benaadams wants to merge 1 commit into
bcgit:masterfrom
benaadams:AesEngine_X86

Conversation

@benaadams

Copy link
Copy Markdown

Produces very tight asm

; Method Encode256:ProcessRounds(byref):thisG_M000_IG01: ;; offset=0000Hsubrsp,40vzeroupperG_M000_IG02: ;; offset=0007Hmovrax, gword ptr [rcx+10H]movecx, dword ptr [rax+08H]cmpecx,14jbe G_M000_IG04vmovupdxmm0, xmmword ptr [rdx]vpxorxmm0,xmm0, xmmword ptr [rax+10H]vaesencxmm0,xmm0, xmmword ptr [rax+20H]vaesencxmm0,xmm0, xmmword ptr [rax+30H]vaesencxmm0,xmm0, xmmword ptr [rax+40H]vaesencxmm0,xmm0, xmmword ptr [rax+50H]vaesencxmm0,xmm0, xmmword ptr [rax+60H]vaesencxmm0,xmm0, xmmword ptr [rax+70H]vaesencxmm0,xmm0, xmmword ptr [rax+80H]vaesencxmm0,xmm0, xmmword ptr [rax+90H]vaesencxmm0,xmm0, xmmword ptr [rax+A0H]vaesencxmm0,xmm0, xmmword ptr [rax+B0H]vaesencxmm0,xmm0, xmmword ptr [rax+C0H]vaesencxmm0,xmm0, xmmword ptr [rax+D0H]vaesencxmm0,xmm0, xmmword ptr [rax+E0H] vaesenclast xmm0,xmm0, xmmword ptr [rax+F0H]vmovupd xmmword ptr [rdx],xmm0G_M000_IG03: ;; offset=0090Haddrsp,40retG_M000_IG04: ;; offset=0095Hcall CORINFO_HELP_RNGCHKFAILint3; Total bytes of code: 155

vs current

; Assembly listing for method AesEngine_X86:ProcessBlock(<unnamed>,int,<unnamed>,int):int:this; 2 inlinees with PGO data; 22 single block inlinees; 7 inlinees without PGO dataG_M000_IG01: ;; offset=0000H56pushrsi 4883EC20 subrsp,32 C5F877 vzeroupper 8B442450 moveax, dword ptr [rsp+50H]G_M000_IG02: ;; offset=000CH 448B5208 movr10d, dword ptr [rdx+08H] 458D5AF0 lear11d,[r10-10H] 453BD8 cmpr11d,r8d 0F8CB4050000 jl G_M000_IG13 458B5908 movr11d, dword ptr [r9+08H] 418D73F0 leaesi,[r11-10H] 3BF0 cmpesi,eax 0F8CE7050000 jl G_M000_IG14 458BD2 movr10d,r10d 418BF0 movesi,r8d 4883C610 addrsi,16 4C3BD6 cmpr10,rsi 0F8251060000 jb G_M000_IG16 458BC0 movr8d,r8d 4A8D540210 leardx, bword ptr [rdx+r8+10H] C5F91002 vmovupdxmm0, xmmword ptr [rdx] 8B5108 movedx, dword ptr [rcx+08H] 83FA05 cmpedx,5 0F87FE050000 ja G_M000_IG15 8BD2 movedx,edx 4C8D053F060000 lear8,[reloc @RWD00] 458B0490 movr8d, dword ptr [r8+4*rdx] 4C8D15A0FFFFFF lear10, G_M000_IG02 4D03C2 addr8,r10 41FFE0 jmpr8G_M000_IG03: ;; offset=0072H 488B09 movrcx, gword ptr [rcx] 8B5108 movedx, dword ptr [rcx+08H] 85D2 testedx,edx 0F8417060000 je G_M000_IG17 C5F9EF4110 vpxorxmm0,xmm0, xmmword ptr [rcx+10H] 83FA01 cmpedx,1 0F8608060000 jbe G_M000_IG17 C4E279DE4120 vaesdecxmm0,xmm0, xmmword ptr [rcx+20H] 83FA02 cmpedx,2 0F86F9050000 jbe G_M000_IG17 C4E279DE4130 vaesdecxmm0,xmm0, xmmword ptr [rcx+30H] 83FA03 cmpedx,3 0F86EA050000 jbe G_M000_IG17 C4E279DE4140 vaesdecxmm0,xmm0, xmmword ptr [rcx+40H] 83FA04 cmpedx,4 0F86DB050000 jbe G_M000_IG17 C4E279DE4150 vaesdecxmm0,xmm0, xmmword ptr [rcx+50H] 83FA05 cmpedx,5 0F86CC050000 jbe G_M000_IG17 C4E279DE4160 vaesdecxmm0,xmm0, xmmword ptr [rcx+60H] 83FA06 cmpedx,6 0F86BD050000 jbe G_M000_IG17 C4E279DE4170 vaesdecxmm0,xmm0, xmmword ptr [rcx+70H] 83FA07 cmpedx,7 0F86AE050000 jbe G_M000_IG17 C4E279DE8180000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+80H] 83FA08 cmpedx,8 0F869C050000 jbe G_M000_IG17 C4E279DE8190000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+90H] 83FA09 cmpedx,9 0F868A050000 jbe G_M000_IG17 C4E279DE81A0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+A0H] 83FA0A cmpedx,10 0F8678050000 jbe G_M000_IG17 C4E279DF81B0000000 vaesdeclastxmm0,xmm0, xmmword ptr [rcx+B0H] E97A040000 jmp G_M000_IG11G_M000_IG04: ;; offset=012CH 488B09 movrcx, gword ptr [rcx] 8B5108 movedx, dword ptr [rcx+08H] 85D2 testedx,edx 0F845C050000 je G_M000_IG17 C5F9EF4110 vpxorxmm0,xmm0, xmmword ptr [rcx+10H] 83FA01 cmpedx,1 0F864D050000 jbe G_M000_IG17 C4E279DE4120 vaesdecxmm0,xmm0, xmmword ptr [rcx+20H] 83FA02 cmpedx,2 0F863E050000 jbe G_M000_IG17 C4E279DE4130 vaesdecxmm0,xmm0, xmmword ptr [rcx+30H] 83FA03 cmpedx,3 0F862F050000 jbe G_M000_IG17 C4E279DE4140 vaesdecxmm0,xmm0, xmmword ptr [rcx+40H] 83FA04 cmpedx,4 0F8620050000 jbe G_M000_IG17 C4E279DE4150 vaesdecxmm0,xmm0, xmmword ptr [rcx+50H] 83FA05 cmpedx,5 0F8611050000 jbe G_M000_IG17 C4E279DE4160 vaesdecxmm0,xmm0, xmmword ptr [rcx+60H] 83FA06 cmpedx,6 0F8602050000 jbe G_M000_IG17 C4E279DE4170 vaesdecxmm0,xmm0, xmmword ptr [rcx+70H] 83FA07 cmpedx,7 0F86F3040000 jbe G_M000_IG17 C4E279DE8180000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+80H] 83FA08 cmpedx,8 0F86E1040000 jbe G_M000_IG17 C4E279DE8190000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+90H] 83FA09 cmpedx,9 0F86CF040000 jbe G_M000_IG17 C4E279DE81A0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+A0H] 83FA0A cmpedx,10 0F86BD040000 jbe G_M000_IG17 C4E279DE81B0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+B0H] 83FA0B cmpedx,11 0F86AB040000 jbe G_M000_IG17 C4E279DE81C0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+C0H] 83FA0C cmpedx,12 0F8699040000 jbe G_M000_IG17 C4E279DF81D0000000 vaesdeclastxmm0,xmm0, xmmword ptr [rcx+D0H] E99B030000 jmp G_M000_IG11G_M000_IG05: ;; offset=020AH 488B09 movrcx, gword ptr [rcx] 8B5108 movedx, dword ptr [rcx+08H] 85D2 testedx,edx 0F847D040000 je G_M000_IG17 C5F9EF4110 vpxorxmm0,xmm0, xmmword ptr [rcx+10H] 83FA01 cmpedx,1 0F866E040000 jbe G_M000_IG17 C4E279DE4120 vaesdecxmm0,xmm0, xmmword ptr [rcx+20H] 83FA02 cmpedx,2 0F865F040000 jbe G_M000_IG17 C4E279DE4130 vaesdecxmm0,xmm0, xmmword ptr [rcx+30H] 83FA03 cmpedx,3 0F8650040000 jbe G_M000_IG17 C4E279DE4140 vaesdecxmm0,xmm0, xmmword ptr [rcx+40H] 83FA04 cmpedx,4 0F8641040000 jbe G_M000_IG17 C4E279DE4150 vaesdecxmm0,xmm0, xmmword ptr [rcx+50H] 83FA05 cmpedx,5 0F8632040000 jbe G_M000_IG17 C4E279DE4160 vaesdecxmm0,xmm0, xmmword ptr [rcx+60H] 83FA06 cmpedx,6 0F8623040000 jbe G_M000_IG17 C4E279DE4170 vaesdecxmm0,xmm0, xmmword ptr [rcx+70H] 83FA07 cmpedx,7 0F8614040000 jbe G_M000_IG17 C4E279DE8180000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+80H] 83FA08 cmpedx,8 0F8602040000 jbe G_M000_IG17 C4E279DE8190000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+90H] 83FA09 cmpedx,9 0F86F0030000 jbe G_M000_IG17 C4E279DE81A0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+A0H] 83FA0A cmpedx,10 0F86DE030000 jbe G_M000_IG17 C4E279DE81B0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+B0H] 83FA0B cmpedx,11 0F86CC030000 jbe G_M000_IG17 C4E279DE81C0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+C0H] 83FA0C cmpedx,12 0F86BA030000 jbe G_M000_IG17 C4E279DE81D0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+D0H] 83FA0D cmpedx,13 0F86A8030000 jbe G_M000_IG17 C4E279DE81E0000000 vaesdecxmm0,xmm0, xmmword ptr [rcx+E0H] 83FA0E cmpedx,14G_M000_IG06: ;; offset=02F8H 0F8696030000 jbe G_M000_IG17 C4E279DF81F0000000 vaesdeclastxmm0,xmm0, xmmword ptr [rcx+F0H] E998020000 jmp G_M000_IG11G_M000_IG07: ;; offset=030CH 488B09 movrcx, gword ptr [rcx] 8B5108 movedx, dword ptr [rcx+08H] 85D2 testedx,edx 0F847A030000 je G_M000_IG17 C5F9EF4110 vpxorxmm0,xmm0, xmmword ptr [rcx+10H] 83FA01 cmpedx,1 0F866B030000 jbe G_M000_IG17 C4E279DC4120 vaesencxmm0,xmm0, xmmword ptr [rcx+20H] 83FA02 cmpedx,2 0F865C030000 jbe G_M000_IG17 C4E279DC4130 vaesencxmm0,xmm0, xmmword ptr [rcx+30H] 83FA03 cmpedx,3 0F864D030000 jbe G_M000_IG17 C4E279DC4140 vaesencxmm0,xmm0, xmmword ptr [rcx+40H] 83FA04 cmpedx,4 0F863E030000 jbe G_M000_IG17 C4E279DC4150 vaesencxmm0,xmm0, xmmword ptr [rcx+50H] 83FA05 cmpedx,5 0F862F030000 jbe G_M000_IG17 C4E279DC4160 vaesencxmm0,xmm0, xmmword ptr [rcx+60H] 83FA06 cmpedx,6 0F8620030000 jbe G_M000_IG17 C4E279DC4170 vaesencxmm0,xmm0, xmmword ptr [rcx+70H] 83FA07 cmpedx,7 0F8611030000 jbe G_M000_IG17 C4E279DC8180000000 vaesencxmm0,xmm0, xmmword ptr [rcx+80H] 83FA08 cmpedx,8 0F86FF020000 jbe G_M000_IG17 C4E279DC8190000000 vaesencxmm0,xmm0, xmmword ptr [rcx+90H] 83FA09 cmpedx,9 0F86ED020000 jbe G_M000_IG17 C4E279DC81A0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+A0H] 83FA0A cmpedx,10 0F86DB020000 jbe G_M000_IG17 C4E279DD81B0000000 vaesenclast xmm0,xmm0, xmmword ptr [rcx+B0H] E9DD010000 jmp G_M000_IG11G_M000_IG08: ;; offset=03C6H 488B09 movrcx, gword ptr [rcx] 8B5108 movedx, dword ptr [rcx+08H] 85D2 testedx,edx 0F84BF020000 je G_M000_IG17 C5F9EF4110 vpxorxmm0,xmm0, xmmword ptr [rcx+10H] 83FA01 cmpedx,1 0F86B0020000 jbe G_M000_IG17 C4E279DC4120 vaesencxmm0,xmm0, xmmword ptr [rcx+20H] 83FA02 cmpedx,2 0F86A1020000 jbe G_M000_IG17 C4E279DC4130 vaesencxmm0,xmm0, xmmword ptr [rcx+30H] 83FA03 cmpedx,3 0F8692020000 jbe G_M000_IG17 C4E279DC4140 vaesencxmm0,xmm0, xmmword ptr [rcx+40H] 83FA04 cmpedx,4 0F8683020000 jbe G_M000_IG17 C4E279DC4150 vaesencxmm0,xmm0, xmmword ptr [rcx+50H] 83FA05 cmpedx,5 0F8674020000 jbe G_M000_IG17 C4E279DC4160 vaesencxmm0,xmm0, xmmword ptr [rcx+60H] 83FA06 cmpedx,6 0F8665020000 jbe G_M000_IG17 C4E279DC4170 vaesencxmm0,xmm0, xmmword ptr [rcx+70H] 83FA07 cmpedx,7 0F8656020000 jbe G_M000_IG17 C4E279DC8180000000 vaesencxmm0,xmm0, xmmword ptr [rcx+80H] 83FA08 cmpedx,8 0F8644020000 jbe G_M000_IG17 C4E279DC8190000000 vaesencxmm0,xmm0, xmmword ptr [rcx+90H] 83FA09 cmpedx,9 0F8632020000 jbe G_M000_IG17 C4E279DC81A0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+A0H] 83FA0A cmpedx,10 0F8620020000 jbe G_M000_IG17 C4E279DC81B0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+B0H] 83FA0B cmpedx,11 0F860E020000 jbe G_M000_IG17 C4E279DC81C0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+C0H] 83FA0C cmpedx,12 0F86FC010000 jbe G_M000_IG17 C4E279DD81D0000000 vaesenclast xmm0,xmm0, xmmword ptr [rcx+D0H] E9FE000000 jmp G_M000_IG11G_M000_IG09: ;; offset=04A4H 488B09 movrcx, gword ptr [rcx] 8B5108 movedx, dword ptr [rcx+08H] 85D2 testedx,edx 0F84E0010000 je G_M000_IG17 C5F9EF4110 vpxorxmm0,xmm0, xmmword ptr [rcx+10H] 83FA01 cmpedx,1 0F86D1010000 jbe G_M000_IG17 C4E279DC4120 vaesencxmm0,xmm0, xmmword ptr [rcx+20H] 83FA02 cmpedx,2 0F86C2010000 jbe G_M000_IG17 C4E279DC4130 vaesencxmm0,xmm0, xmmword ptr [rcx+30H] 83FA03 cmpedx,3 0F86B3010000 jbe G_M000_IG17 C4E279DC4140 vaesencxmm0,xmm0, xmmword ptr [rcx+40H] 83FA04 cmpedx,4 0F86A4010000 jbe G_M000_IG17 C4E279DC4150 vaesencxmm0,xmm0, xmmword ptr [rcx+50H] 83FA05 cmpedx,5 0F8695010000 jbe G_M000_IG17 C4E279DC4160 vaesencxmm0,xmm0, xmmword ptr [rcx+60H] 83FA06 cmpedx,6 0F8686010000 jbe G_M000_IG17 C4E279DC4170 vaesencxmm0,xmm0, xmmword ptr [rcx+70H] 83FA07 cmpedx,7 0F8677010000 jbe G_M000_IG17 C4E279DC8180000000 vaesencxmm0,xmm0, xmmword ptr [rcx+80H] 83FA08 cmpedx,8 0F8665010000 jbe G_M000_IG17 C4E279DC8190000000 vaesencxmm0,xmm0, xmmword ptr [rcx+90H] 83FA09 cmpedx,9 0F8653010000 jbe G_M000_IG17 C4E279DC81A0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+A0H] 83FA0A cmpedx,10 0F8641010000 jbe G_M000_IG17 C4E279DC81B0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+B0H] 83FA0B cmpedx,11 0F862F010000 jbe G_M000_IG17 C4E279DC81C0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+C0H] 83FA0C cmpedx,12 0F861D010000 jbe G_M000_IG17 C4E279DC81D0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+D0H] 83FA0D cmpedx,13 0F860B010000 jbe G_M000_IG17 C4E279DC81E0000000 vaesencxmm0,xmm0, xmmword ptr [rcx+E0H] 83FA0E cmpedx,14G_M000_IG10: ;; offset=0592H 0F86F9000000 jbe G_M000_IG17 C4E279DD81F0000000 vaesenclast xmm0,xmm0, xmmword ptr [rcx+F0H]G_M000_IG11: ;; offset=05A1H 418BCB movecx,r11d 8BD0 movedx,eax 4883C210 addrdx,16 483BCA cmprcx,rdx 0F82D7000000 jb G_M000_IG16 8BC0 moveax,eax 498D440110 learax, bword ptr [r9+rax+10H] C5F91100 vmovupd xmmword ptr [rax],xmm0 B810000000 moveax,16G_M000_IG12: ;; offset=05C3H 4883C420 addrsp,32 5E poprsi C3 retG_M000_IG13: ;; offset=05C9H 48B9482063FEFE7F0000 movrcx,0x7FFEFE632048 E8F8CFAE5F call CORINFO_HELP_NEWSFAST 488BF0 movrsi,rax 488BCE movrcx,rsi FF15AC380900 call[System.Exception:.ctor():this] B901000000 movecx,1 48BAF0BC6DFEFE7F0000 movrdx,0x7FFEFE6DBCF0 E828FFA65F call CORINFO_HELP_STRCNS 488D4E10 learcx, bword ptr [rsi+10H] 488BD0 movrdx,rax E89CDCE2FF call CORINFO_HELP_ASSIGN_REF 488BCE movrcx,rsi E87466A45F call CORINFO_HELP_THROWG_M000_IG14: ;; offset=060CH 48B9482063FEFE7F0000 movrcx,0x7FFEFE632048 E8B5CFAE5F call CORINFO_HELP_NEWSFAST 488BF0 movrsi,rax 488BCE movrcx,rsi FF1569380900 call[System.Exception:.ctor():this] B92F000000 movecx,47 48BAF0BC6DFEFE7F0000 movrdx,0x7FFEFE6DBCF0 E8E5FEA65F call CORINFO_HELP_STRCNS 488D4E10 learcx, bword ptr [rsi+10H] 488BD0 movrdx,rax E859DCE2FF call CORINFO_HELP_ASSIGN_REF 488BCE movrcx,rsi E83166A45F call CORINFO_HELP_THROWG_M000_IG15: ;; offset=064FH 48B980BC6DFEFE7F0000 movrcx,0x7FFEFE6DBC80 E872CFAE5F call CORINFO_HELP_NEWSFAST 488BF0 movrsi,rax B9FE0F0000 movecx,0xFFE 48BAF0BC6DFEFE7F0000 movrdx,0x7FFEFE6DBCF0 E8ABFEA65F call CORINFO_HELP_STRCNS 488BD0 movrdx,rax 488BCE movrcx,rsi FF1597D11100 call[System.InvalidOperationException:.ctor(System.String):this] 488BCE movrcx,rsi E8F765A45F call CORINFO_HELP_THROWG_M000_IG16: ;; offset=0689H FF15490C1100 call[System.ThrowHelper:ThrowArgumentOutOfRangeException()] CC int3G_M000_IG17: ;; offset=0690H E82B67C15F call CORINFO_HELP_RNGCHKFAIL CC int3RWD00 dd	00000066h ; case G_M000_IG03dd00000120h ; case G_M000_IG04dd000001FEh ; case G_M000_IG05dd00000300h ; case G_M000_IG07dd000003BAh ; case G_M000_IG08dd00000498h ; case G_M000_IG09; Total bytes of code 1686

@peterdettman

Copy link
Copy Markdown
Collaborator

Thanks, I've incorporated a couple of the improvements from this PR (the bounds check elimination and non-ref locals).

The Unsafe load/store code definitely improves performance further, we might look at those later (currently being excessively cautious about Unsafe).

Using virtual dispatch doesn't show much difference for me, but it's certainly true that in some future API it would be better to just have different implementation classes for encrypt/decrypt per key size.

pullBot pushed a commit to Mu-L/bc-csharp that referenced this pull request Feb 12, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@benaadams@peterdettman