blob: 9ed2a0e36649bc57ab922a4cbad8c083c921ed79 [file] [log] [blame]
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <riscv_vector.h>
#include <springbok.h>
#include <stddef.h>
#include "pw_unit_test/framework.h"
#include "test_v_helpers.h"
namespace vle_vse_test {
namespace {
using namespace test_v_helpers;
uint8_t test_vector_1[MAXVL_BYTES];
uint8_t test_vector_2[MAXVL_BYTES];
static void vlevse_test(VSEW sew, VLMUL lmul, bool use_intrinsic = false) {
for (int i = 0; i <= AVL_COUNT; ++i) {
zero_vector_registers();
int32_t avl = AVLS[i];
int vlmax;
int vl;
switch (sew) {
case SEW_E8:
std::tie(vlmax, vl) = vector_test_setup<uint8_t>(
lmul, avl, {test_vector_1, test_vector_2});
break;
case SEW_E16:
std::tie(vlmax, vl) = vector_test_setup<uint16_t>(
lmul, avl, {test_vector_1, test_vector_2});
break;
case SEW_E32:
std::tie(vlmax, vl) = vector_test_setup<uint32_t>(
lmul, avl, {test_vector_1, test_vector_2});
break;
default: {
LOG_ERROR("Not supported SEW");
ASSERT_TRUE(false);
break;
}
}
if (avl > vlmax) {
continue;
}
LOG_DEBUG("vl: %d", vl);
// load c-array values into vector
// TODO(gkielian): utilize intrinsics for vle
if (use_intrinsic) {
} else {
switch (sew) {
case SEW_E8: {
fill_random_vector<uint8_t>(test_vector_1, vl);
__asm__ volatile("vle8.v v0, (%0)" : : "r"(test_vector_1));
__asm__ volatile("vse8.v v0, (%0)" : : "r"(test_vector_2));
assert_vec_elem_eq<uint8_t>(vl, test_vector_1, test_vector_2);
break;
}
case SEW_E16: {
fill_random_vector<uint16_t>(
reinterpret_cast<uint16_t *>(test_vector_1), vl);
__asm__ volatile("vle16.v v0, (%0)" : : "r"(test_vector_1));
__asm__ volatile("vse16.v v0, (%0)" : : "r"(test_vector_2));
assert_vec_elem_eq<uint16_t>(vl, test_vector_1, test_vector_2);
break;
}
case SEW_E32: {
fill_random_vector<uint32_t>(
reinterpret_cast<uint32_t *>(test_vector_1), vl);
__asm__ volatile("vle32.v v0, (%0)" : : "r"(test_vector_1));
__asm__ volatile("vse32.v v0, (%0)" : : "r"(test_vector_2));
assert_vec_elem_eq<uint32_t>(vl, test_vector_1, test_vector_2);
break;
}
default:
break;
}
}
}
}
TEST(VleVseTest, vle8vse8_e8m1) {
vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_M1, false);
}
TEST(VleVseTest, vle8vse8_e8m2) {
vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_M2, false);
}
TEST(VleVseTest, vle8vse8_e8m4) {
vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_M4, false);
}
TEST(VleVseTest, vle8vse8_e8m8) {
vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_M8, false);
}
TEST(VleVseTest, vle16vse16_e16m1) {
vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M1, false);
}
TEST(VleVseTest, vle16vse16_e16m2) {
vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M2, false);
}
TEST(VleVseTest, vle16vse16_e16m4) {
vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M4, false);
}
TEST(VleVseTest, vle16vse16_e16m8) {
vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_M8, false);
}
TEST(VleVseTest, vle32vse32_e32m1) {
vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M1, false);
}
TEST(VleVseTest, vle32vse32_e32m2) {
vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M2, false);
}
TEST(VleVseTest, vle32vse32_e32m4) {
vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M4, false);
}
TEST(VleVseTest, vle32vse32_e32m8) {
vlevse_test(VSEW::SEW_E32, VLMUL::LMUL_M8, false);
}
TEST(VleVseTest, vle8vse8_e8mf2) { vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_MF2); }
TEST(VleVseTest, vle8vse8_e8mf4) { vlevse_test(VSEW::SEW_E8, VLMUL::LMUL_MF4); }
TEST(VleVseTest, vle16vse16_e16mf2) {
vlevse_test(VSEW::SEW_E16, VLMUL::LMUL_MF2);
}
} // namespace
} // namespace vle_vse_test