diff options
author | Haines Sy <hainesy@google.com> | 2024-04-29 18:48:06 -0700 |
---|---|---|
committer | Haines Sy <hainesy@google.com> | 2024-04-30 17:13:02 +0000 |
commit | 906d91fe1083b1c906c6d37fbed1ae7061670247 (patch) | |
tree | 6195c6663ed98eaaf08828fbc0224fdace792430 | |
parent | c7afc62156a30be82ab8eca29632d84a7c3dd51c (diff) | |
download | binary_translation-906d91fe1083b1c906c6d37fbed1ae7061670247.tar.gz |
Implement Vfwmul vv/vf as intrinsics
Test: m berberis_all
Change-Id: Ie78efafaff6fc42f944f05356c42d60864b2e3f8
-rw-r--r-- | interpreter/riscv64/interpreter.h | 14 | ||||
-rw-r--r-- | interpreter/riscv64/interpreter_test.cc | 20 | ||||
-rw-r--r-- | intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h | 2 |
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...))) |