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,