zfh: fmin, fmax, fsgn binary decoder

PiperOrigin-RevId: 755957256
Change-Id: I8113a62329b75b5b27336091ed7b0f6f248bb04b
diff --git a/riscv/riscv_zfh.bin_fmt b/riscv/riscv_zfh.bin_fmt
index 51296a4..59622de 100644
--- a/riscv/riscv_zfh.bin_fmt
+++ b/riscv/riscv_zfh.bin_fmt
@@ -24,16 +24,21 @@
 }
 
 instruction group RiscVZfhminInst32[32] : Inst32Format {
-  flh     : IType : func3 == 0b001,  opcode == 0b000'0111;
-  fsh     : SType : func3 == 0b001,  opcode == 0b010'0111;
-  fmv_xh  : RType : func7 == 0b1110010, rs2 == 0, func3 == 0b000, opcode == 0b1010011;
-  fmv_hx  : RType : func7 == 0b1111010, rs2 == 0, func3 == 0b000, opcode == 0b1010011;
-  fcvt_sh : RType : func7 == 0b0100000, rs2 == 0b00010, opcode == 0b1010011;
-  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;
+  flh      : IType : func3 == 0b001,  opcode == 0b000'0111;
+  fsh      : SType : func3 == 0b001,  opcode == 0b010'0111;
+  fmv_xh   : RType : func7 == 0b1110010, rs2 == 0, func3 == 0b000, opcode == 0b1010011;
+  fmv_hx   : RType : func7 == 0b1111010, rs2 == 0, func3 == 0b000, opcode == 0b1010011;
+  fcvt_sh  : RType : func7 == 0b0100000, rs2 == 0b00010, opcode == 0b1010011;
+  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;
+  fmin_h   : RType : func7 == 0b0010110, func3 == 0b000, opcode == 0b1010011;
+  fmax_h   : RType : func7 == 0b0010110, func3 == 0b001, opcode == 0b1010011;
+  fsgnj_h  : RType : func7 == 0b0010010, func3 == 0b000, opcode == 0b1010011;
+  fsgnjn_h : RType : func7 == 0b0010010, func3 == 0b001, opcode == 0b1010011;
+  fsgnjx_h : RType : func7 == 0b0010010, func3 == 0b010, opcode == 0b1010011;
 };
diff --git a/riscv/riscv_zfh.isa b/riscv/riscv_zfh.isa
index 11e9a89..f906733 100644
--- a/riscv/riscv_zfh.isa
+++ b/riscv/riscv_zfh.isa
@@ -152,7 +152,7 @@
       resources: {next_pc, frs1, frs2 : frd[0..]},
       semfunc: "&RiscVZfhFsgnjn",
       disasm: "fsgnjn.h", "%frd, %frs1, %frs2";
-    fsgnjnx_h{: frs1, frs2 : frd },
+    fsgnjx_h{: frs1, frs2 : frd },
       resources: {next_pc, frs1, frs2 : frd[0..]},
       semfunc: "&RiscVZfhFsgnjx",
       disasm: "fsgnjnx.h", "%frd, %frs1, %frs2";
diff --git a/riscv/test/zfh_encoding_test.cc b/riscv/test/zfh_encoding_test.cc
index cb0dc02..073be00 100644
--- a/riscv/test/zfh_encoding_test.cc
+++ b/riscv/test/zfh_encoding_test.cc
@@ -83,6 +83,16 @@
 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;
+//                            func7  | rs2 | rs1 |fn3| rd  | opcode
+constexpr uint32_t kFminH = 0b0010110'00000'00000'000'00000'1010011;
+//                            func7  | rs2 | rs1 |fn3| rd  | opcode
+constexpr uint32_t kFmaxH = 0b0010110'00000'00000'001'00000'1010011;
+//                             func7  | rs2 | rs1 |fn3| rd  | opcode
+constexpr uint32_t kFsgnjH = 0b0010010'00000'00000'000'00000'1010011;
+//                              func7  | rs2 | rs1 |fn3| rd  | opcode
+constexpr uint32_t kFsgnjnH = 0b0010010'00000'00000'001'00000'1010011;
+//                              func7  | rs2 | rs1 |fn3| rd  | opcode
+constexpr uint32_t kFsgnjxH = 0b0010010'00000'00000'010'00000'1010011;
 
 class ZfhEncodingTest : public testing::Test {
  protected:
@@ -492,4 +502,89 @@
 
 TEST_F(ZfhEncodingTest, FdivH_rm) { FloatRmHelper(kFdivH, OpcodeEnum::kFdivH); }
 
+TEST_F(ZfhEncodingTest, FminH) {
+  enc_->ParseInstruction(kFminH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFminH);
+}
+
+TEST_F(ZfhEncodingTest, FminH_frs1) {
+  FloatFrs1Helper(kFminH, OpcodeEnum::kFminH);
+}
+
+TEST_F(ZfhEncodingTest, FminH_frs2) {
+  FloatFrs2Helper(kFminH, OpcodeEnum::kFminH);
+}
+
+TEST_F(ZfhEncodingTest, FminH_frd) {
+  FloatFrdHelper(kFminH, OpcodeEnum::kFminH);
+}
+
+TEST_F(ZfhEncodingTest, FmaxH) {
+  enc_->ParseInstruction(kFmaxH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFmaxH);
+}
+
+TEST_F(ZfhEncodingTest, FmaxH_frs1) {
+  FloatFrs1Helper(kFmaxH, OpcodeEnum::kFmaxH);
+}
+
+TEST_F(ZfhEncodingTest, FmaxH_frs2) {
+  FloatFrs2Helper(kFmaxH, OpcodeEnum::kFmaxH);
+}
+
+TEST_F(ZfhEncodingTest, FmaxH_frd) {
+  FloatFrdHelper(kFmaxH, OpcodeEnum::kFmaxH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjH) {
+  enc_->ParseInstruction(kFsgnjH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsgnjH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjH_frs1) {
+  FloatFrs1Helper(kFsgnjH, OpcodeEnum::kFsgnjH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjH_frs2) {
+  FloatFrs2Helper(kFsgnjH, OpcodeEnum::kFsgnjH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjH_frd) {
+  FloatFrdHelper(kFsgnjH, OpcodeEnum::kFsgnjH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjnH) {
+  enc_->ParseInstruction(kFsgnjnH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsgnjnH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjnH_frs1) {
+  FloatFrs1Helper(kFsgnjnH, OpcodeEnum::kFsgnjnH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjnH_frs2) {
+  FloatFrs2Helper(kFsgnjnH, OpcodeEnum::kFsgnjnH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjnH_frd) {
+  FloatFrdHelper(kFsgnjnH, OpcodeEnum::kFsgnjnH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjxH) {
+  enc_->ParseInstruction(kFsgnjxH);
+  EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsgnjxH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjxH_frs1) {
+  FloatFrs1Helper(kFsgnjxH, OpcodeEnum::kFsgnjxH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjxH_frs2) {
+  FloatFrs2Helper(kFsgnjxH, OpcodeEnum::kFsgnjxH);
+}
+
+TEST_F(ZfhEncodingTest, FsgnjxH_frd) {
+  FloatFrdHelper(kFsgnjxH, OpcodeEnum::kFsgnjxH);
+}
+
 }  // namespace