Connect Kelvin instructions to instruction decoder

The instructions can be properly parsed after this.
Add a vector test to verify it.

PiperOrigin-RevId: 550426838
diff --git a/sim/kelvin_encoding.cc b/sim/kelvin_encoding.cc
index ba8a9ce..9bd3987 100644
--- a/sim/kelvin_encoding.cc
+++ b/sim/kelvin_encoding.cc
@@ -292,6 +292,8 @@
 void KelvinEncoding::ParseInstruction(uint32_t inst_word) {
   inst_word_ = inst_word;
   opcode_ = encoding::DecodeKelvinInst(inst_word_);
+  if (opcode_ == OpcodeEnum::kNone)
+    opcode_ = encoding::DecodeKelvinVectorInst(inst_word_);
 }
 
 DestinationOperandInterface *KelvinEncoding::GetDestination(SlotEnum, int,
diff --git a/sim/test/kelvin_encoding_test.cc b/sim/test/kelvin_encoding_test.cc
index 96a3db4..0037c7b 100644
--- a/sim/test/kelvin_encoding_test.cc
+++ b/sim/test/kelvin_encoding_test.cc
@@ -80,6 +80,9 @@
 // Kelvin Logging Op
 constexpr uint32_t kFLog = 0b011'1100'00000'00000'000'00000'111'0111;
 
+// Kelvin VLd
+constexpr uint32_t kVld = 0b000000'000000'000000'00'000000'0'111'11;
+
 class KelvinEncodingTest : public testing::Test {
  protected:
   KelvinEncodingTest() {
@@ -234,6 +237,16 @@
   EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), OpcodeEnum::kKlog);
 }
 
+TEST_F(KelvinEncodingTest, KelvinVldOpcodes) {
+  enc_->ParseInstruction(SetRs1(kVld, kRdValue));
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), OpcodeEnum::kVldBX);
+  enc_->ParseInstruction(SetRs1(kVld, kRdValue) | (0b01 << 12 /* sz */));
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), OpcodeEnum::kVldHX);
+  enc_->ParseInstruction(SetRs1(kVld, kRdValue) | (0b10 << 12 /* sz */) |
+                         (0b10 << 20 /* xs2 */) | (0b1 << 26 /* length */));
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), OpcodeEnum::kVldWLXx);
+}
+
 TEST_F(KelvinEncodingTest, ZifenceiOpcodes) {
   // RV32 Zifencei
   enc_->ParseInstruction(kFencei);