zfh binary decoder fadd fsub fmul fdiv

PiperOrigin-RevId: 755098560
Change-Id: Ib083c865f13d4f674bf5543daa45736fabe9a9d7
diff --git a/riscv/riscv_zfh.bin_fmt b/riscv/riscv_zfh.bin_fmt
index f0b48ff..51296a4 100644
--- a/riscv/riscv_zfh.bin_fmt
+++ b/riscv/riscv_zfh.bin_fmt
@@ -32,4 +32,8 @@
   fcvt_hs : RType : func7 == 0b0100010, rs2 == 0b00000, opcode == 0b1010011;
   fcvt_dh : RType : func7 == 0b0100001, rs2 == 0b00010, opcode == 0b1010011;
   fcvt_hd : RType : func7 == 0b0100010, rs2 == 0b00001, opcode == 0b1010011;
+  fadd_h  : RType : func7 == 0b0000010, opcode == 0b1010011;
+  fsub_h  : RType : func7 == 0b0000110, opcode == 0b1010011;
+  fmul_h  : RType : func7 == 0b0001010, opcode == 0b1010011;
+  fdiv_h  : RType : func7 == 0b0001110, opcode == 0b1010011;
 };
diff --git a/riscv/test/zfh_encoding_test.cc b/riscv/test/zfh_encoding_test.cc
index 56980d3..cb0dc02 100644
--- a/riscv/test/zfh_encoding_test.cc
+++ b/riscv/test/zfh_encoding_test.cc
@@ -75,6 +75,14 @@
 constexpr uint32_t kFcvtDh = 0b0100001'00010'00000'000'00000'1010011;
 //                             func7  |     | rs1 |rm | rd  | opcode
 constexpr uint32_t kFcvtHd = 0b0100010'00001'00000'000'00000'1010011;
+//                            func7  | rs2 | rs1 |rm | rd  | opcode
+constexpr uint32_t kFaddH = 0b0000010'00000'00000'000'00000'1010011;
+//                            func7  | rs2 | rs1 |rm | rd  | opcode
+constexpr uint32_t kFsubH = 0b0000110'00000'00000'000'00000'1010011;
+//                            func7  | rs2 | rs1 |rm | rd  | opcode
+constexpr uint32_t kFmulH = 0b0001010'00000'00000'000'00000'1010011;
+//                            func7  | rs2 | rs1 |rm | rd  | opcode
+constexpr uint32_t kFdivH = 0b0001110'00000'00000'000'00000'1010011;
 
 class ZfhEncodingTest : public testing::Test {
  protected:
@@ -408,4 +416,80 @@
   FloatRmHelper(kFcvtHd, OpcodeEnum::kFcvtHd);
 }
 
+TEST_F(ZfhEncodingTest, FaddH) {
+  enc_->ParseInstruction(kFaddH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFaddH);
+}
+
+TEST_F(ZfhEncodingTest, FaddH_frs1) {
+  FloatFrs1Helper(kFaddH, OpcodeEnum::kFaddH);
+}
+
+TEST_F(ZfhEncodingTest, FaddH_frs2) {
+  FloatFrs2Helper(kFaddH, OpcodeEnum::kFaddH);
+}
+
+TEST_F(ZfhEncodingTest, FaddH_frd) {
+  FloatFrdHelper(kFaddH, OpcodeEnum::kFaddH);
+}
+
+TEST_F(ZfhEncodingTest, FaddH_rm) { FloatRmHelper(kFaddH, OpcodeEnum::kFaddH); }
+
+TEST_F(ZfhEncodingTest, FsubH) {
+  enc_->ParseInstruction(kFsubH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsubH);
+}
+
+TEST_F(ZfhEncodingTest, FsubH_frs1) {
+  FloatFrs1Helper(kFsubH, OpcodeEnum::kFsubH);
+}
+
+TEST_F(ZfhEncodingTest, FsubH_frs2) {
+  FloatFrs2Helper(kFsubH, OpcodeEnum::kFsubH);
+}
+
+TEST_F(ZfhEncodingTest, FsubH_frd) {
+  FloatFrdHelper(kFsubH, OpcodeEnum::kFsubH);
+}
+
+TEST_F(ZfhEncodingTest, FsubH_rm) { FloatRmHelper(kFsubH, OpcodeEnum::kFsubH); }
+
+TEST_F(ZfhEncodingTest, FmulH) {
+  enc_->ParseInstruction(kFmulH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFmulH);
+}
+
+TEST_F(ZfhEncodingTest, FmulH_frs1) {
+  FloatFrs1Helper(kFmulH, OpcodeEnum::kFmulH);
+}
+
+TEST_F(ZfhEncodingTest, FmulH_frs2) {
+  FloatFrs2Helper(kFmulH, OpcodeEnum::kFmulH);
+}
+
+TEST_F(ZfhEncodingTest, FmulH_frd) {
+  FloatFrdHelper(kFmulH, OpcodeEnum::kFmulH);
+}
+
+TEST_F(ZfhEncodingTest, FmulH_rm) { FloatRmHelper(kFmulH, OpcodeEnum::kFmulH); }
+
+TEST_F(ZfhEncodingTest, FdivH) {
+  enc_->ParseInstruction(kFdivH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFdivH);
+}
+
+TEST_F(ZfhEncodingTest, FdivH_frs1) {
+  FloatFrs1Helper(kFdivH, OpcodeEnum::kFdivH);
+}
+
+TEST_F(ZfhEncodingTest, FdivH_frs2) {
+  FloatFrs2Helper(kFdivH, OpcodeEnum::kFdivH);
+}
+
+TEST_F(ZfhEncodingTest, FdivH_frd) {
+  FloatFrdHelper(kFdivH, OpcodeEnum::kFdivH);
+}
+
+TEST_F(ZfhEncodingTest, FdivH_rm) { FloatRmHelper(kFdivH, OpcodeEnum::kFdivH); }
+
 }  // namespace