blob: f0449f88a433755f038fc70e951076dd89f768f4 [file] [log] [blame]
#include <springbok.h>
#include <stdio.h>
#include <stdlib.h>
#include "pw_unit_test/framework.h"
#include "softrvv.h"
namespace softrvv_vmacc_test {
namespace {
class SoftRvvVmaccTest : public ::testing::Test {
protected:
void SetUp() override { }
};
class SoftRvvVnmsacTest : public ::testing::Test {
protected:
void SetUp() override { }
};
// Integer multiply-add, overwrite addend
// vmacc.vv vd, vs1, vs2, vm # vd[i] = +(vs1[i] * vs2[i]) + vd[i]
uint32_t vmacvv_vs1[] = {1, 1, 128, 64, 0};
uint32_t vmacvv_vs2[] = {0, 1, 1, 2, 32};
const uint32_t vmacvv_kAVL = sizeof(vmacvv_vs2) / sizeof(vmacvv_vs2[0]);
uint32_t vmacvv_vd[] = {0, 1, 2, 4, 8};
int32_t vmacvv_ref[] = {0, 2, 130, 132, 8};
TEST_F(SoftRvvVmaccTest, VV) {
softrvv::vmacc_vv<uint32_t>(vmacvv_vd, vmacvv_vs1, vmacvv_vs2, vmacvv_kAVL);
ASSERT_EQ(memcmp(vmacvv_vd, vmacvv_ref, sizeof(vmacvv_vd)), 0);
}
// Integer multiply-add, overwrite addend
// vmacc.vx vd, rs1, vs2, vm # vd[i] = +(x[rs1] * src2[i]) + vd[i]
uint32_t vmaccvx_rs1[] = {170};
uint32_t vmaccvx_vs2[] = {0, 1, 1, 2, 32};
const uint32_t vmaccvx_kAVL = sizeof(vmaccvx_vs2) / sizeof(vmaccvx_vs2[0]);
uint32_t vmaccvx_vd[] = {0, 1, 2, 4, 8};
int32_t vmaccvx_ref[] = {0, 171, 172, 344, 5448};
TEST_F(SoftRvvVmaccTest, VX) {
softrvv::vmacc_vx<uint32_t>(vmaccvx_vd, vmaccvx_rs1, vmaccvx_vs2, vmaccvx_kAVL);
ASSERT_EQ(memcmp(vmaccvx_vd, vmaccvx_ref, sizeof(vmaccvx_vd)), 0);
}
// Integer multiply-sub, overwrite minuend
// vnmsac.vv vd, vs1, vs2, vm # vd[i] = -(vs1[i] * vs2[i]) + vd[i]
uint32_t vnmsacvv_vs1[] = {220, 24, 1234, 150, 1386};
uint32_t vnmsacvv_vs2[] = { 1, 2, 2, 10, 1000};
const uint32_t vnmsacvv_kAVL = sizeof(vnmsacvv_vs2) / sizeof(vnmsacvv_vs2[0]);
uint32_t vnmsacvv_vd[] = { 0, 10, 10, 1000, 1};
int32_t vnmsacvv_ref[] = {-220, -38, -2458, -500, -1385999};
TEST_F(SoftRvvVnmsacTest, VV) {
softrvv::vnmsac_vv<uint32_t>(vnmsacvv_vd, vnmsacvv_vs1, vnmsacvv_vs2, vnmsacvv_kAVL);
ASSERT_EQ(memcmp(vnmsacvv_vd, vnmsacvv_ref, sizeof(vnmsacvv_ref)), 0);
}
// Integer multiply-sub, overwrite minuend
// vnmsac.vx vd, rs1, vs2, vm # vd[i] = -(x[rs1] * vs2[i]) + vd[i]
uint32_t vnmsacvx_rs1[] = {170};
uint32_t vnmsacvx_vs2[] = { 1, 2, 2, 10, 1000};
const uint32_t vnmsacvx_kAVL = sizeof(vnmsacvx_vs2) / sizeof(vnmsacvx_vs2[0]);
uint32_t vnmsacvx_vd[] = {170, 350, 10, 0, 0};
int32_t vnmsacvx_ref[] = {0, 10, -330, -1700, -170000};
TEST_F(SoftRvvVnmsacTest, VX) {
softrvv::vnmsac_vx<uint32_t>(vnmsacvx_vd, vnmsacvx_rs1, vnmsacvx_vs2, vnmsacvx_kAVL);
ASSERT_EQ(memcmp(vnmsacvx_vd, vnmsacvx_ref, sizeof(vnmsacvx_ref)), 0);
}
} // namespace
} // namespace softrvv_vmacc_test