Fix `vacc` destination widening
PiperOrigin-RevId: 561722481
diff --git a/sim/kelvin_encoding.cc b/sim/kelvin_encoding.cc
index f085f59..5b68af7 100644
--- a/sim/kelvin_encoding.cc
+++ b/sim/kelvin_encoding.cc
@@ -384,6 +384,11 @@
return true;
}
+ // Func1 0b100 VAcc.[h,w].[u] needs 2x destination registers.
+ if ((func1 == 0b100) && (func2_ignore_unsigned == 0b1010)) {
+ return true;
+ }
+
// Func1 0b001 VMvp also needs 2x destination registers.
if ((func1 == 0b001) && (func2 == 0b1101)) {
return true;
diff --git a/sim/test/kelvin_encoding_test.cc b/sim/test/kelvin_encoding_test.cc
index f790aa1..8dad336 100644
--- a/sim/test/kelvin_encoding_test.cc
+++ b/sim/test/kelvin_encoding_test.cc
@@ -97,6 +97,7 @@
constexpr uint32_t kVld = 0b000000'000000'000000'00'000000'0'111'11;
// Kelvin vector ops
+constexpr uint32_t kVAccsBase = 0b001010'000001'000000'00'001000'0'100'00;
constexpr uint32_t kVAddBase = 0b000000'000000'000001'00'000010'0'000'00;
constexpr uint32_t kAconvBase = 0b001000'000001'010000'10'110000'0'00'101;
@@ -443,7 +444,6 @@
EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), OpcodeEnum::kNone);
// Test vacc.h.vv
- constexpr uint32_t kVAccsBase = 0b001010'000001'000000'00'001000'0'100'00;
v_src = EncodeOpHelper<RV32VectorSourceOperand>(
SetSz(kVAccsBase, 0b1), OpcodeEnum::kVaccHVv, SourceOpEnum::kVs1);
EXPECT_EQ(v_src->size(), 2);
@@ -509,6 +509,25 @@
EXPECT_EQ(v_dest->size(), 2);
delete v_dest;
+ // Test vacc.h.vv
+ v_dest = EncodeOpHelper<RV32VectorDestOperand>(
+ SetSz(kVAccsBase, 0b1), OpcodeEnum::kVaccHVv, DestOpEnum::kVd);
+ EXPECT_EQ(v_dest->size(), 2);
+ delete v_dest;
+
+ // Test vacc.w.u.vv
+ v_dest = EncodeOpHelper<RV32VectorDestOperand>(
+ SetSz(kVAccsBase, 0b10) | (1 << 26), OpcodeEnum::kVaccWUVv,
+ DestOpEnum::kVd);
+ EXPECT_EQ(v_dest->size(), 2);
+ delete v_dest;
+
+ // Test no-widening of vle(same func2 as vacc, func1 == 000)
+ v_dest = EncodeOpHelper<RV32VectorDestOperand>(
+ kVAccsBase & ~(1 << 4), OpcodeEnum::kVleBVv, DestOpEnum::kVd);
+ EXPECT_EQ(v_dest->size(), 1);
+ delete v_dest;
+
// Test vmvp.vv
constexpr uint32_t kVMvpBase = 0b001101'000001'000000'00'001000'0'001'00;
v_dest = EncodeOpHelper<RV32VectorDestOperand>(kVMvpBase, OpcodeEnum::kVmvpVv,