///
/// This code is automatically generated by a T4 template.
/// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
///
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.Arm;
using System.Runtime.Intrinsics.X86;
namespace Misaki.HighPerformance.Mathematics.SPMD;
public static unsafe partial class MathV
{
# region Vector2
// Creation Functions
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Create(in TLane x, in TLane y)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = x,
y = y,
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 CreateVector2(in TLane value)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = value,
y = value,
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 LoadVector2(TNumber* pSrc)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Load(pSrc + 0),
y = TLane.Load(pSrc + 1),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 LoadVector2(ref TNumber src)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return LoadVector2((TNumber*)Unsafe.AsPointer(ref src));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 MaskLoadVector2(TNumber* pSrc, TLane mask)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.MaskLoad(pSrc + 0, mask),
y = TLane.MaskLoad(pSrc + 1, mask),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 MaskLoadVector2(ref TNumber src, TLane mask)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return MaskLoadVector2((TNumber*)Unsafe.AsPointer(ref src), mask);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Load(TNumber* px, TNumber* py)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Load(px),
y = TLane.Load(py),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Load(ref TNumber x, ref TNumber y)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Load(ref x),
y = TLane.Load(ref y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(TNumber* pData, TLane indices, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Gather(pData + 0, indices, scale),
y = TLane.Gather(pData + 1, indices, scale),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(TNumber* pData, int* pIndices, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Gather(pData + 0, pIndices, scale),
y = TLane.Gather(pData + 1, pIndices, scale),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(ref TNumber baseAddress, TLane indices, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return GatherVector2((TNumber*)Unsafe.AsPointer(ref baseAddress), indices, scale);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(ref TNumber baseAddress, ref int baseIndex, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return GatherVector2((TNumber*)Unsafe.AsPointer(ref baseAddress), (int*)Unsafe.AsPointer(ref baseIndex), scale);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 MaskGatherVector2(TNumber* pData, TLane indices, TLane mask, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.MaskGather(pData + 0, indices, mask, scale),
y = TLane.MaskGather(pData + 1, indices, mask, scale),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 MaskGatherVector2(TNumber* pData, int* pIndices, TLane mask, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.MaskGather(pData + 0, pIndices, mask, scale),
y = TLane.MaskGather(pData + 1, pIndices, mask, scale),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 MaskGatherVector2(ref TNumber baseAddress, TLane indices, TLane mask, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return MaskGatherVector2((TNumber*)Unsafe.AsPointer(ref baseAddress), indices, mask, scale);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 MaskGatherVector2(ref TNumber baseAddress, ref int baseIndex, TLane mask, [ConstantExpected(Min = (byte)(1), Max = (byte)(8))] byte scale)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return MaskGatherVector2((TNumber*)Unsafe.AsPointer(ref baseAddress), (int*)Unsafe.AsPointer(ref baseIndex), mask, scale);
}
// Math Functions
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Abs(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Abs(vector.x),
y = TLane.Abs(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TLane Dot(in Vector2 a, in Vector2 b)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return a.x * b.x + a.y * b.y;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Sin(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Sin(vector.x),
y = TLane.Sin(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Cos(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Cos(vector.x),
y = TLane.Cos(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SinCos(in Vector2 vector, out Vector2 sin, out Vector2 cos)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
TLane.SinCos(vector.x, out sin.x, out cos.x);
TLane.SinCos(vector.y, out sin.y, out cos.y);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Sqrt(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Sqrt(vector.x),
y = TLane.Sqrt(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Tan(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Tan(vector.x),
y = TLane.Tan(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Asin(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Asin(vector.x),
y = TLane.Asin(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Acos(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Acos(vector.x),
y = TLane.Acos(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Atan(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Atan(vector.x),
y = TLane.Atan(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Atan2(in Vector2 x, in Vector2 y)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Atan2(x.x, y.x),
y = TLane.Atan2(x.y, y.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Rsqrt(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Rsqrt(vector.x),
y = TLane.Rsqrt(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Normalize(in Vector2 vector)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return vector * TLane.Rsqrt(Dot(vector, vector));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Reflect(in Vector2 incident, in Vector2 normal)
where TLane : unmanaged, ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var dot = Dot(incident, normal);
return incident - normal * (dot + dot);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Min