diff options
author | Haines Sy <hainesy@google.com> | 2024-02-27 21:10:45 -0800 |
---|---|---|
committer | Victor Khimenko <khim@google.com> | 2024-03-02 13:02:19 +0000 |
commit | 3cdc0ef3bb7e5ceaca8335b3e995ff2093eadd5b (patch) | |
tree | 2e66e48ad31babf758146aaefff89fdd0922ed88 | |
parent | ab3b04ad98f847abd4110fddadc62180ca898e95 (diff) | |
download | binary_translation-3cdc0ef3bb7e5ceaca8335b3e995ff2093eadd5b.tar.gz |
Implement vfmin/max.vf
Test: m berberis_all
Change-Id: I544926055c3d3620d41732cf30b286baa644ab87
-rw-r--r-- | interpreter/riscv64/interpreter.h | 6 | ||||
-rw-r--r-- | interpreter/riscv64/interpreter_test.cc | 36 | ||||
-rw-r--r-- | intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h | 10 |
3 files changed, 48 insertions, 4 deletions
diff --git a/interpreter/riscv64/interpreter.h b/interpreter/riscv64/interpreter.h index 1445172f..45ad5a37 100644 --- a/interpreter/riscv64/interpreter.h +++ b/interpreter/riscv64/interpreter.h @@ -1203,6 +1203,12 @@ class Interpreter { InactiveProcessing::kUndisturbed>( args.dst, arg2, /*dst_mask=*/args.src1); } + case Decoder::VOpFVfOpcode::kVfmaxvf: + return OpVectorvx<intrinsics::Vfmaxvx<ElementType>, ElementType, vlmul, vta, vma>( + args.dst, args.src1, arg2); + case Decoder::VOpFVfOpcode::kVfminvf: + return OpVectorvx<intrinsics::Vfminvx<ElementType>, ElementType, vlmul, vta, vma>( + args.dst, args.src1, arg2); default: return Unimplemented(); } diff --git a/interpreter/riscv64/interpreter_test.cc b/interpreter/riscv64/interpreter_test.cc index 239c50a0..50781541 100644 --- a/interpreter/riscv64/interpreter_test.cc +++ b/interpreter/riscv64/interpreter_test.cc @@ -7007,6 +7007,24 @@ TEST_F(Riscv64InterpreterTest, TestVmin) { {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa}, {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa}}, kVectorCalculationsSourceLegacy); + TestVectorFloatInstruction(0x1100d457, // vfmin.vf v8, v16, f1, v0.t + {{0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000}, + {0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa, 0xaaaa'aaaa}, + {0xbbbb'bbbb, 0xbbbb'bbbb, 0xaaaa'aaaa, 0xaaaa'aaaa}, + {0xaaaa'aaaa, 0xaaaa'aaaa, 0x1111'1111, 0x1111'1111}, + {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000}, + {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000}, + {0xa9bb'bbbb, 0xa9bb'bbbb, 0xa9bb'bbbb, 0xa9bb'bbbb}, + {0xa9a9'a9a9, 0xa9a9'a9a9, 0xa9a9'a9a9, 0xa9a9'a9a9}}, + {{0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000}, + {0xaaaa'aaaa'aaaa'aaaa, 0xaaaa'aaaa'aaaa'aaaa}, + {0xbbbb'bbbb'bbbb'bbbb, 0xaaaa'aaaa'aaaa'aaaa}, + {0xaaaa'aaaa'aaaa'aaaa, 0x1111'1111'1111'1111}, + {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000}, + {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000}, + {0xa9bb'bbbb'a9bb'bbbb, 0xa9bb'bbbb'a9bb'bbbb}, + {0xa9a9'a9a9'a9a9'a9a9, 0xa9a9'a9a9'a9a9'a9a9}}, + kVectorComparisonSource); } TEST_F(Riscv64InterpreterTest, TestVmaxu) { @@ -7153,6 +7171,24 @@ TEST_F(Riscv64InterpreterTest, TestVmax) { {0xe766'e564'e362'e160, 0xef6e'ed6c'eb6a'e968}, {0xf776'f574'f372'f170, 0xff7e'fd7c'fb7a'f978}}, kVectorCalculationsSourceLegacy); + TestVectorFloatInstruction(0x1900d457, // vfmax.vf v8, v16, f1, v0.t + {{0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000}, + {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}, + {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}, + {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}, + {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000}, + {0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000, 0x7fc0'0000}, + {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}, + {0x40b4'0000, 0x40b4'0000, 0x40b4'0000, 0x40b4'0000}}, + {{0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000}, + {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}, + {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}, + {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}, + {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000}, + {0x7ff8'0000'0000'0000, 0x7ff8'0000'0000'0000}, + {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}, + {0x4016'8000'0000'0000, 0x4016'8000'0000'0000}}, + kVectorComparisonSource); } TEST_F(Riscv64InterpreterTest, TestVredsum) { diff --git a/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h b/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h index a48194a3..e9e396eb 100644 --- a/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h +++ b/intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h @@ -635,10 +635,12 @@ DEFINE_3OP_ARITHMETIC_INTRINSIC_VV(nmsub, auto [arg1, arg2, arg3] = std::tuple{a (-(arg2 * arg3) + arg1)) DEFINE_3OP_ARITHMETIC_INTRINSIC_VX(nmsub, auto [arg1, arg2, arg3] = std::tuple{args...}; (-(arg2 * arg3) + arg1)) -DEFINE_2OP_ARITHMETIC_INTRINSIC_VV(min, (std::min(args...))) -DEFINE_2OP_ARITHMETIC_INTRINSIC_VX(min, (std::min(args...))) -DEFINE_2OP_ARITHMETIC_INTRINSIC_VV(max, (std::max(args...))) -DEFINE_2OP_ARITHMETIC_INTRINSIC_VX(max, (std::max(args...))) +DEFINE_2OP_ARITHMETIC_INTRINSIC_VX(fmin, std::get<0>(FMin(args...))) +DEFINE_2OP_ARITHMETIC_INTRINSIC_VX(fmax, std::get<0>(FMax(args...))) +DEFINE_2OP_ARITHMETIC_INTRINSIC_VV(min, std::min(args...)) +DEFINE_2OP_ARITHMETIC_INTRINSIC_VX(min, std::min(args...)) +DEFINE_2OP_ARITHMETIC_INTRINSIC_VV(max, std::max(args...)) +DEFINE_2OP_ARITHMETIC_INTRINSIC_VX(max, std::max(args...)) DEFINE_2OP_ARITHMETIC_INTRINSIC_VS(redsum, (args + ...)) DEFINE_2OP_ARITHMETIC_INTRINSIC_VS(redand, (args & ...)) DEFINE_2OP_ARITHMETIC_INTRINSIC_VS(redor, (args | ...)) |