Skip to content

Clean up Guid.DecodeByte #88267

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 30, 2023
Merged

Clean up Guid.DecodeByte #88267

merged 2 commits into from
Jun 30, 2023

Conversation

EgorBo
Copy link
Member

@EgorBo EgorBo commented Jun 30, 2023

Mainly just to remove TODO https://github.com/dotnet/runtime/issues/13464 but also making it more efficient along the way.

Closes #13464

This function is only used in Guid.TryParse* so the new codegen for e.g. TryParseExactN is:

new codegen
; Method RefImplNew:TryParseExactN(System.ReadOnlySpan`1[ushort],byref):bool (FullOpts)
G_M23672_IG01:  ;; offset=0000H
       push     rsi
       push     rbx
       sub      rsp, 40
       mov      rax, rdx
G_M23672_IG02:  ;; offset=0009H
       mov      rbx, bword ptr [rcx]
       mov      ecx, dword ptr [rcx+08H]
       cmp      ecx, 32
       je       SHORT G_M23672_IG05
G_M23672_IG03:  ;; offset=0014H
       mov      rcx, rax
       call     [RefImplNew+GuidResult:SetFailure():this]
       xor      eax, eax
G_M23672_IG04:  ;; offset=001FH
       add      rsp, 40
       pop      rbx
       pop      rsi
       ret      
G_M23672_IG05:  ;; offset=0026H
       movzx    rcx, word  ptr [rbx+0CH]
       movzx    rdx, word  ptr [rbx+0EH]
       movzx    r8, cl
       mov      r10, 0x1F630F23D18      ; static handle
       movzx    r8, byte  ptr [r8+r10]
       mov      r9d, r8d
       shl      r9d, 4
       or       r8d, r9d
       or       ecx, edx
       sar      ecx, 8
       mov      edx, -1
       test     ecx, ecx
       cmovne   r8d, edx
       mov      byte  ptr [rax], r8b
       lea      rcx, bword ptr [rax+01H]
       movzx    rdx, word  ptr [rbx+08H]
       movzx    r9, word  ptr [rbx+0AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+02H]
       movzx    rdx, word  ptr [rbx+04H]
       movzx    r9, word  ptr [rbx+06H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+03H]
       movzx    rdx, word  ptr [rbx]
       movzx    r9, word  ptr [rbx+02H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+04H]
       movzx    rdx, word  ptr [rbx+14H]
       movzx    r9, word  ptr [rbx+16H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+05H]
G_M23672_IG06:  ;; offset=013DH
       movzx    rdx, word  ptr [rbx+10H]
       movzx    r9, word  ptr [rbx+12H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+06H]
       movzx    rdx, word  ptr [rbx+1CH]
       movzx    r9, word  ptr [rbx+1EH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+07H]
       movzx    rdx, word  ptr [rbx+18H]
       movzx    r9, word  ptr [rbx+1AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+08H]
       movzx    rdx, word  ptr [rbx+20H]
       movzx    r9, word  ptr [rbx+22H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+09H]
       movzx    rdx, word  ptr [rbx+24H]
       movzx    r9, word  ptr [rbx+26H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0AH]
G_M23672_IG07:  ;; offset=0250H
       movzx    rdx, word  ptr [rbx+28H]
       movzx    r9, word  ptr [rbx+2AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0BH]
       movzx    rdx, word  ptr [rbx+2CH]
       movzx    r9, word  ptr [rbx+2EH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0CH]
       movzx    rdx, word  ptr [rbx+30H]
       movzx    r9, word  ptr [rbx+32H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0DH]
       movzx    rdx, word  ptr [rbx+34H]
       movzx    r9, word  ptr [rbx+36H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0EH]
       movzx    rdx, word  ptr [rbx+38H]
       movzx    r9, word  ptr [rbx+3AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0FH]
G_M23672_IG08:  ;; offset=0363H
       movzx    rdx, word  ptr [rbx+3CH]
       movzx    r9, word  ptr [rbx+3EH]
       movzx    r11, dl
       movzx    r10, byte  ptr [r11+r10]
       mov      r11d, r10d
       shl      r11d, 4
       or       r10d, r11d
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r10d, r9d
       or       r8d, r10d
       mov      byte  ptr [rcx], r10b
       test     r8d, r8d
       jl       SHORT G_M23672_IG10
       mov      eax, 1
G_M23672_IG09:  ;; offset=03A1H
       add      rsp, 40
       pop      rbx
       pop      rsi
       ret      
G_M23672_IG10:  ;; offset=03A8H
       mov      rcx, rax
       call     [RefImplNew+GuidResult:SetFailure():this]
       xor      eax, eax
G_M23672_IG11:  ;; offset=03B3H
       add      rsp, 40
       pop      rbx
       pop      rsi
       ret      
; Total bytes of code: 954

which is better (branchless) compared to current codegen.

@ghost ghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 30, 2023
@ghost ghost assigned EgorBo Jun 30, 2023
@EgorBo EgorBo marked this pull request as draft June 30, 2023 19:28
@EgorBo EgorBo added area-System.Runtime and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners labels Jun 30, 2023
@ghost
Copy link

ghost commented Jun 30, 2023

Tagging subscribers to this area: @dotnet/area-system-runtime
See info in area-owners.md if you want to be subscribed.

Issue Details

Mainly just to remove TODO https://github.com/dotnet/runtime/issues/13464 but also making it more efficient along the way.

This function is only used in Guid.TryParse* so the new codegen for e.g. TryParseExactN is:

new codegen
; Method RefImplNew:TryParseExactN(System.ReadOnlySpan`1[ushort],byref):bool (FullOpts)
G_M23672_IG01:  ;; offset=0000H
       push     rsi
       push     rbx
       sub      rsp, 40
       mov      rax, rdx
