|
|
|
@ -3,13 +3,14 @@ |
|
|
|
|
|
|
|
using System.Numerics; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using System.Runtime.Intrinsics; |
|
|
|
|
|
|
|
// <auto-generated />
|
|
|
|
namespace SixLabors.ImageSharp.Formats.Jpeg.Components; |
|
|
|
|
|
|
|
internal partial struct Block8x8F |
|
|
|
{ |
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Level shift by +maximum/2, clip to [0, maximum]
|
|
|
|
/// </summary>
|
|
|
|
public void NormalizeColorsInPlace(float maximum) |
|
|
|
@ -37,38 +38,66 @@ internal partial struct Block8x8F |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// AVX2-only variant for executing <see cref="NormalizeColorsInPlace"/> and <see cref="RoundInPlace"/> in one step.
|
|
|
|
/// <see cref="Vector256{Single}"/> version of <see cref="NormalizeColorsInPlace(float)"/> and <see cref="RoundInPlace()"/>.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="maximum">The maximum value to normalize to.</param>
|
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void NormalizeColorsAndRoundInPlaceVector8(float maximum) |
|
|
|
public void NormalizeColorsAndRoundInPlaceVector256(float maximum) |
|
|
|
{ |
|
|
|
var off = new Vector<float>(MathF.Ceiling(maximum * 0.5F)); |
|
|
|
var max = new Vector<float>(maximum); |
|
|
|
|
|
|
|
ref Vector<float> row0 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V0L); |
|
|
|
row0 = NormalizeAndRound(row0, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row1 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V1L); |
|
|
|
row1 = NormalizeAndRound(row1, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row2 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V2L); |
|
|
|
row2 = NormalizeAndRound(row2, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row3 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V3L); |
|
|
|
row3 = NormalizeAndRound(row3, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row4 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V4L); |
|
|
|
row4 = NormalizeAndRound(row4, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row5 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V5L); |
|
|
|
row5 = NormalizeAndRound(row5, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row6 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V6L); |
|
|
|
row6 = NormalizeAndRound(row6, off, max); |
|
|
|
|
|
|
|
ref Vector<float> row7 = ref Unsafe.As<Vector4, Vector<float>>(ref this.V7L); |
|
|
|
row7 = NormalizeAndRound(row7, off, max); |
|
|
|
|
|
|
|
Vector256<float> off = Vector256.Create(MathF.Ceiling(maximum * 0.5F)); |
|
|
|
Vector256<float> max = Vector256.Create(maximum); |
|
|
|
|
|
|
|
ref Vector256<float> row0 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V0L); |
|
|
|
row0 = NormalizeAndRoundVector256(row0, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row1 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V1L); |
|
|
|
row1 = NormalizeAndRoundVector256(row1, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row2 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V2L); |
|
|
|
row2 = NormalizeAndRoundVector256(row2, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row3 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V3L); |
|
|
|
row3 = NormalizeAndRoundVector256(row3, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row4 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V4L); |
|
|
|
row4 = NormalizeAndRoundVector256(row4, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row5 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V5L); |
|
|
|
row5 = NormalizeAndRoundVector256(row5, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row6 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V6L); |
|
|
|
row6 = NormalizeAndRoundVector256(row6, off, max); |
|
|
|
|
|
|
|
ref Vector256<float> row7 = ref Unsafe.As<Vector4, Vector256<float>>(ref this.V7L); |
|
|
|
row7 = NormalizeAndRoundVector256(row7, off, max); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <see cref="Vector128{Single}"/> version of <see cref="NormalizeColorsInPlace(float)"/> and <see cref="RoundInPlace()"/>.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="maximum">The maximum value to normalize to.</param>
|
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void NormalizeColorsAndRoundInPlaceVector128(float maximum) |
|
|
|
{ |
|
|
|
Vector128<float> off = Vector128.Create(MathF.Ceiling(maximum * 0.5F)); |
|
|
|
Vector128<float> max = Vector128.Create(maximum); |
|
|
|
|
|
|
|
this.V0L = NormalizeAndRoundVector128(this.V0L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V0R = NormalizeAndRoundVector128(this.V0R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V1L = NormalizeAndRoundVector128(this.V1L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V1R = NormalizeAndRoundVector128(this.V1R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V2L = NormalizeAndRoundVector128(this.V2L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V2R = NormalizeAndRoundVector128(this.V2R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V3L = NormalizeAndRoundVector128(this.V3L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V3R = NormalizeAndRoundVector128(this.V3R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V4L = NormalizeAndRoundVector128(this.V4L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V4R = NormalizeAndRoundVector128(this.V4R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V5L = NormalizeAndRoundVector128(this.V5L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V5R = NormalizeAndRoundVector128(this.V5R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V6L = NormalizeAndRoundVector128(this.V6L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V6R = NormalizeAndRoundVector128(this.V6R.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V7L = NormalizeAndRoundVector128(this.V7L.AsVector128(), off, max).AsVector4(); |
|
|
|
this.V7R = NormalizeAndRoundVector128(this.V7R.AsVector128(), off, max).AsVector4(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -78,76 +107,76 @@ internal partial struct Block8x8F |
|
|
|
{ |
|
|
|
ref short selfRef = ref Unsafe.As<Block8x8, short>(ref source); |
|
|
|
|
|
|
|
this.V0L.X = Unsafe.Add(ref selfRef, 0); |
|
|
|
this.V0L.Y = Unsafe.Add(ref selfRef, 1); |
|
|
|
this.V0L.Z = Unsafe.Add(ref selfRef, 2); |
|
|
|
this.V0L.W = Unsafe.Add(ref selfRef, 3); |
|
|
|
this.V0R.X = Unsafe.Add(ref selfRef, 4); |
|
|
|
this.V0R.Y = Unsafe.Add(ref selfRef, 5); |
|
|
|
this.V0R.Z = Unsafe.Add(ref selfRef, 6); |
|
|
|
this.V0R.W = Unsafe.Add(ref selfRef, 7); |
|
|
|
|
|
|
|
this.V1L.X = Unsafe.Add(ref selfRef, 8); |
|
|
|
this.V1L.Y = Unsafe.Add(ref selfRef, 9); |
|
|
|
this.V1L.Z = Unsafe.Add(ref selfRef, 10); |
|
|
|
this.V1L.W = Unsafe.Add(ref selfRef, 11); |
|
|
|
this.V1R.X = Unsafe.Add(ref selfRef, 12); |
|
|
|
this.V1R.Y = Unsafe.Add(ref selfRef, 13); |
|
|
|
this.V1R.Z = Unsafe.Add(ref selfRef, 14); |
|
|
|
this.V1R.W = Unsafe.Add(ref selfRef, 15); |
|
|
|
|
|
|
|
this.V2L.X = Unsafe.Add(ref selfRef, 16); |
|
|
|
this.V2L.Y = Unsafe.Add(ref selfRef, 17); |
|
|
|
this.V2L.Z = Unsafe.Add(ref selfRef, 18); |
|
|
|
this.V2L.W = Unsafe.Add(ref selfRef, 19); |
|
|
|
this.V2R.X = Unsafe.Add(ref selfRef, 20); |
|
|
|
this.V2R.Y = Unsafe.Add(ref selfRef, 21); |
|
|
|
this.V2R.Z = Unsafe.Add(ref selfRef, 22); |
|
|
|
this.V2R.W = Unsafe.Add(ref selfRef, 23); |
|
|
|
|
|
|
|
this.V3L.X = Unsafe.Add(ref selfRef, 24); |
|
|
|
this.V3L.Y = Unsafe.Add(ref selfRef, 25); |
|
|
|
this.V3L.Z = Unsafe.Add(ref selfRef, 26); |
|
|
|
this.V3L.W = Unsafe.Add(ref selfRef, 27); |
|
|
|
this.V3R.X = Unsafe.Add(ref selfRef, 28); |
|
|
|
this.V3R.Y = Unsafe.Add(ref selfRef, 29); |
|
|
|
this.V3R.Z = Unsafe.Add(ref selfRef, 30); |
|
|
|
this.V3R.W = Unsafe.Add(ref selfRef, 31); |
|
|
|
|
|
|
|
this.V4L.X = Unsafe.Add(ref selfRef, 32); |
|
|
|
this.V4L.Y = Unsafe.Add(ref selfRef, 33); |
|
|
|
this.V4L.Z = Unsafe.Add(ref selfRef, 34); |
|
|
|
this.V4L.W = Unsafe.Add(ref selfRef, 35); |
|
|
|
this.V4R.X = Unsafe.Add(ref selfRef, 36); |
|
|
|
this.V4R.Y = Unsafe.Add(ref selfRef, 37); |
|
|
|
this.V4R.Z = Unsafe.Add(ref selfRef, 38); |
|
|
|
this.V4R.W = Unsafe.Add(ref selfRef, 39); |
|
|
|
|
|
|
|
this.V5L.X = Unsafe.Add(ref selfRef, 40); |
|
|
|
this.V5L.Y = Unsafe.Add(ref selfRef, 41); |
|
|
|
this.V5L.Z = Unsafe.Add(ref selfRef, 42); |
|
|
|
this.V5L.W = Unsafe.Add(ref selfRef, 43); |
|
|
|
this.V5R.X = Unsafe.Add(ref selfRef, 44); |
|
|
|
this.V5R.Y = Unsafe.Add(ref selfRef, 45); |
|
|
|
this.V5R.Z = Unsafe.Add(ref selfRef, 46); |
|
|
|
this.V5R.W = Unsafe.Add(ref selfRef, 47); |
|
|
|
|
|
|
|
this.V6L.X = Unsafe.Add(ref selfRef, 48); |
|
|
|
this.V6L.Y = Unsafe.Add(ref selfRef, 49); |
|
|
|
this.V6L.Z = Unsafe.Add(ref selfRef, 50); |
|
|
|
this.V6L.W = Unsafe.Add(ref selfRef, 51); |
|
|
|
this.V6R.X = Unsafe.Add(ref selfRef, 52); |
|
|
|
this.V6R.Y = Unsafe.Add(ref selfRef, 53); |
|
|
|
this.V6R.Z = Unsafe.Add(ref selfRef, 54); |
|
|
|
this.V6R.W = Unsafe.Add(ref selfRef, 55); |
|
|
|
|
|
|
|
this.V7L.X = Unsafe.Add(ref selfRef, 56); |
|
|
|
this.V7L.Y = Unsafe.Add(ref selfRef, 57); |
|
|
|
this.V7L.Z = Unsafe.Add(ref selfRef, 58); |
|
|
|
this.V7L.W = Unsafe.Add(ref selfRef, 59); |
|
|
|
this.V7R.X = Unsafe.Add(ref selfRef, 60); |
|
|
|
this.V7R.Y = Unsafe.Add(ref selfRef, 61); |
|
|
|
this.V7R.Z = Unsafe.Add(ref selfRef, 62); |
|
|
|
this.V7R.W = Unsafe.Add(ref selfRef, 63); |
|
|
|
this.V0L.X = Unsafe.Add(ref selfRef, 0); |
|
|
|
this.V0L.Y = Unsafe.Add(ref selfRef, 1); |
|
|
|
this.V0L.Z = Unsafe.Add(ref selfRef, 2); |
|
|
|
this.V0L.W = Unsafe.Add(ref selfRef, 3); |
|
|
|
this.V0R.X = Unsafe.Add(ref selfRef, 4); |
|
|
|
this.V0R.Y = Unsafe.Add(ref selfRef, 5); |
|
|
|
this.V0R.Z = Unsafe.Add(ref selfRef, 6); |
|
|
|
this.V0R.W = Unsafe.Add(ref selfRef, 7); |
|
|
|
|
|
|
|
this.V1L.X = Unsafe.Add(ref selfRef, 8); |
|
|
|
this.V1L.Y = Unsafe.Add(ref selfRef, 9); |
|
|
|
this.V1L.Z = Unsafe.Add(ref selfRef, 10); |
|
|
|
this.V1L.W = Unsafe.Add(ref selfRef, 11); |
|
|
|
this.V1R.X = Unsafe.Add(ref selfRef, 12); |
|
|
|
this.V1R.Y = Unsafe.Add(ref selfRef, 13); |
|
|
|
this.V1R.Z = Unsafe.Add(ref selfRef, 14); |
|
|
|
this.V1R.W = Unsafe.Add(ref selfRef, 15); |
|
|
|
|
|
|
|
this.V2L.X = Unsafe.Add(ref selfRef, 16); |
|
|
|
this.V2L.Y = Unsafe.Add(ref selfRef, 17); |
|
|
|
this.V2L.Z = Unsafe.Add(ref selfRef, 18); |
|
|
|
this.V2L.W = Unsafe.Add(ref selfRef, 19); |
|
|
|
this.V2R.X = Unsafe.Add(ref selfRef, 20); |
|
|
|
this.V2R.Y = Unsafe.Add(ref selfRef, 21); |
|
|
|
this.V2R.Z = Unsafe.Add(ref selfRef, 22); |
|
|
|
this.V2R.W = Unsafe.Add(ref selfRef, 23); |
|
|
|
|
|
|
|
this.V3L.X = Unsafe.Add(ref selfRef, 24); |
|
|
|
this.V3L.Y = Unsafe.Add(ref selfRef, 25); |
|
|
|
this.V3L.Z = Unsafe.Add(ref selfRef, 26); |
|
|
|
this.V3L.W = Unsafe.Add(ref selfRef, 27); |
|
|
|
this.V3R.X = Unsafe.Add(ref selfRef, 28); |
|
|
|
this.V3R.Y = Unsafe.Add(ref selfRef, 29); |
|
|
|
this.V3R.Z = Unsafe.Add(ref selfRef, 30); |
|
|
|
this.V3R.W = Unsafe.Add(ref selfRef, 31); |
|
|
|
|
|
|
|
this.V4L.X = Unsafe.Add(ref selfRef, 32); |
|
|
|
this.V4L.Y = Unsafe.Add(ref selfRef, 33); |
|
|
|
this.V4L.Z = Unsafe.Add(ref selfRef, 34); |
|
|
|
this.V4L.W = Unsafe.Add(ref selfRef, 35); |
|
|
|
this.V4R.X = Unsafe.Add(ref selfRef, 36); |
|
|
|
this.V4R.Y = Unsafe.Add(ref selfRef, 37); |
|
|
|
this.V4R.Z = Unsafe.Add(ref selfRef, 38); |
|
|
|
this.V4R.W = Unsafe.Add(ref selfRef, 39); |
|
|
|
|
|
|
|
this.V5L.X = Unsafe.Add(ref selfRef, 40); |
|
|
|
this.V5L.Y = Unsafe.Add(ref selfRef, 41); |
|
|
|
this.V5L.Z = Unsafe.Add(ref selfRef, 42); |
|
|
|
this.V5L.W = Unsafe.Add(ref selfRef, 43); |
|
|
|
this.V5R.X = Unsafe.Add(ref selfRef, 44); |
|
|
|
this.V5R.Y = Unsafe.Add(ref selfRef, 45); |
|
|
|
this.V5R.Z = Unsafe.Add(ref selfRef, 46); |
|
|
|
this.V5R.W = Unsafe.Add(ref selfRef, 47); |
|
|
|
|
|
|
|
this.V6L.X = Unsafe.Add(ref selfRef, 48); |
|
|
|
this.V6L.Y = Unsafe.Add(ref selfRef, 49); |
|
|
|
this.V6L.Z = Unsafe.Add(ref selfRef, 50); |
|
|
|
this.V6L.W = Unsafe.Add(ref selfRef, 51); |
|
|
|
this.V6R.X = Unsafe.Add(ref selfRef, 52); |
|
|
|
this.V6R.Y = Unsafe.Add(ref selfRef, 53); |
|
|
|
this.V6R.Z = Unsafe.Add(ref selfRef, 54); |
|
|
|
this.V6R.W = Unsafe.Add(ref selfRef, 55); |
|
|
|
|
|
|
|
this.V7L.X = Unsafe.Add(ref selfRef, 56); |
|
|
|
this.V7L.Y = Unsafe.Add(ref selfRef, 57); |
|
|
|
this.V7L.Z = Unsafe.Add(ref selfRef, 58); |
|
|
|
this.V7L.W = Unsafe.Add(ref selfRef, 59); |
|
|
|
this.V7R.X = Unsafe.Add(ref selfRef, 60); |
|
|
|
this.V7R.Y = Unsafe.Add(ref selfRef, 61); |
|
|
|
this.V7R.Z = Unsafe.Add(ref selfRef, 62); |
|
|
|
this.V7R.W = Unsafe.Add(ref selfRef, 63); |
|
|
|
} |
|
|
|
} |
|
|
|
|