aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaines Sy <hainesy@google.com>2024-04-29 18:48:06 -0700
committerHaines Sy <hainesy@google.com>2024-04-30 17:13:02 +0000
commit906d91fe1083b1c906c6d37fbed1ae7061670247 (patch)
tree6195c6663ed98eaaf08828fbc0224fdace792430
parentc7afc62156a30be82ab8eca29632d84a7c3dd51c (diff)
downloadbinary_translation-906d91fe1083b1c906c6d37fbed1ae7061670247.tar.gz
Implement Vfwmul vv/vf as intrinsics
Test: m berberis_all Change-Id: Ie78efafaff6fc42f944f05356c42d60864b2e3f8
-rw-r--r--interpreter/riscv64/interpreter.h14
-rw-r--r--interpreter/riscv64/interpreter_test.cc20
-rw-r--r--intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h2
3 files changed, 36 insertions, 0 deletions
diff --git a/interpreter/riscv64/interpreter.h b/interpreter/riscv64/interpreter.h
index 8d57a1ba..4458bd4a 100644
--- a/interpreter/riscv64/interpreter.h
+++ b/interpreter/riscv64/interpreter.h
@@ -1281,6 +1281,13 @@ class Interpreter {
vta,
vma,
kFrm>(args.dst, args.src1, arg2);
+ case Decoder::VOpFVfOpcode::kVfwmulvf:
+ return OpVectorWidenvx<intrinsics::Vfwmulvf<ElementType>,
+ ElementType,
+ vlmul,
+ vta,
+ vma,
+ kFrm>(args.dst, args.src1, arg2);
default:
break;
}
@@ -1493,6 +1500,13 @@ class Interpreter {
vta,
vma,
kFrm>(args.dst, args.src1, args.src2);
+ case Decoder::VOpFVvOpcode::kVfwmulvv:
+ return OpVectorWidenvv<intrinsics::Vfwmulvv<ElementType>,
+ ElementType,
+ vlmul,
+ vta,
+ vma,
+ kFrm>(args.dst, args.src1, args.src2);
case Decoder::VOpFVvOpcode::kVFUnary0:
switch (args.vfunary0_opcode) {
case Decoder::VFUnary0Opcode::kVfwcvtxufv:
diff --git a/interpreter/riscv64/interpreter_test.cc b/interpreter/riscv64/interpreter_test.cc
index 9e0b80b5..22a8f772 100644
--- a/interpreter/riscv64/interpreter_test.cc
+++ b/interpreter/riscv64/interpreter_test.cc
@@ -10547,6 +10547,26 @@ TEST_F(Riscv64InterpreterTest, TestVmul) {
{0xe790'194a'efe1'8678, 0xef95'bef0'9587'2c1d},
{0xf7a0'2496'3b2c'd1c3, 0xffa5'ca3b'e0d2'7768}},
kVectorCalculationsSourceLegacy);
+ TestWideningVectorFloatInstruction(0xe10c1457, // vfwmul.vv v8, v16, v24, v0.t
+ {{0x3330'e53c'6480'0000, 0x34b2'786b'bbc5'4900},
+ {0x3234'1766'da4a'6200, 0x33b5'cab6'2d6c'4800},
+ {0x3937'92ba'5bd0'8000, 0x3ab9'666a'779a'0d00},
+ {0x383b'4565'd61f'6600, 0x39bd'3935'e5bd'8800},
+ {0x3f3f'423b'5522'0000, 0x40c0'ab36'1ab7'e880},
+ {0x3e41'bab3'e9fa'b500, 0x3fc2'd4dc'5007'e400},
+ {0x4543'f9df'a83a'4000, 0x46c5'2438'7aa3'4a80},
+ {0x4446'53b6'69e6'3700, 0x45c7'8e1f'2e31'8400}},
+ kVectorCalculationsSource);
+ TestWideningVectorFloatInstruction(0xe100d457, // vfwmul.vf v8, v16, f1, v0.t
+ {{0xb886'f0ad'0000'0000, 0xb907'a561'b400'0000},
+ {0xb988'5a16'6800'0000, 0xba09'0ecb'1c00'0000},
+ {0xba89'c37f'd000'0000, 0xbb0a'7834'8400'0000},
+ {0xbb8b'2ce9'3800'0000, 0xbc0b'e19d'ec00'0000},
+ {0xbc8c'9652'a000'0000, 0xbd0d'4b07'5400'0000},
+ {0xbd8d'ffbc'0800'0000, 0xbe0e'b470'bc00'0000},
+ {0xbe8f'6925'7000'0000, 0xbf10'0eed'1200'0000},
+ {0xbf90'6947'6c00'0000, 0xc010'c3a1'c600'0000}},
+ kVectorCalculationsSource);
}
TEST_F(Riscv64InterpreterTest, TestVmulh) {
diff --git a/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h b/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h
index 97bd50a0..5e99d744 100644
--- a/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h
+++ b/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h
@@ -915,6 +915,8 @@ DEFINE_2OP_1CSR_WIDEN_ARITHMETIC_INTRINSIC_VV(add, std::get<0>(FAdd(FPFlags::DYN
DEFINE_2OP_1CSR_WIDEN_ARITHMETIC_INTRINSIC_VF(add, std::get<0>(FAdd(FPFlags::DYN, csr, args...)))
DEFINE_2OP_1CSR_WIDEN_ARITHMETIC_INTRINSIC_VV(sub, std::get<0>(FSub(FPFlags::DYN, csr, args...)))
DEFINE_2OP_1CSR_WIDEN_ARITHMETIC_INTRINSIC_VF(sub, std::get<0>(FSub(FPFlags::DYN, csr, args...)))
+DEFINE_2OP_1CSR_WIDEN_ARITHMETIC_INTRINSIC_VV(mul, std::get<0>(FMul(FPFlags::DYN, csr, args...)))
+DEFINE_2OP_1CSR_WIDEN_ARITHMETIC_INTRINSIC_VF(mul, std::get<0>(FMul(FPFlags::DYN, csr, args...)))
DEFINE_2OP_1CSR_ARITHMETIC_INTRINSIC_VV(fsub, std::get<0>(FSub(FPFlags::DYN, csr, args...)))
DEFINE_2OP_1CSR_ARITHMETIC_INTRINSIC_VF(fsub, std::get<0>(FSub(FPFlags::DYN, csr, args...)))