-
Notifications
You must be signed in to change notification settings - Fork 5.1k
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
Clean up Guid.DecodeByte #88267
Conversation
Tagging subscribers to this area: @dotnet/area-system-runtime Issue DetailsMainly just to remove This function is only used in 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.
|
14d5a7d
to
82e0d69
Compare
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
which is better (branchless) compared to current codegen.