aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaines Sy <hainesy@google.com>2024-02-27 21:10:45 -0800
committerVictor Khimenko <khim@google.com>2024-03-02 13:02:19 +0000
commit3cdc0ef3bb7e5ceaca8335b3e995ff2093eadd5b (patch)
tree2e66e48ad31babf758146aaefff89fdd0922ed88
parentab3b04ad98f847abd4110fddadc62180ca898e95 (diff)
downloadbinary_translation-3cdc0ef3bb7e5ceaca8335b3e995ff2093eadd5b.tar.gz
Implement vfmin/max.vf
Test: m berberis_all Change-Id: I544926055c3d3620d41732cf30b286baa644ab87
-rw-r--r--interpreter/riscv64/interpreter.h6
-rw-r--r--interpreter/riscv64/interpreter_test.cc36
-rw-r--r--intrinsics/riscv64/include/berberis/intrinsics/riscv64/vector_intrinsics.h10
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 | ...))