Browse Source

Use a loop instead.

pull/1554/head
James Jackson-South 5 years ago
parent
commit
a92c01fe50
  1. 61
      src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs

61
src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs

@ -561,53 +561,20 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
var vadd = Vector256.Create(.5F);
var vone = Vector256.Create(1f);
// V0
Vector256<float> vs0 = Unsafe.As<Vector4, Vector256<float>>(ref a.V0L);
Vector256<float> voff0 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs0), vone), vadd);
Vector256<float> v0 = Avx.Divide(vs0, Unsafe.As<Vector4, Vector256<float>>(ref b.V0L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V0L) = Avx.Add(v0, voff0);
// V1
Vector256<float> vs1 = Unsafe.As<Vector4, Vector256<float>>(ref a.V1L);
Vector256<float> voff1 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs1), vone), vadd);
Vector256<float> v1 = Avx.Divide(vs1, Unsafe.As<Vector4, Vector256<float>>(ref b.V1L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V1L) = Avx.Add(v1, voff1);
// V2
Vector256<float> vs2 = Unsafe.As<Vector4, Vector256<float>>(ref a.V2L);
Vector256<float> voff2 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs2), vone), vadd);
Vector256<float> v2 = Avx.Divide(vs2, Unsafe.As<Vector4, Vector256<float>>(ref b.V2L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V2L) = Avx.Add(v2, voff2);
// V3
Vector256<float> vs3 = Unsafe.As<Vector4, Vector256<float>>(ref a.V3L);
Vector256<float> voff3 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs3), vone), vadd);
Vector256<float> v3 = Avx.Divide(vs3, Unsafe.As<Vector4, Vector256<float>>(ref b.V3L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V3L) = Avx.Add(v3, voff3);
// V4
Vector256<float> vs4 = Unsafe.As<Vector4, Vector256<float>>(ref a.V4L);
Vector256<float> voff4 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs4), vone), vadd);
Vector256<float> v4 = Avx.Divide(vs4, Unsafe.As<Vector4, Vector256<float>>(ref b.V4L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V4L) = Avx.Add(v4, voff4);
// V5
Vector256<float> vs5 = Unsafe.As<Vector4, Vector256<float>>(ref a.V5L);
Vector256<float> voff5 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs5), vone), vadd);
Vector256<float> v5 = Avx.Divide(vs5, Unsafe.As<Vector4, Vector256<float>>(ref b.V5L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V5L) = Avx.Add(v5, voff5);
// V6
Vector256<float> vs6 = Unsafe.As<Vector4, Vector256<float>>(ref a.V6L);
Vector256<float> voff6 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs6), vone), vadd);
Vector256<float> v6 = Avx.Divide(vs6, Unsafe.As<Vector4, Vector256<float>>(ref b.V6L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V6L) = Avx.Add(v6, voff6);
// V7
Vector256<float> vs7 = Unsafe.As<Vector4, Vector256<float>>(ref a.V7L);
Vector256<float> voff7 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs7), vone), vadd);
Vector256<float> v7 = Avx.Divide(vs7, Unsafe.As<Vector4, Vector256<float>>(ref b.V7L));
Unsafe.As<Vector4, Vector256<float>>(ref a.V7L) = Avx.Add(v7, voff7);
ref Vector256<float> aBase = ref Unsafe.AsRef(Unsafe.As<Vector4, Vector256<float>>(ref a.V0L));
ref Vector256<float> bBase = ref Unsafe.AsRef(Unsafe.As<Vector4, Vector256<float>>(ref b.V0L));
ref Vector256<float> aEnd = ref Unsafe.Add(ref aBase, 8);
while (Unsafe.IsAddressLessThan(ref aBase, ref aEnd))
{
Vector256<float> va = Unsafe.Add(ref aBase, 0);
Vector256<float> voff = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, va), vone), vadd);
Vector256<float> vdiv = Avx.Divide(va, Unsafe.Add(ref bBase, 0));
Unsafe.Add(ref aBase, 0) = Avx.Add(Avx.Divide(va, Unsafe.Add(ref bBase, 0)), voff);
aBase = ref Unsafe.Add(ref aBase, 1);
bBase = ref Unsafe.Add(ref bBase, 1);
}
}
else
#endif

Loading…
Cancel
Save