¿Cuáles son estas instrucciones adicionales de desmontaje cuando se utilizan intrínsecos SIMD?

Estoy probando qué tipo de aceleración puedo obtener al usar las instrucciones SIMD con RyuJIT y veo algunas instrucciones de desmontaje que no espero. Estoy basando el código enesta publicación de blog del equipo Kevin Frei de RyuJIT y una publicación relacionadaaquí. Aquí está la función:

static void AddPointwiseSimd(float[] a, float[] b) {
    int simdLength = Vector<float>.Count;
    int i = 0;
    for (i = 0; i < a.Length - simdLength; i += simdLength) {
        Vector<float> va = new Vector<float>(a, i);
        Vector<float> vb = new Vector<float>(b, i);
        va += vb;
        va.CopyTo(a, i);
    }
}

La sección de desmontaje que estoy consultando copia los valores de la matriz en elVector<float>. La mayor parte del desensamblaje es similar al de las publicaciones de Kevin y Sasha, pero he resaltado algunas instrucciones adicionales (junto con mis confusas anotaciones) que no aparecen en sus desensamblajes:

;// Vector<float> va = new Vector<float>(a, i);
  cmp eax,r8d              ; <-- Unexpected - Compare a.Length to i?
  jae 00007FFB17DB6D5F     ; <-- Unexpected - Jump to range check failure
  lea r10d,[rax+3] 
  cmp r10d,r8d 
  jae 00007FFB17DB6D5F 
  mov r11,rcx              ; <-- Unexpected - Extra register copy?
  movups xmm0,xmmword ptr [r11+rax*4+10h  ]

;// Vector<float> vb = new Vector<float>(b, i);
  cmp eax,r9d              ; <-- Unexpected - Compare b.Length to i?
  jae 00007FFB17DB6D5F     ; <-- Unexpected - Jump to range check failure
  cmp r10d,r9d 
  jae 00007FFB17DB6D5F 
  movups xmm1,xmmword ptr [rdx+rax*4+10h]

Tenga en cuenta que la verificación del rango del bucle es la esperada:

;// for (i = 0; i < a.Length - simdLength; i += simdLength) {
  add eax,4  
  cmp r9d,eax  
  jg loop

así que no sé por qué hay comparaciones adicionales paraeax. ¿Alguien puede explicar por qué estoy viendo estas instrucciones adicionales y si es posible deshacerse de ellas?

En caso de que esté relacionado con la configuración del proyecto, tengo un proyecto muy similar que muestra el mismo problemaaquí en github (verFloatSimdProcessor.HwAcceleratedSumInPlace() oUShortSimdProcessor.HwAcceleratedSumInPlaceUnchecked())

Respuestas a la pregunta(1)

Su respuesta a la pregunta