; Burgers.GetCalculated3(Int32, Int32, Double, Double, Double, Double[])
push r15
push r14
push r12
push rdi
push rsi
push rbp
push rbx
sub rsp,50
vzeroupper
vmovaps [rsp+40],xmm6
vmovaps [rsp+30],xmm7
vmovaps [rsp+20],xmm8
mov edi,ecx
mov esi,edx
vmovaps xmm6,xmm2
vmovaps xmm7,xmm3
mov rbx,[rsp+0B8]
mov edx,esi
sar edx,1F
and edx,3
add edx,esi
and edx,0FFFFFFFC
mov ecx,esi
sub ecx,edx
mov edx,ecx
neg edx
lea ebp,[rdx+rsi+4]
movsxd rdx,ebp
mov rcx,offset MT_System.Double[]
call CORINFO_HELP_NEWARR_1_VC
mov r14,rax
movsxd rdx,ebp
mov rcx,offset MT_System.Double[]
call CORINFO_HELP_NEWARR_1_VC
mov r15,rax
mov r8d,[rbx+8]
mov rcx,rbx
mov rdx,r15
call System.Array.Copy(System.Array, System.Array, Int32)
vmulsd xmm0,xmm7,qword ptr [rsp+0B0]
vdivsd xmm0,xmm0,xmm6
vmovsd xmm1,qword ptr [7FFDE6281AD8]
call System.Math.Pow(Double, Double)
xor edx,edx
test edi,edi
jle near ptr M01_L03
add ebp,0FFFFFFFD
lea eax,[rsi+0FFFF]
movsxd rcx,eax
add esi,0FFFFFFFE
movsxd r8,esi
M01_L00:
mov r9d,1
cmp ebp,1
jle near ptr M01_L02
mov r10d,[r15+8]
vdivsd xmm1,xmm7,xmm6
M01_L01:
cmp r9d,r10d
jae near ptr M01_L05
lea ebx,[r9+3]
cmp ebx,r10d
jae near ptr M01_L05
vmovupd ymm2,[r15+r9*8+10]
lea r11d,[r9+0FFFF]
cmp r11d,r10d
jae near ptr M01_L05
lea r12d,[r9+2]
cmp r12d,r10d
jae near ptr M01_L05
vmovupd ymm3,[r15+r11*8+10]
lea r11d,[r9+1]
cmp r11d,r10d
jae near ptr M01_L05
lea r12d,[r9+4]
cmp r12d,r10d
jae near ptr M01_L05
vmovupd ymm4,[r15+r11*8+10]
vbroadcastsd ymm5,xmm1
vmulpd ymm5,ymm5,ymm2
vsubpd ymm8,ymm2,ymm3
vmulpd ymm5,ymm5,ymm8
vsubpd ymm5,ymm2,ymm5
vbroadcastsd ymm8,qword ptr [7FFDE6281AE8]
vmulpd ymm2,ymm8,ymm2
vsubpd ymm2,ymm4,ymm2
vaddpd ymm2,ymm2,ymm3
vbroadcastsd ymm3,xmm0
vmulpd ymm2,ymm3,ymm2
vaddpd ymm2,ymm5,ymm2
mov r11d,[r14+8]
cmp r9d,r11d
jae near ptr M01_L06
cmp ebx,r11d
jae near ptr M01_L07
vmovupd [r14+r9*8+10],ymm2
mov r9d,r12d
cmp r9d,ebp
jl near ptr M01_L01
M01_L02:
mov r10d,[r15+8]
cmp r10d,0
jbe near ptr M01_L05
vmovsd xmm1,qword ptr [r15+10]
vmulsd xmm2,xmm1,xmm7
vdivsd xmm2,xmm2,xmm6
cmp eax,r10d
jae near ptr M01_L05
vmovsd xmm3,qword ptr [r15+rcx*8+10]
vsubsd xmm4,xmm1,xmm3
vmulsd xmm2,xmm2,xmm4
vsubsd xmm2,xmm1,xmm2
cmp r10d,1
jbe near ptr M01_L05
vmovsd xmm4,qword ptr [r15+18]
vmulsd xmm1,xmm1,qword ptr [7FFDE6281AF8]
vsubsd xmm1,xmm4,xmm1
vaddsd xmm1,xmm1,xmm3
vmulsd xmm1,xmm1,xmm0
vaddsd xmm1,xmm2,xmm1
mov r11d,[r14+8]
cmp r11d,0
jbe near ptr M01_L05
vmovsd qword ptr [r14+10],xmm1
vmovsd xmm1,qword ptr [r15+rcx*8+10]
vmulsd xmm2,xmm1,xmm7
vdivsd xmm2,xmm2,xmm6
cmp esi,r10d
jae near ptr M01_L05
vmovsd xmm3,qword ptr [r15+r8*8+10]
vsubsd xmm4,xmm1,xmm3
vmulsd xmm2,xmm2,xmm4
vsubsd xmm2,xmm1,xmm2
vaddsd xmm1,xmm1,xmm1
vmovsd xmm4,qword ptr [r15+10]
vsubsd xmm1,xmm4,xmm1
vaddsd xmm1,xmm1,xmm3
vmulsd xmm1,xmm1,xmm0
vaddsd xmm1,xmm2,xmm1
cmp eax,r11d
jae short M01_L05
vmovsd qword ptr [r14+rcx*8+10],xmm1
inc edx
cmp edx,edi
jl short M01_L04
mov r15,r14
M01_L03:
mov rax,r15
vmovaps xmm6,[rsp+40]
vmovaps xmm7,[rsp+30]
vmovaps xmm8,[rsp+20]
vzeroupper
add rsp,50
pop rbx
pop rbp
pop rsi
pop rdi
pop r12
pop r14
pop r15
ret
M01_L04:
xchg r14,r15
jmp near ptr M01_L00
M01_L05:
call CORINFO_HELP_RNGCHKFAIL
M01_L06:
call CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION
M01_L07:
call CORINFO_HELP_THROW_ARGUMENTEXCEPTION
int 3
; Total bytes of code 672
; Burgers.GetCalculated3(Int32, Int32, Double, Double, Double, Double[])
push r15
push r14
push rdi
push rsi
push rbp
push rbx
sub rsp,148
vzeroupper
vmovaps [rsp+130],xmm6
vmovaps [rsp+120],xmm7
vmovaps [rsp+110],xmm8
vmovaps [rsp+100],xmm9
vmovaps [rsp+0F0],xmm10
vxorps xmm4,xmm4,xmm4
vmovdqa xmmword ptr [rsp+40],xmm4
mov rax,0FFFFFFFFFF70
M01_L00:
vmovdqa xmmword ptr [rsp+rax+0E0],xmm4
vmovdqa xmmword ptr [rsp+rax+0F0],xmm4
vmovdqa xmmword ptr [rsp+rax+100],xmm4
add rax,30
jne short M01_L00
mov edi,ecx
mov esi,edx
vmovaps xmm6,xmm2
vmovaps xmm7,xmm3
mov rbx,[rsp+1A8]
mov edx,esi
sar edx,1F
and edx,3
add edx,esi
and edx,0FFFFFFFC
mov ecx,esi
sub ecx,edx
mov edx,ecx
neg edx
lea ebp,[rdx+rsi+4]
movsxd rdx,ebp
mov rcx,offset MT_System.Double[]
call CORINFO_HELP_NEWARR_1_VC
mov r14,rax
movsxd rdx,ebp
mov rcx,offset MT_System.Double[]
call CORINFO_HELP_NEWARR_1_VC
mov r15,rax
mov r8d,[rbx+8]
mov rcx,rbx
mov rdx,r15
call System.Array.Copy(System.Array, System.Array, Int32)
vmulsd xmm0,xmm7,qword ptr [rsp+1A0]
vdivsd xmm0,xmm0,xmm6
vmovsd xmm8,qword ptr [7FFDE8B4C8B8]
vmovaps xmm1,xmm8
call System.Math.Pow(Double, Double)
xor edx,edx
test edi,edi
jle near ptr M01_L07
M01_L01:
mov eax,1
lea ecx,[rbp+0FFFD]
cmp ecx,1
jle near ptr M01_L06
M01_L02:
mov r8d,[r15+8]
cmp eax,r8d
jae near ptr M01_L09
lea r9d,[rax+3]
cmp r9d,r8d
jae near ptr M01_L09
vmovupd ymm1,[r15+rax*8+10]
lea r10d,[rax+0FFFF]
cmp r10d,r8d
jae near ptr M01_L09
lea r11d,[rax+2]
cmp r11d,r8d
jae near ptr M01_L09
vmovupd ymm2,[r15+r10*8+10]
lea r10d,[rax+1]
cmp r10d,r8d
jae near ptr M01_L09
lea r11d,[rax+4]
cmp r11d,r8d
jae near ptr M01_L09
vmovupd ymm3,[r15+r10*8+10]
vmovaps ymm4,ymm1
vmovupd [rsp+0A0],ymm4
vxorps ymm5,ymm5,ymm5
vmovupd [rsp+0C0],ymm5
xor r10d,r10d
vdivsd xmm9,xmm7,xmm6
M01_L03:
lea r8,[rsp+0A0]
vmovsd xmm10,qword ptr [r8+r10*8]
vmulsd xmm10,xmm9,xmm10
lea r8,[rsp+0C0]
vmovsd qword ptr [r8+r10*8],xmm10
inc r10
cmp r10,4
jl short M01_L03
vmovupd ymm9,[rsp+0C0]
vsubpd ymm4,ymm4,ymm2
vmulpd ymm4,ymm9,ymm4
vsubpd ymm4,ymm1,ymm4
vmovupd [rsp+60],ymm1
vmovupd [rsp+80],ymm5
xor r8d,r8d
M01_L04:
lea r10,[rsp+60]
vmovsd xmm1,qword ptr [r10+r8*8]
vaddsd xmm1,xmm1,xmm1
lea r10,[rsp+80]
vmovsd qword ptr [r10+r8*8],xmm1
inc r8
cmp r8,4
jl short M01_L04
vmovupd ymm1,[rsp+80]
vsubpd ymm1,ymm3,ymm1
vaddpd ymm1,ymm1,ymm2
vmovupd [rsp+20],ymm1
vmovupd [rsp+40],ymm5
xor r8d,r8d
M01_L05:
lea r10,[rsp+20]
vmovsd xmm1,qword ptr [r10+r8*8]
vmulsd xmm1,xmm1,xmm0
lea r10,[rsp+40]
vmovsd qword ptr [r10+r8*8],xmm1
inc r8
cmp r8,4
jl short M01_L05
vmovupd ymm1,[rsp+40]
vaddpd ymm1,ymm4,ymm1
mov r8d,[r14+8]
cmp eax,r8d
jae near ptr M01_L10
cmp r9d,r8d
jae near ptr M01_L11
vmovupd [r14+rax*8+10],ymm1
mov eax,r11d
cmp eax,ecx
jl near ptr M01_L02
M01_L06:
mov r8d,[r15+8]
test r8d,r8d
je near ptr M01_L09
vmovsd xmm2,qword ptr [r15+10]
vmulsd xmm4,xmm2,xmm7
vdivsd xmm1,xmm4,xmm6
lea r10d,[rsi+0FFFF]
cmp r10d,r8d
jae near ptr M01_L09
movsxd rax,r10d
vmovsd xmm3,qword ptr [r15+rax*8+10]
vsubsd xmm5,xmm2,xmm3
vmulsd xmm1,xmm1,xmm5
vsubsd xmm1,xmm2,xmm1
cmp r8d,1
jbe near ptr M01_L09
vmovsd xmm4,qword ptr [r15+18]
vmulsd xmm2,xmm2,xmm8
vsubsd xmm2,xmm4,xmm2
vaddsd xmm2,xmm2,xmm3
vmulsd xmm2,xmm2,xmm0
vaddsd xmm1,xmm1,xmm2
mov r11d,[r14+8]
test r11d,r11d
je near ptr M01_L09
vmovsd qword ptr [r14+10],xmm1
vmovsd xmm1,qword ptr [r15+rax*8+10]
vmulsd xmm2,xmm1,xmm7
vdivsd xmm2,xmm2,xmm6
lea r9d,[rsi+0FFFE]
cmp r9d,r8d
jae near ptr M01_L09
movsxd rcx,r9d
vmovsd xmm3,qword ptr [r15+rcx*8+10]
vsubsd xmm4,xmm1,xmm3
vmulsd xmm2,xmm2,xmm4
vsubsd xmm2,xmm1,xmm2
vmovsd xmm4,qword ptr [r15+10]
vmulsd xmm1,xmm1,xmm8
vsubsd xmm1,xmm4,xmm1
vaddsd xmm1,xmm1,xmm3
vmulsd xmm1,xmm1,xmm0
vaddsd xmm1,xmm2,xmm1
cmp r10d,r11d
jae short M01_L09
vmovsd qword ptr [r14+rax*8+10],xmm1
inc edx
cmp edx,edi
jl short M01_L08
mov r15,r14
M01_L07:
mov rax,r15
vmovaps xmm6,[rsp+130]
vmovaps xmm7,[rsp+120]
vmovaps xmm8,[rsp+110]
vmovaps xmm9,[rsp+100]
vmovaps xmm10,[rsp+0F0]
vzeroupper
add rsp,148
pop rbx
pop rbp
pop rsi
pop rdi
pop r14
pop r15
ret
M01_L08:
xchg r14,r15
jmp near ptr M01_L01
M01_L09:
call CORINFO_HELP_RNGCHKFAIL
M01_L10:
call CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION
M01_L11:
call CORINFO_HELP_THROW_ARGUMENTEXCEPTION
int 3
; Total bytes of code 951
Description
The
Burgers.Test3scenario from dotnet/performance is regressing in 6.0. I can reproduce by running the following after cloning dotnet/performance:Configuration
Configuration below in Data.
Regression?
Regression from .NET 5.0 -> .NET 6.0.
Data
AMD Ryzen 7 5800
.NET 5.0 Results
.NET 6.0 Results
Intel i9 10900k
.NET 5.0
.NET 6.0
Analysis
This looks to be a SIMD issue of some kind, but I'm not exactly sure where the issue is. The following analysis was done on the Ryzen 7 machine but holds true for both machines I tested on.
I collected some ETW traces and found that the benchmark was spending most of its time in the
GetCalculated3method, which looks like this:Lots of vectorization, so I had BDN generate the disassembly for both .NET 5.0 and 6.0 to see if the issue was with codegen.
BDN Disassembly
.NET 5.0.3 (5.0.321.7212), X64 RyuJIT
.NET 6.0.0 (6.0.21.15201), X64 RyuJIT
There are a few things that jump out to me as possibly causing the regression:
Please let me know if there is any other information I can provide or if I can clarify any of the above.