This commit is contained in:
Jorijn van der Graaf 2026-03-31 14:22:18 +02:00
commit a16f8ffbde
7 changed files with 251 additions and 133 deletions

View file

@ -90,7 +90,7 @@ std::string* TestAllCombinations() {
if constexpr(total > 0 && (total & (total - 1)) == 0) {
{
VectorType<Len, Packing> vec(floats);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i])) {
return new std::string(std::format("Load/Store mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i]), (float)stored[i]));
@ -101,7 +101,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec + vec;
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i] + floats[i])) {
return new std::string(std::format("Add mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i] + floats[i]), (float)stored[i]));
@ -112,7 +112,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec - vec;
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], T(0))) {
return new std::string(std::format("Subtract mismatch at Len={} Packing={}, Expected: 0, Got: {}", Len, Packing, (float)stored[i]));
@ -123,7 +123,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec * vec;
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i] * floats[i])) {
return new std::string(std::format("Multiply mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i] * floats[i]), (float)stored[i]));
@ -134,7 +134,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec / vec;
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], T(1))) {
return new std::string(std::format("Divide mismatch at Len={} Packing={}, Expected: 1, Got: {}", Len, Packing, (float)stored[i]));
@ -145,7 +145,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec + T(2);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i] + T(2))) {
return new std::string(std::format("Scalar add mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i] + T(2)), (float)stored[i]));
@ -156,7 +156,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec - T(2);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i] - T(2))) {
return new std::string(std::format("Scalar add mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i] + T(2)), (float)stored[i]));
@ -167,7 +167,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec * T(2);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i] * T(2))) {
return new std::string(std::format("Scalar multiply mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i] * T(2)), (float)stored[i]));
@ -178,7 +178,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = vec / T(2);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(stored[i], floats[i] / T(2))) {
return new std::string(std::format("Scalar divide mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(floats[i] * T(2)), (float)stored[i]));
@ -225,7 +225,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
vec = -vec;
std::array<T, VectorType<Len, Packing>::AlignmentElement> result = vec.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> result = vec.template Store<T>();
for (std::uint32_t i = 0; i < Len * Packing; i++) {
if (!FloatEquals(result[i], -floats[i])) {
return new std::string(std::format("Negate mismatch at Len={} Packing={}, Expected: {}, Got: {}", Len, Packing, (float)(-floats[i]), (float)result[i]));
@ -237,7 +237,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecA(floats1);
VectorType<Len, Packing> vecB(floats2);
VectorType<Len, Packing> result = VectorType<Len, Packing>::template Blend<AlternateTrueFalse<Len>()>(vecA, vecB);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for (std::uint32_t i = 0; i < Len; i++) {
bool useB = (i % 2 == 0);
T expected = useB ? floats2[i]: floats1[i];
@ -252,7 +252,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecB(floats);
VectorType<Len, Packing> vecAdd(floats);
VectorType<Len, Packing> result = VectorType<Len, Packing>::MulitplyAdd(vecA, vecB, vecAdd);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for (std::uint32_t i = 0; i < Len; i++) {
T expected = floats[i] * floats[i] + floats[i];
if (!FloatEquals(stored[i], expected)) {
@ -266,7 +266,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecB(floats);
VectorType<Len, Packing> vecSub(floats);
VectorType<Len, Packing> result = VectorType<Len, Packing>::MulitplySub(vecA, vecB, vecSub);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for (std::uint32_t i = 0; i < Len; i++) {
T expected = floats[i] * floats[i] - floats[i];
if (!FloatEquals(stored[i], expected)) {
@ -278,7 +278,7 @@ std::string* TestAllCombinations() {
if constexpr(Len > 2){
VectorType<Len, Packing> vec(floats);
VectorType<Len-1, Packing> result = vec.template ExtractLo<Len-1>();
std::array<T, VectorType<Len-1, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len-1, Packing>::AlignmentElement> stored = result.template Store<T>();
for(std::uint32_t i2 = 0; i2 < Packing; i2++){
for (std::uint32_t i = 0; i < Len-1; i++) {
T expected = floats[i2*(Len)+i];
@ -292,7 +292,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
VectorType<Len, Packing> result = vec.Sin();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for(std::uint32_t i2 = 0; i2 < Packing; i2++){
for (std::uint32_t i = 0; i < Len; i++) {
T expected = (T)std::sin((float)floats[i2*Len+i]);
@ -306,7 +306,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
VectorType<Len, Packing> result = vec.Cos();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for(std::uint32_t i2 = 0; i2 < Packing; i2++){
for (std::uint32_t i = 0; i < Len; i++) {
T expected = (T)std::cos((float)floats[i2*Len+i]);
@ -320,8 +320,8 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
auto result = vec.SinCos();
std::array<T, VectorType<Len, Packing>::AlignmentElement> storedSin = std::get<0>(result).Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> storedCos = std::get<1>(result).Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> storedSin = std::get<0>(result).template Store<T>();
std::array<T, VectorType<Len, Packing>::AlignmentElement> storedCos = std::get<1>(result).template Store<T>();
for(std::uint32_t i2 = 0; i2 < Packing; i2++){
for (std::uint32_t i = 0; i < Len; i++) {
T expected = (T)std::sin((float)floats[i2*Len+i]);
@ -340,7 +340,7 @@ std::string* TestAllCombinations() {
{
VectorType<Len, Packing> vec(floats);
VectorType<Len, Packing> result = vec.template Shuffle<GetCountReverse<Len>()>();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for (std::uint32_t i = 0; i < Len; i++) {
T expected = floats[Len - 1 - i];
if (!FloatEquals(stored[i], expected)) {
@ -355,9 +355,9 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vec1(floats1);
VectorType<Len, Packing> vec2(floats2);
VectorType<Len, Packing> result = VectorType<Len, Packing>::Cross(vec1, vec2);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], T(-3)) || !FloatEquals(stored[1], T(6)) || !FloatEquals(stored[2], T(-3))) {
return new std::string(std::format("Cross mismatch at Len={} Packing={}, Expected: -3,6,-3, Got: {},{},{}", Len, Packing, (float)stored[0], (float)stored[1], (float)stored[2]));
return new std::string(std::format("Cross mismatch at Len={} Packing={}, Expected: -3,6,-3, Got: {},{},{}", Len, Packing, (float)stored[0], (float)stored[1], (float)stored[2]));
}
}
if constexpr(4 * Packing < VectorType<1, 1>::MaxElement) {
@ -370,7 +370,7 @@ std::string* TestAllCombinations() {
VectorType<3, Packing> vecV(floats);
VectorType<4, Packing> vecQ(qData);
VectorType<3, Packing> result = VectorType<3, Packing>::Rotate(vecV, vecQ);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
for (std::uint32_t i = 0; i < 3; i++) {
if (!FloatEquals(stored[i], floats[i])) {
@ -389,7 +389,7 @@ std::string* TestAllCombinations() {
}
VectorType<3, Packing> eulerVec(eulerData);
VectorType<4, Packing> result = VectorType<4, Packing>::QuanternionFromEuler(eulerVec);
std::array<T, VectorType<4, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<4, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], T(0.63720703)) || !FloatEquals(stored[1], T(0.30688477)) ||
!FloatEquals(stored[2], T(0.14074707)) || !FloatEquals(stored[3], T(0.6933594))) {
@ -397,14 +397,14 @@ std::string* TestAllCombinations() {
}
}
if constexpr(Len == 3 && Packing == 1) {
if constexpr(Len == 3 && Packing == 1 && std::same_as<T, float>) {
{
VectorType<Len, Packing> vecA(floats);
VectorType<Len, Packing> vecB = vecA * 2;
VectorType<Len, Packing> vecC = vecA * 3;
VectorType<Len, Packing> vecD = vecA * 4;
VectorType<1, 4> result = VectorType<Len, Packing>::Length(vecA, vecB, vecC, vecD);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], expectedLength[0])) {
return new std::string(std::format("Length 3 vecA test failed at Len={} Packing={} Expected: {}, Got: {}", Len, Packing, (float)expectedLength[0], (float)stored[0]));
@ -430,7 +430,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecD = vecA * 4;
auto result = VectorType<Len, Packing>::Normalize(vecA, vecB, vecC, vecD);
VectorType<1, 4> result2 = VectorType<Len, Packing>::Length(std::get<0>(result), std::get<1>(result), std::get<2>(result), std::get<3>(result));
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.template Store<T>();
for(std::uint8_t i = 0; i < Len*Packing; i++) {
if (!FloatEquals(stored[i], T(1))) {
@ -440,14 +440,14 @@ std::string* TestAllCombinations() {
}
}
if constexpr(Len == 3 && Packing == 2) {
if constexpr(Len == 3 && Packing == 2 && std::same_as<T, float>) {
{
VectorType<Len, Packing> vecA(floats);
VectorType<Len, Packing> vecB = vecA * 2;
VectorType<Len, Packing> vecC = vecA * 3;
VectorType<Len, Packing> vecD = vecA * 4;
VectorType<1, 8> result = VectorType<Len, Packing>::Length(vecA, vecB, vecC, vecD);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], expectedLength[0])) {
return new std::string(std::format("Length 3 vecA test failed at Len={} Packing={} Expected: {}, Got: {}", Len, Packing, (float)expectedLength[0], (float)stored[0]));
@ -473,7 +473,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecD = vecA * 4;
auto result = VectorType<Len, Packing>::Normalize(vecA, vecB, vecC, vecD);
VectorType<1, 8> result2 = VectorType<Len, Packing>::Length(std::get<0>(result), std::get<1>(result), std::get<2>(result), std::get<3>(result));
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.template Store<T>();
for(std::uint8_t i = 0; i < Len*Packing; i++) {
if (!FloatEquals(stored[i], T(1))) {
@ -483,13 +483,13 @@ std::string* TestAllCombinations() {
}
}
if constexpr(Len == 3 && Packing == 5) {
if constexpr(Len == 3 && Packing == 5 && std::same_as<T, float>) {
{
VectorType<Len, Packing> vecA(floats);
VectorType<Len, Packing> vecB = vecA * 2;
VectorType<Len, Packing> vecC = vecA * 3;
VectorType<1, 15> result = VectorType<Len, Packing>::Length(vecA, vecB, vecC);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], expectedLength[0])) {
return new std::string(std::format("Length 3 vecA test failed at Len={} Packing={} Expected: {}, Got: {}", Len, Packing, (float)expectedLength[0], (float)stored[0]));
@ -510,7 +510,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecC = vecA * 3;
auto result = VectorType<Len, Packing>::Normalize(vecA, vecB, vecC);
VectorType<1, 15> result2 = VectorType<Len, Packing>::Length(std::get<0>(result), std::get<1>(result), std::get<2>(result));
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.template Store<T>();
for(std::uint8_t i = 0; i < Len*Packing; i++) {
if (!FloatEquals(stored[i], T(1))) {
@ -525,7 +525,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecA(floats);
VectorType<Len, Packing> vecE = vecA *2;
VectorType<1, Packing*2> result = VectorType<Len, Packing>::Length(vecA, vecE);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], expectedLength[0])) {
return new std::string(std::format("Length 2 vecA test failed at Len={} Packing={} Expected: {}, Got: {}", Len, Packing, (float)expectedLength[0], (float)stored[0]));
@ -541,7 +541,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecE = vecA * 2;
auto result = VectorType<Len, Packing>::Normalize(vecA, vecE);
VectorType<1, Packing*2> result2 = VectorType<Len, Packing>::Length(std::get<0>(result), std::get<1>(result));
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.template Store<T>();
for(std::uint8_t i = 0; i < Len*Packing; i++) {
if (!FloatEquals(stored[i], T(1))) {
@ -558,7 +558,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecE = vecA * 3;
VectorType<Len, Packing> vecG = vecA * 4;
VectorType<1, Packing*4> result = VectorType<Len, Packing>::Length(vecA, vecC, vecE, vecG);
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result.template Store<T>();
if (!FloatEquals(stored[0], expectedLength[0])) {
return new std::string(std::format("Length 4 vecA test failed at Len={} Packing={} Expected: {}, Got: {}", Len, Packing, (float)expectedLength[0], (float)stored[0]));
@ -584,7 +584,7 @@ std::string* TestAllCombinations() {
VectorType<Len, Packing> vecG = vecA * 4;
auto result = VectorType<Len, Packing>::Normalize(vecA, vecC, vecE, vecG);
VectorType<1, Packing*4> result2 = VectorType<Len, Packing>::Length(std::get<0>(result), std::get<1>(result), std::get<2>(result), std::get<3>(result));
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.Store();
std::array<T, VectorType<Len, Packing>::AlignmentElement> stored = result2.template Store<T>();
for(std::uint8_t i = 0; i < Len*Packing; i++) {
if (!FloatEquals(stored[i], T(1))) {
@ -600,8 +600,11 @@ std::string* TestAllCombinations() {
extern "C" {
std::string* RunTest() {
//std::string* err = TestAllCombinations<_Float16, VectorF16, VectorF16<1, 1>::MaxElement>();
std::string* err = TestAllCombinations<float, VectorF32, VectorF32<1, 1>::MaxElement>();
std::string* err = TestAllCombinations<_Float16, VectorF16, VectorF16<1, 1>::MaxElement>();
if (err) {
return err;
}
err = TestAllCombinations<float, VectorF32, VectorF32<1, 1>::MaxElement>();
if (err) {
return err;
}