G_M23672_IG02:  ;; offset=0009H
       mov      rbx, bword ptr [rcx]
       mov      ecx, dword ptr [rcx+08H]
       cmp      ecx, 32
       je       SHORT G_M23672_IG05
G_M23672_IG03:  ;; offset=0014H
       mov      rcx, rax
       call     [RefImplNew+GuidResult:SetFailure():this]
       xor      eax, eax
G_M23672_IG04:  ;; offset=001FH
       add      rsp, 40
       pop      rbx
       pop      rsi
       ret      
G_M23672_IG05:  ;; offset=0026H
       movzx    rcx, word  ptr [rbx+0CH]
       movzx    rdx, word  ptr [rbx+0EH]
       movzx    r8, cl
       mov      r10, 0x1F630F23D18      ; static handle
       movzx    r8, byte  ptr [r8+r10]
       mov      r9d, r8d
       shl      r9d, 4
       or       r8d, r9d
       or       ecx, edx
       sar      ecx, 8
       mov      edx, -1
       test     ecx, ecx
       cmovne   r8d, edx
       mov      byte  ptr [rax], r8b
       lea      rcx, bword ptr [rax+01H]
       movzx    rdx, word  ptr [rbx+08H]
       movzx    r9, word  ptr [rbx+0AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+02H]
       movzx    rdx, word  ptr [rbx+04H]
       movzx    r9, word  ptr [rbx+06H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+03H]
       movzx    rdx, word  ptr [rbx]
       movzx    r9, word  ptr [rbx+02H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+04H]
       movzx    rdx, word  ptr [rbx+14H]
       movzx    r9, word  ptr [rbx+16H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+05H]
G_M23672_IG06:  ;; offset=013DH
       movzx    rdx, word  ptr [rbx+10H]
       movzx    r9, word  ptr [rbx+12H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+06H]
       movzx    rdx, word  ptr [rbx+1CH]
       movzx    r9, word  ptr [rbx+1EH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+07H]
       movzx    rdx, word  ptr [rbx+18H]
       movzx    r9, word  ptr [rbx+1AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+08H]
       movzx    rdx, word  ptr [rbx+20H]
       movzx    r9, word  ptr [rbx+22H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+09H]
       movzx    rdx, word  ptr [rbx+24H]
       movzx    r9, word  ptr [rbx+26H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0AH]
G_M23672_IG07:  ;; offset=0250H
       movzx    rdx, word  ptr [rbx+28H]
       movzx    r9, word  ptr [rbx+2AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0BH]
       movzx    rdx, word  ptr [rbx+2CH]
       movzx    r9, word  ptr [rbx+2EH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0CH]
       movzx    rdx, word  ptr [rbx+30H]
       movzx    r9, word  ptr [rbx+32H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0DH]
       movzx    rdx, word  ptr [rbx+34H]
       movzx    r9, word  ptr [rbx+36H]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0EH]
       movzx    rdx, word  ptr [rbx+38H]
       movzx    r9, word  ptr [rbx+3AH]
       movzx    r11, dl
       movzx    r11, byte  ptr [r11+r10]
       mov      esi, r11d
       shl      esi, 4
       or       r11d, esi
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r11d, r9d
       or       r8d, r11d
       mov      byte  ptr [rcx], r11b
       lea      rcx, bword ptr [rax+0FH]
G_M23672_IG08:  ;; offset=0363H
       movzx    rdx, word  ptr [rbx+3CH]
       movzx    r9, word  ptr [rbx+3EH]
       movzx    r11, dl
       movzx    r10, byte  ptr [r11+r10]
       mov      r11d, r10d
       shl      r11d, 4
       or       r10d, r11d
       or       edx, r9d
       sar      edx, 8
       mov      r9d, -1
       test     edx, edx
       cmovne   r10d, r9d
       or       r8d, r10d
       mov      byte  ptr [rcx], r10b
       test     r8d, r8d
       jl       SHORT G_M23672_IG10
       mov      eax, 1
G_M23672_IG09:  ;; offset=03A1H
       add      rsp, 40
       pop      rbx
       pop      rsi
       ret      
G_M23672_IG10:  ;; offset=03A8H
       mov      rcx, rax
       call     [RefImplNew+GuidResult:SetFailure():this]
       xor      eax, eax
G_M23672_IG11:  ;; offset=03B3H
       add      rsp, 40
       pop      rbx
       pop      rsi
       ret      
; Total bytes of code: 954

which is better (smaller and branchless) compared to current codegen.

Author: EgorBo
Assignees: EgorBo
Labels:

area-System.Runtime

Milestone: -

@EgorBo EgorBo force-pushed the improve-decode-byte branch from 14d5a7d to 82e0d69 Compare June 30, 2023 20:15
@EgorBo EgorBo marked this pull request as ready for review June 30, 2023 22:27
@EgorBo EgorBo merged commit 4c212c5 into dotnet:main Jun 30, 2023
@EgorBo EgorBo deleted the improve-decode-byte branch June 30, 2023 23:17
@ghost ghost locked as resolved and limited conversation to collaborators Jul 31, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Span indexer doesn't elide bounds check when span initialized from an RVA static
2 participants