Skip to content
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

[JitDiff X64] [EgorBo] Remove a few unsafe bits in BCL #960

Open
MihuBot opened this issue Jan 29, 2025 · 2 comments
Open

[JitDiff X64] [EgorBo] Remove a few unsafe bits in BCL #960

MihuBot opened this issue Jan 29, 2025 · 2 comments

Comments

@MihuBot
Copy link
Owner

MihuBot commented Jan 29, 2025

Job completed in 14 minutes 37 seconds (remote runner delay: 1 minute 19 seconds).
dotnet/runtime#111643

Diffs

Found 85 files with textual diffs.

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 43640320
Total bytes of diff: 43640448
Total bytes of delta: 128 (0.00 % of base)
Total relative delta: 2.98
    diff is a regression.
    relative diff is a regression.


Top file regressions (bytes):
         128 : System.IO.Hashing.dasm (0.51 % of base)

1 total files with Code Size differences (0 improved, 1 regressed), 262 unchanged.

Top method regressions (bytes):
          42 (123.53 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:GetCurrentHashCore(System.Span`1[ubyte]):this (FullOpts)
          29 (138.10 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:WriteBigEndian128(byref,System.Span`1[ubyte]) (FullOpts)
          27 (10.93 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(ubyte[]):ubyte[] (FullOpts)
           9 (9.78 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.Crc32:UpdateScalarArm32(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
           9 (9.68 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.Crc32:UpdateScalarArm64(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
           3 (1.49 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(System.ReadOnlySpan`1[ubyte],long):ubyte[] (FullOpts)
           3 (1.84 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(System.ReadOnlySpan`1[ubyte],System.Span`1[ubyte],long):int (FullOpts)
           3 (1.17 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(ubyte[],long):ubyte[] (FullOpts)
           3 (1.70 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:TryHash(System.ReadOnlySpan`1[ubyte],System.Span`1[ubyte],byref,long):ubyte (FullOpts)

Top method regressions (percentages):
          29 (138.10 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:WriteBigEndian128(byref,System.Span`1[ubyte]) (FullOpts)
          42 (123.53 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:GetCurrentHashCore(System.Span`1[ubyte]):this (FullOpts)
          27 (10.93 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(ubyte[]):ubyte[] (FullOpts)
           9 (9.78 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.Crc32:UpdateScalarArm32(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
           9 (9.68 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.Crc32:UpdateScalarArm64(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
           3 (1.84 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(System.ReadOnlySpan`1[ubyte],System.Span`1[ubyte],long):int (FullOpts)
           3 (1.70 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:TryHash(System.ReadOnlySpan`1[ubyte],System.Span`1[ubyte],byref,long):ubyte (FullOpts)
           3 (1.49 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(System.ReadOnlySpan`1[ubyte],long):ubyte[] (FullOpts)
           3 (1.17 % of base) : System.IO.Hashing.dasm - System.IO.Hashing.XxHash128:Hash(ubyte[],long):ubyte[] (FullOpts)

9 total methods with Code Size differences (0 improved, 9 regressed), 247302 unchanged.

--------------------------------------------------------------------------------

Artifacts:

@MihuBot
Copy link
Owner Author

MihuBot commented Jan 29, 2025

Top method regressions

42 (123.53 % of base) - System.IO.Hashing.XxHash128:GetCurrentHashCore(System.Span`1[ubyte]):this
 ; Assembly listing for method System.IO.Hashing.XxHash128:GetCurrentHashCore(System.Span`1[ubyte]):this (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX512 - Unix
 ; FullOpts code
 ; optimized code
-; rsp based frame
+; rbp based frame
 ; partially interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 7 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 this         [V00,T00] (  3,  3   )     ref  ->  rdi         this class-hnd single-def <System.IO.Hashing.XxHash128>
 ;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg single-def <System.Span`1[ubyte]>
 ;* V02 loc0         [V02    ] (  0,  0   )  struct (16) zero-ref    multireg-ret ld-addr-op <System.IO.Hashing.XxHash128+Hash128>
 ;# V03 OutArgs      [V03    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;* V04 tmp1         [V04    ] (  0,  0   )  struct (16) zero-ref    do-not-enreg[SBR] multireg-ret "Return value temp for multireg return" <System.IO.Hashing.XxHash128+Hash128>
-;  V05 tmp2         [V05,T03] (  2,  2   )    long  ->  rax         "Inline stloc first use temp"
-;  V06 tmp3         [V06,T04] (  2,  2   )    long  ->  rcx         "Inline stloc first use temp"
-;* V07 tmp4         [V07    ] (  0,  0   )   byref  ->  zero-ref    single-def "dup spill"
-;* V08 tmp5         [V08    ] (  0,  0   )    long  ->  zero-ref    ld-addr-op "NewObj constructor temp"
-;* V09 tmp6         [V09    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
-;  V10 tmp7         [V10,T01] (  3,  3   )   byref  ->  rbx         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
-;  V11 tmp8         [V11,T02] (  1,  1   )     int  ->  rdx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
-;  V12 tmp9         [V12,T05] (  2,  2   )    long  ->  rax         "field V02.Low64 (fldOffset=0x0)" P-INDEP
-;  V13 tmp10        [V13,T06] (  2,  2   )    long  ->  rdx         "field V02.High64 (fldOffset=0x8)" P-INDEP
-;* V14 tmp11        [V14    ] (  0,  0   )    long  ->  zero-ref    "field V04.Low64 (fldOffset=0x0)" P-DEP
-;* V15 tmp12        [V15    ] (  0,  0   )    long  ->  zero-ref    "field V04.High64 (fldOffset=0x8)" P-DEP
-;* V16 tmp13        [V16    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V09._reference (fldOffset=0x0)" P-INDEP
-;* V17 tmp14        [V17    ] (  0,  0   )     int  ->  zero-ref    "field V09._length (fldOffset=0x8)" P-INDEP
+;* V05 tmp2         [V05    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V06 tmp3         [V06    ] (  0,  0   )  struct (16) zero-ref    "impAppendStmt" <System.Span`1[ubyte]>
+;* V07 tmp4         [V07    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V08 tmp5         [V08    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V09 tmp6         [V09    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V10 tmp7         [V10    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V11 tmp8         [V11    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V12 tmp9         [V12    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
+;  V13 tmp10        [V13,T04] (  2,  2   )    long  ->  rax         ld-addr-op "Inline stloc first use temp"
+;* V14 tmp11        [V14    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V15 tmp12        [V15    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V16 tmp13        [V16    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
+;  V17 tmp14        [V17,T05] (  2,  2   )    long  ->  rax         ld-addr-op "Inline stloc first use temp"
+;* V18 tmp15        [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V19 tmp16        [V19    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;  V20 tmp17        [V20,T01] (  3,  3   )   byref  ->  rbx         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
+;  V21 tmp18        [V21,T02] (  3,  3   )     int  ->  r15         single-def "field V01._length (fldOffset=0x8)" P-INDEP
+;  V22 tmp19        [V22,T06] (  2,  2   )    long  ->  rax         "field V02.Low64 (fldOffset=0x0)" P-INDEP
+;  V23 tmp20        [V23,T07] (  2,  2   )    long  ->  rdx         "field V02.High64 (fldOffset=0x8)" P-INDEP
+;* V24 tmp21        [V24    ] (  0,  0   )    long  ->  zero-ref    "field V04.Low64 (fldOffset=0x0)" P-DEP
+;* V25 tmp22        [V25    ] (  0,  0   )    long  ->  zero-ref    "field V04.High64 (fldOffset=0x8)" P-DEP
+;* V26 tmp23        [V26    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V05._reference (fldOffset=0x0)" P-INDEP
+;* V27 tmp24        [V27    ] (  0,  0   )     int  ->  zero-ref    "field V05._length (fldOffset=0x8)" P-INDEP
+;* V28 tmp25        [V28    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V06._reference (fldOffset=0x0)" P-INDEP
+;* V29 tmp26        [V29    ] (  0,  0   )     int  ->  zero-ref    "field V06._length (fldOffset=0x8)" P-INDEP
+;* V30 tmp27        [V30    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V07._reference (fldOffset=0x0)" P-INDEP
+;* V31 tmp28        [V31    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
+;* V32 tmp29        [V32    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V08._reference (fldOffset=0x0)" P-INDEP
+;* V33 tmp30        [V33    ] (  0,  0   )     int  ->  zero-ref    "field V08._length (fldOffset=0x8)" P-INDEP
+;  V34 tmp31        [V34,T03] (  2,  2   )   byref  ->  rcx         single-def "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V35 tmp32        [V35    ] (  0,  0   )     int  ->  zero-ref    "field V10._length (fldOffset=0x8)" P-INDEP
+;* V36 tmp33        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V14._reference (fldOffset=0x0)" P-INDEP
+;* V37 tmp34        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V14._length (fldOffset=0x8)" P-INDEP
+;* V38 tmp35        [V38    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V15._reference (fldOffset=0x0)" P-INDEP
+;* V39 tmp36        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V15._length (fldOffset=0x8)" P-INDEP
+;* V40 tmp37        [V40    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V18._reference (fldOffset=0x0)" P-INDEP
+;* V41 tmp38        [V41    ] (  0,  0   )     int  ->  zero-ref    "field V18._length (fldOffset=0x8)" P-INDEP
+;* V42 tmp39        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V19._reference (fldOffset=0x0)" P-INDEP
+;* V43 tmp40        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V19._length (fldOffset=0x8)" P-INDEP
 ;
 ; Lcl frame size = 0
 
 G_M434_IG01:
+       push     rbp
+       push     r15
        push     rbx
+       lea      rbp, [rsp+0x10]
        mov      rbx, rsi
-						;; size=4 bbWeight=1 PerfScore 1.25
+       mov      r15d, edx
+						;; size=15 bbWeight=1 PerfScore 4.00
 G_M434_IG02:
        mov      rax, 0xD1FFAB1E      ; code for System.IO.Hashing.XxHash128:GetCurrentHashAsHash128():System.IO.Hashing.XxHash128+Hash128:this
        call     [rax]System.IO.Hashing.XxHash128:GetCurrentHashAsHash128():System.IO.Hashing.XxHash128+Hash128:this
+       cmp      r15d, 8
+       jl       SHORT G_M434_IG04
+       cmp      r15d, 16
+       jl       SHORT G_M434_IG04
+       lea      rcx, bword ptr [rbx+0x08]
        bswap    rax
-       mov      rcx, rdx
-       bswap    rcx
-       mov      qword ptr [rbx], rcx
-       mov      qword ptr [rbx+0x08], rax
-						;; size=28 bbWeight=1 PerfScore 7.50
+       mov      qword ptr [rcx], rax
+       mov      rax, rdx
+       bswap    rax
+       mov      qword ptr [rbx], rax
+						;; size=43 bbWeight=1 PerfScore 10.50
 G_M434_IG03:
        pop      rbx
+       pop      r15
+       pop      rbp
        ret      
-						;; size=2 bbWeight=1 PerfScore 1.50
+						;; size=5 bbWeight=1 PerfScore 2.50
+G_M434_IG04:
+       mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       int3     
+						;; size=13 bbWeight=0.50 PerfScore 1.75
 
-; Total bytes of code 34, prolog size 1, PerfScore 10.25, instruction count 11, allocated bytes for code 34 (MethodHash=8e3bfe4d) for method System.IO.Hashing.XxHash128:GetCurrentHashCore(System.Span`1[ubyte]):this (FullOpts)
+; Total bytes of code 76, prolog size 9, PerfScore 18.75, instruction count 25, allocated bytes for code 76 (MethodHash=8e3bfe4d) for method System.IO.Hashing.XxHash128:GetCurrentHashCore(System.Span`1[ubyte]):this (FullOpts)
 ; ============================================================
29 (138.10 % of base) - System.IO.Hashing.XxHash128:WriteBigEndian128(byref,System.Span`1[ubyte])
 ; Assembly listing for method System.IO.Hashing.XxHash128:WriteBigEndian128(byref,System.Span`1[ubyte]) (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX512 - Unix
 ; FullOpts code
 ; optimized code
-; rsp based frame
+; rbp based frame
 ; partially interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 0 inlinees without PGO data
+; 0 inlinees with PGO data; 6 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 arg0         [V00,T00] (  4,  4   )   byref  ->  rdi         single-def
-;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg single-def <System.Span`1[ubyte]>
-;  V02 loc0         [V02,T02] (  4,  4   )    long  ->  rax        
-;  V03 loc1         [V03,T03] (  4,  4   )    long  ->  rcx        
-;# V04 OutArgs      [V04    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V05 tmp1         [V05    ] (  0,  0   )   byref  ->  zero-ref    single-def "dup spill"
-;* V06 tmp2         [V06    ] (  0,  0   )    long  ->  zero-ref    ld-addr-op "NewObj constructor temp"
-;* V07 tmp3         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
-;  V08 tmp4         [V08,T01] (  3,  3   )   byref  ->  rsi         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
-;  V09 tmp5         [V09,T04] (  1,  1   )     int  ->  rdx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
-;* V10 tmp6         [V10    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V07._reference (fldOffset=0x0)" P-INDEP
-;* V11 tmp7         [V11    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
+;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op single-def <System.Span`1[ubyte]>
+;# V02 OutArgs      [V02    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
+;* V03 tmp1         [V03    ] (  0,  0   )  struct (16) zero-ref    "impAppendStmt" <System.Span`1[ubyte]>
+;* V04 tmp2         [V04    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V05 tmp3         [V05    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V06 tmp4         [V06    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V07 tmp5         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V08 tmp6         [V08    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V09 tmp7         [V09    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
+;  V10 tmp8         [V10,T04] (  2,  2   )    long  ->  rcx         ld-addr-op "Inline stloc first use temp"
+;* V11 tmp9         [V11    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V12 tmp10        [V12    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V13 tmp11        [V13    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
+;  V14 tmp12        [V14,T05] (  2,  2   )    long  ->  rax         ld-addr-op "Inline stloc first use temp"
+;* V15 tmp13        [V15    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V16 tmp14        [V16    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;  V17 tmp15        [V17,T01] (  3,  3   )   byref  ->  rsi         single-def "field V01._reference (fldOffset=0x0)" P-INDEP
+;  V18 tmp16        [V18,T02] (  3,  3   )     int  ->  rdx         single-def "field V01._length (fldOffset=0x8)" P-INDEP
+;* V19 tmp17        [V19    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V03._reference (fldOffset=0x0)" P-INDEP
+;* V20 tmp18        [V20    ] (  0,  0   )     int  ->  zero-ref    "field V03._length (fldOffset=0x8)" P-INDEP
+;* V21 tmp19        [V21    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V04._reference (fldOffset=0x0)" P-INDEP
+;* V22 tmp20        [V22    ] (  0,  0   )     int  ->  zero-ref    "field V04._length (fldOffset=0x8)" P-INDEP
+;* V23 tmp21        [V23    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V05._reference (fldOffset=0x0)" P-INDEP
+;* V24 tmp22        [V24    ] (  0,  0   )     int  ->  zero-ref    "field V05._length (fldOffset=0x8)" P-INDEP
+;  V25 tmp23        [V25,T03] (  2,  2   )   byref  ->  rax         single-def "field V07._reference (fldOffset=0x0)" P-INDEP
+;* V26 tmp24        [V26    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
+;* V27 tmp25        [V27    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V11._reference (fldOffset=0x0)" P-INDEP
+;* V28 tmp26        [V28    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
+;* V29 tmp27        [V29    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V12._reference (fldOffset=0x0)" P-INDEP
+;* V30 tmp28        [V30    ] (  0,  0   )     int  ->  zero-ref    "field V12._length (fldOffset=0x8)" P-INDEP
+;* V31 tmp29        [V31    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V15._reference (fldOffset=0x0)" P-INDEP
+;* V32 tmp30        [V32    ] (  0,  0   )     int  ->  zero-ref    "field V15._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp31        [V33    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V16._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp32        [V34    ] (  0,  0   )     int  ->  zero-ref    "field V16._length (fldOffset=0x8)" P-INDEP
 ;
 ; Lcl frame size = 0
 
 G_M11325_IG01:
-						;; size=0 bbWeight=1 PerfScore 0.00
+       push     rbp
+       mov      rbp, rsp
+						;; size=4 bbWeight=1 PerfScore 1.25
 G_M11325_IG02:
-       mov      rax, qword ptr [rdi]
-       mov      rcx, qword ptr [rdi+0x08]
-       bswap    rax
-       bswap    rcx
-       mov      qword ptr [rsi], rcx
-       mov      qword ptr [rsi+0x08], rax
-						;; size=20 bbWeight=1 PerfScore 8.00
+       cmp      edx, 8
+       jl       SHORT G_M11325_IG04
+       cmp      edx, 16
+       jl       SHORT G_M11325_IG04
+       lea      rax, bword ptr [rsi+0x08]
+       movbe    rcx, qword ptr [rdi]
+       mov      qword ptr [rax], rcx
+       movbe    rax, qword ptr [rdi+0x08]
+       mov      qword ptr [rsi], rax
+						;; size=31 bbWeight=1 PerfScore 13.00
 G_M11325_IG03:
+       pop      rbp
        ret      
-						;; size=1 bbWeight=1 PerfScore 1.00
+						;; size=2 bbWeight=1 PerfScore 1.50
+G_M11325_IG04:
+       mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       int3     
+						;; size=13 bbWeight=0.50 PerfScore 1.75
 
-; Total bytes of code 21, prolog size 0, PerfScore 9.00, instruction count 7, allocated bytes for code 21 (MethodHash=ae9bd3c2) for method System.IO.Hashing.XxHash128:WriteBigEndian128(byref,System.Span`1[ubyte]) (FullOpts)
+; Total bytes of code 50, prolog size 4, PerfScore 17.50, instruction count 16, allocated bytes for code 50 (MethodHash=ae9bd3c2) for method System.IO.Hashing.XxHash128:WriteBigEndian128(byref,System.Span`1[ubyte]) (FullOpts)
 ; ============================================================
27 (10.93 % of base) - System.IO.Hashing.XxHash128:Hash(ubyte[]):ubyte[]
 ; Assembly listing for method System.IO.Hashing.XxHash128:Hash(ubyte[]):ubyte[] (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX512 - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
 ; partially interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 6 single block inlinees; 7 inlinees without PGO data
+; 0 inlinees with PGO data; 10 single block inlinees; 9 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;  V00 arg0         [V00,T00] (  5,  5   )     ref  ->  rdi         class-hnd single-def <ubyte[]>
 ;# V01 OutArgs      [V01    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;* V02 tmp1         [V02    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
 ;* V03 tmp2         [V03    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact "Inline return value spill temp" <ubyte[]>
 ;* V04 tmp3         [V04    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact "NewArr temp" <ubyte[]>
 ;  V05 tmp4         [V05,T05] (  3,  3   )     ref  ->  r14         class-hnd exact single-def "Inline stloc first use temp" <ubyte[]>
 ;* V06 tmp5         [V06    ] (  0,  0   )  struct (16) zero-ref    "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V07 tmp6         [V07    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
 ;* V08 tmp7         [V08    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
 ;* V09 tmp8         [V09    ] (  0,  0   )     int  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V10 tmp9         [V10    ] (  0,  0   )   ubyte  ->  zero-ref    "Inline return value spill temp"
 ;* V11 tmp10        [V11    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
 ;* V12 tmp11        [V12    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline stloc first use temp" <System.IO.Hashing.XxHash128+Hash128>
 ;* V13 tmp12        [V13    ] (  0,  0   )  struct (16) zero-ref    multireg-ret "Inline return value spill temp" <System.IO.Hashing.XxHash128+Hash128>
 ;* V14 tmp13        [V14    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
 ;* V15 tmp14        [V15    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;  V16 tmp15        [V16    ] (  2,  2   )   byref  ->  [rbp-0x28]  must-init pinned "Inline stloc first use temp"
 ;* V17 tmp16        [V17    ] (  0,  0   )    long  ->  zero-ref    "Inline stloc first use temp"
 ;* V18 tmp17        [V18    ] (  0,  0   )  struct (16) zero-ref    do-not-enreg[SBR] multireg-ret "Return value temp for multireg return" <System.IO.Hashing.XxHash128+Hash128>
 ;* V19 tmp18        [V19    ] (  0,  0   )  struct (16) zero-ref    do-not-enreg[SBR] multireg-ret "Return value temp for multireg return" <System.IO.Hashing.XxHash128+Hash128>
 ;* V20 tmp19        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
-;  V21 tmp20        [V21,T08] (  2,  2   )    long  ->  rax         "Inline stloc first use temp"
-;  V22 tmp21        [V22,T09] (  2,  2   )    long  ->  rdi         "Inline stloc first use temp"
-;* V23 tmp22        [V23    ] (  0,  0   )  struct (16) zero-ref    "Inlining Arg" <System.Span`1[ubyte]>
-;* V24 tmp23        [V24    ] (  0,  0   )   byref  ->  zero-ref    single-def "dup spill"
-;* V25 tmp24        [V25    ] (  0,  0   )    long  ->  zero-ref    ld-addr-op "NewObj constructor temp"
-;* V26 tmp25        [V26    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
-;  V27 tmp26        [V27,T06] (  3,  3   )   byref  ->  rbx         single-def "field V02._reference (fldOffset=0x0)" P-INDEP
-;  V28 tmp27        [V28,T02] (  8,  5   )     int  ->  r15         "field V02._length (fldOffset=0x8)" P-INDEP
-;* V29 tmp28        [V29    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V06._reference (fldOffset=0x0)" P-INDEP
-;* V30 tmp29        [V30    ] (  0,  0   )     int  ->  zero-ref    "field V06._length (fldOffset=0x8)" P-INDEP
-;* V31 tmp30        [V31    ] (  0,  0   )   byref  ->  zero-ref    "field V07._reference (fldOffset=0x0)" P-INDEP
-;* V32 tmp31        [V32    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
-;  V33 tmp32        [V33,T07] (  3,  3   )   byref  ->  r13         "field V08._reference (fldOffset=0x0)" P-INDEP
-;* V34 tmp33        [V34,T10] (  0,  0   )     int  ->  zero-ref    "field V08._length (fldOffset=0x8)" P-INDEP
-;* V35 tmp34        [V35    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V11._reference (fldOffset=0x0)" P-INDEP
-;* V36 tmp35        [V36    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
-;* V37 tmp36        [V37    ] (  0,  0   )    long  ->  zero-ref    "field V12.Low64 (fldOffset=0x0)" P-INDEP
-;* V38 tmp37        [V38    ] (  0,  0   )    long  ->  zero-ref    "field V12.High64 (fldOffset=0x8)" P-INDEP
-;  V39 tmp38        [V39,T03] (  5,  3   )    long  ->  rax         "field V13.Low64 (fldOffset=0x0)" P-INDEP
-;  V40 tmp39        [V40,T04] (  5,  3   )    long  ->  rdx         "field V13.High64 (fldOffset=0x8)" P-INDEP
-;* V41 tmp40        [V41    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V14._reference (fldOffset=0x0)" P-INDEP
-;* V42 tmp41        [V42    ] (  0,  0   )     int  ->  zero-ref    "field V14._length (fldOffset=0x8)" P-INDEP
-;* V43 tmp42        [V43    ] (  0,  0   )    long  ->  zero-ref    "field V18.Low64 (fldOffset=0x0)" P-DEP
-;* V44 tmp43        [V44    ] (  0,  0   )    long  ->  zero-ref    "field V18.High64 (fldOffset=0x8)" P-DEP
-;* V45 tmp44        [V45    ] (  0,  0   )    long  ->  zero-ref    "field V19.Low64 (fldOffset=0x0)" P-DEP
-;* V46 tmp45        [V46    ] (  0,  0   )    long  ->  zero-ref    "field V19.High64 (fldOffset=0x8)" P-DEP
-;* V47 tmp46        [V47    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V20._reference (fldOffset=0x0)" P-INDEP
-;* V48 tmp47        [V48    ] (  0,  0   )     int  ->  zero-ref    "field V20._length (fldOffset=0x8)" P-INDEP
-;* V49 tmp48        [V49    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V23._reference (fldOffset=0x0)" P-INDEP
-;* V50 tmp49        [V50    ] (  0,  0   )     int  ->  zero-ref    "field V23._length (fldOffset=0x8)" P-INDEP
-;* V51 tmp50        [V51    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V26._reference (fldOffset=0x0)" P-INDEP
-;* V52 tmp51        [V52    ] (  0,  0   )     int  ->  zero-ref    "field V26._length (fldOffset=0x8)" P-INDEP
-;  V53 tmp52        [V53,T01] (  5,  6   )    long  ->  rdi         "Cast away GC"
+;* V21 tmp20        [V21    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V22 tmp21        [V22    ] (  0,  0   )  struct (16) zero-ref    "impAppendStmt" <System.Span`1[ubyte]>
+;* V23 tmp22        [V23    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.Span`1[ubyte]>
+;* V24 tmp23        [V24    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V25 tmp24        [V25    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V26 tmp25        [V26    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.Span`1[ubyte]>
+;* V27 tmp26        [V27    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V28 tmp27        [V28    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
+;  V29 tmp28        [V29,T10] (  2,  2   )    long  ->  rax         ld-addr-op "Inline stloc first use temp"
+;* V30 tmp29        [V30    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V31 tmp30        [V31    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.Span`1[ubyte]>
+;* V32 tmp31        [V32    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
+;  V33 tmp32        [V33    ] (  2,  2   )    long  ->  [rbp-0x30]  do-not-enreg[X] addr-exposed ld-addr-op "Inline stloc first use temp"
+;  V34 tmp33        [V34,T06] (  3,  3   )   byref  ->  rbx         single-def "field V02._reference (fldOffset=0x0)" P-INDEP
+;  V35 tmp34        [V35,T02] (  8,  5   )     int  ->  r15         "field V02._length (fldOffset=0x8)" P-INDEP
+;* V36 tmp35        [V36    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V06._reference (fldOffset=0x0)" P-INDEP
+;* V37 tmp36        [V37    ] (  0,  0   )     int  ->  zero-ref    "field V06._length (fldOffset=0x8)" P-INDEP
+;* V38 tmp37        [V38    ] (  0,  0   )   byref  ->  zero-ref    "field V07._reference (fldOffset=0x0)" P-INDEP
+;* V39 tmp38        [V39    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
+;  V40 tmp39        [V40,T08] (  2,  2   )   byref  ->  r13         "field V08._reference (fldOffset=0x0)" P-INDEP
+;* V41 tmp40        [V41,T11] (  0,  0   )     int  ->  zero-ref    "field V08._length (fldOffset=0x8)" P-INDEP
+;* V42 tmp41        [V42    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V11._reference (fldOffset=0x0)" P-INDEP
+;* V43 tmp42        [V43    ] (  0,  0   )     int  ->  zero-ref    "field V11._length (fldOffset=0x8)" P-INDEP
+;* V44 tmp43        [V44    ] (  0,  0   )    long  ->  zero-ref    "field V12.Low64 (fldOffset=0x0)" P-INDEP
+;* V45 tmp44        [V45    ] (  0,  0   )    long  ->  zero-ref    "field V12.High64 (fldOffset=0x8)" P-INDEP
+;  V46 tmp45        [V46,T03] (  5,  3   )    long  ->  rax         "field V13.Low64 (fldOffset=0x0)" P-INDEP
+;  V47 tmp46        [V47,T04] (  5,  3   )    long  ->  rdx         "field V13.High64 (fldOffset=0x8)" P-INDEP
+;* V48 tmp47        [V48    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V14._reference (fldOffset=0x0)" P-INDEP
+;* V49 tmp48        [V49    ] (  0,  0   )     int  ->  zero-ref    "field V14._length (fldOffset=0x8)" P-INDEP
+;* V50 tmp49        [V50    ] (  0,  0   )    long  ->  zero-ref    "field V18.Low64 (fldOffset=0x0)" P-DEP
+;* V51 tmp50        [V51    ] (  0,  0   )    long  ->  zero-ref    "field V18.High64 (fldOffset=0x8)" P-DEP
+;* V52 tmp51        [V52    ] (  0,  0   )    long  ->  zero-ref    "field V19.Low64 (fldOffset=0x0)" P-DEP
+;* V53 tmp52        [V53    ] (  0,  0   )    long  ->  zero-ref    "field V19.High64 (fldOffset=0x8)" P-DEP
+;* V54 tmp53        [V54    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;* V55 tmp54        [V55    ] (  0,  0   )     int  ->  zero-ref    "field V20._length (fldOffset=0x8)" P-INDEP
+;* V56 tmp55        [V56    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V21._reference (fldOffset=0x0)" P-INDEP
+;* V57 tmp56        [V57    ] (  0,  0   )     int  ->  zero-ref    "field V21._length (fldOffset=0x8)" P-INDEP
+;* V58 tmp57        [V58    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V22._reference (fldOffset=0x0)" P-INDEP
+;* V59 tmp58        [V59    ] (  0,  0   )     int  ->  zero-ref    "field V22._length (fldOffset=0x8)" P-INDEP
+;* V60 tmp59        [V60    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V23._reference (fldOffset=0x0)" P-INDEP
+;* V61 tmp60        [V61    ] (  0,  0   )     int  ->  zero-ref    "field V23._length (fldOffset=0x8)" P-INDEP
+;  V62 tmp61        [V62,T07] (  3,  3   )   byref  ->  rdi         single-def "field V24._reference (fldOffset=0x0)" P-INDEP
+;* V63 tmp62        [V63,T12] (  0,  0   )     int  ->  zero-ref    "field V24._length (fldOffset=0x8)" P-INDEP
+;  V64 tmp63        [V64,T09] (  2,  2   )   byref  ->  rsi         single-def "field V26._reference (fldOffset=0x0)" P-INDEP
+;* V65 tmp64        [V65    ] (  0,  0   )     int  ->  zero-ref    "field V26._length (fldOffset=0x8)" P-INDEP
+;* V66 tmp65        [V66    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V30._reference (fldOffset=0x0)" P-INDEP
+;* V67 tmp66        [V67    ] (  0,  0   )     int  ->  zero-ref    "field V30._length (fldOffset=0x8)" P-INDEP
+;* V68 tmp67        [V68    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V31._reference (fldOffset=0x0)" P-INDEP
+;* V69 tmp68        [V69    ] (  0,  0   )     int  ->  zero-ref    "field V31._length (fldOffset=0x8)" P-INDEP
+;  V70 tmp69        [V70,T01] (  5,  6   )    long  ->  rdi         "Cast away GC"
 ;
 ; Lcl frame size = 16
 
 G_M4735_IG01:
        push     rbp
        push     r15
        push     r14
        push     r13
        push     rbx
        sub      rsp, 16
        lea      rbp, [rsp+0x30]
        xor      eax, eax
        mov      qword ptr [rbp-0x28], rax
 						;; size=23 bbWeight=1 PerfScore 7.00
 G_M4735_IG02:
        test     rdi, rdi
        je       G_M4735_IG09
        lea      rbx, bword ptr [rdi+0x10]
        mov      r15d, dword ptr [rdi+0x08]
        mov      rdi, 0xD1FFAB1E      ; ubyte[]
        mov      esi, 16
        call     CORINFO_HELP_NEWARR_1_VC
        mov      r14, rax
        lea      r13, bword ptr [r14+0x10]
        mov      bword ptr [rbp-0x28], rbx
        mov      rdi, rbx
        cmp      r15d, 16
        jle      SHORT G_M4735_IG06
 						;; size=57 bbWeight=1 PerfScore 8.50
 G_M4735_IG03:
        cmp      r15d, 128
        jle      SHORT G_M4735_IG05
        cmp      r15d, 240
        jle      SHORT G_M4735_IG04
        mov      esi, r15d
        xor      edx, edx
        mov      rax, 0xD1FFAB1E      ; code for System.IO.Hashing.XxHash128:HashLengthOver240(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        call     [rax]System.IO.Hashing.XxHash128:HashLengthOver240(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        jmp      SHORT G_M4735_IG07
 						;; size=37 bbWeight=0.50 PerfScore 4.12
 G_M4735_IG04:
        mov      esi, r15d
        xor      edx, edx
        mov      rax, 0xD1FFAB1E      ; code for System.IO.Hashing.XxHash128:HashLength129To240(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        call     [rax]System.IO.Hashing.XxHash128:HashLength129To240(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        jmp      SHORT G_M4735_IG07
 						;; size=19 bbWeight=0.50 PerfScore 2.88
 G_M4735_IG05:
        mov      esi, r15d
        xor      edx, edx
        mov      rax, 0xD1FFAB1E      ; code for System.IO.Hashing.XxHash128:HashLength17To128(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        call     [rax]System.IO.Hashing.XxHash128:HashLength17To128(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        jmp      SHORT G_M4735_IG07
 						;; size=19 bbWeight=0.50 PerfScore 2.88
 G_M4735_IG06:
        mov      esi, r15d
        xor      edx, edx
        mov      rax, 0xD1FFAB1E      ; code for System.IO.Hashing.XxHash128:HashLength0To16(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
        call     [rax]System.IO.Hashing.XxHash128:HashLength0To16(ulong,uint,ulong):System.IO.Hashing.XxHash128+Hash128
 						;; size=17 bbWeight=0.50 PerfScore 1.88
 G_M4735_IG07:
        xor      rdi, rdi
        mov      bword ptr [rbp-0x28], rdi
+       mov      rdi, r13
+       lea      rsi, bword ptr [rdi+0x08]
        bswap    rax
-       mov      rdi, rdx
-       bswap    rdi
-       mov      qword ptr [r13], rdi
-       mov      qword ptr [r13+0x08], rax
+       mov      qword ptr [rsi], rax
+       mov      rsi, rdx
+       bswap    rsi
+       mov      qword ptr [rbp-0x30], rsi
+       mov      esi, 8
+       lea      rdx, [rbp-0x30]
+       mov      rax, 0xD1FFAB1E      ; code for System.Runtime.InteropServices.MemoryMarshal:Write[ulong](System.Span`1[ubyte],byref)
+       call     [rax]System.Runtime.InteropServices.MemoryMarshal:Write[ulong](System.Span`1[ubyte],byref)
        mov      rax, r14
-						;; size=26 bbWeight=1 PerfScore 5.75
+						;; size=53 bbWeight=1 PerfScore 10.50
 G_M4735_IG08:
        add      rsp, 16
        pop      rbx
        pop      r13
        pop      r14
        pop      r15
        pop      rbp
        ret      
 						;; size=13 bbWeight=1 PerfScore 3.75
 G_M4735_IG09:
        mov      edi, 193
        mov      rsi, 0xD1FFAB1E
        call     CORINFO_HELP_STRCNS
        mov      rdi, rax
        mov      rax, 0xD1FFAB1E      ; code for System.ArgumentNullException:Throw(System.String)
        call     [rax]System.ArgumentNullException:Throw(System.String)
        int3     
 						;; size=36 bbWeight=0.50 PerfScore 2.62
 
-; Total bytes of code 247, prolog size 23, PerfScore 39.38, instruction count 67, allocated bytes for code 247 (MethodHash=091aed80) for method System.IO.Hashing.XxHash128:Hash(ubyte[]):ubyte[] (FullOpts)
+; Total bytes of code 274, prolog size 23, PerfScore 44.12, instruction count 73, allocated bytes for code 274 (MethodHash=091aed80) for method System.IO.Hashing.XxHash128:Hash(ubyte[]):ubyte[] (FullOpts)
 ; ============================================================
9 (9.78 % of base) - System.IO.Hashing.Crc32:UpdateScalarArm32(uint,System.ReadOnlySpan`1[ubyte]):uint
 ; Assembly listing for method System.IO.Hashing.Crc32:UpdateScalarArm32(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX512 - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
 ; partially interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 4 single block inlinees; 3 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T01] (  5,  4   )     int  ->  rdi         single-def
+;  V00 arg0         [V00,T02] (  5,  4   )     int  ->  rdi         single-def
 ;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op single-def <System.ReadOnlySpan`1[ubyte]>
-;  V02 loc0         [V02,T06] (  2,  1   )   byref  ->  rbx         single-def
-;  V03 loc1         [V03,T03] (  5,  2.50)     int  ->  rax         single-def
-;* V04 loc2         [V04,T10] (  0,  0   )     int  ->  zero-ref    single-def
-;* V05 loc3         [V05,T09] (  0,  0   )     int  ->  zero-ref    single-def
-;# V06 OutArgs      [V06    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V07 tmp1         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
-;* V08 tmp2         [V08    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
-;  V09 tmp3         [V09,T04] (  2,  2   )   byref  ->  rsi         single-def "Inlining Arg"
-;  V10 tmp4         [V10,T05] (  2,  2   )     int  ->  rdx         "Inlining Arg"
-;  V11 tmp5         [V11,T02] (  5,  3   )   byref  ->  rsi         "field V01._reference (fldOffset=0x0)" P-INDEP
-;  V12 tmp6         [V12,T00] (  7,  5   )     int  ->  rdx         "field V01._length (fldOffset=0x8)" P-INDEP
-;* V13 tmp7         [V13    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V07._reference (fldOffset=0x0)" P-INDEP
-;* V14 tmp8         [V14    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
-;  V15 tmp9         [V15,T07] (  2,  1   )   byref  ->  rsi         single-def "field V08._reference (fldOffset=0x0)" P-INDEP
-;  V16 tmp10        [V16,T08] (  2,  1   )     int  ->  rdx         single-def "field V08._length (fldOffset=0x8)" P-INDEP
+;  V02 loc0         [V02,T03] (  5,  2.50)     int  ->  rax         single-def
+;* V03 loc1         [V03    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.ReadOnlySpan`1[uint]>
+;* V04 loc2         [V04,T08] (  0,  0   )     int  ->  zero-ref   
+;* V05 loc3         [V05    ] (  0,  0   )     int  ->  zero-ref   
+;* V06 loc4         [V06    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.ReadOnlySpan`1[ubyte]>
+;* V07 loc5         [V07    ] (  0,  0   )   ubyte  ->  zero-ref   
+;# V08 OutArgs      [V08    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
+;* V09 tmp1         [V09    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
+;* V10 tmp2         [V10    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;* V11 tmp3         [V11    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V12 tmp4         [V12    ] (  0,  0   )     int  ->  zero-ref    single-def "Inline stloc first use temp"
+;* V13 tmp5         [V13    ] (  0,  0   )     int  ->  zero-ref    single-def "Inline stloc first use temp"
+;* V14 tmp6         [V14    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
+;* V15 tmp7         [V15    ] (  0,  0   )     int  ->  zero-ref    single-def "Inline stloc first use temp"
+;  V16 tmp8         [V16,T11] (  2,  1   )     int  ->  rcx         single-def "Inline stloc first use temp"
+;* V17 tmp9         [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[uint]>
+;* V18 tmp10        [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
+;* V19 tmp11        [V19    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V20 tmp12        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;  V21 tmp13        [V21,T04] (  2,  2   )   byref  ->  rsi         single-def "Inlining Arg"
+;  V22 tmp14        [V22,T05] (  2,  2   )     int  ->  rdx         "Inlining Arg"
+;  V23 tmp15        [V23,T01] (  5,  3.50)   byref  ->  rsi         "field V01._reference (fldOffset=0x0)" P-INDEP
+;  V24 tmp16        [V24,T00] (  7,  5   )     int  ->  rdx         "field V01._length (fldOffset=0x8)" P-INDEP
+;  V25 tmp17        [V25,T09] (  2,  1   )   byref  ->  rbx         single-def "field V03._reference (fldOffset=0x0)" P-INDEP
+;  V26 tmp18        [V26,T12] (  2,  1   )     int  ->  rcx         single-def "field V03._length (fldOffset=0x8)" P-INDEP
+;  V27 tmp19        [V27,T07] (  2,  1.50)   byref  ->  rsi         single-def "field V06._reference (fldOffset=0x0)" P-INDEP
+;  V28 tmp20        [V28,T06] (  2,  2   )     int  ->  rax         single-def "field V06._length (fldOffset=0x8)" P-INDEP
+;* V29 tmp21        [V29    ] (  0,  0   )   byref  ->  zero-ref    "field V09._reference (fldOffset=0x0)" P-INDEP
+;* V30 tmp22        [V30    ] (  0,  0   )     int  ->  zero-ref    "field V09._length (fldOffset=0x8)" P-INDEP
+;* V31 tmp23        [V31    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V32 tmp24        [V32    ] (  0,  0   )     int  ->  zero-ref    single-def "field V10._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp25        [V33    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V14._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp26        [V34    ] (  0,  0   )     int  ->  zero-ref    single-def "field V14._length (fldOffset=0x8)" P-INDEP
+;* V35 tmp27        [V35,T15] (  0,  0   )   byref  ->  zero-ref    single-def "field V17._reference (fldOffset=0x0)" P-INDEP
+;  V36 tmp28        [V36,T13] (  2,  1   )     int  ->  rcx         single-def "field V17._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp29        [V37    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V18._reference (fldOffset=0x0)" P-INDEP
+;* V38 tmp30        [V38    ] (  0,  0   )     int  ->  zero-ref    "field V18._length (fldOffset=0x8)" P-INDEP
+;  V39 tmp31        [V39,T10] (  2,  1   )   byref  ->  rsi         single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;  V40 tmp32        [V40,T14] (  2,  1   )     int  ->  rdx         single-def "field V20._length (fldOffset=0x8)" P-INDEP
 ;
 ; Lcl frame size = 8
 
 G_M20306_IG01:
        push     rbp
        push     rbx
        push     rax
        lea      rbp, [rsp+0x10]
 						;; size=8 bbWeight=1 PerfScore 3.50
 G_M20306_IG02:
        cmp      edx, 4
        jl       SHORT G_M20306_IG04
 						;; size=5 bbWeight=1 PerfScore 1.25
 G_M20306_IG03:
-       mov      rbx, rsi
        mov      eax, edx
        and      eax, -4
-       jg       SHORT G_M20306_IG08
        cmp      eax, edx
-       ja       SHORT G_M20306_IG07
+       ja       SHORT G_M20306_IG08
+       mov      ecx, eax
+       shr      ecx, 2
+       mov      rbx, rsi
+       test     ecx, ecx
+       jg       SHORT G_M20306_IG07
        mov      ecx, eax
        add      rsi, rcx
        sub      edx, eax
-						;; size=21 bbWeight=0.50 PerfScore 1.88
+						;; size=28 bbWeight=0.50 PerfScore 2.38
 G_M20306_IG04:
-       test     edx, edx
+       mov      eax, edx
+       test     eax, eax
        jg       SHORT G_M20306_IG06
        mov      eax, edi
-						;; size=6 bbWeight=1 PerfScore 1.50
+						;; size=8 bbWeight=1 PerfScore 1.75
 G_M20306_IG05:
        add      rsp, 8
        pop      rbx
        pop      rbp
        ret      
 						;; size=7 bbWeight=1 PerfScore 2.25
 G_M20306_IG06:
        movzx    rsi, byte  ptr [rsi]
        mov      rax, 0xD1FFAB1E      ; code for System.Runtime.Intrinsics.Arm.Crc32:ComputeCrc32(uint,ubyte):uint
        call     [rax]System.Runtime.Intrinsics.Arm.Crc32:ComputeCrc32(uint,ubyte):uint
        int3     
 						;; size=17 bbWeight=0.50 PerfScore 2.75
 G_M20306_IG07:
-       mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
-       call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
-       int3     
-						;; size=13 bbWeight=0.50 PerfScore 1.75
-G_M20306_IG08:
        mov      esi, dword ptr [rbx]
        mov      rax, 0xD1FFAB1E      ; code for System.Runtime.Intrinsics.Arm.Crc32:ComputeCrc32(uint,uint):uint
        call     [rax]System.Runtime.Intrinsics.Arm.Crc32:ComputeCrc32(uint,uint):uint
        int3     
 						;; size=15 bbWeight=0.50 PerfScore 2.75
+G_M20306_IG08:
+       mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       int3     
+						;; size=13 bbWeight=0.50 PerfScore 1.75
 
-; Total bytes of code 92, prolog size 8, PerfScore 17.62, instruction count 33, allocated bytes for code 92 (MethodHash=8ac9b0ad) for method System.IO.Hashing.Crc32:UpdateScalarArm32(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
+; Total bytes of code 101, prolog size 8, PerfScore 18.38, instruction count 37, allocated bytes for code 101 (MethodHash=8ac9b0ad) for method System.IO.Hashing.Crc32:UpdateScalarArm32(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
 ; ============================================================
9 (9.68 % of base) - System.IO.Hashing.Crc32:UpdateScalarArm64(uint,System.ReadOnlySpan`1[ubyte]):uint
 ; Assembly listing for method System.IO.Hashing.Crc32:UpdateScalarArm64(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
 ; Emitting BLENDED_CODE for X64 with AVX512 - Unix
 ; FullOpts code
 ; optimized code
 ; rbp based frame
 ; partially interruptible
 ; No PGO data
-; 0 inlinees with PGO data; 2 single block inlinees; 1 inlinees without PGO data
+; 0 inlinees with PGO data; 4 single block inlinees; 3 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T01] (  5,  4   )     int  ->  rdi         single-def
+;  V00 arg0         [V00,T02] (  5,  4   )     int  ->  rdi         single-def
 ;* V01 arg1         [V01    ] (  0,  0   )  struct (16) zero-ref    multireg-arg ld-addr-op single-def <System.ReadOnlySpan`1[ubyte]>
-;  V02 loc0         [V02,T06] (  2,  1   )   byref  ->  rbx         single-def
-;  V03 loc1         [V03,T03] (  5,  2.50)     int  ->  rax         single-def
-;* V04 loc2         [V04,T10] (  0,  0   )     int  ->  zero-ref    single-def
-;* V05 loc3         [V05,T09] (  0,  0   )     int  ->  zero-ref    single-def
-;# V06 OutArgs      [V06    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V07 tmp1         [V07    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
-;* V08 tmp2         [V08    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
-;  V09 tmp3         [V09,T04] (  2,  2   )   byref  ->  rsi         single-def "Inlining Arg"
-;  V10 tmp4         [V10,T05] (  2,  2   )     int  ->  rdx         "Inlining Arg"
-;  V11 tmp5         [V11,T02] (  5,  3   )   byref  ->  rsi         "field V01._reference (fldOffset=0x0)" P-INDEP
-;  V12 tmp6         [V12,T00] (  7,  5   )     int  ->  rdx         "field V01._length (fldOffset=0x8)" P-INDEP
-;* V13 tmp7         [V13    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V07._reference (fldOffset=0x0)" P-INDEP
-;* V14 tmp8         [V14    ] (  0,  0   )     int  ->  zero-ref    "field V07._length (fldOffset=0x8)" P-INDEP
-;  V15 tmp9         [V15,T07] (  2,  1   )   byref  ->  rsi         single-def "field V08._reference (fldOffset=0x0)" P-INDEP
-;  V16 tmp10        [V16,T08] (  2,  1   )     int  ->  rdx         single-def "field V08._length (fldOffset=0x8)" P-INDEP
+;  V02 loc0         [V02,T03] (  5,  2.50)     int  ->  rax         single-def
+;* V03 loc1         [V03    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.ReadOnlySpan`1[ulong]>
+;* V04 loc2         [V04,T08] (  0,  0   )     int  ->  zero-ref   
+;* V05 loc3         [V05    ] (  0,  0   )    long  ->  zero-ref   
+;* V06 loc4         [V06    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op <System.ReadOnlySpan`1[ubyte]>
+;* V07 loc5         [V07    ] (  0,  0   )   ubyte  ->  zero-ref   
+;# V08 OutArgs      [V08    ] (  1,  1   )  struct ( 0) [rsp+0x00]  do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
+;* V09 tmp1         [V09    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument" <System.ReadOnlySpan`1[ubyte]>
+;* V10 tmp2         [V10    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;* V11 tmp3         [V11    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V12 tmp4         [V12    ] (  0,  0   )     int  ->  zero-ref    single-def "Inline stloc first use temp"
+;* V13 tmp5         [V13    ] (  0,  0   )     int  ->  zero-ref    single-def "Inline stloc first use temp"
+;* V14 tmp6         [V14    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
+;* V15 tmp7         [V15    ] (  0,  0   )     int  ->  zero-ref    single-def "Inline stloc first use temp"
+;  V16 tmp8         [V16,T11] (  2,  1   )     int  ->  rcx         single-def "Inline stloc first use temp"
+;* V17 tmp9         [V17    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ulong]>
+;* V18 tmp10        [V18    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg" <System.ReadOnlySpan`1[ubyte]>
+;* V19 tmp11        [V19    ] (  0,  0   )   byref  ->  zero-ref    "Inlining Arg"
+;* V20 tmp12        [V20    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp" <System.ReadOnlySpan`1[ubyte]>
+;  V21 tmp13        [V21,T04] (  2,  2   )   byref  ->  rsi         single-def "Inlining Arg"
+;  V22 tmp14        [V22,T05] (  2,  2   )     int  ->  rdx         "Inlining Arg"
+;  V23 tmp15        [V23,T01] (  5,  3.50)   byref  ->  rsi         "field V01._reference (fldOffset=0x0)" P-INDEP
+;  V24 tmp16        [V24,T00] (  7,  5   )     int  ->  rdx         "field V01._length (fldOffset=0x8)" P-INDEP
+;  V25 tmp17        [V25,T09] (  2,  1   )   byref  ->  rbx         single-def "field V03._reference (fldOffset=0x0)" P-INDEP
+;  V26 tmp18        [V26,T12] (  2,  1   )     int  ->  rcx         single-def "field V03._length (fldOffset=0x8)" P-INDEP
+;  V27 tmp19        [V27,T07] (  2,  1.50)   byref  ->  rsi         single-def "field V06._reference (fldOffset=0x0)" P-INDEP
+;  V28 tmp20        [V28,T06] (  2,  2   )     int  ->  rax         single-def "field V06._length (fldOffset=0x8)" P-INDEP
+;* V29 tmp21        [V29    ] (  0,  0   )   byref  ->  zero-ref    "field V09._reference (fldOffset=0x0)" P-INDEP
+;* V30 tmp22        [V30    ] (  0,  0   )     int  ->  zero-ref    "field V09._length (fldOffset=0x8)" P-INDEP
+;* V31 tmp23        [V31    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V10._reference (fldOffset=0x0)" P-INDEP
+;* V32 tmp24        [V32    ] (  0,  0   )     int  ->  zero-ref    single-def "field V10._length (fldOffset=0x8)" P-INDEP
+;* V33 tmp25        [V33    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V14._reference (fldOffset=0x0)" P-INDEP
+;* V34 tmp26        [V34    ] (  0,  0   )     int  ->  zero-ref    single-def "field V14._length (fldOffset=0x8)" P-INDEP
+;* V35 tmp27        [V35,T15] (  0,  0   )   byref  ->  zero-ref    single-def "field V17._reference (fldOffset=0x0)" P-INDEP
+;  V36 tmp28        [V36,T13] (  2,  1   )     int  ->  rcx         single-def "field V17._length (fldOffset=0x8)" P-INDEP
+;* V37 tmp29        [V37    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V18._reference (fldOffset=0x0)" P-INDEP
+;* V38 tmp30        [V38    ] (  0,  0   )     int  ->  zero-ref    "field V18._length (fldOffset=0x8)" P-INDEP
+;  V39 tmp31        [V39,T10] (  2,  1   )   byref  ->  rsi         single-def "field V20._reference (fldOffset=0x0)" P-INDEP
+;  V40 tmp32        [V40,T14] (  2,  1   )     int  ->  rdx         single-def "field V20._length (fldOffset=0x8)" P-INDEP
 ;
 ; Lcl frame size = 8
 
 G_M19441_IG01:
        push     rbp
        push     rbx
        push     rax
        lea      rbp, [rsp+0x10]
 						;; size=8 bbWeight=1 PerfScore 3.50
 G_M19441_IG02:
        cmp      edx, 8
        jl       SHORT G_M19441_IG04
 						;; size=5 bbWeight=1 PerfScore 1.25
 G_M19441_IG03:
-       mov      rbx, rsi
        mov      eax, edx
        and      eax, -8
-       jg       SHORT G_M19441_IG08
        cmp      eax, edx
-       ja       SHORT G_M19441_IG07
+       ja       SHORT G_M19441_IG08
+       mov      ecx, eax
+       shr      ecx, 3
+       mov      rbx, rsi
+       test     ecx, ecx
+       jg       SHORT G_M19441_IG07
        mov      ecx, eax
        add      rsi, rcx
        sub      edx, eax
-						;; size=21 bbWeight=0.50 PerfScore 1.88
+						;; size=28 bbWeight=0.50 PerfScore 2.38
 G_M19441_IG04:
-       test     edx, edx
+       mov      eax, edx
+       test     eax, eax
        jg       SHORT G_M19441_IG06
        mov      eax, edi
-						;; size=6 bbWeight=1 PerfScore 1.50
+						;; size=8 bbWeight=1 PerfScore 1.75
 G_M19441_IG05:
        add      rsp, 8
        pop      rbx
        pop      rbp
        ret      
 						;; size=7 bbWeight=1 PerfScore 2.25
 G_M19441_IG06:
        movzx    rsi, byte  ptr [rsi]
        mov      rax, 0xD1FFAB1E      ; code for System.Runtime.Intrinsics.Arm.Crc32:ComputeCrc32(uint,ubyte):uint
        call     [rax]System.Runtime.Intrinsics.Arm.Crc32:ComputeCrc32(uint,ubyte):uint
        int3     
 						;; size=17 bbWeight=0.50 PerfScore 2.75
 G_M19441_IG07:
-       mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
-       call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
-       int3     
-						;; size=13 bbWeight=0.50 PerfScore 1.75
-G_M19441_IG08:
        mov      rsi, qword ptr [rbx]
        mov      rax, 0xD1FFAB1E      ; code for System.Runtime.Intrinsics.Arm.Crc32+Arm64:ComputeCrc32(uint,ulong):uint
        call     [rax]System.Runtime.Intrinsics.Arm.Crc32+Arm64:ComputeCrc32(uint,ulong):uint
        int3     
 						;; size=16 bbWeight=0.50 PerfScore 2.75
+G_M19441_IG08:
+       mov      rax, 0xD1FFAB1E      ; code for System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       call     [rax]System.ThrowHelper:ThrowArgumentOutOfRangeException()
+       int3     
+						;; size=13 bbWeight=0.50 PerfScore 1.75
 
-; Total bytes of code 93, prolog size 8, PerfScore 17.62, instruction count 33, allocated bytes for code 93 (MethodHash=f047b40e) for method System.IO.Hashing.Crc32:UpdateScalarArm64(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
+; Total bytes of code 102, prolog size 8, PerfScore 18.38, instruction count 37, allocated bytes for code 102 (MethodHash=f047b40e) for method System.IO.Hashing.Crc32:UpdateScalarArm64(uint,System.ReadOnlySpan`1[ubyte]):uint (FullOpts)
 ; ============================================================

Larger list of diffs: https://gist.github.com/MihuBot/b422d820862f96fe1ba7543eb837836f

@MihuBot
Copy link
Owner Author

MihuBot commented Jan 29, 2025

@EgorBo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant